[FIR] disable lazy resolve checks on building FirDeclaration from libraries/java

During converting java or library declarations to FIR nodes
and building required scopes inside, lazyResolveToPhase may be called.
For such cases it's okay to skip the lazy resolve contract checks as
those declarations are always fully resolved and lazy resolve will do nothing.
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/LLFirLazyDeclarationResolver.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/LLFirLazyDeclarationResolver.kt
index fcf5dbd..43d8541 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/LLFirLazyDeclarationResolver.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/LLFirLazyDeclarationResolver.kt
@@ -17,9 +17,6 @@
     override fun startResolvingPhase(phase: FirResolvePhase) {}
     override fun finishResolvingPhase(phase: FirResolvePhase) {}
 
-    override fun disableLazyResolveContractChecks() {}
-    override fun enableLazyResolveContractsChecks() {}
-
     override fun lazyResolveToPhase(symbol: FirBasedSymbol<*>, toPhase: FirResolvePhase) {
         val fir = symbol.fir
         val session = fir.moduleData.session
diff --git a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/AbstractFirDeserializedSymbolProvider.kt b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/AbstractFirDeserializedSymbolProvider.kt
index f3670f9..d026255 100644
--- a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/AbstractFirDeserializedSymbolProvider.kt
+++ b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/AbstractFirDeserializedSymbolProvider.kt
@@ -17,6 +17,7 @@
 import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProviderInternals
 import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider
 import org.jetbrains.kotlin.fir.symbols.impl.*
+import org.jetbrains.kotlin.fir.symbols.lazyDeclarationResolver
 import org.jetbrains.kotlin.metadata.ProtoBuf
 import org.jetbrains.kotlin.metadata.deserialization.NameResolver
 import org.jetbrains.kotlin.name.*
@@ -139,21 +140,23 @@
                 val (nameResolver, classProto, annotationDeserializer, moduleData, sourceElement, postProcessor) = result
                 moduleData ?: return null to null
                 val symbol = FirRegularClassSymbol(classId)
-                deserializeClassToSymbol(
-                    classId,
-                    classProto,
-                    symbol,
-                    nameResolver,
-                    session,
-                    moduleData,
-                    annotationDeserializer,
-                    kotlinScopeProvider,
-                    serializerExtensionProtocol,
-                    parentContext,
-                    sourceElement,
-                    origin = defaultDeserializationOrigin,
-                    deserializeNestedClass = this::getClass,
-                )
+                session.lazyDeclarationResolver.disableLazyResolveContractChecksInside {
+                    deserializeClassToSymbol(
+                        classId,
+                        classProto,
+                        symbol,
+                        nameResolver,
+                        session,
+                        moduleData,
+                        annotationDeserializer,
+                        kotlinScopeProvider,
+                        serializerExtensionProtocol,
+                        parentContext,
+                        sourceElement,
+                        origin = defaultDeserializationOrigin,
+                        deserializeNestedClass = this::getClass,
+                    )
+                }
                 symbol.fir.isNewPlaceForBodyGeneration = isNewPlaceForBodyGeneration(classProto)
                 symbol to postProcessor
             }
diff --git a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirBuiltinSymbolProvider.kt b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirBuiltinSymbolProvider.kt
index a3b320b..8f40750 100644
--- a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirBuiltinSymbolProvider.kt
+++ b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirBuiltinSymbolProvider.kt
@@ -30,6 +30,7 @@
 import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProviderInternals
 import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider
 import org.jetbrains.kotlin.fir.symbols.impl.*
+import org.jetbrains.kotlin.fir.symbols.lazyDeclarationResolver
 import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
 import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
 import org.jetbrains.kotlin.fir.types.constructClassType
@@ -129,13 +130,15 @@
             val classData = classDataFinder.findClassData(classId)!!
             val classProto = classData.classProto
 
-            deserializeClassToSymbol(
-                classId, classProto, symbol, nameResolver, moduleData.session, moduleData,
-                null, kotlinScopeProvider, BuiltInSerializerProtocol, parentContext,
-                null,
-                origin = FirDeclarationOrigin.BuiltIns,
-                this::findAndDeserializeClass,
-            )
+            moduleData.session.lazyDeclarationResolver.disableLazyResolveContractChecksInside {
+                deserializeClassToSymbol(
+                    classId, classProto, symbol, nameResolver, moduleData.session, moduleData,
+                    null, kotlinScopeProvider, BuiltInSerializerProtocol, parentContext,
+                    null,
+                    origin = FirDeclarationOrigin.BuiltIns,
+                    this::findAndDeserializeClass,
+                )
+            }
         }
 
         fun getClassLikeSymbolByClassId(classId: ClassId): FirRegularClassSymbol? =
diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/JvmClassFileBasedSymbolProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/JvmClassFileBasedSymbolProvider.kt
index 4e77418..523ca37 100644
--- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/JvmClassFileBasedSymbolProvider.kt
+++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/JvmClassFileBasedSymbolProvider.kt
@@ -17,6 +17,7 @@
 import org.jetbrains.kotlin.fir.java.declarations.FirJavaClass
 import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider
 import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
+import org.jetbrains.kotlin.fir.symbols.lazyDeclarationResolver
 import org.jetbrains.kotlin.load.kotlin.*
 import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader
 import org.jetbrains.kotlin.metadata.ProtoBuf
@@ -27,7 +28,7 @@
 import org.jetbrains.kotlin.name.ClassId
 import org.jetbrains.kotlin.name.FqName
 import org.jetbrains.kotlin.resolve.jvm.JvmClassName
-import org.jetbrains.kotlin.serialization.deserialization.*
+import org.jetbrains.kotlin.serialization.deserialization.IncompatibleVersionErrorData
 import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerializerProtocol
 import java.nio.file.Path
 import java.nio.file.Paths
@@ -114,7 +115,9 @@
             val knownContent = (result as? KotlinClassFinder.Result.ClassFileContent)?.content
             val javaClass = javaFacade.findClass(classId, knownContent) ?: return null
             return ClassMetadataFindResult.NoMetadata { symbol ->
-                javaFacade.convertJavaClassToFir(symbol, classId.outerClassId?.let(::getClass), javaClass)
+                session.lazyDeclarationResolver.disableLazyResolveContractChecksInside {
+                    javaFacade.convertJavaClassToFir(symbol, classId.outerClassId?.let(::getClass), javaClass)
+                }
             }
         }
 
diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCompilerLazyDeclarationResolverWithPhaseChecking.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCompilerLazyDeclarationResolverWithPhaseChecking.kt
index 16c831c..abc951d 100644
--- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCompilerLazyDeclarationResolverWithPhaseChecking.kt
+++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCompilerLazyDeclarationResolverWithPhaseChecking.kt
@@ -12,7 +12,6 @@
 
 class FirCompilerLazyDeclarationResolverWithPhaseChecking : FirLazyDeclarationResolver() {
     private var currentTransformerPhase: FirResolvePhase? = null
-    private var isEnabled = true
 
     private val exceptions = mutableListOf<FirLazyResolveContractViolationException>()
 
@@ -33,18 +32,8 @@
         currentTransformerPhase = null
     }
 
-    override fun disableLazyResolveContractChecks() {
-        check(isEnabled)
-        isEnabled = false
-    }
-
-    override fun enableLazyResolveContractsChecks() {
-        check(!isEnabled)
-        isEnabled = true
-    }
-
     private fun checkIfCanLazyResolveToPhase(symbol: FirBasedSymbol<*>, requestedPhase: FirResolvePhase) {
-        if (!isEnabled) return
+        if (!lazyResolveContractChecksEnabled) return
 
         val currentPhase = currentTransformerPhase
             ?: error("Current phase is not set, please call ${this::startResolvingPhase.name} before starting transforming the file")
diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirDummyCompilerLazyDeclarationResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirDummyCompilerLazyDeclarationResolver.kt
index c22698f..bca0522 100644
--- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirDummyCompilerLazyDeclarationResolver.kt
+++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirDummyCompilerLazyDeclarationResolver.kt
@@ -13,8 +13,5 @@
     override fun startResolvingPhase(phase: FirResolvePhase) {}
     override fun finishResolvingPhase(phase: FirResolvePhase) {}
 
-    override fun disableLazyResolveContractChecks() {}
-    override fun enableLazyResolveContractsChecks() {}
-
     override fun lazyResolveToPhase(symbol: FirBasedSymbol<*>, toPhase: FirResolvePhase) {}
 }
\ No newline at end of file
diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/FirLazyDeclarationResolver.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/FirLazyDeclarationResolver.kt
index 8e358bc..7c0ebe8 100644
--- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/FirLazyDeclarationResolver.kt
+++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/FirLazyDeclarationResolver.kt
@@ -18,20 +18,19 @@
  * @see org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
  */
 abstract class FirLazyDeclarationResolver : FirSessionComponent {
+    var lazyResolveContractChecksEnabled: Boolean = true
+
     abstract fun startResolvingPhase(phase: FirResolvePhase)
 
     abstract fun finishResolvingPhase(phase: FirResolvePhase)
 
-    abstract fun disableLazyResolveContractChecks()
-
-    abstract fun enableLazyResolveContractsChecks()
-
     inline fun disableLazyResolveContractChecksInside(action: () -> Unit) {
-        disableLazyResolveContractChecks()
+        val current = lazyResolveContractChecksEnabled
+        lazyResolveContractChecksEnabled = false
         try {
             action()
         } finally {
-            enableLazyResolveContractsChecks()
+            lazyResolveContractChecksEnabled = current
         }
     }