Skip to content

Commit c5d0762

Browse files
committed
bugfix: Don't allow open for enum cases
Follow up from scala/scala3#15961
1 parent e06a772 commit c5d0762

File tree

3 files changed

+57
-2
lines changed

3 files changed

+57
-2
lines changed

scalameta/parsers/shared/src/main/scala/scala/meta/internal/parsers/ScalametaParser.scala

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3295,7 +3295,12 @@ class ScalametaParser(input: Input)(implicit dialect: Dialect) { parser =>
32953295
case KwExtension() =>
32963296
extensionGroupDecl(mods)
32973297
case KwCase() if dialect.allowEnums && enumCaseAllowed && ahead(token.is[Ident]) =>
3298-
enumCaseDef(mods)
3298+
mods.find(mod => !mod.isAccessMod && !mod.is[Mod.Annot]) match {
3299+
case Some(mod) =>
3300+
syntaxError("Only access modifiers allowed on enum case", at = mod.pos)
3301+
case None =>
3302+
enumCaseDef(mods)
3303+
}
32993304
case KwCase() if dialect.allowEnums && ahead(token.is[Ident]) =>
33003305
syntaxError("Enum cases are only allowed in enums", at = token.pos)
33013306
case KwIf() if mods.size == 1 && mods.head.is[Mod.Inline] =>

tests/shared/src/test/scala/scala/meta/tests/parsers/ParseSuite.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ class ParseSuite extends TreeSuiteBase with CommonTrees {
8080
)
8181
}
8282
assert(
83-
error.getMessage.contains(expected),
83+
error.getMessage().contains(expected),
8484
s"Expected [${error.getMessage}] to contain [${expected}]."
8585
)
8686
}

tests/shared/src/test/scala/scala/meta/tests/parsers/dotty/EnumSuite.scala

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,56 @@ class EnumSuite extends BaseDottySuite {
2323
)
2424
}
2525

26+
test("enum-private-case") {
27+
runTestAssert[Stat](
28+
"enum Color { private case R; protected case G }",
29+
assertLayout = Some(
30+
"""|enum Color {
31+
| private case R
32+
| protected case G
33+
|}
34+
|""".stripMargin
35+
)
36+
)(
37+
Defn.Enum(
38+
Nil,
39+
Type.Name("Color"),
40+
Nil,
41+
Ctor.Primary(Nil, Name(""), Nil),
42+
Template(
43+
Nil,
44+
Nil,
45+
Self(Name(""), None),
46+
List(
47+
Defn.EnumCase(
48+
List(Mod.Private(Name(""))),
49+
Term.Name("R"),
50+
Nil,
51+
Ctor.Primary(Nil, Name(""), Nil),
52+
Nil
53+
),
54+
Defn.EnumCase(
55+
List(Mod.Protected(Name(""))),
56+
Term.Name("G"),
57+
Nil,
58+
Ctor.Primary(Nil, Name(""), Nil),
59+
Nil
60+
)
61+
),
62+
Nil
63+
)
64+
)
65+
)
66+
}
67+
68+
test("enum-wrong-soft") {
69+
runTestError[Stat](
70+
"""|enum Color:
71+
| open case R, G """.stripMargin,
72+
"error: Only access modifiers allowed on enum case"
73+
)
74+
}
75+
2676
test("enum-parametrized") {
2777
runTestAssert[Stat]("enum C(i: Int) { case R, G }")(
2878
Defn.Enum(Nil, pname("C"), Nil, ctorp(List(tparam("i", "Int"))), tpl(List(RGCase)))

0 commit comments

Comments
 (0)