[LL FIR] LLFirLazyResolver: deduplicate code

This commit is contained in:
Dmitrii Gridin
2024-02-16 18:30:36 +01:00
committed by Space Team
parent 84f3cc9f9c
commit 0ecb174720
13 changed files with 68 additions and 71 deletions
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -31,15 +31,12 @@ import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
import org.jetbrains.kotlin.fir.visitors.transformSingle
internal object LLFirAnnotationArgumentsLazyResolver : LLFirLazyResolver(FirResolvePhase.ANNOTATION_ARGUMENTS) {
override fun resolve(
override fun createTargetResolver(
target: LLFirResolveTarget,
lockProvider: LLFirLockProvider,
scopeSession: ScopeSession,
towerDataContextCollector: FirResolveContextCollector?,
) {
val resolver = LLFirAnnotationArgumentsTargetResolver(target, lockProvider, scopeSession, towerDataContextCollector)
resolver.resolveDesignation()
}
): LLFirTargetResolver = LLFirAnnotationArgumentsTargetResolver(target, lockProvider, scopeSession, towerDataContextCollector)
override fun phaseSpecificCheckIsResolved(target: FirElementWithResolveState) {
if (target !is FirAnnotationContainer) return
@@ -52,15 +52,12 @@ import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment
import org.jetbrains.kotlin.utils.exceptions.withPsiEntry
internal object LLFirBodyLazyResolver : LLFirLazyResolver(FirResolvePhase.BODY_RESOLVE) {
override fun resolve(
override fun createTargetResolver(
target: LLFirResolveTarget,
lockProvider: LLFirLockProvider,
scopeSession: ScopeSession,
towerDataContextCollector: FirResolveContextCollector?,
) {
val resolver = LLFirBodyTargetResolver(target, lockProvider, scopeSession, towerDataContextCollector)
resolver.resolveDesignation()
}
): LLFirTargetResolver = LLFirBodyTargetResolver(target, lockProvider, scopeSession, towerDataContextCollector)
override fun phaseSpecificCheckIsResolved(target: FirElementWithResolveState) {
when (target) {
@@ -527,5 +524,5 @@ private fun delegatedConstructorCallGuard(fir: FirDelegatedConstructorCall): Fir
private class LLFirCodeFragmentContext(
override val towerDataContext: FirTowerDataContext,
override val smartCasts: Map<RealVariable, Set<ConeKotlinType>>
override val smartCasts: Map<RealVariable, Set<ConeKotlinType>>,
) : FirCodeFragmentContext
@@ -33,15 +33,12 @@ import org.jetbrains.kotlin.fir.types.FirUserTypeRef
import org.jetbrains.kotlin.util.PrivateForInline
internal object LLFirCompilerAnnotationsLazyResolver : LLFirLazyResolver(FirResolvePhase.COMPILER_REQUIRED_ANNOTATIONS) {
override fun resolve(
override fun createTargetResolver(
target: LLFirResolveTarget,
lockProvider: LLFirLockProvider,
scopeSession: ScopeSession,
towerDataContextCollector: FirResolveContextCollector?,
) {
val resolver = LLFirCompilerRequiredAnnotationsTargetResolver(target, lockProvider, scopeSession)
resolver.resolveDesignation()
}
): LLFirTargetResolver = LLFirCompilerRequiredAnnotationsTargetResolver(target, lockProvider, scopeSession)
override fun phaseSpecificCheckIsResolved(target: FirElementWithResolveState) {
when (target) {
@@ -26,15 +26,12 @@ import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef
import org.jetbrains.kotlin.util.PrivateForInline
internal object LLFirContractsLazyResolver : LLFirLazyResolver(FirResolvePhase.CONTRACTS) {
override fun resolve(
override fun createTargetResolver(
target: LLFirResolveTarget,
lockProvider: LLFirLockProvider,
scopeSession: ScopeSession,
towerDataContextCollector: FirResolveContextCollector?,
) {
val resolver = LLFirContractsTargetResolver(target, lockProvider, scopeSession, towerDataContextCollector)
resolver.resolveDesignation()
}
): LLFirTargetResolver = LLFirContractsTargetResolver(target, lockProvider, scopeSession, towerDataContextCollector)
override fun phaseSpecificCheckIsResolved(target: FirElementWithResolveState) {
if (target !is FirContractDescriptionOwner) return
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -20,15 +20,12 @@ import org.jetbrains.kotlin.fir.resolve.transformers.mpp.FirExpectActualMatcherT
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
internal object LLFirExpectActualMatcherLazyResolver : LLFirLazyResolver(FirResolvePhase.EXPECT_ACTUAL_MATCHING) {
override fun resolve(
override fun createTargetResolver(
target: LLFirResolveTarget,
lockProvider: LLFirLockProvider,
scopeSession: ScopeSession,
towerDataContextCollector: FirResolveContextCollector?,
) {
val resolver = LLFirExpectActualMatchingTargetResolver(target, lockProvider, scopeSession)
resolver.resolveDesignation()
}
): LLFirTargetResolver = LLFirExpectActualMatchingTargetResolver(target, lockProvider, scopeSession)
override fun phaseSpecificCheckIsResolved(target: FirElementWithResolveState) {
if (target.moduleData.session.languageVersionSettings.supportsFeature(LanguageFeature.MultiPlatformProjects) &&
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -15,15 +15,14 @@ import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirResolveCont
import org.jetbrains.kotlin.fir.resolve.transformers.plugin.FirCompanionGenerationTransformer
internal object LLFirGeneratedCompanionObjectLazyResolver : LLFirLazyResolver(FirResolvePhase.COMPANION_GENERATION) {
override fun resolve(
override fun createTargetResolver(
target: LLFirResolveTarget,
lockProvider: LLFirLockProvider,
scopeSession: ScopeSession,
towerDataContextCollector: FirResolveContextCollector?,
) {
val resolver = LLFirCompanionGenerationTargetResolver(target, lockProvider)
resolver.resolveDesignation()
}
): LLFirTargetResolver = LLFirCompanionGenerationTargetResolver(target, lockProvider)
override fun phaseSpecificCheckIsResolved(target: FirElementWithResolveState) {}
}
private class LLFirCompanionGenerationTargetResolver(
@@ -29,15 +29,12 @@ import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment
import org.jetbrains.kotlin.utils.exceptions.requireWithAttachment
internal object LLFirImplicitTypesLazyResolver : LLFirLazyResolver(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) {
override fun resolve(
override fun createTargetResolver(
target: LLFirResolveTarget,
lockProvider: LLFirLockProvider,
scopeSession: ScopeSession,
towerDataContextCollector: FirResolveContextCollector?,
) {
val resolver = LLFirImplicitBodyTargetResolver(target, lockProvider, scopeSession, towerDataContextCollector)
resolver.resolveDesignation()
}
): LLFirTargetResolver = LLFirImplicitBodyTargetResolver(target, lockProvider, scopeSession, towerDataContextCollector)
override fun phaseSpecificCheckIsResolved(target: FirElementWithResolveState) {
if (target !is FirCallableDeclaration) return
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -13,14 +13,41 @@ import org.jetbrains.kotlin.fir.FirElementWithResolveState
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirResolveContextCollector
import org.jetbrains.kotlin.utils.exceptions.requireWithAttachment
/**
* This class is responsible for [LLFirResolveTarget] resolution and "is resolved" check after that.
*
* @see LLFirLazyResolverRunner
* @see LLFirTargetResolver
*/
internal abstract class LLFirLazyResolver(val resolverPhase: FirResolvePhase) {
abstract fun resolve(
fun resolve(
target: LLFirResolveTarget,
lockProvider: LLFirLockProvider,
scopeSession: ScopeSession,
towerDataContextCollector: FirResolveContextCollector?,
)
) {
val resolver = createTargetResolver(target, lockProvider, scopeSession, towerDataContextCollector)
requireWithAttachment(
resolverPhase == resolver.resolverPhase,
{
"""
Phase mismatch between ${this::class.simpleName} and ${resolver::class.simpleName}.
The resolver phase is ${resolver.resolverPhase}, but $resolverPhase is expected
""".trimIndent()
},
)
resolver.resolveDesignation()
}
protected abstract fun createTargetResolver(
target: LLFirResolveTarget,
lockProvider: LLFirLockProvider,
scopeSession: ScopeSession,
towerDataContextCollector: FirResolveContextCollector?,
): LLFirTargetResolver
fun checkIsResolved(target: FirElementWithResolveState) {
target.checkPhase(resolverPhase)
@@ -33,7 +60,7 @@ internal abstract class LLFirLazyResolver(val resolverPhase: FirResolvePhase) {
* Will be performed to resolved declaration and its nested declarations
* @see checkNestedDeclarationsAreResolved
*/
protected open fun phaseSpecificCheckIsResolved(target: FirElementWithResolveState) {}
protected abstract fun phaseSpecificCheckIsResolved(target: FirElementWithResolveState)
fun updatePhaseForDeclarationInternals(target: FirElementWithResolveState) {
LLFirPhaseUpdater.updateDeclarationInternalsPhase(
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -13,15 +13,14 @@ import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirResolveContextCollector
internal object LLFirSealedClassInheritorsLazyResolver : LLFirLazyResolver(FirResolvePhase.SEALED_CLASS_INHERITORS) {
override fun resolve(
override fun createTargetResolver(
target: LLFirResolveTarget,
lockProvider: LLFirLockProvider,
scopeSession: ScopeSession,
towerDataContextCollector: FirResolveContextCollector?,
) {
val resolver = LLFirSealedClassInheritorsDesignatedResolver(target, lockProvider)
resolver.resolveDesignation()
}
): LLFirTargetResolver = LLFirSealedClassInheritorsDesignatedResolver(target, lockProvider)
override fun phaseSpecificCheckIsResolved(target: FirElementWithResolveState) {}
}
@@ -31,21 +31,17 @@ import org.jetbrains.kotlin.fir.visitors.transformSingle
import org.jetbrains.kotlin.name.Name
internal object LLFirStatusLazyResolver : LLFirLazyResolver(FirResolvePhase.STATUS) {
override fun resolve(
override fun createTargetResolver(
target: LLFirResolveTarget,
lockProvider: LLFirLockProvider,
scopeSession: ScopeSession,
towerDataContextCollector: FirResolveContextCollector?,
) {
val resolver = LLFirStatusTargetResolver(
target = target,
lockProvider = lockProvider,
scopeSession = scopeSession,
resolveMode = target.resolveMode(),
)
resolver.resolveDesignation()
}
): LLFirTargetResolver = LLFirStatusTargetResolver(
target = target,
lockProvider = lockProvider,
scopeSession = scopeSession,
resolveMode = target.resolveMode(),
)
override fun phaseSpecificCheckIsResolved(target: FirElementWithResolveState) {
if (target !is FirMemberDeclaration) return
@@ -34,15 +34,12 @@ import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
import org.jetbrains.kotlin.fir.types.*
internal object LLFirSupertypeLazyResolver : LLFirLazyResolver(FirResolvePhase.SUPER_TYPES) {
override fun resolve(
override fun createTargetResolver(
target: LLFirResolveTarget,
lockProvider: LLFirLockProvider,
scopeSession: ScopeSession,
towerDataContextCollector: FirResolveContextCollector?,
) {
val resolver = LLFirSuperTypeTargetResolver(target, lockProvider, scopeSession)
resolver.resolveDesignation()
}
): LLFirTargetResolver = LLFirSuperTypeTargetResolver(target, lockProvider, scopeSession)
override fun phaseSpecificCheckIsResolved(target: FirElementWithResolveState) {
when (target) {
@@ -39,7 +39,7 @@ import org.jetbrains.kotlin.utils.exceptions.requireWithAttachment
internal abstract class LLFirTargetResolver(
protected val resolveTarget: LLFirResolveTarget,
protected val lockProvider: LLFirLockProvider,
protected val resolverPhase: FirResolvePhase,
val resolverPhase: FirResolvePhase,
private val isJumpingPhase: Boolean = false,
) : LLFirResolveTargetVisitor {
val resolveTargetSession: LLFirSession get() = resolveTarget.session
@@ -31,15 +31,12 @@ import org.jetbrains.kotlin.util.PrivateForInline
import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment
internal object LLFirTypeLazyResolver : LLFirLazyResolver(FirResolvePhase.TYPES) {
override fun resolve(
override fun createTargetResolver(
target: LLFirResolveTarget,
lockProvider: LLFirLockProvider,
scopeSession: ScopeSession,
towerDataContextCollector: FirResolveContextCollector?,
) {
val resolver = LLFirTypeTargetResolver(target, lockProvider, scopeSession)
resolver.resolveDesignation()
}
): LLFirTargetResolver = LLFirTypeTargetResolver(target, lockProvider, scopeSession)
override fun phaseSpecificCheckIsResolved(target: FirElementWithResolveState) {
if (target is FirAnnotationContainer) {