[Analysis API FIR] optimize KtFirCompletionCandidateChecker.checkExtensionFitsCandidate

We do not need running IMPLICIT_TYPES_BODY_RESOLVE to check candidate applicability.

Additional resolve to IMPLICIT_TYPES_BODY_RESOLVE takes about 5% of completion time

^KTIJ-24640
This commit is contained in:
Ilya Kirillov
2023-02-23 19:40:41 +01:00
committed by Space Team
parent 163017fcaf
commit 0089517b25
@@ -25,7 +25,6 @@ import org.jetbrains.kotlin.fir.expressions.FirSafeCallExpression
import org.jetbrains.kotlin.fir.resolve.calls.FirErrorReferenceWithCandidate import org.jetbrains.kotlin.fir.resolve.calls.FirErrorReferenceWithCandidate
import org.jetbrains.kotlin.fir.resolve.calls.ImplicitReceiverValue import org.jetbrains.kotlin.fir.resolve.calls.ImplicitReceiverValue
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
import org.jetbrains.kotlin.fir.types.coneType
import org.jetbrains.kotlin.fir.types.receiverType import org.jetbrains.kotlin.fir.types.receiverType
import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtExpression
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
@@ -44,7 +43,7 @@ internal class KtFirCompletionCandidateChecker(
possibleExplicitReceiver: KtExpression?, possibleExplicitReceiver: KtExpression?,
): KtExtensionApplicabilityResult { ): KtExtensionApplicabilityResult {
require(firSymbolForCandidate is KtFirSymbol<*>) require(firSymbolForCandidate is KtFirSymbol<*>)
firSymbolForCandidate.firSymbol.lazyResolveToPhase(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) firSymbolForCandidate.firSymbol.lazyResolveToPhase(FirResolvePhase.STATUS)
val declaration = firSymbolForCandidate.firSymbol.fir as FirCallableDeclaration val declaration = firSymbolForCandidate.firSymbol.fir as FirCallableDeclaration
return checkExtension(declaration, originalFile, nameExpression, possibleExplicitReceiver) return checkExtension(declaration, originalFile, nameExpression, possibleExplicitReceiver)
} }
@@ -73,7 +72,7 @@ internal class KtFirCompletionCandidateChecker(
val receiverCastRequired = call.calleeReference is FirErrorReferenceWithCandidate val receiverCastRequired = call.calleeReference is FirErrorReferenceWithCandidate
return when { return when {
candidateSymbol is FirVariable && candidateSymbol.returnTypeRef.coneType.receiverType(rootModuleSession) != null -> { candidateSymbol is FirVariable && candidateSymbol.symbol.resolvedReturnType.receiverType(rootModuleSession) != null -> {
KtExtensionApplicabilityResult.ApplicableAsFunctionalVariableCall(substitutor, receiverCastRequired, token) KtExtensionApplicabilityResult.ApplicableAsFunctionalVariableCall(substitutor, receiverCastRequired, token)
} }
else -> { else -> {