From f98ff2c25e6c78657343af6cd42f417d7c5f1fdd Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Fri, 3 Jul 2020 00:29:07 +0300 Subject: [PATCH] FIR IDE: always pass resolve state as parameter when getting fir by psi --- .../low/level/api/FirModuleResolveState.kt | 23 ++++++------ .../fir/low/level/api/LowLevelFirApiFacade.kt | 18 ++++++---- .../org/jetbrains/kotlin/idea/fir/FirUtils.kt | 19 +++++----- .../frontend/api/fir/KtFirAnalysisSession.kt | 35 ++++++++++--------- .../api/fir/symbols/KtFirSymbolProvider.kt | 22 ++++++------ .../references/FirReferenceResolveHelper.kt | 13 +++---- .../idea/references/FirSimpleNameReference.kt | 2 +- .../KtFirDestructuringDeclarationReference.kt | 2 +- .../references/KtFirForLoopInReference.kt | 2 +- ...KtFirPropertyDelegationMethodsReference.kt | 2 +- ...arationAndFirDeclarationEqualityChecker.kt | 5 +-- 11 files changed, 77 insertions(+), 66 deletions(-) diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirModuleResolveState.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirModuleResolveState.kt index c594c4208aa..fd76fd89a9a 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirModuleResolveState.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirModuleResolveState.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.idea.fir.low.level.api +import com.google.common.collect.MapMaker import com.intellij.openapi.project.Project import com.intellij.psi.PsiElement import com.intellij.psi.PsiElementVisitor @@ -31,15 +32,15 @@ import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtTypeReference -internal interface FirModuleResolveState { - val sessionProvider: FirProjectSessionProvider +abstract class FirModuleResolveState { + internal abstract val sessionProvider: FirProjectSessionProvider - fun getSession(psi: KtElement): FirSession { + internal fun getSession(psi: KtElement): FirSession { val moduleInfo = psi.getModuleInfo() return getSession(psi.project, moduleInfo) } - fun getSession(project: Project, moduleInfo: IdeaModuleInfo): FirSession { + internal fun getSession(project: Project, moduleInfo: IdeaModuleInfo): FirSession { sessionProvider.getSession(moduleInfo)?.let { return it } val lock = when (moduleInfo) { is ModuleSourceInfo -> moduleInfo.module @@ -58,20 +59,20 @@ internal interface FirModuleResolveState { } } - operator fun get(psi: KtElement): FirElement? + internal abstract operator fun get(psi: KtElement): FirElement? - fun getDiagnostics(psi: KtElement): List + internal abstract fun getDiagnostics(psi: KtElement): List - fun hasDiagnosticsForFile(file: KtFile): Boolean + internal abstract fun hasDiagnosticsForFile(file: KtFile): Boolean - fun record(psi: KtElement, fir: FirElement) + internal abstract fun record(psi: KtElement, fir: FirElement) - fun record(psi: KtElement, diagnostic: Diagnostic) + internal abstract fun record(psi: KtElement, diagnostic: Diagnostic) - fun setDiagnosticsForFile(file: KtFile, fir: FirFile, diagnostics: Iterable> = emptyList()) + internal abstract fun setDiagnosticsForFile(file: KtFile, fir: FirFile, diagnostics: Iterable> = emptyList()) } -internal class FirModuleResolveStateImpl(override val sessionProvider: FirProjectSessionProvider) : FirModuleResolveState { +internal class FirModuleResolveStateImpl(override val sessionProvider: FirProjectSessionProvider) : FirModuleResolveState() { private val cache = mutableMapOf() private val diagnosticCache = mutableMapOf>() diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/LowLevelFirApiFacade.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/LowLevelFirApiFacade.kt index cc3da64718c..0fd2d9ef2f4 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/LowLevelFirApiFacade.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/LowLevelFirApiFacade.kt @@ -7,17 +7,23 @@ package org.jetbrains.kotlin.idea.fir.low.level.api import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.fir.FirElement +import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.psi.KtElement object LowLevelFirApiFacade { - fun getOrBuildFirFor(element: KtElement, phase: FirResolvePhase): FirElement = - element.getOrBuildFir(element.firResolveState(), phase) + fun getResolveStateFor(element: KtElement): FirModuleResolveState = + element.firResolveState() - fun getDiagnosticsFor(element: KtElement): Collection { + fun getSessionFor(element: KtElement, resolveState: FirModuleResolveState): FirSession = + resolveState.getSession(element) + + fun getOrBuildFirFor(element: KtElement, resolveState: FirModuleResolveState, phase: FirResolvePhase): FirElement = + element.getOrBuildFir(resolveState, phase) + + fun getDiagnosticsFor(element: KtElement, resolveState: FirModuleResolveState): Collection { val file = element.containingKtFile - val state = element.firResolveState() - file.getOrBuildFirWithDiagnostics(state) - return state.getDiagnostics(element) + file.getOrBuildFirWithDiagnostics(resolveState) + return resolveState.getDiagnostics(element) } } \ No newline at end of file diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirUtils.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirUtils.kt index a769048fc55..e949a4c25e0 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirUtils.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirUtils.kt @@ -5,10 +5,7 @@ package org.jetbrains.kotlin.idea.fir -import com.intellij.psi.util.parentOfType import org.jetbrains.kotlin.fir.FirElement -import org.jetbrains.kotlin.fir.declarations.FirDeclaration -import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.expressions.FirFunctionCall import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression @@ -16,28 +13,32 @@ import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol +import org.jetbrains.kotlin.idea.fir.low.level.api.FirModuleResolveState import org.jetbrains.kotlin.idea.fir.low.level.api.LowLevelFirApiFacade -import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.util.OperatorNameConventions import kotlin.reflect.KClass fun KtElement.getOrBuildFir( + resolveState: FirModuleResolveState, phase: FirResolvePhase = FirResolvePhase.BODY_RESOLVE -) = LowLevelFirApiFacade.getOrBuildFirFor(this, phase) +) = LowLevelFirApiFacade.getOrBuildFirFor(this, resolveState, phase) inline fun KtElement.getOrBuildFirSafe( + resolveState: FirModuleResolveState, phase: FirResolvePhase = FirResolvePhase.BODY_RESOLVE -) = LowLevelFirApiFacade.getOrBuildFirFor(this, phase) as? E +) = LowLevelFirApiFacade.getOrBuildFirFor(this, resolveState, phase) as? E inline fun KtElement.getOrBuildFirOfType( + resolveState: FirModuleResolveState, phase: FirResolvePhase = FirResolvePhase.BODY_RESOLVE ): E { - val fir = LowLevelFirApiFacade.getOrBuildFirFor(this, phase) + val fir = LowLevelFirApiFacade.getOrBuildFirFor(this, resolveState, phase) if (fir is E) return fir throw InvalidFirElementTypeException(this, E::class, fir::class) } + class InvalidFirElementTypeException( ktElement: KtElement, expectedFirClass: KClass, @@ -45,10 +46,6 @@ class InvalidFirElementTypeException( ) : IllegalStateException("For $ktElement with text `${ktElement.text}` the $expectedFirClass expected, but $actualFirClass found") -val KtElement.session - get() = parentOfType()?.getOrBuildFirSafe()?.session - ?: containingKtFile.getOrBuildFirSafe()!!.session - fun FirFunctionCall.isImplicitFunctionCall(): Boolean { if (dispatchReceiver !is FirQualifiedAccessExpression) return false val resolvedCalleeSymbol = (calleeReference as? FirResolvedNamedReference)?.resolvedSymbol diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtFirAnalysisSession.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtFirAnalysisSession.kt index 73670bcdfd6..9a44a9e8fc8 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtFirAnalysisSession.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtFirAnalysisSession.kt @@ -34,13 +34,17 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* class KtFirAnalysisSession( - element: KtElement + private val element: KtElement ) : KtAnalysisSession(element.project) { internal val token get() = validityToken + internal val firResolveState = LowLevelFirApiFacade.getResolveStateFor(element) + + internal val firSession get() = LowLevelFirApiFacade.getSessionFor(element, firResolveState) + internal val firSymbolBuilder = KtSymbolByFirBuilder( - element.session.firSymbolProvider, - ConeTypeCheckerContext(isErrorTypeEqualsToAnything = true, isStubTypeEqualsToAnything = true, element.session), + firSession.firSymbolProvider, + ConeTypeCheckerContext(isErrorTypeEqualsToAnything = true, isStubTypeEqualsToAnything = true, firSession), element.project, validityToken ) @@ -48,7 +52,8 @@ class KtFirAnalysisSession( override val symbolProvider: KtSymbolProvider = KtFirSymbolProvider( this, - element.session.firSymbolProvider, + firSession.firSymbolProvider, + firResolveState, firSymbolBuilder ) @@ -58,17 +63,16 @@ class KtFirAnalysisSession( override fun getSmartCastedToTypes(expression: KtExpression): Collection? = withValidityAssertion { // TODO filter out not used smartcasts - expression.getOrBuildFirSafe()?.typesFromSmartCast?.map { it.asTypeInfo() } + expression.getOrBuildFirSafe(firResolveState)?.typesFromSmartCast?.map { it.asTypeInfo() } } @OptIn(ExperimentalStdlibApi::class) override fun getImplicitReceiverSmartCasts(expression: KtExpression): Collection = withValidityAssertion { // TODO filter out not used smartcasts - val qualifiedExpression = expression.getOrBuildFirSafe() ?: return emptyList() + val qualifiedExpression = expression.getOrBuildFirSafe(firResolveState) ?: return emptyList() if (qualifiedExpression.dispatchReceiver !is FirExpressionWithSmartcast && qualifiedExpression.extensionReceiver !is FirExpressionWithSmartcast ) return emptyList() - val session = expression.session buildList { (qualifiedExpression.dispatchReceiver as? FirExpressionWithSmartcast)?.let { smartCasted -> ImplicitReceiverSmartCast( @@ -87,34 +91,34 @@ class KtFirAnalysisSession( override fun getReturnTypeForKtDeclaration(declaration: KtDeclaration): KtType = withValidityAssertion { - val firDeclaration = declaration.getOrBuildFirOfType>() + val firDeclaration = declaration.getOrBuildFirOfType>(firResolveState) firDeclaration.returnTypeRef.coneType.asTypeInfo() } override fun getKtExpressionType(expression: KtExpression): KtType = withValidityAssertion { - expression.getOrBuildFirOfType().typeRef.coneType.asTypeInfo() + expression.getOrBuildFirOfType(firResolveState).typeRef.coneType.asTypeInfo() } override fun isSubclassOf(klass: KtClassOrObject, superClassId: ClassId): Boolean { assertIsValid() var result = false - forEachSuperClass(klass.getOrBuildFirSafe() ?: return false) { type -> - result = result || type.firClassLike(klass.session)?.symbol?.classId == superClassId + forEachSuperClass(klass.getOrBuildFirSafe(firResolveState) ?: return false) { type -> + result = result || type.firClassLike(firSession)?.symbol?.classId == superClassId } return result } override fun getDiagnosticsForElement(element: KtElement): Collection = withValidityAssertion { - LowLevelFirApiFacade.getDiagnosticsFor(element) + LowLevelFirApiFacade.getDiagnosticsFor(element, firResolveState) } override fun resolveCall(call: KtBinaryExpression): CallInfo? = withValidityAssertion { - val firCall = call.getOrBuildFirSafe() ?: return null + val firCall = call.getOrBuildFirSafe(firResolveState) ?: return null resolveCall(firCall, call) } override fun resolveCall(call: KtCallExpression): CallInfo? = withValidityAssertion { - val firCall = when (val fir = call.getOrBuildFir()) { + val firCall = when (val fir = call.getOrBuildFir(firResolveState)) { is FirFunctionCall -> fir is FirSafeCallExpression -> fir.regularQualifiedAccess as? FirFunctionCall else -> null @@ -123,7 +127,7 @@ class KtFirAnalysisSession( } private fun resolveCall(firCall: FirFunctionCall, callExpression: KtExpression): CallInfo? { - val session = callExpression.session + val session = LowLevelFirApiFacade.getSessionFor(callExpression, firResolveState) val resolvedFunctionSymbol = firCall.calleeReference.toTargetSymbol(session, firSymbolBuilder) val resolvedCalleeSymbol = (firCall.calleeReference as? FirResolvedNamedReference)?.resolvedSymbol return when { @@ -168,7 +172,6 @@ class KtFirAnalysisSession( private fun ConeKotlinType.asTypeInfo() = firSymbolBuilder.buildKtType(this) companion object { - private val kotlinFunctionInvokeCallableIds = (0..23).flatMapTo(hashSetOf()) { arity -> listOf( CallableId(KotlinBuiltIns.getFunctionClassId(arity), Name.identifier("invoke")), diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirSymbolProvider.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirSymbolProvider.kt index ec915a26cb5..4ba20ba10ef 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirSymbolProvider.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirSymbolProvider.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol import org.jetbrains.kotlin.idea.fir.getOrBuildFirOfType +import org.jetbrains.kotlin.idea.fir.low.level.api.FirModuleResolveState import org.jetbrains.kotlin.idea.frontend.api.ValidityOwner import org.jetbrains.kotlin.idea.frontend.api.ValidityOwnerByValidityToken import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder @@ -22,48 +23,49 @@ import org.jetbrains.kotlin.psi.* internal class KtFirSymbolProvider( override val token: ValidityOwner, firSymbolProvider: FirSymbolProvider, + private val resolveState: FirModuleResolveState, private val firSymbolBuilder: KtSymbolByFirBuilder ) : KtSymbolProvider(), ValidityOwnerByValidityToken { private val firSymbolProvider by weakRef(firSymbolProvider) override fun getParameterSymbol(psi: KtParameter): KtParameterSymbol = withValidityAssertion { - firSymbolBuilder.buildParameterSymbol(psi.getOrBuildFirOfType()) + firSymbolBuilder.buildParameterSymbol(psi.getOrBuildFirOfType(resolveState)) } override fun getFunctionSymbol(psi: KtNamedFunction): KtFunctionSymbol = withValidityAssertion { - firSymbolBuilder.buildFunctionSymbol(psi.getOrBuildFirOfType()) + firSymbolBuilder.buildFunctionSymbol(psi.getOrBuildFirOfType(resolveState)) } override fun getConstructorSymbol(psi: KtConstructor<*>): KtConstructorSymbol = withValidityAssertion { - firSymbolBuilder.buildConstructorSymbol(psi.getOrBuildFirOfType()) + firSymbolBuilder.buildConstructorSymbol(psi.getOrBuildFirOfType(resolveState)) } override fun getTypeParameterSymbol(psi: KtTypeParameter): KtTypeParameterSymbol = withValidityAssertion { - firSymbolBuilder.buildTypeParameterSymbol(psi.getOrBuildFirOfType()) + firSymbolBuilder.buildTypeParameterSymbol(psi.getOrBuildFirOfType(resolveState)) } override fun getTypeAliasSymbol(psi: KtTypeAlias): KtTypeAliasSymbol = withValidityAssertion { - firSymbolBuilder.buildTypeAliasSymbol(psi.getOrBuildFirOfType()) + firSymbolBuilder.buildTypeAliasSymbol(psi.getOrBuildFirOfType(resolveState)) } override fun getEnumEntrySymbol(psi: KtEnumEntry): KtEnumEntrySymbol = withValidityAssertion { - firSymbolBuilder.buildEnumEntrySymbol(psi.getOrBuildFirOfType()) + firSymbolBuilder.buildEnumEntrySymbol(psi.getOrBuildFirOfType(resolveState)) } override fun getAnonymousFunctionSymbol(psi: KtNamedFunction): KtAnonymousFunctionSymbol = withValidityAssertion { - firSymbolBuilder.buildAnonymousFunctionSymbol(psi.getOrBuildFirOfType()) + firSymbolBuilder.buildAnonymousFunctionSymbol(psi.getOrBuildFirOfType(resolveState)) } override fun getAnonymousFunctionSymbol(psi: KtLambdaExpression): KtAnonymousFunctionSymbol = withValidityAssertion { - firSymbolBuilder.buildAnonymousFunctionSymbol(psi.getOrBuildFirOfType()) + firSymbolBuilder.buildAnonymousFunctionSymbol(psi.getOrBuildFirOfType(resolveState)) } override fun getVariableSymbol(psi: KtProperty): KtVariableSymbol = withValidityAssertion { - firSymbolBuilder.buildVariableSymbol(psi.getOrBuildFirOfType()) + firSymbolBuilder.buildVariableSymbol(psi.getOrBuildFirOfType(resolveState)) } override fun getClassOrObjectSymbol(psi: KtClassOrObject): KtClassOrObjectSymbol = withValidityAssertion { - firSymbolBuilder.buildClassSymbol(psi.getOrBuildFirOfType()) + firSymbolBuilder.buildClassSymbol(psi.getOrBuildFirOfType(resolveState)) } override fun getClassOrObjectSymbolByClassId(classId: ClassId): KtClassOrObjectSymbol? = withValidityAssertion { diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirReferenceResolveHelper.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirReferenceResolveHelper.kt index 9d1935d9163..47869edf61c 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirReferenceResolveHelper.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirReferenceResolveHelper.kt @@ -18,6 +18,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl import org.jetbrains.kotlin.fir.types.ConeLookupTagBasedType import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.idea.fir.* +import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.idea.frontend.api.fir.buildSymbol import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirPackageSymbol @@ -28,7 +29,6 @@ import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.collectDescendantsOfType import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelector -import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelectorOrThis internal object FirReferenceResolveHelper { fun FirResolvedTypeRef.toTargetSymbol(session: FirSession, symbolBuilder: KtSymbolByFirBuilder): KtSymbol? { @@ -102,11 +102,12 @@ internal object FirReferenceResolveHelper { internal fun resolveSimpleNameReference( ref: KtFirSimpleNameReference, - symbolBuilder: KtSymbolByFirBuilder + analysisSession: KtFirAnalysisSession ): Collection { val expression = ref.expression - val fir = expression.getOrBuildFir() - val session = expression.session + val symbolBuilder = analysisSession.firSymbolBuilder + val fir = expression.getOrBuildFir(analysisSession.firResolveState) + val session = analysisSession.firSession when (fir) { is FirResolvable -> { val calleeReference = @@ -136,7 +137,7 @@ internal object FirReferenceResolveHelper { parent = parent.parent as? KtDotQualifiedExpression continue } - val parentFir = selectorExpression.getOrBuildFir() + val parentFir = selectorExpression.getOrBuildFir(analysisSession.firResolveState) if (parentFir is FirQualifiedAccess) { return listOfNotNull(classId.toTargetPsi(session, symbolBuilder, parentFir.calleeReference)) } @@ -208,7 +209,7 @@ internal object FirReferenceResolveHelper { parent = parent.parent as? KtDotQualifiedExpression continue } - val parentFir = selectorExpression.getOrBuildFir() + val parentFir = selectorExpression.getOrBuildFir(analysisSession.firResolveState) if (parentFir is FirResolvedQualifier) { var classId = parentFir.classId while (unresolvedCounter > 0) { diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirSimpleNameReference.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirSimpleNameReference.kt index 9e62eb53dc9..7fe68ee5296 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirSimpleNameReference.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirSimpleNameReference.kt @@ -18,7 +18,7 @@ internal class KtFirSimpleNameReference( ) : KtSimpleNameReference(expression), KtFirReference { override fun resolveToSymbols(analysisSession: KtAnalysisSession): Collection { check(analysisSession is KtFirAnalysisSession) - return FirReferenceResolveHelper.resolveSimpleNameReference(this, analysisSession.firSymbolBuilder) + return FirReferenceResolveHelper.resolveSimpleNameReference(this, analysisSession) } override fun doCanBeReferenceTo(candidateTarget: PsiElement): Boolean { diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtFirDestructuringDeclarationReference.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtFirDestructuringDeclarationReference.kt index 710a8d49d9f..13fff9e8624 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtFirDestructuringDeclarationReference.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtFirDestructuringDeclarationReference.kt @@ -22,7 +22,7 @@ class KtFirDestructuringDeclarationReference( override fun resolveToSymbols(analysisSession: KtAnalysisSession): Collection { check(analysisSession is KtFirAnalysisSession) - val fir = expression.getOrBuildFirSafe() ?: return emptyList() + val fir = expression.getOrBuildFirSafe(analysisSession.firResolveState) ?: return emptyList() val componentFunctionSymbol = (fir.initializer as? FirComponentCall)?.getCalleeSymbol() ?: return emptyList() return listOfNotNull(componentFunctionSymbol.fir.buildSymbol(analysisSession.firSymbolBuilder)) } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtFirForLoopInReference.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtFirForLoopInReference.kt index 44696f45b49..ee123c3179c 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtFirForLoopInReference.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtFirForLoopInReference.kt @@ -20,7 +20,7 @@ import org.jetbrains.kotlin.psi.KtForExpression open class KtFirForLoopInReference(expression: KtForExpression) : KtForLoopInReference(expression), KtFirReference { override fun resolveToSymbols(analysisSession: KtAnalysisSession): Collection { check(analysisSession is KtFirAnalysisSession) - val firLoop = expression.getOrBuildFirSafe() ?: return emptyList() + val firLoop = expression.getOrBuildFirSafe(analysisSession.firResolveState) ?: return emptyList() val condition = firLoop.condition as? FirFunctionCall val iterator = run { val callee = (condition?.explicitReceiver as? FirQualifiedAccessExpression)?.calleeReference diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtFirPropertyDelegationMethodsReference.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtFirPropertyDelegationMethodsReference.kt index f82ed586bd7..3efd51c34f0 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtFirPropertyDelegationMethodsReference.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtFirPropertyDelegationMethodsReference.kt @@ -23,7 +23,7 @@ class KtFirPropertyDelegationMethodsReference( ) : KtPropertyDelegationMethodsReference(element), KtFirReference { override fun resolveToSymbols(analysisSession: KtAnalysisSession): Collection { check(analysisSession is KtFirAnalysisSession) - val property = (expression.parent as? KtElement)?.getOrBuildFirSafe() ?: return emptyList() + val property = (expression.parent as? KtElement)?.getOrBuildFirSafe(analysisSession.firResolveState) ?: return emptyList() if (property.delegate == null) return emptyList() val getValueSymbol = (property.getter?.singleStatementOfType()?.result as? FirFunctionCall)?.getCalleeSymbol() val setValueSymbol = property.setter?.singleStatementOfType()?.getCalleeSymbol() diff --git a/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/fir/AbstractKtDeclarationAndFirDeclarationEqualityChecker.kt b/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/fir/AbstractKtDeclarationAndFirDeclarationEqualityChecker.kt index 9ce7ca5a4c9..3709c4854b9 100644 --- a/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/fir/AbstractKtDeclarationAndFirDeclarationEqualityChecker.kt +++ b/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/fir/AbstractKtDeclarationAndFirDeclarationEqualityChecker.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.idea.fir import com.intellij.openapi.util.io.FileUtil import com.intellij.rt.execution.junit.FileComparisonFailure import org.jetbrains.kotlin.fir.declarations.FirFunction +import org.jetbrains.kotlin.idea.fir.low.level.api.LowLevelFirApiFacade import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFunction @@ -18,9 +19,9 @@ abstract class AbstractKtDeclarationAndFirDeclarationEqualityChecker : KotlinLig protected fun doTest(path: String) { val file = File(path) val ktFile = myFixture.configureByText(file.name, FileUtil.loadFile(file)) as KtFile - + val resolveState = LowLevelFirApiFacade.getResolveStateFor(ktFile) ktFile.forEachDescendantOfType { ktFunction -> - val firFunction = ktFunction.getOrBuildFir() as FirFunction<*> + val firFunction = ktFunction.getOrBuildFir(resolveState) as FirFunction<*> if (!KtDeclarationAndFirDeclarationEqualityChecker.representsTheSameDeclaration(ktFunction, firFunction)) { throw FileComparisonFailure( /* message= */ null,