From e725f255f14aeafc3d39dc282d2eab137114c568 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Tue, 28 Jan 2020 17:36:21 +0300 Subject: [PATCH] FIR: Share the same ScopeSession instance between phases ^KT-34563 Fixed --- .../transformers/FirAbstractPhaseTransformer.kt | 6 ++++-- .../resolve/transformers/FirSupertypesResolution.kt | 6 ++++-- .../transformers/FirTotalResolveTransformer.kt | 5 ++++- .../resolve/transformers/FirTypeResolveTransformer.kt | 8 ++++---- .../fir/resolve/transformers/ResolvePhaseUtils.kt | 11 ++++++----- .../body/resolve/FirBodyResolveTransformerAdapters.kt | 3 +-- .../body/resolve/FirImplicitBodyResolve.kt | 3 +-- .../org/jetbrains/kotlin/idea/fir/FirResolutionApi.kt | 6 ++++-- 8 files changed, 28 insertions(+), 20 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAbstractPhaseTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAbstractPhaseTransformer.kt index 86448381517..83da4b555af 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAbstractPhaseTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAbstractPhaseTransformer.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.FirSymbolOwner import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirResolvePhase +import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult import org.jetbrains.kotlin.fir.visitors.FirDefaultTransformer @@ -47,10 +48,11 @@ abstract class FirAbstractPhaseTransformer( } fun FirFile.runResolve(toPhase: FirResolvePhase, fromPhase: FirResolvePhase = FirResolvePhase.RAW_FIR) { + val scopeSession = ScopeSession() var currentPhase = fromPhase while (currentPhase < toPhase) { currentPhase = currentPhase.next - val phaseTransformer = currentPhase.createTransformerByPhase() + val phaseTransformer = currentPhase.createTransformerByPhase(scopeSession) transform(phaseTransformer, null) } -} \ No newline at end of file +} diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt index d047ce96191..562c8b43af3 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt @@ -23,9 +23,11 @@ import org.jetbrains.kotlin.fir.visitors.* import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.addToStdlib.safeAs -class FirSupertypeResolverTransformer : FirTransformer() { +class FirSupertypeResolverTransformer( + private val scopeSession: ScopeSession +) : FirTransformer() { private val supertypeComputationSession = SupertypeComputationSession() - private val scopeSession = ScopeSession() + private val applySupertypesTransformer = FirApplySupertypesTransformer(supertypeComputationSession) override fun transformElement(element: E, data: Nothing?): CompositeTransformResult { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTotalResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTotalResolveTransformer.kt index f79849b10d0..424a3b70e43 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTotalResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTotalResolveTransformer.kt @@ -7,15 +7,18 @@ package org.jetbrains.kotlin.fir.resolve.transformers import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirResolvePhase +import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.visitors.FirTransformer // TODO: rework, see rr/FIR/semoro-dev FirStagesTransformerFactory class FirTotalResolveTransformer { + private val scopeSession = ScopeSession() + val transformers: List> = FirResolvePhase.values() .drop(1) // to remove RAW_FIR phase - .map { it.createTransformerByPhase() } + .map { it.createTransformerByPhase(scopeSession) } fun processFiles(files: List) { for (transformer in transformers) { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt index 705d7e5669a..d1d614365cc 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt @@ -9,13 +9,14 @@ import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.expressions.FirBlock import org.jetbrains.kotlin.fir.expressions.FirStatement -import org.jetbrains.kotlin.fir.resolve.* -import org.jetbrains.kotlin.fir.types.* +import org.jetbrains.kotlin.fir.resolve.ScopeSession +import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef +import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.impl.FirImplicitBuiltinTypeRef import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult import org.jetbrains.kotlin.fir.visitors.compose -class FirTypeResolveTransformer : FirAbstractTreeTransformerWithSuperTypes( +class FirTypeResolveTransformer(private val scopeSession: ScopeSession) : FirAbstractTreeTransformerWithSuperTypes( phase = FirResolvePhase.TYPES, reversedScopePriority = true ) { @@ -25,7 +26,6 @@ class FirTypeResolveTransformer : FirAbstractTreeTransformerWithSuperTypes( override fun transformFile(file: FirFile, data: Nothing?): CompositeTransformResult { session = file.session - val scopeSession = ScopeSession() return withScopeCleanup { towerScope.addImportingScopes(file, session, scopeSession) typeResolverTransformer = FirSpecificTypeResolverTransformer(towerScope, session) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/ResolvePhaseUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/ResolvePhaseUtils.kt index e666d1f2cc8..afc1f2828f8 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/ResolvePhaseUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/ResolvePhaseUtils.kt @@ -7,20 +7,21 @@ package org.jetbrains.kotlin.fir.resolve.transformers import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirResolvePhase.* +import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirBodyResolveTransformerAdapter import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirImplicitTypeBodyResolveTransformerAdapter import org.jetbrains.kotlin.fir.visitors.FirTransformer // TODO: add FirSession parameter -fun FirResolvePhase.createTransformerByPhase(): FirTransformer { +fun FirResolvePhase.createTransformerByPhase(scopeSession: ScopeSession): FirTransformer { return when (this) { RAW_FIR -> throw AssertionError("Raw FIR building phase does not have a transformer") IMPORTS -> FirImportResolveTransformer() - SUPER_TYPES -> FirSupertypeResolverTransformer() + SUPER_TYPES -> FirSupertypeResolverTransformer(scopeSession) SEALED_CLASS_INHERITORS -> FirSealedClassInheritorsTransformer() - TYPES -> FirTypeResolveTransformer() + TYPES -> FirTypeResolveTransformer(scopeSession) STATUS -> FirStatusResolveTransformer() - IMPLICIT_TYPES_BODY_RESOLVE -> FirImplicitTypeBodyResolveTransformerAdapter() - BODY_RESOLVE -> FirBodyResolveTransformerAdapter() + IMPLICIT_TYPES_BODY_RESOLVE -> FirImplicitTypeBodyResolveTransformerAdapter(scopeSession) + BODY_RESOLVE -> FirBodyResolveTransformerAdapter(scopeSession) } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirBodyResolveTransformerAdapters.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirBodyResolveTransformerAdapters.kt index d72f0d01072..7f5a87200aa 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirBodyResolveTransformerAdapters.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirBodyResolveTransformerAdapters.kt @@ -15,8 +15,7 @@ import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.compose @Deprecated("It is temp", level = DeprecationLevel.WARNING, replaceWith = ReplaceWith("TODO(\"что-то нормальное\")")) -class FirBodyResolveTransformerAdapter : FirTransformer() { - private val scopeSession = ScopeSession() +class FirBodyResolveTransformerAdapter(private val scopeSession: ScopeSession) : FirTransformer() { override fun transformElement(element: E, data: Nothing?): CompositeTransformResult { return element.compose() diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt index 1ae80d9870c..d60606fdbd5 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt @@ -29,8 +29,7 @@ import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.compose @Deprecated("It is temp", level = DeprecationLevel.WARNING, replaceWith = ReplaceWith("TODO(\"что-то нормальное\")")) -class FirImplicitTypeBodyResolveTransformerAdapter : FirTransformer() { - private val scopeSession = ScopeSession() +class FirImplicitTypeBodyResolveTransformerAdapter(private val scopeSession: ScopeSession) : FirTransformer() { private val implicitBodyResolveComputationSession = ImplicitBodyResolveComputationSession() override fun transformElement(element: E, data: Nothing?): CompositeTransformResult { diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirResolutionApi.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirResolutionApi.kt index 396cb906368..8c2a83958f5 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirResolutionApi.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirResolutionApi.kt @@ -193,8 +193,10 @@ private fun FirDeclaration.runResolve( if (designation.all { it.resolvePhase >= toPhase }) { return } + val scopeSession = ScopeSession() val transformer = FirDesignatedBodyResolveTransformerForIDE( designation.iterator(), state.getSession(psi as KtElement), + scopeSession, implicitTypeOnly = toPhase == FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE ) file.transform(transformer, ResolutionMode.ContextDependent) @@ -203,8 +205,8 @@ private fun FirDeclaration.runResolve( private class FirDesignatedBodyResolveTransformerForIDE( private val designation: Iterator, session: FirSession, - scopeSession: ScopeSession = ScopeSession(), - implicitTypeOnly: Boolean = true + scopeSession: ScopeSession, + implicitTypeOnly: Boolean ) : FirBodyResolveTransformer( session, phase = FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE,