@@ -648,45 +648,34 @@ class TypeComparer(initctx: Context) extends DotClass with ConstraintHandling wi
648648 // Tests around `matches`
649649
650650 /** A function implementing `tp1` matches `tp2`. */
651- final def matchesType (tp1 : Type , tp2 : Type , alwaysMatchSimple : Boolean ): Boolean = tp1 match {
651+ final def matchesType (tp1 : Type , tp2 : Type , relaxed : Boolean ): Boolean = tp1.widen match {
652652 case tp1 : MethodType =>
653- tp2 match {
653+ tp2.widen match {
654654 case tp2 : MethodType =>
655655 tp1.isImplicit == tp2.isImplicit &&
656656 matchingParams(tp1.paramTypes, tp2.paramTypes, tp1.isJava, tp2.isJava) &&
657- matchesType(tp1.resultType, tp2.resultType.subst(tp2, tp1), alwaysMatchSimple)
658- case tp2 : ExprType =>
659- tp1.paramNames.isEmpty &&
660- matchesType(tp1.resultType, tp2.resultType, alwaysMatchSimple)
661- case _ =>
662- false
663- }
664- case tp1 : ExprType =>
665- tp2 match {
666- case tp2 : MethodType =>
667- tp2.paramNames.isEmpty &&
668- matchesType(tp1.resultType, tp2.resultType, alwaysMatchSimple)
669- case tp2 : ExprType =>
670- matchesType(tp1.resultType, tp2.resultType, alwaysMatchSimple)
671- case _ =>
672- false // was: matchesType(tp1.resultType, tp2, alwaysMatchSimple)
657+ matchesType(tp1.resultType, tp2.resultType.subst(tp2, tp1), relaxed)
658+ case tp2 =>
659+ relaxed && tp1.paramNames.isEmpty &&
660+ matchesType(tp1.resultType, tp2, relaxed)
673661 }
674662 case tp1 : PolyType =>
675- tp2 match {
663+ tp2.widen match {
676664 case tp2 : PolyType =>
677665 sameLength(tp1.paramNames, tp2.paramNames) &&
678- matchesType(tp1.resultType, tp2.resultType.subst(tp2, tp1), alwaysMatchSimple )
666+ matchesType(tp1.resultType, tp2.resultType.subst(tp2, tp1), relaxed )
679667 case _ =>
680668 false
681669 }
682670 case _ =>
683- tp2 match {
684- case _ : MethodType | _ : PolyType =>
671+ tp2.widen match {
672+ case _ : PolyType =>
685673 false
686- case tp2 : ExprType =>
687- false // was: matchesType(tp1, tp2.resultType, alwaysMatchSimple)
688- case _ =>
689- alwaysMatchSimple || isSameType(tp1, tp2)
674+ case tp2 : MethodType =>
675+ relaxed && tp2.paramNames.isEmpty &&
676+ matchesType(tp1, tp2.resultType, relaxed)
677+ case tp2 =>
678+ relaxed || isSameType(tp1, tp2)
690679 }
691680 }
692681
0 commit comments