[FIR] Pass the whole body context to the resolve context collector

Collector for the 'FirCodeFragment' analysis needs to capture also
data-flow information.
This commit is contained in:
Yan Zhulanow
2023-06-21 20:04:20 +09:00
parent b43fcae708
commit 7e075ec64a
27 changed files with 75 additions and 82 deletions
@@ -19,7 +19,6 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.file.structure.KtToFirMap
import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.RawFirNonLocalDeclarationBuilder
import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.RawFirReplacement
import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.buildFileFirAnnotation
import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.buildFirUserTypeRef
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirResolvableModuleSession
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.llFirResolvableSession
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.llFirSession
@@ -37,12 +36,9 @@ import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.realPsi
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.FirTypeResolveTransformer
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataContextCollector
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirResolveContextCollector
import org.jetbrains.kotlin.fir.scopes.createImportingScopes
import org.jetbrains.kotlin.fir.scopes.kotlinScopeProvider
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.isAncestor
@@ -211,7 +207,7 @@ object LowLevelFirApiFacadeForResolveOnAir {
annotationEntry: KtAnnotationEntry,
replacement: RawFirReplacement,
firFile: FirFile,
collector: FirTowerDataContextCollector? = null,
collector: FirResolveContextCollector? = null,
firResolveSession: LLFirResolvableResolveSession,
): FirAnnotation {
val annotationCall = buildFileFirAnnotation(
@@ -249,7 +245,7 @@ object LowLevelFirApiFacadeForResolveOnAir {
firResolveSession: LLFirResolvableResolveSession,
replacement: RawFirReplacement,
onAirCreatedDeclaration: Boolean,
collector: FirTowerDataContextCollector? = null,
collector: FirResolveContextCollector? = null,
): FirElement {
val nonLocalDeclaration = replacement.from.onAirGetNonLocalContainingOrThisDeclarationFor()
val originalFirFile = firResolveSession.getOrBuildFirFile(replacement.from.containingKtFile)
@@ -13,7 +13,8 @@ import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.FirTowerDataContext
import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataContextCollector
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.BodyResolveContext
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirResolveContextCollector
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf
import org.jetbrains.kotlin.utils.addIfNotNull
@@ -30,7 +31,7 @@ internal class FileTowerProvider(
if (file == ktElement.containingKtFile) context else null
}
internal class FirTowerDataContextAllElementsCollector : FirTowerDataContextCollector, FirTowerContextProvider {
internal class FirTowerDataContextAllElementsCollector : FirResolveContextCollector, FirTowerContextProvider {
private val elementsToContext: MutableMap<KtElement, FirTowerDataContext> = hashMapOf()
/**
@@ -46,13 +47,13 @@ internal class FirTowerDataContextAllElementsCollector : FirTowerDataContextColl
elementsToContext[ktFile] = context
}
override fun addStatementContext(statement: FirStatement, context: FirTowerDataContext) {
override fun addStatementContext(statement: FirStatement, context: BodyResolveContext) {
val closestStatementInBlock = statement.psi?.closestBlockLevelOrInitializerExpression() ?: return
// FIR body transform may alter the context if there are implicit receivers with smartcast
elementsToContext[closestStatementInBlock] = context.createSnapshot()
elementsToContext[closestStatementInBlock] = context.towerDataContext.createSnapshot()
}
override fun addDeclarationContext(declaration: FirDeclaration, context: FirTowerDataContext) {
override fun addDeclarationContext(declaration: FirDeclaration, context: BodyResolveContext) {
val psi = declaration.psi as? KtElement ?: return
// FIR creates a fake field declaration for the delegated super calls,
@@ -60,7 +61,7 @@ internal class FirTowerDataContextAllElementsCollector : FirTowerDataContextColl
// we do not collect contexts for such declarations
if (psi is KtDelegatedSuperTypeEntry) return
elementsToContext[psi] = context
elementsToContext[psi] = context.towerDataContext
}
override fun addClassHeaderContext(declaration: FirRegularClass, context: FirTowerDataContext) {
@@ -25,7 +25,7 @@ import org.jetbrains.kotlin.fir.FirElementWithResolveState
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.FirImportResolveTransformer
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataContextCollector
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirResolveContextCollector
import org.jetbrains.kotlin.fir.visitors.transformSingle
internal class LLFirModuleLazyDeclarationResolver(val moduleComponents: LLFirModuleResolveComponents) {
@@ -103,7 +103,7 @@ internal class LLFirModuleLazyDeclarationResolver(val moduleComponents: LLFirMod
fun lazyResolveTarget(
target: LLFirResolveTarget,
toPhase: FirResolvePhase,
towerDataContextCollector: FirTowerDataContextCollector?,
towerDataContextCollector: FirResolveContextCollector?,
) {
try {
lazyResolveTargets(
@@ -120,7 +120,7 @@ internal class LLFirModuleLazyDeclarationResolver(val moduleComponents: LLFirMod
fun runLazyDesignatedOnAirResolveToBodyWithoutLock(
designation: FirDesignationWithFile,
onAirCreatedDeclaration: Boolean,
towerDataContextCollector: FirTowerDataContextCollector?,
towerDataContextCollector: FirResolveContextCollector?,
) {
resolveFileToImportsWithLock(designation.firFile)
@@ -161,7 +161,7 @@ internal class LLFirModuleLazyDeclarationResolver(val moduleComponents: LLFirMod
targets: List<LLFirResolveTarget>,
scopeSession: ScopeSession,
toPhase: FirResolvePhase,
towerDataContextCollector: FirTowerDataContextCollector?,
towerDataContextCollector: FirResolveContextCollector?,
) {
if (targets.isEmpty()) return
var currentPhase = getMinResolvePhase(targets).coerceAtLeast(FirResolvePhase.IMPORTS)
@@ -16,7 +16,7 @@ import org.jetbrains.kotlin.fir.resolve.ResolutionMode
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculator
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirAbstractBodyResolveTransformerDispatcher
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataContextCollector
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirResolveContextCollector
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.ImplicitBodyResolveComputationSession
import org.jetbrains.kotlin.fir.visitors.transformSingle
@@ -29,7 +29,7 @@ internal abstract class LLFirAbstractBodyTargetResolver(
isJumpingPhase: Boolean = false
) : LLFirTargetResolver(resolveTarget, lockProvider, resolvePhase, isJumpingPhase) {
protected fun createReturnTypeCalculator(
towerDataContextCollector: FirTowerDataContextCollector?,
towerDataContextCollector: FirResolveContextCollector?,
): ReturnTypeCalculator = LLFirReturnTypeCalculatorWithJump(
scopeSession,
implicitBodyResolveComputationSession,
@@ -19,7 +19,7 @@ import org.jetbrains.kotlin.fir.expressions.builder.buildArgumentList
import org.jetbrains.kotlin.fir.expressions.impl.FirResolvedArgumentList
import org.jetbrains.kotlin.fir.references.isError
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataContextCollector
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirResolveContextCollector
import org.jetbrains.kotlin.fir.resolve.transformers.plugin.FirAnnotationArgumentsMappingTransformer
import org.jetbrains.kotlin.fir.types.FirTypeProjection
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
@@ -30,7 +30,7 @@ internal object LLFirAnnotationArgumentMappingLazyResolver : LLFirLazyResolver(F
lockProvider: LLFirLockProvider,
session: FirSession,
scopeSession: ScopeSession,
towerDataContextCollector: FirTowerDataContextCollector?,
towerDataContextCollector: FirResolveContextCollector?,
) {
val resolver = LLFirAnnotationArgumentsMappingTargetResolver(target, lockProvider, session, scopeSession)
resolver.resolveDesignation()
@@ -20,7 +20,7 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.resolve.ResolutionMode
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataContextCollector
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirResolveContextCollector
import org.jetbrains.kotlin.fir.resolve.transformers.plugin.FirAnnotationArgumentsResolveTransformer
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
import org.jetbrains.kotlin.fir.visitors.transformSingle
@@ -31,7 +31,7 @@ internal object LLFirAnnotationArgumentsLazyResolver : LLFirLazyResolver(FirReso
lockProvider: LLFirLockProvider,
session: FirSession,
scopeSession: ScopeSession,
towerDataContextCollector: FirTowerDataContextCollector?,
towerDataContextCollector: FirResolveContextCollector?,
) {
val resolver = LLFirAnnotationArgumentsTargetResolver(target, lockProvider, session, scopeSession)
resolver.resolveDesignation()
@@ -32,7 +32,7 @@ import org.jetbrains.kotlin.fir.references.builder.buildExplicitThisReference
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.dfa.FirControlFlowGraphReferenceImpl
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirBodyResolveTransformer
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataContextCollector
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirResolveContextCollector
import org.jetbrains.kotlin.fir.resolve.transformers.contracts.FirContractsDslNames
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
@@ -44,7 +44,7 @@ internal object LLFirBodyLazyResolver : LLFirLazyResolver(FirResolvePhase.BODY_R
lockProvider: LLFirLockProvider,
session: FirSession,
scopeSession: ScopeSession,
towerDataContextCollector: FirTowerDataContextCollector?,
towerDataContextCollector: FirResolveContextCollector?,
) {
val resolver = LLFirBodyTargetResolver(target, lockProvider, session, scopeSession, towerDataContextCollector)
resolver.resolveDesignation()
@@ -75,7 +75,7 @@ private class LLFirBodyTargetResolver(
lockProvider: LLFirLockProvider,
session: FirSession,
scopeSession: ScopeSession,
towerDataContextCollector: FirTowerDataContextCollector?,
towerDataContextCollector: FirResolveContextCollector?,
) : LLFirAbstractBodyTargetResolver(
target,
lockProvider,
@@ -88,7 +88,7 @@ private class LLFirBodyTargetResolver(
implicitTypeOnly = false,
scopeSession = scopeSession,
returnTypeCalculator = createReturnTypeCalculator(towerDataContextCollector = towerDataContextCollector),
firTowerDataContextCollector = towerDataContextCollector,
firResolveContextCollector = towerDataContextCollector,
) {
override val preserveCFGForClasses: Boolean get() = false
}
@@ -131,10 +131,10 @@ private class LLFirBodyTargetResolver(
private fun resolveMembersForControlFlowGraph(target: FirRegularClass) {
withTypeArguments(target) {
transformer.firTowerDataContextCollector?.addClassHeaderContext(target, transformer.context.towerDataContext)
transformer.firResolveContextCollector?.addClassHeaderContext(target, transformer.context.towerDataContext)
}
withRegularClass(target) {
transformer.firTowerDataContextCollector?.addDeclarationContext(target, transformer.context.towerDataContext)
transformer.firResolveContextCollector?.addDeclarationContext(target, transformer.context)
for (member in target.declarations) {
if (member is FirControlFlowGraphOwner && member.isUsedInControlFlowGraphBuilderForClass) {
@@ -146,15 +146,15 @@ private class LLFirBodyTargetResolver(
}
override fun doLazyResolveUnderLock(target: FirElementWithResolveState) {
val contextCollector = transformer.firTowerDataContextCollector
val contextCollector = transformer.firResolveContextCollector
if (contextCollector != null && target is FirDeclaration) {
val bodyResolveContext = transformer.context
if (target is FirFunction) {
bodyResolveContext.forFunctionBody(target, transformer.components) {
contextCollector.addDeclarationContext(target, bodyResolveContext.towerDataContext)
contextCollector.addDeclarationContext(target, bodyResolveContext)
}
} else {
contextCollector.addDeclarationContext(target, bodyResolveContext.towerDataContext)
contextCollector.addDeclarationContext(target, bodyResolveContext)
}
}
@@ -27,7 +27,7 @@ import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.builder.buildAnnotationCallCopy
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataContextCollector
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirResolveContextCollector
import org.jetbrains.kotlin.fir.resolve.transformers.plugin.CompilerRequiredAnnotationsComputationSession
import org.jetbrains.kotlin.fir.resolve.transformers.plugin.FirCompilerRequiredAnnotationsResolveTransformer
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
@@ -40,7 +40,7 @@ internal object LLFirCompilerAnnotationsLazyResolver : LLFirLazyResolver(FirReso
lockProvider: LLFirLockProvider,
session: FirSession,
scopeSession: ScopeSession,
towerDataContextCollector: FirTowerDataContextCollector?,
towerDataContextCollector: FirResolveContextCollector?,
) {
val resolver = LLFirCompilerRequiredAnnotationsTargetResolver(target, lockProvider, session, scopeSession)
resolver.resolveDesignation()
@@ -18,7 +18,7 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.contracts.FirRawContractDescription
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataContextCollector
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirResolveContextCollector
import org.jetbrains.kotlin.fir.resolve.transformers.contracts.FirContractResolveTransformer
internal object LLFirContractsLazyResolver : LLFirLazyResolver(FirResolvePhase.CONTRACTS) {
@@ -27,7 +27,7 @@ internal object LLFirContractsLazyResolver : LLFirLazyResolver(FirResolvePhase.C
lockProvider: LLFirLockProvider,
session: FirSession,
scopeSession: ScopeSession,
towerDataContextCollector: FirTowerDataContextCollector?,
towerDataContextCollector: FirResolveContextCollector?,
) {
val resolver = LLFirContractsTargetResolver(target, lockProvider, session, scopeSession)
resolver.resolveDesignation()
@@ -15,7 +15,7 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataContextCollector
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirResolveContextCollector
import org.jetbrains.kotlin.fir.resolve.transformers.mpp.FirExpectActualMatcherTransformer
internal object LLFirExpectActualMatcherLazyResolver : LLFirLazyResolver(FirResolvePhase.EXPECT_ACTUAL_MATCHING) {
@@ -24,7 +24,7 @@ internal object LLFirExpectActualMatcherLazyResolver : LLFirLazyResolver(FirReso
lockProvider: LLFirLockProvider,
session: FirSession,
scopeSession: ScopeSession,
towerDataContextCollector: FirTowerDataContextCollector?,
towerDataContextCollector: FirResolveContextCollector?,
) {
val resolver = LLFirExpectActualMatchingTargetResolver(target, lockProvider, session, scopeSession)
resolver.resolveDesignation()
@@ -15,7 +15,7 @@ import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataContextCollector
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirResolveContextCollector
import org.jetbrains.kotlin.fir.resolve.transformers.plugin.FirCompanionGenerationTransformer
internal object LLFirGeneratedCompanionObjectLazyResolver : LLFirLazyResolver(FirResolvePhase.COMPANION_GENERATION) {
@@ -24,7 +24,7 @@ internal object LLFirGeneratedCompanionObjectLazyResolver : LLFirLazyResolver(Fi
lockProvider: LLFirLockProvider,
session: FirSession,
scopeSession: ScopeSession,
towerDataContextCollector: FirTowerDataContextCollector?,
towerDataContextCollector: FirResolveContextCollector?,
) {
val resolver = LLFirCompanionGenerationTargetResolver(target, lockProvider, session)
resolver.resolveDesignation()
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirImplicitAwareBodyResolveTransformer
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataContextCollector
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirResolveContextCollector
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.ImplicitBodyResolveComputationSession
import org.jetbrains.kotlin.fir.scopes.fakeOverrideSubstitution
@@ -27,7 +27,7 @@ internal object LLFirImplicitTypesLazyResolver : LLFirLazyResolver(FirResolvePha
lockProvider: LLFirLockProvider,
session: FirSession,
scopeSession: ScopeSession,
towerDataContextCollector: FirTowerDataContextCollector?,
towerDataContextCollector: FirResolveContextCollector?,
) {
val resolver = LLFirImplicitBodyTargetResolver(target, lockProvider, session, scopeSession, towerDataContextCollector)
resolver.resolveDesignation()
@@ -56,7 +56,7 @@ internal class LLFirImplicitBodyTargetResolver(
lockProvider: LLFirLockProvider,
session: FirSession,
scopeSession: ScopeSession,
towerDataContextCollector: FirTowerDataContextCollector?,
towerDataContextCollector: FirResolveContextCollector?,
implicitBodyResolveComputationSession: ImplicitBodyResolveComputationSession? = null,
) : LLFirAbstractBodyTargetResolver(
target,
@@ -72,7 +72,7 @@ internal class LLFirImplicitBodyTargetResolver(
phase = resolverPhase,
implicitTypeOnly = true,
scopeSession = scopeSession,
firTowerDataContextCollector = towerDataContextCollector,
firResolveContextCollector = towerDataContextCollector,
returnTypeCalculator = createReturnTypeCalculator(towerDataContextCollector = towerDataContextCollector),
) {
override val preserveCFGForClasses: Boolean get() = false
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.fir.FirElementWithResolveState
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataContextCollector
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirResolveContextCollector
internal abstract class LLFirLazyResolver(
val resolverPhase: FirResolvePhase,
@@ -21,7 +21,7 @@ internal abstract class LLFirLazyResolver(
lockProvider: LLFirLockProvider,
session: FirSession,
scopeSession: ScopeSession,
towerDataContextCollector: FirTowerDataContextCollector?,
towerDataContextCollector: FirResolveContextCollector?,
)
abstract fun checkIsResolved(target: FirElementWithResolveState)
@@ -9,7 +9,7 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.api.targets.LLFirResolveT
import org.jetbrains.kotlin.analysis.low.level.api.fir.file.builder.LLFirLockProvider
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataContextCollector
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirResolveContextCollector
internal object LLFirLazyResolverRunner {
fun runLazyResolverByPhase(
@@ -17,7 +17,7 @@ internal object LLFirLazyResolverRunner {
target: LLFirResolveTarget,
scopeSession: ScopeSession,
lockProvider: LLFirLockProvider,
towerDataContextCollector: FirTowerDataContextCollector?,
towerDataContextCollector: FirResolveContextCollector?,
) {
val lazyResolver = LLFirLazyPhaseResolverByPhase.getByPhase(phase)
val firFile = target.firFile
@@ -10,10 +10,9 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.api.targets.asResolveTarg
import org.jetbrains.kotlin.analysis.low.level.api.fir.file.builder.LLFirLockProvider
import org.jetbrains.kotlin.analysis.low.level.api.fir.transformers.LLFirImplicitBodyTargetResolver
import org.jetbrains.kotlin.analysis.low.level.api.fir.transformers.LLFirImplicitTypesLazyResolver
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataContextCollector
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirResolveContextCollector
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.ImplicitBodyResolveComputationSession
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.ReturnTypeCalculatorWithJump
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
@@ -24,7 +23,7 @@ internal class LLFirReturnTypeCalculatorWithJump(
scopeSession: ScopeSession,
implicitBodyResolveComputationSession: ImplicitBodyResolveComputationSession,
private val lockProvider: LLFirLockProvider,
private val towerDataContextCollector: FirTowerDataContextCollector?,
private val towerDataContextCollector: FirResolveContextCollector?,
) : ReturnTypeCalculatorWithJump(scopeSession, implicitBodyResolveComputationSession) {
override fun resolveDeclaration(declaration: FirCallableDeclaration): FirResolvedTypeRef {
if (declaration.returnTypeRef !is FirImplicitTypeRef) {
@@ -15,7 +15,7 @@ import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataContextCollector
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirResolveContextCollector
internal object LLFirSealedClassInheritorsLazyResolver : LLFirLazyResolver(FirResolvePhase.SEALED_CLASS_INHERITORS) {
override fun resolve(
@@ -23,7 +23,7 @@ internal object LLFirSealedClassInheritorsLazyResolver : LLFirLazyResolver(FirRe
lockProvider: LLFirLockProvider,
session: FirSession,
scopeSession: ScopeSession,
towerDataContextCollector: FirTowerDataContextCollector?,
towerDataContextCollector: FirResolveContextCollector?,
) {
val resolver = LLFirSealedClassInheritorsDesignatedResolver(target, lockProvider)
resolver.resolveDesignation()
@@ -20,8 +20,7 @@ import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.FirStatusResolveTransformer
import org.jetbrains.kotlin.fir.resolve.transformers.StatusComputationSession
import org.jetbrains.kotlin.fir.resolve.transformers.StatusComputationSession.StatusComputationStatus
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataContextCollector
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirResolveContextCollector
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
import org.jetbrains.kotlin.fir.visitors.transformSingle
import org.jetbrains.kotlin.name.Name
@@ -32,7 +31,7 @@ internal object LLFirStatusLazyResolver : LLFirLazyResolver(FirResolvePhase.STAT
lockProvider: LLFirLockProvider,
session: FirSession,
scopeSession: ScopeSession,
towerDataContextCollector: FirTowerDataContextCollector?,
towerDataContextCollector: FirResolveContextCollector?,
) {
val resolver = LLFirStatusTargetResolver(
target = target,
@@ -25,7 +25,7 @@ import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
import org.jetbrains.kotlin.fir.resolve.transformers.FirSupertypeResolverVisitor
import org.jetbrains.kotlin.fir.resolve.transformers.SupertypeComputationSession
import org.jetbrains.kotlin.fir.resolve.transformers.SupertypeComputationStatus
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataContextCollector
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirResolveContextCollector
import org.jetbrains.kotlin.fir.resolve.transformers.platformSupertypeUpdater
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
import org.jetbrains.kotlin.fir.types.*
@@ -36,7 +36,7 @@ internal object LLFirSupertypeLazyResolver : LLFirLazyResolver(FirResolvePhase.S
lockProvider: LLFirLockProvider,
session: FirSession,
scopeSession: ScopeSession,
towerDataContextCollector: FirTowerDataContextCollector?,
towerDataContextCollector: FirResolveContextCollector?,
) {
val resolver = LLFirSuperTypeTargetResolver(target, lockProvider, session, scopeSession)
resolver.resolveDesignation()
@@ -21,7 +21,7 @@ import org.jetbrains.kotlin.fir.PrivateForInline
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.FirTypeResolveTransformer
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataContextCollector
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirResolveContextCollector
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -33,7 +33,7 @@ internal object LLFirTypeLazyResolver : LLFirLazyResolver(FirResolvePhase.TYPES)
lockProvider: LLFirLockProvider,
session: FirSession,
scopeSession: ScopeSession,
towerDataContextCollector: FirTowerDataContextCollector?,
towerDataContextCollector: FirResolveContextCollector?,
) {
val resolver = LLFirTypeTargetResolver(target, lockProvider, session, scopeSession)
resolver.resolveDesignation()
@@ -30,7 +30,7 @@ abstract class FirAbstractBodyResolveTransformerDispatcher(
scopeSession: ScopeSession,
val returnTypeCalculator: ReturnTypeCalculator = ReturnTypeCalculatorForFullBodyResolve,
outerBodyResolveContext: BodyResolveContext? = null,
val firTowerDataContextCollector: FirTowerDataContextCollector? = null,
val firResolveContextCollector: FirResolveContextCollector? = null,
) : FirAbstractBodyResolveTransformer(phase) {
open val preserveCFGForClasses: Boolean get() = !implicitTypeOnly
@@ -52,7 +52,7 @@ abstract class FirAbstractBodyResolveTransformerDispatcher(
checkSessionConsistency(file)
return context.withFile(file, components) {
withFileAnalysisExceptionWrapping(file) {
firTowerDataContextCollector?.addFileContext(file, context.towerDataContext)
firResolveContextCollector?.addFileContext(file, context.towerDataContext)
@Suppress("UNCHECKED_CAST")
transformDeclarationContent(file, data) as FirFile
@@ -18,7 +18,7 @@ open class FirBodyResolveTransformer(
scopeSession: ScopeSession,
returnTypeCalculator: ReturnTypeCalculator = ReturnTypeCalculatorForFullBodyResolve,
outerBodyResolveContext: BodyResolveContext? = null,
firTowerDataContextCollector: FirTowerDataContextCollector? = null
firResolveContextCollector: FirResolveContextCollector? = null
) : FirAbstractBodyResolveTransformerDispatcher(
session,
phase,
@@ -26,7 +26,7 @@ open class FirBodyResolveTransformer(
scopeSession,
returnTypeCalculator,
outerBodyResolveContext,
firTowerDataContextCollector
firResolveContextCollector
) {
final override val expressionsTransformer = FirExpressionsResolveTransformer(this)
final override val declarationsTransformer = FirDeclarationsResolveTransformer(this)
@@ -69,7 +69,7 @@ open class FirDeclarationsResolveTransformer(
}
protected fun transformDeclarationContent(declaration: FirDeclaration, data: ResolutionMode): FirDeclaration {
transformer.firTowerDataContextCollector?.addDeclarationContext(declaration, context.towerDataContext)
transformer.firResolveContextCollector?.addDeclarationContext(declaration, context)
return transformer.transformDeclarationContent(declaration, data)
}
@@ -526,7 +526,7 @@ open class FirDeclarationsResolveTransformer(
whileAnalysing(session, regularClass) {
return context.withContainingClass(regularClass) {
if (regularClass.isLocal && regularClass !in context.targetedLocalClasses) {
return regularClass.runAllPhasesForLocalClass(transformer, components, data, transformer.firTowerDataContextCollector)
return regularClass.runAllPhasesForLocalClass(transformer, components, data, transformer.firResolveContextCollector)
}
doTransformTypeParameters(regularClass)
@@ -554,11 +554,11 @@ open class FirDeclarationsResolveTransformer(
override fun transformTypeAlias(typeAlias: FirTypeAlias, data: ResolutionMode): FirTypeAlias = whileAnalysing(session, typeAlias) {
if (typeAlias.isLocal && typeAlias !in context.targetedLocalClasses) {
return typeAlias.runAllPhasesForLocalClass(transformer, components, data, transformer.firTowerDataContextCollector)
return typeAlias.runAllPhasesForLocalClass(transformer, components, data, transformer.firResolveContextCollector)
}
doTransformTypeParameters(typeAlias)
typeAlias.transformAnnotations(transformer, data)
transformer.firTowerDataContextCollector?.addDeclarationContext(typeAlias, context.towerDataContext)
transformer.firResolveContextCollector?.addDeclarationContext(typeAlias, context)
typeAlias.transformExpandedTypeRef(transformer, data)
return typeAlias
}
@@ -592,7 +592,7 @@ open class FirDeclarationsResolveTransformer(
data: ResolutionMode
): FirStatement = whileAnalysing(session, anonymousObject) {
if (anonymousObject !in context.targetedLocalClasses) {
return anonymousObject.runAllPhasesForLocalClass(transformer, components, data, transformer.firTowerDataContextCollector)
return anonymousObject.runAllPhasesForLocalClass(transformer, components, data, transformer.firResolveContextCollector)
}
require(anonymousObject.controlFlowGraphReference == null)
val buildGraph = !implicitTypeOnly
@@ -560,7 +560,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
}
private fun collectStatementContext(statement: FirStatement) {
transformer.firTowerDataContextCollector?.addStatementContext(statement, context.towerDataContext)
transformer.firResolveContextCollector?.addStatementContext(statement, context)
}
override fun transformThisReceiverExpression(
@@ -29,7 +29,6 @@ import org.jetbrains.kotlin.fir.scopes.impl.originalForWrappedIntegerOperator
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirSyntheticPropertySymbol
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
import org.jetbrains.kotlin.fir.types.FirErrorTypeRef
import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef
@@ -71,7 +70,7 @@ fun <F : FirClassLikeDeclaration> F.runContractAndBodiesResolutionForLocalClass(
components: FirAbstractBodyResolveTransformer.BodyResolveTransformerComponents,
resolutionMode: ResolutionMode,
localClassesNavigationInfo: LocalClassesNavigationInfo,
firTowerDataContextCollector: FirTowerDataContextCollector? = null
firResolveContextCollector: FirResolveContextCollector? = null
): F {
val currentReturnTypeCalculator = components.context.returnTypeCalculator as? ReturnTypeCalculatorWithJump
val prevDesignation = currentReturnTypeCalculator?.designationMapForLocalClasses ?: emptyMap()
@@ -103,7 +102,7 @@ fun <F : FirClassLikeDeclaration> F.runContractAndBodiesResolutionForLocalClass(
implicitTypeOnly = false,
returnTypeCalculator,
outerBodyResolveContext = newContext,
firTowerDataContextCollector = firTowerDataContextCollector
firResolveContextCollector = firResolveContextCollector
)
return this.transform(transformer, resolutionMode)
}
@@ -116,7 +115,7 @@ open class FirImplicitAwareBodyResolveTransformer(
implicitTypeOnly: Boolean,
returnTypeCalculator: ReturnTypeCalculator,
outerBodyResolveContext: BodyResolveContext? = null,
firTowerDataContextCollector: FirTowerDataContextCollector? = null,
firResolveContextCollector: FirResolveContextCollector? = null,
) : FirBodyResolveTransformer(
session,
phase,
@@ -124,7 +123,7 @@ open class FirImplicitAwareBodyResolveTransformer(
scopeSession,
returnTypeCalculator,
outerBodyResolveContext,
firTowerDataContextCollector
firResolveContextCollector
) {
override fun transformSimpleFunction(
simpleFunction: FirSimpleFunction,
@@ -14,10 +14,10 @@ import org.jetbrains.kotlin.fir.expressions.FirStatement
/**
* Collector needed to collect TowerDataContext in IDE for in-air resolved fir elements.
*/
interface FirTowerDataContextCollector {
interface FirResolveContextCollector {
fun addFileContext(file: FirFile, context: FirTowerDataContext)
fun addStatementContext(statement: FirStatement, context: FirTowerDataContext)
fun addDeclarationContext(declaration: FirDeclaration, context: FirTowerDataContext)
fun addStatementContext(statement: FirStatement, context: BodyResolveContext)
fun addDeclarationContext(declaration: FirDeclaration, context: BodyResolveContext)
/**
* Here by "header" we understand the parts of the class declaration which resolution is not affected
@@ -18,7 +18,7 @@ fun <F : FirClassLikeDeclaration> F.runAllPhasesForLocalClass(
transformer: FirAbstractBodyResolveTransformer,
components: FirAbstractBodyResolveTransformer.BodyResolveTransformerComponents,
resolutionMode: ResolutionMode,
firTowerDataContextCollector: FirTowerDataContextCollector?
firResolveContextCollector: FirResolveContextCollector?
): F {
if (status is FirResolvedDeclarationStatus) return this
if (this is FirRegularClass) {
@@ -65,7 +65,7 @@ fun <F : FirClassLikeDeclaration> F.runAllPhasesForLocalClass(
components,
resolutionMode,
localClassesNavigationInfo,
firTowerDataContextCollector
firResolveContextCollector
)
return this
}
@@ -19,7 +19,6 @@ import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.BodyResolveCon
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirAbstractBodyResolveTransformerDispatcher
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirDeclarationsResolveTransformer
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirExpressionsResolveTransformer
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.transformSingle
open class FirAnnotationArgumentsMappingTransformer(
@@ -221,7 +220,7 @@ private class FirDeclarationsResolveTransformerForAnnotationArgumentsMapping(
override fun transformTypeAlias(typeAlias: FirTypeAlias, data: ResolutionMode): FirTypeAlias {
doTransformTypeParameters(typeAlias)
typeAlias.transformAnnotations(transformer, data)
transformer.firTowerDataContextCollector?.addDeclarationContext(typeAlias, context.towerDataContext)
transformer.firResolveContextCollector?.addDeclarationContext(typeAlias, context)
typeAlias.expandedTypeRef.transformSingle(transformer, data)
return typeAlias
}