Skip to content

Commit fa8aef9

Browse files
committed
Fix enum lookup through shadowed envs
1 parent 366ee92 commit fa8aef9

2 files changed

Lines changed: 36 additions & 7 deletions

File tree

vibes/enum_test.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,32 @@ end
173173
}
174174
}
175175

176+
func TestLookupEnumInEnvSkipsNonEnumShadowBindings(t *testing.T) {
177+
enumDef, err := compileEnumDef(&EnumStmt{
178+
Name: "Status",
179+
Members: []EnumMemberStmt{
180+
{Name: "Draft"},
181+
},
182+
})
183+
if err != nil {
184+
t.Fatalf("compile enum: %v", err)
185+
}
186+
187+
root := newEnv(nil)
188+
root.Define("Status", NewEnum(enumDef))
189+
190+
shadow := newEnv(root)
191+
shadow.Define("Status", NewString("shadow"))
192+
193+
got, ok := lookupEnumInEnv(shadow, "Status")
194+
if !ok {
195+
t.Fatalf("expected lookup to resolve parent enum")
196+
}
197+
if got != enumDef {
198+
t.Fatalf("expected parent enum def, got %#v", got)
199+
}
200+
}
201+
176202
func TestEnumModuleExportsAndTypedCalls(t *testing.T) {
177203
engine := moduleTestEngine(t)
178204
script := compileScriptWithEngine(t, engine, `def run()

vibes/execution_types_normalize.go

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -273,14 +273,17 @@ func resolveEnumType(ty *TypeExpr, ctx typeContext) (*EnumDef, error) {
273273
}
274274

275275
func lookupEnumInEnv(env *Env, name string) (*EnumDef, bool) {
276-
if env == nil {
277-
return nil, false
278-
}
279-
val, ok := env.Get(name)
280-
if !ok || val.Kind() != KindEnum {
281-
return nil, false
276+
for scope := env; scope != nil; scope = scope.parent {
277+
val, ok := scope.values[name]
278+
if !ok {
279+
continue
280+
}
281+
if val.Kind() != KindEnum {
282+
continue
283+
}
284+
return val.Enum(), true
282285
}
283-
return val.Enum(), true
286+
return nil, false
284287
}
285288

286289
func errorAsTypeMismatch(err error, target **typeMismatchError) bool {

0 commit comments

Comments
 (0)