From f4342282441ec5c8fff48b4fb3c5f5f85dc50780 Mon Sep 17 00:00:00 2001 From: Nikolay Lunyak Date: Tue, 5 Sep 2023 14:19:33 +0300 Subject: [PATCH] [FIR] Fix false positive POSITIONED_VALUE_ARGUMENT_FOR_JAVA_ANNOTATION The original Java checker has an early return in case of `resultingDescriptor !is JavaClassConstructorDescriptor`. It fires if the descriptor is `TypeAliasConstructorDescriptor`, thus further diagnostics are not reported. --- ...CompilerTestFE10TestdataTestGenerated.java | 6 ++++ ...sticCompilerFE10TestDataTestGenerated.java | 6 ++++ ...eeOldFrontendDiagnosticsTestGenerated.java | 6 ++++ ...siOldFrontendDiagnosticsTestGenerated.java | 6 ++++ .../expression/FirJavaAnnotationsChecker.kt | 10 ++++-- .../tests/unnamedArgsInJavaAnnotations.kt | 35 +++++++++++++++++++ .../test/runners/DiagnosticTestGenerated.java | 6 ++++ 7 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/unnamedArgsInJavaAnnotations.kt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java index 0e5e03da741..244b33e1f0c 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java @@ -1413,6 +1413,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/UnitValue.kt"); } + @Test + @TestMetadata("unnamedArgsInJavaAnnotations.kt") + public void testUnnamedArgsInJavaAnnotations() throws Exception { + runTest("compiler/testData/diagnostics/tests/unnamedArgsInJavaAnnotations.kt"); + } + @Test @TestMetadata("unproperDefaultInitializationInTailrec.kt") public void testUnproperDefaultInitializationInTailrec() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java index 26d3a86e8fd..820d966675b 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java @@ -1413,6 +1413,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/UnitValue.kt"); } + @Test + @TestMetadata("unnamedArgsInJavaAnnotations.kt") + public void testUnnamedArgsInJavaAnnotations() throws Exception { + runTest("compiler/testData/diagnostics/tests/unnamedArgsInJavaAnnotations.kt"); + } + @Test @TestMetadata("unproperDefaultInitializationInTailrec.kt") public void testUnproperDefaultInitializationInTailrec() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java index ff2231c2252..2b1924fb6c3 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java @@ -1413,6 +1413,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/tests/UnitValue.kt"); } + @Test + @TestMetadata("unnamedArgsInJavaAnnotations.kt") + public void testUnnamedArgsInJavaAnnotations() throws Exception { + runTest("compiler/testData/diagnostics/tests/unnamedArgsInJavaAnnotations.kt"); + } + @Test @TestMetadata("unproperDefaultInitializationInTailrec.kt") public void testUnproperDefaultInitializationInTailrec() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java index 04e535cc37a..5412bfb9597 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java @@ -1413,6 +1413,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/tests/UnitValue.kt"); } + @Test + @TestMetadata("unnamedArgsInJavaAnnotations.kt") + public void testUnnamedArgsInJavaAnnotations() throws Exception { + runTest("compiler/testData/diagnostics/tests/unnamedArgsInJavaAnnotations.kt"); + } + @Test @TestMetadata("unproperDefaultInitializationInTailrec.kt") public void testUnproperDefaultInitializationInTailrec() throws Exception { diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/expression/FirJavaAnnotationsChecker.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/expression/FirJavaAnnotationsChecker.kt index 66d8e0065fb..6c9e7e54a87 100644 --- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/expression/FirJavaAnnotationsChecker.kt +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/expression/FirJavaAnnotationsChecker.kt @@ -12,11 +12,17 @@ import org.jetbrains.kotlin.fir.analysis.checkers.toRegularClassSymbol import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors import org.jetbrains.kotlin.diagnostics.reportOn +import org.jetbrains.kotlin.fir.analysis.checkers.toClassLikeSymbol import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin +import org.jetbrains.kotlin.fir.declarations.toAnnotationClassLikeSymbol import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirWrappedArgumentExpression import org.jetbrains.kotlin.fir.expressions.impl.FirResolvedArgumentList +import org.jetbrains.kotlin.fir.resolve.dfa.symbol +import org.jetbrains.kotlin.fir.resolve.toSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol import org.jetbrains.kotlin.fir.types.ConeClassLikeType import org.jetbrains.kotlin.fir.types.coneTypeSafe import org.jetbrains.kotlin.name.ClassId @@ -34,8 +40,8 @@ object FirJavaAnnotationsChecker : FirAnnotationChecker() { override fun check(expression: FirAnnotation, context: CheckerContext, reporter: DiagnosticReporter) { if (context.containingDeclarations.lastOrNull()?.source?.kind != KtRealSourceElementKind) return - val callableSymbol = expression.annotationTypeRef.toRegularClassSymbol(context.session) - if (callableSymbol?.origin !is FirDeclarationOrigin.Java) return + val callableSymbol = expression.annotationTypeRef.toClassLikeSymbol(context.session) as? FirClassSymbol<*> ?: return + if (callableSymbol.origin !is FirDeclarationOrigin.Java) return val lookupTag = expression.annotationTypeRef.coneTypeSafe()?.lookupTag ?: return javaToKotlinNameMap[lookupTag.classId]?.let { betterName -> diff --git a/compiler/testData/diagnostics/tests/unnamedArgsInJavaAnnotations.kt b/compiler/testData/diagnostics/tests/unnamedArgsInJavaAnnotations.kt new file mode 100644 index 00000000000..3ea8f83ed56 --- /dev/null +++ b/compiler/testData/diagnostics/tests/unnamedArgsInJavaAnnotations.kt @@ -0,0 +1,35 @@ +// FIR_IDENTICAL +// ISSUE: KT-61309 +// ALLOW_KOTLIN_PACKAGE +// FILE: Test.java +package javacode; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD}) +public @interface Test { + Class expected() default None.class; + + long timeout() default 0L; +} + +// FILE: test.kt + +package kotlin.test + +typealias Test = javacode.Test + +// FILE: main.kt + +import kotlin.test.Test +import java.io.IOException + +@Test(IOException::class) +fun someTest() {} + +@Test(expected = IOException::class) +fun someRest() {} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index 4e672ea3fc2..3c57ffe6c9d 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -1413,6 +1413,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/UnitValue.kt"); } + @Test + @TestMetadata("unnamedArgsInJavaAnnotations.kt") + public void testUnnamedArgsInJavaAnnotations() throws Exception { + runTest("compiler/testData/diagnostics/tests/unnamedArgsInJavaAnnotations.kt"); + } + @Test @TestMetadata("unproperDefaultInitializationInTailrec.kt") public void testUnproperDefaultInitializationInTailrec() throws Exception {