FIR: Share the same ScopeSession instance between phases
^KT-34563 Fixed
This commit is contained in:
+3
-1
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+4
-2
@@ -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> {
|
||||||
|
|||||||
+4
-1
@@ -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) {
|
||||||
|
|||||||
+4
-4
@@ -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)
|
||||||
|
|||||||
+6
-5
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-2
@@ -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()
|
||||||
|
|||||||
+1
-2
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user