@@ -63,15 +63,15 @@ checkAddDef add toplvl fc ((n, (i, top, t)) : ns)
63-- return (n, (i, top, t'))) ns
63-- return (n, (i, top, t'))) ns
65-- | Elaborate a top-level type declaration - for example, "foo : Int -> Int".
65-- | Elaborate a top-level type declaration - for example, "foo : Int -> Int".
66−elabType :: ElabInfo -> SyntaxInfo -> String ->
66+elabType :: ElabInfo -> SyntaxInfo -> String -> [(Name, String)] ->
67 FC -> FnOpts -> Name -> PTerm -> Idris Type
67 FC -> FnOpts -> Name -> PTerm -> Idris Type
68elabType = elabType' False
68elabType = elabType' False
70elabType' :: Bool -> -- normalise it
70elabType' :: Bool -> -- normalise it
71− ElabInfo -> SyntaxInfo -> String ->
71+ ElabInfo -> SyntaxInfo -> String -> [(Name, String)] ->
72 FC -> FnOpts -> Name -> PTerm -> Idris Type
72 FC -> FnOpts -> Name -> PTerm -> Idris Type
73−elabType' norm info syn doc fc opts n ty' = {- let ty' = piBind (params info) ty_in
73+elabType' norm info syn doc argDocs fc opts n ty' = {- let ty' = piBind (params info) ty_in
74− n = liftname info n_in in -}
74+ n = liftname info n_in in -}
75 do checkUndefined fc n
75 do checkUndefined fc n
76 ctxt <- getContext
76 ctxt <- getContext
77 i <- getIState
77 i <- getIState
@@ -122,7 +122,8 @@ elabType' norm info syn doc fc opts n ty' = {- let ty' = piBind (params info) ty
122 let ds' = map (\(n, (i, top, t)) -> (n, (i, top, t, True))) ds
122 let ds' = map (\(n, (i, top, t)) -> (n, (i, top, t, True))) ds
123 addDeferred ds'
123 addDeferred ds'
124 setFlags n opts'
124 setFlags n opts'
125+ checkDocs fc argDocs ty
125− addDocStr n doc
126+ addDocStr n doc argDocs
126 addIBC (IBCDoc n)
127 addIBC (IBCDoc n)
127 addIBC (IBCFlags n opts')
128 addIBC (IBCFlags n opts')
128 when (Implicit `elem` opts) $ do addCoercion n
129 when (Implicit `elem` opts) $ do addCoercion n
@@ -167,13 +168,13 @@ elabType' norm info syn doc fc opts n ty' = {- let ty' = piBind (params info) ty
167 , ns2 == map txt ["Maybe", "Prelude"]
168 , ns2 == map txt ["Maybe", "Prelude"]
168 , ns3 == map txt ["List", "Prelude"]
169 , ns3 == map txt ["List", "Prelude"]
169 , ns4 == map txt ["Errors","Reflection","Language"] = True
170 , ns4 == map txt ["Errors","Reflection","Language"] = True
170− tyIsHandler _ = False
171+ tyIsHandler _ = False
173elabPostulate :: ElabInfo -> SyntaxInfo -> String ->
174elabPostulate :: ElabInfo -> SyntaxInfo -> String ->
174 FC -> FnOpts -> Name -> PTerm -> Idris ()
175 FC -> FnOpts -> Name -> PTerm -> Idris ()
175elabPostulate info syn doc fc opts n ty
176elabPostulate info syn doc fc opts n ty
176− = do elabType info syn doc fc opts n ty
177+ = do elabType info syn doc [] fc opts n ty
177 -- make sure it's collapsible, so it is never needed at run time
178 -- make sure it's collapsible, so it is never needed at run time
178 -- start by getting the elaborated type
179 -- start by getting the elaborated type
179 ctxt <- getContext
180 ctxt <- getContext
@@ -194,8 +195,8 @@ elabPostulate info syn doc fc opts n ty
194 -- remove it from the deferred definitions list
195 -- remove it from the deferred definitions list
195 solveDeferred n
196 solveDeferred n
197−elabData :: ElabInfo -> SyntaxInfo -> String -> FC -> DataOpts -> PData -> Idris ()
198+elabData :: ElabInfo -> SyntaxInfo -> String -> [(Name, String)] -> FC -> DataOpts -> PData -> Idris ()
198−elabData info syn doc fc opts (PLaterdecl n t_in)
199+elabData info syn doc argDocs fc opts (PLaterdecl n t_in)
199 = do let codata = Codata `elem` opts
200 = do let codata = Codata `elem` opts
200 iLOG (show (fc, doc))
201 iLOG (show (fc, doc))
201 checkUndefined fc n
202 checkUndefined fc n
@@ -213,7 +214,7 @@ elabData info syn doc fc opts (PLaterdecl n t_in)
213 logLvl 2 $ "---> " ++ show cty
214 logLvl 2 $ "---> " ++ show cty
214 updateContext (addTyDecl n (TCon 0 0) cty) -- temporary, to check cons
215 updateContext (addTyDecl n (TCon 0 0) cty) -- temporary, to check cons
216−elabData info syn doc fc opts (PDatadecl n t_in dcons)
217+elabData info syn doc argDocs fc opts (PDatadecl n t_in dcons)
217 = do let codata = Codata `elem` opts
218 = do let codata = Codata `elem` opts
218 iLOG (show fc)
219 iLOG (show fc)
219 undef <- isUndefined fc n
220 undef <- isUndefined fc n
@@ -241,12 +242,13 @@ elabData info syn doc fc opts (PDatadecl n t_in dcons)
241 let as = map (const Nothing) (getArgTys cty)
242 let as = map (const Nothing) (getArgTys cty)
242 let params = findParams (map snd cons)
243 let params = findParams (map snd cons)
243 logLvl 2 $ "Parameters : " ++ show params
244 logLvl 2 $ "Parameters : " ++ show params
244− putIState (i { idris_datatypes =
245+ putIState (i { idris_datatypes =
245 addDef n (TI (map fst cons) codata opts params)
246 addDef n (TI (map fst cons) codata opts params)
246 (idris_datatypes i) })
247 (idris_datatypes i) })
247 addIBC (IBCDef n)
248 addIBC (IBCDef n)
248 addIBC (IBCData n)
249 addIBC (IBCData n)
250+ checkDocs fc argDocs t_in
249− addDocStr n doc
251+ addDocStr n doc argDocs
250 addIBC (IBCDoc n)
252 addIBC (IBCDoc n)
251 let metainf = DataMI params
253 let metainf = DataMI params
252 addIBC (IBCMetaInformation n metainf)
254 addIBC (IBCMetaInformation n metainf)
@@ -258,10 +260,10 @@ elabData info syn doc fc opts (PDatadecl n t_in dcons)
258 if DefaultEliminator `elem` opts then evalStateT (elabEliminator params n t dcons info) Map.empty
260 if DefaultEliminator `elem` opts then evalStateT (elabEliminator params n t dcons info) Map.empty
259 else return ()
261 else return ()
261− checkDefinedAs fc n t ctxt
263+ checkDefinedAs fc n t ctxt
262 = case lookupDef n ctxt of
264 = case lookupDef n ctxt of
263 [] -> return ()
265 [] -> return ()
264− [TyDecl _ ty] ->
266+ [TyDecl _ ty] ->
265 case converts ctxt [] t ty of
267 case converts ctxt [] t ty of
266 OK () -> return ()
268 OK () -> return ()
267 _ -> tclift $ tfail (At fc (AlreadyDefined n))
269 _ -> tclift $ tfail (At fc (AlreadyDefined n))
@@ -319,7 +321,8 @@ elabData info syn doc fc opts (PDatadecl n t_in dcons)
319type EliminatorState = StateT (Map.Map String Int) Idris
321type EliminatorState = StateT (Map.Map String Int) Idris
321-- TODO: Use uniqueName for generating names, rewrite everything to use idris_implicits instead of manual splitting, generally just rewrite
323-- TODO: Use uniqueName for generating names, rewrite everything to use idris_implicits instead of manual splitting, generally just rewrite
322−elabEliminator :: [Int] -> Name -> PTerm -> [(String, Name, PTerm, FC, [Name])] ->
324+elabEliminator :: [Int] -> Name -> PTerm ->
325+ [(String, [(Name, String)], Name, PTerm, FC, [Name])] ->
323 ElabInfo -> EliminatorState ()
326 ElabInfo -> EliminatorState ()
324elabEliminator paramPos n ty cons info = do
327elabEliminator paramPos n ty cons info = do
325 elimLog $ "Elaborating eliminator"
328 elimLog $ "Elaborating eliminator"
@@ -328,15 +331,15 @@ elabEliminator paramPos n ty cons info = do
328 generalParams <- namePis False pms
331 generalParams <- namePis False pms
329 motiveIdxs <- namePis False idxs
332 motiveIdxs <- namePis False idxs
330 let motive = mkMotive n paramPos generalParams motiveIdxs
333 let motive = mkMotive n paramPos generalParams motiveIdxs
331− consTerms <- mapM (\(c@(_,cnm,_,_,_)) -> do
334+ consTerms <- mapM (\(c@(_, _, cnm, _, _, _)) -> do
332− name <- freshName $ "elim_" ++ simpleName cnm
335+ name <- freshName $ "elim_" ++ simpleName cnm
333− consTerm <- extractConsTerm c generalParams
336+ consTerm <- extractConsTerm c generalParams
334− return (name, expl, consTerm)) cons
337+ return (name, expl, consTerm)) cons
335 scrutineeIdxs <- namePis False idxs
338 scrutineeIdxs <- namePis False idxs
336 let motiveConstr = [(motiveName, expl, motive)]
339 let motiveConstr = [(motiveName, expl, motive)]
337 let scrutinee = (scrutineeName, expl, applyCons n (interlievePos paramPos generalParams scrutineeIdxs 0))
340 let scrutinee = (scrutineeName, expl, applyCons n (interlievePos paramPos generalParams scrutineeIdxs 0))
338 let eliminatorTy = piConstr (generalParams ++ motiveConstr ++ consTerms ++ scrutineeIdxs ++ [scrutinee]) (applyMotive (map (\(n,_,_) -> PRef elimFC n) scrutineeIdxs) (PRef elimFC scrutineeName))
341 let eliminatorTy = piConstr (generalParams ++ motiveConstr ++ consTerms ++ scrutineeIdxs ++ [scrutinee]) (applyMotive (map (\(n,_,_) -> PRef elimFC n) scrutineeIdxs) (PRef elimFC scrutineeName))
339− let eliminatorTyDecl = PTy (show n) defaultSyntax elimFC [TotalFn] elimDeclName eliminatorTy
342+ let eliminatorTyDecl = PTy (show n) [] defaultSyntax elimFC [TotalFn] elimDeclName eliminatorTy
340 let clauseConsElimArgs = map getPiName consTerms
343 let clauseConsElimArgs = map getPiName consTerms
341 let clauseGeneralArgs' = map getPiName generalParams ++ [motiveName] ++ clauseConsElimArgs
344 let clauseGeneralArgs' = map getPiName generalParams ++ [motiveName] ++ clauseConsElimArgs
342 let clauseGeneralArgs = map (\arg -> pexp (PRef elimFC arg)) clauseGeneralArgs'
345 let clauseGeneralArgs = map (\arg -> pexp (PRef elimFC arg)) clauseGeneralArgs'
@@ -500,8 +503,8 @@ elabEliminator paramPos n ty cons info = do
500 in return $ filter (\(n,_,_) -> not (n `elem` oldParams))implargs
503 in return $ filter (\(n,_,_) -> not (n `elem` oldParams))implargs
501 _ -> return implargs
504 _ -> return implargs
503− extractConsTerm :: (String, Name, PTerm, FC, [Name]) -> [(Name, Plicity, PTerm)] -> EliminatorState PTerm
506+ extractConsTerm :: (String, [(Name, String)], Name, PTerm, FC, [Name]) -> [(Name, Plicity, PTerm)] -> EliminatorState PTerm
504− extractConsTerm (doc, cnm, ty, fc, fs) generalParameters = do
507+ extractConsTerm (doc, argDocs, cnm, ty, fc, fs) generalParameters = do
505 let cons' = replaceParams paramPos generalParameters ty
508 let cons' = replaceParams paramPos generalParameters ty
506 let (args, resTy) = splitPi cons'
509 let (args, resTy) = splitPi cons'
507 implidxs <- implicitIndexes (doc, cnm, ty, fc, fs)
510 implidxs <- implicitIndexes (doc, cnm, ty, fc, fs)
@@ -536,8 +539,8 @@ elabEliminator paramPos n ty cons info = do
536 convertImplPi (PImp {getTm = t, pname = n}) = Just (n, expl, t)
539 convertImplPi (PImp {getTm = t, pname = n}) = Just (n, expl, t)
537 convertImplPi _ = Nothing
540 convertImplPi _ = Nothing
539− generateEliminatorClauses :: (String, Name, PTerm, FC, [Name]) -> Name -> [PArg] -> [(Name, Plicity, PTerm)] -> EliminatorState PClause
542+ generateEliminatorClauses :: (String, [(Name, String)], Name, PTerm, FC, [Name]) -> Name -> [PArg] -> [(Name, Plicity, PTerm)] -> EliminatorState PClause
540− generateEliminatorClauses (doc, cnm, ty, fc, fs) cnsElim generalArgs generalParameters = do
543+ generateEliminatorClauses (doc, _, cnm, ty, fc, fs) cnsElim generalArgs generalParameters = do
541 let cons' = replaceParams paramPos generalParameters ty
544 let cons' = replaceParams paramPos generalParameters ty
542 let (args, resTy) = splitPi cons'
545 let (args, resTy) = splitPi cons'
543 i <- State.lift getIState
546 i <- State.lift getIState
@@ -558,7 +561,7 @@ elabEliminator paramPos n ty cons info = do
559elabPrims :: Idris ()
562elabPrims :: Idris ()
560elabPrims = do mapM_ (elabDecl EAll toplevel)
563elabPrims = do mapM_ (elabDecl EAll toplevel)
561− (map (\(opt, decl) -> PData "" defaultSyntax (fileFC "builtin") opt decl)
564+ (map (\(opt, decl) -> PData "" [] defaultSyntax (fileFC "builtin") opt decl)
563 [inferOpts, unitOpts, falseOpts, pairOpts, eqOpts]
566 [inferOpts, unitOpts, falseOpts, pairOpts, eqOpts]
564 [inferDecl, unitDecl, falseDecl, pairDecl, eqDecl]))
567 [inferDecl, unitDecl, falseDecl, pairDecl, eqDecl]))
@@ -626,8 +629,8 @@ elabPrims = do mapM_ (elabDecl EAll toplevel)
628-- | Elaborate a type provider
631-- | Elaborate a type provider
629−elabProvider :: ElabInfo -> SyntaxInfo -> FC -> Name -> PTerm -> PTerm -> Idris ()
632+elabProvider :: ElabInfo -> SyntaxInfo -> FC -> ProvideWhat -> Name -> PTerm -> PTerm -> Idris ()
630−elabProvider info syn fc n ty tm
633+elabProvider info syn fc what n ty tm
631 = do i <- getIState
634 = do i <- getIState
632 -- Ensure that the experimental extension is enabled
635 -- Ensure that the experimental extension is enabled
633 unless (TypeProviders `elem` idris_language_extensions i) $
636 unless (TypeProviders `elem` idris_language_extensions i) $
@@ -647,9 +650,6 @@ elabProvider info syn fc n ty tm
647 ifail $ "Expected provider type IO (Provider (" ++
650 ifail $ "Expected provider type IO (Provider (" ++
648 show ty' ++ "))" ++ ", got " ++ show et ++ " instead."
651 show ty' ++ "))" ++ ", got " ++ show et ++ " instead."
650− -- Create the top-level type declaration
651− elabType info syn "" fc [] n ty
653 -- Execute the type provider and normalise the result
653 -- Execute the type provider and normalise the result
654 -- use 'run__provider' to convert to a primitive IO action
654 -- use 'run__provider' to convert to a primitive IO action
@@ -658,12 +658,25 @@ elabProvider info syn fc n ty tm
658 let rhs' = normalise ctxt [] rhs
658 let rhs' = normalise ctxt [] rhs
659 logLvl 1 $ "Normalised " ++ show n ++ "'s RHS to " ++ show rhs
659 logLvl 1 $ "Normalised " ++ show n ++ "'s RHS to " ++ show rhs
661− -- Extract the provided term from the type provider
661+ -- Extract the provided term or postulate from the type provider
662− tm <- getProvided fc rhs'
662+ provided <- getProvided fc rhs'
666+ | what `elem` [ProvTerm, ProvAny] ->
664− -- Finally add a top-level definition of the provided term
667+ do -- Finally add a top-level definition of the provided term
668+ elabType info syn "" [] fc [] n ty
665− elabClauses info fc [] n [PClause fc n (PApp fc (PRef fc n) []) [] (delab i tm) []]
669+ elabClauses info fc [] n [PClause fc n (PApp fc (PRef fc n) []) [] (delab i tm) []]
666− logLvl 1 $ "Elaborated provider " ++ show n ++ " as: " ++ show tm
670+ logLvl 1 $ "Elaborated provider " ++ show n ++ " as: " ++ show tm
672+ ierror . Msg $ "Attempted to provide a term where a postulate was expected."
674+ | what `elem` [ProvPostulate, ProvAny] ->
675+ do -- Add the postulate
676+ elabPostulate info syn "Provided postulate" fc [] n ty
677+ logLvl 1 $ "Elaborated provided postulate " ++ show n
679+ ierror . Msg $ "Attempted to provide a postulate where a term was expected."
668 where isTType :: TT Name -> Bool
681 where isTType :: TT Name -> Bool
669 isTType (TType _) = True
682 isTType (TType _) = True
@@ -714,7 +727,7 @@ elabTransform info fc safe lhs_in rhs_in
714elabRecord :: ElabInfo -> SyntaxInfo -> String -> FC -> Name ->
727elabRecord :: ElabInfo -> SyntaxInfo -> String -> FC -> Name ->
715 PTerm -> String -> Name -> PTerm -> Idris ()
728 PTerm -> String -> Name -> PTerm -> Idris ()
716elabRecord info syn doc fc tyn ty cdoc cn cty
729elabRecord info syn doc fc tyn ty cdoc cn cty
717− = do elabData info syn doc fc [] (PDatadecl tyn ty [(cdoc, cn, cty, fc, [])])
730+ = do elabData info syn doc [] fc [] (PDatadecl tyn ty [(cdoc, [], cn, cty, fc, [])])
718 cty' <- implicit syn cn cty
731 cty' <- implicit syn cn cty
719 i <- getIState
732 i <- getIState
720 cty <- case lookupTy cn (tt_ctxt i) of
733 cty <- case lookupTy cn (tt_ctxt i) of
@@ -737,7 +750,7 @@ elabRecord info syn doc fc tyn ty cdoc cn cty
738-- syn = syn_in { syn_namespace = show (nsroot tyn) : syn_namespace syn_in }
751-- syn = syn_in { syn_namespace = show (nsroot tyn) : syn_namespace syn_in }
740− isNonImp (PExp _ _ _ _, a) = Just a
753+ isNonImp (PExp _ _ _, a) = Just a
741 isNonImp _ = Nothing
754 isNonImp _ = Nothing
743 tryElabDecl info (fn, ty, val)
756 tryElabDecl info (fn, ty, val)
@@ -749,15 +762,15 @@ elabRecord info syn doc fc tyn ty cdoc cn cty
749 show fn ++ " (" ++ show ty ++ ")"
762 show fn ++ " (" ++ show ty ++ ")"
750 putIState i)
763 putIState i)
752− getImplB k (PPi (Imp l s _ _) n Placeholder sc)
765+ getImplB k (PPi (Imp l s _) n Placeholder sc)
753 = getImplB k sc
766 = getImplB k sc
754− getImplB k (PPi (Imp l s d p) n ty sc)
767+ getImplB k (PPi (Imp l s p) n ty sc)
755− = getImplB (\x -> k (PPi (Imp l s d p) n ty x)) sc
768+ = getImplB (\x -> k (PPi (Imp l s p) n ty x)) sc
756 getImplB k (PPi _ n ty sc)
769 getImplB k (PPi _ n ty sc)
757 = getImplB k sc
770 = getImplB k sc
758 getImplB k _ = k
771 getImplB k _ = k
760− renameBs (PImp _ _ _ _ _ _ : ps) (PPi p n ty s)
773+ renameBs (PImp _ _ _ _ _ : ps) (PPi p n ty s)
761 = PPi p (mkImp n) ty (renameBs ps (substMatch n (PRef fc (mkImp n)) s))
774 = PPi p (mkImp n) ty (renameBs ps (substMatch n (PRef fc (mkImp n)) s))
762 renameBs (_:ps) (PPi p n ty s) = PPi p n ty (renameBs ps s)
775 renameBs (_:ps) (PPi p n ty s) = PPi p n ty (renameBs ps s)
763 renameBs _ t = t
776 renameBs _ t = t
@@ -784,7 +797,7 @@ elabRecord info syn doc fc tyn ty cdoc cn cty
785 mkProj recty substs cimp ((pn_in, pty), pos)
798 mkProj recty substs cimp ((pn_in, pty), pos)
786 = do let pn = expandNS syn pn_in
799 = do let pn = expandNS syn pn_in
787− let pfnTy = PTy "" defaultSyntax fc [] pn
800+ let pfnTy = PTy "" [] defaultSyntax fc [] pn
788 (PPi expl rec recty
801 (PPi expl rec recty
789 (substMatches substs pty))
802 (substMatches substs pty))
790 let pls = repeat Placeholder
803 let pls = repeat Placeholder
@@ -805,7 +818,7 @@ elabRecord info syn doc fc tyn ty cdoc cn cty
805 let valname = sMN 0 "updateval"
818 let valname = sMN 0 "updateval"
806 let pt = k (PPi expl pn pty
819 let pt = k (PPi expl pn pty
807 (PPi expl rec recty recty))
820 (PPi expl rec recty recty))
808− let pfnTy = PTy "" defaultSyntax fc [] setname pt
821+ let pfnTy = PTy "" [] defaultSyntax fc [] setname pt
809 let pls = map (\x -> PRef fc (sMN x "field")) [0..num-1]
822 let pls = map (\x -> PRef fc (sMN x "field")) [0..num-1]
810 let lhsArgs = pls
823 let lhsArgs = pls
811 let rhsArgs = take pos pls ++ (PRef fc valname) :
824 let rhsArgs = take pos pls ++ (PRef fc valname) :
@@ -821,8 +834,8 @@ elabRecord info syn doc fc tyn ty cdoc cn cty
821 return (pn, pfnTy, PClauses fc [] setname [pclause])
834 return (pn, pfnTy, PClauses fc [] setname [pclause])
823elabCon :: ElabInfo -> SyntaxInfo -> Name -> Bool ->
836elabCon :: ElabInfo -> SyntaxInfo -> Name -> Bool ->
824− (String, Name, PTerm, FC, [Name]) -> Idris (Name, Type)
837+ (String, [(Name, String)], Name, PTerm, FC, [Name]) -> Idris (Name, Type)
825−elabCon info syn tn codata (doc, n, t_in, fc, forcenames)
838+elabCon info syn tn codata (doc, argDocs, n, t_in, fc, forcenames)
826 = do checkUndefined fc n
839 = do checkUndefined fc n
827 ctxt <- getContext
840 ctxt <- getContext
828 i <- getIState
841 i <- getIState
@@ -843,7 +856,8 @@ elabCon info syn tn codata (doc, n, t_in, fc, forcenames)
843 tyIs cty'
856 tyIs cty'
844 logLvl 2 $ "---> " ++ show n ++ " : " ++ show cty'
857 logLvl 2 $ "---> " ++ show n ++ " : " ++ show cty'
845 addIBC (IBCDef n)
858 addIBC (IBCDef n)
859+ checkDocs fc argDocs t_in
846− addDocStr n doc
860+ addDocStr n doc argDocs
847 addIBC (IBCDoc n)
861 addIBC (IBCDoc n)
848 let fs = map (getNamePos 0 t) forcenames
862 let fs = map (getNamePos 0 t) forcenames
849 -- FIXME: 'forcenames' is an almighty hack! Need a better way of
863 -- FIXME: 'forcenames' is an almighty hack! Need a better way of
@@ -1148,7 +1162,7 @@ elabPE info fc caller r =
1148 (map (\ (lhs, rhs) ->
1162 (map (\ (lhs, rhs) ->
1149 (showTmImpls lhs ++ " = " ++
1163 (showTmImpls lhs ++ " = " ++
1150 showTmImpls rhs)) pats)
1164 showTmImpls rhs)) pats)
1151− elabType info defaultSyntax "" fc opts newnm specTy
1165+ elabType info defaultSyntax "" [] fc opts newnm specTy
1152 let def = map (\ (lhs, rhs) -> PClause fc newnm lhs [] rhs []) pats
1166 let def = map (\ (lhs, rhs) -> PClause fc newnm lhs [] rhs []) pats
1153 elabClauses info fc opts newnm def
1167 elabClauses info fc opts newnm def
1154 logLvl 1 $ "Specialised " ++ show newnm)
1168 logLvl 1 $ "Specialised " ++ show newnm)
@@ -1266,7 +1280,7 @@ checkPossible info fc tcgen fname lhs_in
1266 ((P _ x _, _), (P _ y _, _)) -> x == y
1280 ((P _ x _, _), (P _ y _, _)) -> x == y
1267 _ -> False
1281 _ -> False
1269−getFixedInType i env (PExp _ _ _ _ : is) (Bind n (Pi t) sc)
1283+getFixedInType i env (PExp _ _ _ : is) (Bind n (Pi t) sc)
1270 = getFixedInType i (n : env) is (instantiate (P Bound n t) sc)
1284 = getFixedInType i (n : env) is (instantiate (P Bound n t) sc)
1271getFixedInType i env (_ : is) (Bind n (Pi t) sc)
1285getFixedInType i env (_ : is) (Bind n (Pi t) sc)
1272 = getFixedInType i (n : env) is (instantiate (P Bound n t) sc)
1286 = getFixedInType i (n : env) is (instantiate (P Bound n t) sc)
@@ -1490,7 +1504,7 @@ elabClause info opts (cnum, PClause fc fname lhs_in withs rhs_in whereblock)
1490-- = NS (UN ('#':show x)) [show cnum, show fname]
1504-- = NS (UN ('#':show x)) [show cnum, show fname]
1492 sepBlocks bs = sepBlocks' [] bs where
1506 sepBlocks bs = sepBlocks' [] bs where
1493− sepBlocks' ns (d@(PTy _ _ _ _ n t) : bs)
1507+ sepBlocks' ns (d@(PTy _ _ _ _ _ n t) : bs)
1494 = let (bf, af) = sepBlocks' (n : ns) bs in
1508 = let (bf, af) = sepBlocks' (n : ns) bs in
1495 (d : bf, af)
1509 (d : bf, af)
1496 sepBlocks' ns (d@(PClauses _ _ n _) : bs)
1510 sepBlocks' ns (d@(PClauses _ _ n _) : bs)
@@ -1711,7 +1725,7 @@ elabClass :: ElabInfo -> SyntaxInfo -> String ->
1711 FC -> [PTerm] ->
1725 FC -> [PTerm] ->
1712 Name -> [(Name, PTerm)] -> [PDecl] -> Idris ()
1726 Name -> [(Name, PTerm)] -> [PDecl] -> Idris ()
1713elabClass info syn doc fc constraints tn ps ds
1727elabClass info syn doc fc constraints tn ps ds
1714− = do let cn = sUN ("instance" ++ show tn) -- MN 0 ("instance" ++ show tn)
1728+ = do let cn = SN (InstanceCtorN tn) -- sUN ("instance" ++ show tn) -- MN 0 ("instance" ++ show tn)
1715 let tty = pibind ps PType
1729 let tty = pibind ps PType
1716 let constraint = PApp fc (PRef fc tn)
1730 let constraint = PApp fc (PRef fc tn)
1717 (map (pexp . PRef fc) (map fst ps))
1731 (map (pexp . PRef fc) (map fst ps))
@@ -1734,10 +1748,10 @@ elabClass info syn doc fc constraints tn ps ds
1734 let cty = impbind ps $ conbind constraints
1748 let cty = impbind ps $ conbind constraints
1735 $ pibind (map (\ (n, ty) -> (nsroot n, ty)) methods)
1749 $ pibind (map (\ (n, ty) -> (nsroot n, ty)) methods)
1736 constraint
1750 constraint
1737− let cons = [("", cn, cty, fc, [])]
1751+ let cons = [("", [], cn, cty, fc, [])]
1738 let ddecl = PDatadecl tn tty cons
1752 let ddecl = PDatadecl tn tty cons
1739 logLvl 5 $ "Class data " ++ show (showDImp True ddecl)
1753 logLvl 5 $ "Class data " ++ show (showDImp True ddecl)
1740− elabData info (syn { no_imp = no_imp syn ++ mnames }) doc fc [] ddecl
1754+ elabData info (syn { no_imp = no_imp syn ++ mnames }) doc [] fc [] ddecl
1741 -- for each constraint, build a top level function to chase it
1755 -- for each constraint, build a top level function to chase it
1742 logLvl 5 $ "Building functions"
1756 logLvl 5 $ "Building functions"
1743 let usyn = syn { using = map (\ (x,y) -> UImplicit x y) ps
1757 let usyn = syn { using = map (\ (x,y) -> UImplicit x y) ps
@@ -1775,8 +1789,8 @@ elabClass info syn doc fc constraints tn ps ds
1775 conbind (ty : ns) x = PPi constraint (sMN 0 "class") ty (conbind ns x)
1789 conbind (ty : ns) x = PPi constraint (sMN 0 "class") ty (conbind ns x)
1776 conbind [] x = x
1790 conbind [] x = x
1778− getMName (PTy _ _ _ _ n _) = nsroot n
1792+ getMName (PTy _ _ _ _ _ n _) = nsroot n
1779− tdecl allmeths (PTy doc syn _ o n t)
1793+ tdecl allmeths (PTy doc _ syn _ o n t)
1780 = do t' <- implicit' syn allmeths n t
1794 = do t' <- implicit' syn allmeths n t
1781 logLvl 5 $ "Method " ++ show n ++ " : " ++ showTmImpls t'
1795 logLvl 5 $ "Method " ++ show n ++ " : " ++ showTmImpls t'
1782 return ( (n, (toExp (map fst ps) Exp t')),
1796 return ( (n, (toExp (map fst ps) Exp t')),
@@ -1789,7 +1803,7 @@ elabClass info syn doc fc constraints tn ps ds
1789 case lookup n mtys of
1803 case lookup n mtys of
1790 Just (syn, o, ty) -> do let ty' = insertConstraint c ty
1804 Just (syn, o, ty) -> do let ty' = insertConstraint c ty
1791 let ds = map (decorateid defaultdec)
1805 let ds = map (decorateid defaultdec)
1792− [PTy "" syn fc [] n ty',
1806+ [PTy "" [] syn fc [] n ty',
1793 PClauses fc (o ++ opts) n cs]
1807 PClauses fc (o ++ opts) n cs]
1794 iLOG (show ds)
1808 iLOG (show ds)
1795 return (n, ((defaultdec n, ds!!1), ds))
1809 return (n, ((defaultdec n, ds!!1), ds))
@@ -1799,7 +1813,7 @@ elabClass info syn doc fc constraints tn ps ds
1799 defaultdec (UN n) = sUN ("default#" ++ str n)
1813 defaultdec (UN n) = sUN ("default#" ++ str n)
1800 defaultdec (NS n ns) = NS (defaultdec n) ns
1814 defaultdec (NS n ns) = NS (defaultdec n) ns
1802− tydecl (PTy _ _ _ _ _ _) = True
1816+ tydecl (PTy _ _ _ _ _ _ _) = True
1803 tydecl _ = False
1817 tydecl _ = False
1804 instdecl (PInstance _ _ _ _ _ _ _ _) = True
1818 instdecl (PInstance _ _ _ _ _ _ _ _) = True
1805 instdecl _ = False
1819 instdecl _ = False
@@ -1827,7 +1841,7 @@ elabClass info syn doc fc constraints tn ps ds
1827 addInstance False conn' cfn
1841 addInstance False conn' cfn
1828 addIBC (IBCInstance False conn' cfn)
1842 addIBC (IBCInstance False conn' cfn)
1829-- iputStrLn ("Added " ++ show (conn, cfn, ty))
1843-- iputStrLn ("Added " ++ show (conn, cfn, ty))
1830− return [PTy "" syn fc [] cfn ty,
1844+ return [PTy "" [] syn fc [] cfn ty,
1831 PClauses fc [Dictionary] cfn [PClause fc cfn lhs [] rhs []]]
1845 PClauses fc [Dictionary] cfn [PClause fc cfn lhs [] rhs []]]
1833 -- Generate a top level function which looks up a method in a given
1847 -- Generate a top level function which looks up a method in a given
@@ -1843,12 +1857,12 @@ elabClass info syn doc fc constraints tn ps ds
1843 iLOG (showTmImpls ty)
1857 iLOG (showTmImpls ty)
1844 iLOG (show (m, ty', capp, margs))
1858 iLOG (show (m, ty', capp, margs))
1845 iLOG (showTmImpls lhs ++ " = " ++ showTmImpls rhs)
1859 iLOG (showTmImpls lhs ++ " = " ++ showTmImpls rhs)
1846− return [PTy doc syn fc o m ty',
1860+ return [PTy doc [] syn fc o m ty',
1847 PClauses fc [Inlinable] m [PClause fc m lhs [] rhs []]]
1861 PClauses fc [Inlinable] m [PClause fc m lhs [] rhs []]]
1849− getMArgs (PPi (Imp _ _ _ _) n ty sc) = IA : getMArgs sc
1863+ getMArgs (PPi (Imp _ _ _) n ty sc) = IA : getMArgs sc
1850− getMArgs (PPi (Exp _ _ _ _) n ty sc) = EA : getMArgs sc
1864+ getMArgs (PPi (Exp _ _ _) n ty sc) = EA : getMArgs sc
1851− getMArgs (PPi (Constraint _ _ _) n ty sc) = CA : getMArgs sc
1865+ getMArgs (PPi (Constraint _ _) n ty sc) = CA : getMArgs sc
1852 getMArgs _ = []
1866 getMArgs _ = []
1854 getMeth (m:ms) (a:as) x | x == a = PRef fc m
1868 getMeth (m:ms) (a:as) x | x == a = PRef fc m
@@ -1864,14 +1878,14 @@ elabClass info syn doc fc constraints tn ps ds
1864 rhsArgs (CA : xs) ns = pconst (PResolveTC fc) : rhsArgs xs ns
1878 rhsArgs (CA : xs) ns = pconst (PResolveTC fc) : rhsArgs xs ns
1865 rhsArgs [] _ = []
1879 rhsArgs [] _ = []
1867− insertConstraint c (PPi p@(Imp _ _ _ _) n ty sc)
1881+ insertConstraint c (PPi p@(Imp _ _ _) n ty sc)
1868 = PPi p n ty (insertConstraint c sc)
1882 = PPi p n ty (insertConstraint c sc)
1869 insertConstraint c sc = PPi constraint (sMN 0 "class") c sc
1883 insertConstraint c sc = PPi constraint (sMN 0 "class") c sc
1871 -- make arguments explicit and don't bind class parameters
1885 -- make arguments explicit and don't bind class parameters
1872− toExp ns e (PPi (Imp l s _ p) n ty sc)
1886+ toExp ns e (PPi (Imp l s p) n ty sc)
1873 | n `elem` ns = toExp ns e sc
1887 | n `elem` ns = toExp ns e sc
1874− | otherwise = PPi (e l s "" p) n ty (toExp ns e sc)
1888+ | otherwise = PPi (e l s p) n ty (toExp ns e sc)
1875 toExp ns e (PPi p n ty sc) = PPi p n ty (toExp ns e sc)
1889 toExp ns e (PPi p n ty sc) = PPi p n ty (toExp ns e sc)
1876 toExp ns e sc = sc
1890 toExp ns e sc = sc
@@ -1891,7 +1905,7 @@ elabInstance info syn what fc cs n ps t expn ds = do
1891 let constraint = PApp fc (PRef fc n) (map pexp ps)
1905 let constraint = PApp fc (PRef fc n) (map pexp ps)
1892 let iname = mkiname n ps expn
1906 let iname = mkiname n ps expn
1893 when (what /= EDefns) $ do
1907 when (what /= EDefns) $ do
1894− nty <- elabType' True info syn "" fc [] iname t
1908+ nty <- elabType' True info syn "" [] fc [] iname t
1895 -- if the instance type matches any of the instances we have already,
1909 -- if the instance type matches any of the instances we have already,
1896 -- and it's not a named instance, then it's overlapping, so report an error
1910 -- and it's not a named instance, then it's overlapping, so report an error
1897 case expn of
1911 case expn of
@@ -1999,17 +2013,17 @@ elabInstance info syn what fc cs n ps t expn ds = do
2000 mkMethApp (n, _, _, ty)
2014 mkMethApp (n, _, _, ty)
2001 = lamBind 0 ty (papp fc (PRef fc n) (methArgs 0 ty))
2015 = lamBind 0 ty (papp fc (PRef fc n) (methArgs 0 ty))
2002− lamBind i (PPi (Constraint _ _ _) _ _ sc) sc'
2016+ lamBind i (PPi (Constraint _ _) _ _ sc) sc'
2003 = PLam (sMN i "meth") Placeholder (lamBind (i+1) sc sc')
2017 = PLam (sMN i "meth") Placeholder (lamBind (i+1) sc sc')
2004 lamBind i (PPi _ n ty sc) sc'
2018 lamBind i (PPi _ n ty sc) sc'
2005 = PLam (sMN i "meth") Placeholder (lamBind (i+1) sc sc')
2019 = PLam (sMN i "meth") Placeholder (lamBind (i+1) sc sc')
2006 lamBind i _ sc = sc
2020 lamBind i _ sc = sc
2007− methArgs i (PPi (Imp _ _ _ _) n ty sc)
2021+ methArgs i (PPi (Imp _ _ _) n ty sc)
2008− = PImp 0 True [] n (PRef fc (sMN i "meth")) "" : methArgs (i+1) sc
2022+ = PImp 0 True [] n (PRef fc (sMN i "meth")) : methArgs (i+1) sc
2009− methArgs i (PPi (Exp _ _ _ _) n ty sc)
2023+ methArgs i (PPi (Exp _ _ _) n ty sc)
2010− = PExp 0 [] (PRef fc (sMN i "meth")) "" : methArgs (i+1) sc
2024+ = PExp 0 [] (PRef fc (sMN i "meth")) : methArgs (i+1) sc
2011− methArgs i (PPi (Constraint _ _ _) n ty sc)
2025+ methArgs i (PPi (Constraint _ _) n ty sc)
2012− = PConstraint 0 [] (PResolveTC fc) "" : methArgs (i+1) sc
2026+ = PConstraint 0 [] (PResolveTC fc) : methArgs (i+1) sc
2013 methArgs i _ = []
2027 methArgs i _ = []
2015 papp fc f [] = f
2029 papp fc f [] = f
@@ -2028,12 +2042,12 @@ elabInstance info syn what fc cs n ps t expn ds = do
2028 decorate ns iname (UN n) = NS (SN (MethodN (UN n))) ns
2042 decorate ns iname (UN n) = NS (SN (MethodN (UN n))) ns
2029 decorate ns iname (NS (UN n) s) = NS (SN (MethodN (UN n))) ns
2043 decorate ns iname (NS (UN n) s) = NS (SN (MethodN (UN n))) ns
2031− mkTyDecl (n, op, t, _) = PTy "" syn fc op n t
2045+ mkTyDecl (n, op, t, _) = PTy "" [] syn fc op n t
2033 conbind (ty : ns) x = PPi constraint (sMN 0 "class") ty (conbind ns x)
2047 conbind (ty : ns) x = PPi constraint (sMN 0 "class") ty (conbind ns x)
2034 conbind [] x = x
2048 conbind [] x = x
2036− coninsert cs (PPi p@(Imp _ _ _ _) n t sc) = PPi p n t (coninsert cs sc)
2050+ coninsert cs (PPi p@(Imp _ _ _) n t sc) = PPi p n t (coninsert cs sc)
2037 coninsert cs sc = conbind cs sc
2051 coninsert cs sc = conbind cs sc
2039 insertDefaults :: IState -> Name ->
2053 insertDefaults :: IState -> Name ->
@@ -2091,7 +2105,7 @@ elabInstance info syn what fc cs n ps t expn ds = do
2091 PClauses fc [Dictionary] cfn [PClause fc cfn lhs [] rhs []]]
2105 PClauses fc [Dictionary] cfn [PClause fc cfn lhs [] rhs []]]
2094−decorateid decorate (PTy doc s f o n t) = PTy doc s f o (decorate n) t
2108+decorateid decorate (PTy doc argdocs s f o n t) = PTy doc argdocs s f o (decorate n) t
2095decorateid decorate (PClauses f o n cs)
2109decorateid decorate (PClauses f o n cs)
2096 = PClauses f o (decorate n) (map dc cs)
2110 = PClauses f o (decorate n) (map dc cs)
2097 where dc (PClause fc n t as w ds) = PClause fc (decorate n) (dappname t) as w ds
2111 where dc (PClause fc n t as w ds) = PClause fc (decorate n) (dappname t) as w ds
@@ -2145,22 +2159,22 @@ elabDecl' _ info (PFix _ _ _)
2145 = return () -- nothing to elaborate
2159 = return () -- nothing to elaborate
2146elabDecl' _ info (PSyntax _ p)
2160elabDecl' _ info (PSyntax _ p)
2147 = return () -- nothing to elaborate
2161 = return () -- nothing to elaborate
2148−elabDecl' what info (PTy doc s f o n ty)
2162+elabDecl' what info (PTy doc argdocs s f o n ty)
2149 | what /= EDefns
2163 | what /= EDefns
2150 = do iLOG $ "Elaborating type decl " ++ show n ++ show o
2164 = do iLOG $ "Elaborating type decl " ++ show n ++ show o
2151− elabType info s doc f o n ty
2165+ elabType info s doc argdocs f o n ty
2152 return ()
2166 return ()
2153elabDecl' what info (PPostulate doc s f o n ty)
2167elabDecl' what info (PPostulate doc s f o n ty)
2154 | what /= EDefns
2168 | what /= EDefns
2155 = do iLOG $ "Elaborating postulate " ++ show n ++ show o
2169 = do iLOG $ "Elaborating postulate " ++ show n ++ show o
2156 elabPostulate info s doc f o n ty
2170 elabPostulate info s doc f o n ty
2157−elabDecl' what info (PData doc s f co d)
2171+elabDecl' what info (PData doc argDocs s f co d)
2158 | what /= ETypes
2172 | what /= ETypes
2159 = do iLOG $ "Elaborating " ++ show (d_name d)
2173 = do iLOG $ "Elaborating " ++ show (d_name d)
2160− elabData info s doc f co d
2174+ elabData info s doc argDocs f co d
2161 | otherwise
2175 | otherwise
2162 = do iLOG $ "Elaborating [type of] " ++ show (d_name d)
2176 = do iLOG $ "Elaborating [type of] " ++ show (d_name d)
2163− elabData info s doc f co (PLaterdecl (d_name d) (d_tcon d))
2177+ elabData info s doc argDocs f co (PLaterdecl (d_name d) (d_tcon d))
2164elabDecl' what info d@(PClauses f o n ps)
2178elabDecl' what info d@(PClauses f o n ps)
2165 | what /= ETypes
2179 | what /= ETypes
2166 = do iLOG $ "Elaborating clause " ++ show n
2180 = do iLOG $ "Elaborating clause " ++ show n
@@ -2217,17 +2231,17 @@ elabDecl' what info (PRecord doc s f tyn ty cdoc cn cty)
2217 elabRecord info s doc f tyn ty cdoc cn cty
2231 elabRecord info s doc f tyn ty cdoc cn cty
2218 | otherwise
2232 | otherwise
2219 = do iLOG $ "Elaborating [type of] " ++ show tyn
2233 = do iLOG $ "Elaborating [type of] " ++ show tyn
2220− elabData info s doc f [] (PLaterdecl tyn ty)
2234+ elabData info s doc [] f [] (PLaterdecl tyn ty)
2221elabDecl' _ info (PDSL n dsl)
2235elabDecl' _ info (PDSL n dsl)
2222 = do i <- getIState
2236 = do i <- getIState
2223 putIState (i { idris_dsls = addDef n dsl (idris_dsls i) })
2237 putIState (i { idris_dsls = addDef n dsl (idris_dsls i) })
2224 addIBC (IBCDSL n)
2238 addIBC (IBCDSL n)
2225elabDecl' what info (PDirective i)
2239elabDecl' what info (PDirective i)
2226 | what /= EDefns = i
2240 | what /= EDefns = i
2227−elabDecl' what info (PProvider syn fc n tp tm)
2241+elabDecl' what info (PProvider syn fc provWhat n tp tm)
2228 | what /= EDefns
2242 | what /= EDefns
2229 = do iLOG $ "Elaborating type provider " ++ show n
2243 = do iLOG $ "Elaborating type provider " ++ show n
2230− elabProvider info syn fc n tp tm
2244+ elabProvider info syn fc provWhat n tp tm
2231elabDecl' what info (PTransform fc safety old new)
2245elabDecl' what info (PTransform fc safety old new)
2232 = elabTransform info fc safety old new
2246 = elabTransform info fc safety old new
2233elabDecl' _ _ _ = return () -- skipped this time
2247elabDecl' _ _ _ = return () -- skipped this time
@@ -2272,3 +2286,14 @@ inferredDiff fc inf user =
2272 Right vs -> return False
2286 Right vs -> return False
2273 Left (x, y) -> return True
2287 Left (x, y) -> return True
2289+-- | Check a PTerm against documentation and ensure that every documented
2290+-- argument actually exists. This must be run _after_ implicits have been
2291+-- found, or it will give spurious errors.
2292+checkDocs :: FC -> [(Name, String)] -> PTerm -> Idris ()
2293+checkDocs fc args tm = cd (Map.fromList args) tm
2294+ where cd as (PPi _ n _ sc) = cd (Map.delete n as) sc
2295+ cd as _ | Map.null as = return ()
2296+ | otherwise = ierror . At fc . Msg $
2297+ "There is documentation for argument(s) "
2298+ ++ (concat . intersperse ", " . map show . Map.keys) as
2299+ ++ " but they were not found."