@@ -110,11 +110,20 @@ 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.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+ }
118127 }
119128
120129 /** 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 =>
143152 val (params, rest) = decomposeTemplateBody(templ.body)
144153 val addedDefs = addedParams(cls, ParamAccessor )
145154 val addedSyms = addedDefs.map(_.symbol.entered)
155+ val addedForwarders = addedEnumForwarders(cls)
146156 cpy.Template (templ)(
147157 parents = addEnumConstrArgs(defn.JavaEnumClass , templ.parents, addedSyms.map(ref)),
148- body = params ++ addedDefs ++ rest)
158+ body = params ++ addedDefs ++ addedForwarders ++ rest)
149159 }
150160 else if (cls.isAnonymousClass && cls.owner.isAllOf(EnumCase ) && cls.owner.owner.linkedClass.derivesFromJavaEnum) {
151161 def rhsOf (name : TermName ) =
0 commit comments