diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirAnnotationArgumentsLazyResolver.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirAnnotationArgumentsLazyResolver.kt index 8749e8cf915..c9a5c3e82c8 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirAnnotationArgumentsLazyResolver.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirAnnotationArgumentsLazyResolver.kt @@ -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 diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirBodyLazyResolver.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirBodyLazyResolver.kt index 8751c5deffd..fa962c93eea 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirBodyLazyResolver.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirBodyLazyResolver.kt @@ -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> + override val smartCasts: Map>, ) : FirCodeFragmentContext diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirCompilerAnnotationsLazyResolver.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirCompilerAnnotationsLazyResolver.kt index 285df438f40..118979d8e3a 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirCompilerAnnotationsLazyResolver.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirCompilerAnnotationsLazyResolver.kt @@ -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) { diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirContractsLazyResolver.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirContractsLazyResolver.kt index 661638ccebf..f940ad1924a 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirContractsLazyResolver.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirContractsLazyResolver.kt @@ -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 diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirExpectActualMatcherLazyResolver.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirExpectActualMatcherLazyResolver.kt index c117e0feb87..f31783c0df4 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirExpectActualMatcherLazyResolver.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirExpectActualMatcherLazyResolver.kt @@ -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) && diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirGeneratedCompanionObjectLazyResolver.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirGeneratedCompanionObjectLazyResolver.kt index 80bed7ad2fa..0e8750394c5 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirGeneratedCompanionObjectLazyResolver.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirGeneratedCompanionObjectLazyResolver.kt @@ -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( diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirImplicitTypesLazyResolver.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirImplicitTypesLazyResolver.kt index 19e72345c7b..f6e6db34805 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirImplicitTypesLazyResolver.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirImplicitTypesLazyResolver.kt @@ -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 diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirLazyResolver.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirLazyResolver.kt index 6d9f154d549..fca7a0fc5b5 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirLazyResolver.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirLazyResolver.kt @@ -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( diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirSealedClassInheritorsLazyResolver.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirSealedClassInheritorsLazyResolver.kt index a68ac28b9ce..0c6c650c18b 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirSealedClassInheritorsLazyResolver.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirSealedClassInheritorsLazyResolver.kt @@ -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) {} } diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirStatusLazyResolver.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirStatusLazyResolver.kt index 7561250e31b..9af0fcca15d 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirStatusLazyResolver.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirStatusLazyResolver.kt @@ -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 diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirSupertypeLazyResolver.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirSupertypeLazyResolver.kt index cc7e98e8cd5..fd9322fac9b 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirSupertypeLazyResolver.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirSupertypeLazyResolver.kt @@ -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) { diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirTargetResolver.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirTargetResolver.kt index 2b5c3273e2b..9bb4e290c47 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirTargetResolver.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirTargetResolver.kt @@ -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 diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirTypeLazyResolver.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirTypeLazyResolver.kt index f9563b115fa..f32345115fc 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirTypeLazyResolver.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirTypeLazyResolver.kt @@ -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) {