From ae17cd639bd18578daf5faca27ff4b86e65d0cf8 Mon Sep 17 00:00:00 2001 From: Mark Punzalan Date: Mon, 9 Aug 2021 17:42:32 +0000 Subject: [PATCH] FIR IDE: Correctly create KtFunctionalTypeVariableCall when function call has errors. --- .../api/fir/components/KtFirCallResolver.kt | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) 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 9c108026287..e4502ab0aab 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 @@ -11,7 +11,10 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnostic import org.jetbrains.kotlin.fir.declarations.FirConstructor import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.realPsi -import org.jetbrains.kotlin.fir.references.* +import org.jetbrains.kotlin.fir.references.FirErrorNamedReference +import org.jetbrains.kotlin.fir.references.FirReference +import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference +import org.jetbrains.kotlin.fir.references.FirSuperReference import org.jetbrains.kotlin.fir.references.impl.FirSimpleNamedReference import org.jetbrains.kotlin.fir.resolve.calls.FirErrorReferenceWithCandidate import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol @@ -104,26 +107,25 @@ internal class KtFirCallResolver( } private fun FirFunctionCall.createCallByVariableLikeSymbolCall(variableLikeSymbol: KtVariableLikeSymbol): KtCall? { - return when (val callReference = calleeReference) { + val (functionSymbol, target) = when (val callReference = calleeReference) { is FirResolvedNamedReference -> { val functionSymbol = callReference.resolvedSymbol as? FirNamedFunctionSymbol - val callableId = functionSymbol?.callableId ?: return null - (callReference.resolvedSymbol.fir.buildSymbol(firSymbolBuilder) as? KtFunctionSymbol) - ?.let { - if (callableId in kotlinFunctionInvokeCallableIds) { - KtFunctionalTypeVariableCall(variableLikeSymbol, createArgumentMapping(), KtSuccessCallTarget(it)) - } else { - KtVariableWithInvokeFunctionCall(variableLikeSymbol, createArgumentMapping(), KtSuccessCallTarget(it)) - } - } + (functionSymbol?.fir?.buildSymbol(firSymbolBuilder) as? KtFunctionSymbol)?.let { + functionSymbol to KtSuccessCallTarget(it) + } ?: return null + } + is FirErrorNamedReference -> { + val functionSymbol = callReference.candidateSymbol as? FirNamedFunctionSymbol + functionSymbol to callReference.createErrorCallTarget(source) } - is FirErrorNamedReference -> KtVariableWithInvokeFunctionCall( - variableLikeSymbol, - createArgumentMapping(), - callReference.createErrorCallTarget(source) - ) else -> error("Unexpected call reference ${callReference::class.simpleName}") } + val callableId = functionSymbol?.callableId ?: return null + return if (callableId in kotlinFunctionInvokeCallableIds) { + KtFunctionalTypeVariableCall(variableLikeSymbol, createArgumentMapping(), target) + } else { + KtVariableWithInvokeFunctionCall(variableLikeSymbol, createArgumentMapping(), target) + } } private fun FirFunctionCall.asSimpleFunctionCall(): KtFunctionCall? {