@@ -26,6 +26,8 @@ import Idris.Core.Execute
2626import Idris.Core.Typecheck
2727import Idris.Core.CaseTree
2828
29+import Idris.Docstrings
30+
2931import Control.DeepSeq
3032import Control.Monad
3133import Control.Monad.State.Strict as State
@@ -63,12 +65,12 @@ checkAddDef add toplvl fc ((n, (i, top, t)) : ns)
6365-- return (n, (i, top, t'))) ns
6466
6567-- | Elaborate a top-level type declaration - for example, "foo : Int -> Int".
66−elabType :: ElabInfo -> SyntaxInfo -> String -> [(Name, String)] ->
68+elabType :: ElabInfo -> SyntaxInfo -> Docstring -> [(Name, Docstring)] ->
6769 FC -> FnOpts -> Name -> PTerm -> Idris Type
6870elabType = elabType' False
6971
7072elabType' :: Bool -> -- normalise it
71− ElabInfo -> SyntaxInfo -> String -> [(Name, String)] ->
73+ ElabInfo -> SyntaxInfo -> Docstring -> [(Name, Docstring)] ->
7274 FC -> FnOpts -> Name -> PTerm -> Idris Type
7375elabType' norm info syn doc argDocs fc opts n ty' = {- let ty' = piBind (params info) ty_in
7476 n = liftname info n_in in -}
@@ -76,12 +78,12 @@ elabType' norm info syn doc argDocs fc opts n ty' = {- let ty' = piBind (params
7678 ctxt <- getContext
7779 i <- getIState
7880
79− logLvl 1 $ show n ++ " pre-type " ++ showTmImpls ty'
81+ logLvl 3 $ show n ++ " pre-type " ++ showTmImpls ty'
8082 ty' <- addUsingConstraints syn fc ty'
8183 ty' <- implicit syn n ty'
8284
8385 let ty = addImpl i ty'
84− logLvl 1 $ show n ++ " type " ++ showTmImpls ty
86+ logLvl 3 $ show n ++ " type " ++ showTmImpls ty
8587 ((tyT, defer, is), log) <-
8688 tclift $ elaborate ctxt n (TType (UVal 0)) []
8789 (errAt "type of " n (erun fc (build i info False [] n ty)))
@@ -171,7 +173,7 @@ elabType' norm info syn doc argDocs fc opts n ty' = {- let ty' = piBind (params
171173 tyIsHandler _ = False
172174
173175
174−elabPostulate :: ElabInfo -> SyntaxInfo -> String ->
176+elabPostulate :: ElabInfo -> SyntaxInfo -> Docstring ->
175177 FC -> FnOpts -> Name -> PTerm -> Idris ()
176178elabPostulate info syn doc fc opts n ty
177179 = do elabType info syn doc [] fc opts n ty
@@ -195,7 +197,7 @@ elabPostulate info syn doc fc opts n ty
195197 -- remove it from the deferred definitions list
196198 solveDeferred n
197199
198−elabData :: ElabInfo -> SyntaxInfo -> String -> [(Name, String)] -> FC -> DataOpts -> PData -> Idris ()
200+elabData :: ElabInfo -> SyntaxInfo -> Docstring -> [(Name, Docstring)] -> FC -> DataOpts -> PData -> Idris ()
199201elabData info syn doc argDocs fc opts (PLaterdecl n t_in)
200202 = do let codata = Codata `elem` opts
201203 iLOG (show (fc, doc))
@@ -257,8 +259,9 @@ elabData info syn doc argDocs fc opts (PDatadecl n t_in dcons)
257259 updateContext (addDatatype (Data n ttag cty cons))
258260 updateContext (setMetaInformation n metainf)
259261 mapM_ (checkPositive n) cons
260− if DefaultEliminator `elem` opts then evalStateT (elabEliminator params n t dcons info) Map.empty
261− else return ()
262+ if DefaultEliminator `elem` opts
263+ then evalStateT (elabEliminator params n t dcons info) Map.empty
264+ else return ()
262265 where
263266 checkDefinedAs fc n t ctxt
264267 = case lookupDef n ctxt of
@@ -322,7 +325,7 @@ type EliminatorState = StateT (Map.Map String Int) Idris
322325
323326-- TODO: Use uniqueName for generating names, rewrite everything to use idris_implicits instead of manual splitting, generally just rewrite
324327elabEliminator :: [Int] -> Name -> PTerm ->
325− [(String, [(Name, String)], Name, PTerm, FC, [Name])] ->
328+ [(Docstring, [(Name, Docstring)], Name, PTerm, FC, [Name])] ->
326329 ElabInfo -> EliminatorState ()
327330elabEliminator paramPos n ty cons info = do
328331 elimLog $ "Elaborating eliminator"
@@ -339,7 +342,7 @@ elabEliminator paramPos n ty cons info = do
339342 let motiveConstr = [(motiveName, expl, motive)]
340343 let scrutinee = (scrutineeName, expl, applyCons n (interlievePos paramPos generalParams scrutineeIdxs 0))
341344 let eliminatorTy = piConstr (generalParams ++ motiveConstr ++ consTerms ++ scrutineeIdxs ++ [scrutinee]) (applyMotive (map (\(n,_,_) -> PRef elimFC n) scrutineeIdxs) (PRef elimFC scrutineeName))
342− let eliminatorTyDecl = PTy (show n) [] defaultSyntax elimFC [TotalFn] elimDeclName eliminatorTy
345+ let eliminatorTyDecl = PTy (parseDocstring . T.pack $ show n) [] defaultSyntax elimFC [TotalFn] elimDeclName eliminatorTy
343346 let clauseConsElimArgs = map getPiName consTerms
344347 let clauseGeneralArgs' = map getPiName generalParams ++ [motiveName] ++ clauseConsElimArgs
345348 let clauseGeneralArgs = map (\arg -> pexp (PRef elimFC arg)) clauseGeneralArgs'
@@ -488,7 +491,7 @@ elabEliminator paramPos n ty cons info = do
488491 splitArgPms _ = ([],[])
489492
490493
491− implicitIndexes :: (String, Name, PTerm, FC, [Name]) -> EliminatorState [(Name, Plicity, PTerm)]
494+ implicitIndexes :: (Docstring, Name, PTerm, FC, [Name]) -> EliminatorState [(Name, Plicity, PTerm)]
492495 implicitIndexes (cns@(doc, cnm, ty, fc, fs)) = do
493496 i <- State.lift getIState
494497 implargs' <- case lookupCtxt cnm (idris_implicits i) of
@@ -503,7 +506,7 @@ elabEliminator paramPos n ty cons info = do
503506 in return $ filter (\(n,_,_) -> not (n `elem` oldParams))implargs
504507 _ -> return implargs
505508
506− extractConsTerm :: (String, [(Name, String)], Name, PTerm, FC, [Name]) -> [(Name, Plicity, PTerm)] -> EliminatorState PTerm
509+ extractConsTerm :: (Docstring, [(Name, Docstring)], Name, PTerm, FC, [Name]) -> [(Name, Plicity, PTerm)] -> EliminatorState PTerm
507510 extractConsTerm (doc, argDocs, cnm, ty, fc, fs) generalParameters = do
508511 let cons' = replaceParams paramPos generalParameters ty
509512 let (args, resTy) = splitPi cons'
@@ -539,7 +542,7 @@ elabEliminator paramPos n ty cons info = do
539542 convertImplPi (PImp {getTm = t, pname = n}) = Just (n, expl, t)
540543 convertImplPi _ = Nothing
541544
542− generateEliminatorClauses :: (String, [(Name, String)], Name, PTerm, FC, [Name]) -> Name -> [PArg] -> [(Name, Plicity, PTerm)] -> EliminatorState PClause
545+ generateEliminatorClauses :: (Docstring, [(Name, Docstring)], Name, PTerm, FC, [Name]) -> Name -> [PArg] -> [(Name, Plicity, PTerm)] -> EliminatorState PClause
543546 generateEliminatorClauses (doc, _, cnm, ty, fc, fs) cnsElim generalArgs generalParameters = do
544547 let cons' = replaceParams paramPos generalParameters ty
545548 let (args, resTy) = splitPi cons'
@@ -561,7 +564,7 @@ elabEliminator paramPos n ty cons info = do
561564
562565elabPrims :: Idris ()
563566elabPrims = do mapM_ (elabDecl EAll toplevel)
564− (map (\(opt, decl) -> PData "" [] defaultSyntax (fileFC "builtin") opt decl)
567+ (map (\(opt, decl) -> PData emptyDocstring [] defaultSyntax (fileFC "builtin") opt decl)
565568 (zip
566569 [inferOpts, unitOpts, falseOpts, pairOpts, eqOpts]
567570 [inferDecl, unitDecl, falseDecl, pairDecl, eqDecl]))
@@ -656,7 +659,7 @@ elabProvider info syn fc what n ty tm
656659 rhs <- execute (mkApp (P Ref (sUN "run__provider") Erased)
657660 [Erased, e])
658661 let rhs' = normalise ctxt [] rhs
659− logLvl 1 $ "Normalised " ++ show n ++ "'s RHS to " ++ show rhs
662+ logLvl 3 $ "Normalised " ++ show n ++ "'s RHS to " ++ show rhs
660663
661664 -- Extract the provided term or postulate from the type provider
662665 provided <- getProvided fc rhs'
@@ -665,16 +668,16 @@ elabProvider info syn fc what n ty tm
665668 Provide tm
666669 | what `elem` [ProvTerm, ProvAny] ->
667670 do -- Finally add a top-level definition of the provided term
668− elabType info syn "" [] fc [] n ty
671+ elabType info syn emptyDocstring [] fc [] n ty
669672 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
673+ logLvl 3 $ "Elaborated provider " ++ show n ++ " as: " ++ show tm
671674 | otherwise ->
672675 ierror . Msg $ "Attempted to provide a term where a postulate was expected."
673676 Postulate
674677 | what `elem` [ProvPostulate, ProvAny] ->
675678 do -- Add the postulate
676− elabPostulate info syn "Provided postulate" fc [] n ty
677− logLvl 1 $ "Elaborated provided postulate " ++ show n
679+ elabPostulate info syn (parseDocstring $ T.pack "Provided postulate") fc [] n ty
680+ logLvl 3 $ "Elaborated provided postulate " ++ show n
678681 | otherwise ->
679682 ierror . Msg $ "Attempted to provide a postulate where a term was expected."
680683
@@ -724,8 +727,8 @@ elabTransform info fc safe lhs_in rhs_in
724727 addIBC (IBCTrans (clhs_tm, crhs_tm))
725728
726729
727−elabRecord :: ElabInfo -> SyntaxInfo -> String -> FC -> Name ->
728− PTerm -> String -> Name -> PTerm -> Idris ()
730+elabRecord :: ElabInfo -> SyntaxInfo -> Docstring -> FC -> Name ->
731+ PTerm -> Docstring -> Name -> PTerm -> Idris ()
729732elabRecord info syn doc fc tyn ty cdoc cn cty
730733 = do elabData info syn doc [] fc [] (PDatadecl tyn ty [(cdoc, [], cn, cty, fc, [])])
731734 cty' <- implicit syn cn cty
@@ -797,7 +800,7 @@ elabRecord info syn doc fc tyn ty cdoc cn cty
797800
798801 mkProj recty substs cimp ((pn_in, pty), pos)
799802 = do let pn = expandNS syn pn_in
800− let pfnTy = PTy "" [] defaultSyntax fc [] pn
803+ let pfnTy = PTy emptyDocstring [] defaultSyntax fc [] pn
801804 (PPi expl rec recty
802805 (substMatches substs pty))
803806 let pls = repeat Placeholder
@@ -818,7 +821,7 @@ elabRecord info syn doc fc tyn ty cdoc cn cty
818821 let valname = sMN 0 "updateval"
819822 let pt = k (PPi expl pn pty
820823 (PPi expl rec recty recty))
821− let pfnTy = PTy "" [] defaultSyntax fc [] setname pt
824+ let pfnTy = PTy emptyDocstring [] defaultSyntax fc [] setname pt
822825 let pls = map (\x -> PRef fc (sMN x "field")) [0..num-1]
823826 let lhsArgs = pls
824827 let rhsArgs = take pos pls ++ (PRef fc valname) :
@@ -834,7 +837,7 @@ elabRecord info syn doc fc tyn ty cdoc cn cty
834837 return (pn, pfnTy, PClauses fc [] setname [pclause])
835838
836839elabCon :: ElabInfo -> SyntaxInfo -> Name -> Bool ->
837− (String, [(Name, String)], Name, PTerm, FC, [Name]) -> Idris (Name, Type)
840+ (Docstring, [(Name, Docstring)], Name, PTerm, FC, [Name]) -> Idris (Name, Type)
838841elabCon info syn tn codata (doc, argDocs, n, t_in, fc, forcenames)
839842 = do checkUndefined fc n
840843 ctxt <- getContext
@@ -988,7 +991,7 @@ elabClauses info fc opts n_in cs = let n = liftname info n_in in
988991 simpleCase tcase False reflect CompileTime fc atys pdef
989992 cov <- coverage
990993 pmissing <-
991− if cov
994+ if cov && not (hasDefault cs)
992995 then do missing <- genClauses fc n (map getLHS pdef) cs
993996 -- missing <- genMissing n scargs sc
994997 missing' <- filterM (checkPossible info fc True n) missing
@@ -1092,6 +1095,10 @@ elabClauses info fc opts n_in cs = let n = liftname info n_in in
10921095 depat acc (Bind n (PVar t) sc) = depat (n : acc) (instantiate (P Bound n t) sc)
10931096 depat acc x = (acc, x)
10941097
1098+ hasDefault cs | (PClause _ _ last _ _ _ :_) <- reverse cs
1099+ , (PApp fn s args) <- last = all ((==Placeholder) . getTm) args
1100+ hasDefault _ = False
1101+
10951102 getLHS (_, l, _) = l
10961103
10971104 simple_lhs ctxt (Right (x, y)) = Right (normalise ctxt [] x,
@@ -1162,10 +1169,10 @@ elabPE info fc caller r =
11621169 (map (\ (lhs, rhs) ->
11631170 (showTmImpls lhs ++ " = " ++
11641171 showTmImpls rhs)) pats)
1165− elabType info defaultSyntax "" [] fc opts newnm specTy
1172+ elabType info defaultSyntax emptyDocstring [] fc opts newnm specTy
11661173 let def = map (\ (lhs, rhs) -> PClause fc newnm lhs [] rhs []) pats
11671174 elabClauses info fc opts newnm def
1168− logLvl 1 $ "Specialised " ++ show newnm)
1175+ logLvl 2 $ "Specialised " ++ show newnm)
11691176 -- if it doesn't work, just don't specialise. Could happen for lots
11701177 -- of valid reasons (e.g. local variables in scope which can't be
11711178 -- lifted out).
@@ -1419,7 +1426,7 @@ elabClause info opts (cnum, PClause fc fname lhs_in withs rhs_in whereblock)
14191426 -- Elaborate those with a type *before* RHS, those without *after*
14201427 let (wbefore, wafter) = sepBlocks wb
14211428
1422− logLvl 1 $ "Where block:\n " ++ show wbefore ++ "\n" ++ show wafter
1429+ logLvl 2 $ "Where block:\n " ++ show wbefore ++ "\n" ++ show wafter
14231430 mapM_ (elabDecl' EAll info) wbefore
14241431 -- Now build the RHS, using the type of the LHS as the goal.
14251432 i <- getIState -- new implicits from where block
@@ -1563,7 +1570,7 @@ elabClause info opts (_, PWith fc fname lhs_in withs wval_in withblock)
15631570 _ -> []
15641571 let params = getParamsInType i [] fn_is fn_ty
15651572 let lhs = propagateParams params fn_ty (addImplPat i (stripLinear i lhs_in))
1566− logLvl 1 ("LHS: " ++ show lhs)
1573+ logLvl 2 ("LHS: " ++ show lhs)
15671574 ((lhs', dlhs, []), _) <-
15681575 tclift $ elaborate ctxt (sMN 0 "patLHS") infP []
15691576 (errAt "left hand side of with in " fname
@@ -1721,7 +1728,7 @@ elabClause info opts (_, PWith fc fname lhs_in withs wval_in withblock)
17211728
17221729data MArgTy = IA | EA | CA deriving Show
17231730
1724−elabClass :: ElabInfo -> SyntaxInfo -> String ->
1731+elabClass :: ElabInfo -> SyntaxInfo -> Docstring ->
17251732 FC -> [PTerm] ->
17261733 Name -> [(Name, PTerm)] -> [PDecl] -> Idris ()
17271734elabClass info syn doc fc constraints tn ps ds
@@ -1748,7 +1755,7 @@ elabClass info syn doc fc constraints tn ps ds
17481755 let cty = impbind ps $ conbind constraints
17491756 $ pibind (map (\ (n, ty) -> (nsroot n, ty)) methods)
17501757 constraint
1751− let cons = [("", [], cn, cty, fc, [])]
1758+ let cons = [(emptyDocstring, [], cn, cty, fc, [])]
17521759 let ddecl = PDatadecl tn tty cons
17531760 logLvl 5 $ "Class data " ++ show (showDImp True ddecl)
17541761 elabData info (syn { no_imp = no_imp syn ++ mnames }) doc [] fc [] ddecl
@@ -1803,7 +1810,7 @@ elabClass info syn doc fc constraints tn ps ds
18031810 case lookup n mtys of
18041811 Just (syn, o, ty) -> do let ty' = insertConstraint c ty
18051812 let ds = map (decorateid defaultdec)
1806− [PTy "" [] syn fc [] n ty',
1813+ [PTy emptyDocstring [] syn fc [] n ty',
18071814 PClauses fc (o ++ opts) n cs]
18081815 iLOG (show ds)
18091816 return (n, ((defaultdec n, ds!!1), ds))
@@ -1841,7 +1848,7 @@ elabClass info syn doc fc constraints tn ps ds
18411848 addInstance False conn' cfn
18421849 addIBC (IBCInstance False conn' cfn)
18431850-- iputStrLn ("Added " ++ show (conn, cfn, ty))
1844− return [PTy "" [] syn fc [] cfn ty,
1851+ return [PTy emptyDocstring [] syn fc [] cfn ty,
18451852 PClauses fc [Dictionary] cfn [PClause fc cfn lhs [] rhs []]]
18461853
18471854 -- Generate a top level function which looks up a method in a given
@@ -1905,7 +1912,7 @@ elabInstance info syn what fc cs n ps t expn ds = do
19051912 let constraint = PApp fc (PRef fc n) (map pexp ps)
19061913 let iname = mkiname n ps expn
19071914 when (what /= EDefns) $ do
1908− nty <- elabType' True info syn "" [] fc [] iname t
1915+ nty <- elabType' True info syn emptyDocstring [] fc [] iname t
19091916 -- if the instance type matches any of the instances we have already,
19101917 -- and it's not a named instance, then it's overlapping, so report an error
19111918 case expn of
@@ -1921,7 +1928,7 @@ elabInstance info syn what fc cs n ps t expn ds = do
19211928 -- get the implicit parameters that need passing through to the
19221929 -- where block
19231930 wparams <- mapM (\p -> case p of
1924− PApp _ _ args -> getWParams args
1931+ PApp _ _ args -> getWParams (map getTm args)
19251932 _ -> return []) ps
19261933 let pnames = map pname (concat (nub wparams))
19271934 let superclassInstances = map (substInstance ips pnames) (class_default_superclasses ci)
@@ -1947,9 +1954,24 @@ elabInstance info syn what fc cs n ps t expn ds = do
19471954 logLvl 3 $ "Method types " ++ showSep "\n" (map (show . showDeclImp True . mkTyDecl) mtys)
19481955 logLvl 3 $ "Instance is " ++ show ps ++ " implicits " ++
19491956 show (concat (nub wparams))
1950− let lhs = PRef fc iname
1957+
1958+ -- Bring variables in instance head into scope
1959+ ist <- getIState
1960+ let headVars = mapMaybe (\p -> case p of
1961+ PRef _ n ->
1962+ case lookupTy n (tt_ctxt ist) of
1963+ [] -> Just n
1964+ _ -> Nothing
1965+ _ -> Nothing) ps
1966+-- let lhs = PRef fc iname
1967+ let lhs = PApp fc (PRef fc iname)
1968+ (map (\n -> pimp n (PRef fc n) True) headVars)
19511969 let rhs = PApp fc (PRef fc (instanceName ci))
19521970 (map (pexp . mkMethApp) mtys)
1971+
1972+ logLvl 5 $ "Instance LHS " ++ show lhs
1973+ logLvl 5 $ "Instance RHS " ++ show rhs
1974+
19531975 let idecls = [PClauses fc [Dictionary] iname
19541976 [PClause fc iname lhs [] rhs wb]]
19551977 iLOG (show idecls)
@@ -2031,7 +2053,7 @@ elabInstance info syn what fc cs n ps t expn ds = do
20312053
20322054 getWParams [] = return []
20332055 getWParams (p : ps)
2034− | PRef _ n <- getTm p
2056+ | PRef _ n <- p
20352057 = do ps' <- getWParams ps
20362058 ctxt <- getContext
20372059 case lookupP n ctxt of
@@ -2042,7 +2064,7 @@ elabInstance info syn what fc cs n ps t expn ds = do
20422064 decorate ns iname (UN n) = NS (SN (MethodN (UN n))) ns
20432065 decorate ns iname (NS (UN n) s) = NS (SN (MethodN (UN n))) ns
20442066
2045− mkTyDecl (n, op, t, _) = PTy "" [] syn fc op n t
2067+ mkTyDecl (n, op, t, _) = PTy emptyDocstring [] syn fc op n t
20462068
20472069 conbind (ty : ns) x = PPi constraint (sMN 0 "class") ty (conbind ns x)
20482070 conbind [] x = x
@@ -2289,7 +2311,7 @@ inferredDiff fc inf user =
22892311-- | Check a PTerm against documentation and ensure that every documented
22902312-- argument actually exists. This must be run _after_ implicits have been
22912313-- found, or it will give spurious errors.
2292−checkDocs :: FC -> [(Name, String)] -> PTerm -> Idris ()
2314+checkDocs :: FC -> [(Name, Docstring)] -> PTerm -> Idris ()
22932315checkDocs fc args tm = cd (Map.fromList args) tm
22942316 where cd as (PPi _ n _ sc) = cd (Map.delete n as) sc
22952317 cd as _ | Map.null as = return ()