@@ -1046,20 +1046,26 @@ trait Checking {
1046
1046
ctx.error(em " $what $msg" , posd.sourcePos)
1047
1047
}
1048
1048
1049
- /** Check that all case classes that extend `scala.Enum` are `enum` cases */
1049
+ /** 1. Check that all case classes that extend `scala.Enum` are `enum` cases
1050
+ * 2. Check that case class `enum` cases do not extend java.lang.Enum.
1051
+ */
1050
1052
def checkEnum (cdef : untpd.TypeDef , cls : Symbol , firstParent : Symbol )(implicit ctx : Context ): Unit = {
1051
1053
import untpd .modsDeco
1052
1054
def isEnumAnonCls =
1053
1055
cls.isAnonymousClass &&
1054
1056
cls.owner.isTerm &&
1055
1057
(cls.owner.flagsUNSAFE.is(Case ) || cls.owner.name == nme.DOLLAR_NEW )
1056
- if (! cdef.mods.isEnumCase && ! isEnumAnonCls) {
1057
- // Since enums are classes and Namer checks that classes don't extend multiple classes, we only check the class
1058
- // parent.
1059
- //
1060
- // Unlike firstParent.derivesFrom(defn.EnumClass), this test allows inheriting from `Enum` by hand;
1061
- // see enum-List-control.scala.
1062
- if (cls.is(Case ) || firstParent.is(Enum ))
1058
+ if (! isEnumAnonCls) {
1059
+ if (cdef.mods.isEnumCase) {
1060
+ if (cls.derivesFrom(defn.JavaEnumClass ))
1061
+ ctx.error(em " paramerized case is not allowed in an enum that extends java.lang.Enum " , cdef.sourcePos)
1062
+ }
1063
+ else if (cls.is(Case ) || firstParent.is(Enum ))
1064
+ // Since enums are classes and Namer checks that classes don't extend multiple classes, we only check the class
1065
+ // parent.
1066
+ //
1067
+ // Unlike firstParent.derivesFrom(defn.EnumClass), this test allows inheriting from `Enum` by hand;
1068
+ // see enum-List-control.scala.
1063
1069
ctx.error(ClassCannotExtendEnum (cls, firstParent), cdef.sourcePos)
1064
1070
}
1065
1071
}
0 commit comments