@@ -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