diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/FirUtils.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/FirUtils.kt
index 3a521fc1467..be47a590023 100644
--- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/FirUtils.kt
+++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/FirUtils.kt
@@ -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)
}
diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCallResolver.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCallResolver.kt
index eb4b9a3cfab..95e11331ffb 100644
--- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCallResolver.kt
+++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCallResolver.kt
@@ -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) {
diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/ResolveCallTestGenerated.java b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/ResolveCallTestGenerated.java
index 0081ce23a25..8270b11665d 100644
--- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/ResolveCallTestGenerated.java
+++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/ResolveCallTestGenerated.java
@@ -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");
}
}
diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/variableAsFunctionLikeCall.kt b/analysis/analysis-api/testData/analysisSession/resolveCall/variableAsFunctionLikeCall.kt
index 638eec4c231..78124268ff5 100644
--- a/analysis/analysis-api/testData/analysisSession/resolveCall/variableAsFunctionLikeCall.kt
+++ b/analysis/analysis-api/testData/analysisSession/resolveCall/variableAsFunctionLikeCall.kt
@@ -1,5 +1,5 @@
operator fun Int.invoke(): String {}
-fun call(x: kotlin.int) {
+fun call(x: kotlin.Int) {
x()
}
diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/variableAsFunctionLikeCall.txt b/analysis/analysis-api/testData/analysisSession/resolveCall/variableAsFunctionLikeCall.txt
index ca526504d8e..a29b36a748b 100644
--- a/analysis/analysis-api/testData/analysisSession/resolveCall/variableAsFunctionLikeCall.txt
+++ b/analysis/analysis-api/testData/analysisSession/resolveCall/variableAsFunctionLikeCall.txt
@@ -1,4 +1,5 @@
-KtFunctionCall:
+KtVariableWithInvokeFunctionCall:
+target = x: kotlin.Int
argumentMapping = { }
targetFunction = /invoke(: kotlin.Int): kotlin.String
substitutor =
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/variableWithExtensionInvoke.kt b/analysis/analysis-api/testData/analysisSession/resolveCall/variableWithExtensionInvoke.kt
new file mode 100644
index 00000000000..0ecf6d7d8f7
--- /dev/null
+++ b/analysis/analysis-api/testData/analysisSession/resolveCall/variableWithExtensionInvoke.kt
@@ -0,0 +1,7 @@
+interface Foo
+
+operator fun Foo.invoke(t: T) {}
+
+fun test(f: Foo) {
+ f("")
+}
diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/variableWithExtensionInvoke.txt b/analysis/analysis-api/testData/analysisSession/resolveCall/variableWithExtensionInvoke.txt
new file mode 100644
index 00000000000..9ebfb7ed0b6
--- /dev/null
+++ b/analysis/analysis-api/testData/analysisSession/resolveCall/variableWithExtensionInvoke.txt
@@ -0,0 +1,5 @@
+KtVariableWithInvokeFunctionCall:
+target = f: Foo
+argumentMapping = { "" -> (t: kotlin.String) }
+targetFunction = /invoke(: Foo, t: kotlin.String): kotlin.Unit
+substitutor =