From 7b91cd0ff3197cab6be8ef48364f55f578f4c894 Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Tue, 11 Apr 2023 18:34:33 +0200 Subject: [PATCH] [FIR] calculate java Target annotation on COMPILER_REQUIRED_ANNOTATIONS phase ^KT-57849 ^KT-57949 --- .../annotationClassWithJavaTarget.txt | 6 ++--- ...CompilerTestFE10TestdataTestGenerated.java | 6 +++++ ...sticCompilerFE10TestDataTestGenerated.java | 6 +++++ ...eeOldFrontendDiagnosticsTestGenerated.java | 6 +++++ ...siOldFrontendDiagnosticsTestGenerated.java | 6 +++++ .../fir/session/ComponentsContainers.kt | 3 +++ ...erRequiredAnnotationEnhancementProvider.kt | 25 +++++++++++++++++++ ...FirSpecificAnnotationResolveTransformer.kt | 7 +++++- ...erRequiredAnnotationEnhancementProvider.kt | 17 +++++++++++++ ...KotlinTargetRetentionWithExplicitImport.kt | 6 +++++ .../test/runners/DiagnosticTestGenerated.java | 6 +++++ 11 files changed, 90 insertions(+), 4 deletions(-) create mode 100644 compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/JavaCompilerRequiredAnnotationEnhancementProvider.kt create mode 100644 compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/CompilerRequiredAnnotationEnhancementProvider.kt create mode 100644 compiler/testData/diagnostics/tests/annotations/options/javaKotlinTargetRetentionWithExplicitImport.kt diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/annotationClassWithJavaTarget.txt b/analysis/low-level-api-fir/testdata/lazyResolve/annotationClassWithJavaTarget.txt index 0d7b3f34d4c..d2e3042b13c 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/annotationClassWithJavaTarget.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/annotationClassWithJavaTarget.txt @@ -21,7 +21,7 @@ FILE: [ResolvedTo(IMPORTS)] annotationClassWithJavaTarget.kt COMPILER_REQUIRED_ANNOTATIONS: FILE: [ResolvedTo(IMPORTS)] annotationClassWithJavaTarget.kt [ResolvedTo(RAW_FIR)] annotations container - @java.lang.annotation.Target[Unresolved](ElementType#.TYPE_USE#) public? final? [ResolvedTo(COMPILER_REQUIRED_ANNOTATIONS)] annotation class ResolveMe : R|kotlin/Annotation| { + @R|java/lang/annotation/Target|[CompilerRequiredAnnotations](ElementType#.TYPE_USE#) public? final? [ResolvedTo(COMPILER_REQUIRED_ANNOTATIONS)] annotation class ResolveMe : R|kotlin/Annotation| { public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=ResolveMe] constructor(): R|ResolveMe| { LAZY_super } @@ -31,7 +31,7 @@ FILE: [ResolvedTo(IMPORTS)] annotationClassWithJavaTarget.kt COMPANION_GENERATION: FILE: [ResolvedTo(IMPORTS)] annotationClassWithJavaTarget.kt [ResolvedTo(RAW_FIR)] annotations container - @java.lang.annotation.Target[Unresolved](ElementType#.TYPE_USE#) public? final? [ResolvedTo(COMPANION_GENERATION)] annotation class ResolveMe : R|kotlin/Annotation| { + @R|java/lang/annotation/Target|[CompilerRequiredAnnotations](ElementType#.TYPE_USE#) public? final? [ResolvedTo(COMPANION_GENERATION)] annotation class ResolveMe : R|kotlin/Annotation| { public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=ResolveMe] constructor(): R|ResolveMe| { LAZY_super } @@ -41,7 +41,7 @@ FILE: [ResolvedTo(IMPORTS)] annotationClassWithJavaTarget.kt SUPER_TYPES: FILE: [ResolvedTo(IMPORTS)] annotationClassWithJavaTarget.kt [ResolvedTo(RAW_FIR)] annotations container - @java.lang.annotation.Target[Unresolved](ElementType#.TYPE_USE#) public? final? [ResolvedTo(SUPER_TYPES)] annotation class ResolveMe : R|kotlin/Annotation| { + @R|java/lang/annotation/Target|[CompilerRequiredAnnotations](ElementType#.TYPE_USE#) public? final? [ResolvedTo(SUPER_TYPES)] annotation class ResolveMe : R|kotlin/Annotation| { public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=ResolveMe] constructor(): R|ResolveMe| { LAZY_super } 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 6ece4bcb6e5..2b727d246d6 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 @@ -1931,6 +1931,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/annotations/options/javaKotlinTargetRetention.kt"); } + @Test + @TestMetadata("javaKotlinTargetRetentionWithExplicitImport.kt") + public void testJavaKotlinTargetRetentionWithExplicitImport() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/options/javaKotlinTargetRetentionWithExplicitImport.kt"); + } + @Test @TestMetadata("javaretention.kt") public void testJavaretention() 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 93bf3080aae..fffdee8c4a3 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 @@ -1931,6 +1931,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/annotations/options/javaKotlinTargetRetention.kt"); } + @Test + @TestMetadata("javaKotlinTargetRetentionWithExplicitImport.kt") + public void testJavaKotlinTargetRetentionWithExplicitImport() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/options/javaKotlinTargetRetentionWithExplicitImport.kt"); + } + @Test @TestMetadata("javaretention.kt") public void testJavaretention() 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 0b7a26fe924..577028fe97e 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 @@ -1931,6 +1931,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/tests/annotations/options/javaKotlinTargetRetention.kt"); } + @Test + @TestMetadata("javaKotlinTargetRetentionWithExplicitImport.kt") + public void testJavaKotlinTargetRetentionWithExplicitImport() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/options/javaKotlinTargetRetentionWithExplicitImport.kt"); + } + @Test @TestMetadata("javaretention.kt") public void testJavaretention() 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 8f4243be48f..17a7f64684a 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 @@ -1937,6 +1937,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/tests/annotations/options/javaKotlinTargetRetention.kt"); } + @Test + @TestMetadata("javaKotlinTargetRetentionWithExplicitImport.kt") + public void testJavaKotlinTargetRetentionWithExplicitImport() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/options/javaKotlinTargetRetentionWithExplicitImport.kt"); + } + @Test @TestMetadata("javaretention.kt") public void testJavaretention() throws Exception { diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/ComponentsContainers.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/ComponentsContainers.kt index 45959d734aa..43f5f5bb561 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/ComponentsContainers.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/ComponentsContainers.kt @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.fir.java.enhancement.FirAnnotationTypeQualifierResol import org.jetbrains.kotlin.fir.java.enhancement.FirEnhancedSymbolsStorage import org.jetbrains.kotlin.fir.java.scopes.JavaOverridabilityRules import org.jetbrains.kotlin.fir.java.FirSyntheticPropertiesStorage +import org.jetbrains.kotlin.fir.java.enhancement.JavaCompilerRequiredAnnotationEnhancementProvider import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.calls.ConeCallConflictResolverFactory import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticNamesProvider @@ -51,6 +52,7 @@ import org.jetbrains.kotlin.fir.types.TypeComponents import org.jetbrains.kotlin.incremental.components.EnumWhenTracker import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.resolve.jvm.modules.JavaModuleResolver +import org.jetbrains.kotlin.fir.resolve.transformers.plugin.CompilerRequiredAnnotationEnhancementProvider // -------------------------- Required components -------------------------- @@ -107,6 +109,7 @@ fun FirSession.registerCommonJavaComponents(javaModuleResolver: JavaModuleResolv register(PlatformSpecificOverridabilityRules::class, JavaOverridabilityRules(this)) register(DeserializedClassConfigurator::class, JvmDeserializedClassConfigurator(this)) register(FirEnumEntriesSupport::class, FirJvmEnumEntriesSupport(this)) + register(CompilerRequiredAnnotationEnhancementProvider::class, JavaCompilerRequiredAnnotationEnhancementProvider) } // -------------------------- Resolve components -------------------------- diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/JavaCompilerRequiredAnnotationEnhancementProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/JavaCompilerRequiredAnnotationEnhancementProvider.kt new file mode 100644 index 00000000000..71fe61aa3f5 --- /dev/null +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/JavaCompilerRequiredAnnotationEnhancementProvider.kt @@ -0,0 +1,25 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.fir.java.enhancement + +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.declarations.FirRegularClass +import org.jetbrains.kotlin.fir.resolve.transformers.plugin.CompilerRequiredAnnotationEnhancementProvider +import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirEnumEntrySymbol +import org.jetbrains.kotlin.name.StandardClassIds + +object JavaCompilerRequiredAnnotationEnhancementProvider : CompilerRequiredAnnotationEnhancementProvider() { + override fun enhance(enumSymbol: FirClassSymbol<*>, enumEntrySymbol: FirEnumEntrySymbol, session: FirSession): FirEnumEntrySymbol { + val firRegularClass = enumSymbol.fir as? FirRegularClass ?: return enumEntrySymbol + if (enumSymbol.classId != StandardClassIds.Annotations.Java.ElementType) return enumEntrySymbol + + return FirSignatureEnhancement(firRegularClass, session) { emptyList() }.enhancedProperty( + enumEntrySymbol, + enumEntrySymbol.name, + ) as FirEnumEntrySymbol + } +} diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/AbstractFirSpecificAnnotationResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/AbstractFirSpecificAnnotationResolveTransformer.kt index 4707f2a7ed2..7e407bbed51 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/AbstractFirSpecificAnnotationResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/AbstractFirSpecificAnnotationResolveTransformer.kt @@ -41,6 +41,7 @@ import org.jetbrains.kotlin.fir.visitors.FirDefaultTransformer import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.name.StandardClassIds.Annotations.Deprecated import org.jetbrains.kotlin.name.StandardClassIds.Annotations.DeprecatedSinceKotlin import org.jetbrains.kotlin.name.StandardClassIds.Annotations.JvmRecord @@ -55,6 +56,7 @@ object CompilerRequiredAnnotationsHelper { internal val REQUIRED_ANNOTATIONS_WITH_ARGUMENTS: Set = setOf( Deprecated, Target, + StandardClassIds.Annotations.Java.Target, ) val REQUIRED_ANNOTATIONS: Set = REQUIRED_ANNOTATIONS_WITH_ARGUMENTS + setOf( @@ -145,7 +147,10 @@ abstract class AbstractFirSpecificAnnotationResolveTransformer( it is FirEnumEntry && it.name == calleeReference.name }?.symbol as? FirEnumEntrySymbol ?: return - updateCallee(calleeReference, calleeSymbol) + val enhancedCalleeSymbol = session.compilerRequiredAnnotationEnhancementProvider?.enhance(symbol, calleeSymbol, session) + ?: calleeSymbol + + updateCallee(calleeReference, enhancedCalleeSymbol) replaceExplicitReceiver(resolvedReceiver) replaceDispatchReceiver(resolvedReceiver) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/CompilerRequiredAnnotationEnhancementProvider.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/CompilerRequiredAnnotationEnhancementProvider.kt new file mode 100644 index 00000000000..8f1d8fa341d --- /dev/null +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/CompilerRequiredAnnotationEnhancementProvider.kt @@ -0,0 +1,17 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.fir.resolve.transformers.plugin + +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.FirSessionComponent +import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirEnumEntrySymbol + +abstract class CompilerRequiredAnnotationEnhancementProvider : FirSessionComponent { + abstract fun enhance(enumSymbol: FirClassSymbol<*>, enumEntrySymbol: FirEnumEntrySymbol, session: FirSession): FirEnumEntrySymbol +} + +internal val FirSession.compilerRequiredAnnotationEnhancementProvider: CompilerRequiredAnnotationEnhancementProvider? by FirSession.nullableSessionComponentAccessor() \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/annotations/options/javaKotlinTargetRetentionWithExplicitImport.kt b/compiler/testData/diagnostics/tests/annotations/options/javaKotlinTargetRetentionWithExplicitImport.kt new file mode 100644 index 00000000000..7dbf672434b --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/options/javaKotlinTargetRetentionWithExplicitImport.kt @@ -0,0 +1,6 @@ +// FIR_IDENTICAL +import java.lang.annotation.Target +import java.lang.annotation.ElementType.PACKAGE + +@Target(PACKAGE) +annotation class my 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 a59a54b96da..e9d0450997f 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 @@ -1937,6 +1937,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/annotations/options/javaKotlinTargetRetention.kt"); } + @Test + @TestMetadata("javaKotlinTargetRetentionWithExplicitImport.kt") + public void testJavaKotlinTargetRetentionWithExplicitImport() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/options/javaKotlinTargetRetentionWithExplicitImport.kt"); + } + @Test @TestMetadata("javaretention.kt") public void testJavaretention() throws Exception {