@@ -80,6 +80,30 @@ elabType info syn doc fc opts n ty' = {- let ty' = piBind (params info) ty_in
80 when corec $ do setAccessibility n Frozen
80 when corec $ do setAccessibility n Frozen
81 addIBC (IBCAccess n Frozen)
81 addIBC (IBCAccess n Frozen)
83+elabPostulate :: ElabInfo -> SyntaxInfo -> String ->
84+ FC -> FnOpts -> Name -> PTerm -> Idris ()
85+elabPostulate info syn doc fc opts n ty
86+ = do elabType info syn doc fc opts n ty
87+ -- make sure it's collapsible, so it is never needed at run time
88+ -- start by getting the elaborated type
90+ fty <- case lookupTy Nothing n ctxt of
91+ [] -> tclift $ tfail $ (At fc (NoTypeDecl n)) -- can't happen!
94+ let (ap, _) = unApply (getRetTy fty)
95+ logLvl 5 $ "Checking collapsibility of " ++ show (ap, fty)
96+ let postOK = case ap of
97+ P _ tn _ -> case lookupCtxt Nothing tn
98+ (idris_optimisation ist) of
99+ [oi] -> collapsible oi
103+ $ tclift $ tfail (At fc (NonCollapsiblePostulate n))
104+ -- remove it from the deferred definitions list
83elabData :: ElabInfo -> SyntaxInfo -> String -> FC -> Bool -> PData -> Idris ()
107elabData :: ElabInfo -> SyntaxInfo -> String -> FC -> Bool -> PData -> Idris ()
84elabData info syn doc fc codata (PLaterdecl n t_in)
108elabData info syn doc fc codata (PLaterdecl n t_in)
85 = do iLOG (show (fc, doc))
109 = do iLOG (show (fc, doc))
@@ -274,120 +298,123 @@ elabClauses :: ElabInfo -> FC -> FnOpts -> Name -> [PClause] -> Idris ()
274elabClauses info fc opts n_in cs = let n = liftname info n_in in
298elabClauses info fc opts n_in cs = let n = liftname info n_in in
275 do ctxt <- getContext
299 do ctxt <- getContext
276 -- Check n actually exists
300 -- Check n actually exists
277− fty <- case lookupTy Nothing n ctxt of
301+ let tys = lookupTy Nothing n ctxt
302+ unless (length tys > 1) $ do
278− [] -> -- TODO: turn into a CAF if there's no arguments
304+ [] -> -- TODO: turn into a CAF if there's no arguments
279− -- question: CAFs in where blocks?
305+ -- question: CAFs in where blocks?
280− tclift $ tfail $ (At fc (NoTypeDecl n))
306+ tclift $ tfail $ At fc (NoTypeDecl n)
281− [ty] -> return ty
307+ [ty] -> return ty
282− pats_in <- mapM (elabClause info (TCGen `elem` opts))
308+ pats_in <- mapM (elabClause info (TCGen `elem` opts))
283− (zip [0..] cs)
309+ (zip [0..] cs)
284− -- if the return type of 'ty' is collapsible, the optimised version should
310+ -- if the return type of 'ty' is collapsible, the optimised version should
285− -- just do nothing
311+ -- just do nothing
286− ist <- get
312+ ist <- get
287− let (ap, _) = unApply (getRetTy fty)
313+ let (ap, _) = unApply (getRetTy fty)
288− logLvl 5 $ "Checking collapsibility of " ++ show (ap, fty)
314+ logLvl 5 $ "Checking collapsibility of " ++ show (ap, fty)
289− -- FIXME: Really ought to only do this for total functions!
315+ -- FIXME: Really ought to only do this for total functions!
290− let doNothing = case ap of
316+ let doNothing = case ap of
291− P _ tn _ -> case lookupCtxt Nothing tn
317+ P _ tn _ -> case lookupCtxt Nothing tn
292− (idris_optimisation ist) of
318+ (idris_optimisation ist) of
293− [oi] -> collapsible oi
319+ [oi] -> collapsible oi
294− _ -> False
320+ _ -> False
295− _ -> False
321+ _ -> False
296− solveDeferred n
322+ solveDeferred n
297− ist <- get
323+ ist <- get
298− when doNothing $
324+ when doNothing $
299− case lookupCtxt Nothing n (idris_optimisation ist) of
325+ case lookupCtxt Nothing n (idris_optimisation ist) of
300− [oi] -> do let opts = addDef n (oi { collapsible = True })
326+ [oi] -> do let opts = addDef n (oi { collapsible = True })
301− (idris_optimisation ist)
327+ (idris_optimisation ist)
302− put (ist { idris_optimisation = opts })
328+ put (ist { idris_optimisation = opts })
303− _ -> do let opts = addDef n (Optimise True [] [])
329+ _ -> do let opts = addDef n (Optimise True [] [])
304− (idris_optimisation ist)
330+ (idris_optimisation ist)
305− put (ist { idris_optimisation = opts })
331+ put (ist { idris_optimisation = opts })
306− addIBC (IBCOpt n)
332+ addIBC (IBCOpt n)
307− ist <- get
333+ ist <- get
308− let pats = pats_in
334+ let pats = pats_in
309−-- logLvl 3 (showSep "\n" (map (\ (l,r) ->
335+ -- logLvl 3 (showSep "\n" (map (\ (l,r) ->
310−-- show l ++ " = " ++
336+ -- show l ++ " = " ++
311−-- show r) pats))
337+ -- show r) pats))
312− let tcase = opt_typecase (idris_options ist)
338+ let tcase = opt_typecase (idris_options ist)
313− let pdef = map debind $ map (simpl False (tt_ctxt ist)) pats
339+ let pdef = map debind $ map (simpl False (tt_ctxt ist)) pats
315− numArgs <- tclift $ sameLength pdef
341+ numArgs <- tclift $ sameLength pdef
317− optpats <- if doNothing
343+ optpats <- if doNothing
318− then return $ [Right (mkApp (P Bound n Erased)
344+ then return $ [Right (mkApp (P Bound n Erased)
319− (take numArgs (repeat Erased)), Erased)]
345+ (take numArgs (repeat Erased)), Erased)]
320− else stripCollapsed pats
346+ else stripCollapsed pats
322− logLvl 5 $ "Patterns:\n" ++ show pats
348+ logLvl 5 $ "Patterns:\n" ++ show pats
324− let optpdef = map debind $ map (simpl True (tt_ctxt ist)) optpats
350+ let optpdef = map debind $ map (simpl True (tt_ctxt ist)) optpats
325− tree@(CaseDef scargs sc _) <- tclift $
351+ tree@(CaseDef scargs sc _) <- tclift $
326− simpleCase tcase False CompileTime fc pdef
352+ simpleCase tcase False CompileTime fc pdef
327− cov <- coverage
353+ cov <- coverage
328− pmissing <-
354+ pmissing <-
330− then do missing <- genClauses fc n (map getLHS pdef) cs
356+ then do missing <- genClauses fc n (map getLHS pdef) cs
331− -- missing <- genMissing n scargs sc
357+ -- missing <- genMissing n scargs sc
332− missing' <- filterM (checkPossible info fc True n) missing
358+ missing' <- filterM (checkPossible info fc True n) missing
333− logLvl 2 $ "Must be unreachable:\n" ++
359+ logLvl 2 $ "Must be unreachable:\n" ++
334− showSep "\n" (map (showImp True) missing') ++
360+ showSep "\n" (map (showImp True) missing') ++
335− "\nAgainst: " ++
361+ "\nAgainst: " ++
336− showSep "\n" (map (\t -> showImp True (delab ist t)) (map getLHS pdef))
362+ showSep "\n" (map (\t -> showImp True (delab ist t)) (map getLHS pdef))
337− return missing'
363+ return missing'
338− else return []
364+ else return []
339− let pcover = null pmissing
365+ let pcover = null pmissing
340− pdef' <- applyOpts optpdef
366+ pdef' <- applyOpts optpdef
341− logLvl 5 $ "Optimised patterns:\n" ++ show pdef'
367+ logLvl 5 $ "Optimised patterns:\n" ++ show pdef'
342− ist <- get
368+ ist <- get
343−-- let wf = wellFounded ist n sc
369+ -- let wf = wellFounded ist n sc
344− let tot = if pcover || AssertTotal `elem` opts
370+ let tot = if pcover || AssertTotal `elem` opts
345− then Unchecked -- finish checking later
371+ then Unchecked -- finish checking later
346− else Partial NotCovering -- already know it's not total
372+ else Partial NotCovering -- already know it's not total
347−-- case lookupCtxt (namespace info) n (idris_flags ist) of
373+ -- case lookupCtxt (namespace info) n (idris_flags ist) of
348−-- [fs] -> if TotalFn `elem` fs
374+ -- [fs] -> if TotalFn `elem` fs
349−-- then case tot of
375+ -- then case tot of
350−-- Total _ -> return ()
376+ -- Total _ -> return ()
351−-- t -> tclift $ tfail (At fc (Msg (show n ++ " is " ++ show t)))
377+ -- t -> tclift $ tfail (At fc (Msg (show n ++ " is " ++ show t)))
352−-- else return ()
378+ -- else return ()
353−-- _ -> return ()
379+ -- _ -> return ()
354− case tree of
380+ case tree of
355− CaseDef _ _ [] -> return ()
381+ CaseDef _ _ [] -> return ()
356− CaseDef _ _ xs -> mapM_ (\x ->
382+ CaseDef _ _ xs -> mapM_ (\x ->
357− iputStrLn $ show fc ++
383+ iputStrLn $ show fc ++
358− ":warning - Unreachable case: " ++
384+ ":warning - Unreachable case: " ++
359− show (delab ist x)) xs
385+ show (delab ist x)) xs
360− let knowncovering = pcover && cov
386+ let knowncovering = pcover && cov
362− tree' <- tclift $ simpleCase tcase knowncovering RunTime fc pdef'
388+ tree' <- tclift $ simpleCase tcase knowncovering RunTime fc pdef'
363− logLvl 3 (show tree)
389+ logLvl 3 (show tree)
364− logLvl 3 $ "Optimised: " ++ show tree'
390+ logLvl 3 $ "Optimised: " ++ show tree'
365− ctxt <- getContext
391+ ctxt <- getContext
366− ist <- get
392+ ist <- get
367− put (ist { idris_patdefs = addDef n pdef' (idris_patdefs ist) })
393+ put (ist { idris_patdefs = addDef n pdef' (idris_patdefs ist) })
368− case lookupTy (namespace info) n ctxt of
394+ case lookupTy (namespace info) n ctxt of
369− [ty] -> do updateContext (addCasedef n (inlinable opts)
395+ [ty] -> do updateContext (addCasedef n (inlinable opts)
370− tcase knowncovering pats
396+ tcase knowncovering pats
371− pdef pdef' ty)
397+ pdef pdef' ty)
372− addIBC (IBCDef n)
398+ addIBC (IBCDef n)
373− setTotality n tot
399+ setTotality n tot
374− totcheck (fc, n)
400+ totcheck (fc, n)
375− when (tot /= Unchecked) $ addIBC (IBCTotal n tot)
401+ when (tot /= Unchecked) $ addIBC (IBCTotal n tot)
376− i <- get
402+ i <- get
377− case lookupDef Nothing n (tt_ctxt i) of
403+ case lookupDef Nothing n (tt_ctxt i) of
378− (CaseOp _ _ _ _ _ scargs sc scargs' sc' : _) ->
404+ (CaseOp _ _ _ _ _ scargs sc scargs' sc' : _) ->
379− do let calls = findCalls sc' scargs'
405+ do let calls = findCalls sc' scargs'
380− let used = findUsedArgs sc' scargs'
406+ let used = findUsedArgs sc' scargs'
381− -- let scg = buildSCG i sc scargs
407+ -- let scg = buildSCG i sc scargs
382− -- add SCG later, when checking totality
408+ -- add SCG later, when checking totality
383− let cg = CGInfo scargs' calls [] used []
409+ let cg = CGInfo scargs' calls [] used []
384− logLvl 2 $ "Called names: " ++ show cg
410+ logLvl 2 $ "Called names: " ++ show cg
385− addToCG n cg
411+ addToCG n cg
386− addToCalledG n (nub (map fst calls)) -- plus names in type!
412+ addToCalledG n (nub (map fst calls)) -- plus names in type!
387− addIBC (IBCCG n)
413+ addIBC (IBCCG n)
388− _ -> return ()
414+ _ -> return ()
389−-- addIBC (IBCTotal n tot)
415+ -- addIBC (IBCTotal n tot)
390− [] -> return ()
416+ [] -> return ()
392 debind (Right (x, y)) = let (vs, x') = depat [] x
419 debind (Right (x, y)) = let (vs, x') = depat [] x
393 (_, y') = depat [] y in
420 (_, y') = depat [] y in
@@ -417,8 +444,16 @@ elabVal info aspat tm_in
418 let tm = addImpl i tm_in
445 let tm = addImpl i tm_in
419 logLvl 10 (showImp True tm)
446 logLvl 10 (showImp True tm)
448+ -- * ordinary elaboration
449+ -- * elaboration as a Set
450+ -- * elaboration as a function a -> b
452+ ((tm', defer, is), _) <-
453+ tctry (elaborate ctxt (MN 0 "val") (Set (UVal 0)) []
454+ (build i info aspat (MN 0 "val") tm))
420− ((tm', defer, is), _) <- tclift $ elaborate ctxt (MN 0 "val") infP []
455+ (elaborate ctxt (MN 0 "val") infP []
421− (build i info aspat (MN 0 "val") (infTerm tm))
456+ (build i info aspat (MN 0 "val") (infTerm tm)))
422 logLvl 3 ("Value: " ++ show tm')
457 logLvl 3 ("Value: " ++ show tm')
423 let vtm = getInferTerm tm'
458 let vtm = getInferTerm tm'
424 logLvl 2 (show vtm)
459 logLvl 2 (show vtm)
@@ -533,8 +568,9 @@ elabClause info tcgen (_, PWith fc fname lhs_in withs wval_in withblock)
534 let lhs = addImpl i lhs_in
569 let lhs = addImpl i lhs_in
535 logLvl 5 ("LHS: " ++ showImp True lhs)
570 logLvl 5 ("LHS: " ++ showImp True lhs)
571+ ((lhs', dlhs, []), _) <-
536− ((lhs', dlhs, []), _) <- tclift $ elaborate ctxt (MN 0 "patLHS") infP []
572+ tclift $ elaborate ctxt (MN 0 "patLHS") infP []
537− (erun fc (buildTC i info True tcgen fname (infTerm lhs)))
573+ (erun fc (buildTC i info True tcgen fname (infTerm lhs)))
538 let lhs_tm = orderPats (getInferTerm lhs')
574 let lhs_tm = orderPats (getInferTerm lhs')
539 let lhs_ty = getInferType lhs'
575 let lhs_ty = getInferType lhs'
540 let ret_ty = getRetTy lhs_ty
576 let ret_ty = getRetTy lhs_ty
@@ -990,6 +1026,10 @@ elabDecl' what info (PTy doc s f o n ty)
990 | what /= EDefns
1026 | what /= EDefns
991 = do iLOG $ "Elaborating type decl " ++ show n ++ show o
1027 = do iLOG $ "Elaborating type decl " ++ show n ++ show o
992 elabType info s doc f o n ty
1028 elabType info s doc f o n ty
1029+elabDecl' what info (PPostulate doc s f o n ty)
1031+ = do iLOG $ "Elaborating postulate " ++ show n ++ show o
1032+ elabPostulate info s doc f o n ty
993elabDecl' what info (PData doc s f co d)
1033elabDecl' what info (PData doc s f co d)
994 | what /= ETypes
1034 | what /= ETypes
995 = do iLOG $ "Elaborating " ++ show (d_name d)
1035 = do iLOG $ "Elaborating " ++ show (d_name d)