0 | module TTImp.Elab.Lazy
7 | import Idris.REPL.Opts
10 | import TTImp.Elab.Check
11 | import TTImp.Elab.Delayed
17 | checkDelayed : {vars : _} ->
18 | {auto c : Ref Ctxt Defs} ->
19 | {auto m : Ref MD Metadata} ->
20 | {auto u : Ref UST UState} ->
21 | {auto e : Ref EST (EState vars)} ->
22 | {auto s : Ref Syn SyntaxInfo} ->
23 | {auto o : Ref ROpts REPLOpts} ->
24 | RigCount -> ElabInfo ->
25 | NestedNames vars -> Env Term vars ->
26 | FC -> LazyReason -> RawImp -> Maybe (Glued vars) ->
27 | Core (Term vars, Glued vars)
28 | checkDelayed rig elabinfo nest env fc r tm exp
30 | (tm', gty) <- check rig elabinfo nest env tm (Just (gType fc u))
31 | pure (TDelayed fc r tm', gty)
34 | checkDelay : {vars : _} ->
35 | {auto c : Ref Ctxt Defs} ->
36 | {auto m : Ref MD Metadata} ->
37 | {auto u : Ref UST UState} ->
38 | {auto e : Ref EST (EState vars)} ->
39 | {auto s : Ref Syn SyntaxInfo} ->
40 | {auto o : Ref ROpts REPLOpts} ->
41 | RigCount -> ElabInfo ->
42 | NestedNames vars -> Env Term vars ->
43 | FC -> RawImp -> Maybe (Glued vars) ->
44 | Core (Term vars, Glued vars)
45 | checkDelay rig elabinfo nest env fc tm mexpected
46 | = do expected <- maybe (do nm <- genName "delayTy"
48 | ty <- metaVar fc erased env nm (TType fc u)
51 | let solvemode = case elabMode elabinfo of
54 | solveConstraints solvemode Normal
57 | delayOnFailure fc rig env (Just expected) delayError LazyDelay
59 | case !(getNF expected) of
60 | NDelayed _ r expnf =>
62 | (tm', gty) <- check rig elabinfo nest env tm
63 | (Just (glueBack defs env expnf))
66 | pure (TDelay fc r ty tm',
67 | glueBack defs env (NDelayed fc r tynf))
68 | ty => do logNF "elab.delay" 5 "Expected delay type" env ty
69 | throw (GenericMsg fc ("Can't infer delay type")))
71 | delayError : Error -> Bool
72 | delayError (GenericMsg {}) = True
73 | delayError _ = False
76 | checkForce : {vars : _} ->
77 | {auto c : Ref Ctxt Defs} ->
78 | {auto m : Ref MD Metadata} ->
79 | {auto u : Ref UST UState} ->
80 | {auto e : Ref EST (EState vars)} ->
81 | {auto s : Ref Syn SyntaxInfo} ->
82 | {auto o : Ref ROpts REPLOpts} ->
83 | RigCount -> ElabInfo ->
84 | NestedNames vars -> Env Term vars ->
85 | FC -> RawImp -> Maybe (Glued vars) ->
86 | Core (Term vars, Glued vars)
87 | checkForce rig elabinfo nest env fc tm exp
88 | = do defs <- get Ctxt
89 | expf <- maybe (pure Nothing)
90 | (\gty => do tynf <- getNF gty
91 | pure (Just (glueBack defs env
92 | (NDelayed fc LUnknown tynf))))
94 | (tm', gty) <- check rig elabinfo nest env tm expf
97 | NDelayed _ r expnf =>
98 | pure (TForce fc r tm', glueBack defs env expnf)
99 | _ => throw (GenericMsg fc "Forcing a non-delayed type")