FIR LC: populate default retention policy of annotations
This commit is contained in:
committed by
Ilya Kirillov
parent
d196050d9f
commit
e446c988ee
+44
-6
@@ -6,7 +6,9 @@
|
|||||||
package org.jetbrains.kotlin.light.classes.symbol
|
package org.jetbrains.kotlin.light.classes.symbol
|
||||||
|
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
|
import com.intellij.psi.CommonClassNames.JAVA_LANG_ANNOTATION_RETENTION
|
||||||
import com.intellij.psi.PsiAnnotation
|
import com.intellij.psi.PsiAnnotation
|
||||||
|
import com.intellij.psi.PsiClass
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import org.jetbrains.annotations.NotNull
|
import org.jetbrains.annotations.NotNull
|
||||||
import org.jetbrains.annotations.Nullable
|
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.KtFileSymbol
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtAnnotatedSymbol
|
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtAnnotatedSymbol
|
||||||
import org.jetbrains.kotlin.analysis.api.annotations.KtConstantAnnotationValue
|
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.load.java.JvmAbi.JVM_FIELD_ANNOTATION_CLASS_ID
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.load.java.JvmAnnotationNames.RETENTION_POLICY_ENUM
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.*
|
||||||
import org.jetbrains.kotlin.name.JvmNames.JVM_MULTIFILE_CLASS_ID
|
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_NAME_CLASS_ID
|
||||||
import org.jetbrains.kotlin.name.JvmNames.JVM_OVERLOADS_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.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.annotations.JVM_STATIC_ANNOTATION_CLASS_ID
|
||||||
import org.jetbrains.kotlin.resolve.inline.INLINE_ONLY_ANNOTATION_FQ_NAME
|
import org.jetbrains.kotlin.resolve.inline.INLINE_ONLY_ANNOTATION_FQ_NAME
|
||||||
|
|
||||||
@@ -101,11 +105,21 @@ internal fun KtAnnotatedSymbol.computeAnnotations(
|
|||||||
FirLightSimpleAnnotation(it.name, parent)
|
FirLightSimpleAnnotation(it.name, parent)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (annotations.isEmpty()) {
|
val parentIsAnnotation = (parent as? PsiClass)?.isAnnotationType == true
|
||||||
return if (nullabilityAnnotation != null) listOf(nullabilityAnnotation) else emptyList()
|
|
||||||
}
|
|
||||||
|
|
||||||
val result = mutableListOf<PsiAnnotation>()
|
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) {
|
for (annotation in annotations) {
|
||||||
|
|
||||||
val siteTarget = annotation.useSiteTarget
|
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) {
|
if (nullabilityAnnotation != null) {
|
||||||
result.add(nullabilityAnnotation)
|
result.add(nullabilityAnnotation)
|
||||||
}
|
}
|
||||||
|
|
||||||
return result
|
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 @interface Anno /* Anno*/ {
|
||||||
public abstract double d();// d()
|
public abstract double d();// d()
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
@java.lang.annotation.Repeatable()
|
@java.lang.annotation.Repeatable()
|
||||||
|
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
|
||||||
public abstract @interface Two /* Two*/ {
|
public abstract @interface Two /* Two*/ {
|
||||||
public abstract java.lang.String name();// name()
|
public abstract java.lang.String name();// name()
|
||||||
|
|
||||||
|
|||||||
+1
@@ -1,4 +1,5 @@
|
|||||||
@java.lang.annotation.Repeatable()
|
@java.lang.annotation.Repeatable()
|
||||||
|
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
|
||||||
@kotlin.annotation.Repeatable()
|
@kotlin.annotation.Repeatable()
|
||||||
public abstract @interface Two /* Two*/ {
|
public abstract @interface Two /* Two*/ {
|
||||||
public abstract java.lang.String name();// name()
|
public abstract java.lang.String name();// name()
|
||||||
|
|||||||
+1
@@ -1,4 +1,5 @@
|
|||||||
@java.lang.annotation.Repeatable()
|
@java.lang.annotation.Repeatable()
|
||||||
|
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
|
||||||
@kotlin.annotation.Repeatable()
|
@kotlin.annotation.Repeatable()
|
||||||
public abstract @interface Two /* Two*/ {
|
public abstract @interface Two /* Two*/ {
|
||||||
public abstract java.lang.String name();// name()
|
public abstract java.lang.String name();// name()
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
|
||||||
@kotlin.annotation.Repeatable()
|
@kotlin.annotation.Repeatable()
|
||||||
public abstract @interface One /* simple.One*/ {
|
public abstract @interface One /* simple.One*/ {
|
||||||
public abstract java.lang.String value();// value()
|
public abstract java.lang.String value();// value()
|
||||||
|
|||||||
+1
@@ -1,3 +1,4 @@
|
|||||||
|
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
|
||||||
@kotlin.annotation.MustBeDocumented()
|
@kotlin.annotation.MustBeDocumented()
|
||||||
@kotlin.annotation.Repeatable()
|
@kotlin.annotation.Repeatable()
|
||||||
@kotlin.annotation.Retention(value = kotlin.annotation.AnnotationRetention.SOURCE)
|
@kotlin.annotation.Retention(value = kotlin.annotation.AnnotationRetention.SOURCE)
|
||||||
|
|||||||
-13
@@ -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})
|
@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*/ {
|
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})
|
@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*/ {
|
public abstract @interface Anno3 /* Anno3*/ {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
|
||||||
@kotlin.annotation.Target(allowedTargets = kotlin.annotation.AnnotationTarget.CLASS)
|
@kotlin.annotation.Target(allowedTargets = kotlin.annotation.AnnotationTarget.CLASS)
|
||||||
public abstract @interface Anno4 /* Anno4*/ {
|
public abstract @interface Anno4 /* Anno4*/ {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
|
||||||
@kotlin.annotation.Target(allowedTargets = ?)
|
@kotlin.annotation.Target(allowedTargets = ?)
|
||||||
public abstract @interface Anno5 /* Anno5*/ {
|
public abstract @interface Anno5 /* Anno5*/ {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
|
||||||
@kotlin.annotation.Target(allowedTargets = ?)
|
@kotlin.annotation.Target(allowedTargets = ?)
|
||||||
public abstract @interface Anno6 /* Anno6*/ {
|
public abstract @interface Anno6 /* Anno6*/ {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
|
||||||
public abstract @interface AnnoWithCompanion /* AnnoWithCompanion*/ {
|
public abstract @interface AnnoWithCompanion /* AnnoWithCompanion*/ {
|
||||||
@org.jetbrains.annotations.NotNull()
|
@org.jetbrains.annotations.NotNull()
|
||||||
public static final AnnoWithCompanion.Companion Companion;
|
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 @interface Anno /* Anno*/ {
|
||||||
public abstract Anno[] x();// x()
|
public abstract Anno[] x();// x()
|
||||||
|
|
||||||
@@ -42,23 +49,27 @@ public abstract @interface Anno /* Anno*/ {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated(message = "This anno is deprecated, use === instead", replaceWith = ?)
|
@Deprecated(message = "This anno is deprecated, use === instead", replaceWith = ?)
|
||||||
|
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
|
||||||
@kotlin.annotation.MustBeDocumented()
|
@kotlin.annotation.MustBeDocumented()
|
||||||
@kotlin.annotation.Retention(value = kotlin.annotation.AnnotationRetention.SOURCE)
|
@kotlin.annotation.Retention(value = kotlin.annotation.AnnotationRetention.SOURCE)
|
||||||
@kotlin.annotation.Target(allowedTargets = kotlin.annotation.AnnotationTarget.CLASS)
|
@kotlin.annotation.Target(allowedTargets = kotlin.annotation.AnnotationTarget.CLASS)
|
||||||
public abstract @interface Fancy /* Fancy*/ {
|
public abstract @interface Fancy /* Fancy*/ {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
|
||||||
public abstract @interface ReplaceWith /* ReplaceWith*/ {
|
public abstract @interface ReplaceWith /* ReplaceWith*/ {
|
||||||
public abstract java.lang.String expression();// expression()
|
public abstract java.lang.String expression();// expression()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
|
||||||
public abstract @interface AnnotatedAttribute /* AnnotatedAttribute*/ {
|
public abstract @interface AnnotatedAttribute /* AnnotatedAttribute*/ {
|
||||||
@Anno()
|
@Anno()
|
||||||
public abstract java.lang.String x();// x()
|
public abstract java.lang.String x();// x()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
|
||||||
public abstract @interface Deprecated /* Deprecated*/ {
|
public abstract @interface Deprecated /* Deprecated*/ {
|
||||||
public abstract ReplaceWith replaceWith();// replaceWith()
|
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 @interface Ann /* Ann*/ {
|
||||||
public abstract java.lang.Class<? extends java.lang.Object> arg2();// arg2()
|
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 @interface SimpleAnn /* SimpleAnn*/ {
|
||||||
public abstract java.lang.String value();// value()
|
public abstract java.lang.String value();// value()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
|
||||||
public abstract @interface Ann /* Ann*/ {
|
public abstract @interface Ann /* Ann*/ {
|
||||||
public abstract SimpleAnn[] t();// t()
|
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)
|
@kotlin.annotation.Target(allowedTargets = kotlin.annotation.AnnotationTarget.VALUE_PARAMETER)
|
||||||
public abstract @interface A0 /* A0*/ {
|
public abstract @interface A0 /* A0*/ {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
|
||||||
@kotlin.annotation.Target(allowedTargets = kotlin.annotation.AnnotationTarget.VALUE_PARAMETER)
|
@kotlin.annotation.Target(allowedTargets = kotlin.annotation.AnnotationTarget.VALUE_PARAMETER)
|
||||||
public abstract @interface A1 /* A1*/ {
|
public abstract @interface A1 /* A1*/ {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
|
||||||
@kotlin.annotation.Target(allowedTargets = kotlin.annotation.AnnotationTarget.VALUE_PARAMETER)
|
@kotlin.annotation.Target(allowedTargets = kotlin.annotation.AnnotationTarget.VALUE_PARAMETER)
|
||||||
public abstract @interface A2 /* A2*/ {
|
public abstract @interface A2 /* A2*/ {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
|
||||||
@kotlin.annotation.Target(allowedTargets = kotlin.annotation.AnnotationTarget.VALUE_PARAMETER)
|
@kotlin.annotation.Target(allowedTargets = kotlin.annotation.AnnotationTarget.VALUE_PARAMETER)
|
||||||
public abstract @interface A3 /* A3*/ {
|
public abstract @interface A3 /* A3*/ {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
|
||||||
@kotlin.annotation.Target(allowedTargets = kotlin.annotation.AnnotationTarget.VALUE_PARAMETER)
|
@kotlin.annotation.Target(allowedTargets = kotlin.annotation.AnnotationTarget.VALUE_PARAMETER)
|
||||||
public abstract @interface A4 /* A4*/ {
|
public abstract @interface A4 /* A4*/ {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
|
||||||
@kotlin.annotation.Target(allowedTargets = kotlin.annotation.AnnotationTarget.VALUE_PARAMETER)
|
@kotlin.annotation.Target(allowedTargets = kotlin.annotation.AnnotationTarget.VALUE_PARAMETER)
|
||||||
public abstract @interface A5 /* A5*/ {
|
public abstract @interface A5 /* A5*/ {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
|
||||||
@kotlin.annotation.Target(allowedTargets = kotlin.annotation.AnnotationTarget.VALUE_PARAMETER)
|
@kotlin.annotation.Target(allowedTargets = kotlin.annotation.AnnotationTarget.VALUE_PARAMETER)
|
||||||
public abstract @interface A6 /* A6*/ {
|
public abstract @interface A6 /* A6*/ {
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user