[FE 1.0] Don't throw empty intersection exception, return empty intersection type instead

This commit is contained in:
Victor Petukhov
2022-07-01 14:01:09 +02:00
committed by teamcity
parent a798fe0b18
commit 5b5da025f4
7 changed files with 91 additions and 1 deletions
@@ -13670,6 +13670,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti
runTest("compiler/testData/diagnostics/tests/inference/discardInapplicableCandidateWithNotSatisfyingSelfType.kt");
}
@Test
@TestMetadata("dontThrowEmptyIntersectionException.kt")
public void testDontThrowEmptyIntersectionException() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/dontThrowEmptyIntersectionException.kt");
}
@Test
@TestMetadata("equalitySubstitutionInsideNonInvariantType.kt")
public void testEqualitySubstitutionInsideNonInvariantType() throws Exception {
@@ -13670,6 +13670,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac
runTest("compiler/testData/diagnostics/tests/inference/discardInapplicableCandidateWithNotSatisfyingSelfType.kt");
}
@Test
@TestMetadata("dontThrowEmptyIntersectionException.kt")
public void testDontThrowEmptyIntersectionException() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/dontThrowEmptyIntersectionException.kt");
}
@Test
@TestMetadata("equalitySubstitutionInsideNonInvariantType.kt")
public void testEqualitySubstitutionInsideNonInvariantType() throws Exception {
@@ -29,6 +29,7 @@ import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemBuilderImpl;
import org.jetbrains.kotlin.types.checker.KotlinTypeChecker;
import org.jetbrains.kotlin.types.error.ErrorTypeKind;
import org.jetbrains.kotlin.types.error.ErrorUtils;
import org.jetbrains.kotlin.types.typeUtil.TypeUtilsKt;
import java.util.*;
@@ -124,7 +125,7 @@ public class TypeIntersector {
}
if (bestRepresentative == null) {
throw new AssertionError("Empty intersection for types " + types);
return null;
}
return TypeUtils.makeNullableAsSpecified(bestRepresentative, allNullable);
}
@@ -0,0 +1,22 @@
// WITH_STDLIB
// FILE: Test.java
public interface Test<K> implements I<String> {}
// FILE: Test2.java
public interface Test2<K, M>
// FILE: Test3.java
public interface Test3<K> {}
// FILE: I.java
public interface I<K> {}
// FILE: main.kt
fun main(z: I<String>) {
z <!UNCHECKED_CAST!>as Test<Test2<Int, *>><!>
z <!UNCHECKED_CAST!>as Test<Test2<Int, <!UNRESOLVED_REFERENCE!>Foo<!>>><!>
z as Test<<!UNRESOLVED_REFERENCE!>Foo<!>>
z as <!UNRESOLVED_REFERENCE!>Any2<!>
println(z)
}
@@ -0,0 +1,22 @@
// WITH_STDLIB
// FILE: Test.java
public interface Test<K> implements I<String> {}
// FILE: Test2.java
public interface Test2<K, M>
// FILE: Test3.java
public interface Test3<K> {}
// FILE: I.java
public interface I<K> {}
// FILE: main.kt
fun main(z: I<String>) {
z <!UNCHECKED_CAST!>as Test<Test2<Int, *>><!>
z <!USELESS_CAST!>as Test<Test2<Int, <!UNRESOLVED_REFERENCE!>Foo<!>>><!>
z <!USELESS_CAST!>as Test<<!UNRESOLVED_REFERENCE!>Foo<!>><!>
z as <!UNRESOLVED_REFERENCE!>Any2<!>
println(z)
}
@@ -0,0 +1,27 @@
package
public fun main(/*0*/ z: I<kotlin.String>): kotlin.Unit
public interface I</*0*/ K : kotlin.Any!> {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public interface Test</*0*/ K : kotlin.Any!> : I<kotlin.String!> {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public interface Test2</*0*/ K : kotlin.Any!, /*1*/ M : kotlin.Any!> {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public interface Test3</*0*/ K : kotlin.Any!> {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -13676,6 +13676,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
runTest("compiler/testData/diagnostics/tests/inference/discardInapplicableCandidateWithNotSatisfyingSelfType.kt");
}
@Test
@TestMetadata("dontThrowEmptyIntersectionException.kt")
public void testDontThrowEmptyIntersectionException() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/dontThrowEmptyIntersectionException.kt");
}
@Test
@TestMetadata("equalitySubstitutionInsideNonInvariantType.kt")
public void testEqualitySubstitutionInsideNonInvariantType() throws Exception {