From 2778b3bdd668bd43e23e8d464ba469d3bfcfe334 Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Tue, 25 Apr 2023 16:05:42 +0200 Subject: [PATCH] [LL FIR] add missing isJumping phase and update contract violation check for such phases ^KT-56550 --- .../low/level/api/fir/file/builder/LLFirLockProvider.kt | 4 +++- .../fir/lazy/resolve/LLFirLazyResolveContractChecker.kt | 8 ++++---- .../fir/transformers/LLFirAbstractBodyTargetResolver.kt | 5 +++-- .../fir/transformers/LLFirImplicitTypesLazyResolver.kt | 1 + .../api/fir/transformers/LLFirSupertypeLazyResolver.kt | 2 +- 5 files changed, 12 insertions(+), 8 deletions(-) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/builder/LLFirLockProvider.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/builder/LLFirLockProvider.kt index f156bdaad5f..bd6bfb9d497 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/builder/LLFirLockProvider.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/builder/LLFirLockProvider.kt @@ -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) + } } /** diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/LLFirLazyResolveContractChecker.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/LLFirLazyResolveContractChecker.kt index 9f6cf016548..5a78e9decb4 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/LLFirLazyResolveContractChecker.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/LLFirLazyResolveContractChecker.kt @@ -12,8 +12,8 @@ import org.jetbrains.kotlin.fir.symbols.FirLazyResolveContractViolationException internal class LLFirLazyResolveContractChecker { private val currentTransformerPhase = ThreadLocal.withInitial { 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) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirAbstractBodyTargetResolver.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirAbstractBodyTargetResolver.kt index 7dddd8dc3da..eacdb730257 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirAbstractBodyTargetResolver.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirAbstractBodyTargetResolver.kt @@ -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, diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirImplicitTypesLazyResolver.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirImplicitTypesLazyResolver.kt index 4cb29258bdf..e70dea653b0 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirImplicitTypesLazyResolver.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirImplicitTypesLazyResolver.kt @@ -62,6 +62,7 @@ private class LLFirImplicitBodyTargetResolver( lockProvider, scopeSession, FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE, + isJumpingPhase = true, ) { override val transformer = object : FirImplicitAwareBodyResolveTransformer( session, diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirSupertypeLazyResolver.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirSupertypeLazyResolver.kt index 97d4d3c411a..51b124410de 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirSupertypeLazyResolver.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirSupertypeLazyResolver.kt @@ -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()