From fed08aaff511a17e51062c7c76f562baee7c9f2f Mon Sep 17 00:00:00 2001 From: Roman Golyshev Date: Tue, 22 Feb 2022 02:59:37 +0300 Subject: [PATCH] FIR IDE: Consider COMPANION_GENERATION phase in lazy resolve --- .../resolve/FirLazyDeclarationResolver.kt | 10 +++-- ...eratedCompanionObjectResolveTransformer.kt | 39 +++++++++++++++++++ .../transformers/LazyTransformerFactory.kt | 4 ++ .../plugin/FirCompanionGenerationProcessor.kt | 2 +- 4 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirDesignatedGeneratedCompanionObjectResolveTransformer.kt diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/FirLazyDeclarationResolver.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/FirLazyDeclarationResolver.kt index 799afa63d06..8e6e2cd0b94 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/FirLazyDeclarationResolver.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/FirLazyDeclarationResolver.kt @@ -174,7 +174,7 @@ internal class FirLazyDeclarationResolver(private val firFileBuilder: FirFileBui var currentPhase = FirResolvePhase.IMPORTS while (currentPhase < toPhase) { currentPhase = currentPhase.next - if (currentPhase.pluginPhase) continue + if (skipPhaseInLazyResolve(currentPhase)) continue if (checkPCE) checkCanceled() val transformersToApply = designations.mapNotNull { @@ -358,7 +358,7 @@ internal class FirLazyDeclarationResolver(private val firFileBuilder: FirFileBui while (currentPhase < toPhase) { currentPhase = currentPhase.next - if (currentPhase.pluginPhase) continue + if (skipPhaseInLazyResolve(currentPhase)) continue if (checkPCE) checkCanceled() LazyTransformerFactory.createLazyTransformer( @@ -396,7 +396,7 @@ internal class FirLazyDeclarationResolver(private val firFileBuilder: FirFileBui while (currentPhase < FirResolvePhase.BODY_RESOLVE) { currentPhase = currentPhase.next - if (currentPhase.pluginPhase) continue + if (skipPhaseInLazyResolve(currentPhase)) continue if (checkPCE) checkCanceled() LazyTransformerFactory.createLazyTransformer( @@ -411,6 +411,10 @@ internal class FirLazyDeclarationResolver(private val firFileBuilder: FirFileBui ).transformDeclaration(firFileBuilder.firPhaseRunner) } } + + private fun skipPhaseInLazyResolve(currentPhase: FirResolvePhase): Boolean { + return currentPhase == FirResolvePhase.ANNOTATIONS_FOR_PLUGINS + } } private fun KtDeclaration.getContainingEnumEntryAsMemberOfEnumEntry(): KtEnumEntry? { diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirDesignatedGeneratedCompanionObjectResolveTransformer.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirDesignatedGeneratedCompanionObjectResolveTransformer.kt new file mode 100644 index 00000000000..c16404cecb7 --- /dev/null +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirDesignatedGeneratedCompanionObjectResolveTransformer.kt @@ -0,0 +1,39 @@ +/* + * Copyright 2010-2022 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. + */ + +package org.jetbrains.kotlin.analysis.low.level.api.fir.transformers + +import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirPhaseRunner +import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirDeclarationDesignationWithFile +import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.ResolveTreeBuilder +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.declarations.FirDeclaration +import org.jetbrains.kotlin.fir.declarations.FirResolvePhase +import org.jetbrains.kotlin.fir.resolve.transformers.plugin.FirCompanionGenerationTransformer + +internal class LLFirDesignatedGeneratedCompanionObjectResolveTransformer( + val designation: FirDeclarationDesignationWithFile, + session: FirSession +) : LLFirLazyTransformer { + private val transformer: FirCompanionGenerationTransformer = FirCompanionGenerationTransformer(session) + + override fun transformDeclaration(phaseRunner: LLFirPhaseRunner) { + if (designation.declaration.resolvePhase >= FirResolvePhase.COMPANION_GENERATION) return + + ResolveTreeBuilder.resolvePhase(designation.declaration, FirResolvePhase.COMPANION_GENERATION) { + phaseRunner.runPhaseWithCustomResolve(FirResolvePhase.COMPANION_GENERATION) { + designation.declaration.transform(transformer, null) + } + } + + LLFirLazyTransformer.updatePhaseDeep(designation.declaration, FirResolvePhase.COMPANION_GENERATION) + ensureResolved(designation.declaration) + ensureResolvedDeep(designation.declaration) + } + + override fun ensureResolved(declaration: FirDeclaration) { + check(declaration.resolvePhase >= FirResolvePhase.COMPANION_GENERATION) + } +} \ No newline at end of file diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LazyTransformerFactory.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LazyTransformerFactory.kt index 5fe12c2d6bb..7a042b89a65 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LazyTransformerFactory.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LazyTransformerFactory.kt @@ -24,6 +24,10 @@ internal object LazyTransformerFactory { firProviderInterceptor: FirProviderInterceptor?, checkPCE: Boolean, ): LLFirLazyTransformer = when (phase) { + FirResolvePhase.COMPANION_GENERATION -> LLFirDesignatedGeneratedCompanionObjectResolveTransformer( + designation = designation, + session = designation.firFile.moduleData.session, + ) FirResolvePhase.SEALED_CLASS_INHERITORS -> LLFirLazyTransformer.DUMMY FirResolvePhase.SUPER_TYPES -> LLFirDesignatedSupertypeResolverTransformer( designation = designation, diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/FirCompanionGenerationProcessor.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/FirCompanionGenerationProcessor.kt index 068a6046136..cc0a7a0f35b 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/FirCompanionGenerationProcessor.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/FirCompanionGenerationProcessor.kt @@ -24,7 +24,7 @@ class FirCompanionGenerationProcessor( override val transformer: FirTransformer = FirCompanionGenerationTransformer(session) } -private class FirCompanionGenerationTransformer(val session: FirSession) : FirTransformer() { +class FirCompanionGenerationTransformer(val session: FirSession) : FirTransformer() { override fun transformElement(element: E, data: Nothing?): E { return element }