[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.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<ObjCName?> = 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<ObjCName?> {
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? =
@@ -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");
}
@Test
@TestMetadata("objCNameWithTwoModules.kt")
public void testObjCNameWithTwoModules() {
runTest("compiler/testData/diagnostics/nativeTests/objCNameWithTwoModules.kt");
}
@Test
@TestMetadata("objCRefinement.kt")
public void testObjCRefinement() {
@@ -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() {
@@ -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() {