Skip to content

Commit a8e76ac

Browse files
Factor out derivesFromJavaEnum to SymUtils
1 parent cf29962 commit a8e76ac

File tree

3 files changed

+11
-12
lines changed

3 files changed

+11
-12
lines changed

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -703,7 +703,7 @@ class DottyBackendInterface(outputDirectory: AbstractFile, val superCallsMap: Ma
703703
def shouldEmitForwarders: Boolean =
704704
(sym is Flags.Module) && sym.isStatic
705705
def isJavaEntryPoint: Boolean = CollectEntryPoints.isJavaEntryPoint(sym)
706-
def isJavaEnum = sym.is(Flags.Enum, butNot = Flags.Case) && sym.info.parents.exists(p => p.typeSymbol == defn.JavaEnumClass)
706+
def isJavaEnum = sym.derivesFromJavaEnum
707707

708708
def isClassConstructor: Boolean = toDenot(sym).isClassConstructor
709709
def isSerializable: Boolean = toDenot(sym).isSerializable

compiler/src/dotty/tools/dotc/transform/CompleteJavaEnums.scala

+6-11
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import Constants._
1313
import Decorators._
1414
import DenotTransformers._
1515
import dotty.tools.dotc.ast.Trees._
16+
import SymUtils._
1617

1718
object CompleteJavaEnums {
1819
val name: String = "completeJavaEnums"
@@ -37,16 +38,10 @@ class CompleteJavaEnums extends MiniPhase with InfoTransformer { thisPhase =>
3738
def transformInfo(tp: Type, sym: Symbol)(implicit ctx: Context): Type =
3839
if (sym.isConstructor && (
3940
sym == defn.JavaEnumClass.primaryConstructor ||
40-
derivesFromJavaEnum(sym.owner)))
41+
sym.owner.derivesFromJavaEnum))
4142
addConstrParams(sym.info)
4243
else tp
4344

44-
/** Is `sym` a Scala enum class that derives (directly) from `java.lang.Enum`?
45-
*/
46-
private def derivesFromJavaEnum(sym: Symbol)(implicit ctx: Context) =
47-
sym.is(Enum, butNot = Case) &&
48-
sym.info.parents.exists(p => p.typeSymbol == defn.JavaEnumClass)
49-
5045
/** Add constructor parameters `$name: String` and `$ordinal: Int` to the end of
5146
* the last parameter list of (method- or poly-) type `tp`.
5247
*/
@@ -101,10 +96,10 @@ class CompleteJavaEnums extends MiniPhase with InfoTransformer { thisPhase =>
10196
*/
10297
override def transformDefDef(tree: DefDef)(implicit ctx: Context): DefDef = {
10398
val sym = tree.symbol
104-
if (sym.isConstructor && derivesFromJavaEnum(sym.owner))
99+
if (sym.isConstructor && sym.owner.derivesFromJavaEnum)
105100
cpy.DefDef(tree)(
106101
vparamss = tree.vparamss.init :+ (tree.vparamss.last ++ addedParams(sym, Param)))
107-
else if (sym.name == nme.DOLLAR_NEW && derivesFromJavaEnum(sym.owner.linkedClass)) {
102+
else if (sym.name == nme.DOLLAR_NEW && sym.owner.linkedClass.derivesFromJavaEnum) {
108103
val Block((tdef @ TypeDef(tpnme.ANON_CLASS, templ: Template)) :: Nil, call) = tree.rhs
109104
val args = tree.vparamss.last.takeRight(2).map(param => ref(param.symbol)).reverse
110105
val templ1 = cpy.Template(templ)(
@@ -137,15 +132,15 @@ class CompleteJavaEnums extends MiniPhase with InfoTransformer { thisPhase =>
137132
*/
138133
override def transformTemplate(templ: Template)(implicit ctx: Context): Template = {
139134
val cls = templ.symbol.owner
140-
if (derivesFromJavaEnum(cls)) {
135+
if (cls.derivesFromJavaEnum) {
141136
val (params, rest) = decomposeTemplateBody(templ.body)
142137
val addedDefs = addedParams(cls, ParamAccessor)
143138
val addedSyms = addedDefs.map(_.symbol.entered)
144139
cpy.Template(templ)(
145140
parents = addEnumConstrArgs(defn.JavaEnumClass, templ.parents, addedSyms.map(ref)),
146141
body = params ++ addedDefs ++ rest)
147142
}
148-
else if (cls.isAnonymousClass && cls.owner.is(EnumCase) && derivesFromJavaEnum(cls.owner.owner.linkedClass)) {
143+
else if (cls.isAnonymousClass && cls.owner.is(EnumCase) && cls.owner.owner.linkedClass.derivesFromJavaEnum) {
149144
def rhsOf(name: TermName) =
150145
templ.body.collect {
151146
case mdef: DefDef if mdef.name == name => mdef.rhs

compiler/src/dotty/tools/dotc/transform/SymUtils.scala

+4
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,10 @@ class SymUtils(val self: Symbol) extends AnyVal {
6767
def isParamOrAccessor(implicit ctx: Context): Boolean =
6868
self.is(Param) || self.is(ParamAccessor)
6969

70+
def derivesFromJavaEnum(implicit ctx: Context) =
71+
self.is(Enum, butNot = Case) &&
72+
self.info.parents.exists(p => p.typeSymbol == defn.JavaEnumClass)
73+
7074
/** Is this a case class for which a product mirror is generated?
7175
* Excluded are value classes, abstract classes and case classes with more than one
7276
* parameter section.

0 commit comments

Comments
 (0)