[K2, MPP] Fix actualization of nullability-based overloads

^KT-58043 Fixed
This commit is contained in:
Ivan Kochurkin
2023-04-19 22:12:42 +02:00
committed by Space Team
parent c5b60a16bb
commit b72dcf8b37
17 changed files with 122 additions and 3 deletions
@@ -33467,6 +33467,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt"); runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt");
} }
@Test
@TestMetadata("expectActualNullabilityBasedOverloads.kt")
public void testExpectActualNullabilityBasedOverloads() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualNullabilityBasedOverloads.kt");
}
@Test @Test
@TestMetadata("expectActualOverloads.kt") @TestMetadata("expectActualOverloads.kt")
public void testExpectActualOverloads() throws Exception { public void testExpectActualOverloads() throws Exception {
@@ -33467,6 +33467,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt"); runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt");
} }
@Test
@TestMetadata("expectActualNullabilityBasedOverloads.kt")
public void testExpectActualNullabilityBasedOverloads() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualNullabilityBasedOverloads.kt");
}
@Test @Test
@TestMetadata("expectActualOverloads.kt") @TestMetadata("expectActualOverloads.kt")
public void testExpectActualOverloads() throws Exception { public void testExpectActualOverloads() throws Exception {
@@ -15,12 +15,16 @@ import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
import org.jetbrains.kotlin.ir.types.IrDynamicType import org.jetbrains.kotlin.ir.types.IrDynamicType
import org.jetbrains.kotlin.ir.types.classifierOrFail import org.jetbrains.kotlin.ir.types.classifierOrFail
import org.jetbrains.kotlin.ir.types.isNullable
import org.jetbrains.kotlin.ir.util.hasAnnotation import org.jetbrains.kotlin.ir.util.hasAnnotation
import org.jetbrains.kotlin.ir.util.kotlinFqName import org.jetbrains.kotlin.ir.util.kotlinFqName
import org.jetbrains.kotlin.ir.util.module import org.jetbrains.kotlin.ir.util.module
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.StandardClassIds
import org.jetbrains.kotlin.resolve.multiplatform.OptionalAnnotationUtil import org.jetbrains.kotlin.resolve.multiplatform.OptionalAnnotationUtil
private val FLEXIBLE_NULLABILITY_ANNOTATION_FQ_NAME = StandardClassIds.Annotations.FlexibleNullability.asSingleFqName()
internal fun Map<String, List<IrDeclaration>>.getMatches( internal fun Map<String, List<IrDeclaration>>.getMatches(
expectDeclaration: IrDeclaration, expectDeclaration: IrDeclaration,
expectActualTypesMap: Map<IrSymbol, IrSymbol>, expectActualTypesMap: Map<IrSymbol, IrSymbol>,
@@ -44,7 +48,7 @@ private inline fun List<IrDeclaration>.getMatches(
} }
private fun IrFunction.match(actualFunction: IrFunction, expectActualTypesMap: Map<IrSymbol, IrSymbol>): Boolean { private fun IrFunction.match(actualFunction: IrFunction, expectActualTypesMap: Map<IrSymbol, IrSymbol>): Boolean {
fun getActualizedValueParameterSymbol( fun getActualizedTypeClassifierSymbol(
expectParameter: IrValueParameter, expectParameter: IrValueParameter,
localTypeParametersMap: Map<IrTypeParameterSymbol, IrTypeParameterSymbol>? = null localTypeParametersMap: Map<IrTypeParameterSymbol, IrTypeParameterSymbol>? = null
): IrSymbol { ): IrSymbol {
@@ -74,8 +78,15 @@ private fun IrFunction.match(actualFunction: IrFunction, expectActualTypesMap: M
return true return true
} }
if (getActualizedValueParameterSymbol(expectParameter, localTypeParametersMap) != if (expectParameter.type.isNullable() != actualParameter.type.isNullable() &&
getActualizedValueParameterSymbol(actualParameter) !expectParameter.type.annotations.hasAnnotation(FLEXIBLE_NULLABILITY_ANNOTATION_FQ_NAME) &&
!actualParameter.type.annotations.hasAnnotation(FLEXIBLE_NULLABILITY_ANNOTATION_FQ_NAME)
) {
return false
}
if (getActualizedTypeClassifierSymbol(expectParameter, localTypeParametersMap) !=
getActualizedTypeClassifierSymbol(actualParameter)
) { ) {
return false return false
} }
@@ -0,0 +1,20 @@
// IGNORE_BACKEND: JVM, JVM_IR
// IGNORE_BACKEND_K1: JS, JS_IR, JS_IR_ES6, NATIVE
// !LANGUAGE: +MultiPlatformProjects
// MODULE: common
// FILE: common.kt
expect fun o(x: String?): String?
expect fun k(x: String?): String?
fun box() = o(null) + k(null)
// MODULE: platform()()(common)
// FILE: platform.kt
fun o(x: String) = ""
actual fun o(x: String?): String? = "O"
actual fun k(x: String?): String? = "K"
fun k(x: String) = ""
@@ -32027,6 +32027,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt"); runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt");
} }
@Test
@TestMetadata("expectActualNullabilityBasedOverloads.kt")
public void testExpectActualNullabilityBasedOverloads() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualNullabilityBasedOverloads.kt");
}
@Test @Test
@TestMetadata("expectActualOverloads.kt") @TestMetadata("expectActualOverloads.kt")
public void testExpectActualOverloads() throws Exception { public void testExpectActualOverloads() throws Exception {
@@ -33467,6 +33467,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt"); runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt");
} }
@Test
@TestMetadata("expectActualNullabilityBasedOverloads.kt")
public void testExpectActualNullabilityBasedOverloads() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualNullabilityBasedOverloads.kt");
}
@Test @Test
@TestMetadata("expectActualOverloads.kt") @TestMetadata("expectActualOverloads.kt")
public void testExpectActualOverloads() throws Exception { public void testExpectActualOverloads() throws Exception {
@@ -33467,6 +33467,12 @@ public class IrBlackBoxCodegenWithIrInlinerTestGenerated extends AbstractIrBlack
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt"); runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt");
} }
@Test
@TestMetadata("expectActualNullabilityBasedOverloads.kt")
public void testExpectActualNullabilityBasedOverloads() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualNullabilityBasedOverloads.kt");
}
@Test @Test
@TestMetadata("expectActualOverloads.kt") @TestMetadata("expectActualOverloads.kt")
public void testExpectActualOverloads() throws Exception { public void testExpectActualOverloads() throws Exception {
@@ -27225,6 +27225,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
@TestDataPath("$PROJECT_ROOT") @TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class) @RunWith(JUnit3RunnerWithInners.class)
public static class Basic extends AbstractLightAnalysisModeTest { public static class Basic extends AbstractLightAnalysisModeTest {
@TestMetadata("expectActualNullabilityBasedOverloads.kt")
public void ignoreExpectActualNullabilityBasedOverloads() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualNullabilityBasedOverloads.kt");
}
@TestMetadata("expectProperty.kt") @TestMetadata("expectProperty.kt")
public void ignoreExpectProperty() throws Exception { public void ignoreExpectProperty() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectProperty.kt"); runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectProperty.kt");
@@ -23245,6 +23245,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt"); runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt");
} }
@Test
@TestMetadata("expectActualNullabilityBasedOverloads.kt")
public void testExpectActualNullabilityBasedOverloads() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualNullabilityBasedOverloads.kt");
}
@Test @Test
@TestMetadata("expectActualOverloads.kt") @TestMetadata("expectActualOverloads.kt")
public void testExpectActualOverloads() throws Exception { public void testExpectActualOverloads() throws Exception {
@@ -23383,6 +23383,12 @@ public class FirJsCodegenBoxTestGenerated extends AbstractFirJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt"); runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt");
} }
@Test
@TestMetadata("expectActualNullabilityBasedOverloads.kt")
public void testExpectActualNullabilityBasedOverloads() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualNullabilityBasedOverloads.kt");
}
@Test @Test
@TestMetadata("expectActualOverloads.kt") @TestMetadata("expectActualOverloads.kt")
public void testExpectActualOverloads() throws Exception { public void testExpectActualOverloads() throws Exception {
@@ -23383,6 +23383,12 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt"); runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt");
} }
@Test
@TestMetadata("expectActualNullabilityBasedOverloads.kt")
public void testExpectActualNullabilityBasedOverloads() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualNullabilityBasedOverloads.kt");
}
@Test @Test
@TestMetadata("expectActualOverloads.kt") @TestMetadata("expectActualOverloads.kt")
public void testExpectActualOverloads() throws Exception { public void testExpectActualOverloads() throws Exception {
@@ -23383,6 +23383,12 @@ public class IrJsES6CodegenBoxTestGenerated extends AbstractIrJsES6CodegenBoxTes
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt"); runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt");
} }
@Test
@TestMetadata("expectActualNullabilityBasedOverloads.kt")
public void testExpectActualNullabilityBasedOverloads() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualNullabilityBasedOverloads.kt");
}
@Test @Test
@TestMetadata("expectActualOverloads.kt") @TestMetadata("expectActualOverloads.kt")
public void testExpectActualOverloads() throws Exception { public void testExpectActualOverloads() throws Exception {
@@ -26809,6 +26809,12 @@ public class FirNativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTe
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt"); runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt");
} }
@Test
@TestMetadata("expectActualNullabilityBasedOverloads.kt")
public void testExpectActualNullabilityBasedOverloads() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualNullabilityBasedOverloads.kt");
}
@Test @Test
@TestMetadata("expectActualOverloads.kt") @TestMetadata("expectActualOverloads.kt")
public void testExpectActualOverloads() throws Exception { public void testExpectActualOverloads() throws Exception {
@@ -27419,6 +27419,12 @@ public class FirNativeCodegenBoxTestNoPLGenerated extends AbstractNativeCodegenB
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt"); runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt");
} }
@Test
@TestMetadata("expectActualNullabilityBasedOverloads.kt")
public void testExpectActualNullabilityBasedOverloads() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualNullabilityBasedOverloads.kt");
}
@Test @Test
@TestMetadata("expectActualOverloads.kt") @TestMetadata("expectActualOverloads.kt")
public void testExpectActualOverloads() throws Exception { public void testExpectActualOverloads() throws Exception {
@@ -26504,6 +26504,12 @@ public class NativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTest
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt"); runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt");
} }
@Test
@TestMetadata("expectActualNullabilityBasedOverloads.kt")
public void testExpectActualNullabilityBasedOverloads() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualNullabilityBasedOverloads.kt");
}
@Test @Test
@TestMetadata("expectActualOverloads.kt") @TestMetadata("expectActualOverloads.kt")
public void testExpectActualOverloads() throws Exception { public void testExpectActualOverloads() throws Exception {
@@ -27114,6 +27114,12 @@ public class NativeCodegenBoxTestNoPLGenerated extends AbstractNativeCodegenBoxT
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt"); runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt");
} }
@Test
@TestMetadata("expectActualNullabilityBasedOverloads.kt")
public void testExpectActualNullabilityBasedOverloads() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualNullabilityBasedOverloads.kt");
}
@Test @Test
@TestMetadata("expectActualOverloads.kt") @TestMetadata("expectActualOverloads.kt")
public void testExpectActualOverloads() throws Exception { public void testExpectActualOverloads() throws Exception {
@@ -20811,6 +20811,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt"); runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualMultiCommon.kt");
} }
@TestMetadata("expectActualNullabilityBasedOverloads.kt")
public void testExpectActualNullabilityBasedOverloads() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualNullabilityBasedOverloads.kt");
}
@TestMetadata("expectActualOverloads.kt") @TestMetadata("expectActualOverloads.kt")
public void testExpectActualOverloads() throws Exception { public void testExpectActualOverloads() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualOverloads.kt"); runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualOverloads.kt");