Skip to content

Commit b20b8f0

Browse files
committed
WIP widen Space
1 parent f40bb20 commit b20b8f0

File tree

1 file changed

+20
-22
lines changed
  • compiler/src/dotty/tools/dotc/transform/patmat

1 file changed

+20
-22
lines changed

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

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,7 @@ class SpaceEngine(using Context) extends SpaceLogic {
503503
else
504504
(pats, Typ(scalaNilType, false))
505505

506-
val unapplyTp = scalaConsType.classSymbol.companionModule.termRef.select(nme.unapply)
506+
val unapplyTp = scalaConsType.widen.classSymbol.companionModule.termRef.select(nme.unapply)
507507
items.foldRight[Space](zero) { (pat, acc) =>
508508
val consTp = scalaConsType.appliedTo(pats.head.tpe.widen)
509509
Prod(consTp, unapplyTp, project(pat) :: acc :: Nil, true)
@@ -613,10 +613,12 @@ class SpaceEngine(using Context) extends SpaceLogic {
613613
)
614614
case tp if tp.isRef(defn.UnitClass) =>
615615
Typ(ConstantType(Constant(())), true) :: Nil
616-
case tp if tp.classSymbol.isAllOf(JavaEnumTrait) =>
617-
tp.classSymbol.children.map(sym => Typ(sym.termRef, true))
616+
case tp: SingletonType =>
617+
Nil
618+
case tp if tp.widen.classSymbol.isAllOf(JavaEnumTrait) =>
619+
tp.widen.classSymbol.children.map(sym => Typ(sym.termRef, true))
618620
case tp =>
619-
val children = tp.classSymbol.children
621+
val children = tp.widen.classSymbol.children
620622
debug.println(s"candidates for ${tp.show} : [${children.map(_.show).mkString(", ")}]")
621623

622624
val parts = children.map { sym =>
@@ -645,26 +647,22 @@ class SpaceEngine(using Context) extends SpaceLogic {
645647

646648

647649
/** Abstract sealed types, or-types, Boolean and Java enums can be decomposed */
648-
def canDecompose(tp: Type): Boolean = {
649-
val dealiasedTp = tp.dealias
650-
val res =
651-
(tp.classSymbol.is(Sealed) &&
652-
tp.classSymbol.isOneOf(AbstractOrTrait) &&
653-
!tp.classSymbol.hasAnonymousChild &&
654-
tp.classSymbol.children.nonEmpty ) ||
655-
dealiasedTp.isInstanceOf[OrType] ||
656-
(dealiasedTp.isInstanceOf[AndType] && {
657-
val and = dealiasedTp.asInstanceOf[AndType]
658-
canDecompose(and.tp1) || canDecompose(and.tp2)
659-
}) ||
660-
tp.isRef(defn.BooleanClass) ||
661-
tp.isRef(defn.UnitClass) ||
662-
tp.classSymbol.isAllOf(JavaEnumTrait)
663-
650+
def canDecompose(tp: Type): Boolean =
651+
val res = tp.dealias match
652+
case _: SingletonType => false
653+
case _: OrType => true
654+
case and: AndType => canDecompose(and.tp1) || canDecompose(and.tp2)
655+
case _ =>
656+
val cls = tp.classSymbol
657+
cls.is(Sealed)
658+
&& cls.isOneOf(AbstractOrTrait)
659+
&& !cls.hasAnonymousChild
660+
&& cls.children.nonEmpty
661+
|| cls.isAllOf(JavaEnumTrait)
662+
|| tp.isRef(defn.BooleanClass)
663+
|| tp.isRef(defn.UnitClass)
664664
debug.println(s"decomposable: ${tp.show} = $res")
665-
666665
res
667-
}
668666

669667
/** Show friendly type name with current scope in mind
670668
*

0 commit comments

Comments
 (0)