[FIR] KT-58674: Set expected type for loop conditions

^KT-58674 Fixed
This commit is contained in:
Nikolay Lunyak
2023-05-15 11:54:39 +03:00
committed by Space Team
parent 737c8c20f6
commit fd54706e1a
4 changed files with 10 additions and 8 deletions
@@ -217,7 +217,7 @@ FILE: forLoopChecker.kt
{ {
lval <iterator>: R|ImproperIterator3| = R|<local>/notRange5|.R|/NotRange5.iterator|() lval <iterator>: R|ImproperIterator3| = R|<local>/notRange5|.R|/NotRange5.iterator|()
while(R|<local>/<iterator>|.R|/ImproperIterator3.hasNext|()) { while(R|<local>/<iterator>|.R|/ImproperIterator3.hasNext<CS errors: /ImproperIterator3.hasNext>#|()) {
lval i: R|kotlin/Int| = R|<local>/<iterator>|.R|/ImproperIterator3.next|() lval i: R|kotlin/Int| = R|<local>/<iterator>|.R|/ImproperIterator3.next|()
{ {
} }
@@ -239,7 +239,7 @@ FILE: forLoopChecker.kt
{ {
lval <iterator>: R|ImproperIterator3| = R|<local>/notRange7|.R|/NotRange7.iterator|() lval <iterator>: R|ImproperIterator3| = R|<local>/notRange7|.R|/NotRange7.iterator|()
while(R|<local>/<iterator>|.R|/ImproperIterator3.hasNext|()) { while(R|<local>/<iterator>|.R|/ImproperIterator3.hasNext<CS errors: /ImproperIterator3.hasNext>#|()) {
lval i: R|kotlin/Int| = R|<local>/<iterator>|.R|/ImproperIterator3.next|() lval i: R|kotlin/Int| = R|<local>/<iterator>|.R|/ImproperIterator3.next|()
{ {
} }
@@ -30,7 +30,8 @@ class FirControlFlowStatementsResolveTransformer(transformer: FirAbstractBodyRes
override fun transformWhileLoop(whileLoop: FirWhileLoop, data: ResolutionMode): FirStatement { override fun transformWhileLoop(whileLoop: FirWhileLoop, data: ResolutionMode): FirStatement {
val context = ResolutionMode.ContextIndependent val context = ResolutionMode.ContextIndependent
return whileLoop.also(dataFlowAnalyzer::enterWhileLoop) return whileLoop.also(dataFlowAnalyzer::enterWhileLoop)
.transformCondition(transformer, context).also(dataFlowAnalyzer::exitWhileLoopCondition) .transformCondition(transformer, withExpectedType(session.builtinTypes.booleanType))
.also(dataFlowAnalyzer::exitWhileLoopCondition)
.transformBlock(transformer, context).also(dataFlowAnalyzer::exitWhileLoop) .transformBlock(transformer, context).also(dataFlowAnalyzer::exitWhileLoop)
.transformOtherChildren(transformer, context) .transformOtherChildren(transformer, context)
} }
@@ -43,7 +44,8 @@ class FirControlFlowStatementsResolveTransformer(transformer: FirAbstractBodyRes
.also { .also {
transformer.expressionsTransformer.transformBlockInCurrentScope(it.block, context) transformer.expressionsTransformer.transformBlockInCurrentScope(it.block, context)
} }
.also(dataFlowAnalyzer::enterDoWhileLoopCondition).transformCondition(transformer, context) .also(dataFlowAnalyzer::enterDoWhileLoopCondition)
.transformCondition(transformer, withExpectedType(session.builtinTypes.booleanType))
.also(dataFlowAnalyzer::exitDoWhileLoop) .also(dataFlowAnalyzer::exitDoWhileLoop)
.transformOtherChildren(transformer, context) .transformOtherChildren(transformer, context)
} }
@@ -2,13 +2,13 @@
// INFERENCE_HELPERS // INFERENCE_HELPERS
fun test() { fun test() {
while (<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>materialize<!>()) { // K1: OK, K2: NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER while (materialize()) {
} }
do { do {
} while (<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>materialize<!>()) // K1: OK, K2: NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER } while (materialize())
if (materialize()) { if (materialize()) {
@@ -2,13 +2,13 @@
// INFERENCE_HELPERS // INFERENCE_HELPERS
fun test() { fun test() {
while (materialize()) { // K1: OK, K2: NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER while (materialize()) {
} }
do { do {
} while (materialize()) // K1: OK, K2: NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER } while (materialize())
if (materialize()) { if (materialize()) {