Skip to content

Commit f845ed7

Browse files
Name removed from enum
1 parent 760b307 commit f845ed7

File tree

11 files changed

+70
-86
lines changed

11 files changed

+70
-86
lines changed

compiler/src/dotty/tools/dotc/ast/Desugar.scala

+1-5
Original file line numberDiff line numberDiff line change
@@ -544,11 +544,7 @@ object desugar {
544544
yield syntheticProperty(nme.selectorName(i), caseParams(i).tpt,
545545
Select(This(EmptyTypeIdent), caseParams(i).name))
546546
}
547-
def ordinalMeths =
548-
if (isEnumCase)
549-
ordinalMethLit(nextOrdinal(CaseKind.Class)._1) ::
550-
nameMethLit(className.toString) :: Nil
551-
else Nil
547+
def ordinalMeths = if (isEnumCase) ordinalMethLit(nextOrdinal(CaseKind.Class)._1) :: Nil else Nil
552548
def copyMeths = {
553549
val hasRepeatedParam = constrVparamss.exists(_.exists {
554550
case ValDef(_, tpt, _) => isRepeated(tpt)

compiler/src/dotty/tools/dotc/ast/DesugarEnums.scala

+16-23
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,8 @@ object DesugarEnums {
8686
/** The following lists of definitions for an enum type E:
8787
*
8888
* private val $values = new EnumValues[E]
89-
* def valueOf(name: String) =
90-
* try $values.fromName(name) catch
89+
* def valueOf($name: String) =
90+
* try $values.fromName($name) catch
9191
* {
9292
* case ex$:NoSuchElementException =>
9393
* throw new IllegalArgumentException("key not found: ".concat(name))
@@ -104,17 +104,17 @@ object DesugarEnums {
104104

105105
val valuesOfExnMessage = Apply(
106106
Select(Literal(Constant("key not found: ")), "concat".toTermName)
107-
, Ident(nme.name) :: Nil)
107+
, Ident(nme.nameDollar) :: Nil)
108108
val valuesOfBody = Try(
109-
expr = Apply(valuesDot("fromName"), Ident(nme.name) :: Nil)
109+
expr = Apply(valuesDot("fromName"), Ident(nme.nameDollar) :: Nil)
110110
, cases = CaseDef(
111111
pat = Typed(Ident(nme.DEFAULT_EXCEPTION_NAME), TypeTree(defn.NoSuchElementExceptionType))
112112
, guard = EmptyTree
113113
, body = Throw(New(TypeTree(defn.IllegalArgumentExceptionType), List(valuesOfExnMessage :: Nil)))
114114
) :: Nil
115115
, finalizer = EmptyTree
116116
)
117-
val valueOfDef = DefDef(nme.valueOf, Nil, List(param(nme.name, defn.StringType) :: Nil),
117+
val valueOfDef = DefDef(nme.valueOf, Nil, List(param(nme.nameDollar, defn.StringType) :: Nil),
118118
TypeTree(), valuesOfBody)
119119

120120
valuesDef ::
@@ -124,20 +124,19 @@ object DesugarEnums {
124124

125125
/** A creation method for a value of enum type `E`, which is defined as follows:
126126
*
127-
* private def $new(tag: Int, name_: String) = new E {
128-
* override def ordinal = tag
129-
* override def name = name_
130-
* override def toString = name
127+
* private def $new($tag: Int, $name: String) = new E {
128+
* override def ordinal = $tag
129+
* override def toString = $name
131130
* $values.register(this)
132131
* }
133132
*/
134133
private def enumValueCreator(implicit ctx: Context) = {
135-
val ordinalDef = ordinalMeth(Ident(nme.tag))
136-
val nameDef = nameMeth(Ident(nme.name_))
134+
val ordinalDef = ordinalMeth(Ident(nme.tagDollar))
135+
val toStringDef = toStringMeth(Ident(nme.nameDollar))
137136
def creator = New(Template(emptyConstructor, enumClassRef :: Nil, Nil, EmptyValDef,
138-
List(ordinalDef, nameDef, toStringMethAsName) ++ registerCall))
137+
List(ordinalDef, toStringDef) ++ registerCall))
139138
DefDef(nme.DOLLAR_NEW, Nil,
140-
List(List(param(nme.tag, defn.IntType), param(nme.name_, defn.StringType))),
139+
List(List(param(nme.tagDollar, defn.IntType), param(nme.nameDollar, defn.StringType))),
141140
TypeTree(), creator)
142141
}
143142

@@ -263,20 +262,14 @@ object DesugarEnums {
263262
def ordinalMeth(body: Tree)(implicit ctx: Context): DefDef =
264263
DefDef(nme.ordinal, Nil, Nil, TypeTree(defn.IntType), body).withFlags(Override)
265264

266-
def nameMeth(body: Tree)(implicit ctx: Context): DefDef =
267-
DefDef(nme.name, Nil, Nil, TypeTree(defn.StringType), body).withFlags(Override)
268-
269265
def toStringMeth(body: Tree)(implicit ctx: Context): DefDef =
270266
DefDef(nme.toString_, Nil, Nil, TypeTree(defn.StringType), body).withFlags(Override)
271267

272268
def ordinalMethLit(ord: Int)(implicit ctx: Context): DefDef =
273269
ordinalMeth(Literal(Constant(ord)))
274270

275-
def nameMethLit(name: String)(implicit ctx: Context): DefDef =
276-
nameMeth(Literal(Constant(name)))
277-
278-
def toStringMethAsName(implicit ctx: Context): DefDef =
279-
toStringMeth(Ident(nme.name))
271+
def toStringMethLit(name: String)(implicit ctx: Context): DefDef =
272+
toStringMeth(Literal(Constant(name)))
280273

281274
/** Expand a module definition representing a parameterless enum case */
282275
def expandEnumModule(name: TermName, impl: Template, mods: Modifiers, span: Span)(implicit ctx: Context): Tree = {
@@ -287,8 +280,8 @@ object DesugarEnums {
287280
else {
288281
val (tag, scaffolding) = nextOrdinal(CaseKind.Object)
289282
val ordinalDef = ordinalMethLit(tag)
290-
val nameDef = nameMethLit(name.toString)
291-
val impl1 = cpy.Template(impl)(body = List(ordinalDef, nameDef, toStringMethAsName) ++ registerCall)
283+
val toStringDef = toStringMethLit(name.toString)
284+
val impl1 = cpy.Template(impl)(body = List(ordinalDef, toStringDef) ++ registerCall)
292285
val vdef = ValDef(name, TypeTree(), New(impl1)).withMods(mods | Final)
293286
flatTree(scaffolding ::: vdef :: Nil).withSpan(span)
294287
}

compiler/src/dotty/tools/dotc/core/StdNames.scala

+2-1
Original file line numberDiff line numberDiff line change
@@ -475,7 +475,7 @@ object StdNames {
475475
val mirror : N = "mirror"
476476
val moduleClass : N = "moduleClass"
477477
val name: N = "name"
478-
val name_ : N = "name_"
478+
val nameDollar: N = "$name"
479479
val ne: N = "ne"
480480
val newFreeTerm: N = "newFreeTerm"
481481
val newFreeType: N = "newFreeType"
@@ -530,6 +530,7 @@ object StdNames {
530530
val strictEquality: N = "strictEquality"
531531
val synchronized_ : N = "synchronized"
532532
val tag: N = "tag"
533+
val tagDollar: N = "$tag"
533534
val tail: N = "tail"
534535
val `then` : N = "then"
535536
val this_ : N = "this"

library/src/scala/Enum.scala

-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,4 @@ trait Enum {
55

66
/** A number uniquely identifying a case of an enum */
77
def ordinal: Int
8-
9-
/** Name of the enum's case */
10-
def name: String
118
}

tests/pos-with-compiler/tasty/definitions.scala

+8-8
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,13 @@ object definitions {
6565
/** Trees denoting terms */
6666
enum Term extends Statement {
6767
def tpe: Type = ???
68-
case Ident(nme: String, override val tpe: Type)
69-
case Select(prefix: Term, nme: String, signature: Option[Signature])
68+
case Ident(name: String, override val tpe: Type)
69+
case Select(prefix: Term, name: String, signature: Option[Signature])
7070
case Literal(value: Constant)
7171
case This(id: Option[Id])
7272
case New(tpt: TypeTree)
7373
case Throw(expr: Term)
74-
case NamedArg(nme: String, arg: Term)
74+
case NamedArg(name: String, arg: Term)
7575
case Apply(fn: Term, args: List[Term])
7676
case TypeApply(fn: Term, args: List[TypeTree])
7777
case Super(thiz: Term, mixin: Option[Id])
@@ -94,9 +94,9 @@ object definitions {
9494
enum TypeTree extends Positioned {
9595
def tpe: Type = ???
9696
case Synthetic()
97-
case Ident(nme: String, override val tpe: Type)
98-
case TermSelect(prefix: Term, nme: String)
99-
case TypeSelect(prefix: TypeTree, nme: String)
97+
case Ident(name: String, override val tpe: Type)
98+
case TermSelect(prefix: Term, name: String)
99+
case TypeSelect(prefix: TypeTree, name: String)
100100
case Singleton(ref: Term)
101101
case Refined(underlying: TypeTree, refinements: List[Definition])
102102
case Applied(tycon: TypeTree, args: List[TypeTree | TypeBoundsTree])
@@ -105,7 +105,7 @@ object definitions {
105105
case Or(left: TypeTree, right: TypeTree)
106106
case ByName(tpt: TypeTree)
107107
case TypeLambda(tparams: List[TypeDef], body: Type | TypeBoundsTree)
108-
case Bind(nme: String, bounds: TypeBoundsTree)
108+
case Bind(name: String, bounds: TypeBoundsTree)
109109
}
110110

111111
/** Trees denoting type bounds */
@@ -122,7 +122,7 @@ object definitions {
122122
enum Pattern extends Positioned {
123123
def tpe: Type = ???
124124
case Value(v: Term)
125-
case Bind(nme: String, pat: Pattern)
125+
case Bind(name: String, pat: Pattern)
126126
case Unapply(unapply: Term, implicits: List[Term], pats: List[Pattern])
127127
case Alternative(pats: List[Pattern])
128128
case TypeTest(tpt: TypeTree)

tests/pos/enum-List-control.scala

-2
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,12 @@ abstract sealed class List[T] extends Enum
22
object List {
33
final class Cons[T](x: T, xs: List[T]) extends List[T] {
44
def ordinal = 0
5-
def name = "Cons"
65
}
76
object Cons {
87
def apply[T](x: T, xs: List[T]): List[T] = new Cons(x, xs)
98
}
109
final class Nil[T]() extends List[T] {
1110
def ordinal = 1
12-
def name = "Nil"
1311
}
1412
object Nil {
1513
def apply[T](): List[T] = new Nil()

tests/run/enum-Color.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ enum Color {
66
object Test {
77
def main(args: Array[String]) =
88
for (color <- Color.values) {
9-
println(s"$color: ${color.name}")
10-
assert(Color.valueOf(color.name) eq color)
9+
println(s"$color: ${color.toString}")
10+
assert(Color.valueOf(color.toString) eq color)
1111
import Color._
1212
color match {
1313
case Red | Green | Blue =>

tests/run/enums-java-compat.check

-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
name: EARTH
21
ordinal: 0
32
toString: EARTH
43
Values class: class [LA;

tests/run/enums-java-compat.scala

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
class JEnum {
2+
def name: String = "Foo"
3+
def ordinal: Int = 10
4+
def action = "fofofo"
5+
}
6+
7+
enum A extends JEnum {
8+
case MONDAY, TUESDAY, SATURDAY
9+
case Stuff
10+
case Someday(x: String)
11+
def report = "Reported"
12+
}
13+
14+
trait Foo1
15+
trait Bar
16+
17+
enum B(val gravity: Double)(val isItGood: Boolean) extends Foo1 {
18+
case EARTH extends B(9.8)(true)
19+
case JUPITER extends B(100)(true)
20+
case MOON extends B(4.3)(true)
21+
case Foo extends B(10)(true) with Bar
22+
}
23+
24+
object Test {
25+
def main(args: Array[String]): Unit = {
26+
val t1 = B.EARTH
27+
val t2 = B.JUPITER
28+
29+
println("ordinal: " + t1.ordinal)
30+
println("toString: " + t1.toString)
31+
32+
val values: Array[A] = A.values
33+
println("Values class: " + values.getClass)
34+
values.foreach(v => println(v.toString + " : " + v.ordinal))
35+
println("By-name value: " + A.valueOf("MONDAY"))
36+
try A.valueOf("stuff")
37+
catch { case e: IllegalArgumentException =>
38+
println("Correctly failed to retrieve illegal name, message: " + e.getMessage)
39+
}
40+
}
41+
}

tests/run/enums-java-compat/Enums.scala

-22
This file was deleted.

tests/run/enums-java-compat/Test.scala

-19
This file was deleted.

0 commit comments

Comments
 (0)