diff options
author | Martin Odersky <odersky@gmail.com> | 2017-04-06 08:39:26 +0200 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2017-04-06 09:04:42 +0200 |
commit | 30d8d878118c537ff82c88ef7ade8780b390bfae (patch) | |
tree | d65f0c074dbbefe7904ca3ff8149be380d17c204 | |
parent | 18d0ae5e08e66c90377ca6818b9d6f1af7f259ac (diff) | |
download | dotty-30d8d878118c537ff82c88ef7ade8780b390bfae.tar.gz dotty-30d8d878118c537ff82c88ef7ade8780b390bfae.tar.bz2 dotty-30d8d878118c537ff82c88ef7ade8780b390bfae.zip |
Emit enum utility methods only if enum class is not generic
-rw-r--r-- | compiler/src/dotty/tools/dotc/ast/DesugarEnums.scala | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/compiler/src/dotty/tools/dotc/ast/DesugarEnums.scala b/compiler/src/dotty/tools/dotc/ast/DesugarEnums.scala index e051824a1..43f915961 100644 --- a/compiler/src/dotty/tools/dotc/ast/DesugarEnums.scala +++ b/compiler/src/dotty/tools/dotc/ast/DesugarEnums.scala @@ -91,7 +91,9 @@ object DesugarEnums { else cdef private def valuesDot(name: String) = Select(Ident(nme.DOLLAR_VALUES), name.toTermName) - private def registerCall = Apply(valuesDot("register"), This(EmptyTypeIdent) :: Nil) + private def registerCall(implicit ctx: Context): List[Tree] = + if (enumClass.typeParams.nonEmpty) Nil + else Apply(valuesDot("register"), This(EmptyTypeIdent) :: Nil) :: Nil /** The following lists of definitions for an enum type E: * @@ -101,12 +103,11 @@ object DesugarEnums { * def enumValues = $values.values */ private def enumScaffolding(implicit ctx: Context): List[Tree] = { - val enumType = enumClass.typeRef.appliedTo(enumClass.typeParams.map(_ => TypeBounds.empty)) def enumDefDef(name: String, select: String) = DefDef(name.toTermName, Nil, Nil, TypeTree(), valuesDot(select)) val privateValuesDef = ValDef(nme.DOLLAR_VALUES, TypeTree(), - New(TypeTree(defn.EnumValuesType.appliedTo(enumType :: Nil)), ListOfNil)) + New(TypeTree(defn.EnumValuesType.appliedTo(enumClass.typeRef :: Nil)), ListOfNil)) .withFlags(Private) val valueOfDef = enumDefDef("enumValue", "fromInt") val withNameDef = enumDefDef("enumValueNamed", "fromName") @@ -131,7 +132,7 @@ object DesugarEnums { DefDef(nme.toString_, Nil, Nil, TypeTree(), Ident(nme.name)) .withFlags(Override) def creator = New(Template(emptyConstructor, enumClassRef :: Nil, EmptyValDef, - List(enumTagDef, toStringDef, registerCall))) + List(enumTagDef, toStringDef) ++ registerCall)) DefDef(nme.DOLLAR_NEW, Nil, List(List(param(nme.tag, defn.IntType), param(nme.name, defn.StringType))), TypeTree(), creator) @@ -147,7 +148,7 @@ object DesugarEnums { val minKind = if (kind < seenKind) kind else seenKind ctx.tree.pushAttachment(EnumCaseCount, (count + 1, minKind)) val scaffolding = - if (kind >= seenKind) Nil + if (enumClass.typeParams.nonEmpty || kind >= seenKind) Nil else if (kind == CaseKind.Object) enumScaffolding else if (seenKind == CaseKind.Object) enumValueCreator :: Nil else enumScaffolding :+ enumValueCreator @@ -177,7 +178,8 @@ object DesugarEnums { DefDef(nme.toString_, Nil, Nil, TypeTree(defn.StringType), Literal(Constant(name.toString))) .withFlags(Override) val (tagMeth, scaffolding) = enumTagMeth(CaseKind.Object) - val impl1 = cpy.Template(impl)(body = impl.body ++ List(tagMeth, toStringMeth, registerCall)) + val impl1 = cpy.Template(impl)(body = + impl.body ++ List(tagMeth, toStringMeth) ++ registerCall) val vdef = ValDef(name, TypeTree(), New(impl1)).withMods(mods | Final).withPos(pos) flatTree(scaffolding ::: vdef :: Nil).withPos(pos.startPos) } |