FIR IDE: use KtVariableWithInvokeFunctionCall for extension invoke
This commit is contained in:
committed by
Ilya Kirillov
parent
c19ed07fd1
commit
9ca8d39240
@@ -20,7 +20,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||
|
||||
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)
|
||||
}
|
||||
|
||||
|
||||
+2
-1
@@ -181,7 +181,8 @@ internal class KtFirCallResolver(
|
||||
return when {
|
||||
firCall.isImplicitFunctionCall() -> {
|
||||
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()
|
||||
}
|
||||
when (target) {
|
||||
|
||||
+9
-3
@@ -259,8 +259,14 @@ public class ResolveCallTestGenerated extends AbstractResolveCallTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("variableWithInvoke.kt")
|
||||
public void testVariableWithInvoke() throws Exception {
|
||||
runTest("analysis/analysis-api/testData/analysisSession/resolveCall/variableWithInvoke.kt");
|
||||
@TestMetadata("variableWithExtensionInvoke.kt")
|
||||
public void testVariableWithExtensionInvoke() throws Exception {
|
||||
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
-1
@@ -1,5 +1,5 @@
|
||||
operator fun Int.invoke(): String {}
|
||||
|
||||
fun call(x: kotlin.int) {
|
||||
fun call(x: kotlin.Int) {
|
||||
<expr>x()</expr>
|
||||
}
|
||||
|
||||
+2
-1
@@ -1,4 +1,5 @@
|
||||
KtFunctionCall:
|
||||
KtVariableWithInvokeFunctionCall:
|
||||
target = x: kotlin.Int
|
||||
argumentMapping = { }
|
||||
targetFunction = /invoke(<extension receiver>: kotlin.Int): kotlin.String
|
||||
substitutor = <empty substitutor>
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
interface Foo
|
||||
|
||||
operator fun <T> Foo.invoke(t: T) {}
|
||||
|
||||
fun test(f: Foo) {
|
||||
<expr>f("")</expr>
|
||||
}
|
||||
+5
@@ -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}>
|
||||
Reference in New Issue
Block a user