Skip to content

Commit 15928f1

Browse files
committed
Fix #8838: load Java enum memers lazily to avoid cycles
It only happens in JDK 14.
1 parent 6af879d commit 15928f1

File tree

2 files changed

+7
-12
lines changed

2 files changed

+7
-12
lines changed

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/patmat/Space.scala

Lines changed: 7 additions & 6 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,13 @@ 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) =>
606+
tp.classSymbol.linkedClass.info.decls.toList.map(_.ensureCompleted())
607+
val children = tp.classSymbol.children
610608
children.map(sym => Typ(sym.termRef, true))
611609
case tp =>
610+
val children = tp.classSymbol.children
611+
debug.println(s"candidates for ${tp.show} : [${children.map(_.show).mkString(", ")}]")
612+
612613
val parts = children.map { sym =>
613614
val sym1 = if (sym.is(ModuleClass)) sym.sourceModule else sym
614615
val refined = TypeOps.refineUsingParent(tp, sym1)
@@ -630,7 +631,7 @@ class SpaceEngine(implicit ctx: Context) extends SpaceLogic {
630631

631632
parts.map(Typ(_, true))
632633
}
633-
}
634+
634635

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

0 commit comments

Comments
 (0)