From d69240a2d53f25ab88c73884d01deb1f3d8f52f3 Mon Sep 17 00:00:00 2001 From: "Anastasia.Nekrasova" Date: Fri, 16 Feb 2024 14:05:38 +0200 Subject: [PATCH] [FIR] Fixed behavior of FirAnnotation.findArgumentByName for resolved annotations The 'findArgumentByName' function was returning an invalid result for annotation arguments with omitted argument name. #KT-64276 --- .../fir/declarations/FirAnnotationUtils.kt | 8 ++++--- .../objCNameWIthDifferentSwiftName.kt | 21 +++++++++++++++++++ .../DiagnosticsNativeTestGenerated.java | 6 ++++++ ...rontendNativeDiagnosticsTestGenerated.java | 6 ++++++ ...rontendNativeDiagnosticsTestGenerated.java | 6 ++++++ 5 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/diagnostics/nativeTests/objCNameWIthDifferentSwiftName.kt diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/FirAnnotationUtils.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/FirAnnotationUtils.kt index a131b08d7f1..b70a87e79e9 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/FirAnnotationUtils.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/FirAnnotationUtils.kt @@ -132,9 +132,11 @@ fun FirAnnotation.findArgumentByName(name: Name): FirExpression? { return argument.expression } } - // I'm lucky today! - // TODO: this line is still needed. However it should be replaced with 'return null' - return arguments.singleOrNull() + + // The condition is required for annotation arguments that are not fully resolved. For example, CompilerRequiredAnnotations. + // When the annotation is resolved, and we did not find an argument with the given name, + // there is no argument and we should return null. + return if (!resolved) arguments.firstOrNull() else null } fun FirAnnotation.getBooleanArgument(name: Name): Boolean? = getPrimitiveArgumentValue(name) diff --git a/compiler/testData/diagnostics/nativeTests/objCNameWIthDifferentSwiftName.kt b/compiler/testData/diagnostics/nativeTests/objCNameWIthDifferentSwiftName.kt new file mode 100644 index 00000000000..06af9ae7248 --- /dev/null +++ b/compiler/testData/diagnostics/nativeTests/objCNameWIthDifferentSwiftName.kt @@ -0,0 +1,21 @@ +// FIR_IDENTICAL +// FILE: kotlin.kt +@file:OptIn(ExperimentalObjCName::class) + +package kotlin.native + +import kotlin.experimental.ExperimentalObjCName + +fun interface BaseInterface { + @ObjCName(name = "close") + fun close() +} + +open class BaseClass { + @ObjCName("close") + fun close() { + } +} + + +class DerivedClass : BaseClass(), BaseInterface {} 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 6bf25b76ba9..81bbb204da6 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("objCNameWIthDifferentSwiftName.kt") + public void testObjCNameWIthDifferentSwiftName() { + runTest("compiler/testData/diagnostics/nativeTests/objCNameWIthDifferentSwiftName.kt"); + } + @Test @TestMetadata("objCNameWithTwoModules.kt") public void testObjCNameWithTwoModules() { 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 7e403e83bdf..50270801692 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("objCNameWIthDifferentSwiftName.kt") + public void testObjCNameWIthDifferentSwiftName() { + runTest("compiler/testData/diagnostics/nativeTests/objCNameWIthDifferentSwiftName.kt"); + } + @Test @TestMetadata("objCNameWithTwoModules.kt") public void testObjCNameWithTwoModules() { 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 63686f45709..6f0f1eeea79 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("objCNameWIthDifferentSwiftName.kt") + public void testObjCNameWIthDifferentSwiftName() { + runTest("compiler/testData/diagnostics/nativeTests/objCNameWIthDifferentSwiftName.kt"); + } + @Test @TestMetadata("objCNameWithTwoModules.kt") public void testObjCNameWithTwoModules() {