Skip to content

Commit 4d39ba2

Browse files
esarbeallanrenucci
authored andcommitted
Error message for enum case in non-enum class companion object (#3197)
1 parent b8d1e41 commit 4d39ba2

File tree

4 files changed

+26
-2
lines changed

4 files changed

+26
-2
lines changed

compiler/src/dotty/tools/dotc/ast/DesugarEnums.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import core._
66
import util.Positions._, Types._, Contexts._, Constants._, Names._, NameOps._, Flags._
77
import SymDenotations._, Symbols._, StdNames._, Annotations._, Trees._
88
import Decorators._
9+
import reporting.diagnostic.messages.EnumCaseDefinitionInNonEnumOwner
910
import collection.mutable.ListBuffer
1011
import util.Property
1112
import typer.ErrorReporting._
@@ -32,7 +33,7 @@ object DesugarEnums {
3233
/** Is enum case `tree` situated in a companion object of an enum class? */
3334
def enumCaseIsLegal(tree: Tree)(implicit ctx: Context): Boolean = (
3435
ctx.owner.is(ModuleClass) && enumClass.derivesFrom(defn.EnumClass)
35-
|| { ctx.error(em"case not allowed here, since owner ${ctx.owner} is not an `enum' object", tree.pos)
36+
|| { ctx.error(EnumCaseDefinitionInNonEnumOwner(ctx.owner), tree.pos)
3637
false
3738
}
3839
)

compiler/src/dotty/tools/dotc/reporting/diagnostic/ErrorMessageID.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ public enum ErrorMessageID {
101101
ReturnOutsideMethodDefinitionID,
102102
UncheckedTypePatternID,
103103
ExtendFinalClassID,
104+
EnumCaseDefinitionInNonEnumOwnerID,
104105
;
105106

106107
public int errorNumber() {

compiler/src/dotty/tools/dotc/reporting/diagnostic/messages.scala

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1777,5 +1777,13 @@ object messages {
17771777
val explanation =
17781778
hl"""A class marked with the ${"final"} keyword cannot be extended"""
17791779
}
1780-
1780+
case class EnumCaseDefinitionInNonEnumOwner(owner: Symbol)(implicit ctx: Context)
1781+
extends Message(EnumCaseDefinitionInNonEnumOwnerID) {
1782+
val kind = "Syntax"
1783+
val msg = em"case not allowed here, since owner ${owner} is not an ${"enum"} object"
1784+
val explanation =
1785+
hl"""${"enum"} cases are only allowed within the companion ${"object"} of an ${"enum class"}.
1786+
|If you want to create an ${"enum"} case, make sure the corresponding ${"enum class"} exists
1787+
|and has the ${"enum"} keyword."""
1788+
}
17811789
}

compiler/test/dotty/tools/dotc/reporting/ErrorMessagesTests.scala

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -998,6 +998,7 @@ class ErrorMessagesTests extends ErrorMessagesTest {
998998
val ReturnOutsideMethodDefinition(owner) :: Nil = messages
999999
assertEquals("object A", owner.show)
10001000
}
1001+
10011002
@Test def extendFinalClass = checkMessagesAfter("refchecks") {
10021003
"""final class A
10031004
|
@@ -1010,4 +1011,17 @@ class ErrorMessagesTests extends ErrorMessagesTest {
10101011
assertEquals(extender.show, "class B")
10111012
assertEquals(parent.show, "class A")
10121013
}
1014+
1015+
@Test def enumCaseDefinitionInNonEnumOwner =
1016+
checkMessagesAfter("frontend") {
1017+
"""object Qux {
1018+
| case Foo
1019+
|}
1020+
""".stripMargin
1021+
}.expect { (ictx, messages) =>
1022+
implicit val ctx: Context = ictx
1023+
assertMessageCount(1, messages)
1024+
val EnumCaseDefinitionInNonEnumOwner(owner) :: Nil = messages
1025+
assertEquals("object Qux", owner.show)
1026+
}
10131027
}

0 commit comments

Comments
 (0)