[LL FIR] add missing isJumping phase and update contract violation check for such phases
^KT-56550
This commit is contained in:
committed by
Space Team
parent
41e551e321
commit
2778b3bdd6
+3
-1
@@ -83,7 +83,9 @@ internal class LLFirLockProvider(private val checker: LLFirLazyResolveContractCh
|
|||||||
phase: FirResolvePhase,
|
phase: FirResolvePhase,
|
||||||
action: () -> Unit
|
action: () -> Unit
|
||||||
) {
|
) {
|
||||||
target.withCriticalSection(phase, action)
|
checker.lazyResolveToPhaseInside(phase, isJumpingPhase = true) {
|
||||||
|
target.withCriticalSection(phase, action)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+4
-4
@@ -12,8 +12,8 @@ import org.jetbrains.kotlin.fir.symbols.FirLazyResolveContractViolationException
|
|||||||
internal class LLFirLazyResolveContractChecker {
|
internal class LLFirLazyResolveContractChecker {
|
||||||
private val currentTransformerPhase = ThreadLocal.withInitial<FirResolvePhase?> { null }
|
private val currentTransformerPhase = ThreadLocal.withInitial<FirResolvePhase?> { null }
|
||||||
|
|
||||||
inline fun lazyResolveToPhaseInside(phase: FirResolvePhase, resolve: () -> Unit) {
|
inline fun lazyResolveToPhaseInside(phase: FirResolvePhase, isJumpingPhase: Boolean = false, resolve: () -> Unit) {
|
||||||
checkIfCanLazyResolveToPhase(phase)
|
checkIfCanLazyResolveToPhase(phase, isJumpingPhase)
|
||||||
val previousPhase = currentTransformerPhase.get()
|
val previousPhase = currentTransformerPhase.get()
|
||||||
currentTransformerPhase.set(phase)
|
currentTransformerPhase.set(phase)
|
||||||
try {
|
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
|
val currentPhase = currentTransformerPhase.get() ?: return
|
||||||
|
|
||||||
if (requestedPhase >= currentPhase) {
|
if (requestedPhase > currentPhase || !isJumpingPhase && requestedPhase == currentPhase) {
|
||||||
val exception = FirLazyResolveContractViolationException(currentPhase = currentPhase, requestedPhase = requestedPhase)
|
val exception = FirLazyResolveContractViolationException(currentPhase = currentPhase, requestedPhase = requestedPhase)
|
||||||
if (System.getProperty("kotlin.suppress.lazy.resolve.contract.violation") != null) {
|
if (System.getProperty("kotlin.suppress.lazy.resolve.contract.violation") != null) {
|
||||||
LoggerHolder.LOG.warn(exception)
|
LoggerHolder.LOG.warn(exception)
|
||||||
|
|||||||
+3
-2
@@ -25,8 +25,9 @@ internal abstract class LLFirAbstractBodyTargetResolver(
|
|||||||
lockProvider: LLFirLockProvider,
|
lockProvider: LLFirLockProvider,
|
||||||
private val scopeSession: ScopeSession,
|
private val scopeSession: ScopeSession,
|
||||||
resolvePhase: FirResolvePhase,
|
resolvePhase: FirResolvePhase,
|
||||||
protected val implicitBodyResolveComputationSession: ImplicitBodyResolveComputationSession = ImplicitBodyResolveComputationSession()
|
protected val implicitBodyResolveComputationSession: ImplicitBodyResolveComputationSession = ImplicitBodyResolveComputationSession(),
|
||||||
) : LLFirTargetResolver(resolveTarget, lockProvider, resolvePhase) {
|
isJumpingPhase: Boolean = false
|
||||||
|
) : LLFirTargetResolver(resolveTarget, lockProvider, resolvePhase, isJumpingPhase) {
|
||||||
|
|
||||||
protected fun createReturnTypeCalculator(): ReturnTypeCalculator = createReturnTypeCalculatorForIDE(
|
protected fun createReturnTypeCalculator(): ReturnTypeCalculator = createReturnTypeCalculatorForIDE(
|
||||||
scopeSession,
|
scopeSession,
|
||||||
|
|||||||
+1
@@ -62,6 +62,7 @@ private class LLFirImplicitBodyTargetResolver(
|
|||||||
lockProvider,
|
lockProvider,
|
||||||
scopeSession,
|
scopeSession,
|
||||||
FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE,
|
FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE,
|
||||||
|
isJumpingPhase = true,
|
||||||
) {
|
) {
|
||||||
override val transformer = object : FirImplicitAwareBodyResolveTransformer(
|
override val transformer = object : FirImplicitAwareBodyResolveTransformer(
|
||||||
session,
|
session,
|
||||||
|
|||||||
+1
-1
@@ -75,7 +75,7 @@ internal class LLFirSuperTypeTargetResolver(
|
|||||||
lockProvider: LLFirLockProvider,
|
lockProvider: LLFirLockProvider,
|
||||||
private val session: FirSession,
|
private val session: FirSession,
|
||||||
private val scopeSession: ScopeSession,
|
private val scopeSession: ScopeSession,
|
||||||
) : LLFirTargetResolver(target, lockProvider, FirResolvePhase.SUPER_TYPES) {
|
) : LLFirTargetResolver(target, lockProvider, FirResolvePhase.SUPER_TYPES, isJumpingPhase = true) {
|
||||||
|
|
||||||
private val supertypeComputationSession = SupertypeComputationSession()
|
private val supertypeComputationSession = SupertypeComputationSession()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user