Skip to content

Commit e29c323

Browse files
committed
fix: lake: whitelist loaded config olean env exts
1 parent ed1a98d commit e29c323

File tree

3 files changed

+68
-11
lines changed

3 files changed

+68
-11
lines changed

src/lake/Lake/Load/Elab.lean

+39-9
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Authors: Mac Malone
55
-/
66
import Lean.Elab.Frontend
77
import Lake.DSL.Extensions
8+
import Lake.DSL.Attributes
89
import Lake.Load.Config
910
import Lake.Build.Trace
1011
import Lake.Util.Platform
@@ -96,21 +97,50 @@ def importConfigFileCore (olean : FilePath) (leanOpts : Options) : IO Environmen
9697
`Environment` is very small.
9798
-/
9899
let (mod, _) ← readModuleData olean
99-
let mut env ← importModulesUsingCache mod.imports leanOpts 1024
100+
let env ← importModulesUsingCache mod.imports leanOpts 1024
100101
-- 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
102103
/-
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.
106112
-/
107113
let extDescrs ← persistentEnvExtensionsRef.get
108114
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
113122
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
114144

115145
instance : ToJson Hash := ⟨(toJson ·.val)⟩
116146
instance : FromJson Hash := ⟨((⟨·⟩) <$> fromJson? ·)⟩

src/lake/tests/meta/lakefile.lean

+11
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,14 @@ meta if get_config? env = some "foo" then do
1414
else meta if get_config? env = some "bar" then do
1515
#print "bar"
1616
#print "2"
17+
18+
script print_env do
19+
IO.eprintln <| get_config? env |>.getD "none"
20+
return 0
21+
22+
elab "elab_str" : term => do
23+
return Lean.toExpr "elabbed-string"
24+
25+
script print_elab do
26+
IO.eprintln elab_str
27+
return 0

src/lake/tests/meta/test.sh

+18-2
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,25 @@ set -exo pipefail
33

44
LAKE=${LAKE:-../../.lake/build/bin/lake}
55

6-
$LAKE resolve-deps -R 2>&1
7-
$LAKE resolve-deps -R 2>&1 | grep "impure"
6+
./clean.sh
7+
8+
# ---
9+
# This test covers the use of meta programming utilities in Lean files
10+
# ---
11+
12+
# Test `run_io`
13+
$LAKE resolve-deps -R 2>&1 | grep impure
14+
$LAKE resolve-deps 2>&1 | (grep impure && false || true)
15+
16+
# Test `meta if` and command `do`
817
$LAKE resolve-deps -R 2>&1 | (grep -E "foo|bar|baz|1|2" && false || true)
918
$LAKE resolve-deps -R -Kbaz 2>&1 | grep baz
1019
$LAKE resolve-deps -R -Kenv=foo 2>&1 | grep foo
20+
$LAKE run print_env 2>&1 | grep foo
1121
$LAKE resolve-deps -R -Kenv=bar 2>&1 | grep bar
22+
$LAKE run print_env 2>&1 | grep bar
23+
24+
# Test environment extension filtering
25+
# https://github.com/leanprover/lean4/issues/2632
26+
27+
$LAKE run print_elab 2>&1 | grep elabbed-string

0 commit comments

Comments
 (0)