RA22-015: Fix enum class subclasses scoping

This commit is contained in:
Raphaël AMIARD
2020-03-13 15:45:20 +01:00
parent 3b0a7fe6f4
commit 092a3af16c
3 changed files with 36 additions and 3 deletions

View File

@@ -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
)))
)

View File

@@ -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()

View File

@@ -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()
| ^^^^^^^^^