[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. * 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 import org.jetbrains.kotlin.fir.visitors.transformSingle
internal object LLFirAnnotationArgumentsLazyResolver : LLFirLazyResolver(FirResolvePhase.ANNOTATION_ARGUMENTS) { internal object LLFirAnnotationArgumentsLazyResolver : LLFirLazyResolver(FirResolvePhase.ANNOTATION_ARGUMENTS) {
override fun resolve( override fun createTargetResolver(
target: LLFirResolveTarget, target: LLFirResolveTarget,
lockProvider: LLFirLockProvider, lockProvider: LLFirLockProvider,
scopeSession: ScopeSession, scopeSession: ScopeSession,
towerDataContextCollector: FirResolveContextCollector?, towerDataContextCollector: FirResolveContextCollector?,
) { ): LLFirTargetResolver = LLFirAnnotationArgumentsTargetResolver(target, lockProvider, scopeSession, towerDataContextCollector)
val resolver = LLFirAnnotationArgumentsTargetResolver(target, lockProvider, scopeSession, towerDataContextCollector)
resolver.resolveDesignation()
}
override fun phaseSpecificCheckIsResolved(target: FirElementWithResolveState) { override fun phaseSpecificCheckIsResolved(target: FirElementWithResolveState) {
if (target !is FirAnnotationContainer) return if (target !is FirAnnotationContainer) return
@@ -52,15 +52,12 @@ import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment
import org.jetbrains.kotlin.utils.exceptions.withPsiEntry import org.jetbrains.kotlin.utils.exceptions.withPsiEntry
internal object LLFirBodyLazyResolver : LLFirLazyResolver(FirResolvePhase.BODY_RESOLVE) { internal object LLFirBodyLazyResolver : LLFirLazyResolver(FirResolvePhase.BODY_RESOLVE) {
override fun resolve( override fun createTargetResolver(
target: LLFirResolveTarget, target: LLFirResolveTarget,
lockProvider: LLFirLockProvider, lockProvider: LLFirLockProvider,
scopeSession: ScopeSession, scopeSession: ScopeSession,
towerDataContextCollector: FirResolveContextCollector?, towerDataContextCollector: FirResolveContextCollector?,
) { ): LLFirTargetResolver = LLFirBodyTargetResolver(target, lockProvider, scopeSession, towerDataContextCollector)
val resolver = LLFirBodyTargetResolver(target, lockProvider, scopeSession, towerDataContextCollector)
resolver.resolveDesignation()
}
override fun phaseSpecificCheckIsResolved(target: FirElementWithResolveState) { override fun phaseSpecificCheckIsResolved(target: FirElementWithResolveState) {
when (target) { when (target) {
@@ -527,5 +524,5 @@ private fun delegatedConstructorCallGuard(fir: FirDelegatedConstructorCall): Fir
private class LLFirCodeFragmentContext( private class LLFirCodeFragmentContext(
override val towerDataContext: FirTowerDataContext, override val towerDataContext: FirTowerDataContext,
override val smartCasts: Map<RealVariable, Set<ConeKotlinType>> override val smartCasts: Map<RealVariable, Set<ConeKotlinType>>,
) : FirCodeFragmentContext ) : FirCodeFragmentContext
@@ -33,15 +33,12 @@ import org.jetbrains.kotlin.fir.types.FirUserTypeRef
import org.jetbrains.kotlin.util.PrivateForInline import org.jetbrains.kotlin.util.PrivateForInline
internal object LLFirCompilerAnnotationsLazyResolver : LLFirLazyResolver(FirResolvePhase.COMPILER_REQUIRED_ANNOTATIONS) { internal object LLFirCompilerAnnotationsLazyResolver : LLFirLazyResolver(FirResolvePhase.COMPILER_REQUIRED_ANNOTATIONS) {
override fun resolve( override fun createTargetResolver(
target: LLFirResolveTarget, target: LLFirResolveTarget,
lockProvider: LLFirLockProvider, lockProvider: LLFirLockProvider,
scopeSession: ScopeSession, scopeSession: ScopeSession,
towerDataContextCollector: FirResolveContextCollector?, towerDataContextCollector: FirResolveContextCollector?,
) { ): LLFirTargetResolver = LLFirCompilerRequiredAnnotationsTargetResolver(target, lockProvider, scopeSession)
val resolver = LLFirCompilerRequiredAnnotationsTargetResolver(target, lockProvider, scopeSession)
resolver.resolveDesignation()
}
override fun phaseSpecificCheckIsResolved(target: FirElementWithResolveState) { override fun phaseSpecificCheckIsResolved(target: FirElementWithResolveState) {
when (target) { when (target) {
@@ -26,15 +26,12 @@ import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef
import org.jetbrains.kotlin.util.PrivateForInline import org.jetbrains.kotlin.util.PrivateForInline
internal object LLFirContractsLazyResolver : LLFirLazyResolver(FirResolvePhase.CONTRACTS) { internal object LLFirContractsLazyResolver : LLFirLazyResolver(FirResolvePhase.CONTRACTS) {
override fun resolve( override fun createTargetResolver(
target: LLFirResolveTarget, target: LLFirResolveTarget,
lockProvider: LLFirLockProvider, lockProvider: LLFirLockProvider,
scopeSession: ScopeSession, scopeSession: ScopeSession,
towerDataContextCollector: FirResolveContextCollector?, towerDataContextCollector: FirResolveContextCollector?,
) { ): LLFirTargetResolver = LLFirContractsTargetResolver(target, lockProvider, scopeSession, towerDataContextCollector)
val resolver = LLFirContractsTargetResolver(target, lockProvider, scopeSession, towerDataContextCollector)
resolver.resolveDesignation()
}
override fun phaseSpecificCheckIsResolved(target: FirElementWithResolveState) { override fun phaseSpecificCheckIsResolved(target: FirElementWithResolveState) {
if (target !is FirContractDescriptionOwner) return 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. * 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 import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
internal object LLFirExpectActualMatcherLazyResolver : LLFirLazyResolver(FirResolvePhase.EXPECT_ACTUAL_MATCHING) { internal object LLFirExpectActualMatcherLazyResolver : LLFirLazyResolver(FirResolvePhase.EXPECT_ACTUAL_MATCHING) {
override fun resolve( override fun createTargetResolver(
target: LLFirResolveTarget, target: LLFirResolveTarget,
lockProvider: LLFirLockProvider, lockProvider: LLFirLockProvider,
scopeSession: ScopeSession, scopeSession: ScopeSession,
towerDataContextCollector: FirResolveContextCollector?, towerDataContextCollector: FirResolveContextCollector?,
) { ): LLFirTargetResolver = LLFirExpectActualMatchingTargetResolver(target, lockProvider, scopeSession)
val resolver = LLFirExpectActualMatchingTargetResolver(target, lockProvider, scopeSession)
resolver.resolveDesignation()
}
override fun phaseSpecificCheckIsResolved(target: FirElementWithResolveState) { override fun phaseSpecificCheckIsResolved(target: FirElementWithResolveState) {
if (target.moduleData.session.languageVersionSettings.supportsFeature(LanguageFeature.MultiPlatformProjects) && 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. * 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 import org.jetbrains.kotlin.fir.resolve.transformers.plugin.FirCompanionGenerationTransformer
internal object LLFirGeneratedCompanionObjectLazyResolver : LLFirLazyResolver(FirResolvePhase.COMPANION_GENERATION) { internal object LLFirGeneratedCompanionObjectLazyResolver : LLFirLazyResolver(FirResolvePhase.COMPANION_GENERATION) {
override fun resolve( override fun createTargetResolver(
target: LLFirResolveTarget, target: LLFirResolveTarget,
lockProvider: LLFirLockProvider, lockProvider: LLFirLockProvider,
scopeSession: ScopeSession, scopeSession: ScopeSession,
towerDataContextCollector: FirResolveContextCollector?, towerDataContextCollector: FirResolveContextCollector?,
) { ): LLFirTargetResolver = LLFirCompanionGenerationTargetResolver(target, lockProvider)
val resolver = LLFirCompanionGenerationTargetResolver(target, lockProvider)
resolver.resolveDesignation() override fun phaseSpecificCheckIsResolved(target: FirElementWithResolveState) {}
}
} }
private class LLFirCompanionGenerationTargetResolver( private class LLFirCompanionGenerationTargetResolver(
@@ -29,15 +29,12 @@ import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment
import org.jetbrains.kotlin.utils.exceptions.requireWithAttachment import org.jetbrains.kotlin.utils.exceptions.requireWithAttachment
internal object LLFirImplicitTypesLazyResolver : LLFirLazyResolver(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) { internal object LLFirImplicitTypesLazyResolver : LLFirLazyResolver(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) {
override fun resolve( override fun createTargetResolver(
target: LLFirResolveTarget, target: LLFirResolveTarget,
lockProvider: LLFirLockProvider, lockProvider: LLFirLockProvider,
scopeSession: ScopeSession, scopeSession: ScopeSession,
towerDataContextCollector: FirResolveContextCollector?, towerDataContextCollector: FirResolveContextCollector?,
) { ): LLFirTargetResolver = LLFirImplicitBodyTargetResolver(target, lockProvider, scopeSession, towerDataContextCollector)
val resolver = LLFirImplicitBodyTargetResolver(target, lockProvider, scopeSession, towerDataContextCollector)
resolver.resolveDesignation()
}
override fun phaseSpecificCheckIsResolved(target: FirElementWithResolveState) { override fun phaseSpecificCheckIsResolved(target: FirElementWithResolveState) {
if (target !is FirCallableDeclaration) return 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. * 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.declarations.*
import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirResolveContextCollector 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) { internal abstract class LLFirLazyResolver(val resolverPhase: FirResolvePhase) {
abstract fun resolve( fun resolve(
target: LLFirResolveTarget, target: LLFirResolveTarget,
lockProvider: LLFirLockProvider, lockProvider: LLFirLockProvider,
scopeSession: ScopeSession, scopeSession: ScopeSession,
towerDataContextCollector: FirResolveContextCollector?, 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) { fun checkIsResolved(target: FirElementWithResolveState) {
target.checkPhase(resolverPhase) target.checkPhase(resolverPhase)
@@ -33,7 +60,7 @@ internal abstract class LLFirLazyResolver(val resolverPhase: FirResolvePhase) {
* Will be performed to resolved declaration and its nested declarations * Will be performed to resolved declaration and its nested declarations
* @see checkNestedDeclarationsAreResolved * @see checkNestedDeclarationsAreResolved
*/ */
protected open fun phaseSpecificCheckIsResolved(target: FirElementWithResolveState) {} protected abstract fun phaseSpecificCheckIsResolved(target: FirElementWithResolveState)
fun updatePhaseForDeclarationInternals(target: FirElementWithResolveState) { fun updatePhaseForDeclarationInternals(target: FirElementWithResolveState) {
LLFirPhaseUpdater.updateDeclarationInternalsPhase( 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. * 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 import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirResolveContextCollector
internal object LLFirSealedClassInheritorsLazyResolver : LLFirLazyResolver(FirResolvePhase.SEALED_CLASS_INHERITORS) { internal object LLFirSealedClassInheritorsLazyResolver : LLFirLazyResolver(FirResolvePhase.SEALED_CLASS_INHERITORS) {
override fun resolve( override fun createTargetResolver(
target: LLFirResolveTarget, target: LLFirResolveTarget,
lockProvider: LLFirLockProvider, lockProvider: LLFirLockProvider,
scopeSession: ScopeSession, scopeSession: ScopeSession,
towerDataContextCollector: FirResolveContextCollector?, towerDataContextCollector: FirResolveContextCollector?,
) { ): LLFirTargetResolver = LLFirSealedClassInheritorsDesignatedResolver(target, lockProvider)
val resolver = LLFirSealedClassInheritorsDesignatedResolver(target, lockProvider)
resolver.resolveDesignation() override fun phaseSpecificCheckIsResolved(target: FirElementWithResolveState) {}
}
} }
@@ -31,21 +31,17 @@ import org.jetbrains.kotlin.fir.visitors.transformSingle
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
internal object LLFirStatusLazyResolver : LLFirLazyResolver(FirResolvePhase.STATUS) { internal object LLFirStatusLazyResolver : LLFirLazyResolver(FirResolvePhase.STATUS) {
override fun resolve( override fun createTargetResolver(
target: LLFirResolveTarget, target: LLFirResolveTarget,
lockProvider: LLFirLockProvider, lockProvider: LLFirLockProvider,
scopeSession: ScopeSession, scopeSession: ScopeSession,
towerDataContextCollector: FirResolveContextCollector?, towerDataContextCollector: FirResolveContextCollector?,
) { ): LLFirTargetResolver = LLFirStatusTargetResolver(
val resolver = LLFirStatusTargetResolver( target = target,
target = target, lockProvider = lockProvider,
lockProvider = lockProvider, scopeSession = scopeSession,
scopeSession = scopeSession, resolveMode = target.resolveMode(),
resolveMode = target.resolveMode(), )
)
resolver.resolveDesignation()
}
override fun phaseSpecificCheckIsResolved(target: FirElementWithResolveState) { override fun phaseSpecificCheckIsResolved(target: FirElementWithResolveState) {
if (target !is FirMemberDeclaration) return if (target !is FirMemberDeclaration) return
@@ -34,15 +34,12 @@ import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
internal object LLFirSupertypeLazyResolver : LLFirLazyResolver(FirResolvePhase.SUPER_TYPES) { internal object LLFirSupertypeLazyResolver : LLFirLazyResolver(FirResolvePhase.SUPER_TYPES) {
override fun resolve( override fun createTargetResolver(
target: LLFirResolveTarget, target: LLFirResolveTarget,
lockProvider: LLFirLockProvider, lockProvider: LLFirLockProvider,
scopeSession: ScopeSession, scopeSession: ScopeSession,
towerDataContextCollector: FirResolveContextCollector?, towerDataContextCollector: FirResolveContextCollector?,
) { ): LLFirTargetResolver = LLFirSuperTypeTargetResolver(target, lockProvider, scopeSession)
val resolver = LLFirSuperTypeTargetResolver(target, lockProvider, scopeSession)
resolver.resolveDesignation()
}
override fun phaseSpecificCheckIsResolved(target: FirElementWithResolveState) { override fun phaseSpecificCheckIsResolved(target: FirElementWithResolveState) {
when (target) { when (target) {
@@ -39,7 +39,7 @@ import org.jetbrains.kotlin.utils.exceptions.requireWithAttachment
internal abstract class LLFirTargetResolver( internal abstract class LLFirTargetResolver(
protected val resolveTarget: LLFirResolveTarget, protected val resolveTarget: LLFirResolveTarget,
protected val lockProvider: LLFirLockProvider, protected val lockProvider: LLFirLockProvider,
protected val resolverPhase: FirResolvePhase, val resolverPhase: FirResolvePhase,
private val isJumpingPhase: Boolean = false, private val isJumpingPhase: Boolean = false,
) : LLFirResolveTargetVisitor { ) : LLFirResolveTargetVisitor {
val resolveTargetSession: LLFirSession get() = resolveTarget.session val resolveTargetSession: LLFirSession get() = resolveTarget.session
@@ -31,15 +31,12 @@ import org.jetbrains.kotlin.util.PrivateForInline
import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment
internal object LLFirTypeLazyResolver : LLFirLazyResolver(FirResolvePhase.TYPES) { internal object LLFirTypeLazyResolver : LLFirLazyResolver(FirResolvePhase.TYPES) {
override fun resolve( override fun createTargetResolver(
target: LLFirResolveTarget, target: LLFirResolveTarget,
lockProvider: LLFirLockProvider, lockProvider: LLFirLockProvider,
scopeSession: ScopeSession, scopeSession: ScopeSession,
towerDataContextCollector: FirResolveContextCollector?, towerDataContextCollector: FirResolveContextCollector?,
) { ): LLFirTargetResolver = LLFirTypeTargetResolver(target, lockProvider, scopeSession)
val resolver = LLFirTypeTargetResolver(target, lockProvider, scopeSession)
resolver.resolveDesignation()
}
override fun phaseSpecificCheckIsResolved(target: FirElementWithResolveState) { override fun phaseSpecificCheckIsResolved(target: FirElementWithResolveState) {
if (target is FirAnnotationContainer) { if (target is FirAnnotationContainer) {