From 6b57621863f9f15c2d6588b9ce5eab3a9504df06 Mon Sep 17 00:00:00 2001 From: Mark Punzalan Date: Mon, 9 Aug 2021 07:51:04 +0000 Subject: [PATCH] FIR IDE: Change key of argumentMapping in KtCall to KtExpression. --- .../kotlin/idea/frontend/api/calls/KtCall.kt | 14 ++++++------- .../api/fir/components/KtFirCallResolver.kt | 20 +++++++++---------- .../resolveCallInSuperConstructorParam.txt | 2 +- .../api/fir/AbstractResolveCallTest.kt | 2 +- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/calls/KtCall.kt b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/calls/KtCall.kt index da1d3a5571c..72acb5a84c9 100644 --- a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/calls/KtCall.kt +++ b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/calls/KtCall.kt @@ -9,14 +9,14 @@ import org.jetbrains.kotlin.idea.frontend.api.diagnostics.KtDiagnostic import org.jetbrains.kotlin.idea.frontend.api.symbols.KtFunctionLikeSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtValueParameterSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtVariableLikeSymbol -import org.jetbrains.kotlin.psi.KtValueArgument +import org.jetbrains.kotlin.psi.KtExpression /** * Represents direct or indirect (via invoke) function call from Kotlin code */ public sealed class KtCall { public abstract val isErrorCall: Boolean - public abstract val argumentMapping: LinkedHashMap + public abstract val argumentMapping: LinkedHashMap public abstract val targetFunction: KtCallTarget } @@ -29,7 +29,7 @@ public sealed class KtCall { */ public class KtFunctionalTypeVariableCall( public val target: KtVariableLikeSymbol, - override val argumentMapping: LinkedHashMap, + override val argumentMapping: LinkedHashMap, override val targetFunction: KtCallTarget ) : KtCall() { override val isErrorCall: Boolean get() = false @@ -54,7 +54,7 @@ public sealed class KtDeclaredFunctionCall : KtCall() { */ public class KtVariableWithInvokeFunctionCall( public val target: KtVariableLikeSymbol, - override val argumentMapping: LinkedHashMap, + override val argumentMapping: LinkedHashMap, override val targetFunction: KtCallTarget ) : KtDeclaredFunctionCall() @@ -64,7 +64,7 @@ public class KtVariableWithInvokeFunctionCall( * x.toString() // function call */ public class KtFunctionCall( - override val argumentMapping: LinkedHashMap, + override val argumentMapping: LinkedHashMap, override val targetFunction: KtCallTarget ) : KtDeclaredFunctionCall() @@ -75,7 +75,7 @@ public class KtFunctionCall( * annotation class Ann */ public class KtAnnotationCall( - override val argumentMapping: LinkedHashMap, + override val argumentMapping: LinkedHashMap, override val targetFunction: KtCallTarget ) : KtDeclaredFunctionCall() // TODO: Add other properties, e.g., useSiteTarget @@ -89,7 +89,7 @@ public class KtAnnotationCall( * } */ public class KtDelegatedConstructorCall( - override val argumentMapping: LinkedHashMap, + override val argumentMapping: LinkedHashMap, override val targetFunction: KtCallTarget, public val kind: KtDelegatedConstructorCallKind ) : KtDeclaredFunctionCall() diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirCallResolver.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirCallResolver.kt index e4502ab0aab..8870bc082f2 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirCallResolver.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirCallResolver.kt @@ -176,28 +176,28 @@ internal class KtFirCallResolver( } } - private fun FirCall.createArgumentMapping(): LinkedHashMap { - val ktArgumentMapping = LinkedHashMap() + private fun FirCall.createArgumentMapping(): LinkedHashMap { + val ktArgumentMapping = LinkedHashMap() argumentMapping?.let { - fun FirExpression.findKtValueArgument(): KtValueArgument? { + fun FirExpression.findKtExpression(): KtExpression? { // For spread and named arguments, the source is the KtValueArgument. - // For other arguments, the source is the KtExpression itself and its parent should be the KtValueArgument. - val psi = when (this) { - is FirNamedArgumentExpression, is FirSpreadArgumentExpression -> realPsi - else -> realPsi?.parent + // For other arguments (including array indices), the source is the KtExpression. + return when (this) { + is FirNamedArgumentExpression, is FirSpreadArgumentExpression -> + realPsi.safeAs()?.getArgumentExpression() + else -> realPsi as? KtExpression } - return psi as? KtValueArgument } for ((firExpression, firValueParameter) in it.entries) { val parameterSymbol = firValueParameter.buildSymbol(firSymbolBuilder) as KtValueParameterSymbol if (firExpression is FirVarargArgumentsExpression) { for (varargArgument in firExpression.arguments) { - val valueArgument = varargArgument.findKtValueArgument() ?: continue + val valueArgument = varargArgument.findKtExpression() ?: continue ktArgumentMapping[valueArgument] = parameterSymbol } } else { - val valueArgument = firExpression.findKtValueArgument() ?: continue + val valueArgument = firExpression.findKtExpression() ?: continue ktArgumentMapping[valueArgument] = parameterSymbol } } diff --git a/idea/idea-frontend-fir/testData/analysisSession/resolveCall/resolveCallInSuperConstructorParam.txt b/idea/idea-frontend-fir/testData/analysisSession/resolveCall/resolveCallInSuperConstructorParam.txt index cf8ca240ee9..9b83a01bc5b 100644 --- a/idea/idea-frontend-fir/testData/analysisSession/resolveCall/resolveCallInSuperConstructorParam.txt +++ b/idea/idea-frontend-fir/testData/analysisSession/resolveCall/resolveCallInSuperConstructorParam.txt @@ -1,3 +1,3 @@ KtFunctionCall: -argumentMapping = { } +argumentMapping = { 2 -> (other: B) } targetFunction = /to(: A, other: B): A \ No newline at end of file diff --git a/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/fir/frontend/api/fir/AbstractResolveCallTest.kt b/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/fir/frontend/api/fir/AbstractResolveCallTest.kt index bc85ae628e1..0a8e686b258 100644 --- a/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/fir/frontend/api/fir/AbstractResolveCallTest.kt +++ b/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/fir/frontend/api/fir/AbstractResolveCallTest.kt @@ -72,7 +72,7 @@ private fun KtCall.stringRepresentation(): String { is KtErrorCallTarget -> "ERR<${this.diagnostic.defaultMessage}, [${candidates.joinToString { it.stringValue() }}]>" is Boolean -> toString() is Map<*, *> -> entries.joinToString(prefix = "{ ", postfix = " }") { (k, v) -> "${k?.stringValue()} -> (${v?.stringValue()})" } - is KtValueArgument -> this.text + is KtExpression -> this.text is KtDelegatedConstructorCallKind -> toString() else -> error("unexpected parameter type ${this::class}") }