[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");
}
@Test
@TestMetadata("expectActualNullabilityBasedOverloads.kt")
public void testExpectActualNullabilityBasedOverloads() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualNullabilityBasedOverloads.kt");
}
@Test
@TestMetadata("expectActualOverloads.kt")
public void testExpectActualOverloads() throws Exception {
@@ -33467,6 +33467,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo
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
@TestMetadata("expectActualOverloads.kt")
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.types.IrDynamicType
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.kotlinFqName
import org.jetbrains.kotlin.ir.util.module
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.StandardClassIds
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(
expectDeclaration: IrDeclaration,
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 {
fun getActualizedValueParameterSymbol(
fun getActualizedTypeClassifierSymbol(
expectParameter: IrValueParameter,
localTypeParametersMap: Map<IrTypeParameterSymbol, IrTypeParameterSymbol>? = null
): IrSymbol {
@@ -74,8 +78,15 @@ private fun IrFunction.match(actualFunction: IrFunction, expectActualTypesMap: M
return true
}
if (getActualizedValueParameterSymbol(expectParameter, localTypeParametersMap) !=
getActualizedValueParameterSymbol(actualParameter)
if (expectParameter.type.isNullable() != actualParameter.type.isNullable() &&
!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
}
@@ -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");
}
@Test
@TestMetadata("expectActualNullabilityBasedOverloads.kt")
public void testExpectActualNullabilityBasedOverloads() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualNullabilityBasedOverloads.kt");
}
@Test
@TestMetadata("expectActualOverloads.kt")
public void testExpectActualOverloads() throws Exception {
@@ -33467,6 +33467,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
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
@TestMetadata("expectActualOverloads.kt")
public void testExpectActualOverloads() throws Exception {
@@ -33467,6 +33467,12 @@ public class IrBlackBoxCodegenWithIrInlinerTestGenerated extends AbstractIrBlack
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
@TestMetadata("expectActualOverloads.kt")
public void testExpectActualOverloads() throws Exception {
@@ -27225,6 +27225,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
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")
public void ignoreExpectProperty() throws Exception {
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");
}
@Test
@TestMetadata("expectActualNullabilityBasedOverloads.kt")
public void testExpectActualNullabilityBasedOverloads() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualNullabilityBasedOverloads.kt");
}
@Test
@TestMetadata("expectActualOverloads.kt")
public void testExpectActualOverloads() throws Exception {
@@ -23383,6 +23383,12 @@ public class FirJsCodegenBoxTestGenerated extends AbstractFirJsCodegenBoxTest {
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
@TestMetadata("expectActualOverloads.kt")
public void testExpectActualOverloads() throws Exception {
@@ -23383,6 +23383,12 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
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
@TestMetadata("expectActualOverloads.kt")
public void testExpectActualOverloads() throws Exception {
@@ -23383,6 +23383,12 @@ public class IrJsES6CodegenBoxTestGenerated extends AbstractIrJsES6CodegenBoxTes
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
@TestMetadata("expectActualOverloads.kt")
public void testExpectActualOverloads() throws Exception {
@@ -26809,6 +26809,12 @@ public class FirNativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTe
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
@TestMetadata("expectActualOverloads.kt")
public void testExpectActualOverloads() throws Exception {
@@ -27419,6 +27419,12 @@ public class FirNativeCodegenBoxTestNoPLGenerated extends AbstractNativeCodegenB
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
@TestMetadata("expectActualOverloads.kt")
public void testExpectActualOverloads() throws Exception {
@@ -26504,6 +26504,12 @@ public class NativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTest
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
@TestMetadata("expectActualOverloads.kt")
public void testExpectActualOverloads() throws Exception {
@@ -27114,6 +27114,12 @@ public class NativeCodegenBoxTestNoPLGenerated extends AbstractNativeCodegenBoxT
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
@TestMetadata("expectActualOverloads.kt")
public void testExpectActualOverloads() throws Exception {
@@ -20811,6 +20811,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest
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")
public void testExpectActualOverloads() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectActualOverloads.kt");