[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:
committed by
Space Team
parent
700432e111
commit
bb8c7dd04c
+11
-8
@@ -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 {}
|
||||
+6
@@ -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() {
|
||||
|
||||
+6
@@ -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() {
|
||||
|
||||
+6
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user