FIR IDE: use KtVariableWithInvokeFunctionCall for extension invoke

This commit is contained in:
Tianyu Geng
2021-08-30 11:33:30 -07:00
committed by Ilya Kirillov
parent c19ed07fd1
commit 9ca8d39240
9 changed files with 27 additions and 7 deletions
@@ -20,7 +20,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
import org.jetbrains.kotlin.util.OperatorNameConventions import org.jetbrains.kotlin.util.OperatorNameConventions
fun FirFunctionCall.isImplicitFunctionCall(): Boolean { fun FirFunctionCall.isImplicitFunctionCall(): Boolean {
if (dispatchReceiver !is FirQualifiedAccessExpression) return false if (extensionReceiver !is FirQualifiedAccessExpression && dispatchReceiver !is FirQualifiedAccessExpression) return false
return calleeReference.getCandidateSymbols().any(FirBasedSymbol<*>::isInvokeFunction) return calleeReference.getCandidateSymbols().any(FirBasedSymbol<*>::isInvokeFunction)
} }
@@ -181,7 +181,8 @@ internal class KtFirCallResolver(
return when { return when {
firCall.isImplicitFunctionCall() -> { firCall.isImplicitFunctionCall() -> {
val target = with(FirReferenceResolveHelper) { val target = with(FirReferenceResolveHelper) {
val calleeReference = (firCall.dispatchReceiver as FirQualifiedAccessExpression).calleeReference val calleeReference = ((firCall.extensionReceiver as? FirQualifiedAccessExpression)
?: firCall.dispatchReceiver as FirQualifiedAccessExpression).calleeReference
calleeReference.toTargetSymbol(session, firSymbolBuilder).singleOrNull() calleeReference.toTargetSymbol(session, firSymbolBuilder).singleOrNull()
} }
when (target) { when (target) {
@@ -259,8 +259,14 @@ public class ResolveCallTestGenerated extends AbstractResolveCallTest {
} }
@Test @Test
@TestMetadata("variableWithInvoke.kt") @TestMetadata("variableWithExtensionInvoke.kt")
public void testVariableWithInvoke() throws Exception { public void testVariableWithExtensionInvoke() throws Exception {
runTest("analysis/analysis-api/testData/analysisSession/resolveCall/variableWithInvoke.kt"); runTest("analysis/analysis-api/testData/analysisSession/resolveCall/variableWithExtensionInvoke.kt");
}
@Test
@TestMetadata("variableWithMemberInvoke.kt")
public void testVariableWithMemberInvoke() throws Exception {
runTest("analysis/analysis-api/testData/analysisSession/resolveCall/variableWithMemberInvoke.kt");
} }
} }
@@ -1,5 +1,5 @@
operator fun Int.invoke(): String {} operator fun Int.invoke(): String {}
fun call(x: kotlin.int) { fun call(x: kotlin.Int) {
<expr>x()</expr> <expr>x()</expr>
} }
@@ -1,4 +1,5 @@
KtFunctionCall: KtVariableWithInvokeFunctionCall:
target = x: kotlin.Int
argumentMapping = { } argumentMapping = { }
targetFunction = /invoke(<extension receiver>: kotlin.Int): kotlin.String targetFunction = /invoke(<extension receiver>: kotlin.Int): kotlin.String
substitutor = <empty substitutor> substitutor = <empty substitutor>
@@ -0,0 +1,7 @@
interface Foo
operator fun <T> Foo.invoke(t: T) {}
fun test(f: Foo) {
<expr>f("")</expr>
}
@@ -0,0 +1,5 @@
KtVariableWithInvokeFunctionCall:
target = f: Foo
argumentMapping = { "" -> (t: kotlin.String) }
targetFunction = /invoke(<extension receiver>: Foo, t: kotlin.String): kotlin.Unit
substitutor = <map substitutor: {FirTypeParameterSymbol T=kotlin/String}>