[FIR] Propagate not-null info into TypeOperatorCall ^KT-44559 Fixed

This commit is contained in:
Ivan Kochurkin
2021-10-04 15:03:08 +03:00
parent 55839aab91
commit 7bedb6bca8
8 changed files with 28 additions and 24 deletions
@@ -669,8 +669,12 @@ abstract class FirDataFlowAnalyzer<FLOW : Flow>(
} }
} }
when (this) { when (this) {
is FirSafeCallExpression -> this.receiver.propagateNotNullInfo() is FirSafeCallExpression -> receiver.propagateNotNullInfo()
is FirTypeOperatorCall -> this.argument.propagateNotNullInfo() is FirTypeOperatorCall -> {
if (operation == FirOperation.AS || operation == FirOperation.SAFE_AS) {
argument.propagateNotNullInfo()
}
}
} }
} }
@@ -51,9 +51,9 @@ inline fun <reified T : CharSequence>case_3(x: Any?) {
inline fun <reified T : CharSequence>case_4(x: Any?) { inline fun <reified T : CharSequence>case_4(x: Any?) {
(x as? T)!! (x as? T)!!
if (x is T?) { if (x is T?) {
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T?")!>x<!> <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T?!!")!>x<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T?")!>x<!><!UNSAFE_CALL!>.<!>length <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T?!!")!>x<!>.length
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T?")!>x<!><!UNSAFE_CALL!>.<!>get(0) <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T?!!")!>x<!>.get(0)
} }
} }
@@ -51,9 +51,9 @@ inline fun <reified T : CharSequence>case_3(x: Any?) {
inline fun <reified T : CharSequence>case_4(x: Any?) { inline fun <reified T : CharSequence>case_4(x: Any?) {
(x as? T)!! (x as? T)!!
if (x is T?) { if (x is T?) {
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T?")!>x<!> <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T?!!")!>x<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T?")!>x<!><!UNSAFE_CALL!>.<!>length <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T?!!")!>x<!>.length
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T?")!>x<!><!UNSAFE_CALL!>.<!>get(0) <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T?!!")!>x<!>.get(0)
} }
} }
@@ -51,9 +51,9 @@ inline fun <reified T : CharSequence>case_3(x: Any?) {
inline fun <reified T : CharSequence>case_4(x: Any?) { inline fun <reified T : CharSequence>case_4(x: Any?) {
(x as? T)!! (x as? T)!!
if (x is T?) { if (x is T?) {
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T?")!>x<!> <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T?!!")!>x<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T?")!>x<!><!UNSAFE_CALL!>.<!>length <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T?!!")!>x<!>.length
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T?")!>x<!><!UNSAFE_CALL!>.<!>get(0) <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T?!!")!>x<!>.get(0)
} }
} }
@@ -54,11 +54,11 @@ fun case_3(x: Any?) {
*/ */
fun case_4(x: Any?) { fun case_4(x: Any?) {
if ((x as Class?)!!.prop_8?.prop_8?.prop_8?.prop_8 == null) else { if ((x as Class?)!!.prop_8?.prop_8?.prop_8?.prop_8 == null) else {
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & Class?")!>x<!> <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & Class")!>x<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & Class?")!>x<!><!UNSAFE_CALL!>.<!>prop_8 <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & Class")!>x<!>.prop_8
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & Class?")!>x<!><!UNSAFE_CALL!>.<!>prop_8<!UNSAFE_CALL!>.<!>prop_8 <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & Class")!>x<!>.prop_8<!UNSAFE_CALL!>.<!>prop_8
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & Class?")!>x<!><!UNSAFE_CALL!>.<!>prop_8<!UNSAFE_CALL!>.<!>prop_8<!UNSAFE_CALL!>.<!>prop_8 <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & Class")!>x<!>.prop_8<!UNSAFE_CALL!>.<!>prop_8<!UNSAFE_CALL!>.<!>prop_8
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & Class?")!>x<!><!UNSAFE_CALL!>.<!>prop_8<!UNSAFE_CALL!>.<!>prop_8<!UNSAFE_CALL!>.<!>prop_8<!UNSAFE_CALL!>.<!>prop_8<!UNSAFE_CALL!>.<!>prop_8 <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & Class")!>x<!>.prop_8<!UNSAFE_CALL!>.<!>prop_8<!UNSAFE_CALL!>.<!>prop_8<!UNSAFE_CALL!>.<!>prop_8<!UNSAFE_CALL!>.<!>prop_8
} }
} }
@@ -97,8 +97,8 @@ fun case_10(x: Any?) {
*/ */
fun case_11(x: Any?) { fun case_11(x: Any?) {
if ((x as Boolean?)!!) { if ((x as Boolean?)!!) {
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Boolean?")!>x<!><!UNSAFE_CALL!>.<!>not() <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Boolean")!>x<!>.not()
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Boolean?")!>select(x)<!><!UNSAFE_CALL!>.<!>not() <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Boolean")!>select(x)<!>.not()
} }
} }
@@ -14,8 +14,8 @@ fun case_1(x: Any?) {
// TESTCASE NUMBER: 2 // TESTCASE NUMBER: 2
fun case_2(x: Any?) { fun case_2(x: Any?) {
(x as Nothing?)!! (x as Nothing?)!!
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Nothing?")!>x<!> <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Nothing")!>x<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Nothing?")!>x<!><!UNSAFE_CALL!>.<!><!UNRESOLVED_REFERENCE{LT}!>inv<!>() <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Nothing")!>x<!><!UNSAFE_CALL{LT}!>.<!><!UNRESOLVED_REFERENCE{LT}!>inv<!>()
} }
// TESTCASE NUMBER: 3 // TESTCASE NUMBER: 3
@@ -45,8 +45,8 @@ fun case_5(x: Any?) {
// TESTCASE NUMBER: 6 // TESTCASE NUMBER: 6
fun case_6(x: Any?) { fun case_6(x: Any?) {
(x as String?)!! (x as String?)!!
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.String?")!>x<!> <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.String")!>x<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.String?")!>x<!><!UNSAFE_CALL!>.<!>length <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.String")!>x<!><!UNSAFE_CALL{LT}!>.<!>length
} }
// TESTCASE NUMBER: 7 // TESTCASE NUMBER: 7
@@ -13,8 +13,8 @@ fun test1(x: ClassLevel1?) {
// TESTCASE NUMBER: 2 // TESTCASE NUMBER: 2
fun case_2(x: Any?) { fun case_2(x: Any?) {
(x as ClassLevel1?)!! (x as ClassLevel1?)!!
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & ClassLevel1?")!>x<!> <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & ClassLevel1")!>x<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & ClassLevel1?")!>x<!><!UNSAFE_CALL!>.<!>test1() <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & ClassLevel1")!>x<!>.test1()
} }
// TESTCASE NUMBER: 3 // TESTCASE NUMBER: 3