From 8e911b1e987899c0d33aec9490df793b987da6bf Mon Sep 17 00:00:00 2001 From: Roman Golyshev Date: Mon, 25 Oct 2021 17:36:46 +0300 Subject: [PATCH] [FIR IDE] Add fast path to `isImplicitFunctionCall` and improve its kdoc --- .../jetbrains/kotlin/analysis/api/fir/FirUtils.kt | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) 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 1efd3760254..8b8fd6d6cd8 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 @@ -15,13 +15,23 @@ import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference import org.jetbrains.kotlin.fir.resolve.diagnostics.* import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol -import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol +import org.jetbrains.kotlin.fir.expressions.FirImplicitInvokeCall import org.jetbrains.kotlin.util.OperatorNameConventions +/** + * Checks if the function call is an implicit invoke call with a simple qualified receiver, or looks like it. + * + * For example, `foo()` and `foo.bar()` have simple qualified receivers, while `foo!!()`, `{}()` and `(foo ?: bar)()` - don't. + * + * @return `true` if the function call has a simple qualified receiver and is an implicit invoke call, + * or looks like it and resolves to the `invoke` function. + */ fun FirFunctionCall.isImplicitFunctionCall(): Boolean { if (extensionReceiver !is FirQualifiedAccessExpression && dispatchReceiver !is FirQualifiedAccessExpression) return false - return calleeReference.getCandidateSymbols().any(FirBasedSymbol<*>::isInvokeFunction) + + return this is FirImplicitInvokeCall || + calleeReference.getCandidateSymbols().any(FirBasedSymbol<*>::isInvokeFunction) } private fun FirBasedSymbol<*>.isInvokeFunction() =