@@ -644,45 +644,34 @@ class TypeComparer(initctx: Context) extends DotClass with ConstraintHandling wi
644644 // Tests around `matches`
645645
646646 /** A function implementing `tp1` matches `tp2`. */
647- final def matchesType (tp1 : Type , tp2 : Type , alwaysMatchSimple : Boolean ): Boolean = tp1 match {
647+ final def matchesType (tp1 : Type , tp2 : Type , relaxed : Boolean ): Boolean = tp1.widen match {
648648 case tp1 : MethodType =>
649- tp2 match {
649+ tp2.widen match {
650650 case tp2 : MethodType =>
651651 tp1.isImplicit == tp2.isImplicit &&
652652 matchingParams(tp1.paramTypes, tp2.paramTypes, tp1.isJava, tp2.isJava) &&
653- matchesType(tp1.resultType, tp2.resultType.subst(tp2, tp1), alwaysMatchSimple)
654- case tp2 : ExprType =>
655- tp1.paramNames.isEmpty &&
656- matchesType(tp1.resultType, tp2.resultType, alwaysMatchSimple)
657- case _ =>
658- false
659- }
660- case tp1 : ExprType =>
661- tp2 match {
662- case tp2 : MethodType =>
663- tp2.paramNames.isEmpty &&
664- matchesType(tp1.resultType, tp2.resultType, alwaysMatchSimple)
665- case tp2 : ExprType =>
666- matchesType(tp1.resultType, tp2.resultType, alwaysMatchSimple)
667- case _ =>
668- false // was: matchesType(tp1.resultType, tp2, alwaysMatchSimple)
653+ matchesType(tp1.resultType, tp2.resultType.subst(tp2, tp1), relaxed)
654+ case tp2 =>
655+ relaxed && tp1.paramNames.isEmpty &&
656+ matchesType(tp1.resultType, tp2, relaxed)
669657 }
670658 case tp1 : PolyType =>
671- tp2 match {
659+ tp2.widen match {
672660 case tp2 : PolyType =>
673661 sameLength(tp1.paramNames, tp2.paramNames) &&
674- matchesType(tp1.resultType, tp2.resultType.subst(tp2, tp1), alwaysMatchSimple )
662+ matchesType(tp1.resultType, tp2.resultType.subst(tp2, tp1), relaxed )
675663 case _ =>
676664 false
677665 }
678666 case _ =>
679- tp2 match {
680- case _ : MethodType | _ : PolyType =>
667+ tp2.widen match {
668+ case _ : PolyType =>
681669 false
682- case tp2 : ExprType =>
683- false // was: matchesType(tp1, tp2.resultType, alwaysMatchSimple)
684- case _ =>
685- alwaysMatchSimple || isSameType(tp1, tp2)
670+ case tp2 : MethodType =>
671+ relaxed && tp2.paramNames.isEmpty &&
672+ matchesType(tp1, tp2.resultType, relaxed)
673+ case tp2 =>
674+ relaxed || isSameType(tp1, tp2)
686675 }
687676 }
688677
0 commit comments