FIR: Extract BodyResolveContext from BodyResolveTransformerComponents
Its content is assumed to be changing and might be injected into body resolver
This commit is contained in:
@@ -30,7 +30,7 @@ interface SessionHolder {
|
||||
|
||||
interface BodyResolveComponents : SessionHolder {
|
||||
val returnTypeCalculator: ReturnTypeCalculator
|
||||
val implicitReceiverStack: MutableImplicitReceiverStack
|
||||
val implicitReceiverStack: ImplicitReceiverStack
|
||||
val fileImportsScope: List<FirScope>
|
||||
val typeParametersScopes: List<FirScope>
|
||||
val localScopes: FirLocalScopes
|
||||
@@ -52,12 +52,10 @@ interface BodyResolveComponents : SessionHolder {
|
||||
|
||||
val <D> AbstractFirBasedSymbol<D>.phasedFir: D where D : FirDeclaration, D : FirSymbolOwner<D>
|
||||
get() = phasedFir(FirResolvePhase.DECLARATIONS)
|
||||
|
||||
fun saveContextForAnonymousFunction(anonymousFunction: FirAnonymousFunction)
|
||||
fun dropContextForAnonymousFunction(anonymousFunction: FirAnonymousFunction)
|
||||
}
|
||||
|
||||
typealias FirLocalScopes = PersistentList<FirLocalScope>
|
||||
typealias FirTypeParametersScopes = PersistentList<FirScope>
|
||||
|
||||
class FirLocalContext(
|
||||
val localScopes: FirLocalScopes,
|
||||
|
||||
+2
-2
@@ -189,10 +189,10 @@ class FirCallCompleter(
|
||||
lambdaArgument.replaceReturnTypeRef(expectedReturnTypeRef ?: noExpectedType)
|
||||
|
||||
val localContext = localContextForAnonymousFunctions.getValue(lambdaArgument.symbol)
|
||||
transformer.components.withLocalContext(localContext) {
|
||||
transformer.context.withLocalContext(localContext) {
|
||||
lambdaArgument.transformSingle(transformer, ResolutionMode.LambdaResolution(expectedReturnTypeRef))
|
||||
}
|
||||
dropContextForAnonymousFunction(lambdaArgument)
|
||||
transformer.context.dropContextForAnonymousFunction(lambdaArgument)
|
||||
|
||||
val returnArguments = dataFlowAnalyzer.returnExpressionsOfAnonymousFunction(lambdaArgument)
|
||||
|
||||
|
||||
+51
-49
@@ -5,7 +5,6 @@
|
||||
|
||||
package org.jetbrains.kotlin.fir.resolve.transformers.body.resolve
|
||||
|
||||
import kotlinx.collections.immutable.PersistentList
|
||||
import kotlinx.collections.immutable.persistentListOf
|
||||
import org.jetbrains.kotlin.fir.*
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
@@ -24,6 +23,7 @@ import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildImplicitTypeRef
|
||||
|
||||
abstract class FirAbstractBodyResolveTransformer(phase: FirResolvePhase) : FirAbstractPhaseTransformer<ResolutionMode>(phase) {
|
||||
abstract val context: BodyResolveContext
|
||||
abstract val components: BodyResolveTransformerComponents
|
||||
|
||||
@set:PrivateForInline
|
||||
@@ -52,12 +52,12 @@ abstract class FirAbstractBodyResolveTransformer(phase: FirResolvePhase) : FirAb
|
||||
}
|
||||
|
||||
protected inline fun <T> withLocalScopeCleanup(crossinline l: () -> T): T {
|
||||
return components.withLocalScopesCleanup(l)
|
||||
return context.withLocalScopesCleanup(l)
|
||||
}
|
||||
|
||||
protected fun addLocalScope(localScope: FirLocalScope?) {
|
||||
if (localScope == null) return
|
||||
components.addLocalScope(localScope)
|
||||
context.addLocalScope(localScope)
|
||||
}
|
||||
|
||||
|
||||
@@ -78,7 +78,7 @@ abstract class FirAbstractBodyResolveTransformer(phase: FirResolvePhase) : FirAb
|
||||
|
||||
protected inline val symbolProvider: FirSymbolProvider get() = components.symbolProvider
|
||||
|
||||
protected inline val implicitReceiverStack: MutableImplicitReceiverStack get() = components.implicitReceiverStack
|
||||
protected inline val implicitReceiverStack: ImplicitReceiverStack get() = components.implicitReceiverStack
|
||||
protected inline val inferenceComponents: InferenceComponents get() = components.inferenceComponents
|
||||
protected inline val resolutionStageRunner: ResolutionStageRunner get() = components.resolutionStageRunner
|
||||
protected inline val samResolver: FirSamResolver get() = components.samResolver
|
||||
@@ -99,62 +99,26 @@ abstract class FirAbstractBodyResolveTransformer(phase: FirResolvePhase) : FirAb
|
||||
else -> null
|
||||
}
|
||||
|
||||
class BodyResolveTransformerComponents(
|
||||
override val session: FirSession,
|
||||
override val scopeSession: ScopeSession,
|
||||
val transformer: FirBodyResolveTransformer
|
||||
) : BodyResolveComponents {
|
||||
override val fileImportsScope: MutableList<FirScope> = mutableListOf()
|
||||
class BodyResolveContext(val returnTypeCalculator: ReturnTypeCalculator) {
|
||||
val fileImportsScope: MutableList<FirScope> = mutableListOf()
|
||||
|
||||
@set:PrivateForInline
|
||||
override var typeParametersScopes: PersistentList<FirScope> = persistentListOf()
|
||||
var typeParametersScopes: FirTypeParametersScopes = persistentListOf()
|
||||
|
||||
@set:PrivateForInline
|
||||
override var localScopes: FirLocalScopes = persistentListOf()
|
||||
|
||||
override val noExpectedType: FirTypeRef = buildImplicitTypeRef()
|
||||
|
||||
override val localContextForAnonymousFunctions: MutableMap<FirAnonymousFunctionSymbol, FirLocalContext> = mutableMapOf()
|
||||
var localScopes: FirLocalScopes = persistentListOf()
|
||||
|
||||
@set:PrivateForInline
|
||||
override lateinit var file: FirFile
|
||||
lateinit var file: FirFile
|
||||
internal set
|
||||
|
||||
override val symbolProvider: FirSymbolProvider = session.firSymbolProvider
|
||||
|
||||
override val returnTypeCalculator: ReturnTypeCalculator = transformer.returnTypeCalculator
|
||||
|
||||
@set:PrivateForInline
|
||||
override var implicitReceiverStack: MutableImplicitReceiverStack = ImplicitReceiverStackImpl()
|
||||
|
||||
override val inferenceComponents: InferenceComponents = inferenceComponents(session, returnTypeCalculator, scopeSession)
|
||||
override val resolutionStageRunner: ResolutionStageRunner = ResolutionStageRunner(inferenceComponents)
|
||||
override val samResolver: FirSamResolver = FirSamResolverImpl(session, scopeSession)
|
||||
override val doubleColonExpressionResolver: FirDoubleColonExpressionResolver = FirDoubleColonExpressionResolver(session)
|
||||
private val qualifiedResolver: FirQualifiedNameResolver = FirQualifiedNameResolver(this)
|
||||
override val callResolver: FirCallResolver = FirCallResolver(
|
||||
this,
|
||||
qualifiedResolver
|
||||
)
|
||||
val typeResolverTransformer = FirSpecificTypeResolverTransformer(
|
||||
FirTypeResolveScopeForBodyResolve(this), session
|
||||
)
|
||||
override val callCompleter: FirCallCompleter = FirCallCompleter(transformer, this)
|
||||
override val dataFlowAnalyzer: FirDataFlowAnalyzer<*> = FirDataFlowAnalyzer.createFirDataFlowAnalyzer(this)
|
||||
override val syntheticCallGenerator: FirSyntheticCallGenerator = FirSyntheticCallGenerator(this)
|
||||
override val integerLiteralTypeApproximator: IntegerLiteralTypeApproximationTransformer =
|
||||
IntegerLiteralTypeApproximationTransformer(symbolProvider, inferenceComponents.ctx)
|
||||
override val integerOperatorsTypeUpdater: IntegerOperatorsTypeUpdater = IntegerOperatorsTypeUpdater(integerLiteralTypeApproximator)
|
||||
var implicitReceiverStack: MutableImplicitReceiverStack = ImplicitReceiverStackImpl()
|
||||
|
||||
@set:PrivateForInline
|
||||
var containerIfAny: FirDeclaration? = null
|
||||
|
||||
override var container: FirDeclaration
|
||||
get() = containerIfAny!!
|
||||
private set(value) {
|
||||
@OptIn(PrivateForInline::class)
|
||||
containerIfAny = value
|
||||
}
|
||||
val localContextForAnonymousFunctions: MutableMap<FirAnonymousFunctionSymbol, FirLocalContext> = mutableMapOf()
|
||||
|
||||
@OptIn(PrivateForInline::class)
|
||||
inline fun <T> withContainer(declaration: FirDeclaration, crossinline f: () -> T): T {
|
||||
@@ -208,11 +172,11 @@ abstract class FirAbstractBodyResolveTransformer(phase: FirResolvePhase) : FirAb
|
||||
updateLastScope { storeVariable(variable) }
|
||||
}
|
||||
|
||||
override fun saveContextForAnonymousFunction(anonymousFunction: FirAnonymousFunction) {
|
||||
fun saveContextForAnonymousFunction(anonymousFunction: FirAnonymousFunction) {
|
||||
localContextForAnonymousFunctions[anonymousFunction.symbol] = FirLocalContext(localScopes, implicitReceiverStack.snapshot())
|
||||
}
|
||||
|
||||
override fun dropContextForAnonymousFunction(anonymousFunction: FirAnonymousFunction) {
|
||||
fun dropContextForAnonymousFunction(anonymousFunction: FirAnonymousFunction) {
|
||||
localContextForAnonymousFunctions.remove(anonymousFunction.symbol)
|
||||
}
|
||||
|
||||
@@ -226,5 +190,43 @@ abstract class FirAbstractBodyResolveTransformer(phase: FirResolvePhase) : FirAb
|
||||
localScopes = localScopes.set(localScopes.size - 1, lastScope.transform())
|
||||
}
|
||||
}
|
||||
|
||||
class BodyResolveTransformerComponents(
|
||||
override val session: FirSession,
|
||||
override val scopeSession: ScopeSession,
|
||||
val transformer: FirBodyResolveTransformer,
|
||||
private val context: BodyResolveContext
|
||||
) : BodyResolveComponents {
|
||||
override val fileImportsScope: List<FirScope> get() = context.fileImportsScope
|
||||
override val typeParametersScopes: List<FirScope> get() = context.typeParametersScopes
|
||||
override val localScopes: FirLocalScopes get() = context.localScopes
|
||||
override val file: FirFile get() = context.file
|
||||
override val implicitReceiverStack: ImplicitReceiverStack get() = context.implicitReceiverStack
|
||||
override val localContextForAnonymousFunctions: LocalContextForAnonymousFunctions get() = context.localContextForAnonymousFunctions
|
||||
override val returnTypeCalculator: ReturnTypeCalculator get() = context.returnTypeCalculator
|
||||
override val container: FirDeclaration get() = context.containerIfAny!!
|
||||
|
||||
override val noExpectedType: FirTypeRef = buildImplicitTypeRef()
|
||||
override val symbolProvider: FirSymbolProvider = session.firSymbolProvider
|
||||
|
||||
override val inferenceComponents: InferenceComponents = inferenceComponents(session, returnTypeCalculator, scopeSession)
|
||||
override val resolutionStageRunner: ResolutionStageRunner = ResolutionStageRunner(inferenceComponents)
|
||||
override val samResolver: FirSamResolver = FirSamResolverImpl(session, scopeSession)
|
||||
override val doubleColonExpressionResolver: FirDoubleColonExpressionResolver = FirDoubleColonExpressionResolver(session)
|
||||
private val qualifiedResolver: FirQualifiedNameResolver = FirQualifiedNameResolver(this)
|
||||
override val callResolver: FirCallResolver = FirCallResolver(
|
||||
this,
|
||||
qualifiedResolver
|
||||
)
|
||||
val typeResolverTransformer = FirSpecificTypeResolverTransformer(
|
||||
FirTypeResolveScopeForBodyResolve(this), session
|
||||
)
|
||||
override val callCompleter: FirCallCompleter = FirCallCompleter(transformer, this)
|
||||
override val dataFlowAnalyzer: FirDataFlowAnalyzer<*> = FirDataFlowAnalyzer.createFirDataFlowAnalyzer(this)
|
||||
override val syntheticCallGenerator: FirSyntheticCallGenerator = FirSyntheticCallGenerator(this)
|
||||
override val integerLiteralTypeApproximator: IntegerLiteralTypeApproximationTransformer =
|
||||
IntegerLiteralTypeApproximationTransformer(symbolProvider, inferenceComponents.ctx)
|
||||
override val integerOperatorsTypeUpdater: IntegerOperatorsTypeUpdater = IntegerOperatorsTypeUpdater(integerLiteralTypeApproximator)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+7
-5
@@ -30,19 +30,21 @@ open class FirBodyResolveTransformer(
|
||||
) : FirAbstractBodyResolveTransformer(phase) {
|
||||
private var packageFqName = FqName.ROOT
|
||||
|
||||
override val components: BodyResolveTransformerComponents = BodyResolveTransformerComponents(session, scopeSession, this)
|
||||
final override val context: BodyResolveContext = BodyResolveContext(returnTypeCalculator)
|
||||
final override val components: BodyResolveTransformerComponents =
|
||||
BodyResolveTransformerComponents(session, scopeSession, this, context)
|
||||
|
||||
private val expressionsTransformer = FirExpressionsResolveTransformer(this)
|
||||
private val declarationsTransformer = FirDeclarationsResolveTransformer(this)
|
||||
private val controlFlowStatementsTransformer = FirControlFlowStatementsResolveTransformer(this)
|
||||
|
||||
override fun transformFile(file: FirFile, data: ResolutionMode): CompositeTransformResult<FirFile> {
|
||||
components.cleanContextForAnonymousFunction()
|
||||
context.cleanContextForAnonymousFunction()
|
||||
@OptIn(PrivateForInline::class)
|
||||
components.file = file
|
||||
context.file = file
|
||||
packageFqName = file.packageFqName
|
||||
return withScopeCleanup(components.fileImportsScope) {
|
||||
components.fileImportsScope.addImportingScopes(file, session, components.scopeSession)
|
||||
return withScopeCleanup(context.fileImportsScope) {
|
||||
context.fileImportsScope.addImportingScopes(file, session, components.scopeSession)
|
||||
super.transformFile(file, data)
|
||||
}
|
||||
}
|
||||
|
||||
+12
-12
@@ -39,7 +39,7 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer)
|
||||
private var containingClass: FirRegularClass? = null
|
||||
|
||||
override fun transformDeclaration(declaration: FirDeclaration, data: ResolutionMode): CompositeTransformResult<FirDeclaration> {
|
||||
return components.withContainer(declaration) {
|
||||
return context.withContainer(declaration) {
|
||||
declaration.replaceResolvePhase(transformerPhase)
|
||||
transformer.transformElement(declaration, data)
|
||||
}
|
||||
@@ -71,14 +71,14 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer)
|
||||
typeParameter.transformChildren(transformer, ResolutionMode.ContextIndependent)
|
||||
}
|
||||
|
||||
val before = components.typeParametersScopes
|
||||
val before = context.typeParametersScopes
|
||||
@OptIn(PrivateForInline::class)
|
||||
components.typeParametersScopes = components.typeParametersScopes.add(FirMemberTypeParameterScope(declaration))
|
||||
context.typeParametersScopes = context.typeParametersScopes.add(FirMemberTypeParameterScope(declaration))
|
||||
return try {
|
||||
l()
|
||||
} finally {
|
||||
@OptIn(PrivateForInline::class)
|
||||
components.typeParametersScopes = before
|
||||
context.typeParametersScopes = before
|
||||
}
|
||||
}
|
||||
|
||||
@@ -106,7 +106,7 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer)
|
||||
dataFlowAnalyzer.enterProperty(property)
|
||||
withFullBodyResolve {
|
||||
withLocalScopeCleanup {
|
||||
components.withContainer(property) {
|
||||
context.withContainer(property) {
|
||||
if (property.delegate != null) {
|
||||
addLocalScope(primaryConstructorParametersScope)
|
||||
transformPropertyWithDelegate(property)
|
||||
@@ -203,7 +203,7 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer)
|
||||
}
|
||||
variable.transformAccessors()
|
||||
}
|
||||
components.storeVariable(variable)
|
||||
context.storeVariable(variable)
|
||||
variable.replaceResolvePhase(transformerPhase)
|
||||
dataFlowAnalyzer.exitLocalVariableDeclaration(variable)
|
||||
return variable.compose()
|
||||
@@ -263,7 +263,7 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer)
|
||||
}
|
||||
|
||||
private fun FirDeclaration.resolveStatus(status: FirDeclarationStatus, containingClass: FirClass<*>? = null): FirDeclarationStatus {
|
||||
val containingDeclaration = components.containerIfAny
|
||||
val containingDeclaration = context.containerIfAny
|
||||
return resolveStatus(
|
||||
status, containingClass as? FirRegularClass, isLocal = containingDeclaration != null && containingClass == null
|
||||
)
|
||||
@@ -307,7 +307,7 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer)
|
||||
}
|
||||
|
||||
override fun transformRegularClass(regularClass: FirRegularClass, data: ResolutionMode): CompositeTransformResult<FirStatement> {
|
||||
components.storeClass(regularClass)
|
||||
context.storeClass(regularClass)
|
||||
return withTypeParametersOf(regularClass) {
|
||||
if (regularClass.symbol.classId.isLocal) {
|
||||
prepareLocalClassForBodyResolve(regularClass)
|
||||
@@ -390,7 +390,7 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer)
|
||||
}
|
||||
|
||||
return withTypeParametersOf(simpleFunction) {
|
||||
val containingDeclaration = components.containerIfAny
|
||||
val containingDeclaration = context.containerIfAny
|
||||
if (containingDeclaration != null && containingDeclaration !is FirClass<*>) {
|
||||
// For class members everything should be already prepared
|
||||
prepareSignatureForBodyResolve(simpleFunction)
|
||||
@@ -415,7 +415,7 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer)
|
||||
resolutionMode: ResolutionMode,
|
||||
): CompositeTransformResult<F> {
|
||||
if (function is FirSimpleFunction) {
|
||||
components.storeFunction(function)
|
||||
context.storeFunction(function)
|
||||
}
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
@@ -472,7 +472,7 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer)
|
||||
}
|
||||
|
||||
override fun transformValueParameter(valueParameter: FirValueParameter, data: ResolutionMode): CompositeTransformResult<FirStatement> {
|
||||
components.storeVariable(valueParameter)
|
||||
context.storeVariable(valueParameter)
|
||||
if (valueParameter.returnTypeRef is FirImplicitTypeRef) {
|
||||
valueParameter.replaceResolvePhase(transformerPhase)
|
||||
return valueParameter.compose() // TODO
|
||||
@@ -490,7 +490,7 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer)
|
||||
anonymousFunction.transformReturnTypeRef(transformer, ResolutionMode.ContextIndependent)
|
||||
anonymousFunction.transformReceiverTypeRef(transformer, ResolutionMode.ContextIndependent)
|
||||
anonymousFunction.valueParameters.forEach { it.transformReturnTypeRef(transformer, ResolutionMode.ContextIndependent) }
|
||||
components.saveContextForAnonymousFunction(anonymousFunction)
|
||||
context.saveContextForAnonymousFunction(anonymousFunction)
|
||||
}
|
||||
return when (data) {
|
||||
ResolutionMode.ContextDependent -> {
|
||||
|
||||
+1
-1
@@ -200,7 +200,7 @@ private class FirDesignatedBodyResolveTransformerForReturnTypeCalculator(
|
||||
}
|
||||
|
||||
override fun transformDeclaration(declaration: FirDeclaration, data: ResolutionMode): CompositeTransformResult<FirDeclaration> {
|
||||
return components.withContainer(declaration) {
|
||||
return context.withContainer(declaration) {
|
||||
declaration.replaceResolvePhase(transformerPhase)
|
||||
transformElement(declaration, data)
|
||||
}
|
||||
|
||||
+7
-2
@@ -14,7 +14,12 @@ abstract class FirPartialBodyResolveTransformer(
|
||||
val transformer: FirBodyResolveTransformer
|
||||
) : FirAbstractBodyResolveTransformer(transformer.transformerPhase) {
|
||||
@Suppress("OVERRIDE_BY_INLINE")
|
||||
final override inline val components: BodyResolveTransformerComponents get() = transformer.components
|
||||
final override inline val context: BodyResolveContext
|
||||
get() = transformer.context
|
||||
|
||||
@Suppress("OVERRIDE_BY_INLINE")
|
||||
final override inline val components: BodyResolveTransformerComponents
|
||||
get() = transformer.components
|
||||
|
||||
@set:PrivateForInline
|
||||
override var implicitTypeOnly: Boolean
|
||||
@@ -26,4 +31,4 @@ abstract class FirPartialBodyResolveTransformer(
|
||||
override fun <E : FirElement> transformElement(element: E, data: ResolutionMode): CompositeTransformResult<E> {
|
||||
return element.transform(transformer, data)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -223,7 +223,7 @@ private class FirDesignatedBodyResolveTransformerForIDE(
|
||||
}
|
||||
|
||||
override fun transformDeclaration(declaration: FirDeclaration, data: ResolutionMode): CompositeTransformResult<FirDeclaration> {
|
||||
return components.withContainer(declaration) {
|
||||
return context.withContainer(declaration) {
|
||||
declaration.replaceResolvePhase(transformerPhase)
|
||||
transformElement(declaration, data)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user