@@ -703,18 +703,31 @@ class SpaceEngine(implicit ctx: Context) extends SpaceLogic {
703
703
parent.argInfos.nonEmpty && minTypeMap.apply(parent) <:< maxTypeMap.apply(tp2)
704
704
}
705
705
706
- if (protoTp1 <:< tp2) {
707
- if (isFullyDefined(protoTp1, force)) protoTp1
708
- else instUndetMap.apply(protoTp1)
706
+ val sub1 = isSubType(protoTp1, tp2)
707
+ debug.println(s " Space.instantiate: protoTp1( $protoTp1 ${protoTp1.show}) <:< tp2( $tp2 ${tp2.show}) = $sub1" )
708
+ def determine (comparer : Type , protoTp1 : Type ): Type = {
709
+ debug.println(i " Space.instantiate: isFullyDefined( $comparer) = ... " )
710
+ val determined = isFullyDefined(comparer, force)
711
+ debug.println(i " Space.instantiate: isFullyDefined( $comparer) = $determined" )
712
+ if (determined) protoTp1
713
+ else {
714
+ val res = instUndetMap.apply(protoTp1)
715
+ debug.println(i " Space.instantiate: instUndetMap.apply(protoTp1( $protoTp1)) -> $res" )
716
+ res
717
+ }
718
+ }
719
+
720
+ if (sub1) {
721
+ determine(protoTp1, protoTp1)
709
722
}
710
723
else {
711
724
val protoTp2 = maxTypeMap.apply(tp2)
712
- if (protoTp1 <:< protoTp2 || parentQualify) {
713
- if (isFullyDefined(AndType (protoTp1, protoTp2), force)) protoTp1
714
- else instUndetMap.apply(protoTp1)
725
+ val sub2 = protoTp1 <:< protoTp2
726
+ debug.println(s " Space.instantiate: protoTp1( $protoTp1 ${protoTp1.show}) <:< protoTp2( $protoTp2 ${protoTp2.show}) = $sub2" )
727
+ if (sub2 || parentQualify) {
728
+ determine(AndType (protoTp1, protoTp2), protoTp1)
715
729
}
716
730
else {
717
- debug.println(s " $protoTp1 <:< $protoTp2 = false " )
718
731
NoType
719
732
}
720
733
}
0 commit comments