class Container : // needs to be wrapped in a class
enum Color extends java.lang.Enum[Color]:
case Red, Green, Blue
an unexpected type representation reached the compiler backend while compiling Container.scala: MethodType(List(), List(), TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class <empty>)),class Container)),class Container$Color)). If possible, please file a bug on https://github.com/lampepfl/dotty/issues
Error while emitting Container.scala
exception occurred while compiling Container.scala
scala.MatchError: MethodType(List(), List(), TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class <empty>)),class Container)),class Container$Color)) (of class dotty.tools.dotc.core.Types$CachedMethodType) while compiling Container.scala
Exception in thread "main" scala.MatchError: MethodType(List(), List(), TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class <empty>)),class Container)),class Container$Color)) (of class dotty.tools.dotc.core.Types$CachedMethodType)
at dotty.tools.backend.jvm.BCodeHelpers.dotty$tools$backend$jvm$BCodeHelpers$$typeToTypeKind(BCodeHelpers.scala:850)
at dotty.tools.backend.jvm.BCodeHelpers$BCInnerClassGen.toTypeKind(BCodeHelpers.scala:299)
at dotty.tools.backend.jvm.BCodeHelpers$BCInnerClassGen.toTypeKind$(BCodeHelpers.scala:210)
at dotty.tools.backend.jvm.BCodeSkelBuilder$PlainSkelBuilder.toTypeKind(BCodeSkelBuilder.scala:58)
at dotty.tools.backend.jvm.BCodeSkelBuilder$PlainSkelBuilder.symInfoTK(BCodeSkelBuilder.scala:87)
at dotty.tools.backend.jvm.BCodeSkelBuilder$PlainSkelBuilder.addClassFields$$anonfun$2(BCodeSkelBuilder.scala:268)
at dotty.runtime.function.JProcedure1.apply(JProcedure1.java:15)
at dotty.runtime.function.JProcedure1.apply(JProcedure1.java:10)
at scala.collection.immutable.List.foreach(List.scala:333)
at dotty.tools.backend.jvm.BCodeSkelBuilder$PlainSkelBuilder.addClassFields(BCodeSkelBuilder.scala:274)
at dotty.tools.backend.jvm.BCodeSkelBuilder$PlainSkelBuilder.genPlainClass(BCodeSkelBuilder.scala:134)
at dotty.tools.backend.jvm.GenBCodePipeline$Worker1.visit(GenBCode.scala:224)
at dotty.tools.backend.jvm.GenBCodePipeline$Worker1.run(GenBCode.scala:191)
at dotty.tools.backend.jvm.GenBCodePipeline.buildAndSendToDisk(GenBCode.scala:521)
at dotty.tools.backend.jvm.GenBCodePipeline.run(GenBCode.scala:487)
at dotty.tools.backend.jvm.GenBCode.run(GenBCode.scala:57)
at dotty.tools.dotc.core.Phases$Phase.runOn$$anonfun$1(Phases.scala:295)
at scala.collection.immutable.List.map(List.scala:246)
at dotty.tools.dotc.core.Phases$Phase.runOn(Phases.scala:296)
at dotty.tools.backend.jvm.GenBCode.runOn(GenBCode.scala:61)
at dotty.tools.dotc.Run.runPhases$4$$anonfun$4(Run.scala:181)
at dotty.runtime.function.JProcedure1.apply(JProcedure1.java:15)
at dotty.runtime.function.JProcedure1.apply(JProcedure1.java:10)
at scala.collection.ArrayOps$.foreach$extension(ArrayOps.scala:1323)
at dotty.tools.dotc.Run.runPhases$5(Run.scala:191)
at dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:199)
at dotty.runtime.function.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
at dotty.tools.dotc.util.Stats$.maybeMonitored(Stats.scala:64)
at dotty.tools.dotc.Run.compileUnits(Run.scala:206)
at dotty.tools.dotc.Run.compileSources(Run.scala:143)
at dotty.tools.dotc.Run.compile(Run.scala:125)
at dotty.tools.dotc.Driver.doCompile(Driver.scala:38)
at dotty.tools.dotc.Driver.process(Driver.scala:195)
at dotty.tools.dotc.Driver.process(Driver.scala:164)
at dotty.tools.dotc.Driver.process(Driver.scala:176)
at dotty.tools.dotc.Driver.main(Driver.scala:203)
at dotty.tools.dotc.Main.main(Main.scala)
with -Ycheck:completeJavaEnums we get the assertion failure: _"non member selection of getter Red in object Color from Container.this.Color.type in Color.this.$outer.Color.Red while compiling Container.scala"_
checking Container.scala after phase MegaPhase{elimErasedValueType, pureStats, vcElideAllocations, arrayApply, elimPolyFunction, tailrec, completeJavaEnums, mixin, lazyVals, memoize, nonLocalReturns, capturedVars}
exception while typing @scala.annotation.static() <static> val Red: (): Container.this.Color =
Color.this.$outer.Color.Red of class class dotty.tools.dotc.ast.Trees$ValDef # 2002
exception while typing @scala.annotation.internal.Child[
(Container.Color.Blue : (): Container.this.Color)
]() @scala.annotation.internal.Child[
(Container.Color.Green : (): Container.this.Color)
]() @scala.annotation.internal.Child[
(Container.Color.Red : (): Container.this.Color)
]() sealed abstract class Color($outer: Container, _$name: String,
_$ordinal: Int
) extends Enum, Enum {
super(Color.this._$name, Color.this._$ordinal)
def productIterator(): scala.collection.Iterator =
super[Product].productIterator()
def productPrefix(): String = super[Product].productPrefix()
def productElementName(n: Int): String = super[Product].productElementName(n)
def productElementNames(): scala.collection.Iterator =
super[Product].productElementNames()
private val $outer: Container
val _$name: String
val _$ordinal: Int
@scala.annotation.static() <static> val Red: (): Container.this.Color =
Color.this.$outer.Color.Red
@scala.annotation.static() <static> val Green: (): Container.this.Color =
Color.this.$outer.Color.Green
@scala.annotation.static() <static> val Blue: (): Container.this.Color =
Color.this.$outer.Color.Blue
final def Container$Color$$$outer(): Container = Color.this.$outer
} of class class dotty.tools.dotc.ast.Trees$TypeDef # 2064
exception while typing @scala.annotation.internal.SourceFile("Container.scala") class Container()
extends
Object {
super()
@scala.annotation.internal.Child[
(Container.Color.Blue : (): Container.this.Color)
]() @scala.annotation.internal.Child[
(Container.Color.Green : (): Container.this.Color)
]() @scala.annotation.internal.Child[
(Container.Color.Red : (): Container.this.Color)
]() sealed abstract class Color($outer: Container, _$name: String,
_$ordinal: Int
) extends Enum, Enum {
super(Color.this._$name, Color.this._$ordinal)
def productIterator(): scala.collection.Iterator =
super[Product].productIterator()
def productPrefix(): String = super[Product].productPrefix()
def productElementName(n: Int): String =
super[Product].productElementName(n)
def productElementNames(): scala.collection.Iterator =
super[Product].productElementNames()
private val $outer: Container
val _$name: String
val _$ordinal: Int
@scala.annotation.static() <static> val Red: (): Container.this.Color =
Color.this.$outer.Color.Red
@scala.annotation.static() <static> val Green: (): Container.this.Color =
Color.this.$outer.Color.Green
@scala.annotation.static() <static> val Blue: (): Container.this.Color =
Color.this.$outer.Color.Blue
final def Container$Color$$$outer(): Container = Color.this.$outer
}
val Color$lzy1: Container.this.Color$ = new Container.this.Color$(this)
final lazy module def Color(): Container.this.Color$ = this.Color$lzy1
final module class Color$($outer: Container) extends Object,
java.io.Serializable
, scala.deriving.Mirror.Sum {
super()
def values(): Container.this.Color[] =
this.$values.values().toArray(
scala.reflect.ClassTag.apply(classOf[Container.this.Color])
).asInstanceOf[Container.this.Color[]]
private val $values: scala.runtime.EnumValues =
new scala.runtime.EnumValues()
def valueOf($name: String): Container.this.Color =
try
this.$values.fromName().apply($name).asInstanceOf[Container.this.Color]
catch
{
case ex$ @ _:java.util.NoSuchElementException =>
throw new IllegalArgumentException("key not found: ".concat($name))
}
private def $new(_$ordinal: Int, $name: String): Container.this.Color =
{
final class $anon($outer: Container.this.Color$) extends
Container.this.Color
, scala.runtime.EnumValue, scala.deriving.Mirror.Singleton {
super(this.$outer.Container$Color$$$$outer(), $name, _$ordinal)
override def canEqual(that: Object): Boolean =
super[EnumValue].canEqual(that)
override def productArity(): Int = super[EnumValue].productArity()
override def productPrefix(): String =
super[EnumValue].productPrefix()
override def productElement(n: Int): Object =
super[EnumValue].productElement(n)
override def productElementName(n: Int): String =
super[EnumValue].productElementName(n)
def fromProduct(p: Product): scala.deriving.Mirror.Singleton =
super[Singleton].fromProduct(p)
def $ordinal(): Int = _$ordinal
override def toString(): String = $name
this.$outer.$values.register(this)
private val $outer: Container.this.Color$
final def Container$Color$_$$anon$$$outer(): Container.this.Color$ =
$outer
def fromProduct(p: Product): Object = this.fromProduct(p)
}
new
Container.this.Color with scala.runtime.EnumValue with
scala.deriving.Mirror.Singleton
{...}
(this):Container.this.Color
}
private val Red: Container.this.Color = this.$new(0, "Red")
case def Red(): Container.this.Color = this.Red
private val Green: Container.this.Color = this.$new(1, "Green")
case def Green(): Container.this.Color = this.Green
private val Blue: Container.this.Color = this.$new(2, "Blue")
case def Blue(): Container.this.Color = this.Blue
def ordinal(x$0: Container.this.Color): Int = x$0.ordinal()
private val $outer: Container
final def Container$Color$$$$outer(): Container = Container.Color.$outer
def ordinal(x: Object): Int =
this.ordinal(x.asInstanceOf[Container.this.Color])
}
} of class class dotty.tools.dotc.ast.Trees$TypeDef # 2187
exception while typing package <empty> {
@scala.annotation.internal.SourceFile("Container.scala") class Container()
extends
Object {
super()
@scala.annotation.internal.Child[
(Container.Color.Blue : (): Container.this.Color)
]() @scala.annotation.internal.Child[
(Container.Color.Green : (): Container.this.Color)
]() @scala.annotation.internal.Child[
(Container.Color.Red : (): Container.this.Color)
]() sealed abstract class Color($outer: Container, _$name: String,
_$ordinal: Int
) extends Enum, Enum {
super(Color.this._$name, Color.this._$ordinal)
def productIterator(): scala.collection.Iterator =
super[Product].productIterator()
def productPrefix(): String = super[Product].productPrefix()
def productElementName(n: Int): String =
super[Product].productElementName(n)
def productElementNames(): scala.collection.Iterator =
super[Product].productElementNames()
private val $outer: Container
val _$name: String
val _$ordinal: Int
@scala.annotation.static() <static> val Red: (): Container.this.Color =
Color.this.$outer.Color.Red
@scala.annotation.static() <static> val Green: (): Container.this.Color =
Color.this.$outer.Color.Green
@scala.annotation.static() <static> val Blue: (): Container.this.Color =
Color.this.$outer.Color.Blue
final def Container$Color$$$outer(): Container = Color.this.$outer
}
val Color$lzy1: Container.this.Color$ = new Container.this.Color$(this)
final lazy module def Color(): Container.this.Color$ = this.Color$lzy1
final module class Color$($outer: Container) extends Object,
java.io.Serializable
, scala.deriving.Mirror.Sum {
super()
def values(): Container.this.Color[] =
this.$values.values().toArray(
scala.reflect.ClassTag.apply(classOf[Container.this.Color])
).asInstanceOf[Container.this.Color[]]
private val $values: scala.runtime.EnumValues =
new scala.runtime.EnumValues()
def valueOf($name: String): Container.this.Color =
try
this.$values.fromName().apply($name).asInstanceOf[Container.this.Color
]
catch
{
case ex$ @ _:java.util.NoSuchElementException =>
throw
new IllegalArgumentException("key not found: ".concat($name))
}
private def $new(_$ordinal: Int, $name: String): Container.this.Color =
{
final class $anon($outer: Container.this.Color$) extends
Container.this.Color
, scala.runtime.EnumValue, scala.deriving.Mirror.Singleton {
super(this.$outer.Container$Color$$$$outer(), $name, _$ordinal)
override def canEqual(that: Object): Boolean =
super[EnumValue].canEqual(that)
override def productArity(): Int = super[EnumValue].productArity()
override def productPrefix(): String =
super[EnumValue].productPrefix()
override def productElement(n: Int): Object =
super[EnumValue].productElement(n)
override def productElementName(n: Int): String =
super[EnumValue].productElementName(n)
def fromProduct(p: Product): scala.deriving.Mirror.Singleton =
super[Singleton].fromProduct(p)
def $ordinal(): Int = _$ordinal
override def toString(): String = $name
this.$outer.$values.register(this)
private val $outer: Container.this.Color$
final def Container$Color$_$$anon$$$outer(): Container.this.Color$
=
$outer
def fromProduct(p: Product): Object = this.fromProduct(p)
}
new
Container.this.Color with scala.runtime.EnumValue with
scala.deriving.Mirror.Singleton
{...}
(this):Container.this.Color
}
private val Red: Container.this.Color = this.$new(0, "Red")
case def Red(): Container.this.Color = this.Red
private val Green: Container.this.Color = this.$new(1, "Green")
case def Green(): Container.this.Color = this.Green
private val Blue: Container.this.Color = this.$new(2, "Blue")
case def Blue(): Container.this.Color = this.Blue
def ordinal(x$0: Container.this.Color): Int = x$0.ordinal()
private val $outer: Container
final def Container$Color$$$$outer(): Container = Container.Color.$outer
def ordinal(x: Object): Int =
this.ordinal(x.asInstanceOf[Container.this.Color])
}
}
} of class class dotty.tools.dotc.ast.Trees$PackageDef # 2188
*** error while checking Container.scala after phase capturedVars ***
exception occurred while compiling Container.scala
java.lang.AssertionError: assertion failed: non member selection of getter Red in object Color from Container.this.Color.type in Color.this.$outer.Color.Red while compiling Container.scala
Exception in thread "main" java.lang.AssertionError: assertion failed: non member selection of getter Red in object Color from Container.this.Color.type in Color.this.$outer.Color.Red
at dotty.DottyPredef$.assertFail(DottyPredef.scala:17)
at dotty.tools.dotc.transform.FirstTransform.checkPostCondition(FirstTransform.scala:69)
at dotty.tools.dotc.transform.TreeChecker.dotty$tools$dotc$transform$TreeChecker$Checker$$_$typedUnadapted$$anonfun$1(TreeChecker.scala:350)
at dotty.runtime.function.JProcedure1.apply(JProcedure1.java:15)
at dotty.runtime.function.JProcedure1.apply(JProcedure1.java:10)
at scala.collection.immutable.List.foreach(List.scala:333)
at dotty.tools.dotc.transform.TreeChecker$Checker.typedUnadapted(TreeChecker.scala:350)
at dotty.tools.dotc.typer.Typer.op$1(Typer.scala:2553)
at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2554)
at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2557)
at dotty.tools.dotc.transform.TreeChecker$Checker.typed(TreeChecker.scala:317)
at dotty.tools.dotc.typer.Typer.typedExpr(Typer.scala:2671)
at dotty.tools.dotc.typer.Typer.typedValDef(Typer.scala:1900)
at dotty.tools.dotc.typer.Typer.typedNamed$1(Typer.scala:2397)
at dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:2483)
at dotty.tools.dotc.typer.ReTyper.typedUnadapted(ReTyper.scala:122)
at dotty.tools.dotc.transform.TreeChecker$Checker.typedUnadapted(TreeChecker.scala:333)
at dotty.tools.dotc.typer.Typer.op$1(Typer.scala:2553)
at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2554)
at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2557)
at dotty.tools.dotc.transform.TreeChecker$Checker.typed(TreeChecker.scala:317)
at dotty.tools.dotc.typer.Typer.traverse$1(Typer.scala:2579)
at dotty.tools.dotc.typer.Typer.typedStats(Typer.scala:2627)
at dotty.tools.dotc.transform.TreeChecker$Checker.typedStats(TreeChecker.scala:516)
at dotty.tools.dotc.typer.Typer.typedClassDef(Typer.scala:2081)
at dotty.tools.dotc.transform.TreeChecker$Checker.typedClassDef(TreeChecker.scala:448)
at dotty.tools.dotc.typer.Typer.typedTypeOrClassDef$2(Typer.scala:2411)
at dotty.tools.dotc.typer.Typer.typedNamed$1(Typer.scala:2415)
at dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:2483)
at dotty.tools.dotc.typer.ReTyper.typedUnadapted(ReTyper.scala:122)
at dotty.tools.dotc.transform.TreeChecker$Checker.typedUnadapted(TreeChecker.scala:333)
at dotty.tools.dotc.typer.Typer.op$1(Typer.scala:2553)
at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2554)
at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2557)
at dotty.tools.dotc.transform.TreeChecker$Checker.typed(TreeChecker.scala:317)
at dotty.tools.dotc.typer.Typer.traverse$1(Typer.scala:2579)
at dotty.tools.dotc.typer.Typer.typedStats(Typer.scala:2627)
at dotty.tools.dotc.transform.TreeChecker$Checker.typedStats(TreeChecker.scala:516)
at dotty.tools.dotc.typer.Typer.typedClassDef(Typer.scala:2081)
at dotty.tools.dotc.transform.TreeChecker$Checker.typedClassDef(TreeChecker.scala:448)
at dotty.tools.dotc.typer.Typer.typedTypeOrClassDef$2(Typer.scala:2411)
at dotty.tools.dotc.typer.Typer.typedNamed$1(Typer.scala:2415)
at dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:2483)
at dotty.tools.dotc.typer.ReTyper.typedUnadapted(ReTyper.scala:122)
at dotty.tools.dotc.transform.TreeChecker$Checker.typedUnadapted(TreeChecker.scala:333)
at dotty.tools.dotc.typer.Typer.op$1(Typer.scala:2553)
at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2554)
at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2557)
at dotty.tools.dotc.transform.TreeChecker$Checker.typed(TreeChecker.scala:317)
at dotty.tools.dotc.typer.Typer.traverse$1(Typer.scala:2579)
at dotty.tools.dotc.typer.Typer.typedStats(Typer.scala:2627)
at dotty.tools.dotc.transform.TreeChecker$Checker.typedStats(TreeChecker.scala:516)
at dotty.tools.dotc.typer.Typer.typedPackageDef(Typer.scala:2207)
at dotty.tools.dotc.typer.Typer.typedUnnamed$1(Typer.scala:2455)
at dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:2484)
at dotty.tools.dotc.typer.ReTyper.typedUnadapted(ReTyper.scala:122)
at dotty.tools.dotc.transform.TreeChecker$Checker.typedUnadapted(TreeChecker.scala:333)
at dotty.tools.dotc.typer.Typer.op$1(Typer.scala:2553)
at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2554)
at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2557)
at dotty.tools.dotc.transform.TreeChecker$Checker.typed(TreeChecker.scala:317)
at dotty.tools.dotc.typer.Typer.typedExpr(Typer.scala:2671)
at dotty.tools.dotc.transform.TreeChecker.check(TreeChecker.scala:151)
at dotty.tools.dotc.transform.TreeChecker.run(TreeChecker.scala:120)
at dotty.tools.dotc.core.Phases$Phase.runOn$$anonfun$1(Phases.scala:295)
at scala.collection.immutable.List.map(List.scala:246)
at dotty.tools.dotc.core.Phases$Phase.runOn(Phases.scala:296)
at dotty.tools.dotc.Run.runPhases$4$$anonfun$4(Run.scala:181)
at dotty.runtime.function.JProcedure1.apply(JProcedure1.java:15)
at dotty.runtime.function.JProcedure1.apply(JProcedure1.java:10)
at scala.collection.ArrayOps$.foreach$extension(ArrayOps.scala:1323)
at dotty.tools.dotc.Run.runPhases$5(Run.scala:191)
at dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:199)
at dotty.runtime.function.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
at dotty.tools.dotc.util.Stats$.maybeMonitored(Stats.scala:64)
at dotty.tools.dotc.Run.compileUnits(Run.scala:206)
at dotty.tools.dotc.Run.compileSources(Run.scala:143)
at dotty.tools.dotc.Run.compile(Run.scala:125)
at dotty.tools.dotc.Driver.doCompile(Driver.scala:38)
at dotty.tools.dotc.Driver.process(Driver.scala:195)
at dotty.tools.dotc.Driver.process(Driver.scala:164)
at dotty.tools.dotc.Driver.process(Driver.scala:176)
at dotty.tools.dotc.Driver.main(Driver.scala:203)
at dotty.tools.dotc.Main.main(Main.scala)
This should probably not be allowed as in JLS enums are always static classes
Most helpful comment
This should probably not be allowed as in JLS enums are always static classes