From bb8c7dd04c401ef27c52504a4f44f56161404b0a Mon Sep 17 00:00:00 2001 From: "Anastasia.Nekrasova" Date: Mon, 12 Feb 2024 19:19:29 +0300 Subject: [PATCH] [K/N][K2] K2 behavioral difference with inconsistent inheritance of ObjCName When a declaration with an ObjC annotation is stored in a different module, the annotation arguments are not resolved by default. This leads to a bug in the checker. Before attempting to find the objCName, it is necessary to resolve the annotation first. #KT-64276 --- .../checkers/FirNativeObjCNameUtilities.kt | 19 ++++++---- .../nativeTests/objCNameWithTwoModules.kt | 38 +++++++++++++++++++ .../DiagnosticsNativeTestGenerated.java | 6 +++ ...rontendNativeDiagnosticsTestGenerated.java | 6 +++ ...rontendNativeDiagnosticsTestGenerated.java | 6 +++ 5 files changed, 67 insertions(+), 8 deletions(-) create mode 100644 compiler/testData/diagnostics/nativeTests/objCNameWithTwoModules.kt diff --git a/compiler/fir/checkers/checkers.native/src/org/jetbrains/kotlin/fir/analysis/native/checkers/FirNativeObjCNameUtilities.kt b/compiler/fir/checkers/checkers.native/src/org/jetbrains/kotlin/fir/analysis/native/checkers/FirNativeObjCNameUtilities.kt index 7a945ffce22..edfc705cb42 100644 --- a/compiler/fir/checkers/checkers.native/src/org/jetbrains/kotlin/fir/analysis/native/checkers/FirNativeObjCNameUtilities.kt +++ b/compiler/fir/checkers/checkers.native/src/org/jetbrains/kotlin/fir/analysis/native/checkers/FirNativeObjCNameUtilities.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.fir.scopes.retrieveDirectOverriddenOf import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol +import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @@ -30,15 +31,17 @@ object FirNativeObjCNameUtilities { private val swiftNameName = Name.identifier("swiftName") private val exactName = Name.identifier("exact") - fun FirBasedSymbol<*>.getObjCNames(session: FirSession): List = when (this) { - is FirFunctionSymbol<*> -> buildList { - add((this@getObjCNames as FirBasedSymbol<*>).getObjCName(session)) - add(resolvedReceiverTypeRef?.getObjCName(session)) - add(receiverParameter?.getObjCName(session)) - valueParameterSymbols.forEach { add(it.getObjCName(session)) } + fun FirBasedSymbol<*>.getObjCNames(session: FirSession): List { + lazyResolveToPhase(FirResolvePhase.ANNOTATION_ARGUMENTS) + return when (this) { + is FirFunctionSymbol<*> -> buildList { + add((this@getObjCNames as FirBasedSymbol<*>).getObjCName(session)) + add(resolvedReceiverTypeRef?.getObjCName(session)) + add(receiverParameter?.getObjCName(session)) + valueParameterSymbols.forEach { add(it.getObjCName(session)) } + } + else -> listOf(getObjCName(session)) } - - else -> listOf(getObjCName(session)) } private fun FirAnnotationContainer.getObjCName(session: FirSession): ObjCName? = diff --git a/compiler/testData/diagnostics/nativeTests/objCNameWithTwoModules.kt b/compiler/testData/diagnostics/nativeTests/objCNameWithTwoModules.kt new file mode 100644 index 00000000000..400b99ebf97 --- /dev/null +++ b/compiler/testData/diagnostics/nativeTests/objCNameWithTwoModules.kt @@ -0,0 +1,38 @@ +// FIR_IDENTICAL + +// MODULE: lib +// FILE: kotlin1.kt +@file:OptIn(ExperimentalObjCName::class) + +package example +import kotlin.experimental.ExperimentalObjCName + +interface BaseInterface { + @kotlin.native.ObjCName("getValue") + fun getValue(): Int +} + + +// MODULE: main(lib) +// FILE: kotlin2.kt + +@file:OptIn(ExperimentalObjCName::class) + +package example +import kotlin.experimental.ExperimentalObjCName + +open class BaseClass { + @kotlin.native.ObjCName("getValue") + fun getValue(): Int { + return 0 + } +} + +// FILE: kotlin3.kt + +@file:OptIn(ExperimentalObjCName::class) + +package example +import kotlin.experimental.ExperimentalObjCName + +class Derived: BaseClass(), BaseInterface {} \ No newline at end of file diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/diagnostics/DiagnosticsNativeTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/diagnostics/DiagnosticsNativeTestGenerated.java index 4c780b17c93..6bf25b76ba9 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/diagnostics/DiagnosticsNativeTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/diagnostics/DiagnosticsNativeTestGenerated.java @@ -108,6 +108,12 @@ public class DiagnosticsNativeTestGenerated extends AbstractDiagnosticsNativeTes runTest("compiler/testData/diagnostics/nativeTests/objCName5.kt"); } + @Test + @TestMetadata("objCNameWithTwoModules.kt") + public void testObjCNameWithTwoModules() { + runTest("compiler/testData/diagnostics/nativeTests/objCNameWithTwoModules.kt"); + } + @Test @TestMetadata("objCRefinement.kt") public void testObjCRefinement() { diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/diagnostics/FirLightTreeOldFrontendNativeDiagnosticsTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/diagnostics/FirLightTreeOldFrontendNativeDiagnosticsTestGenerated.java index c3add2d4010..7e403e83bdf 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/diagnostics/FirLightTreeOldFrontendNativeDiagnosticsTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/diagnostics/FirLightTreeOldFrontendNativeDiagnosticsTestGenerated.java @@ -112,6 +112,12 @@ public class FirLightTreeOldFrontendNativeDiagnosticsTestGenerated extends Abstr runTest("compiler/testData/diagnostics/nativeTests/objCName5.kt"); } + @Test + @TestMetadata("objCNameWithTwoModules.kt") + public void testObjCNameWithTwoModules() { + runTest("compiler/testData/diagnostics/nativeTests/objCNameWithTwoModules.kt"); + } + @Test @TestMetadata("objCRefinement.kt") public void testObjCRefinement() { diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/diagnostics/FirPsiOldFrontendNativeDiagnosticsTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/diagnostics/FirPsiOldFrontendNativeDiagnosticsTestGenerated.java index 84a528f1fda..63686f45709 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/diagnostics/FirPsiOldFrontendNativeDiagnosticsTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/diagnostics/FirPsiOldFrontendNativeDiagnosticsTestGenerated.java @@ -112,6 +112,12 @@ public class FirPsiOldFrontendNativeDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/nativeTests/objCName5.kt"); } + @Test + @TestMetadata("objCNameWithTwoModules.kt") + public void testObjCNameWithTwoModules() { + runTest("compiler/testData/diagnostics/nativeTests/objCNameWithTwoModules.kt"); + } + @Test @TestMetadata("objCRefinement.kt") public void testObjCRefinement() {