try intersection of upper bounds as a suggestion

not each bound itself
while resolving constraint system
This commit is contained in:
Svetlana Isakova
2013-09-27 13:53:27 +04:00
parent 8a4afb9330
commit 65e2f47bc3
4 changed files with 57 additions and 3 deletions
@@ -0,0 +1,30 @@
package s
trait In<in T>
trait A
trait B
trait C: A, B
fun <T> foo(in1: In<T>, in2: In<T>): T = throw Exception("$in1 $in2")
fun test(inA: In<A>, inB: In<B>, inC: In<C>) {
<!TYPE_INFERENCE_CONFLICTING_SUBSTITUTIONS!>foo<!>(inA, inB)
val r = foo(inA, inC)
r: C
val c: C = foo(inA, inB)
use(c)
}
fun <T: C> bar(in1: In<T>): T = throw Exception("$in1")
fun test(inA: In<A>) {
val r = bar(inA)
r: C
}
fun use(vararg a: Any?) = a
@@ -0,0 +1,13 @@
fun <R : Any> unescape(value: Any): R? = throw Exception("$value")
fun <T: Any> foo(v: Any): T? = unescape(v)
//--------------
trait A
fun <R : A> unescapeA(value: Any): R? = throw Exception("$value")
fun <T: A> fooA(v: Any): T? = unescapeA(v)
@@ -3542,11 +3542,21 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage
doTest("compiler/testData/diagnostics/tests/inference/upperBounds/doNotInferFromBoundsOnly.kt");
}
@TestMetadata("intersectUpperBounds.kt")
public void testIntersectUpperBounds() throws Exception {
doTest("compiler/testData/diagnostics/tests/inference/upperBounds/intersectUpperBounds.kt");
}
@TestMetadata("kt2856.kt")
public void testKt2856() throws Exception {
doTest("compiler/testData/diagnostics/tests/inference/upperBounds/kt2856.kt");
}
@TestMetadata("nonNullUpperBound.kt")
public void testNonNullUpperBound() throws Exception {
doTest("compiler/testData/diagnostics/tests/inference/upperBounds/nonNullUpperBound.kt");
}
@TestMetadata("useBoundsIfUnknownParameters.kt")
public void testUseBoundsIfUnknownParameters() throws Exception {
doTest("compiler/testData/diagnostics/tests/inference/upperBounds/useBoundsIfUnknownParameters.kt");
@@ -186,9 +186,10 @@ public class TypeConstraintsImpl implements TypeConstraints {
ContainerUtil.addIfNotNull(superTypeOfLowerBounds, values);
Set<JetType> upperBounds = filterBounds(constraints, BoundKind.UPPER_BOUND, values);
for (JetType upperBound : upperBounds) {
if (trySuggestion(upperBound, constraints)) {
return Collections.singleton(upperBound);
JetType intersectionOfUpperBounds = TypeUtils.intersect(JetTypeChecker.INSTANCE, upperBounds);
if (!upperBounds.isEmpty() && intersectionOfUpperBounds != null) {
if (trySuggestion(intersectionOfUpperBounds, constraints)) {
return Collections.singleton(intersectionOfUpperBounds);
}
}
//todo