@@ -110,11 +110,19 @@ class CompleteJavaEnums extends MiniPhase with InfoTransformer { thisPhase =>
110
110
else tree
111
111
}
112
112
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
+ }
118
126
}
119
127
120
128
/** 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 =>
143
151
val (params, rest) = decomposeTemplateBody(templ.body)
144
152
val addedDefs = addedParams(cls, ParamAccessor )
145
153
val addedSyms = addedDefs.map(_.symbol.entered)
154
+ val addedForwarders = addedEnumForwarders(cls)
146
155
cpy.Template (templ)(
147
156
parents = addEnumConstrArgs(defn.JavaEnumClass , templ.parents, addedSyms.map(ref)),
148
- body = params ++ addedDefs ++ rest)
157
+ body = params ++ addedDefs ++ addedForwarders ++ rest)
149
158
}
150
159
else if (cls.isAnonymousClass && cls.owner.isAllOf(EnumCase ) && cls.owner.owner.linkedClass.derivesFromJavaEnum) {
151
160
def rhsOf (name : TermName ) =
0 commit comments