[FIR] Collect logical expression context for smart cast preservation
This commit is contained in:
+6
-1
@@ -544,7 +544,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
|
|||||||
data
|
data
|
||||||
else
|
else
|
||||||
ResolutionMode.ContextIndependent
|
ResolutionMode.ContextIndependent
|
||||||
transformer.firTowerDataContextCollector?.addStatementContext(block.statements[index], context.towerDataContext)
|
collectStatementContext(block.statements[index])
|
||||||
TransformData.Data(value)
|
TransformData.Data(value)
|
||||||
}
|
}
|
||||||
block.transformOtherChildren(transformer, data)
|
block.transformOtherChildren(transformer, data)
|
||||||
@@ -559,6 +559,10 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
|
|||||||
dataFlowAnalyzer.exitBlock(block)
|
dataFlowAnalyzer.exitBlock(block)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun collectStatementContext(statement: FirStatement) {
|
||||||
|
transformer.firTowerDataContextCollector?.addStatementContext(statement, context.towerDataContext)
|
||||||
|
}
|
||||||
|
|
||||||
override fun transformThisReceiverExpression(
|
override fun transformThisReceiverExpression(
|
||||||
thisReceiverExpression: FirThisReceiverExpression,
|
thisReceiverExpression: FirThisReceiverExpression,
|
||||||
data: ResolutionMode,
|
data: ResolutionMode,
|
||||||
@@ -982,6 +986,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
|
|||||||
return binaryLogicExpression.also(dataFlowAnalyzer::enterBinaryLogicExpression)
|
return binaryLogicExpression.also(dataFlowAnalyzer::enterBinaryLogicExpression)
|
||||||
.transformLeftOperand(this, ResolutionMode.WithExpectedType(booleanType))
|
.transformLeftOperand(this, ResolutionMode.WithExpectedType(booleanType))
|
||||||
.also(dataFlowAnalyzer::exitLeftBinaryLogicExpressionArgument)
|
.also(dataFlowAnalyzer::exitLeftBinaryLogicExpressionArgument)
|
||||||
|
.also { collectStatementContext(it.rightOperand) }
|
||||||
.transformRightOperand(this, ResolutionMode.WithExpectedType(booleanType))
|
.transformRightOperand(this, ResolutionMode.WithExpectedType(booleanType))
|
||||||
.also(dataFlowAnalyzer::exitBinaryLogicExpression)
|
.also(dataFlowAnalyzer::exitBinaryLogicExpression)
|
||||||
.transformOtherChildren(transformer, ResolutionMode.WithExpectedType(booleanType))
|
.transformOtherChildren(transformer, ResolutionMode.WithExpectedType(booleanType))
|
||||||
|
|||||||
Reference in New Issue
Block a user