0 | module TTImp.ProcessParams
3 | import Core.UnifyState
6 | import Idris.REPL.Opts
9 | import TTImp.BindImplicits
11 | import TTImp.Elab.Check
16 | extend : {extvs : _} ->
17 | Env Term extvs -> Thin vs extvs ->
18 | NestedNames extvs ->
20 | (
vars' ** (Thin vs vars', Env Term vars', NestedNames vars'))
21 | extend env p nest (Bind _ n b@(Pi fc c pi ty) sc)
22 | = extend (b :: env) (Drop p) (weaken nest) sc
23 | extend env p nest tm = (
_ ** (p, env, nest))
26 | processParams : {vars : _} ->
27 | {auto c : Ref Ctxt Defs} ->
28 | {auto m : Ref MD Metadata} ->
29 | {auto u : Ref UST UState} ->
30 | {auto s : Ref Syn SyntaxInfo} ->
31 | {auto o : Ref ROpts REPLOpts} ->
34 | FC -> List ImpParameter -> List ImpDecl ->
36 | processParams {vars} {c} {m} {u} nest env fc ps ds
40 | let pty_raw = mkParamTy ps
41 | pty_imp <- bindTypeNames fc [] (toList vars) (IBindHere fc (PI erased) pty_raw)
42 | log "declare.param" 10 $
"Checking " ++ show pty_imp
44 | pty <- checkTerm (-
1) InType []
45 | nest env pty_imp (gType fc u)
46 | let (
vs ** (prf, env', nest'))
= extend env Refl nest pty
47 | logEnv "declare.param" 5 "Param env" env'
52 | let defNames = definedInBlock (currentNS defs) ds
53 | names' <- traverse (applyEnv env') defNames
54 | let nestBlock = { names $= (names' ++) } nest'
55 | traverse_ (processDecl [] nestBlock env') ds
57 | mkParamTy : List ImpParameter -> RawImp
58 | mkParamTy [] = IType fc
59 | mkParamTy (binder :: ps)
60 | = IPi fc binder.rig binder.val.info (Just binder.name.val) binder.val.boundType (mkParamTy ps)
62 | applyEnv : {vs : _} ->
63 | Env Term vs -> Name ->
64 | Core (Name, (Maybe Name, List (Var vs), FC -> NameType -> Term vs))
66 | = do n' <- resolveName n
67 | pure (Resolved n', (Nothing, reverse (allVars env),
68 | \fc, nt => applyToFull fc
69 | (Ref fc nt (Resolved n')) env))