FIR LC: populate default retention policy of annotations

This commit is contained in:
Jinseong Jeon
2022-05-20 22:33:47 -07:00
committed by Ilya Kirillov
parent d196050d9f
commit e446c988ee
11 changed files with 71 additions and 19 deletions
@@ -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<PsiAnnotation>()
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
)
)
)
)
@@ -1,3 +1,4 @@
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
public abstract @interface Anno /* Anno*/ {
public abstract double d();// d()
@@ -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()
@@ -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()
@@ -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()
@@ -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()
@@ -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)
@@ -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)
}
@@ -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<? extends java.lang.Object> arg2();// arg2()
@@ -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()
@@ -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*/ {
}