@@ -503,7 +503,7 @@ class SpaceEngine(using Context) extends SpaceLogic {
503
503
else
504
504
(pats, Typ (scalaNilType, false ))
505
505
506
- val unapplyTp = scalaConsType.classSymbol.companionModule.termRef.select(nme.unapply)
506
+ val unapplyTp = scalaConsType.widen. classSymbol.companionModule.termRef.select(nme.unapply)
507
507
items.foldRight[Space ](zero) { (pat, acc) =>
508
508
val consTp = scalaConsType.appliedTo(pats.head.tpe.widen)
509
509
Prod (consTp, unapplyTp, project(pat) :: acc :: Nil , true )
@@ -613,10 +613,12 @@ class SpaceEngine(using Context) extends SpaceLogic {
613
613
)
614
614
case tp if tp.isRef(defn.UnitClass ) =>
615
615
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 ))
618
620
case tp =>
619
- val children = tp.classSymbol.children
621
+ val children = tp.widen. classSymbol.children
620
622
debug.println(s " candidates for ${tp.show} : [ ${children.map(_.show).mkString(" , " )}] " )
621
623
622
624
val parts = children.map { sym =>
@@ -645,26 +647,22 @@ class SpaceEngine(using Context) extends SpaceLogic {
645
647
646
648
647
649
/** 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 )
664
664
debug.println(s " decomposable: ${tp.show} = $res" )
665
-
666
665
res
667
- }
668
666
669
667
/** Show friendly type name with current scope in mind
670
668
*
0 commit comments