[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
This commit is contained in:
Anastasia.Nekrasova
2024-02-12 19:19:29 +03:00
committed by Space Team
parent 700432e111
commit bb8c7dd04c
5 changed files with 67 additions and 8 deletions
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.fir.scopes.retrieveDirectOverriddenOf
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol 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.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
@@ -30,15 +31,17 @@ object FirNativeObjCNameUtilities {
private val swiftNameName = Name.identifier("swiftName") private val swiftNameName = Name.identifier("swiftName")
private val exactName = Name.identifier("exact") private val exactName = Name.identifier("exact")
fun FirBasedSymbol<*>.getObjCNames(session: FirSession): List<ObjCName?> = when (this) { fun FirBasedSymbol<*>.getObjCNames(session: FirSession): List<ObjCName?> {
is FirFunctionSymbol<*> -> buildList { lazyResolveToPhase(FirResolvePhase.ANNOTATION_ARGUMENTS)
add((this@getObjCNames as FirBasedSymbol<*>).getObjCName(session)) return when (this) {
add(resolvedReceiverTypeRef?.getObjCName(session)) is FirFunctionSymbol<*> -> buildList {
add(receiverParameter?.getObjCName(session)) add((this@getObjCNames as FirBasedSymbol<*>).getObjCName(session))
valueParameterSymbols.forEach { add(it.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? = private fun FirAnnotationContainer.getObjCName(session: FirSession): ObjCName? =
@@ -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 {}
@@ -108,6 +108,12 @@ public class DiagnosticsNativeTestGenerated extends AbstractDiagnosticsNativeTes
runTest("compiler/testData/diagnostics/nativeTests/objCName5.kt"); runTest("compiler/testData/diagnostics/nativeTests/objCName5.kt");
} }
@Test
@TestMetadata("objCNameWithTwoModules.kt")
public void testObjCNameWithTwoModules() {
runTest("compiler/testData/diagnostics/nativeTests/objCNameWithTwoModules.kt");
}
@Test @Test
@TestMetadata("objCRefinement.kt") @TestMetadata("objCRefinement.kt")
public void testObjCRefinement() { public void testObjCRefinement() {
@@ -112,6 +112,12 @@ public class FirLightTreeOldFrontendNativeDiagnosticsTestGenerated extends Abstr
runTest("compiler/testData/diagnostics/nativeTests/objCName5.kt"); runTest("compiler/testData/diagnostics/nativeTests/objCName5.kt");
} }
@Test
@TestMetadata("objCNameWithTwoModules.kt")
public void testObjCNameWithTwoModules() {
runTest("compiler/testData/diagnostics/nativeTests/objCNameWithTwoModules.kt");
}
@Test @Test
@TestMetadata("objCRefinement.kt") @TestMetadata("objCRefinement.kt")
public void testObjCRefinement() { public void testObjCRefinement() {
@@ -112,6 +112,12 @@ public class FirPsiOldFrontendNativeDiagnosticsTestGenerated extends AbstractFir
runTest("compiler/testData/diagnostics/nativeTests/objCName5.kt"); runTest("compiler/testData/diagnostics/nativeTests/objCName5.kt");
} }
@Test
@TestMetadata("objCNameWithTwoModules.kt")
public void testObjCNameWithTwoModules() {
runTest("compiler/testData/diagnostics/nativeTests/objCNameWithTwoModules.kt");
}
@Test @Test
@TestMetadata("objCRefinement.kt") @TestMetadata("objCRefinement.kt")
public void testObjCRefinement() { public void testObjCRefinement() {