Skip to content

Commit 1373288

Browse files
dimonchik0036Space Team
authored andcommitted
[AA FIR] reduce resolve calls
^KT-59266
1 parent 87ca9e4 commit 1373288

File tree

3 files changed

+13
-32
lines changed

3 files changed

+13
-32
lines changed

analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCallResolver.kt

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.*
2828
import org.jetbrains.kotlin.analysis.api.types.KtSubstitutor
2929
import org.jetbrains.kotlin.analysis.api.types.KtType
3030
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFir
31-
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirSafe
31+
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.resolveToFirSymbolOfTypeSafe
3232
import org.jetbrains.kotlin.analysis.low.level.api.fir.resolver.AllCandidatesResolver
3333
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.errorWithFirSpecificEntries
3434
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.withFirEntry
@@ -39,7 +39,6 @@ import org.jetbrains.kotlin.analysis.utils.errors.withPsiEntry
3939
import org.jetbrains.kotlin.analysis.utils.printer.parentOfType
4040
import org.jetbrains.kotlin.fir.FirElement
4141
import org.jetbrains.kotlin.fir.analysis.checkers.toRegularClassSymbol
42-
import org.jetbrains.kotlin.fir.declarations.FirClass
4342
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
4443
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
4544
import org.jetbrains.kotlin.fir.declarations.fullyExpandedClass
@@ -1039,12 +1038,10 @@ internal class KtFirCallResolver(
10391038
}
10401039
}
10411040

1042-
val derivedClass = findDerivedClass(psi)
1043-
?.getOrBuildFirSafe<FirClass>(firResolveSession)
1044-
?: return emptyList()
1041+
val derivedClass = findDerivedClass(psi)?.resolveToFirSymbolOfTypeSafe<FirClassSymbol<*>>(firResolveSession) ?: return emptyList()
10451042

10461043
val candidates = AllCandidatesResolver(analysisSession.useSiteSession)
1047-
.getAllCandidatesForDelegatedConstructor(analysisSession.firResolveSession, this, derivedClass.symbol.toLookupTag(), psi)
1044+
.getAllCandidatesForDelegatedConstructor(analysisSession.firResolveSession, this, derivedClass.toLookupTag(), psi)
10481045

10491046
return candidates.mapNotNull {
10501047
convertToKtCallCandidateInfo(

analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
2+
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
33
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
44
*/
55

@@ -15,7 +15,6 @@ import org.jetbrains.kotlin.analysis.api.types.KtErrorType
1515
import org.jetbrains.kotlin.analysis.api.types.KtFunctionalType
1616
import org.jetbrains.kotlin.analysis.api.types.KtType
1717
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFir
18-
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirOfType
1918
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirSafe
2019
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.resolveToFirSymbol
2120
import org.jetbrains.kotlin.analysis.utils.errors.unexpectedElementError
@@ -28,16 +27,13 @@ import org.jetbrains.kotlin.fir.references.FirSuperReference
2827
import org.jetbrains.kotlin.fir.resolve.constructFunctionType
2928
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
3029
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
30+
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
3131
import org.jetbrains.kotlin.fir.types.*
3232
import org.jetbrains.kotlin.lexer.KtTokens
3333
import org.jetbrains.kotlin.psi
3434
import org.jetbrains.kotlin.psi.*
3535
import org.jetbrains.kotlin.utils.addToStdlib.applyIf
36-
import kotlin.contracts.ExperimentalContracts
37-
import kotlin.contracts.contract
3836
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
39-
import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol
40-
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
4137

4238
internal class KtFirExpressionTypeProvider(
4339
override val analysisSession: KtFirAnalysisSession,
@@ -137,23 +133,12 @@ internal class KtFirExpressionTypeProvider(
137133
}
138134

139135
override fun getFunctionalTypeForKtFunction(declaration: KtFunction): KtType {
140-
val firFunction = if (isAnonymousFunction(declaration))
141-
declaration.toFirAnonymousFunction()
142-
else
143-
declaration.getOrBuildFirOfType<FirFunction>(firResolveSession)
144-
return firFunction.constructFunctionType(firFunction.specialFunctionTypeKind(firResolveSession.useSiteFirSession)).asKtType()
145-
}
146-
147-
@OptIn(ExperimentalContracts::class)
148-
private fun isAnonymousFunction(ktDeclaration: KtDeclaration): Boolean {
149-
contract {
150-
returns(true) implies (ktDeclaration is KtNamedFunction)
136+
val firFunction = declaration.resolveToFirSymbol(firResolveSession, FirResolvePhase.TYPES).fir as FirFunction
137+
if (firFunction.returnTypeRef is FirImplicitTypeRef) {
138+
firFunction.lazyResolveToPhase(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE)
151139
}
152-
return ktDeclaration is KtNamedFunction && ktDeclaration.isAnonymous
153-
}
154140

155-
private fun KtFunction.toFirAnonymousFunction(): FirAnonymousFunction {
156-
return getOrBuildFirOfType<FirAnonymousFunctionExpression>(firResolveSession).anonymousFunction
141+
return firFunction.constructFunctionType(firFunction.specialFunctionTypeKind(firResolveSession.useSiteFirSession)).asKtType()
157142
}
158143

159144
override fun getExpectedType(expression: PsiElement): KtType? {
@@ -250,7 +235,7 @@ internal class KtFirExpressionTypeProvider(
250235

251236
// There is only one parameter for infix functions; get its type
252237
val argumentsToParameters = firCall.argumentsToSubstitutedValueParameters(substituteWithErrorTypes = false) ?: return null
253-
return argumentsToParameters.values.singleOrNull()?.substitutedType?.asKtType() ?: return null
238+
return argumentsToParameters.values.singleOrNull()?.substitutedType?.asKtType()
254239
}
255240

256241
private fun getExpectedTypeByReturnExpression(expression: PsiElement): KtType? {

analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirVisibilityChecker.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
2+
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
33
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
44
*/
55

@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtFileSymbol
1717
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithVisibility
1818
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.collectDesignation
1919
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirSafe
20+
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.resolveToFirSymbol
2021
import org.jetbrains.kotlin.analysis.utils.printer.parentsOfType
2122
import org.jetbrains.kotlin.descriptors.Visibilities
2223
import org.jetbrains.kotlin.descriptors.java.JavaVisibilities
@@ -26,7 +27,6 @@ import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
2627
import org.jetbrains.kotlin.fir.declarations.utils.effectiveVisibility
2728
import org.jetbrains.kotlin.fir.expressions.FirExpression
2829
import org.jetbrains.kotlin.fir.packageFqName
29-
import org.jetbrains.kotlin.fir.resolve.calls.ExpressionReceiverValue
3030
import org.jetbrains.kotlin.fir.resolve.transformers.publishedApiEffectiveVisibility
3131
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
3232
import org.jetbrains.kotlin.fir.visibilityChecker
@@ -116,8 +116,7 @@ internal class KtFirVisibilityChecker(
116116

117117
private fun collectContainingDeclarations(position: PsiElement): List<FirDeclaration> {
118118
val nonLocalContainer = findContainingNonLocalDeclaration(position)
119-
val nonLocalContainerFir = nonLocalContainer?.getOrBuildFirSafe<FirDeclaration>(analysisSession.firResolveSession)
120-
?: return emptyList()
119+
val nonLocalContainerFir = nonLocalContainer?.resolveToFirSymbol(analysisSession.firResolveSession)?.fir ?: return emptyList()
121120

122121
val designation = nonLocalContainerFir.collectDesignation()
123122

0 commit comments

Comments
 (0)