IR: fix SAM conversion for types with contravariant intersection argument type

In the added test, the problem was that the SAM type as computed by
`SamTypeFactory.createByValueParameter` was `Consumer<{BaseClass &
BaseInterface}>`, which was latter approximated in psi2ir during the
KotlinType->IrType conversion to `Consumer<out Any?>` (here:
https://github.com/JetBrains/kotlin/blob/3034d9d791cf1f9033104e12448e0d262d3bc3ce/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ArgumentsGenerationUtils.kt#L606),
because intersection type argument is approximated to `out Any?`.

To avoid this, replace intersection type in immediate arguments of a SAM
type with the common supertype of its components at the same place where
we're getting rid of projections.

 #KT-45945 Fixed
This commit is contained in:
Alexander Udalov
2021-04-09 15:26:47 +02:00
parent ac0af39660
commit e6c089ef40
16 changed files with 450 additions and 7 deletions
@@ -11225,6 +11225,21 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes
runTest("compiler/testData/codegen/box/funInterface/castFromAny.kt");
}
@TestMetadata("contravariantIntersectionType.kt")
public void testContravariantIntersectionType() throws Exception {
runTest("compiler/testData/codegen/box/funInterface/contravariantIntersectionType.kt");
}
@TestMetadata("contravariantIntersectionTypeWithNonTrivialCommonSupertype.kt")
public void testContravariantIntersectionTypeWithNonTrivialCommonSupertype() throws Exception {
runTest("compiler/testData/codegen/box/funInterface/contravariantIntersectionTypeWithNonTrivialCommonSupertype.kt");
}
@TestMetadata("contravariantIntersectionTypeWithNonTrivialCommonSupertype2.kt")
public void testContravariantIntersectionTypeWithNonTrivialCommonSupertype2() throws Exception {
runTest("compiler/testData/codegen/box/funInterface/contravariantIntersectionTypeWithNonTrivialCommonSupertype2.kt");
}
@TestMetadata("funConversionInVararg.kt")
public void testFunConversionInVararg() throws Exception {
runTest("compiler/testData/codegen/box/funInterface/funConversionInVararg.kt");
@@ -10646,6 +10646,21 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/funInterface/castFromAny.kt");
}
@TestMetadata("contravariantIntersectionType.kt")
public void testContravariantIntersectionType() throws Exception {
runTest("compiler/testData/codegen/box/funInterface/contravariantIntersectionType.kt");
}
@TestMetadata("contravariantIntersectionTypeWithNonTrivialCommonSupertype.kt")
public void testContravariantIntersectionTypeWithNonTrivialCommonSupertype() throws Exception {
runTest("compiler/testData/codegen/box/funInterface/contravariantIntersectionTypeWithNonTrivialCommonSupertype.kt");
}
@TestMetadata("contravariantIntersectionTypeWithNonTrivialCommonSupertype2.kt")
public void testContravariantIntersectionTypeWithNonTrivialCommonSupertype2() throws Exception {
runTest("compiler/testData/codegen/box/funInterface/contravariantIntersectionTypeWithNonTrivialCommonSupertype2.kt");
}
@TestMetadata("funConversionInVararg.kt")
public void testFunConversionInVararg() throws Exception {
runTest("compiler/testData/codegen/box/funInterface/funConversionInVararg.kt");
@@ -10646,6 +10646,21 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/funInterface/castFromAny.kt");
}
@TestMetadata("contravariantIntersectionType.kt")
public void testContravariantIntersectionType() throws Exception {
runTest("compiler/testData/codegen/box/funInterface/contravariantIntersectionType.kt");
}
@TestMetadata("contravariantIntersectionTypeWithNonTrivialCommonSupertype.kt")
public void testContravariantIntersectionTypeWithNonTrivialCommonSupertype() throws Exception {
runTest("compiler/testData/codegen/box/funInterface/contravariantIntersectionTypeWithNonTrivialCommonSupertype.kt");
}
@TestMetadata("contravariantIntersectionTypeWithNonTrivialCommonSupertype2.kt")
public void testContravariantIntersectionTypeWithNonTrivialCommonSupertype2() throws Exception {
runTest("compiler/testData/codegen/box/funInterface/contravariantIntersectionTypeWithNonTrivialCommonSupertype2.kt");
}
@TestMetadata("funConversionInVararg.kt")
public void testFunConversionInVararg() throws Exception {
runTest("compiler/testData/codegen/box/funInterface/funConversionInVararg.kt");
@@ -5371,6 +5371,21 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest
runTest("compiler/testData/codegen/box/funInterface/basicFunInterface.kt");
}
@TestMetadata("contravariantIntersectionType.kt")
public void testContravariantIntersectionType() throws Exception {
runTest("compiler/testData/codegen/box/funInterface/contravariantIntersectionType.kt");
}
@TestMetadata("contravariantIntersectionTypeWithNonTrivialCommonSupertype.kt")
public void testContravariantIntersectionTypeWithNonTrivialCommonSupertype() throws Exception {
runTest("compiler/testData/codegen/box/funInterface/contravariantIntersectionTypeWithNonTrivialCommonSupertype.kt");
}
@TestMetadata("contravariantIntersectionTypeWithNonTrivialCommonSupertype2.kt")
public void testContravariantIntersectionTypeWithNonTrivialCommonSupertype2() throws Exception {
runTest("compiler/testData/codegen/box/funInterface/contravariantIntersectionTypeWithNonTrivialCommonSupertype2.kt");
}
@TestMetadata("compiler/testData/codegen/box/funInterface/equality")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)