@@ -22,26 +22,55 @@ def Kernel.Environment.addDecl (env : Environment) (opts : Options) (decl : Decl
22
22
else
23
23
addDeclCore env (Core.getMaxHeartbeats opts).toUSize decl cancelTk?
24
24
25
- def Environment.addDecl (env : Environment) (opts : Options) (decl : Declaration)
25
+ private def Environment.addDeclAux (env : Environment) (opts : Options) (decl : Declaration)
26
26
(cancelTk? : Option IO.CancelToken := none) : Except Kernel.Exception Environment :=
27
27
if debug.skipKernelTC.get opts then
28
28
addDeclWithoutChecking env decl
29
29
else
30
30
addDeclCore env (Core.getMaxHeartbeats opts).toUSize decl cancelTk?
31
31
32
+ @[deprecated "use `Lean.addDecl` instead to ensure new namespaces are registered" (since := "2024-12-03")]
33
+ def Environment.addDecl (env : Environment) (opts : Options) (decl : Declaration)
34
+ (cancelTk? : Option IO.CancelToken := none) : Except Kernel.Exception Environment :=
35
+ Environment.addDeclAux env opts decl cancelTk?
36
+
37
+ @[deprecated "use `Lean.addAndCompile` instead to ensure new namespaces are registered" (since := "2024-12-03")]
32
38
def Environment.addAndCompile (env : Environment) (opts : Options) (decl : Declaration)
33
39
(cancelTk? : Option IO.CancelToken := none) : Except Kernel.Exception Environment := do
34
- let env ← addDecl env opts decl cancelTk?
40
+ let env ← addDeclAux env opts decl cancelTk?
35
41
compileDecl env opts decl
36
42
43
+ private def isNamespaceName : Name → Bool
44
+ | .str .anonymous _ => true
45
+ | .str p _ => isNamespaceName p
46
+ | _ => false
47
+
48
+ private def registerNamePrefixes (env : Environment) (name : Name) : Environment :=
49
+ match name with
50
+ | .str _ s =>
51
+ if s.get 0 == '_' then
52
+ -- Do not register namespaces that only contain internal declarations.
53
+ env
54
+ else
55
+ go env name
56
+ | _ => env
57
+ where go env
58
+ | .str p _ => if isNamespaceName p then go (env.registerNamespace p) p else env
59
+ | _ => env
60
+
37
61
def addDecl (decl : Declaration) : CoreM Unit := do
38
62
profileitM Exception "type checking" (← getOptions) do
39
- withTraceNode `Kernel (fun _ => return m!"typechecking declaration" ) do
63
+ let mut env ← withTraceNode `Kernel (fun _ => return m!"typechecking declaration" ) do
40
64
if !(← MonadLog.hasErrors) && decl.hasSorry then
41
65
logWarning "declaration uses 'sorry'"
42
- match (← getEnv).addDecl (← getOptions) decl (← read).cancelTk? with
43
- | .ok env => setEnv env
44
- | .error ex => throwKernelException ex
66
+ (← getEnv).addDeclAux (← getOptions) decl (← read).cancelTk? |> ofExceptKernelException
67
+
68
+ -- register namespaces for newly added constants; this used to be done by the kernel itself
69
+ -- but that is incompatible with moving it to a separate task
70
+ env := decl.getNames.foldl registerNamePrefixes env
71
+ if let .inductDecl _ _ types _ := decl then
72
+ env := types.foldl (registerNamePrefixes · <| ·.name ++ `rec) env
73
+ setEnv env
45
74
46
75
def addAndCompile (decl : Declaration) : CoreM Unit := do
47
76
addDecl decl
0 commit comments