FIR: Share the same ScopeSession instance between phases

^KT-34563 Fixed
This commit is contained in:
Denis Zharkov
2020-01-28 17:36:21 +03:00
parent 280fb94774
commit e725f255f1
8 changed files with 28 additions and 20 deletions
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.FirSymbolOwner
import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirFile
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.symbols.AbstractFirBasedSymbol import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult
import org.jetbrains.kotlin.fir.visitors.FirDefaultTransformer import org.jetbrains.kotlin.fir.visitors.FirDefaultTransformer
@@ -47,10 +48,11 @@ abstract class FirAbstractPhaseTransformer<D>(
} }
fun FirFile.runResolve(toPhase: FirResolvePhase, fromPhase: FirResolvePhase = FirResolvePhase.RAW_FIR) { fun FirFile.runResolve(toPhase: FirResolvePhase, fromPhase: FirResolvePhase = FirResolvePhase.RAW_FIR) {
val scopeSession = ScopeSession()
var currentPhase = fromPhase var currentPhase = fromPhase
while (currentPhase < toPhase) { while (currentPhase < toPhase) {
currentPhase = currentPhase.next currentPhase = currentPhase.next
val phaseTransformer = currentPhase.createTransformerByPhase() val phaseTransformer = currentPhase.createTransformerByPhase(scopeSession)
transform<FirFile, Nothing?>(phaseTransformer, null) transform<FirFile, Nothing?>(phaseTransformer, null)
} }
} }
@@ -23,9 +23,11 @@ import org.jetbrains.kotlin.fir.visitors.*
import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.addIfNotNull
import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.utils.addToStdlib.safeAs
class FirSupertypeResolverTransformer : FirTransformer<Nothing?>() { class FirSupertypeResolverTransformer(
private val scopeSession: ScopeSession
) : FirTransformer<Nothing?>() {
private val supertypeComputationSession = SupertypeComputationSession() private val supertypeComputationSession = SupertypeComputationSession()
private val scopeSession = ScopeSession()
private val applySupertypesTransformer = FirApplySupertypesTransformer(supertypeComputationSession) private val applySupertypesTransformer = FirApplySupertypesTransformer(supertypeComputationSession)
override fun <E : FirElement> transformElement(element: E, data: Nothing?): CompositeTransformResult<E> { override fun <E : FirElement> transformElement(element: E, data: Nothing?): CompositeTransformResult<E> {
@@ -7,15 +7,18 @@ package org.jetbrains.kotlin.fir.resolve.transformers
import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirFile
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.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer
// TODO: rework, see rr/FIR/semoro-dev FirStagesTransformerFactory // TODO: rework, see rr/FIR/semoro-dev FirStagesTransformerFactory
class FirTotalResolveTransformer { class FirTotalResolveTransformer {
private val scopeSession = ScopeSession()
val transformers: List<FirTransformer<Nothing?>> = val transformers: List<FirTransformer<Nothing?>> =
FirResolvePhase.values() FirResolvePhase.values()
.drop(1) // to remove RAW_FIR phase .drop(1) // to remove RAW_FIR phase
.map { it.createTransformerByPhase() } .map { it.createTransformerByPhase(scopeSession) }
fun processFiles(files: List<FirFile>) { fun processFiles(files: List<FirFile>) {
for (transformer in transformers) { for (transformer in transformers) {
@@ -9,13 +9,14 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.expressions.FirBlock import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.types.* 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.types.impl.FirImplicitBuiltinTypeRef
import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult
import org.jetbrains.kotlin.fir.visitors.compose import org.jetbrains.kotlin.fir.visitors.compose
class FirTypeResolveTransformer : FirAbstractTreeTransformerWithSuperTypes( class FirTypeResolveTransformer(private val scopeSession: ScopeSession) : FirAbstractTreeTransformerWithSuperTypes(
phase = FirResolvePhase.TYPES, phase = FirResolvePhase.TYPES,
reversedScopePriority = true reversedScopePriority = true
) { ) {
@@ -25,7 +26,6 @@ class FirTypeResolveTransformer : FirAbstractTreeTransformerWithSuperTypes(
override fun transformFile(file: FirFile, data: Nothing?): CompositeTransformResult<FirFile> { override fun transformFile(file: FirFile, data: Nothing?): CompositeTransformResult<FirFile> {
session = file.session session = file.session
val scopeSession = ScopeSession()
return withScopeCleanup { return withScopeCleanup {
towerScope.addImportingScopes(file, session, scopeSession) towerScope.addImportingScopes(file, session, scopeSession)
typeResolverTransformer = FirSpecificTypeResolverTransformer(towerScope, session) typeResolverTransformer = FirSpecificTypeResolverTransformer(towerScope, session)
@@ -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.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.FirBodyResolveTransformerAdapter
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirImplicitTypeBodyResolveTransformerAdapter import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirImplicitTypeBodyResolveTransformerAdapter
import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer
// TODO: add FirSession parameter // TODO: add FirSession parameter
fun FirResolvePhase.createTransformerByPhase(): FirTransformer<Nothing?> { fun FirResolvePhase.createTransformerByPhase(scopeSession: ScopeSession): FirTransformer<Nothing?> {
return when (this) { return when (this) {
RAW_FIR -> throw AssertionError("Raw FIR building phase does not have a transformer") RAW_FIR -> throw AssertionError("Raw FIR building phase does not have a transformer")
IMPORTS -> FirImportResolveTransformer() IMPORTS -> FirImportResolveTransformer()
SUPER_TYPES -> FirSupertypeResolverTransformer() SUPER_TYPES -> FirSupertypeResolverTransformer(scopeSession)
SEALED_CLASS_INHERITORS -> FirSealedClassInheritorsTransformer() SEALED_CLASS_INHERITORS -> FirSealedClassInheritorsTransformer()
TYPES -> FirTypeResolveTransformer() TYPES -> FirTypeResolveTransformer(scopeSession)
STATUS -> FirStatusResolveTransformer() STATUS -> FirStatusResolveTransformer()
IMPLICIT_TYPES_BODY_RESOLVE -> FirImplicitTypeBodyResolveTransformerAdapter() IMPLICIT_TYPES_BODY_RESOLVE -> FirImplicitTypeBodyResolveTransformerAdapter(scopeSession)
BODY_RESOLVE -> FirBodyResolveTransformerAdapter() BODY_RESOLVE -> FirBodyResolveTransformerAdapter(scopeSession)
} }
} }
@@ -15,8 +15,7 @@ import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.fir.visitors.compose import org.jetbrains.kotlin.fir.visitors.compose
@Deprecated("It is temp", level = DeprecationLevel.WARNING, replaceWith = ReplaceWith("TODO(\"что-то нормальное\")")) @Deprecated("It is temp", level = DeprecationLevel.WARNING, replaceWith = ReplaceWith("TODO(\"что-то нормальное\")"))
class FirBodyResolveTransformerAdapter : FirTransformer<Nothing?>() { class FirBodyResolveTransformerAdapter(private val scopeSession: ScopeSession) : FirTransformer<Nothing?>() {
private val scopeSession = ScopeSession()
override fun <E : FirElement> transformElement(element: E, data: Nothing?): CompositeTransformResult<E> { override fun <E : FirElement> transformElement(element: E, data: Nothing?): CompositeTransformResult<E> {
return element.compose() return element.compose()
@@ -29,8 +29,7 @@ import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.fir.visitors.compose import org.jetbrains.kotlin.fir.visitors.compose
@Deprecated("It is temp", level = DeprecationLevel.WARNING, replaceWith = ReplaceWith("TODO(\"что-то нормальное\")")) @Deprecated("It is temp", level = DeprecationLevel.WARNING, replaceWith = ReplaceWith("TODO(\"что-то нормальное\")"))
class FirImplicitTypeBodyResolveTransformerAdapter : FirTransformer<Nothing?>() { class FirImplicitTypeBodyResolveTransformerAdapter(private val scopeSession: ScopeSession) : FirTransformer<Nothing?>() {
private val scopeSession = ScopeSession()
private val implicitBodyResolveComputationSession = ImplicitBodyResolveComputationSession() private val implicitBodyResolveComputationSession = ImplicitBodyResolveComputationSession()
override fun <E : FirElement> transformElement(element: E, data: Nothing?): CompositeTransformResult<E> { override fun <E : FirElement> transformElement(element: E, data: Nothing?): CompositeTransformResult<E> {
@@ -193,8 +193,10 @@ private fun FirDeclaration.runResolve(
if (designation.all { it.resolvePhase >= toPhase }) { if (designation.all { it.resolvePhase >= toPhase }) {
return return
} }
val scopeSession = ScopeSession()
val transformer = FirDesignatedBodyResolveTransformerForIDE( val transformer = FirDesignatedBodyResolveTransformerForIDE(
designation.iterator(), state.getSession(psi as KtElement), designation.iterator(), state.getSession(psi as KtElement),
scopeSession,
implicitTypeOnly = toPhase == FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE implicitTypeOnly = toPhase == FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE
) )
file.transform<FirFile, ResolutionMode>(transformer, ResolutionMode.ContextDependent) file.transform<FirFile, ResolutionMode>(transformer, ResolutionMode.ContextDependent)
@@ -203,8 +205,8 @@ private fun FirDeclaration.runResolve(
private class FirDesignatedBodyResolveTransformerForIDE( private class FirDesignatedBodyResolveTransformerForIDE(
private val designation: Iterator<FirElement>, private val designation: Iterator<FirElement>,
session: FirSession, session: FirSession,
scopeSession: ScopeSession = ScopeSession(), scopeSession: ScopeSession,
implicitTypeOnly: Boolean = true implicitTypeOnly: Boolean
) : FirBodyResolveTransformer( ) : FirBodyResolveTransformer(
session, session,
phase = FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE, phase = FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE,