[FIR] calculate java Target annotation on COMPILER_REQUIRED_ANNOTATIONS phase

^KT-57849
^KT-57949
This commit is contained in:
Dmitrii Gridin
2023-04-11 18:34:33 +02:00
committed by Space Team
parent 1c456b216b
commit 7b91cd0ff3
11 changed files with 90 additions and 4 deletions
@@ -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<R|kotlin/Any|>
}
@@ -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<R|kotlin/Any|>
}
@@ -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<R|kotlin/Any|>
}
@@ -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 {
@@ -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 {
@@ -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 {
@@ -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 {
@@ -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 --------------------------
@@ -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
}
}
@@ -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<ClassId> = setOf(
Deprecated,
Target,
StandardClassIds.Annotations.Java.Target,
)
val REQUIRED_ANNOTATIONS: Set<ClassId> = 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)
@@ -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<CompilerRequiredAnnotationEnhancementProvider>()
@@ -0,0 +1,6 @@
// FIR_IDENTICAL
import java.lang.annotation.Target
import java.lang.annotation.ElementType.PACKAGE
<!DEPRECATED_JAVA_ANNOTATION!>@Target(PACKAGE)<!>
annotation class my
@@ -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 {