@@ -63,15 +63,15 @@ checkAddDef add toplvl fc ((n, (i, top, t)) : ns)
6363-- return (n, (i, top, t'))) ns
6464
6565-- | Elaborate a top-level type declaration - for example, "foo : Int -> Int".
66−elabType :: ElabInfo -> SyntaxInfo -> String ->
66+elabType :: ElabInfo -> SyntaxInfo -> String -> [(Name, String)] ->
6767 FC -> FnOpts -> Name -> PTerm -> Idris Type
6868elabType = elabType' False
6969
7070elabType' :: Bool -> -- normalise it
71− ElabInfo -> SyntaxInfo -> String ->
71+ ElabInfo -> SyntaxInfo -> String -> [(Name, String)] ->
7272 FC -> FnOpts -> Name -> PTerm -> Idris Type
73−elabType' norm info syn doc fc opts n ty' = {- let ty' = piBind (params info) ty_in
74− n = liftname info n_in 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 -}
7575 do checkUndefined fc n
7676 ctxt <- getContext
7777 i <- getIState
@@ -122,7 +122,8 @@ elabType' norm info syn doc fc opts n ty' = {- let ty' = piBind (params info) ty
122122 let ds' = map (\(n, (i, top, t)) -> (n, (i, top, t, True))) ds
123123 addDeferred ds'
124124 setFlags n opts'
125− addDocStr n doc
125+ checkDocs fc argDocs ty
126+ addDocStr n doc argDocs
126127 addIBC (IBCDoc n)
127128 addIBC (IBCFlags n opts')
128129 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
167168 , ns2 == map txt ["Maybe", "Prelude"]
168169 , ns3 == map txt ["List", "Prelude"]
169170 , ns4 == map txt ["Errors","Reflection","Language"] = True
170− tyIsHandler _ = False
171+ tyIsHandler _ = False
171172
172173
173174elabPostulate :: ElabInfo -> SyntaxInfo -> String ->
174175 FC -> FnOpts -> Name -> PTerm -> Idris ()
175176elabPostulate 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
177178 -- make sure it's collapsible, so it is never needed at run time
178179 -- start by getting the elaborated type
179180 ctxt <- getContext
@@ -194,8 +195,8 @@ elabPostulate info syn doc fc opts n ty
194195 -- remove it from the deferred definitions list
195196 solveDeferred n
196197
197−elabData :: ElabInfo -> SyntaxInfo -> String -> FC -> DataOpts -> PData -> Idris ()
198−elabData info syn doc fc opts (PLaterdecl n t_in)
198+elabData :: ElabInfo -> SyntaxInfo -> String -> [(Name, String)] -> FC -> DataOpts -> PData -> Idris ()
199+elabData info syn doc argDocs fc opts (PLaterdecl n t_in)
199200 = do let codata = Codata `elem` opts
200201 iLOG (show (fc, doc))
201202 checkUndefined fc n
@@ -213,7 +214,7 @@ elabData info syn doc fc opts (PLaterdecl n t_in)
213214 logLvl 2 $ "---> " ++ show cty
214215 updateContext (addTyDecl n (TCon 0 0) cty) -- temporary, to check cons
215216
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)
217218 = do let codata = Codata `elem` opts
218219 iLOG (show fc)
219220 undef <- isUndefined fc n
@@ -241,12 +242,13 @@ elabData info syn doc fc opts (PDatadecl n t_in dcons)
241242 let as = map (const Nothing) (getArgTys cty)
242243 let params = findParams (map snd cons)
243244 logLvl 2 $ "Parameters : " ++ show params
244− putIState (i { idris_datatypes =
245+ putIState (i { idris_datatypes =
245246 addDef n (TI (map fst cons) codata opts params)
246247 (idris_datatypes i) })
247248 addIBC (IBCDef n)
248249 addIBC (IBCData n)
249− addDocStr n doc
250+ checkDocs fc argDocs t_in
251+ addDocStr n doc argDocs
250252 addIBC (IBCDoc n)
251253 let metainf = DataMI params
252254 addIBC (IBCMetaInformation n metainf)
@@ -258,10 +260,10 @@ elabData info syn doc fc opts (PDatadecl n t_in dcons)
258260 if DefaultEliminator `elem` opts then evalStateT (elabEliminator params n t dcons info) Map.empty
259261 else return ()
260262 where
261− checkDefinedAs fc n t ctxt
263+ checkDefinedAs fc n t ctxt
262264 = case lookupDef n ctxt of
263265 [] -> return ()
264− [TyDecl _ ty] ->
266+ [TyDecl _ ty] ->
265267 case converts ctxt [] t ty of
266268 OK () -> return ()
267269 _ -> tclift $ tfail (At fc (AlreadyDefined n))
@@ -319,7 +321,8 @@ elabData info syn doc fc opts (PDatadecl n t_in dcons)
319321type EliminatorState = StateT (Map.Map String Int) Idris
320322
321323-- 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])] ->
323326 ElabInfo -> EliminatorState ()
324327elabEliminator paramPos n ty cons info = do
325328 elimLog $ "Elaborating eliminator"
@@ -328,15 +331,15 @@ elabEliminator paramPos n ty cons info = do
328331 generalParams <- namePis False pms
329332 motiveIdxs <- namePis False idxs
330333 let motive = mkMotive n paramPos generalParams motiveIdxs
331− consTerms <- mapM (\(c@(_,cnm,_,_,_)) -> do
332− name <- freshName $ "elim_" ++ simpleName cnm
333− consTerm <- extractConsTerm c generalParams
334− return (name, expl, consTerm)) cons
334+ consTerms <- mapM (\(c@(_, _, cnm, _, _, _)) -> do
335+ name <- freshName $ "elim_" ++ simpleName cnm
336+ consTerm <- extractConsTerm c generalParams
337+ return (name, expl, consTerm)) cons
335338 scrutineeIdxs <- namePis False idxs
336339 let motiveConstr = [(motiveName, expl, motive)]
337340 let scrutinee = (scrutineeName, expl, applyCons n (interlievePos paramPos generalParams scrutineeIdxs 0))
338341 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
340343 let clauseConsElimArgs = map getPiName consTerms
341344 let clauseGeneralArgs' = map getPiName generalParams ++ [motiveName] ++ clauseConsElimArgs
342345 let clauseGeneralArgs = map (\arg -> pexp (PRef elimFC arg)) clauseGeneralArgs'
@@ -500,8 +503,8 @@ elabEliminator paramPos n ty cons info = do
500503 in return $ filter (\(n,_,_) -> not (n `elem` oldParams))implargs
501504 _ -> return implargs
502505
503− extractConsTerm :: (String, Name, PTerm, FC, [Name]) -> [(Name, Plicity, PTerm)] -> EliminatorState PTerm
504− extractConsTerm (doc, cnm, ty, fc, fs) generalParameters = do
506+ extractConsTerm :: (String, [(Name, String)], Name, PTerm, FC, [Name]) -> [(Name, Plicity, PTerm)] -> EliminatorState PTerm
507+ extractConsTerm (doc, argDocs, cnm, ty, fc, fs) generalParameters = do
505508 let cons' = replaceParams paramPos generalParameters ty
506509 let (args, resTy) = splitPi cons'
507510 implidxs <- implicitIndexes (doc, cnm, ty, fc, fs)
@@ -536,8 +539,8 @@ elabEliminator paramPos n ty cons info = do
536539 convertImplPi (PImp {getTm = t, pname = n}) = Just (n, expl, t)
537540 convertImplPi _ = Nothing
538541
539− generateEliminatorClauses :: (String, Name, PTerm, FC, [Name]) -> Name -> [PArg] -> [(Name, Plicity, PTerm)] -> EliminatorState PClause
540− generateEliminatorClauses (doc, cnm, ty, fc, fs) cnsElim generalArgs generalParameters = do
542+ generateEliminatorClauses :: (String, [(Name, String)], Name, PTerm, FC, [Name]) -> Name -> [PArg] -> [(Name, Plicity, PTerm)] -> EliminatorState PClause
543+ generateEliminatorClauses (doc, _, cnm, ty, fc, fs) cnsElim generalArgs generalParameters = do
541544 let cons' = replaceParams paramPos generalParameters ty
542545 let (args, resTy) = splitPi cons'
543546 i <- State.lift getIState
@@ -558,7 +561,7 @@ elabEliminator paramPos n ty cons info = do
558561
559562elabPrims :: Idris ()
560563elabPrims = 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)
562565 (zip
563566 [inferOpts, unitOpts, falseOpts, pairOpts, eqOpts]
564567 [inferDecl, unitDecl, falseDecl, pairDecl, eqDecl]))
@@ -626,8 +629,8 @@ elabPrims = do mapM_ (elabDecl EAll toplevel)
626629
627630
628631-- | Elaborate a type provider
629−elabProvider :: ElabInfo -> SyntaxInfo -> FC -> Name -> PTerm -> PTerm -> Idris ()
630−elabProvider info syn fc n ty tm
632+elabProvider :: ElabInfo -> SyntaxInfo -> FC -> ProvideWhat -> Name -> PTerm -> PTerm -> Idris ()
633+elabProvider info syn fc what n ty tm
631634 = do i <- getIState
632635 -- Ensure that the experimental extension is enabled
633636 unless (TypeProviders `elem` idris_language_extensions i) $
@@ -647,9 +650,6 @@ elabProvider info syn fc n ty tm
647650 ifail $ "Expected provider type IO (Provider (" ++
648651 show ty' ++ "))" ++ ", got " ++ show et ++ " instead."
649652
650− -- Create the top-level type declaration
651− elabType info syn "" fc [] n ty
652−
653653 -- Execute the type provider and normalise the result
654654 -- use 'run__provider' to convert to a primitive IO action
655655
@@ -658,12 +658,25 @@ elabProvider info syn fc n ty tm
658658 let rhs' = normalise ctxt [] rhs
659659 logLvl 1 $ "Normalised " ++ show n ++ "'s RHS to " ++ show rhs
660660
661− -- Extract the provided term from the type provider
662− tm <- getProvided fc rhs'
663−
664− -- Finally add a top-level definition of the provided term
665− 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
661+ -- Extract the provided term or postulate from the type provider
662+ provided <- getProvided fc rhs'
663+
664+ case provided of
665+ Provide tm
666+ | what `elem` [ProvTerm, ProvAny] ->
667+ do -- Finally add a top-level definition of the provided term
668+ elabType info syn "" [] fc [] n ty
669+ elabClauses info fc [] n [PClause fc n (PApp fc (PRef fc n) []) [] (delab i tm) []]
670+ logLvl 1 $ "Elaborated provider " ++ show n ++ " as: " ++ show tm
671+ | otherwise ->
672+ ierror . Msg $ "Attempted to provide a term where a postulate was expected."
673+ Postulate
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
678+ | otherwise ->
679+ ierror . Msg $ "Attempted to provide a postulate where a term was expected."
667680
668681 where isTType :: TT Name -> Bool
669682 isTType (TType _) = True
@@ -714,7 +727,7 @@ elabTransform info fc safe lhs_in rhs_in
714727elabRecord :: ElabInfo -> SyntaxInfo -> String -> FC -> Name ->
715728 PTerm -> String -> Name -> PTerm -> Idris ()
716729elabRecord 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, [])])
718731 cty' <- implicit syn cn cty
719732 i <- getIState
720733 cty <- case lookupTy cn (tt_ctxt i) of
@@ -737,7 +750,7 @@ elabRecord info syn doc fc tyn ty cdoc cn cty
737750 where
738751-- syn = syn_in { syn_namespace = show (nsroot tyn) : syn_namespace syn_in }
739752
740− isNonImp (PExp _ _ _ _, a) = Just a
753+ isNonImp (PExp _ _ _, a) = Just a
741754 isNonImp _ = Nothing
742755
743756 tryElabDecl info (fn, ty, val)
@@ -749,15 +762,15 @@ elabRecord info syn doc fc tyn ty cdoc cn cty
749762 show fn ++ " (" ++ show ty ++ ")"
750763 putIState i)
751764
752− getImplB k (PPi (Imp l s _ _) n Placeholder sc)
765+ getImplB k (PPi (Imp l s _) n Placeholder sc)
753766 = getImplB k sc
754− getImplB k (PPi (Imp l s d p) n ty sc)
755− = getImplB (\x -> k (PPi (Imp l s d p) n ty x)) sc
767+ getImplB k (PPi (Imp l s p) n ty sc)
768+ = getImplB (\x -> k (PPi (Imp l s p) n ty x)) sc
756769 getImplB k (PPi _ n ty sc)
757770 = getImplB k sc
758771 getImplB k _ = k
759772
760− renameBs (PImp _ _ _ _ _ _ : ps) (PPi p n ty s)
773+ renameBs (PImp _ _ _ _ _ : ps) (PPi p n ty s)
761774 = PPi p (mkImp n) ty (renameBs ps (substMatch n (PRef fc (mkImp n)) s))
762775 renameBs (_:ps) (PPi p n ty s) = PPi p n ty (renameBs ps s)
763776 renameBs _ t = t
@@ -784,7 +797,7 @@ elabRecord info syn doc fc tyn ty cdoc cn cty
784797
785798 mkProj recty substs cimp ((pn_in, pty), pos)
786799 = do let pn = expandNS syn pn_in
787− let pfnTy = PTy "" defaultSyntax fc [] pn
800+ let pfnTy = PTy "" [] defaultSyntax fc [] pn
788801 (PPi expl rec recty
789802 (substMatches substs pty))
790803 let pls = repeat Placeholder
@@ -805,7 +818,7 @@ elabRecord info syn doc fc tyn ty cdoc cn cty
805818 let valname = sMN 0 "updateval"
806819 let pt = k (PPi expl pn pty
807820 (PPi expl rec recty recty))
808− let pfnTy = PTy "" defaultSyntax fc [] setname pt
821+ let pfnTy = PTy "" [] defaultSyntax fc [] setname pt
809822 let pls = map (\x -> PRef fc (sMN x "field")) [0..num-1]
810823 let lhsArgs = pls
811824 let rhsArgs = take pos pls ++ (PRef fc valname) :
@@ -821,8 +834,8 @@ elabRecord info syn doc fc tyn ty cdoc cn cty
821834 return (pn, pfnTy, PClauses fc [] setname [pclause])
822835
823836elabCon :: ElabInfo -> SyntaxInfo -> Name -> Bool ->
824− (String, Name, PTerm, FC, [Name]) -> Idris (Name, Type)
825−elabCon info syn tn codata (doc, n, t_in, fc, forcenames)
837+ (String, [(Name, String)], Name, PTerm, FC, [Name]) -> Idris (Name, Type)
838+elabCon info syn tn codata (doc, argDocs, n, t_in, fc, forcenames)
826839 = do checkUndefined fc n
827840 ctxt <- getContext
828841 i <- getIState
@@ -843,7 +856,8 @@ elabCon info syn tn codata (doc, n, t_in, fc, forcenames)
843856 tyIs cty'
844857 logLvl 2 $ "---> " ++ show n ++ " : " ++ show cty'
845858 addIBC (IBCDef n)
846− addDocStr n doc
859+ checkDocs fc argDocs t_in
860+ addDocStr n doc argDocs
847861 addIBC (IBCDoc n)
848862 let fs = map (getNamePos 0 t) forcenames
849863 -- FIXME: 'forcenames' is an almighty hack! Need a better way of
@@ -1148,7 +1162,7 @@ elabPE info fc caller r =
11481162 (map (\ (lhs, rhs) ->
11491163 (showTmImpls lhs ++ " = " ++
11501164 showTmImpls rhs)) pats)
1151− elabType info defaultSyntax "" fc opts newnm specTy
1165+ elabType info defaultSyntax "" [] fc opts newnm specTy
11521166 let def = map (\ (lhs, rhs) -> PClause fc newnm lhs [] rhs []) pats
11531167 elabClauses info fc opts newnm def
11541168 logLvl 1 $ "Specialised " ++ show newnm)
@@ -1266,7 +1280,7 @@ checkPossible info fc tcgen fname lhs_in
12661280 ((P _ x _, _), (P _ y _, _)) -> x == y
12671281 _ -> False
12681282
1269−getFixedInType i env (PExp _ _ _ _ : is) (Bind n (Pi t) sc)
1283+getFixedInType i env (PExp _ _ _ : is) (Bind n (Pi t) sc)
12701284 = getFixedInType i (n : env) is (instantiate (P Bound n t) sc)
12711285getFixedInType i env (_ : is) (Bind n (Pi t) sc)
12721286 = 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)
14901504-- = NS (UN ('#':show x)) [show cnum, show fname]
14911505
14921506 sepBlocks bs = sepBlocks' [] bs where
1493− sepBlocks' ns (d@(PTy _ _ _ _ n t) : bs)
1507+ sepBlocks' ns (d@(PTy _ _ _ _ _ n t) : bs)
14941508 = let (bf, af) = sepBlocks' (n : ns) bs in
14951509 (d : bf, af)
14961510 sepBlocks' ns (d@(PClauses _ _ n _) : bs)
@@ -1711,7 +1725,7 @@ elabClass :: ElabInfo -> SyntaxInfo -> String ->
17111725 FC -> [PTerm] ->
17121726 Name -> [(Name, PTerm)] -> [PDecl] -> Idris ()
17131727elabClass 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)
17151729 let tty = pibind ps PType
17161730 let constraint = PApp fc (PRef fc tn)
17171731 (map (pexp . PRef fc) (map fst ps))
@@ -1734,10 +1748,10 @@ elabClass info syn doc fc constraints tn ps ds
17341748 let cty = impbind ps $ conbind constraints
17351749 $ pibind (map (\ (n, ty) -> (nsroot n, ty)) methods)
17361750 constraint
1737− let cons = [("", cn, cty, fc, [])]
1751+ let cons = [("", [], cn, cty, fc, [])]
17381752 let ddecl = PDatadecl tn tty cons
17391753 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
17411755 -- for each constraint, build a top level function to chase it
17421756 logLvl 5 $ "Building functions"
17431757 let usyn = syn { using = map (\ (x,y) -> UImplicit x y) ps
@@ -1775,8 +1789,8 @@ elabClass info syn doc fc constraints tn ps ds
17751789 conbind (ty : ns) x = PPi constraint (sMN 0 "class") ty (conbind ns x)
17761790 conbind [] x = x
17771791
1778− getMName (PTy _ _ _ _ n _) = nsroot n
1779− tdecl allmeths (PTy doc syn _ o n t)
1792+ getMName (PTy _ _ _ _ _ n _) = nsroot n
1793+ tdecl allmeths (PTy doc _ syn _ o n t)
17801794 = do t' <- implicit' syn allmeths n t
17811795 logLvl 5 $ "Method " ++ show n ++ " : " ++ showTmImpls t'
17821796 return ( (n, (toExp (map fst ps) Exp t')),
@@ -1789,7 +1803,7 @@ elabClass info syn doc fc constraints tn ps ds
17891803 case lookup n mtys of
17901804 Just (syn, o, ty) -> do let ty' = insertConstraint c ty
17911805 let ds = map (decorateid defaultdec)
1792− [PTy "" syn fc [] n ty',
1806+ [PTy "" [] syn fc [] n ty',
17931807 PClauses fc (o ++ opts) n cs]
17941808 iLOG (show ds)
17951809 return (n, ((defaultdec n, ds!!1), ds))
@@ -1799,7 +1813,7 @@ elabClass info syn doc fc constraints tn ps ds
17991813 defaultdec (UN n) = sUN ("default#" ++ str n)
18001814 defaultdec (NS n ns) = NS (defaultdec n) ns
18011815
1802− tydecl (PTy _ _ _ _ _ _) = True
1816+ tydecl (PTy _ _ _ _ _ _ _) = True
18031817 tydecl _ = False
18041818 instdecl (PInstance _ _ _ _ _ _ _ _) = True
18051819 instdecl _ = False
@@ -1827,7 +1841,7 @@ elabClass info syn doc fc constraints tn ps ds
18271841 addInstance False conn' cfn
18281842 addIBC (IBCInstance False conn' cfn)
18291843-- iputStrLn ("Added " ++ show (conn, cfn, ty))
1830− return [PTy "" syn fc [] cfn ty,
1844+ return [PTy "" [] syn fc [] cfn ty,
18311845 PClauses fc [Dictionary] cfn [PClause fc cfn lhs [] rhs []]]
18321846
18331847 -- 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
18431857 iLOG (showTmImpls ty)
18441858 iLOG (show (m, ty', capp, margs))
18451859 iLOG (showTmImpls lhs ++ " = " ++ showTmImpls rhs)
1846− return [PTy doc syn fc o m ty',
1860+ return [PTy doc [] syn fc o m ty',
18471861 PClauses fc [Inlinable] m [PClause fc m lhs [] rhs []]]
18481862
1849− getMArgs (PPi (Imp _ _ _ _) n ty sc) = IA : getMArgs sc
1850− getMArgs (PPi (Exp _ _ _ _) n ty sc) = EA : getMArgs sc
1851− getMArgs (PPi (Constraint _ _ _) n ty sc) = CA : getMArgs sc
1863+ getMArgs (PPi (Imp _ _ _) n ty sc) = IA : getMArgs sc
1864+ getMArgs (PPi (Exp _ _ _) n ty sc) = EA : getMArgs sc
1865+ getMArgs (PPi (Constraint _ _) n ty sc) = CA : getMArgs sc
18521866 getMArgs _ = []
18531867
18541868 getMeth (m:ms) (a:as) x | x == a = PRef fc m
@@ -1864,14 +1878,14 @@ elabClass info syn doc fc constraints tn ps ds
18641878 rhsArgs (CA : xs) ns = pconst (PResolveTC fc) : rhsArgs xs ns
18651879 rhsArgs [] _ = []
18661880
1867− insertConstraint c (PPi p@(Imp _ _ _ _) n ty sc)
1881+ insertConstraint c (PPi p@(Imp _ _ _) n ty sc)
18681882 = PPi p n ty (insertConstraint c sc)
18691883 insertConstraint c sc = PPi constraint (sMN 0 "class") c sc
18701884
18711885 -- 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)
18731887 | 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)
18751889 toExp ns e (PPi p n ty sc) = PPi p n ty (toExp ns e sc)
18761890 toExp ns e sc = sc
18771891
@@ -1891,7 +1905,7 @@ elabInstance info syn what fc cs n ps t expn ds = do
18911905 let constraint = PApp fc (PRef fc n) (map pexp ps)
18921906 let iname = mkiname n ps expn
18931907 when (what /= EDefns) $ do
1894− nty <- elabType' True info syn "" fc [] iname t
1908+ nty <- elabType' True info syn "" [] fc [] iname t
18951909 -- if the instance type matches any of the instances we have already,
18961910 -- and it's not a named instance, then it's overlapping, so report an error
18971911 case expn of
@@ -1999,17 +2013,17 @@ elabInstance info syn what fc cs n ps t expn ds = do
19992013
20002014 mkMethApp (n, _, _, ty)
20012015 = 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'
20032017 = PLam (sMN i "meth") Placeholder (lamBind (i+1) sc sc')
20042018 lamBind i (PPi _ n ty sc) sc'
20052019 = PLam (sMN i "meth") Placeholder (lamBind (i+1) sc sc')
20062020 lamBind i _ sc = sc
2007− methArgs i (PPi (Imp _ _ _ _) n ty sc)
2008− = PImp 0 True [] n (PRef fc (sMN i "meth")) "" : methArgs (i+1) sc
2009− methArgs i (PPi (Exp _ _ _ _) n ty sc)
2010− = PExp 0 [] (PRef fc (sMN i "meth")) "" : methArgs (i+1) sc
2011− methArgs i (PPi (Constraint _ _ _) n ty sc)
2012− = PConstraint 0 [] (PResolveTC fc) "" : methArgs (i+1) sc
2021+ methArgs i (PPi (Imp _ _ _) n ty sc)
2022+ = PImp 0 True [] n (PRef fc (sMN i "meth")) : methArgs (i+1) sc
2023+ methArgs i (PPi (Exp _ _ _) n ty sc)
2024+ = PExp 0 [] (PRef fc (sMN i "meth")) : methArgs (i+1) sc
2025+ methArgs i (PPi (Constraint _ _) n ty sc)
2026+ = PConstraint 0 [] (PResolveTC fc) : methArgs (i+1) sc
20132027 methArgs i _ = []
20142028
20152029 papp fc f [] = f
@@ -2028,12 +2042,12 @@ elabInstance info syn what fc cs n ps t expn ds = do
20282042 decorate ns iname (UN n) = NS (SN (MethodN (UN n))) ns
20292043 decorate ns iname (NS (UN n) s) = NS (SN (MethodN (UN n))) ns
20302044
2031− mkTyDecl (n, op, t, _) = PTy "" syn fc op n t
2045+ mkTyDecl (n, op, t, _) = PTy "" [] syn fc op n t
20322046
20332047 conbind (ty : ns) x = PPi constraint (sMN 0 "class") ty (conbind ns x)
20342048 conbind [] x = x
20352049
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)
20372051 coninsert cs sc = conbind cs sc
20382052
20392053 insertDefaults :: IState -> Name ->
@@ -2091,7 +2105,7 @@ elabInstance info syn what fc cs n ps t expn ds = do
20912105 PClauses fc [Dictionary] cfn [PClause fc cfn lhs [] rhs []]]
20922106-}
20932107
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
20952109decorateid decorate (PClauses f o n cs)
20962110 = PClauses f o (decorate n) (map dc cs)
20972111 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 _ _ _)
21452159 = return () -- nothing to elaborate
21462160elabDecl' _ info (PSyntax _ p)
21472161 = 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)
21492163 | what /= EDefns
21502164 = 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
21522166 return ()
21532167elabDecl' what info (PPostulate doc s f o n ty)
21542168 | what /= EDefns
21552169 = do iLOG $ "Elaborating postulate " ++ show n ++ show o
21562170 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)
21582172 | what /= ETypes
21592173 = do iLOG $ "Elaborating " ++ show (d_name d)
2160− elabData info s doc f co d
2174+ elabData info s doc argDocs f co d
21612175 | otherwise
21622176 = 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))
21642178elabDecl' what info d@(PClauses f o n ps)
21652179 | what /= ETypes
21662180 = do iLOG $ "Elaborating clause " ++ show n
@@ -2217,17 +2231,17 @@ elabDecl' what info (PRecord doc s f tyn ty cdoc cn cty)
22172231 elabRecord info s doc f tyn ty cdoc cn cty
22182232 | otherwise
22192233 = 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)
22212235elabDecl' _ info (PDSL n dsl)
22222236 = do i <- getIState
22232237 putIState (i { idris_dsls = addDef n dsl (idris_dsls i) })
22242238 addIBC (IBCDSL n)
22252239elabDecl' what info (PDirective i)
22262240 | what /= EDefns = i
2227−elabDecl' what info (PProvider syn fc n tp tm)
2241+elabDecl' what info (PProvider syn fc provWhat n tp tm)
22282242 | what /= EDefns
22292243 = do iLOG $ "Elaborating type provider " ++ show n
2230− elabProvider info syn fc n tp tm
2244+ elabProvider info syn fc provWhat n tp tm
22312245elabDecl' what info (PTransform fc safety old new)
22322246 = elabTransform info fc safety old new
22332247elabDecl' _ _ _ = return () -- skipped this time
@@ -2272,3 +2286,14 @@ inferredDiff fc inf user =
22722286 Right vs -> return False
22732287 Left (x, y) -> return True
22742288
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."