Skip to content

Commit 918338c

Browse files
committed
Use forwarders for java interop instead of moving definitions
Moving definitions will make Scala code crash at runtime. See `tests/run/i6664b` for an example.
1 parent 832847f commit 918338c

File tree

1 file changed

+15
-6
lines changed

1 file changed

+15
-6
lines changed

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

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -110,11 +110,19 @@ class CompleteJavaEnums extends MiniPhase with InfoTransformer { thisPhase =>
110110
else tree
111111
}
112112

113-
override def transformValDef(tree: ValDef)(implicit ctx: Context): ValDef = {
114-
val sym = tree.symbol
115-
if ((sym.isAllOf(EnumValue) || sym.name == nme.DOLLAR_VALUES) && sym.owner.linkedClass.derivesFromJavaEnum)
116-
sym.addAnnotation(Annotations.Annotation(defn.ScalaStaticAnnot))
117-
tree
113+
/** Return a list of forwarders for enum values defined in the companion object
114+
* for java interop.
115+
*/
116+
private def addedEnumForwarders(clazz: Symbol)(implicit ctx: Context): List[ValDef] = {
117+
val moduleCls = clazz.companionClass
118+
val moduleRef = ref(clazz.companionModule)
119+
120+
val enums = moduleCls.info.decls.filter(member => member.isTerm && member.isAllOf(EnumValue))
121+
for { enumValue <- enums }
122+
yield {
123+
val fieldSym = ctx.newSymbol(clazz, enumValue.name.asTermName, EnumValue, enumValue.info)
124+
ValDef(fieldSym, moduleRef.select(enumValue))
125+
}
118126
}
119127

120128
/** 1. If this is an enum class, add $name and $ordinal parameters to its
@@ -143,9 +151,10 @@ class CompleteJavaEnums extends MiniPhase with InfoTransformer { thisPhase =>
143151
val (params, rest) = decomposeTemplateBody(templ.body)
144152
val addedDefs = addedParams(cls, ParamAccessor)
145153
val addedSyms = addedDefs.map(_.symbol.entered)
154+
val addedForwarders = addedEnumForwarders(cls)
146155
cpy.Template(templ)(
147156
parents = addEnumConstrArgs(defn.JavaEnumClass, templ.parents, addedSyms.map(ref)),
148-
body = params ++ addedDefs ++ rest)
157+
body = params ++ addedDefs ++ addedForwarders ++ rest)
149158
}
150159
else if (cls.isAnonymousClass && cls.owner.isAllOf(EnumCase) && cls.owner.owner.linkedClass.derivesFromJavaEnum) {
151160
def rhsOf(name: TermName) =

0 commit comments

Comments
 (0)