From c266d3e07589ea201e0ebb89855b6b1bd5427249 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Mon, 12 Jul 2021 15:56:43 +0200 Subject: [PATCH] LL API: fix kt -> fir mapping for KtValueArgumentList --- .../kotlin/fir/builder/RawFirBuilder.kt | 1 + ...rCallCompletionResultsWriterTransformer.kt | 6 ++-- .../expressions/FirAbstractArgumentList.kt | 3 -- .../kotlin/fir/expressions/FirArgumentUtil.kt | 10 +++++-- .../impl/FirArraySetArgumentList.kt | 3 ++ .../impl/FirResolvedArgumentList.kt | 3 +- .../annotationApplicationArgumentList.kt | 8 ++++++ .../annotationApplicationArgumentList.txt | 5 ++++ .../calls/functionCallArgumentList.kt | 9 ++++++ .../calls/functionCallArgumentList.txt | 5 ++++ .../calls/invokeCallArgumentList.kt | 5 ++++ .../calls/invokeCallArgumentList.txt | 5 ++++ .../level/api/GetOrBuildFirTestGenerated.java | 28 +++++++++++++++++++ 13 files changed, 82 insertions(+), 9 deletions(-) create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationArgumentList.kt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationArgumentList.txt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/calls/functionCallArgumentList.kt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/calls/functionCallArgumentList.txt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/calls/invokeCallArgumentList.kt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/calls/invokeCallArgumentList.txt diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index 083d7be1a1f..08da33074f1 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -610,6 +610,7 @@ open class RawFirBuilder( private fun KtCallElement.extractArgumentsTo(container: FirCallBuilder) { val argumentList = buildArgumentList { + source = valueArgumentList?.toFirSourceElement() for (argument in valueArguments) { val argumentExpression = argument.toFirExpression() arguments += when (argument) { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt index cf26a08efe2..2efe77f427c 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt @@ -196,7 +196,7 @@ class FirCallCompletionResultsWriterTransformer( } else { subCandidate.handleVarargs() subCandidate.argumentMapping?.let { - val newArgumentList = buildResolvedArgumentList(it) + val newArgumentList = buildResolvedArgumentList(it, source = functionCall.argumentList.source) val symbol = subCandidate.symbol val functionIsInline = (symbol as? FirNamedFunctionSymbol)?.fir?.isInline == true || symbol.isArrayConstructorWithLambda @@ -273,7 +273,7 @@ class FirCallCompletionResultsWriterTransformer( } else { subCandidate.handleVarargs() subCandidate.argumentMapping?.let { - annotationCall.replaceArgumentList(buildResolvedArgumentList(it)) + annotationCall.replaceArgumentList(buildResolvedArgumentList(it, annotationCall.argumentList.source)) } } return annotationCall @@ -452,7 +452,7 @@ class FirCallCompletionResultsWriterTransformer( } else { subCandidate.handleVarargs() subCandidate.argumentMapping?.let { - delegatedConstructorCall.replaceArgumentList(buildResolvedArgumentList(it)) + delegatedConstructorCall.replaceArgumentList(buildResolvedArgumentList(it, delegatedConstructorCall.argumentList.source)) } } return delegatedConstructorCall.transformCalleeReference( diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirAbstractArgumentList.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirAbstractArgumentList.kt index 7b2ea39ca09..9cae4ba6789 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirAbstractArgumentList.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirAbstractArgumentList.kt @@ -11,9 +11,6 @@ import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirVisitor abstract class FirAbstractArgumentList : FirArgumentList() { - override val source: FirSourceElement? - get() = null - override fun transformArguments(transformer: FirTransformer, data: D): FirArgumentList { return this } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirArgumentUtil.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirArgumentUtil.kt index e3863e9a344..f8190e75299 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirArgumentUtil.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirArgumentUtil.kt @@ -24,8 +24,11 @@ fun buildBinaryArgumentList(left: FirExpression, right: FirExpression): FirArgum fun buildArraySetArgumentList(rValue: FirExpression, indexes: List): FirArgumentList = FirArraySetArgumentList(rValue, indexes) -fun buildResolvedArgumentList(mapping: LinkedHashMap): FirResolvedArgumentList = - FirResolvedArgumentList(mapping) +fun buildResolvedArgumentList( + mapping: LinkedHashMap, + source: FirSourceElement? = null +): FirResolvedArgumentList = + FirResolvedArgumentList(mapping, source) fun buildPartiallyResolvedArgumentList( original: FirArgumentList, @@ -40,4 +43,7 @@ fun buildPartiallyResolvedArgumentList( object FirEmptyArgumentList : FirAbstractArgumentList() { override val arguments: List get() = emptyList() + + override val source: FirSourceElement? + get() = null } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirArraySetArgumentList.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirArraySetArgumentList.kt index 1721b5f6b89..dafcb84a3c3 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirArraySetArgumentList.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirArraySetArgumentList.kt @@ -15,4 +15,7 @@ class FirArraySetArgumentList internal constructor( ) : FirAbstractArgumentList() { override val arguments: List get() = indexes + rValue + + override val source: FirSourceElement? + get() = null } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirResolvedArgumentList.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirResolvedArgumentList.kt index 2cbf34a8e34..2e0ad25f362 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirResolvedArgumentList.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirResolvedArgumentList.kt @@ -15,7 +15,8 @@ import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.transformSingle class FirResolvedArgumentList internal constructor( - mapping: LinkedHashMap + mapping: LinkedHashMap, + override val source: FirSourceElement? ) : FirAbstractArgumentList() { var mapping: LinkedHashMap = mapping diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationArgumentList.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationArgumentList.kt new file mode 100644 index 00000000000..623ff3cb7d2 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationArgumentList.kt @@ -0,0 +1,8 @@ +// LOOK_UP_FOR_ELEMENT_OF_TYPE: org.jetbrains.kotlin.psi.KtValueArgumentList + +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/annotationApplicationArgumentList.txt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationArgumentList.txt new file mode 100644 index 00000000000..f2b647db144 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationArgumentList.txt @@ -0,0 +1,5 @@ +KT element: KtValueArgumentList +FIR element: FirResolvedArgumentList + +FIR element rendered: +String(y) \ No newline at end of file diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/calls/functionCallArgumentList.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/calls/functionCallArgumentList.kt new file mode 100644 index 00000000000..03f7980dd42 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/calls/functionCallArgumentList.kt @@ -0,0 +1,9 @@ +// LOOK_UP_FOR_ELEMENT_OF_TYPE: org.jetbrains.kotlin.psi.KtValueArgumentList + +fun callMe(x: Int, y: String) { + +} + +fun foo() { + callMe(1, "2") +} \ No newline at end of file diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/calls/functionCallArgumentList.txt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/calls/functionCallArgumentList.txt new file mode 100644 index 00000000000..8a0138f06e9 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/calls/functionCallArgumentList.txt @@ -0,0 +1,5 @@ +KT element: KtValueArgumentList +FIR element: FirResolvedArgumentList + +FIR element rendered: +Int(1)String(2) \ No newline at end of file diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/calls/invokeCallArgumentList.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/calls/invokeCallArgumentList.kt new file mode 100644 index 00000000000..ed705134af7 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/calls/invokeCallArgumentList.kt @@ -0,0 +1,5 @@ +// LOOK_UP_FOR_ELEMENT_OF_TYPE: org.jetbrains.kotlin.psi.KtValueArgumentList + +fun foo(f: (Int, String) -> Unit) { + f(1, "2") +} \ No newline at end of file diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/calls/invokeCallArgumentList.txt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/calls/invokeCallArgumentList.txt new file mode 100644 index 00000000000..68822c831dd --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/calls/invokeCallArgumentList.txt @@ -0,0 +1,5 @@ +KT element: KtValueArgumentList +FIR element: FirResolvedArgumentList + +FIR element rendered: +Int(1)String(2) 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 c2d8bd59bcd..83c5feae100 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 @@ -39,6 +39,12 @@ public class GetOrBuildFirTestGenerated extends AbstractGetOrBuildFirTest { runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationArgument.kt"); } + @Test + @TestMetadata("annotationApplicationArgumentList.kt") + public void testAnnotationApplicationArgumentList() throws Exception { + runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationArgumentList.kt"); + } + @Test @TestMetadata("annotationApplicationCallExpression.kt") public void testAnnotationApplicationCallExpression() throws Exception { @@ -58,6 +64,28 @@ public class GetOrBuildFirTestGenerated extends AbstractGetOrBuildFirTest { } } + @Nested + @TestMetadata("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/calls") + @TestDataPath("$PROJECT_ROOT") + public class Calls { + @Test + public void testAllFilesPresentInCalls() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/calls"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("functionCallArgumentList.kt") + public void testFunctionCallArgumentList() throws Exception { + runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/calls/functionCallArgumentList.kt"); + } + + @Test + @TestMetadata("invokeCallArgumentList.kt") + public void testInvokeCallArgumentList() throws Exception { + runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/calls/invokeCallArgumentList.kt"); + } + } + @Nested @TestMetadata("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/inImport") @TestDataPath("$PROJECT_ROOT")