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) {
val argumentList = buildArgumentList {
source = valueArgumentList?.toFirSourceElement()
for (argument in valueArguments) {
val argumentExpression = argument.toFirExpression()
arguments += when (argument) {
@@ -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(
@@ -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 <D> transformArguments(transformer: FirTransformer<D>, data: D): FirArgumentList {
return this
}
@@ -24,8 +24,11 @@ fun buildBinaryArgumentList(left: FirExpression, right: FirExpression): FirArgum
fun buildArraySetArgumentList(rValue: FirExpression, indexes: List<FirExpression>): FirArgumentList =
FirArraySetArgumentList(rValue, indexes)
fun buildResolvedArgumentList(mapping: LinkedHashMap<FirExpression, FirValueParameter>): FirResolvedArgumentList =
FirResolvedArgumentList(mapping)
fun buildResolvedArgumentList(
mapping: LinkedHashMap<FirExpression, FirValueParameter>,
source: FirSourceElement? = null
): FirResolvedArgumentList =
FirResolvedArgumentList(mapping, source)
fun buildPartiallyResolvedArgumentList(
original: FirArgumentList,
@@ -40,4 +43,7 @@ fun buildPartiallyResolvedArgumentList(
object FirEmptyArgumentList : FirAbstractArgumentList() {
override val arguments: List<FirExpression>
get() = emptyList()
override val source: FirSourceElement?
get() = null
}
@@ -15,4 +15,7 @@ class FirArraySetArgumentList internal constructor(
) : FirAbstractArgumentList() {
override val arguments: List<FirExpression>
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
class FirResolvedArgumentList internal constructor(
mapping: LinkedHashMap<FirExpression, FirValueParameter>
mapping: LinkedHashMap<FirExpression, FirValueParameter>,
override val source: FirSourceElement?
) : FirAbstractArgumentList() {
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");
}
@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")