[LL FIR] drop ScopeSession parameter from LLFirModuleLazyDeclarationResolver
This parameter was required for on-air analysis to avoid garbage in the original scope session. Now we can drop it, and it will be less error-prone
This commit is contained in:
committed by
Space Team
parent
80b698ce32
commit
7d672cd474
+8
-17
@@ -1,11 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
* Copyright 2010-2024 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.
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.jetbrains.kotlin.analysis.low.level.api.fir
|
package org.jetbrains.kotlin.analysis.low.level.api.fir
|
||||||
|
|
||||||
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.fir.FirElementWithResolveState
|
import org.jetbrains.kotlin.fir.FirElementWithResolveState
|
||||||
import org.jetbrains.kotlin.fir.ThreadSafeMutableState
|
import org.jetbrains.kotlin.fir.ThreadSafeMutableState
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirClass
|
import org.jetbrains.kotlin.fir.declarations.FirClass
|
||||||
@@ -19,35 +19,26 @@ internal class LLFirLazyDeclarationResolver : FirLazyDeclarationResolver() {
|
|||||||
override fun finishResolvingPhase(phase: FirResolvePhase) {}
|
override fun finishResolvingPhase(phase: FirResolvePhase) {}
|
||||||
|
|
||||||
override fun lazyResolveToPhase(element: FirElementWithResolveState, toPhase: FirResolvePhase) {
|
override fun lazyResolveToPhase(element: FirElementWithResolveState, toPhase: FirResolvePhase) {
|
||||||
val session = element.moduleData.session
|
val session = element.llFirResolvableSession ?: return
|
||||||
if (session !is LLFirResolvableModuleSession) return
|
session.moduleComponents.firModuleLazyDeclarationResolver.lazyResolve(
|
||||||
val moduleComponents = session.moduleComponents
|
|
||||||
moduleComponents.firModuleLazyDeclarationResolver.lazyResolve(
|
|
||||||
target = element,
|
target = element,
|
||||||
scopeSession = moduleComponents.scopeSessionProvider.getScopeSession(),
|
|
||||||
toPhase = toPhase,
|
toPhase = toPhase,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun lazyResolveToPhaseWithCallableMembers(clazz: FirClass, toPhase: FirResolvePhase) {
|
override fun lazyResolveToPhaseWithCallableMembers(clazz: FirClass, toPhase: FirResolvePhase) {
|
||||||
val fir = clazz as? FirRegularClass ?: return
|
val fir = clazz as? FirRegularClass ?: return
|
||||||
val session = fir.moduleData.session
|
val session = fir.llFirResolvableSession ?: return
|
||||||
if (session !is LLFirResolvableModuleSession) return
|
session.moduleComponents.firModuleLazyDeclarationResolver.lazyResolveWithCallableMembers(
|
||||||
val moduleComponents = session.moduleComponents
|
|
||||||
moduleComponents.firModuleLazyDeclarationResolver.lazyResolveWithCallableMembers(
|
|
||||||
target = fir,
|
target = fir,
|
||||||
scopeSession = moduleComponents.scopeSessionProvider.getScopeSession(),
|
|
||||||
toPhase = toPhase,
|
toPhase = toPhase,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun lazyResolveToPhaseRecursively(element: FirElementWithResolveState, toPhase: FirResolvePhase) {
|
override fun lazyResolveToPhaseRecursively(element: FirElementWithResolveState, toPhase: FirResolvePhase) {
|
||||||
val session = element.moduleData.session
|
val session = element.llFirResolvableSession ?: return
|
||||||
if (session !is LLFirResolvableModuleSession) return
|
session.moduleComponents.firModuleLazyDeclarationResolver.lazyResolveRecursively(
|
||||||
val moduleComponents = session.moduleComponents
|
|
||||||
moduleComponents.firModuleLazyDeclarationResolver.lazyResolveRecursively(
|
|
||||||
target = element,
|
target = element,
|
||||||
scopeSession = moduleComponents.scopeSessionProvider.getScopeSession(),
|
|
||||||
toPhase = toPhase,
|
toPhase = toPhase,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
+13
-42
@@ -14,7 +14,6 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.util.checkCanceled
|
|||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.getContainingFile
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.getContainingFile
|
||||||
import org.jetbrains.kotlin.fir.FirElementWithResolveState
|
import org.jetbrains.kotlin.fir.FirElementWithResolveState
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
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.FirImportResolveTransformer
|
||||||
import org.jetbrains.kotlin.fir.utils.exceptions.withFirEntry
|
import org.jetbrains.kotlin.fir.utils.exceptions.withFirEntry
|
||||||
import org.jetbrains.kotlin.fir.visitors.transformSingle
|
import org.jetbrains.kotlin.fir.visitors.transformSingle
|
||||||
@@ -28,13 +27,10 @@ internal class LLFirModuleLazyDeclarationResolver(val moduleComponents: LLFirMod
|
|||||||
*
|
*
|
||||||
* Resolution is performed under the lock specific to each declaration that is going to be resolved.
|
* Resolution is performed under the lock specific to each declaration that is going to be resolved.
|
||||||
*/
|
*/
|
||||||
fun lazyResolve(
|
fun lazyResolve(target: FirElementWithResolveState, toPhase: FirResolvePhase) {
|
||||||
target: FirElementWithResolveState,
|
|
||||||
scopeSession: ScopeSession,
|
|
||||||
toPhase: FirResolvePhase,
|
|
||||||
) {
|
|
||||||
if (target.resolvePhase >= toPhase) return
|
if (target.resolvePhase >= toPhase) return
|
||||||
lazyResolve(target, scopeSession, toPhase, LLFirResolveDesignationCollector::getDesignationToResolve)
|
|
||||||
|
lazyResolve(target, toPhase, LLFirResolveDesignationCollector::getDesignationToResolve)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -44,12 +40,8 @@ internal class LLFirModuleLazyDeclarationResolver(val moduleComponents: LLFirMod
|
|||||||
*
|
*
|
||||||
* Resolution is performed under the lock specific to each declaration that is going to be resolved.
|
* Resolution is performed under the lock specific to each declaration that is going to be resolved.
|
||||||
*/
|
*/
|
||||||
fun lazyResolveWithCallableMembers(
|
fun lazyResolveWithCallableMembers(target: FirRegularClass, toPhase: FirResolvePhase) {
|
||||||
target: FirRegularClass,
|
lazyResolve(target, toPhase, LLFirResolveDesignationCollector::getDesignationToResolveWithCallableMembers)
|
||||||
scopeSession: ScopeSession,
|
|
||||||
toPhase: FirResolvePhase,
|
|
||||||
) {
|
|
||||||
lazyResolve(target, scopeSession, toPhase, LLFirResolveDesignationCollector::getDesignationToResolveWithCallableMembers)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -59,17 +51,12 @@ internal class LLFirModuleLazyDeclarationResolver(val moduleComponents: LLFirMod
|
|||||||
*
|
*
|
||||||
* Resolution is performed under the lock specific to each declaration that is going to be resolved.
|
* Resolution is performed under the lock specific to each declaration that is going to be resolved.
|
||||||
*/
|
*/
|
||||||
fun lazyResolveRecursively(
|
fun lazyResolveRecursively(target: FirElementWithResolveState, toPhase: FirResolvePhase) {
|
||||||
target: FirElementWithResolveState,
|
lazyResolve(target, toPhase, LLFirResolveDesignationCollector::getDesignationToResolveRecursively)
|
||||||
scopeSession: ScopeSession,
|
|
||||||
toPhase: FirResolvePhase,
|
|
||||||
) {
|
|
||||||
lazyResolve(target, scopeSession, toPhase, LLFirResolveDesignationCollector::getDesignationToResolveRecursively)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private inline fun <T : FirElementWithResolveState> lazyResolve(
|
private inline fun <T : FirElementWithResolveState> lazyResolve(
|
||||||
targetElement: T,
|
targetElement: T,
|
||||||
scopeSession: ScopeSession,
|
|
||||||
toPhase: FirResolvePhase,
|
toPhase: FirResolvePhase,
|
||||||
resolveTarget: (T) -> LLFirResolveTarget?,
|
resolveTarget: (T) -> LLFirResolveTarget?,
|
||||||
) {
|
) {
|
||||||
@@ -79,11 +66,7 @@ internal class LLFirModuleLazyDeclarationResolver(val moduleComponents: LLFirMod
|
|||||||
if (toPhase == FirResolvePhase.IMPORTS) return
|
if (toPhase == FirResolvePhase.IMPORTS) return
|
||||||
|
|
||||||
val target = resolveTarget(targetElement) ?: return
|
val target = resolveTarget(targetElement) ?: return
|
||||||
lazyResolveTargets(
|
lazyResolveTargets(target, toPhase)
|
||||||
target,
|
|
||||||
scopeSession,
|
|
||||||
toPhase,
|
|
||||||
)
|
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
handleExceptionFromResolve(e, targetElement, fromPhase, toPhase)
|
handleExceptionFromResolve(e, targetElement, fromPhase, toPhase)
|
||||||
}
|
}
|
||||||
@@ -105,11 +88,7 @@ internal class LLFirModuleLazyDeclarationResolver(val moduleComponents: LLFirMod
|
|||||||
target.firFile?.let(::resolveFileToImportsWithLock)
|
target.firFile?.let(::resolveFileToImportsWithLock)
|
||||||
if (toPhase == FirResolvePhase.IMPORTS) return
|
if (toPhase == FirResolvePhase.IMPORTS) return
|
||||||
|
|
||||||
lazyResolveTargets(
|
lazyResolveTargets(target, toPhase)
|
||||||
target,
|
|
||||||
moduleComponents.scopeSessionProvider.getScopeSession(),
|
|
||||||
toPhase,
|
|
||||||
)
|
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
handleExceptionFromResolve(e, target, toPhase)
|
handleExceptionFromResolve(e, target, toPhase)
|
||||||
}
|
}
|
||||||
@@ -127,28 +106,20 @@ internal class LLFirModuleLazyDeclarationResolver(val moduleComponents: LLFirMod
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun lazyResolveTargets(
|
private fun lazyResolveTargets(target: LLFirResolveTarget, toPhase: FirResolvePhase) {
|
||||||
target: LLFirResolveTarget,
|
|
||||||
scopeSession: ScopeSession,
|
|
||||||
toPhase: FirResolvePhase,
|
|
||||||
) {
|
|
||||||
var currentPhase = getMinResolvePhase(target).coerceAtLeast(FirResolvePhase.IMPORTS)
|
var currentPhase = getMinResolvePhase(target).coerceAtLeast(FirResolvePhase.IMPORTS)
|
||||||
if (currentPhase >= toPhase) return
|
if (currentPhase >= toPhase) return
|
||||||
|
|
||||||
val lockProvider = moduleComponents.globalResolveComponents.lockProvider
|
|
||||||
|
|
||||||
// to catch a contract violation for jumping phases
|
// to catch a contract violation for jumping phases
|
||||||
lockProvider.checkContractViolations(toPhase)
|
moduleComponents.globalResolveComponents.lockProvider.checkContractViolations(toPhase)
|
||||||
|
|
||||||
while (currentPhase < toPhase) {
|
while (currentPhase < toPhase) {
|
||||||
currentPhase = currentPhase.next
|
currentPhase = currentPhase.next
|
||||||
checkCanceled()
|
checkCanceled()
|
||||||
|
|
||||||
LLFirLazyResolverRunner.runLazyResolverByPhase(
|
LLFirLazyResolverRunner.runLazyResolverByPhase(
|
||||||
currentPhase,
|
phase = currentPhase,
|
||||||
target,
|
target = target,
|
||||||
scopeSession,
|
|
||||||
lockProvider,
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-5
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.transformers
|
|||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.targets.LLFirResolveTarget
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.targets.LLFirResolveTarget
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.file.builder.LLFirLockProvider
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.file.builder.LLFirLockProvider
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.LLFirPhaseUpdater
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.LLFirPhaseUpdater
|
||||||
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.llFirSession
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.checkPhase
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.checkPhase
|
||||||
import org.jetbrains.kotlin.fir.FirElementWithResolveState
|
import org.jetbrains.kotlin.fir.FirElementWithResolveState
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
@@ -21,11 +22,8 @@ import org.jetbrains.kotlin.utils.exceptions.requireWithAttachment
|
|||||||
* @see LLFirTargetResolver
|
* @see LLFirTargetResolver
|
||||||
*/
|
*/
|
||||||
internal abstract class LLFirLazyResolver(val resolverPhase: FirResolvePhase) {
|
internal abstract class LLFirLazyResolver(val resolverPhase: FirResolvePhase) {
|
||||||
fun resolve(
|
fun resolve(target: LLFirResolveTarget, lockProvider: LLFirLockProvider) {
|
||||||
target: LLFirResolveTarget,
|
val scopeSession = target.target.llFirSession.getScopeSession()
|
||||||
lockProvider: LLFirLockProvider,
|
|
||||||
scopeSession: ScopeSession,
|
|
||||||
) {
|
|
||||||
val resolver = createTargetResolver(target, lockProvider, scopeSession)
|
val resolver = createTargetResolver(target, lockProvider, scopeSession)
|
||||||
requireWithAttachment(
|
requireWithAttachment(
|
||||||
resolverPhase == resolver.resolverPhase,
|
resolverPhase == resolver.resolverPhase,
|
||||||
|
|||||||
+4
-5
@@ -5,22 +5,21 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.analysis.low.level.api.fir.transformers
|
package org.jetbrains.kotlin.analysis.low.level.api.fir.transformers
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirGlobalResolveComponents
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.targets.LLFirResolveTarget
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.targets.LLFirResolveTarget
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.file.builder.LLFirLockProvider
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.targets.session
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
|
||||||
|
|
||||||
internal object LLFirLazyResolverRunner {
|
internal object LLFirLazyResolverRunner {
|
||||||
fun runLazyResolverByPhase(
|
fun runLazyResolverByPhase(
|
||||||
phase: FirResolvePhase,
|
phase: FirResolvePhase,
|
||||||
target: LLFirResolveTarget,
|
target: LLFirResolveTarget,
|
||||||
scopeSession: ScopeSession,
|
|
||||||
lockProvider: LLFirLockProvider,
|
|
||||||
) {
|
) {
|
||||||
val lazyResolver = LLFirLazyPhaseResolverByPhase.getByPhase(phase)
|
val lazyResolver = LLFirLazyPhaseResolverByPhase.getByPhase(phase)
|
||||||
|
val lockProvider = LLFirGlobalResolveComponents.getInstance(target.session).lockProvider
|
||||||
lockProvider.withGlobalLock {
|
lockProvider.withGlobalLock {
|
||||||
lockProvider.withGlobalPhaseLock(phase) {
|
lockProvider.withGlobalPhaseLock(phase) {
|
||||||
lazyResolver.resolve(target, lockProvider, scopeSession)
|
lazyResolver.resolve(target, lockProvider)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user