From 13732881a6fe4fb962a7b53ed064ff70bc81c57d Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Wed, 14 Jun 2023 17:54:04 +0200 Subject: [PATCH] [AA FIR] reduce resolve calls ^KT-59266 --- .../api/fir/components/KtFirCallResolver.kt | 9 ++---- .../components/KtFirExpressionTypeProvider.kt | 29 +++++-------------- .../fir/components/KtFirVisibilityChecker.kt | 7 ++--- 3 files changed, 13 insertions(+), 32 deletions(-) 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 a432d0a1810..326b51bab4f 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 @@ -28,7 +28,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.* import org.jetbrains.kotlin.analysis.api.types.KtSubstitutor import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFir -import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirSafe +import org.jetbrains.kotlin.analysis.low.level.api.fir.api.resolveToFirSymbolOfTypeSafe import org.jetbrains.kotlin.analysis.low.level.api.fir.resolver.AllCandidatesResolver import org.jetbrains.kotlin.analysis.low.level.api.fir.util.errorWithFirSpecificEntries import org.jetbrains.kotlin.analysis.low.level.api.fir.util.withFirEntry @@ -39,7 +39,6 @@ import org.jetbrains.kotlin.analysis.utils.errors.withPsiEntry import org.jetbrains.kotlin.analysis.utils.printer.parentOfType import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.analysis.checkers.toRegularClassSymbol -import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.declarations.fullyExpandedClass @@ -1039,12 +1038,10 @@ internal class KtFirCallResolver( } } - val derivedClass = findDerivedClass(psi) - ?.getOrBuildFirSafe(firResolveSession) - ?: return emptyList() + val derivedClass = findDerivedClass(psi)?.resolveToFirSymbolOfTypeSafe>(firResolveSession) ?: return emptyList() val candidates = AllCandidatesResolver(analysisSession.useSiteSession) - .getAllCandidatesForDelegatedConstructor(analysisSession.firResolveSession, this, derivedClass.symbol.toLookupTag(), psi) + .getAllCandidatesForDelegatedConstructor(analysisSession.firResolveSession, this, derivedClass.toLookupTag(), psi) return candidates.mapNotNull { convertToKtCallCandidateInfo( diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt index 980da44f273..fae620c9185 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -15,7 +15,6 @@ import org.jetbrains.kotlin.analysis.api.types.KtErrorType import org.jetbrains.kotlin.analysis.api.types.KtFunctionalType import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFir -import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirOfType import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirSafe import org.jetbrains.kotlin.analysis.low.level.api.fir.api.resolveToFirSymbol import org.jetbrains.kotlin.analysis.utils.errors.unexpectedElementError @@ -28,16 +27,13 @@ import org.jetbrains.kotlin.fir.references.FirSuperReference import org.jetbrains.kotlin.fir.resolve.constructFunctionType import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol +import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.utils.addToStdlib.applyIf -import kotlin.contracts.ExperimentalContracts -import kotlin.contracts.contract import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol -import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase internal class KtFirExpressionTypeProvider( override val analysisSession: KtFirAnalysisSession, @@ -137,23 +133,12 @@ internal class KtFirExpressionTypeProvider( } override fun getFunctionalTypeForKtFunction(declaration: KtFunction): KtType { - val firFunction = if (isAnonymousFunction(declaration)) - declaration.toFirAnonymousFunction() - else - declaration.getOrBuildFirOfType(firResolveSession) - return firFunction.constructFunctionType(firFunction.specialFunctionTypeKind(firResolveSession.useSiteFirSession)).asKtType() - } - - @OptIn(ExperimentalContracts::class) - private fun isAnonymousFunction(ktDeclaration: KtDeclaration): Boolean { - contract { - returns(true) implies (ktDeclaration is KtNamedFunction) + val firFunction = declaration.resolveToFirSymbol(firResolveSession, FirResolvePhase.TYPES).fir as FirFunction + if (firFunction.returnTypeRef is FirImplicitTypeRef) { + firFunction.lazyResolveToPhase(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) } - return ktDeclaration is KtNamedFunction && ktDeclaration.isAnonymous - } - private fun KtFunction.toFirAnonymousFunction(): FirAnonymousFunction { - return getOrBuildFirOfType(firResolveSession).anonymousFunction + return firFunction.constructFunctionType(firFunction.specialFunctionTypeKind(firResolveSession.useSiteFirSession)).asKtType() } override fun getExpectedType(expression: PsiElement): KtType? { @@ -250,7 +235,7 @@ internal class KtFirExpressionTypeProvider( // There is only one parameter for infix functions; get its type val argumentsToParameters = firCall.argumentsToSubstitutedValueParameters(substituteWithErrorTypes = false) ?: return null - return argumentsToParameters.values.singleOrNull()?.substitutedType?.asKtType() ?: return null + return argumentsToParameters.values.singleOrNull()?.substitutedType?.asKtType() } private fun getExpectedTypeByReturnExpression(expression: PsiElement): KtType? { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirVisibilityChecker.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirVisibilityChecker.kt index 5d66885f724..2cf83db9d62 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirVisibilityChecker.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirVisibilityChecker.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtFileSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithVisibility import org.jetbrains.kotlin.analysis.low.level.api.fir.api.collectDesignation import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirSafe +import org.jetbrains.kotlin.analysis.low.level.api.fir.api.resolveToFirSymbol import org.jetbrains.kotlin.analysis.utils.printer.parentsOfType import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.java.JavaVisibilities @@ -26,7 +27,6 @@ import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.utils.effectiveVisibility import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.packageFqName -import org.jetbrains.kotlin.fir.resolve.calls.ExpressionReceiverValue import org.jetbrains.kotlin.fir.resolve.transformers.publishedApiEffectiveVisibility import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase import org.jetbrains.kotlin.fir.visibilityChecker @@ -116,8 +116,7 @@ internal class KtFirVisibilityChecker( private fun collectContainingDeclarations(position: PsiElement): List { val nonLocalContainer = findContainingNonLocalDeclaration(position) - val nonLocalContainerFir = nonLocalContainer?.getOrBuildFirSafe(analysisSession.firResolveSession) - ?: return emptyList() + val nonLocalContainerFir = nonLocalContainer?.resolveToFirSymbol(analysisSession.firResolveSession)?.fir ?: return emptyList() val designation = nonLocalContainerFir.collectDesignation()