[LL FIR] add missing isJumping phase and update contract violation check for such phases

^KT-56550
This commit is contained in:
Dmitrii Gridin
2023-04-25 16:05:42 +02:00
committed by Space Team
parent 41e551e321
commit 2778b3bdd6
5 changed files with 12 additions and 8 deletions
@@ -83,7 +83,9 @@ internal class LLFirLockProvider(private val checker: LLFirLazyResolveContractCh
phase: FirResolvePhase,
action: () -> Unit
) {
target.withCriticalSection(phase, action)
checker.lazyResolveToPhaseInside(phase, isJumpingPhase = true) {
target.withCriticalSection(phase, action)
}
}
/**
@@ -12,8 +12,8 @@ import org.jetbrains.kotlin.fir.symbols.FirLazyResolveContractViolationException
internal class LLFirLazyResolveContractChecker {
private val currentTransformerPhase = ThreadLocal.withInitial<FirResolvePhase?> { null }
inline fun lazyResolveToPhaseInside(phase: FirResolvePhase, resolve: () -> Unit) {
checkIfCanLazyResolveToPhase(phase)
inline fun lazyResolveToPhaseInside(phase: FirResolvePhase, isJumpingPhase: Boolean = false, resolve: () -> Unit) {
checkIfCanLazyResolveToPhase(phase, isJumpingPhase)
val previousPhase = currentTransformerPhase.get()
currentTransformerPhase.set(phase)
try {
@@ -23,10 +23,10 @@ internal class LLFirLazyResolveContractChecker {
}
}
private fun checkIfCanLazyResolveToPhase(requestedPhase: FirResolvePhase) {
private fun checkIfCanLazyResolveToPhase(requestedPhase: FirResolvePhase, isJumpingPhase: Boolean) {
val currentPhase = currentTransformerPhase.get() ?: return
if (requestedPhase >= currentPhase) {
if (requestedPhase > currentPhase || !isJumpingPhase && requestedPhase == currentPhase) {
val exception = FirLazyResolveContractViolationException(currentPhase = currentPhase, requestedPhase = requestedPhase)
if (System.getProperty("kotlin.suppress.lazy.resolve.contract.violation") != null) {
LoggerHolder.LOG.warn(exception)
@@ -25,8 +25,9 @@ internal abstract class LLFirAbstractBodyTargetResolver(
lockProvider: LLFirLockProvider,
private val scopeSession: ScopeSession,
resolvePhase: FirResolvePhase,
protected val implicitBodyResolveComputationSession: ImplicitBodyResolveComputationSession = ImplicitBodyResolveComputationSession()
) : LLFirTargetResolver(resolveTarget, lockProvider, resolvePhase) {
protected val implicitBodyResolveComputationSession: ImplicitBodyResolveComputationSession = ImplicitBodyResolveComputationSession(),
isJumpingPhase: Boolean = false
) : LLFirTargetResolver(resolveTarget, lockProvider, resolvePhase, isJumpingPhase) {
protected fun createReturnTypeCalculator(): ReturnTypeCalculator = createReturnTypeCalculatorForIDE(
scopeSession,
@@ -62,6 +62,7 @@ private class LLFirImplicitBodyTargetResolver(
lockProvider,
scopeSession,
FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE,
isJumpingPhase = true,
) {
override val transformer = object : FirImplicitAwareBodyResolveTransformer(
session,
@@ -75,7 +75,7 @@ internal class LLFirSuperTypeTargetResolver(
lockProvider: LLFirLockProvider,
private val session: FirSession,
private val scopeSession: ScopeSession,
) : LLFirTargetResolver(target, lockProvider, FirResolvePhase.SUPER_TYPES) {
) : LLFirTargetResolver(target, lockProvider, FirResolvePhase.SUPER_TYPES, isJumpingPhase = true) {
private val supertypeComputationSession = SupertypeComputationSession()