Skip to content

Commit ee5bfed

Browse files
committed
Liberate Enum flag so that it can be used for Scala enums as well.
1 parent 69c7712 commit ee5bfed

File tree

6 files changed

+19
-10
lines changed

6 files changed

+19
-10
lines changed

compiler/src/dotty/tools/backend/jvm/DottyBackendInterface.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ class DottyBackendInterface(outputDirectory: AbstractFile, val superCallsMap: Ma
258258
case t: TypeApply if (t.fun.symbol == Predef_classOf) =>
259259
av.visit(name, t.args.head.tpe.classSymbol.denot.info.toTypeKind(bcodeStore)(innerClasesStore).toASMType)
260260
case t: tpd.Select =>
261-
if (t.symbol.denot.owner.is(Flags.Enum)) {
261+
if (t.symbol.denot.owner.is(Flags.JavaEnum)) {
262262
val edesc = innerClasesStore.typeDescriptor(t.tpe.asInstanceOf[bcodeStore.int.Type]) // the class descriptor of the enumeration class.
263263
val evalue = t.symbol.name.mangledString // value the actual enumeration value.
264264
av.visitEnum(name, edesc, evalue)
@@ -710,7 +710,7 @@ class DottyBackendInterface(outputDirectory: AbstractFile, val superCallsMap: Ma
710710
def isBottomClass: Boolean = (sym ne defn.NullClass) && (sym ne defn.NothingClass)
711711
def isBridge: Boolean = sym is Flags.Bridge
712712
def isArtifact: Boolean = sym is Flags.Artifact
713-
def hasEnumFlag: Boolean = sym is Flags.Enum
713+
def hasEnumFlag: Boolean = sym is Flags.JavaEnum
714714
def hasAccessBoundary: Boolean = sym.accessBoundary(defn.RootClass) ne defn.RootClass
715715
def isVarargsMethod: Boolean = sym is Flags.JavaVarargs
716716
def isDeprecated: Boolean = false

compiler/src/dotty/tools/dotc/core/Flags.scala

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -620,6 +620,15 @@ object Flags {
620620
/** A Java companion object */
621621
final val JavaProtected = allOf(JavaDefined, Protected)
622622

623+
/** A Java enum */
624+
final val JavaEnum = allOf(JavaDefined, Enum)
625+
626+
/** A Java enum trait */
627+
final val JavaEnumTrait = allOf(JavaDefined, Enum)
628+
629+
/** A Java enum value */
630+
final val JavaEnumValue = allOf(Stable, JavaStatic, JavaDefined, Enum)
631+
623632
/** Labeled private[this] */
624633
final val PrivateLocal = allOf(Private, Local)
625634

compiler/src/dotty/tools/dotc/core/classfile/ClassfileParser.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,8 +186,8 @@ class ClassfileParser(
186186
if (isEnum) {
187187
instanceScope.toList.map(_.ensureCompleted())
188188
staticScope.toList.map(_.ensureCompleted())
189-
classRoot.setFlag(Flags.Enum)
190-
moduleRoot.setFlag(Flags.Enum)
189+
classRoot.setFlag(Flags.JavaEnum)
190+
moduleRoot.setFlag(Flags.JavaEnum)
191191
}
192192

193193
result

compiler/src/dotty/tools/dotc/parsing/JavaParsers.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -842,7 +842,7 @@ object JavaParsers {
842842
List(Literal(Constant(null)),Literal(Constant(0))))
843843
val enumclazz = atPos(start, nameOffset) {
844844
TypeDef(name,
845-
makeTemplate(superclazz :: interfaces, body, List(), true)).withMods(mods | Flags.Enum)
845+
makeTemplate(superclazz :: interfaces, body, List(), true)).withMods(mods | Flags.JavaEnum)
846846
}
847847
addCompanionObject(consts ::: statics ::: predefs, enumclazz)
848848
}
@@ -861,7 +861,7 @@ object JavaParsers {
861861
skipAhead()
862862
accept(RBRACE)
863863
}
864-
ValDef(name.toTermName, enumType, unimplementedExpr).withMods(Modifiers(Flags.Enum | Flags.Stable | Flags.JavaDefined | Flags.JavaStatic))
864+
ValDef(name.toTermName, enumType, unimplementedExpr).withMods(Modifiers(Flags.JavaEnum | Flags.Stable | Flags.JavaDefined | Flags.JavaStatic))
865865
}
866866
}
867867

compiler/src/dotty/tools/dotc/transform/patmat/Space.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -460,7 +460,7 @@ class SpaceEngine(implicit ctx: Context) extends SpaceLogic {
460460
)
461461
case tp if tp.isRef(defn.UnitClass) =>
462462
Typ(ConstantType(Constant(())), true) :: Nil
463-
case tp if tp.classSymbol.is(Enum) =>
463+
case tp if tp.classSymbol.is(JavaEnum) =>
464464
children.map(sym => Typ(sym.termRef, true))
465465
case tp =>
466466
val parts = children.map { sym =>
@@ -730,7 +730,7 @@ class SpaceEngine(implicit ctx: Context) extends SpaceLogic {
730730
}) ||
731731
tp.isRef(defn.BooleanClass) ||
732732
tp.isRef(defn.UnitClass) ||
733-
tp.classSymbol.is(allOf(Enum, Sealed)) // Enum value doesn't have Sealed flag
733+
tp.classSymbol.is(JavaEnumTrait)
734734

735735
debug.println(s"decomposable: ${tp.show} = $res")
736736

@@ -874,7 +874,7 @@ class SpaceEngine(implicit ctx: Context) extends SpaceLogic {
874874
isCheckable(and.tp1) || isCheckable(and.tp2)
875875
}) ||
876876
tpw.isRef(defn.BooleanClass) ||
877-
tpw.typeSymbol.is(Enum) ||
877+
tpw.typeSymbol.is(JavaEnum) ||
878878
canDecompose(tpw) ||
879879
(defn.isTupleType(tpw) && tpw.argInfos.exists(isCheckable(_)))
880880
}

compiler/src/dotty/tools/dotc/typer/Namer.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -494,7 +494,7 @@ class Namer { typer: Typer =>
494494
// We don't check for clazz.superClass == JavaEnumClass, because this causes a illegal
495495
// cyclic reference error. See the commit message for details.
496496
// if (ctx.compilationUnit.isJava) ctx.owner.companionClass.is(Enum) else ctx.owner.is(Enum)
497-
vd.mods.is(allOf(Enum, Stable, JavaStatic, JavaDefined)) // && ownerHasEnumFlag
497+
vd.mods.is(JavaEnumValue) // && ownerHasEnumFlag
498498
}
499499

500500
/** Add java enum constants */

0 commit comments

Comments
 (0)