From b2b502338ad22cca76ded0e4639c3ac1c566d7fd Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 1 Mar 2021 19:21:03 +0300 Subject: [PATCH] FIR: move lambda / reference specific contexts to general context parts --- .../jetbrains/kotlin/fir/FirCallResolver.kt | 5 +-- .../fir/resolve/BodyResolveComponents.kt | 18 ++++++++- .../fir/resolve/inference/FirCallCompleter.kt | 3 +- .../body/resolve/BodyResolveContext.kt | 39 ++++++++++++------- .../FirAbstractBodyResolveTransformer.kt | 1 - .../body/resolve/FirBodyResolveTransformer.kt | 6 +-- 6 files changed, 43 insertions(+), 29 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt index 845ff7fbe16..4d86259c745 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt @@ -250,10 +250,7 @@ class FirCallResolver( // No reset here! val localCollector = CandidateCollector(components, components.resolutionStageRunner) - val towerDataContext = - transformer.context.towerDataContextForCallableReferences[callableReferenceAccess] ?: transformer.context.towerDataContext - - val result = transformer.context.withSpecialTowerDataContext(towerDataContext) { + val result = transformer.context.withCallableReferenceTowerDataContext(callableReferenceAccess) { towerResolver.runResolver( info, transformer.resolutionContext, diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/BodyResolveComponents.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/BodyResolveComponents.kt index cbf6d23861e..fd426c33af7 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/BodyResolveComponents.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/BodyResolveComponents.kt @@ -10,6 +10,7 @@ import kotlinx.collections.immutable.persistentListOf import org.jetbrains.kotlin.fir.FirCallResolver import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess import org.jetbrains.kotlin.fir.resolve.FirTowerDataMode.* import org.jetbrains.kotlin.fir.resolve.calls.ImplicitDispatchReceiverValue import org.jetbrains.kotlin.fir.resolve.calls.ImplicitExtensionReceiverValue @@ -43,7 +44,6 @@ abstract class BodyResolveComponents : SessionHolder { abstract val towerDataElements: List abstract val towerDataContext: FirTowerDataContext abstract val localScopes: FirLocalScopes - abstract val towerDataContextForAnonymousFunctions: TowerDataContextForAnonymousFunctions abstract val noExpectedType: FirTypeRef abstract val symbolProvider: FirSymbolProvider abstract val file: FirFile @@ -175,9 +175,12 @@ class FirTowerDataContextsForClassParts( val forCompanionObject: FirTowerDataContext get() = modeMap.getValue(COMPANION_OBJECT) val forConstructorHeaders: FirTowerDataContext get() = modeMap.getValue(CONSTRUCTOR_HEADER) + val towerDataContextForAnonymousFunctions: MutableMap = mutableMapOf() + val towerDataContextForCallableReferences: MutableMap = mutableMapOf() + var special: FirTowerDataContext get() = modeMap.getValue(SPECIAL) - set(value) { + private set(value) { mode = SPECIAL modeMap[SPECIAL] = value } @@ -187,6 +190,17 @@ class FirTowerDataContextsForClassParts( modeMap[mode] = value } + fun setAnonymousFunctionContext(symbol: FirAnonymousFunctionSymbol) { + special = towerDataContextForAnonymousFunctions.getValue(symbol) + } + + fun setCallableReferenceContextIfAny(access: FirCallableReferenceAccess) { + val context = towerDataContextForCallableReferences[access] + if (context != null) { + special = context + } + } + fun withMemberDeclarationContext(newContextForMemberDeclarations: FirTowerDataContext): FirTowerDataContextsForClassParts = FirTowerDataContextsForClassParts( newContextForMemberDeclarations, modeMap[NESTED_CLASS], modeMap[COMPANION_OBJECT], modeMap[CONSTRUCTOR_HEADER], diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt index afc8734e05f..15dd3acf85a 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt @@ -222,8 +222,7 @@ class FirCallCompleter( FirBuilderInferenceSession(transformer.resolutionContext, stubsForPostponedVariables as Map) } - val localContext = components.towerDataContextForAnonymousFunctions[lambdaArgument.symbol] ?: error("") - transformer.context.withSpecialTowerDataContext(localContext) { + transformer.context.withAnonymousFunctionTowerDataContext(lambdaArgument.symbol) { if (builderInferenceSession != null) { transformer.context.withInferenceSession(builderInferenceSession) { lambdaArgument.transformSingle(transformer, ResolutionMode.LambdaResolution(expectedReturnTypeRef)) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/BodyResolveContext.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/BodyResolveContext.kt index e31594a0a9f..f759d93afdf 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/BodyResolveContext.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/BodyResolveContext.kt @@ -35,23 +35,27 @@ class BodyResolveContext( lateinit var file: FirFile internal set - val implicitReceiverStack: ImplicitReceiverStack get() = towerDataContext.implicitReceiverStack - - val towerDataContext: FirTowerDataContext - get() = towerDataContextsForClassParts.currentContext - @set:PrivateForInline var towerDataContextsForClassParts: FirTowerDataContextsForClassParts = FirTowerDataContextsForClassParts(forMemberDeclarations = FirTowerDataContext()) - val containerIfAny: FirDeclaration? - get() = containers.lastOrNull() + val towerDataContext: FirTowerDataContext + get() = towerDataContextsForClassParts.currentContext + + val implicitReceiverStack: ImplicitReceiverStack + get() = towerDataContext.implicitReceiverStack + + val towerDataContextForAnonymousFunctions: MutableMap + get() = towerDataContextsForClassParts.towerDataContextForAnonymousFunctions + + val towerDataContextForCallableReferences: MutableMap + get() = towerDataContextsForClassParts.towerDataContextForCallableReferences @set:PrivateForInline var containers: PersistentList = persistentListOf() - val towerDataContextForAnonymousFunctions: MutableMap = mutableMapOf() - val towerDataContextForCallableReferences: MutableMap = mutableMapOf() + val containerIfAny: FirDeclaration? + get() = containers.lastOrNull() @set:PrivateForInline var inferenceSession: FirInferenceSession = FirInferenceSession.DEFAULT @@ -115,9 +119,16 @@ class BodyResolveContext( } } - inline fun withSpecialTowerDataContext(context: FirTowerDataContext, f: () -> T): T { + inline fun withAnonymousFunctionTowerDataContext(symbol: FirAnonymousFunctionSymbol, f: () -> T): T { return withTowerModeCleanup { - towerDataContextsForClassParts.special = context + towerDataContextsForClassParts.setAnonymousFunctionContext(symbol) + f() + } + } + + inline fun withCallableReferenceTowerDataContext(access: FirCallableReferenceAccess, f: () -> T): T { + return withTowerModeCleanup { + towerDataContextsForClassParts.setCallableReferenceContextIfAny(access) f() } } @@ -193,11 +204,9 @@ class BodyResolveContext( towerDataContextForAnonymousFunctions.remove(anonymousFunction.symbol) } - fun cleanContextForAnonymousFunction() { + fun clear() { towerDataContextForAnonymousFunctions.clear() - } - - fun cleanDataFlowContext() { + towerDataContextForCallableReferences.clear() dataFlowAnalyzerContext.reset() } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirAbstractBodyResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirAbstractBodyResolveTransformer.kt index 9d0e54fc455..463315116c9 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirAbstractBodyResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirAbstractBodyResolveTransformer.kt @@ -140,7 +140,6 @@ abstract class FirAbstractBodyResolveTransformer(phase: FirResolvePhase) : FirAb override val file: FirFile get() = context.file override val implicitReceiverStack: ImplicitReceiverStack get() = context.implicitReceiverStack override val containingDeclarations: List get() = context.containers - override val towerDataContextForAnonymousFunctions: TowerDataContextForAnonymousFunctions get() = context.towerDataContextForAnonymousFunctions override val returnTypeCalculator: ReturnTypeCalculator get() = context.returnTypeCalculator override val container: FirDeclaration get() = context.containerIfAny!! diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirBodyResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirBodyResolveTransformer.kt index 6f1d89db757..065ae91acff 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirBodyResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirBodyResolveTransformer.kt @@ -35,7 +35,6 @@ open class FirBodyResolveTransformer( val returnTypeCalculator: ReturnTypeCalculator = ReturnTypeCalculatorForFullBodyResolve(), outerBodyResolveContext: BodyResolveContext? = null ) : FirAbstractBodyResolveTransformer(phase) { - private var packageFqName = FqName.ROOT final override val context: BodyResolveContext = outerBodyResolveContext ?: BodyResolveContext(returnTypeCalculator, DataFlowAnalyzerContext.empty(session)) @@ -50,12 +49,9 @@ open class FirBodyResolveTransformer( override fun transformFile(file: FirFile, data: ResolutionMode): CompositeTransformResult { checkSessionConsistency(file) - context.cleanContextForAnonymousFunction() - context.towerDataContextForCallableReferences.clear() - context.cleanDataFlowContext() + context.clear() @OptIn(PrivateForInline::class) context.file = file - packageFqName = file.packageFqName return withScopeCleanup(context.fileImportsScope) { context.withTowerDataCleanup { val importingScopes = createImportingScopes(file, session, components.scopeSession)