@@ -5,6 +5,7 @@ Authors: Mac Malone
5
5
-/
6
6
import Lean.Elab.Frontend
7
7
import Lake.DSL.Extensions
8
+ import Lake.DSL.Attributes
8
9
import Lake.Load.Config
9
10
import Lake.Build.Trace
10
11
import Lake.Util.Platform
@@ -96,21 +97,50 @@ def importConfigFileCore (olean : FilePath) (leanOpts : Options) : IO Environmen
96
97
`Environment` is very small.
97
98
-/
98
99
let (mod, _) ← readModuleData olean
99
- let mut env ← importModulesUsingCache mod.imports leanOpts 1024
100
+ let env ← importModulesUsingCache mod.imports leanOpts 1024
100
101
-- Apply constants (does not go through the kernel, so order is irrelevant)
101
- env := mod.constants.foldl addToEnv env
102
+ let env := mod.constants.foldl addToEnv env
102
103
/-
103
- Apply extension entries (`PersistentEnvExtension.addEntryFn` is pure and
104
- does not have access to the whole environment, so no dependency worries
105
- here either)
104
+ Below, we pass module environment extension entries to
105
+ `PersistentEnvExtension.addEntryFn` - but for an extension of
106
+ non-erased type `PersistentEnvExtension α β σ`, the former are of type
107
+ `α` while `addEntryFn` expects `β`s (the type-erased
108
+ `persistentEnvExtensionsRef` ought to be `unsafe` to prevent this from
109
+ simply compiling but it isn't right now). Fortunately, all extensions
110
+ relevant for workspace loading, which we filter for here, have `α = β`;
111
+ entries for any other extensions can safely be ignored.
106
112
-/
107
113
let extDescrs ← persistentEnvExtensionsRef.get
108
114
let extNameIdx ← mkExtNameMap 0
109
- for (extName, ents) in mod.entries do
110
- if let some entryIdx := extNameIdx.find? extName then
111
- for ent in ents do
112
- env := extDescrs[entryIdx]!.addEntry env ent
115
+ let env := mod.entries.foldl (init := env) fun env (extName, ents) =>
116
+ if lakeExts.contains extName then
117
+ match extNameIdx.find? extName with
118
+ | some entryIdx => ents.foldl extDescrs[entryIdx]!.addEntry env
119
+ | none => env
120
+ else
121
+ env
113
122
return env
123
+ where
124
+ lakeExts :=
125
+ NameSet.empty
126
+ -- Lake Persistent Extensions
127
+ |>.insert ``packageAttr
128
+ |>.insert ``packageDepAttr
129
+ |>.insert ``postUpdateAttr
130
+ |>.insert ``scriptAttr
131
+ |>.insert ``defaultScriptAttr
132
+ |>.insert ``leanLibAttr
133
+ |>.insert ``leanExeAttr
134
+ |>.insert ``externLibAttr
135
+ |>.insert ``targetAttr
136
+ |>.insert ``defaultTargetAttr
137
+ |>.insert ``moduleFacetAttr
138
+ |>.insert ``packageFacetAttr
139
+ |>.insert ``libraryFacetAttr
140
+ -- Docstring Extension (e.g., for scripts)
141
+ |>.insert `Lean.docStringExt
142
+ -- IR Extension (for constant evaluation)
143
+ |>.insert ``IR.declMapExt
114
144
115
145
instance : ToJson Hash := ⟨(toJson ·.val)⟩
116
146
instance : FromJson Hash := ⟨((⟨·⟩) <$> fromJson? ·)⟩
0 commit comments