Skip to content

Commit ad6bc24

Browse files
authored
Merge pull request #9081 from dotty-staging/fix-8838
Fix #8838: load Java enum members lazily to avoid cycles
2 parents 0fef35f + 55377ce commit ad6bc24

File tree

5 files changed

+14
-13
lines changed

5 files changed

+14
-13
lines changed

compiler/src/dotty/tools/dotc/core/classfile/ClassfileConstants.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,7 @@ object ClassfileConstants {
362362
res = addFlag(res, nflags & JAVA_ACC_FINAL)
363363
res = addFlag(res, nflags & JAVA_ACC_SYNTHETIC)
364364
res = addFlag(res, nflags & JAVA_ACC_STATIC)
365+
res = addFlag(res, nflags & JAVA_ACC_ENUM)
365366
res = addFlag(res, nflags & JAVA_ACC_ABSTRACT)
366367
res = addFlag(res, nflags & JAVA_ACC_INTERFACE)
367368
res

compiler/src/dotty/tools/dotc/core/classfile/ClassfileParser.scala

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -201,12 +201,6 @@ class ClassfileParser(
201201
sym.markAbsent()
202202
}
203203

204-
// eager load enum definitions for exhaustivity check of pattern match
205-
if (isEnum) {
206-
instanceScope.toList.map(_.ensureCompleted())
207-
staticScope.toList.map(_.ensureCompleted())
208-
}
209-
210204
result
211205
}
212206

compiler/src/dotty/tools/dotc/transform/SymUtils.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,10 @@ class SymUtils(val self: Symbol) extends AnyVal {
192192
def children(implicit ctx: Context): List[Symbol] = {
193193
if (self.isType)
194194
self.setFlag(ChildrenQueried)
195+
196+
if (self.isAllOf(JavaEnumTrait))
197+
self.linkedClass.info.decls.foreach(_.ensureCompleted())
198+
195199
self.annotations.collect {
196200
case Annotation.Child(child) => child
197201
}.reverse

compiler/src/dotty/tools/dotc/transform/TypeTestsCasts.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,9 @@ object TypeTestsCasts {
120120
maximizeType(P1, span, fromScala2x = false)
121121

122122
val res = P1 <:< P
123+
124+
debug.println(TypeComparer.explained(P1 <:< P))
125+
123126
debug.println("P1 : " + P1.show)
124127
debug.println("P1 <:< P = " + res)
125128

compiler/src/dotty/tools/dotc/transform/patmat/Space.scala

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -586,11 +586,7 @@ class SpaceEngine(implicit ctx: Context) extends SpaceLogic {
586586
}
587587

588588
/** Decompose a type into subspaces -- assume the type can be decomposed */
589-
def decompose(tp: Type): List[Space] = {
590-
val children = tp.classSymbol.children
591-
592-
debug.println(s"candidates for ${tp.show} : [${children.map(_.show).mkString(", ")}]")
593-
589+
def decompose(tp: Type): List[Space] =
594590
tp.dealias match {
595591
case AndType(tp1, tp2) =>
596592
intersect(Typ(tp1, false), Typ(tp2, false)) match {
@@ -607,8 +603,11 @@ class SpaceEngine(implicit ctx: Context) extends SpaceLogic {
607603
case tp if tp.isRef(defn.UnitClass) =>
608604
Typ(ConstantType(Constant(())), true) :: Nil
609605
case tp if tp.classSymbol.isAllOf(JavaEnumTrait) =>
610-
children.map(sym => Typ(sym.termRef, true))
606+
tp.classSymbol.children.map(sym => Typ(sym.termRef, true))
611607
case tp =>
608+
val children = tp.classSymbol.children
609+
debug.println(s"candidates for ${tp.show} : [${children.map(_.show).mkString(", ")}]")
610+
612611
val parts = children.map { sym =>
613612
val sym1 = if (sym.is(ModuleClass)) sym.sourceModule else sym
614613
val refined = TypeOps.refineUsingParent(tp, sym1)
@@ -630,7 +629,7 @@ class SpaceEngine(implicit ctx: Context) extends SpaceLogic {
630629

631630
parts.map(Typ(_, true))
632631
}
633-
}
632+
634633

635634
/** Abstract sealed types, or-types, Boolean and Java enums can be decomposed */
636635
def canDecompose(tp: Type): Boolean = {

0 commit comments

Comments
 (0)