From f6a97cdec6a15bff27d199685b3baabcf1e399b0 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Fri, 9 Jul 2021 18:22:33 +0200 Subject: [PATCH] LL API: fix kt -> fir mapping for KtValueArgument --- .../api/FirModuleResolveStateDepended.kt | 2 +- .../api/element/builder/FirElementBuilder.kt | 8 +++-- .../annotationApplicationArgument.kt | 6 ++++ .../annotationApplicationArgument.txt | 5 +++ .../annotationApplicationCallExpression.kt | 5 +++ .../annotationApplicationCallExpression.txt | 5 +++ .../annotationApplicationVarargArgument.kt | 4 +++ .../annotationApplicationVarargArgument.txt | 5 +++ .../annotationApplicationWithArguments.kt | 5 +++ .../annotationApplicationWithArguments.txt | 5 +++ .../level/api/GetOrBuildFirTestGenerated.java | 34 +++++++++++++++++++ 11 files changed, 81 insertions(+), 3 deletions(-) create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationArgument.kt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationArgument.txt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationCallExpression.kt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationCallExpression.txt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationVarargArgument.kt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationVarargArgument.txt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationWithArguments.kt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationWithArguments.txt 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")