FIR: Cleanup local scope tracking

This commit is contained in:
Denis Zharkov
2020-05-13 17:48:27 +03:00
parent e7e84b18cd
commit b084399b58
5 changed files with 18 additions and 13 deletions
@@ -48,12 +48,22 @@ abstract class FirAbstractBodyResolveTransformer(phase: FirResolvePhase) : FirAb
return context.withTowerDataCleanup(l) return context.withTowerDataCleanup(l)
} }
protected inline fun <T> withNewLocalScope(crossinline l: () -> T): T {
return context.withTowerDataCleanup {
addNewLocalScope()
l()
}
}
protected fun addNewLocalScope() {
context.addLocalScope(FirLocalScope())
}
protected fun addLocalScope(localScope: FirLocalScope?) { protected fun addLocalScope(localScope: FirLocalScope?) {
if (localScope == null) return if (localScope == null) return
context.addLocalScope(localScope) context.addLocalScope(localScope)
} }
@OptIn(PrivateForInline::class) @OptIn(PrivateForInline::class)
internal inline fun <T> withFullBodyResolve(crossinline l: () -> T): T { internal inline fun <T> withFullBodyResolve(crossinline l: () -> T): T {
if (!implicitTypeOnly) return l() if (!implicitTypeOnly) return l()
@@ -6,8 +6,8 @@
package org.jetbrains.kotlin.fir.resolve.transformers.body.resolve package org.jetbrains.kotlin.fir.resolve.transformers.body.resolve
import org.jetbrains.kotlin.fir.FirTargetElement 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.ConeSimpleDiagnostic
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.impl.FirElseIfTrueCondition import org.jetbrains.kotlin.fir.expressions.impl.FirElseIfTrueCondition
import org.jetbrains.kotlin.fir.expressions.impl.FirEmptyExpressionBlock 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.FirSyntheticCallGenerator
import org.jetbrains.kotlin.fir.resolve.transformers.FirWhenExhaustivenessTransformer import org.jetbrains.kotlin.fir.resolve.transformers.FirWhenExhaustivenessTransformer
import org.jetbrains.kotlin.fir.resolvedTypeFromPrototype 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.FirImplicitTypeRef
import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef
import org.jetbrains.kotlin.fir.types.coneTypeSafe import org.jetbrains.kotlin.fir.types.coneTypeSafe
@@ -57,7 +56,7 @@ class FirControlFlowStatementsResolveTransformer(transformer: FirBodyResolveTran
dataFlowAnalyzer.enterWhenExpression(whenExpression) dataFlowAnalyzer.enterWhenExpression(whenExpression)
return withLocalScopeCleanup with@{ return withLocalScopeCleanup with@{
if (whenExpression.subjectVariable != null) { if (whenExpression.subjectVariable != null) {
addLocalScope(FirLocalScope()) addNewLocalScope()
} }
@Suppress("NAME_SHADOWING") @Suppress("NAME_SHADOWING")
var whenExpression = whenExpression.transformSubject(transformer, ResolutionMode.ContextIndependent) var whenExpression = whenExpression.transformSubject(transformer, ResolutionMode.ContextIndependent)
@@ -169,8 +168,7 @@ class FirControlFlowStatementsResolveTransformer(transformer: FirBodyResolveTran
override fun transformCatch(catch: FirCatch, data: ResolutionMode): CompositeTransformResult<FirCatch> { override fun transformCatch(catch: FirCatch, data: ResolutionMode): CompositeTransformResult<FirCatch> {
dataFlowAnalyzer.enterCatchClause(catch) dataFlowAnalyzer.enterCatchClause(catch)
catch.parameter.transformReturnTypeRef(transformer, ResolutionMode.ContextIndependent) catch.parameter.transformReturnTypeRef(transformer, ResolutionMode.ContextIndependent)
return withLocalScopeCleanup { return withNewLocalScope {
addLocalScope(FirLocalScope())
catch.transformParameter(transformer, ResolutionMode.ContextIndependent) catch.transformParameter(transformer, ResolutionMode.ContextIndependent)
catch.transformBlock(transformer, ResolutionMode.ContextDependent) catch.transformBlock(transformer, ResolutionMode.ContextDependent)
}.also { dataFlowAnalyzer.exitCatchClause(it) }.compose() }.also { dataFlowAnalyzer.exitCatchClause(it) }.compose()
@@ -488,8 +488,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor
function: FirFunction<F>, function: FirFunction<F>,
data: ResolutionMode data: ResolutionMode
): CompositeTransformResult<FirStatement> { ): CompositeTransformResult<FirStatement> {
return withLocalScopeCleanup { return withNewLocalScope {
addLocalScope(FirLocalScope())
val functionIsNotAnalyzed = transformerPhase != function.resolvePhase val functionIsNotAnalyzed = transformerPhase != function.resolvePhase
if (functionIsNotAnalyzed) { if (functionIsNotAnalyzed) {
dataFlowAnalyzer.enterFunction(function) dataFlowAnalyzer.enterFunction(function)
@@ -519,7 +518,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor
return withLocalScopeCleanup { return withLocalScopeCleanup {
dataFlowAnalyzer.enterInitBlock(anonymousInitializer) dataFlowAnalyzer.enterInitBlock(anonymousInitializer)
addLocalScope(context.getPrimaryConstructorParametersScope()) addLocalScope(context.getPrimaryConstructorParametersScope())
addLocalScope(FirLocalScope()) addNewLocalScope()
val result = val result =
transformDeclarationContent(anonymousInitializer, ResolutionMode.ContextIndependent).single as FirAnonymousInitializer transformDeclarationContent(anonymousInitializer, ResolutionMode.ContextIndependent).single as FirAnonymousInitializer
val graph = dataFlowAnalyzer.exitInitBlock(result) val graph = dataFlowAnalyzer.exitInitBlock(result)
@@ -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.diagnostics.ConeContractDescriptionError
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirBodyResolveTransformer 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.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.types.coneTypeUnsafe
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
@@ -117,8 +116,7 @@ class FirContractResolveTransformer(
val contractDescription = owner.contractDescription val contractDescription = owner.contractDescription
require(contractDescription is FirRawContractDescription) require(contractDescription is FirRawContractDescription)
val valueParameters = owner.valueParameters val valueParameters = owner.valueParameters
val contractCall = withLocalScopeCleanup { val contractCall = withNewLocalScope {
addLocalScope(FirLocalScope())
for (valueParameter in valueParameters) { for (valueParameter in valueParameters) {
context.storeVariable(valueParameter) context.storeVariable(valueParameter)
} }
@@ -18,7 +18,7 @@ import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
class FirLocalScope( class FirLocalScope private constructor(
properties: PersistentMap<Name, FirVariableSymbol<*>>, properties: PersistentMap<Name, FirVariableSymbol<*>>,
functions: PersistentMultimap<Name, FirFunctionSymbol<*>>, functions: PersistentMultimap<Name, FirFunctionSymbol<*>>,
classes: PersistentMap<Name, FirRegularClassSymbol> classes: PersistentMap<Name, FirRegularClassSymbol>