mirror of
https://github.com/AdaCore/langkit.git
synced 2026-02-12 12:28:12 -08:00
RA22-015: Fix enum class subclasses scoping
This commit is contained in:
@@ -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
|
||||
)))
|
||||
)
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -652,3 +652,26 @@ Expr <NumLit test.lkt:103:40-103:42>
|
||||
Expr <CallExpr test.lkt:103:16-103:43>
|
||||
has type <StructDecl "Int" __prelude:1:10-1:23>
|
||||
|
||||
Id <RefId "EnClass" test.lkt:110:21-110:28>
|
||||
references <EnumClassDecl "EnClass" test.lkt:108:1-108:56>
|
||||
|
||||
Id <RefId "SubclassB" test.lkt:110:29-110:38>
|
||||
references <EnumClassAltDecl "SubclassB" test.lkt:108:32-108:41>
|
||||
|
||||
Id <RefId "EnClass" test.lkt:110:41-110:48>
|
||||
references <EnumClassDecl "EnClass" test.lkt:108:1-108:56>
|
||||
|
||||
Id <RefId "SubclassB" test.lkt:110:49-110:58>
|
||||
references <EnumClassAltDecl "SubclassB" test.lkt:108:32-108:41>
|
||||
|
||||
Expr <CallExpr test.lkt:110:41-110:60>
|
||||
has type <EnumClassAltDecl "SubclassB" test.lkt:108:32-108:41>
|
||||
|
||||
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()
|
||||
| ^^^^^^^^^
|
||||
|
||||
|
||||
Reference in New Issue
Block a user