@@ -110,11 +110,20 @@ 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.isAllOf(EnumValue ))
121
+ for { enumValue <- enums }
122
+ yield {
123
+ val fieldSym = ctx.newSymbol(clazz, enumValue.name.asTermName, EnumValue | JavaStatic , enumValue.info)
124
+ fieldSym.addAnnotation(Annotations .Annotation (defn.ScalaStaticAnnot ))
125
+ ValDef (fieldSym, moduleRef.select(enumValue))
126
+ }
118
127
}
119
128
120
129
/** 1. If this is an enum class, add $name and $ordinal parameters to its
@@ -143,9 +152,10 @@ class CompleteJavaEnums extends MiniPhase with InfoTransformer { thisPhase =>
143
152
val (params, rest) = decomposeTemplateBody(templ.body)
144
153
val addedDefs = addedParams(cls, ParamAccessor )
145
154
val addedSyms = addedDefs.map(_.symbol.entered)
155
+ val addedForwarders = addedEnumForwarders(cls)
146
156
cpy.Template (templ)(
147
157
parents = addEnumConstrArgs(defn.JavaEnumClass , templ.parents, addedSyms.map(ref)),
148
- body = params ++ addedDefs ++ rest)
158
+ body = params ++ addedDefs ++ addedForwarders ++ rest)
149
159
}
150
160
else if (cls.isAnonymousClass && cls.owner.isAllOf(EnumCase ) && cls.owner.owner.linkedClass.derivesFromJavaEnum) {
151
161
def rhsOf (name : TermName ) =
0 commit comments