@@ -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]))
@@ -662,7 +665,7 @@ elabProvider info syn fc what n ty tm
662 Provide tm
665 Provide tm
663 | what `elem` [ProvTerm, ProvAny] ->
666 | what `elem` [ProvTerm, ProvAny] ->
664 do -- Finally add a top-level definition of the provided term
667 do -- Finally add a top-level definition of the provided term
665− elabType info syn "" fc [] n ty
668+ elabType info syn "" [] fc [] n ty
666 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) []]
667 logLvl 1 $ "Elaborated provider " ++ show n ++ " as: " ++ show tm
670 logLvl 1 $ "Elaborated provider " ++ show n ++ " as: " ++ show tm
668 | otherwise ->
671 | otherwise ->
@@ -724,7 +727,7 @@ elabTransform info fc safe lhs_in rhs_in
724elabRecord :: ElabInfo -> SyntaxInfo -> String -> FC -> Name ->
727elabRecord :: ElabInfo -> SyntaxInfo -> String -> FC -> Name ->
725 PTerm -> String -> Name -> PTerm -> Idris ()
728 PTerm -> String -> Name -> PTerm -> Idris ()
726elabRecord info syn doc fc tyn ty cdoc cn cty
729elabRecord info syn doc fc tyn ty cdoc cn cty
727− = 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, [])])
728 cty' <- implicit syn cn cty
731 cty' <- implicit syn cn cty
729 i <- getIState
732 i <- getIState
730 cty <- case lookupTy cn (tt_ctxt i) of
733 cty <- case lookupTy cn (tt_ctxt i) of
@@ -747,7 +750,7 @@ elabRecord info syn doc fc tyn ty cdoc cn cty
748-- 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 }
750− isNonImp (PExp _ _ _ _, a) = Just a
753+ isNonImp (PExp _ _ _, a) = Just a
751 isNonImp _ = Nothing
754 isNonImp _ = Nothing
753 tryElabDecl info (fn, ty, val)
756 tryElabDecl info (fn, ty, val)
@@ -759,15 +762,15 @@ elabRecord info syn doc fc tyn ty cdoc cn cty
759 show fn ++ " (" ++ show ty ++ ")"
762 show fn ++ " (" ++ show ty ++ ")"
760 putIState i)
763 putIState i)
762− getImplB k (PPi (Imp l s _ _) n Placeholder sc)
765+ getImplB k (PPi (Imp l s _) n Placeholder sc)
763 = getImplB k sc
766 = getImplB k sc
764− getImplB k (PPi (Imp l s d p) n ty sc)
767+ getImplB k (PPi (Imp l s p) n ty sc)
765− = 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
766 getImplB k (PPi _ n ty sc)
769 getImplB k (PPi _ n ty sc)
767 = getImplB k sc
770 = getImplB k sc
768 getImplB k _ = k
771 getImplB k _ = k
770− renameBs (PImp _ _ _ _ _ _ : ps) (PPi p n ty s)
773+ renameBs (PImp _ _ _ _ _ : ps) (PPi p n ty s)
771 = 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))
772 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)
773 renameBs _ t = t
776 renameBs _ t = t
@@ -794,7 +797,7 @@ elabRecord info syn doc fc tyn ty cdoc cn cty
795 mkProj recty substs cimp ((pn_in, pty), pos)
798 mkProj recty substs cimp ((pn_in, pty), pos)
796 = do let pn = expandNS syn pn_in
799 = do let pn = expandNS syn pn_in
797− let pfnTy = PTy "" defaultSyntax fc [] pn
800+ let pfnTy = PTy "" [] defaultSyntax fc [] pn
798 (PPi expl rec recty
801 (PPi expl rec recty
799 (substMatches substs pty))
802 (substMatches substs pty))
800 let pls = repeat Placeholder
803 let pls = repeat Placeholder
@@ -815,7 +818,7 @@ elabRecord info syn doc fc tyn ty cdoc cn cty
815 let valname = sMN 0 "updateval"
818 let valname = sMN 0 "updateval"
816 let pt = k (PPi expl pn pty
819 let pt = k (PPi expl pn pty
817 (PPi expl rec recty recty))
820 (PPi expl rec recty recty))
818− let pfnTy = PTy "" defaultSyntax fc [] setname pt
821+ let pfnTy = PTy "" [] defaultSyntax fc [] setname pt
819 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]
820 let lhsArgs = pls
823 let lhsArgs = pls
821 let rhsArgs = take pos pls ++ (PRef fc valname) :
824 let rhsArgs = take pos pls ++ (PRef fc valname) :
@@ -831,8 +834,8 @@ elabRecord info syn doc fc tyn ty cdoc cn cty
831 return (pn, pfnTy, PClauses fc [] setname [pclause])
834 return (pn, pfnTy, PClauses fc [] setname [pclause])
833elabCon :: ElabInfo -> SyntaxInfo -> Name -> Bool ->
836elabCon :: ElabInfo -> SyntaxInfo -> Name -> Bool ->
834− (String, Name, PTerm, FC, [Name]) -> Idris (Name, Type)
837+ (String, [(Name, String)], Name, PTerm, FC, [Name]) -> Idris (Name, Type)
835−elabCon info syn tn codata (doc, n, t_in, fc, forcenames)
838+elabCon info syn tn codata (doc, argDocs, n, t_in, fc, forcenames)
836 = do checkUndefined fc n
839 = do checkUndefined fc n
837 ctxt <- getContext
840 ctxt <- getContext
838 i <- getIState
841 i <- getIState
@@ -853,7 +856,8 @@ elabCon info syn tn codata (doc, n, t_in, fc, forcenames)
853 tyIs cty'
856 tyIs cty'
854 logLvl 2 $ "---> " ++ show n ++ " : " ++ show cty'
857 logLvl 2 $ "---> " ++ show n ++ " : " ++ show cty'
855 addIBC (IBCDef n)
858 addIBC (IBCDef n)
859+ checkDocs fc argDocs t_in
856− addDocStr n doc
860+ addDocStr n doc argDocs
857 addIBC (IBCDoc n)
861 addIBC (IBCDoc n)
858 let fs = map (getNamePos 0 t) forcenames
862 let fs = map (getNamePos 0 t) forcenames
859 -- FIXME: 'forcenames' is an almighty hack! Need a better way of
863 -- FIXME: 'forcenames' is an almighty hack! Need a better way of
@@ -1158,7 +1162,7 @@ elabPE info fc caller r =
1158 (map (\ (lhs, rhs) ->
1162 (map (\ (lhs, rhs) ->
1159 (showTmImpls lhs ++ " = " ++
1163 (showTmImpls lhs ++ " = " ++
1160 showTmImpls rhs)) pats)
1164 showTmImpls rhs)) pats)
1161− elabType info defaultSyntax "" fc opts newnm specTy
1165+ elabType info defaultSyntax "" [] fc opts newnm specTy
1162 let def = map (\ (lhs, rhs) -> PClause fc newnm lhs [] rhs []) pats
1166 let def = map (\ (lhs, rhs) -> PClause fc newnm lhs [] rhs []) pats
1163 elabClauses info fc opts newnm def
1167 elabClauses info fc opts newnm def
1164 logLvl 1 $ "Specialised " ++ show newnm)
1168 logLvl 1 $ "Specialised " ++ show newnm)
@@ -1276,7 +1280,7 @@ checkPossible info fc tcgen fname lhs_in
1276 ((P _ x _, _), (P _ y _, _)) -> x == y
1280 ((P _ x _, _), (P _ y _, _)) -> x == y
1277 _ -> False
1281 _ -> False
1279−getFixedInType i env (PExp _ _ _ _ : is) (Bind n (Pi t) sc)
1283+getFixedInType i env (PExp _ _ _ : is) (Bind n (Pi t) sc)
1280 = getFixedInType i (n : env) is (instantiate (P Bound n t) sc)
1284 = getFixedInType i (n : env) is (instantiate (P Bound n t) sc)
1281getFixedInType i env (_ : is) (Bind n (Pi t) sc)
1285getFixedInType i env (_ : is) (Bind n (Pi t) sc)
1282 = getFixedInType i (n : env) is (instantiate (P Bound n t) sc)
1286 = getFixedInType i (n : env) is (instantiate (P Bound n t) sc)
@@ -1500,7 +1504,7 @@ elabClause info opts (cnum, PClause fc fname lhs_in withs rhs_in whereblock)
1500-- = NS (UN ('#':show x)) [show cnum, show fname]
1504-- = NS (UN ('#':show x)) [show cnum, show fname]
1502 sepBlocks bs = sepBlocks' [] bs where
1506 sepBlocks bs = sepBlocks' [] bs where
1503− sepBlocks' ns (d@(PTy _ _ _ _ n t) : bs)
1507+ sepBlocks' ns (d@(PTy _ _ _ _ _ n t) : bs)
1504 = let (bf, af) = sepBlocks' (n : ns) bs in
1508 = let (bf, af) = sepBlocks' (n : ns) bs in
1505 (d : bf, af)
1509 (d : bf, af)
1506 sepBlocks' ns (d@(PClauses _ _ n _) : bs)
1510 sepBlocks' ns (d@(PClauses _ _ n _) : bs)
@@ -1744,10 +1748,10 @@ elabClass info syn doc fc constraints tn ps ds
1744 let cty = impbind ps $ conbind constraints
1748 let cty = impbind ps $ conbind constraints
1745 $ pibind (map (\ (n, ty) -> (nsroot n, ty)) methods)
1749 $ pibind (map (\ (n, ty) -> (nsroot n, ty)) methods)
1746 constraint
1750 constraint
1747− let cons = [("", cn, cty, fc, [])]
1751+ let cons = [("", [], cn, cty, fc, [])]
1748 let ddecl = PDatadecl tn tty cons
1752 let ddecl = PDatadecl tn tty cons
1749 logLvl 5 $ "Class data " ++ show (showDImp True ddecl)
1753 logLvl 5 $ "Class data " ++ show (showDImp True ddecl)
1750− 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
1751 -- for each constraint, build a top level function to chase it
1755 -- for each constraint, build a top level function to chase it
1752 logLvl 5 $ "Building functions"
1756 logLvl 5 $ "Building functions"
1753 let usyn = syn { using = map (\ (x,y) -> UImplicit x y) ps
1757 let usyn = syn { using = map (\ (x,y) -> UImplicit x y) ps
@@ -1785,8 +1789,8 @@ elabClass info syn doc fc constraints tn ps ds
1785 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)
1786 conbind [] x = x
1790 conbind [] x = x
1788− getMName (PTy _ _ _ _ n _) = nsroot n
1792+ getMName (PTy _ _ _ _ _ n _) = nsroot n
1789− tdecl allmeths (PTy doc syn _ o n t)
1793+ tdecl allmeths (PTy doc _ syn _ o n t)
1790 = do t' <- implicit' syn allmeths n t
1794 = do t' <- implicit' syn allmeths n t
1791 logLvl 5 $ "Method " ++ show n ++ " : " ++ showTmImpls t'
1795 logLvl 5 $ "Method " ++ show n ++ " : " ++ showTmImpls t'
1792 return ( (n, (toExp (map fst ps) Exp t')),
1796 return ( (n, (toExp (map fst ps) Exp t')),
@@ -1799,7 +1803,7 @@ elabClass info syn doc fc constraints tn ps ds
1799 case lookup n mtys of
1803 case lookup n mtys of
1800 Just (syn, o, ty) -> do let ty' = insertConstraint c ty
1804 Just (syn, o, ty) -> do let ty' = insertConstraint c ty
1801 let ds = map (decorateid defaultdec)
1805 let ds = map (decorateid defaultdec)
1802− [PTy "" syn fc [] n ty',
1806+ [PTy "" [] syn fc [] n ty',
1803 PClauses fc (o ++ opts) n cs]
1807 PClauses fc (o ++ opts) n cs]
1804 iLOG (show ds)
1808 iLOG (show ds)
1805 return (n, ((defaultdec n, ds!!1), ds))
1809 return (n, ((defaultdec n, ds!!1), ds))
@@ -1809,7 +1813,7 @@ elabClass info syn doc fc constraints tn ps ds
1809 defaultdec (UN n) = sUN ("default#" ++ str n)
1813 defaultdec (UN n) = sUN ("default#" ++ str n)
1810 defaultdec (NS n ns) = NS (defaultdec n) ns
1814 defaultdec (NS n ns) = NS (defaultdec n) ns
1812− tydecl (PTy _ _ _ _ _ _) = True
1816+ tydecl (PTy _ _ _ _ _ _ _) = True
1813 tydecl _ = False
1817 tydecl _ = False
1814 instdecl (PInstance _ _ _ _ _ _ _ _) = True
1818 instdecl (PInstance _ _ _ _ _ _ _ _) = True
1815 instdecl _ = False
1819 instdecl _ = False
@@ -1837,7 +1841,7 @@ elabClass info syn doc fc constraints tn ps ds
1837 addInstance False conn' cfn
1841 addInstance False conn' cfn
1838 addIBC (IBCInstance False conn' cfn)
1842 addIBC (IBCInstance False conn' cfn)
1839-- iputStrLn ("Added " ++ show (conn, cfn, ty))
1843-- iputStrLn ("Added " ++ show (conn, cfn, ty))
1840− return [PTy "" syn fc [] cfn ty,
1844+ return [PTy "" [] syn fc [] cfn ty,
1841 PClauses fc [Dictionary] cfn [PClause fc cfn lhs [] rhs []]]
1845 PClauses fc [Dictionary] cfn [PClause fc cfn lhs [] rhs []]]
1843 -- 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
@@ -1853,12 +1857,12 @@ elabClass info syn doc fc constraints tn ps ds
1853 iLOG (showTmImpls ty)
1857 iLOG (showTmImpls ty)
1854 iLOG (show (m, ty', capp, margs))
1858 iLOG (show (m, ty', capp, margs))
1855 iLOG (showTmImpls lhs ++ " = " ++ showTmImpls rhs)
1859 iLOG (showTmImpls lhs ++ " = " ++ showTmImpls rhs)
1856− return [PTy doc syn fc o m ty',
1860+ return [PTy doc [] syn fc o m ty',
1857 PClauses fc [Inlinable] m [PClause fc m lhs [] rhs []]]
1861 PClauses fc [Inlinable] m [PClause fc m lhs [] rhs []]]
1859− getMArgs (PPi (Imp _ _ _ _) n ty sc) = IA : getMArgs sc
1863+ getMArgs (PPi (Imp _ _ _) n ty sc) = IA : getMArgs sc
1860− getMArgs (PPi (Exp _ _ _ _) n ty sc) = EA : getMArgs sc
1864+ getMArgs (PPi (Exp _ _ _) n ty sc) = EA : getMArgs sc
1861− getMArgs (PPi (Constraint _ _ _) n ty sc) = CA : getMArgs sc
1865+ getMArgs (PPi (Constraint _ _) n ty sc) = CA : getMArgs sc
1862 getMArgs _ = []
1866 getMArgs _ = []
1864 getMeth (m:ms) (a:as) x | x == a = PRef fc m
1868 getMeth (m:ms) (a:as) x | x == a = PRef fc m
@@ -1874,14 +1878,14 @@ elabClass info syn doc fc constraints tn ps ds
1874 rhsArgs (CA : xs) ns = pconst (PResolveTC fc) : rhsArgs xs ns
1878 rhsArgs (CA : xs) ns = pconst (PResolveTC fc) : rhsArgs xs ns
1875 rhsArgs [] _ = []
1879 rhsArgs [] _ = []
1877− insertConstraint c (PPi p@(Imp _ _ _ _) n ty sc)
1881+ insertConstraint c (PPi p@(Imp _ _ _) n ty sc)
1878 = PPi p n ty (insertConstraint c sc)
1882 = PPi p n ty (insertConstraint c sc)
1879 insertConstraint c sc = PPi constraint (sMN 0 "class") c sc
1883 insertConstraint c sc = PPi constraint (sMN 0 "class") c sc
1881 -- make arguments explicit and don't bind class parameters
1885 -- make arguments explicit and don't bind class parameters
1882− toExp ns e (PPi (Imp l s _ p) n ty sc)
1886+ toExp ns e (PPi (Imp l s p) n ty sc)
1883 | n `elem` ns = toExp ns e sc
1887 | n `elem` ns = toExp ns e sc
1884− | 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)
1885 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)
1886 toExp ns e sc = sc
1890 toExp ns e sc = sc
@@ -1901,7 +1905,7 @@ elabInstance info syn what fc cs n ps t expn ds = do
1901 let constraint = PApp fc (PRef fc n) (map pexp ps)
1905 let constraint = PApp fc (PRef fc n) (map pexp ps)
1902 let iname = mkiname n ps expn
1906 let iname = mkiname n ps expn
1903 when (what /= EDefns) $ do
1907 when (what /= EDefns) $ do
1904− nty <- elabType' True info syn "" fc [] iname t
1908+ nty <- elabType' True info syn "" [] fc [] iname t
1905 -- 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,
1906 -- 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
1907 case expn of
1911 case expn of
@@ -2009,17 +2013,17 @@ elabInstance info syn what fc cs n ps t expn ds = do
2010 mkMethApp (n, _, _, ty)
2014 mkMethApp (n, _, _, ty)
2011 = lamBind 0 ty (papp fc (PRef fc n) (methArgs 0 ty))
2015 = lamBind 0 ty (papp fc (PRef fc n) (methArgs 0 ty))
2012− lamBind i (PPi (Constraint _ _ _) _ _ sc) sc'
2016+ lamBind i (PPi (Constraint _ _) _ _ sc) sc'
2013 = PLam (sMN i "meth") Placeholder (lamBind (i+1) sc sc')
2017 = PLam (sMN i "meth") Placeholder (lamBind (i+1) sc sc')
2014 lamBind i (PPi _ n ty sc) sc'
2018 lamBind i (PPi _ n ty sc) sc'
2015 = PLam (sMN i "meth") Placeholder (lamBind (i+1) sc sc')
2019 = PLam (sMN i "meth") Placeholder (lamBind (i+1) sc sc')
2016 lamBind i _ sc = sc
2020 lamBind i _ sc = sc
2017− methArgs i (PPi (Imp _ _ _ _) n ty sc)
2021+ methArgs i (PPi (Imp _ _ _) n ty sc)
2018− = 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
2019− methArgs i (PPi (Exp _ _ _ _) n ty sc)
2023+ methArgs i (PPi (Exp _ _ _) n ty sc)
2020− = PExp 0 [] (PRef fc (sMN i "meth")) "" : methArgs (i+1) sc
2024+ = PExp 0 [] (PRef fc (sMN i "meth")) : methArgs (i+1) sc
2021− methArgs i (PPi (Constraint _ _ _) n ty sc)
2025+ methArgs i (PPi (Constraint _ _) n ty sc)
2022− = PConstraint 0 [] (PResolveTC fc) "" : methArgs (i+1) sc
2026+ = PConstraint 0 [] (PResolveTC fc) : methArgs (i+1) sc
2023 methArgs i _ = []
2027 methArgs i _ = []
2025 papp fc f [] = f
2029 papp fc f [] = f
@@ -2038,12 +2042,12 @@ elabInstance info syn what fc cs n ps t expn ds = do
2038 decorate ns iname (UN n) = NS (SN (MethodN (UN n))) ns
2042 decorate ns iname (UN n) = NS (SN (MethodN (UN n))) ns
2039 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
2041− mkTyDecl (n, op, t, _) = PTy "" syn fc op n t
2045+ mkTyDecl (n, op, t, _) = PTy "" [] syn fc op n t
2043 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)
2044 conbind [] x = x
2048 conbind [] x = x
2046− 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)
2047 coninsert cs sc = conbind cs sc
2051 coninsert cs sc = conbind cs sc
2049 insertDefaults :: IState -> Name ->
2053 insertDefaults :: IState -> Name ->
@@ -2101,7 +2105,7 @@ elabInstance info syn what fc cs n ps t expn ds = do
2101 PClauses fc [Dictionary] cfn [PClause fc cfn lhs [] rhs []]]
2105 PClauses fc [Dictionary] cfn [PClause fc cfn lhs [] rhs []]]
2104−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
2105decorateid decorate (PClauses f o n cs)
2109decorateid decorate (PClauses f o n cs)
2106 = PClauses f o (decorate n) (map dc cs)
2110 = PClauses f o (decorate n) (map dc cs)
2107 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
@@ -2155,22 +2159,22 @@ elabDecl' _ info (PFix _ _ _)
2155 = return () -- nothing to elaborate
2159 = return () -- nothing to elaborate
2156elabDecl' _ info (PSyntax _ p)
2160elabDecl' _ info (PSyntax _ p)
2157 = return () -- nothing to elaborate
2161 = return () -- nothing to elaborate
2158−elabDecl' what info (PTy doc s f o n ty)
2162+elabDecl' what info (PTy doc argdocs s f o n ty)
2159 | what /= EDefns
2163 | what /= EDefns
2160 = do iLOG $ "Elaborating type decl " ++ show n ++ show o
2164 = do iLOG $ "Elaborating type decl " ++ show n ++ show o
2161− elabType info s doc f o n ty
2165+ elabType info s doc argdocs f o n ty
2162 return ()
2166 return ()
2163elabDecl' what info (PPostulate doc s f o n ty)
2167elabDecl' what info (PPostulate doc s f o n ty)
2164 | what /= EDefns
2168 | what /= EDefns
2165 = do iLOG $ "Elaborating postulate " ++ show n ++ show o
2169 = do iLOG $ "Elaborating postulate " ++ show n ++ show o
2166 elabPostulate info s doc f o n ty
2170 elabPostulate info s doc f o n ty
2167−elabDecl' what info (PData doc s f co d)
2171+elabDecl' what info (PData doc argDocs s f co d)
2168 | what /= ETypes
2172 | what /= ETypes
2169 = do iLOG $ "Elaborating " ++ show (d_name d)
2173 = do iLOG $ "Elaborating " ++ show (d_name d)
2170− elabData info s doc f co d
2174+ elabData info s doc argDocs f co d
2171 | otherwise
2175 | otherwise
2172 = do iLOG $ "Elaborating [type of] " ++ show (d_name d)
2176 = do iLOG $ "Elaborating [type of] " ++ show (d_name d)
2173− 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))
2174elabDecl' what info d@(PClauses f o n ps)
2178elabDecl' what info d@(PClauses f o n ps)
2175 | what /= ETypes
2179 | what /= ETypes
2176 = do iLOG $ "Elaborating clause " ++ show n
2180 = do iLOG $ "Elaborating clause " ++ show n
@@ -2227,7 +2231,7 @@ elabDecl' what info (PRecord doc s f tyn ty cdoc cn cty)
2227 elabRecord info s doc f tyn ty cdoc cn cty
2231 elabRecord info s doc f tyn ty cdoc cn cty
2228 | otherwise
2232 | otherwise
2229 = do iLOG $ "Elaborating [type of] " ++ show tyn
2233 = do iLOG $ "Elaborating [type of] " ++ show tyn
2230− elabData info s doc f [] (PLaterdecl tyn ty)
2234+ elabData info s doc [] f [] (PLaterdecl tyn ty)
2231elabDecl' _ info (PDSL n dsl)
2235elabDecl' _ info (PDSL n dsl)
2232 = do i <- getIState
2236 = do i <- getIState
2233 putIState (i { idris_dsls = addDef n dsl (idris_dsls i) })
2237 putIState (i { idris_dsls = addDef n dsl (idris_dsls i) })
@@ -2282,3 +2286,14 @@ inferredDiff fc inf user =
2282 Right vs -> return False
2286 Right vs -> return False
2283 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."