LL API: fix kt -> fir mapping for KtValueArgumentList

This commit is contained in:
Ilya Kirillov
2021-07-12 15:56:43 +02:00
committed by teamcityserver
parent f6a97cdec6
commit c266d3e075
13 changed files with 82 additions and 9 deletions
@@ -610,6 +610,7 @@ open class RawFirBuilder(
private fun KtCallElement.extractArgumentsTo(container: FirCallBuilder) { private fun KtCallElement.extractArgumentsTo(container: FirCallBuilder) {
val argumentList = buildArgumentList { val argumentList = buildArgumentList {
source = valueArgumentList?.toFirSourceElement()
for (argument in valueArguments) { for (argument in valueArguments) {
val argumentExpression = argument.toFirExpression() val argumentExpression = argument.toFirExpression()
arguments += when (argument) { arguments += when (argument) {
@@ -196,7 +196,7 @@ class FirCallCompletionResultsWriterTransformer(
} else { } else {
subCandidate.handleVarargs() subCandidate.handleVarargs()
subCandidate.argumentMapping?.let { subCandidate.argumentMapping?.let {
val newArgumentList = buildResolvedArgumentList(it) val newArgumentList = buildResolvedArgumentList(it, source = functionCall.argumentList.source)
val symbol = subCandidate.symbol val symbol = subCandidate.symbol
val functionIsInline = val functionIsInline =
(symbol as? FirNamedFunctionSymbol)?.fir?.isInline == true || symbol.isArrayConstructorWithLambda (symbol as? FirNamedFunctionSymbol)?.fir?.isInline == true || symbol.isArrayConstructorWithLambda
@@ -273,7 +273,7 @@ class FirCallCompletionResultsWriterTransformer(
} else { } else {
subCandidate.handleVarargs() subCandidate.handleVarargs()
subCandidate.argumentMapping?.let { subCandidate.argumentMapping?.let {
annotationCall.replaceArgumentList(buildResolvedArgumentList(it)) annotationCall.replaceArgumentList(buildResolvedArgumentList(it, annotationCall.argumentList.source))
} }
} }
return annotationCall return annotationCall
@@ -452,7 +452,7 @@ class FirCallCompletionResultsWriterTransformer(
} else { } else {
subCandidate.handleVarargs() subCandidate.handleVarargs()
subCandidate.argumentMapping?.let { subCandidate.argumentMapping?.let {
delegatedConstructorCall.replaceArgumentList(buildResolvedArgumentList(it)) delegatedConstructorCall.replaceArgumentList(buildResolvedArgumentList(it, delegatedConstructorCall.argumentList.source))
} }
} }
return delegatedConstructorCall.transformCalleeReference( return delegatedConstructorCall.transformCalleeReference(
@@ -11,9 +11,6 @@ import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
abstract class FirAbstractArgumentList : FirArgumentList() { abstract class FirAbstractArgumentList : FirArgumentList() {
override val source: FirSourceElement?
get() = null
override fun <D> transformArguments(transformer: FirTransformer<D>, data: D): FirArgumentList { override fun <D> transformArguments(transformer: FirTransformer<D>, data: D): FirArgumentList {
return this return this
} }
@@ -24,8 +24,11 @@ fun buildBinaryArgumentList(left: FirExpression, right: FirExpression): FirArgum
fun buildArraySetArgumentList(rValue: FirExpression, indexes: List<FirExpression>): FirArgumentList = fun buildArraySetArgumentList(rValue: FirExpression, indexes: List<FirExpression>): FirArgumentList =
FirArraySetArgumentList(rValue, indexes) FirArraySetArgumentList(rValue, indexes)
fun buildResolvedArgumentList(mapping: LinkedHashMap<FirExpression, FirValueParameter>): FirResolvedArgumentList = fun buildResolvedArgumentList(
FirResolvedArgumentList(mapping) mapping: LinkedHashMap<FirExpression, FirValueParameter>,
source: FirSourceElement? = null
): FirResolvedArgumentList =
FirResolvedArgumentList(mapping, source)
fun buildPartiallyResolvedArgumentList( fun buildPartiallyResolvedArgumentList(
original: FirArgumentList, original: FirArgumentList,
@@ -40,4 +43,7 @@ fun buildPartiallyResolvedArgumentList(
object FirEmptyArgumentList : FirAbstractArgumentList() { object FirEmptyArgumentList : FirAbstractArgumentList() {
override val arguments: List<FirExpression> override val arguments: List<FirExpression>
get() = emptyList() get() = emptyList()
override val source: FirSourceElement?
get() = null
} }
@@ -15,4 +15,7 @@ class FirArraySetArgumentList internal constructor(
) : FirAbstractArgumentList() { ) : FirAbstractArgumentList() {
override val arguments: List<FirExpression> override val arguments: List<FirExpression>
get() = indexes + rValue get() = indexes + rValue
override val source: FirSourceElement?
get() = null
} }
@@ -15,7 +15,8 @@ import org.jetbrains.kotlin.fir.visitors.FirVisitor
import org.jetbrains.kotlin.fir.visitors.transformSingle import org.jetbrains.kotlin.fir.visitors.transformSingle
class FirResolvedArgumentList internal constructor( class FirResolvedArgumentList internal constructor(
mapping: LinkedHashMap<FirExpression, FirValueParameter> mapping: LinkedHashMap<FirExpression, FirValueParameter>,
override val source: FirSourceElement?
) : FirAbstractArgumentList() { ) : FirAbstractArgumentList() {
var mapping: LinkedHashMap<FirExpression, FirValueParameter> = mapping var mapping: LinkedHashMap<FirExpression, FirValueParameter> = mapping
@@ -0,0 +1,8 @@
// LOOK_UP_FOR_ELEMENT_OF_TYPE: org.jetbrains.kotlin.psi.KtValueArgumentList
public annotation class Annotation(val name: String)
@Annotation<expr>("y")</expr>
fun x() {
}
@@ -0,0 +1,5 @@
KT element: KtValueArgumentList
FIR element: FirResolvedArgumentList
FIR element rendered:
String(y)
@@ -0,0 +1,9 @@
// LOOK_UP_FOR_ELEMENT_OF_TYPE: org.jetbrains.kotlin.psi.KtValueArgumentList
fun callMe(x: Int, y: String) {
}
fun foo() {
callMe<expr>(1, "2")</expr>
}
@@ -0,0 +1,5 @@
KT element: KtValueArgumentList
FIR element: FirResolvedArgumentList
FIR element rendered:
Int(1)String(2)
@@ -0,0 +1,5 @@
// LOOK_UP_FOR_ELEMENT_OF_TYPE: org.jetbrains.kotlin.psi.KtValueArgumentList
fun foo(f: (Int, String) -> Unit) {
f<expr>(1, "2")</expr>
}
@@ -0,0 +1,5 @@
KT element: KtValueArgumentList
FIR element: FirResolvedArgumentList
FIR element rendered:
Int(1)String(2)
@@ -39,6 +39,12 @@ public class GetOrBuildFirTestGenerated extends AbstractGetOrBuildFirTest {
runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/annotations/annotationApplicationArgument.kt"); 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 @Test
@TestMetadata("annotationApplicationCallExpression.kt") @TestMetadata("annotationApplicationCallExpression.kt")
public void testAnnotationApplicationCallExpression() throws Exception { 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 @Nested
@TestMetadata("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/inImport") @TestMetadata("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/getOrBuildFir/inImport")
@TestDataPath("$PROJECT_ROOT") @TestDataPath("$PROJECT_ROOT")