From e446c988ee04d90c234736a6696acacd4cb5b76f Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Fri, 20 May 2022 22:33:47 -0700 Subject: [PATCH] FIR LC: populate default retention policy of annotations --- .../symbol/annotations/annotationsUtils.kt | 50 ++++++++++++++++--- .../lightClasses/AnnotationClass.fir.java | 1 + .../AnnotationJvmRepeatable.fir.java | 1 + ...AnnotationKotlinAndJavaRepeatable.fir.java | 1 + .../AnnotationKotlinAndJvmRepeatable.fir.java | 1 + .../AnnotationRepeatable.fir.java | 1 + ...ecialAnnotationsOnAnnotationClass.fir.java | 1 + ...ationWithSetParamPropertyModifier.fir.java | 13 ----- .../ultraLightClasses/annotations.fir.java | 12 +++++ .../delegatesWithAnnotations.fir.java | 2 + .../typeAnnotations.fir.java | 7 +++ 11 files changed, 71 insertions(+), 19 deletions(-) delete mode 100644 compiler/testData/asJava/ultraLightClasses/annotationWithSetParamPropertyModifier.fir.java diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/annotationsUtils.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/annotationsUtils.kt index 7ebf85cb47c..9d833f404d9 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/annotationsUtils.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/annotationsUtils.kt @@ -6,7 +6,9 @@ package org.jetbrains.kotlin.light.classes.symbol import com.intellij.openapi.project.Project +import com.intellij.psi.CommonClassNames.JAVA_LANG_ANNOTATION_RETENTION import com.intellij.psi.PsiAnnotation +import com.intellij.psi.PsiClass import com.intellij.psi.PsiElement import org.jetbrains.annotations.NotNull import org.jetbrains.annotations.Nullable @@ -16,14 +18,16 @@ import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.analysis.api.symbols.KtFileSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtAnnotatedSymbol import org.jetbrains.kotlin.analysis.api.annotations.KtConstantAnnotationValue +import org.jetbrains.kotlin.analysis.api.annotations.KtEnumEntryAnnotationValue +import org.jetbrains.kotlin.analysis.api.annotations.KtNamedAnnotationValue +import org.jetbrains.kotlin.builtins.StandardNames.DEFAULT_VALUE_PARAMETER import org.jetbrains.kotlin.load.java.JvmAbi.JVM_FIELD_ANNOTATION_CLASS_ID -import org.jetbrains.kotlin.name.ClassId -import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.load.java.JvmAnnotationNames.RETENTION_POLICY_ENUM +import org.jetbrains.kotlin.name.* import org.jetbrains.kotlin.name.JvmNames.JVM_MULTIFILE_CLASS_ID import org.jetbrains.kotlin.name.JvmNames.JVM_NAME_CLASS_ID import org.jetbrains.kotlin.name.JvmNames.JVM_OVERLOADS_CLASS_ID import org.jetbrains.kotlin.name.JvmNames.JVM_SYNTHETIC_ANNOTATION_CLASS_ID -import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.resolve.annotations.JVM_STATIC_ANNOTATION_CLASS_ID import org.jetbrains.kotlin.resolve.inline.INLINE_ONLY_ANNOTATION_FQ_NAME @@ -101,11 +105,21 @@ internal fun KtAnnotatedSymbol.computeAnnotations( FirLightSimpleAnnotation(it.name, parent) } - if (annotations.isEmpty()) { - return if (nullabilityAnnotation != null) listOf(nullabilityAnnotation) else emptyList() - } + val parentIsAnnotation = (parent as? PsiClass)?.isAnnotationType == true val result = mutableListOf() + if (annotations.isEmpty()) { + if (parentIsAnnotation) { + result.add(createRetentionRuntimeAnnotation(parent)) + } + + if (nullabilityAnnotation != null) { + result.add(nullabilityAnnotation) + } + + return result + } + for (annotation in annotations) { val siteTarget = annotation.useSiteTarget @@ -117,9 +131,33 @@ internal fun KtAnnotatedSymbol.computeAnnotations( } } + if (parentIsAnnotation && + annotations.none { it.classId?.asFqNameString() == JAVA_LANG_ANNOTATION_RETENTION } + ) { + result.add(createRetentionRuntimeAnnotation(parent)) + } + if (nullabilityAnnotation != null) { result.add(nullabilityAnnotation) } return result } + +private fun createRetentionRuntimeAnnotation(parent: PsiElement): PsiAnnotation = + FirLightSimpleAnnotation( + JAVA_LANG_ANNOTATION_RETENTION, + parent, + listOf( + KtNamedAnnotationValue( + name = DEFAULT_VALUE_PARAMETER, + expression = KtEnumEntryAnnotationValue( + callableId = CallableId( + ClassId.fromString(RETENTION_POLICY_ENUM.asString()), + Name.identifier(AnnotationRetention.RUNTIME.name) + ), + sourcePsi = null + ) + ) + ) + ) diff --git a/compiler/testData/asJava/lightClasses/AnnotationClass.fir.java b/compiler/testData/asJava/lightClasses/AnnotationClass.fir.java index 27bdb1434d8..788e56feb51 100644 --- a/compiler/testData/asJava/lightClasses/AnnotationClass.fir.java +++ b/compiler/testData/asJava/lightClasses/AnnotationClass.fir.java @@ -1,3 +1,4 @@ +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) public abstract @interface Anno /* Anno*/ { public abstract double d();// d() diff --git a/compiler/testData/asJava/lightClasses/AnnotationJvmRepeatable.fir.java b/compiler/testData/asJava/lightClasses/AnnotationJvmRepeatable.fir.java index e7784422cea..19ddfa3e7e8 100644 --- a/compiler/testData/asJava/lightClasses/AnnotationJvmRepeatable.fir.java +++ b/compiler/testData/asJava/lightClasses/AnnotationJvmRepeatable.fir.java @@ -1,4 +1,5 @@ @java.lang.annotation.Repeatable() +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) public abstract @interface Two /* Two*/ { public abstract java.lang.String name();// name() diff --git a/compiler/testData/asJava/lightClasses/AnnotationKotlinAndJavaRepeatable.fir.java b/compiler/testData/asJava/lightClasses/AnnotationKotlinAndJavaRepeatable.fir.java index 186b5835fb1..7d27a5c08d8 100644 --- a/compiler/testData/asJava/lightClasses/AnnotationKotlinAndJavaRepeatable.fir.java +++ b/compiler/testData/asJava/lightClasses/AnnotationKotlinAndJavaRepeatable.fir.java @@ -1,4 +1,5 @@ @java.lang.annotation.Repeatable() +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) @kotlin.annotation.Repeatable() public abstract @interface Two /* Two*/ { public abstract java.lang.String name();// name() diff --git a/compiler/testData/asJava/lightClasses/AnnotationKotlinAndJvmRepeatable.fir.java b/compiler/testData/asJava/lightClasses/AnnotationKotlinAndJvmRepeatable.fir.java index a2776b9ae09..2928e6217f9 100644 --- a/compiler/testData/asJava/lightClasses/AnnotationKotlinAndJvmRepeatable.fir.java +++ b/compiler/testData/asJava/lightClasses/AnnotationKotlinAndJvmRepeatable.fir.java @@ -1,4 +1,5 @@ @java.lang.annotation.Repeatable() +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) @kotlin.annotation.Repeatable() public abstract @interface Two /* Two*/ { public abstract java.lang.String name();// name() diff --git a/compiler/testData/asJava/lightClasses/AnnotationRepeatable.fir.java b/compiler/testData/asJava/lightClasses/AnnotationRepeatable.fir.java index f27e744a33c..9e5410e7f85 100644 --- a/compiler/testData/asJava/lightClasses/AnnotationRepeatable.fir.java +++ b/compiler/testData/asJava/lightClasses/AnnotationRepeatable.fir.java @@ -1,3 +1,4 @@ +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) @kotlin.annotation.Repeatable() public abstract @interface One /* simple.One*/ { public abstract java.lang.String value();// value() diff --git a/compiler/testData/asJava/lightClasses/SpecialAnnotationsOnAnnotationClass.fir.java b/compiler/testData/asJava/lightClasses/SpecialAnnotationsOnAnnotationClass.fir.java index d807864a6e0..b915e401deb 100644 --- a/compiler/testData/asJava/lightClasses/SpecialAnnotationsOnAnnotationClass.fir.java +++ b/compiler/testData/asJava/lightClasses/SpecialAnnotationsOnAnnotationClass.fir.java @@ -1,3 +1,4 @@ +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) @kotlin.annotation.MustBeDocumented() @kotlin.annotation.Repeatable() @kotlin.annotation.Retention(value = kotlin.annotation.AnnotationRetention.SOURCE) diff --git a/compiler/testData/asJava/ultraLightClasses/annotationWithSetParamPropertyModifier.fir.java b/compiler/testData/asJava/ultraLightClasses/annotationWithSetParamPropertyModifier.fir.java deleted file mode 100644 index 6575e978458..00000000000 --- a/compiler/testData/asJava/ultraLightClasses/annotationWithSetParamPropertyModifier.fir.java +++ /dev/null @@ -1,13 +0,0 @@ -public abstract @interface Anno /* Anno*/ { -} - -public final class TestClass /* TestClass*/ { - private int hello; - - public TestClass(int);// .ctor(int) - - public final int getHello();// getHello() - - public final void setHello(@Anno() int);// setHello(int) - -} diff --git a/compiler/testData/asJava/ultraLightClasses/annotations.fir.java b/compiler/testData/asJava/ultraLightClasses/annotations.fir.java index cfba269408f..1ba3d280e37 100644 --- a/compiler/testData/asJava/ultraLightClasses/annotations.fir.java +++ b/compiler/testData/asJava/ultraLightClasses/annotations.fir.java @@ -1,23 +1,29 @@ +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) @kotlin.annotation.Target(allowedTargets = {kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.EXPRESSION}) public abstract @interface Anno2 /* Anno2*/ { } +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) @kotlin.annotation.Target(allowedTargets = {kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.EXPRESSION}) public abstract @interface Anno3 /* Anno3*/ { } +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) @kotlin.annotation.Target(allowedTargets = kotlin.annotation.AnnotationTarget.CLASS) public abstract @interface Anno4 /* Anno4*/ { } +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) @kotlin.annotation.Target(allowedTargets = ?) public abstract @interface Anno5 /* Anno5*/ { } +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) @kotlin.annotation.Target(allowedTargets = ?) public abstract @interface Anno6 /* Anno6*/ { } +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) public abstract @interface AnnoWithCompanion /* AnnoWithCompanion*/ { @org.jetbrains.annotations.NotNull() public static final AnnoWithCompanion.Companion Companion; @@ -34,6 +40,7 @@ public static final class Companion /* AnnoWithCompanion.Companion*/ { } +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) public abstract @interface Anno /* Anno*/ { public abstract Anno[] x();// x() @@ -42,23 +49,27 @@ public abstract @interface Anno /* Anno*/ { } @Deprecated(message = "This anno is deprecated, use === instead", replaceWith = ?) +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) @kotlin.annotation.MustBeDocumented() @kotlin.annotation.Retention(value = kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets = kotlin.annotation.AnnotationTarget.CLASS) public abstract @interface Fancy /* Fancy*/ { } +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) public abstract @interface ReplaceWith /* ReplaceWith*/ { public abstract java.lang.String expression();// expression() } +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) public abstract @interface AnnotatedAttribute /* AnnotatedAttribute*/ { @Anno() public abstract java.lang.String x();// x() } +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) public abstract @interface Deprecated /* Deprecated*/ { public abstract ReplaceWith replaceWith();// replaceWith() @@ -66,6 +77,7 @@ public abstract @interface Deprecated /* Deprecated*/ { } +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) public abstract @interface Ann /* Ann*/ { public abstract java.lang.Class arg2();// arg2() diff --git a/compiler/testData/asJava/ultraLightClasses/delegatesWithAnnotations.fir.java b/compiler/testData/asJava/ultraLightClasses/delegatesWithAnnotations.fir.java index 9a792729505..9f68c921099 100644 --- a/compiler/testData/asJava/ultraLightClasses/delegatesWithAnnotations.fir.java +++ b/compiler/testData/asJava/ultraLightClasses/delegatesWithAnnotations.fir.java @@ -1,8 +1,10 @@ +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) public abstract @interface SimpleAnn /* SimpleAnn*/ { public abstract java.lang.String value();// value() } +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) public abstract @interface Ann /* Ann*/ { public abstract SimpleAnn[] t();// t() diff --git a/compiler/testData/asJava/ultraLightClasses/typeAnnotations.fir.java b/compiler/testData/asJava/ultraLightClasses/typeAnnotations.fir.java index 4604df0c1ac..d6e7c8ecba3 100644 --- a/compiler/testData/asJava/ultraLightClasses/typeAnnotations.fir.java +++ b/compiler/testData/asJava/ultraLightClasses/typeAnnotations.fir.java @@ -1,27 +1,34 @@ +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) @kotlin.annotation.Target(allowedTargets = kotlin.annotation.AnnotationTarget.VALUE_PARAMETER) public abstract @interface A0 /* A0*/ { } +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) @kotlin.annotation.Target(allowedTargets = kotlin.annotation.AnnotationTarget.VALUE_PARAMETER) public abstract @interface A1 /* A1*/ { } +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) @kotlin.annotation.Target(allowedTargets = kotlin.annotation.AnnotationTarget.VALUE_PARAMETER) public abstract @interface A2 /* A2*/ { } +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) @kotlin.annotation.Target(allowedTargets = kotlin.annotation.AnnotationTarget.VALUE_PARAMETER) public abstract @interface A3 /* A3*/ { } +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) @kotlin.annotation.Target(allowedTargets = kotlin.annotation.AnnotationTarget.VALUE_PARAMETER) public abstract @interface A4 /* A4*/ { } +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) @kotlin.annotation.Target(allowedTargets = kotlin.annotation.AnnotationTarget.VALUE_PARAMETER) public abstract @interface A5 /* A5*/ { } +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) @kotlin.annotation.Target(allowedTargets = kotlin.annotation.AnnotationTarget.VALUE_PARAMETER) public abstract @interface A6 /* A6*/ { }