@@ -13,6 +13,7 @@ import Constants._
13
13
import Decorators ._
14
14
import DenotTransformers ._
15
15
import dotty .tools .dotc .ast .Trees ._
16
+ import SymUtils ._
16
17
17
18
object CompleteJavaEnums {
18
19
val name : String = " completeJavaEnums"
@@ -37,16 +38,10 @@ class CompleteJavaEnums extends MiniPhase with InfoTransformer { thisPhase =>
37
38
def transformInfo (tp : Type , sym : Symbol )(implicit ctx : Context ): Type =
38
39
if (sym.isConstructor && (
39
40
sym == defn.JavaEnumClass .primaryConstructor ||
40
- derivesFromJavaEnum( sym.owner) ))
41
+ sym.owner.derivesFromJavaEnum ))
41
42
addConstrParams(sym.info)
42
43
else tp
43
44
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
-
50
45
/** Add constructor parameters `$name: String` and `$ordinal: Int` to the end of
51
46
* the last parameter list of (method- or poly-) type `tp`.
52
47
*/
@@ -101,10 +96,10 @@ class CompleteJavaEnums extends MiniPhase with InfoTransformer { thisPhase =>
101
96
*/
102
97
override def transformDefDef (tree : DefDef )(implicit ctx : Context ): DefDef = {
103
98
val sym = tree.symbol
104
- if (sym.isConstructor && derivesFromJavaEnum( sym.owner) )
99
+ if (sym.isConstructor && sym.owner.derivesFromJavaEnum )
105
100
cpy.DefDef (tree)(
106
101
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 ) {
108
103
val Block ((tdef @ TypeDef (tpnme.ANON_CLASS , templ : Template )) :: Nil , call) = tree.rhs
109
104
val args = tree.vparamss.last.takeRight(2 ).map(param => ref(param.symbol)).reverse
110
105
val templ1 = cpy.Template (templ)(
@@ -137,15 +132,15 @@ class CompleteJavaEnums extends MiniPhase with InfoTransformer { thisPhase =>
137
132
*/
138
133
override def transformTemplate (templ : Template )(implicit ctx : Context ): Template = {
139
134
val cls = templ.symbol.owner
140
- if (derivesFromJavaEnum( cls) ) {
135
+ if (cls.derivesFromJavaEnum ) {
141
136
val (params, rest) = decomposeTemplateBody(templ.body)
142
137
val addedDefs = addedParams(cls, ParamAccessor )
143
138
val addedSyms = addedDefs.map(_.symbol.entered)
144
139
cpy.Template (templ)(
145
140
parents = addEnumConstrArgs(defn.JavaEnumClass , templ.parents, addedSyms.map(ref)),
146
141
body = params ++ addedDefs ++ rest)
147
142
}
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 ) {
149
144
def rhsOf (name : TermName ) =
150
145
templ.body.collect {
151
146
case mdef : DefDef if mdef.name == name => mdef.rhs
0 commit comments