@@ -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