diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirModuleResolveStateDepended.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirModuleResolveStateDepended.kt
index 52bd3b1ac5d..ebbf519cea3 100644
--- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirModuleResolveStateDepended.kt
+++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirModuleResolveStateDepended.kt
@@ -42,7 +42,7 @@ internal class FirModuleResolveStateDepended(
originalState.getSessionFor(moduleInfo)
override fun getOrBuildFirFor(element: KtElement): FirElement? {
- val psi = originalState.elementBuilder.getPsiAsFirElementSource(element)
+ val psi = originalState.elementBuilder.getPsiAsFirElementSource(element) ?: return null
ktToFirMapping?.getFirOfClosestParent(psi, this)?.let { return it }
diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/element/builder/FirElementBuilder.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/element/builder/FirElementBuilder.kt
index bd1f07ac625..a7211c81a79 100644
--- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/element/builder/FirElementBuilder.kt
+++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/element/builder/FirElementBuilder.kt
@@ -32,7 +32,7 @@ import org.jetbrains.kotlin.psi2ir.deparenthesize
*/
@ThreadSafe
internal class FirElementBuilder {
- fun getPsiAsFirElementSource(element: KtElement): KtElement {
+ fun getPsiAsFirElementSource(element: KtElement): KtElement? {
val deparenthesized = if (element is KtPropertyDelegate) element.deparenthesize() else element
return when {
deparenthesized is KtParenthesizedExpression -> deparenthesized.deparenthesize()
@@ -44,6 +44,10 @@ internal class FirElementBuilder {
*/
deparenthesized.selectorExpression ?: error("Incomplete code:\n${element.getElementTextInContext()}")
}
+ deparenthesized is KtValueArgument -> {
+ // null will be return in case of invalid KtValueArgument
+ deparenthesized.getArgumentExpression()
+ }
else -> deparenthesized
}
}
@@ -88,7 +92,7 @@ internal class FirElementBuilder {
val fileStructure = fileStructureCache.getFileStructure(firFile, moduleFileCache)
val mappings = fileStructure.getStructureElementFor(element).mappings
- val psi = getPsiAsFirElementSource(element)
+ val psi = getPsiAsFirElementSource(element) ?: return null
return mappings.getFirOfClosestParent(psi, state)
?: state.getOrBuildFirFile(firFile)
}
diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationArgument.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationArgument.kt
new file mode 100644
index 00000000000..c9c6b9e74f9
--- /dev/null
+++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationArgument.kt
@@ -0,0 +1,6 @@
+public annotation class Annotation(val name: String)
+
+@Annotation("y")
+fun x() {
+
+}
\ No newline at end of file
diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationArgument.txt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationArgument.txt
new file mode 100644
index 00000000000..f7be7739b8b
--- /dev/null
+++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationArgument.txt
@@ -0,0 +1,5 @@
+KT element: KtValueArgument
+FIR element: FirConstExpressionImpl
+
+FIR element rendered:
+String(y)
diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationCallExpression.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationCallExpression.kt
new file mode 100644
index 00000000000..92b19ae6c04
--- /dev/null
+++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationCallExpression.kt
@@ -0,0 +1,5 @@
+// LOOK_UP_FOR_ELEMENT_OF_TYPE: org.jetbrains.kotlin.psi.KtConstructorCalleeExpression
+@Suppress("")
+fun x() {
+
+}
\ No newline at end of file
diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationCallExpression.txt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationCallExpression.txt
new file mode 100644
index 00000000000..e7fe74a878e
--- /dev/null
+++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationCallExpression.txt
@@ -0,0 +1,5 @@
+KT element: KtConstructorCalleeExpression
+FIR element: FirAnnotationCallImpl
+
+FIR element rendered:
+@R|kotlin/Suppress|(vararg(String()))
\ No newline at end of file
diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationVarargArgument.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationVarargArgument.kt
new file mode 100644
index 00000000000..2e36ccfa829
--- /dev/null
+++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationVarargArgument.kt
@@ -0,0 +1,4 @@
+@Suppress("1", "2")
+fun x() {
+
+}
\ No newline at end of file
diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationVarargArgument.txt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationVarargArgument.txt
new file mode 100644
index 00000000000..8b8d0a160d8
--- /dev/null
+++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationVarargArgument.txt
@@ -0,0 +1,5 @@
+KT element: KtValueArgument
+FIR element: FirConstExpressionImpl
+
+FIR element rendered:
+String(2)
\ No newline at end of file
diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationWithArguments.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationWithArguments.kt
new file mode 100644
index 00000000000..9a03d27fdf8
--- /dev/null
+++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationWithArguments.kt
@@ -0,0 +1,5 @@
+// LOOK_UP_FOR_ELEMENT_OF_TYPE: org.jetbrains.kotlin.psi.KtAnnotationEntry
+@Suppress("")
+fun x() {
+
+}
\ No newline at end of file
diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationWithArguments.txt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationWithArguments.txt
new file mode 100644
index 00000000000..296eb338fdd
--- /dev/null
+++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationWithArguments.txt
@@ -0,0 +1,5 @@
+KT element: KtAnnotationEntry
+FIR element: FirAnnotationCallImpl
+
+FIR element rendered:
+@R|kotlin/Suppress|(vararg(String()))
\ No newline at end of file
diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/GetOrBuildFirTestGenerated.java b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/GetOrBuildFirTestGenerated.java
index cde7ad9dfee..c2d8bd59bcd 100644
--- a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/GetOrBuildFirTestGenerated.java
+++ b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/GetOrBuildFirTestGenerated.java
@@ -24,6 +24,40 @@ public class GetOrBuildFirTestGenerated extends AbstractGetOrBuildFirTest {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
+ @Nested
+ @TestMetadata("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Annotations {
+ @Test
+ public void testAllFilesPresentInAnnotations() throws Exception {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations"), Pattern.compile("^(.+)\\.kt$"), null, true);
+ }
+
+ @Test
+ @TestMetadata("annotationApplicationArgument.kt")
+ public void testAnnotationApplicationArgument() throws Exception {
+ runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationArgument.kt");
+ }
+
+ @Test
+ @TestMetadata("annotationApplicationCallExpression.kt")
+ public void testAnnotationApplicationCallExpression() throws Exception {
+ runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationCallExpression.kt");
+ }
+
+ @Test
+ @TestMetadata("annotationApplicationVarargArgument.kt")
+ public void testAnnotationApplicationVarargArgument() throws Exception {
+ runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationVarargArgument.kt");
+ }
+
+ @Test
+ @TestMetadata("annotationApplicationWithArguments.kt")
+ public void testAnnotationApplicationWithArguments() throws Exception {
+ runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationWithArguments.kt");
+ }
+ }
+
@Nested
@TestMetadata("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/inImport")
@TestDataPath("$PROJECT_ROOT")