[AA-FIR] Fix handling of Java annotation parameters.
This changes FirAnnotationValueConverter to no longer rely on PSI
information when projecting annotation parameter information to AA.
For annotations defined in Java, including many meta-annotations, PSI
information is not available for the annotation. This caused those
annotation values to be projected as KtUnsupportedAnnotationValue.
Instead of using PSI information, this changes
FirAnnotationValueConverter to use the tree structure instead. Spread
and named parameter arguments are spliced into the parameter list of
their surrounding vararg calls, meaning that callers see the expected
structure. (See the varargSpreadParameter.kt test file for an example.)
diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/annotations/Fe10IdeNormalAnalysisSourceModuleAnalysisApiAnnotationsOnDeclarationsTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/annotations/Fe10IdeNormalAnalysisSourceModuleAnalysisApiAnnotationsOnDeclarationsTestGenerated.java
index 41ef5ac..a1e53cf 100644
--- a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/annotations/Fe10IdeNormalAnalysisSourceModuleAnalysisApiAnnotationsOnDeclarationsTestGenerated.java
+++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/annotations/Fe10IdeNormalAnalysisSourceModuleAnalysisApiAnnotationsOnDeclarationsTestGenerated.java
@@ -108,6 +108,12 @@
public void testVarargParameter() throws Exception {
runTest("analysis/analysis-api/testData/annotations/annotationsOnDeclaration/direct/varargParameter.kt");
}
+
+ @Test
+ @TestMetadata("varargSpreadParameter.kt")
+ public void testVarargSpreadParameter() throws Exception {
+ runTest("analysis/analysis-api/testData/annotations/annotationsOnDeclaration/direct/varargSpreadParameter.kt");
+ }
}
@Nested
diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirAnnotationValueConverter.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirAnnotationValueConverter.kt
index 439f0e2..70aa45d 100644
--- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirAnnotationValueConverter.kt
+++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirAnnotationValueConverter.kt
@@ -41,37 +41,19 @@
return KtConstantAnnotationValue(constantValue)
}
- private fun Collection<FirExpression>.convertConstantExpression(
+ private fun Collection<FirExpression>.convertVarargsExpression(
session: FirSession,
): Collection<KtAnnotationValue> =
- mapNotNull { it.convertConstantExpression(session) }
-
- // Refer to KtLightAnnotationParameterList#checkIfToArrayConversionExpected
- private fun ValueArgument?.arrayConversionExpected(): Boolean {
- return when {
- this == null -> false
- this is KtValueArgument && isSpread -> {
- // Anno(*[1,2,3])
- false
- }
-
- else -> {
- // Anno(a = [1,2,3]) v.s. Anno(1) or Anno(1,2,3)
- !isNamed()
+ flatMap { expr ->
+ val annotationValue = expr.convertConstantExpression(session)
+ when {
+ annotationValue == null -> listOf()
+ expr is FirSpreadArgumentExpression || expr is FirNamedArgumentExpression ->
+ (annotationValue as KtArrayAnnotationValue).values
+ else -> listOf(annotationValue)
}
}
- }
- private fun Collection<KtAnnotationValue>.toArrayConstantValueIfNecessary(sourcePsi: KtElement?): KtAnnotationValue? {
- val valueArgument = if (sourcePsi is ValueArgument) sourcePsi else
- (sourcePsi?.parents?.firstOrNull { it is ValueArgument } as? ValueArgument)
- val wrap = valueArgument?.arrayConversionExpected() ?: false
- return if (wrap) {
- KtArrayAnnotationValue(this, sourcePsi)
- } else {
- singleOrNull()
- }
- }
fun toConstantValue(
firExpression: FirExpression,
@@ -94,12 +76,12 @@
}
is FirVarargArgumentsExpression -> {
- arguments.convertConstantExpression(session).toArrayConstantValueIfNecessary(sourcePsi)
+ KtArrayAnnotationValue(arguments.convertVarargsExpression(session), sourcePsi)
}
is FirArrayOfCall -> {
// Desugared collection literals.
- KtArrayAnnotationValue(argumentList.arguments.convertConstantExpression(session), sourcePsi)
+ KtArrayAnnotationValue(argumentList.arguments.convertVarargsExpression(session), sourcePsi)
}
is FirFunctionCall -> {
diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/annotations/FirIdeDependentAnalysisSourceModuleAnalysisApiAnnotationsOnDeclarationsTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/annotations/FirIdeDependentAnalysisSourceModuleAnalysisApiAnnotationsOnDeclarationsTestGenerated.java
index 5f1ee1b..a645f05 100644
--- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/annotations/FirIdeDependentAnalysisSourceModuleAnalysisApiAnnotationsOnDeclarationsTestGenerated.java
+++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/annotations/FirIdeDependentAnalysisSourceModuleAnalysisApiAnnotationsOnDeclarationsTestGenerated.java
@@ -108,6 +108,12 @@
public void testVarargParameter() throws Exception {
runTest("analysis/analysis-api/testData/annotations/annotationsOnDeclaration/direct/varargParameter.kt");
}
+
+ @Test
+ @TestMetadata("varargSpreadParameter.kt")
+ public void testVarargSpreadParameter() throws Exception {
+ runTest("analysis/analysis-api/testData/annotations/annotationsOnDeclaration/direct/varargSpreadParameter.kt");
+ }
}
@Nested
diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/annotations/FirIdeNormalAnalysisSourceModuleAnalysisApiAnnotationsOnDeclarationsTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/annotations/FirIdeNormalAnalysisSourceModuleAnalysisApiAnnotationsOnDeclarationsTestGenerated.java
index 9d9db67..72ad95f 100644
--- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/annotations/FirIdeNormalAnalysisSourceModuleAnalysisApiAnnotationsOnDeclarationsTestGenerated.java
+++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/annotations/FirIdeNormalAnalysisSourceModuleAnalysisApiAnnotationsOnDeclarationsTestGenerated.java
@@ -108,6 +108,12 @@
public void testVarargParameter() throws Exception {
runTest("analysis/analysis-api/testData/annotations/annotationsOnDeclaration/direct/varargParameter.kt");
}
+
+ @Test
+ @TestMetadata("varargSpreadParameter.kt")
+ public void testVarargSpreadParameter() throws Exception {
+ runTest("analysis/analysis-api/testData/annotations/annotationsOnDeclaration/direct/varargSpreadParameter.kt");
+ }
}
@Nested
diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/annotations/FirStandaloneNormalAnalysisSourceModuleAnalysisApiAnnotationsOnDeclarationsTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/annotations/FirStandaloneNormalAnalysisSourceModuleAnalysisApiAnnotationsOnDeclarationsTestGenerated.java
index 5c7808f..fa586ce 100644
--- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/annotations/FirStandaloneNormalAnalysisSourceModuleAnalysisApiAnnotationsOnDeclarationsTestGenerated.java
+++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/annotations/FirStandaloneNormalAnalysisSourceModuleAnalysisApiAnnotationsOnDeclarationsTestGenerated.java
@@ -108,6 +108,12 @@
public void testVarargParameter() throws Exception {
runTest("analysis/analysis-api/testData/annotations/annotationsOnDeclaration/direct/varargParameter.kt");
}
+
+ @Test
+ @TestMetadata("varargSpreadParameter.kt")
+ public void testVarargSpreadParameter() throws Exception {
+ runTest("analysis/analysis-api/testData/annotations/annotationsOnDeclaration/direct/varargSpreadParameter.kt");
+ }
}
@Nested
diff --git a/analysis/analysis-api/testData/annotations/annotationsOnDeclaration/direct/varargSpreadParameter.descriptors.txt b/analysis/analysis-api/testData/annotations/annotationsOnDeclaration/direct/varargSpreadParameter.descriptors.txt
new file mode 100644
index 0000000..9af69a9
--- /dev/null
+++ b/analysis/analysis-api/testData/annotations/annotationsOnDeclaration/direct/varargSpreadParameter.descriptors.txt
@@ -0,0 +1,5 @@
+KtDeclaration: KtClass Foo
+annotations: [
+ A(strings = [["foo", "bar"], "baz", ["quux"]])
+ psi: KtAnnotationEntry
+]
diff --git a/analysis/analysis-api/testData/annotations/annotationsOnDeclaration/direct/varargSpreadParameter.kt b/analysis/analysis-api/testData/annotations/annotationsOnDeclaration/direct/varargSpreadParameter.kt
new file mode 100644
index 0000000..ee1f2dc
--- /dev/null
+++ b/analysis/analysis-api/testData/annotations/annotationsOnDeclaration/direct/varargSpreadParameter.kt
@@ -0,0 +1,4 @@
+annotation class A(vararg val strings: String)
+
+@A(*arrayOf("foo", "bar"), "baz", *["quux"])
+class F<caret>oo
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/annotations/annotationsOnDeclaration/direct/varargSpreadParameter.txt b/analysis/analysis-api/testData/annotations/annotationsOnDeclaration/direct/varargSpreadParameter.txt
new file mode 100644
index 0000000..01c50d8
--- /dev/null
+++ b/analysis/analysis-api/testData/annotations/annotationsOnDeclaration/direct/varargSpreadParameter.txt
@@ -0,0 +1,5 @@
+KtDeclaration: KtClass Foo
+annotations: [
+ A(strings = ["foo", "bar", "baz", "quux"])
+ psi: KtAnnotationEntry
+]
diff --git a/analysis/analysis-api/testData/annotations/metaAnnotations/onProperty_javaAnnotation_varargParameter.txt b/analysis/analysis-api/testData/annotations/metaAnnotations/onProperty_javaAnnotation_varargParameter.txt
index 777fb0a..04659bf 100644
--- a/analysis/analysis-api/testData/annotations/metaAnnotations/onProperty_javaAnnotation_varargParameter.txt
+++ b/analysis/analysis-api/testData/annotations/metaAnnotations/onProperty_javaAnnotation_varargParameter.txt
@@ -3,7 +3,7 @@
JavaAnno(value = [java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD])
psi: KtAnnotationEntry
annotations: [
- kotlin/annotation/Target(allowedTargets = error("non-annotation value"))
+ kotlin/annotation/Target(allowedTargets = [kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER])
psi: null
annotations: [
kotlin/annotation/Target(allowedTargets = [kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS])