diff --git a/contrib/lkt/language/parser.py b/contrib/lkt/language/parser.py index e94364b38..96596dfe4 100644 --- a/contrib/lkt/language/parser.py +++ b/contrib/lkt/language/parser.py @@ -5,7 +5,8 @@ from langkit.dsl import ( Struct, T, UserField, abstract, synthetic ) from langkit.envs import ( - EnvSpec, RefKind, add_env, add_to_env, add_to_env_kv, do, reference + EnvSpec, RefKind, add_env, add_to_env, add_to_env_kv, do, handle_children, + reference ) from langkit.expressions import ( AbstractKind, AbstractProperty, And, CharacterLiteral, Cond, EmptyEnv, @@ -1319,9 +1320,9 @@ class EnumClassDecl(NamedTypeDecl): env_spec = EnvSpec( add_to_env_kv(Entity.name, Self), - add_env(), + handle_children(), add_to_env(Entity.alts.map(lambda alt: new_env_assoc( - key=alt.name, val=alt.node, dest_env=Self.children_env + key=alt.name, val=alt.node, dest_env=Self.decls.children_env ))) ) diff --git a/testsuite/tests/contrib/lkt_semantic/test.lkt b/testsuite/tests/contrib/lkt_semantic/test.lkt index 62cb12095..38b4a3aee 100644 --- a/testsuite/tests/contrib/lkt_semantic/test.lkt +++ b/testsuite/tests/contrib/lkt_semantic/test.lkt @@ -101,3 +101,12 @@ val c : String = a (1) fun test_named_parameters(a: Int): Int = a val ss : Int = test_named_parameters(a=12) + +# Test resolution of enum class subclasses (should be accessible via dot +# notation on the root enum class type). + +enum class EnClass (SubclassA, SubclassB, SubclassC) {} + +val en_class_inst : EnClass.SubclassB = EnClass.SubclassB() +# Test that those classes don't leak +val invalid_en_class : SubclassB = SubclassB() diff --git a/testsuite/tests/contrib/lkt_semantic/test.out b/testsuite/tests/contrib/lkt_semantic/test.out index 818502327..24bc48673 100644 --- a/testsuite/tests/contrib/lkt_semantic/test.out +++ b/testsuite/tests/contrib/lkt_semantic/test.out @@ -652,3 +652,26 @@ Expr Expr has type +Id + references + +Id + references + +Id + references + +Id + references + +Expr + has type + +test.lkt:112:24: error: Cannot find entity 'SubclassB' in this scope +111 | val invalid_en_class : SubclassB = SubclassB() + | ^^^^^^^^^ + +test.lkt:112:36: error: Cannot find entity 'SubclassB' in this scope +111 | val invalid_en_class : SubclassB = SubclassB() + | ^^^^^^^^^ +