From b084399b58a3ac1b19a71bf19dcc96257981136f Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Wed, 13 May 2020 17:48:27 +0300 Subject: [PATCH] FIR: Cleanup local scope tracking --- .../resolve/FirAbstractBodyResolveTransformer.kt | 12 +++++++++++- .../FirControlFlowStatementsResolveTransformer.kt | 8 +++----- .../resolve/FirDeclarationsResolveTransformer.kt | 5 ++--- .../contracts/FirContractResolveTransformer.kt | 4 +--- .../kotlin/fir/scopes/impl/FirLocalScope.kt | 2 +- 5 files changed, 18 insertions(+), 13 deletions(-) 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 259f64c2e06..123d60aea04 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 @@ -48,12 +48,22 @@ abstract class FirAbstractBodyResolveTransformer(phase: FirResolvePhase) : FirAb return context.withTowerDataCleanup(l) } + protected inline fun withNewLocalScope(crossinline l: () -> T): T { + return context.withTowerDataCleanup { + addNewLocalScope() + l() + } + } + + protected fun addNewLocalScope() { + context.addLocalScope(FirLocalScope()) + } + protected fun addLocalScope(localScope: FirLocalScope?) { if (localScope == null) return context.addLocalScope(localScope) } - @OptIn(PrivateForInline::class) internal inline fun withFullBodyResolve(crossinline l: () -> T): T { if (!implicitTypeOnly) return l() diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirControlFlowStatementsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirControlFlowStatementsResolveTransformer.kt index 09227ea612f..47613b4a126 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirControlFlowStatementsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirControlFlowStatementsResolveTransformer.kt @@ -6,8 +6,8 @@ package org.jetbrains.kotlin.fir.resolve.transformers.body.resolve import org.jetbrains.kotlin.fir.FirTargetElement -import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic +import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.impl.FirElseIfTrueCondition import org.jetbrains.kotlin.fir.expressions.impl.FirEmptyExpressionBlock @@ -16,7 +16,6 @@ import org.jetbrains.kotlin.fir.resolve.ResolutionMode import org.jetbrains.kotlin.fir.resolve.transformers.FirSyntheticCallGenerator import org.jetbrains.kotlin.fir.resolve.transformers.FirWhenExhaustivenessTransformer import org.jetbrains.kotlin.fir.resolvedTypeFromPrototype -import org.jetbrains.kotlin.fir.scopes.impl.FirLocalScope import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef import org.jetbrains.kotlin.fir.types.coneTypeSafe @@ -57,7 +56,7 @@ class FirControlFlowStatementsResolveTransformer(transformer: FirBodyResolveTran dataFlowAnalyzer.enterWhenExpression(whenExpression) return withLocalScopeCleanup with@{ if (whenExpression.subjectVariable != null) { - addLocalScope(FirLocalScope()) + addNewLocalScope() } @Suppress("NAME_SHADOWING") var whenExpression = whenExpression.transformSubject(transformer, ResolutionMode.ContextIndependent) @@ -169,8 +168,7 @@ class FirControlFlowStatementsResolveTransformer(transformer: FirBodyResolveTran override fun transformCatch(catch: FirCatch, data: ResolutionMode): CompositeTransformResult { dataFlowAnalyzer.enterCatchClause(catch) catch.parameter.transformReturnTypeRef(transformer, ResolutionMode.ContextIndependent) - return withLocalScopeCleanup { - addLocalScope(FirLocalScope()) + return withNewLocalScope { catch.transformParameter(transformer, ResolutionMode.ContextIndependent) catch.transformBlock(transformer, ResolutionMode.ContextDependent) }.also { dataFlowAnalyzer.exitCatchClause(it) }.compose() diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt index 20bffcaa9bf..28fe9df5cdb 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt @@ -488,8 +488,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor function: FirFunction, data: ResolutionMode ): CompositeTransformResult { - return withLocalScopeCleanup { - addLocalScope(FirLocalScope()) + return withNewLocalScope { val functionIsNotAnalyzed = transformerPhase != function.resolvePhase if (functionIsNotAnalyzed) { dataFlowAnalyzer.enterFunction(function) @@ -519,7 +518,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor return withLocalScopeCleanup { dataFlowAnalyzer.enterInitBlock(anonymousInitializer) addLocalScope(context.getPrimaryConstructorParametersScope()) - addLocalScope(FirLocalScope()) + addNewLocalScope() val result = transformDeclarationContent(anonymousInitializer, ResolutionMode.ContextIndependent).single as FirAnonymousInitializer val graph = dataFlowAnalyzer.exitInitBlock(result) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/contracts/FirContractResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/contracts/FirContractResolveTransformer.kt index 72e2d37c9a6..001fe4d8a2d 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/contracts/FirContractResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/contracts/FirContractResolveTransformer.kt @@ -19,7 +19,6 @@ import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeContractDescriptionError import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirBodyResolveTransformer import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirDeclarationsResolveTransformer -import org.jetbrains.kotlin.fir.scopes.impl.FirLocalScope import org.jetbrains.kotlin.fir.types.coneTypeUnsafe import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult import org.jetbrains.kotlin.fir.visitors.compose @@ -117,8 +116,7 @@ class FirContractResolveTransformer( val contractDescription = owner.contractDescription require(contractDescription is FirRawContractDescription) val valueParameters = owner.valueParameters - val contractCall = withLocalScopeCleanup { - addLocalScope(FirLocalScope()) + val contractCall = withNewLocalScope { for (valueParameter in valueParameters) { context.storeVariable(valueParameter) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirLocalScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirLocalScope.kt index 0aa1611c32e..0f4bc7b0a29 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirLocalScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirLocalScope.kt @@ -18,7 +18,7 @@ import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.name.Name -class FirLocalScope( +class FirLocalScope private constructor( properties: PersistentMap>, functions: PersistentMultimap>, classes: PersistentMap