From f036954ac0389db0173166e119bd07dd36794c8b Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Wed, 13 Mar 2024 16:40:00 +0100 Subject: [PATCH] [LL FIR] LLFirLockProvider: drop `checkContractViolations` hack MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This check was required due to missed proper implementation for jumping locks. Now it is safe to call `lazyResolveToPhase` under the jumping lock – it won't lead to any deadlocks or stack overflows. --- .../api/fir/file/builder/LLFirLockProvider.kt | 15 --------------- .../resolve/LLFirModuleLazyDeclarationResolver.kt | 3 --- 2 files changed, 18 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 da4294b71d2..f1ff814627b 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 @@ -39,21 +39,6 @@ internal class LLFirLockProvider(private val checker: LLFirLazyResolveContractCh return globalLock.lockWithPCECheck(lockingIntervalMs, action) } - /** - * A contract violation check to be sure that we won't request a violated phase later. - * This is useful to catch a contract violation for jumping phases because they may encounter infinite recursion. - * - * Example: we have cycle between phases 'implicit type (1) -> body (2) -> implicit type (3)` and - * we can get [StackOverflowError] because regular phases checks can't catch such case - * because will check only implicit type -> implicit type resolution due to - * sequent resolution requests - * - * @see org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.LLFirModuleLazyDeclarationResolver - */ - fun checkContractViolations(toPhase: FirResolvePhase) { - checker.checkIfCanLazyResolveToPhase(toPhase, isJumpingPhase = true) - } - /** * Locks an a [FirElementWithResolveState] to resolve from `phase - 1` to [phase] and * then updates the [FirElementWithResolveState.resolveState] to a [phase]. diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/LLFirModuleLazyDeclarationResolver.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/LLFirModuleLazyDeclarationResolver.kt index 176b841f06a..c9df58e040b 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/LLFirModuleLazyDeclarationResolver.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/LLFirModuleLazyDeclarationResolver.kt @@ -122,9 +122,6 @@ internal class LLFirModuleLazyDeclarationResolver(val moduleComponents: LLFirMod var currentPhase = getMinResolvePhase(target).coerceAtLeast(FirResolvePhase.IMPORTS) if (currentPhase >= toPhase) return - // to catch a contract violation for jumping phases - moduleComponents.globalResolveComponents.lockProvider.checkContractViolations(toPhase) - while (currentPhase < toPhase) { currentPhase = currentPhase.next checkCanceled()