Do not overuse makeNullableAsSpecified in TypeSubstitutor

This commit is contained in:
Andrey Breslav
2014-08-27 12:51:49 +04:00
parent 920769d36d
commit 364a7a6574
3 changed files with 31 additions and 2 deletions
@@ -0,0 +1,24 @@
// FILE: p/MultiMap.java
package p;
import java.util.*;
public class MultiMap<K, V> {
public Set<Collection<V>> entrySet() {
return null;
}
}
// FILE: k.kt
import p.*
fun test() {
val map = MultiMap<Int, String>()
val set = map.entrySet()
set.iterator()
val set1 = map.entrySet()!!
set1.iterator()
}
@@ -7779,6 +7779,11 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/tests/platformTypes/methodCall"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("entrySet.kt")
public void testEntrySet() throws Exception {
doTest("compiler/testData/diagnostics/tests/platformTypes/methodCall/entrySet.kt");
}
@TestMetadata("int.kt")
public void testInt() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/platformTypes/methodCall/int.kt");
@@ -191,8 +191,8 @@ public class TypeSubstitutor {
substitutedType = typeVariable.substitutionResult(replacement.getType());
}
else {
boolean resultingIsNullable = type.isNullable() || replacement.getType().isNullable();
substitutedType = TypeUtils.makeNullableAsSpecified(replacement.getType(), resultingIsNullable);
// this is a simple type T or T?: if it's T, we should just take replacement, if T? - we make replacement nullable
substitutedType = type.isNullable() ? TypeUtils.makeNullable(replacement.getType()) : replacement.getType();
}
Variance resultingProjectionKind = combine(originalProjectionKind, replacement.getProjectionKind());