[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
}
}