[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.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 {}
|
||||||
+6
@@ -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() {
|
||||||
|
|||||||
+6
@@ -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() {
|
||||||
|
|||||||
+6
@@ -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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user