FIR: Fix hanging inference case with intersection types
This commit is contained in:
+16
@@ -0,0 +1,16 @@
|
|||||||
|
// FILE: MyList.java
|
||||||
|
public interface MyList<E> extends java.util.List<E>, I {}
|
||||||
|
|
||||||
|
// FILE: main.kt
|
||||||
|
|
||||||
|
fun <R> elemAndList(r: R, t: MutableList<R>): R = TODO()
|
||||||
|
|
||||||
|
interface I
|
||||||
|
class A : Comparable<A>, I
|
||||||
|
class B : Comparable<B>, I
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
elemAndList(A(), list(B()))
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T> list(value: T): MyList<T> = TODO()
|
||||||
+24
@@ -0,0 +1,24 @@
|
|||||||
|
FILE: main.kt
|
||||||
|
public final fun <R> elemAndList(r: R|R|, t: R|kotlin/collections/MutableList<R>|): R|R| {
|
||||||
|
^elemAndList R|kotlin/TODO|()
|
||||||
|
}
|
||||||
|
public abstract interface I : R|kotlin/Any| {
|
||||||
|
}
|
||||||
|
public final class A : R|kotlin/Comparable<A>|, R|I| {
|
||||||
|
public constructor(): R|A| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
public final class B : R|kotlin/Comparable<B>|, R|I| {
|
||||||
|
public constructor(): R|B| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
public final fun test(): R|kotlin/Unit| {
|
||||||
|
R|/elemAndList|<R|ft<it(kotlin/Comparable<it(A & B)> & I), it(kotlin/Comparable<it(A & B)>? & I?)>|>(R|/A.A|(), R|/list|<R|ft<it(kotlin/Comparable<it(A & B)> & I), it(kotlin/Comparable<it(A & B)>? & I?)>|>(R|/B.B|()))
|
||||||
|
}
|
||||||
|
public final fun <T> list(value: R|T|): R|MyList<T>| {
|
||||||
|
^list R|kotlin/TODO|()
|
||||||
|
}
|
||||||
Generated
+5
@@ -1351,6 +1351,11 @@ public class FirDiagnosticsTestGenerated extends AbstractFirDiagnosticsTest {
|
|||||||
runTest("compiler/fir/analysis-tests/testData/resolve/inference/extensionCallableReferences.kt");
|
runTest("compiler/fir/analysis-tests/testData/resolve/inference/extensionCallableReferences.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("intersectionTypesInConstraints.kt")
|
||||||
|
public void testIntersectionTypesInConstraints() throws Exception {
|
||||||
|
runTest("compiler/fir/analysis-tests/testData/resolve/inference/intersectionTypesInConstraints.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("lambdaAsReturnStatementOfLambda.kt")
|
@TestMetadata("lambdaAsReturnStatementOfLambda.kt")
|
||||||
public void testLambdaAsReturnStatementOfLambda() throws Exception {
|
public void testLambdaAsReturnStatementOfLambda() throws Exception {
|
||||||
runTest("compiler/fir/analysis-tests/testData/resolve/inference/lambdaAsReturnStatementOfLambda.kt");
|
runTest("compiler/fir/analysis-tests/testData/resolve/inference/lambdaAsReturnStatementOfLambda.kt");
|
||||||
|
|||||||
+5
@@ -1351,6 +1351,11 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos
|
|||||||
runTest("compiler/fir/analysis-tests/testData/resolve/inference/extensionCallableReferences.kt");
|
runTest("compiler/fir/analysis-tests/testData/resolve/inference/extensionCallableReferences.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("intersectionTypesInConstraints.kt")
|
||||||
|
public void testIntersectionTypesInConstraints() throws Exception {
|
||||||
|
runTest("compiler/fir/analysis-tests/testData/resolve/inference/intersectionTypesInConstraints.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("lambdaAsReturnStatementOfLambda.kt")
|
@TestMetadata("lambdaAsReturnStatementOfLambda.kt")
|
||||||
public void testLambdaAsReturnStatementOfLambda() throws Exception {
|
public void testLambdaAsReturnStatementOfLambda() throws Exception {
|
||||||
runTest("compiler/fir/analysis-tests/testData/resolve/inference/lambdaAsReturnStatementOfLambda.kt");
|
runTest("compiler/fir/analysis-tests/testData/resolve/inference/lambdaAsReturnStatementOfLambda.kt");
|
||||||
|
|||||||
@@ -195,6 +195,25 @@ class ConeIntersectionType(
|
|||||||
|
|
||||||
override val nullability: ConeNullability
|
override val nullability: ConeNullability
|
||||||
get() = ConeNullability.NOT_NULL
|
get() = ConeNullability.NOT_NULL
|
||||||
|
|
||||||
|
private var hashCode = 0
|
||||||
|
|
||||||
|
override fun equals(other: Any?): Boolean {
|
||||||
|
if (this === other) return true
|
||||||
|
if (javaClass != other?.javaClass) return false
|
||||||
|
|
||||||
|
other as ConeIntersectionType
|
||||||
|
|
||||||
|
if (intersectedTypes != other.intersectedTypes) return false
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun hashCode(): Int {
|
||||||
|
if (hashCode != 0) return hashCode
|
||||||
|
return intersectedTypes.hashCode().also { hashCode = it }
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun ConeIntersectionType.mapTypes(func: (ConeKotlinType) -> ConeKotlinType): ConeIntersectionType {
|
fun ConeIntersectionType.mapTypes(func: (ConeKotlinType) -> ConeKotlinType): ConeIntersectionType {
|
||||||
|
|||||||
Reference in New Issue
Block a user