FIR: Add separate local scopes for blocks
This commit is contained in:
+1
-1
@@ -39,7 +39,7 @@ open class FirBodyResolveTransformer(
|
||||
final override val components: BodyResolveTransformerComponents =
|
||||
BodyResolveTransformerComponents(session, scopeSession, this, context)
|
||||
|
||||
private val expressionsTransformer = FirExpressionsResolveTransformer(this)
|
||||
internal val expressionsTransformer = FirExpressionsResolveTransformer(this)
|
||||
protected open val declarationsTransformer = FirDeclarationsResolveTransformer(this)
|
||||
private val controlFlowStatementsTransformer = FirControlFlowStatementsResolveTransformer(this)
|
||||
|
||||
|
||||
+11
-4
@@ -40,10 +40,17 @@ class FirControlFlowStatementsResolveTransformer(transformer: FirBodyResolveTran
|
||||
}
|
||||
|
||||
override fun transformDoWhileLoop(doWhileLoop: FirDoWhileLoop, data: ResolutionMode): CompositeTransformResult<FirStatement> {
|
||||
return doWhileLoop.also(dataFlowAnalyzer::enterDoWhileLoop)
|
||||
.transformBlock(transformer, data).also(dataFlowAnalyzer::enterDoWhileLoopCondition)
|
||||
.transformCondition(transformer, data).also(dataFlowAnalyzer::exitDoWhileLoop)
|
||||
.transformOtherChildren(transformer, data).compose()
|
||||
// Do-while has a specific scope structure (its block and condition effectively share the scope)
|
||||
return withNewLocalScope {
|
||||
doWhileLoop.also(dataFlowAnalyzer::enterDoWhileLoop)
|
||||
.apply {
|
||||
transformer.expressionsTransformer.transformBlockInCurrentScope(block, data)
|
||||
dataFlowAnalyzer
|
||||
}
|
||||
.also(dataFlowAnalyzer::enterDoWhileLoopCondition).transformCondition(transformer, data)
|
||||
.also(dataFlowAnalyzer::exitDoWhileLoop)
|
||||
.transformOtherChildren(transformer, data).compose()
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------- When expressions -------------------------------
|
||||
|
||||
+9
-1
@@ -191,6 +191,14 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
|
||||
}
|
||||
|
||||
override fun transformBlock(block: FirBlock, data: ResolutionMode): CompositeTransformResult<FirStatement> {
|
||||
withNewLocalScope {
|
||||
transformBlockInCurrentScope(block, data)
|
||||
}
|
||||
|
||||
return block.compose()
|
||||
}
|
||||
|
||||
internal fun transformBlockInCurrentScope(block: FirBlock, data: ResolutionMode) {
|
||||
dataFlowAnalyzer.enterBlock(block)
|
||||
val numberOfStatements = block.statements.size
|
||||
|
||||
@@ -220,8 +228,8 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
|
||||
diagnostic = ConeSimpleDiagnostic("No type for block", DiagnosticKind.InferenceError)
|
||||
}
|
||||
}
|
||||
|
||||
dataFlowAnalyzer.exitBlock(block)
|
||||
return block.compose()
|
||||
}
|
||||
|
||||
override fun transformThisReceiverExpression(
|
||||
|
||||
Reference in New Issue
Block a user