[SLC] Take into account declaration-side annotation targets
diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/symbolAnnotationsUtils.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/symbolAnnotationsUtils.kt
index 7cdcb95..329aa97 100644
--- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/symbolAnnotationsUtils.kt
+++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/symbolAnnotationsUtils.kt
@@ -32,6 +32,7 @@
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.name.StandardClassIds
import org.jetbrains.kotlin.resolve.deprecation.DeprecationLevelValue
+import java.lang.IllegalArgumentException
import java.lang.annotation.ElementType
internal fun KtAnnotatedSymbol.hasJvmSyntheticAnnotation(
@@ -99,12 +100,26 @@
SymbolLightSimpleAnnotation(it.name, parent)
}
+
context(KtAnalysisSession)
internal fun KtAnnotatedSymbol.computeAnnotations(
modifierList: PsiModifierList,
nullability: NullabilityType,
annotationUseSiteTarget: AnnotationUseSiteTarget?,
includeAnnotationsWithoutSite: Boolean = true,
+): List<PsiAnnotation> = computeAnnotations(
+ modifierList,
+ nullability
+) {
+ val siteTarget = it.useSiteTarget
+ includeAnnotationsWithoutSite && siteTarget == null || siteTarget == annotationUseSiteTarget
+}
+
+context(KtAnalysisSession)
+internal fun KtAnnotatedSymbol.computeAnnotations(
+ modifierList: PsiModifierList,
+ nullability: NullabilityType,
+ filter: (KtAnnotationApplication) -> Boolean
): List<PsiAnnotation> {
val parent = modifierList.parent
val nullabilityAnnotation = nullability.computeNullabilityAnnotation(modifierList)
@@ -121,9 +136,7 @@
val foundAnnotations = hashSetOf<String>()
for (annotation in annotations) {
annotation.classId?.asFqNameString()?.let(foundAnnotations::add)
-
- val siteTarget = annotation.useSiteTarget
- if (includeAnnotationsWithoutSite && siteTarget == null || siteTarget == annotationUseSiteTarget) {
+ if (filter(annotation)) {
result.add(SymbolLightAnnotationForAnnotationCall(annotation, modifierList))
}
}
@@ -322,3 +335,26 @@
annoApp.arguments.forEach { handleAnnotationValue(it.expression) }
}
+
+context(KtAnalysisSession)
+val KtAnnotationApplication.allowedTargets: Set<AnnotationTarget>?
+ get() {
+ val annotationClass = classId?.let(::getClassOrObjectSymbolByClassId) ?: return null
+ val targetAnnotation =
+ annotationClass.annotations.firstOrNull { it.classId?.asFqNameString() == "kotlin.annotation.Target" } ?: return null
+ val argument = targetAnnotation.arguments.firstOrNull { it.name.identifier == "allowedTargets" } ?: return null
+ return (argument.expression as? KtArrayAnnotationValue)
+ ?.values
+ ?.mapNotNull { it as? KtEnumEntryAnnotationValue }
+ ?.filter { it.callableId?.classId?.asFqNameString() == AnnotationTarget::class.qualifiedName }
+ ?.mapNotNull {
+ it.callableId?.callableName?.identifier?.let { name ->
+ try {
+ AnnotationTarget.valueOf(name)
+ } catch (_: IllegalArgumentException) {
+ null
+ }
+ }
+ }
+ ?.toSet()
+ }
diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForProperty.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForProperty.kt
index b4730ef..d6c506b 100644
--- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForProperty.kt
+++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForProperty.kt
@@ -19,6 +19,7 @@
import org.jetbrains.kotlin.asJava.classes.lazyPub
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.light.classes.symbol.*
+import org.jetbrains.kotlin.light.classes.symbol.annotations.allowedTargets
import org.jetbrains.kotlin.light.classes.symbol.annotations.computeAnnotations
import org.jetbrains.kotlin.light.classes.symbol.annotations.hasDeprecatedAnnotation
import org.jetbrains.kotlin.light.classes.symbol.classes.SymbolLightClassBase
@@ -157,9 +158,17 @@
propertySymbol.computeAnnotations(
modifierList = modifierList,
- nullability = nullability,
- annotationUseSiteTarget = AnnotationUseSiteTarget.FIELD,
- )
+ nullability = nullability
+ ){
+ val targets = it.allowedTargets
+
+ if (targets != null) {
+ if (AnnotationTarget.FIELD !in targets) return@computeAnnotations false
+ if (it.useSiteTarget == null && AnnotationTarget.PROPERTY !in targets) return@computeAnnotations true
+ }
+
+ return@computeAnnotations it.useSiteTarget == AnnotationUseSiteTarget.FIELD
+ }
}
}
}
diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightParameter.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightParameter.kt
index 3a8c093..1321eb5 100644
--- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightParameter.kt
+++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightParameter.kt
@@ -7,10 +7,12 @@
import com.intellij.psi.PsiModifierList
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
+import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplication
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
import org.jetbrains.kotlin.asJava.classes.lazyPub
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.light.classes.symbol.NullabilityType
+import org.jetbrains.kotlin.light.classes.symbol.annotations.allowedTargets
import org.jetbrains.kotlin.light.classes.symbol.annotations.computeAnnotations
import org.jetbrains.kotlin.light.classes.symbol.methods.SymbolLightMethodBase
import org.jetbrains.kotlin.light.classes.symbol.modifierLists.SymbolLightClassModifierList
@@ -40,9 +42,15 @@
parameterSymbol.computeAnnotations(
modifierList = modifierList,
nullability = nullability,
- annotationUseSiteTarget = annotationSite,
- includeAnnotationsWithoutSite = true,
- )
+ ) {
+ val targets = it.allowedTargets
+
+ if (targets != null) {
+ if (AnnotationTarget.VALUE_PARAMETER !in targets) return@computeAnnotations false
+ }
+
+ return@computeAnnotations it.useSiteTarget == null || it.useSiteTarget == annotationSite
+ }
}
}
}
diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/LateinitProperties.fir.java b/compiler/testData/asJava/lightClasses/lightClassByPsi/LateinitProperties.fir.java
deleted file mode 100644
index ad803c0..0000000
--- a/compiler/testData/asJava/lightClasses/lightClassByPsi/LateinitProperties.fir.java
+++ /dev/null
@@ -1,92 +0,0 @@
-public abstract class AbstractKotlinClass /* AbstractKotlinClass*/ {
- @kotlin.jvm.JvmStatic()
- public static Custom companionLateinitStaticVariable;
-
- @org.jetbrains.annotations.NotNull()
- public static final AbstractKotlinClass.Companion Companion;
-
- public Custom classLateinitVariable;
-
- public static Custom companionLateinitVariable;
-
- @org.jetbrains.annotations.NotNull()
- public final Custom getClassLateinitVariable();// getClassLateinitVariable()
-
- @org.jetbrains.annotations.NotNull()
- public static final Custom getCompanionLateinitStaticVariable();// getCompanionLateinitStaticVariable()
-
- public AbstractKotlinClass();// .ctor()
-
- public final void setClassLateinitVariable(@org.jetbrains.annotations.NotNull() Custom);// setClassLateinitVariable(Custom)
-
- public static final void setCompanionLateinitStaticVariable(@org.jetbrains.annotations.NotNull() Custom);// setCompanionLateinitStaticVariable(Custom)
-
- class Companion ...
-}
-
-public static final class Companion /* KotlinClass.Companion*/ {
- @org.jetbrains.annotations.NotNull()
- public final Custom getCompanionLateinitStaticVariable();// getCompanionLateinitStaticVariable()
-
- @org.jetbrains.annotations.NotNull()
- public final Custom getCompanionLateinitVariable();// getCompanionLateinitVariable()
-
- private Companion();// .ctor()
-
- public final void setCompanionLateinitStaticVariable(@org.jetbrains.annotations.NotNull() Custom);// setCompanionLateinitStaticVariable(Custom)
-
- public final void setCompanionLateinitVariable(@org.jetbrains.annotations.NotNull() Custom);// setCompanionLateinitVariable(Custom)
-}
-
-public static final class Companion /* AbstractKotlinClass.Companion*/ {
- @org.jetbrains.annotations.NotNull()
- public final Custom getCompanionLateinitStaticVariable();// getCompanionLateinitStaticVariable()
-
- @org.jetbrains.annotations.NotNull()
- public final Custom getCompanionLateinitVariable();// getCompanionLateinitVariable()
-
- private Companion();// .ctor()
-
- public final void setCompanionLateinitStaticVariable(@org.jetbrains.annotations.NotNull() Custom);// setCompanionLateinitStaticVariable(Custom)
-
- public final void setCompanionLateinitVariable(@org.jetbrains.annotations.NotNull() Custom);// setCompanionLateinitVariable(Custom)
-}
-
-public final class Custom /* Custom*/ {
- public Custom();// .ctor()
-}
-
-public final class KotlinClass /* KotlinClass*/ {
- @kotlin.jvm.JvmStatic()
- public static Custom companionLateinitStaticVariable;
-
- @org.jetbrains.annotations.NotNull()
- public static final KotlinClass.Companion Companion;
-
- public Custom classLateinitVariable;
-
- public static Custom companionLateinitVariable;
-
- @org.jetbrains.annotations.NotNull()
- public final Custom getClassLateinitVariable();// getClassLateinitVariable()
-
- @org.jetbrains.annotations.NotNull()
- public static final Custom getCompanionLateinitStaticVariable();// getCompanionLateinitStaticVariable()
-
- public KotlinClass();// .ctor()
-
- public final void setClassLateinitVariable(@org.jetbrains.annotations.NotNull() Custom);// setClassLateinitVariable(Custom)
-
- public static final void setCompanionLateinitStaticVariable(@org.jetbrains.annotations.NotNull() Custom);// setCompanionLateinitStaticVariable(Custom)
-
- class Companion ...
-}
-
-public final class LateinitPropertiesKt /* LateinitPropertiesKt*/ {
- public static Custom topLevelLateinit;
-
- @org.jetbrains.annotations.NotNull()
- public static final Custom getTopLevelLateinit();// getTopLevelLateinit()
-
- public static final void setTopLevelLateinit(@org.jetbrains.annotations.NotNull() Custom);// setTopLevelLateinit(Custom)
-}
diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/annotations.fir.java b/compiler/testData/asJava/lightClasses/lightClassByPsi/annotations.fir.java
index bd1fc5c..83dcaa3 100644
--- a/compiler/testData/asJava/lightClasses/lightClassByPsi/annotations.fir.java
+++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/annotations.fir.java
@@ -66,7 +66,6 @@
}
public final class CtorAnnotations /* CtorAnnotations*/ {
- @Anno()
@org.jetbrains.annotations.NotNull()
private final java.lang.String x;
@@ -121,7 +120,6 @@
@Anno()
public final class F /* F*/ implements java.lang.Runnable {
- @Anno(p = "p")
@org.jetbrains.annotations.NotNull()
private java.lang.String prop = "x" /* initializer type: java.lang.String */;
diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/objects.fir.java b/compiler/testData/asJava/lightClasses/lightClassByPsi/objects.fir.java
index c6cbdb8..4e5a748 100644
--- a/compiler/testData/asJava/lightClasses/lightClassByPsi/objects.fir.java
+++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/objects.fir.java
@@ -1,8 +1,4 @@
public final class C /* C*/ {
- @kotlin.jvm.JvmStatic()
- @org.jetbrains.annotations.NotNull()
- private static java.lang.String x = "" /* initializer type: java.lang.String */;
-
@org.jetbrains.annotations.NotNull()
private static java.lang.String c1;
@@ -10,6 +6,9 @@
private static java.lang.String c;
@org.jetbrains.annotations.NotNull()
+ private static java.lang.String x = "" /* initializer type: java.lang.String */;
+
+ @org.jetbrains.annotations.NotNull()
public static final C.Companion Companion;
@org.jetbrains.annotations.NotNull()
@@ -146,7 +145,6 @@
}
public final class Obj /* Obj*/ implements java.lang.Runnable {
- @kotlin.jvm.JvmStatic()
@org.jetbrains.annotations.NotNull()
private static java.lang.String x = "" /* initializer type: java.lang.String */;