From 9e55e41d8b713ecef3877f5921d0a71a20865be4 Mon Sep 17 00:00:00 2001 From: Ivan Kochurkin Date: Tue, 14 Dec 2021 22:53:37 +0300 Subject: [PATCH] [FIR] Propagate non-null info for val members, ^KT-44560 Fixed --- .../fir/resolve/dfa/VariableStorageImpl.kt | 1 + .../analysis/smartcasts/pos/14.fir.kt | 4 +- .../diagnostics/notLinked/dfa/pos/30.fir.kt | 50 +++++++++---------- .../diagnostics/notLinked/dfa/pos/40.fir.kt | 4 +- .../diagnostics/notLinked/dfa/pos/68.fir.kt | 4 +- .../diagnostics/notLinked/dfa/pos/69.fir.kt | 6 +-- 6 files changed, 35 insertions(+), 34 deletions(-) diff --git a/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/dfa/VariableStorageImpl.kt b/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/dfa/VariableStorageImpl.kt index 80e4e9fad61..700b943ae5c 100644 --- a/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/dfa/VariableStorageImpl.kt +++ b/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/dfa/VariableStorageImpl.kt @@ -63,6 +63,7 @@ class VariableStorageImpl(private val session: FirSession) : VariableStorage() { is FirExpressionWithSmartcast -> originalExpression.unwrapElement() is FirSafeCallExpression -> regularQualifiedAccess.unwrapElement() is FirCheckedSafeCallSubject -> originalReceiverRef.value.unwrapElement() + is FirCheckNotNullCall -> argument.unwrapElement() else -> this } diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/14.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/14.fir.kt index 7373ea28c71..6f0deb9d073 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/14.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/14.fir.kt @@ -49,14 +49,14 @@ import contracts.* // TESTCASE NUMBER: 1 fun case_1(value_1: Int?) { if (contracts.case_1(value_1)!!) { - value_1.inv() + value_1.inv() } } // TESTCASE NUMBER: 2 fun case_2(value_1: Int?) { if (!contracts.case_2(value_1)!!) { - value_1.inv() + value_1.inv() } } diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/30.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/30.fir.kt index 959da5ea32b..0a7837557d3 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/30.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/30.fir.kt @@ -11,9 +11,9 @@ fun case_1(x: Class?) { if (x!!.prop_8?.prop_8?.prop_8?.prop_8 != null) { x x.prop_8 - x.prop_8.prop_8 - x.prop_8.prop_8.prop_8 - x.prop_8.prop_8.prop_8.prop_8 + x.prop_8.prop_8 + x.prop_8.prop_8.prop_8 + x.prop_8.prop_8.prop_8.prop_8 } } @@ -27,8 +27,8 @@ fun case_2(x: Class?) { x x.prop_8 x.prop_8.prop_8 - x.prop_8.prop_8.prop_8 - x.prop_8.prop_8.prop_8.prop_8 + x.prop_8.prop_8.prop_8 + x.prop_8.prop_8.prop_8.prop_8 } } @@ -43,7 +43,7 @@ fun case_3(x: Class?) { x.prop_8 x.prop_8.prop_8 x.prop_8.prop_8.prop_8 - x.prop_8.prop_8.prop_8.prop_8.prop_8 + x.prop_8.prop_8.prop_8.prop_8.prop_8 } } @@ -56,9 +56,9 @@ fun case_4(x: Class?) { if (x!!?.prop_8?.prop_8?.prop_8?.prop_8 == null == true) else { x x.prop_8 - x.prop_8.prop_8 - x.prop_8.prop_8.prop_8 - x.prop_8.prop_8.prop_8.prop_8 + x.prop_8.prop_8 + x.prop_8.prop_8.prop_8 + x.prop_8.prop_8.prop_8.prop_8 } } @@ -72,8 +72,8 @@ fun case_5(x: Class?) { x x.prop_8 x.prop_8.prop_8 - x.prop_8.prop_8.prop_8 - x.prop_8.prop_8.prop_8.prop_8 + x.prop_8.prop_8.prop_8 + x.prop_8.prop_8.prop_8.prop_8 } } @@ -88,7 +88,7 @@ fun case_6(x: Class?) { x.prop_8 x.prop_8.prop_8 x.prop_8.prop_8.prop_8 - x.prop_8.prop_8.prop_8.prop_8.prop_8 + x.prop_8.prop_8.prop_8.prop_8.prop_8 } } @@ -101,9 +101,9 @@ fun case_7(x: Class) { if (x!!.prop_8?.prop_8?.prop_8?.prop_8 != null) { x x.prop_8 - x.prop_8.prop_8 - x.prop_8.prop_8.prop_8 - x.prop_8.prop_8.prop_8.prop_8 + x.prop_8.prop_8 + x.prop_8.prop_8.prop_8 + x.prop_8.prop_8.prop_8.prop_8 } } @@ -116,9 +116,9 @@ fun case_8(x: Class) { if (x!!.prop_8?.prop_8?.prop_8?.prop_8 != null) { x x.prop_8 - x.prop_8.prop_8 - x.prop_8.prop_8.prop_8 - x.prop_8.prop_8.prop_8.prop_8 + x.prop_8.prop_8 + x.prop_8.prop_8.prop_8 + x.prop_8.prop_8.prop_8.prop_8 } } // TESTCASE NUMBER: 9 @@ -136,8 +136,8 @@ fun case_9(x: T) { */ fun case_10(x: Inv?) { if (x!!.prop_1?.prop_1?.prop_1?.prop_2 != null) { - x.prop_1.prop_1.prop_1.prop_2 - x.prop_1.prop_1.prop_1.prop_2.equals(10) + x.prop_1.prop_1.prop_1.prop_2 + x.prop_1.prop_1.prop_1.prop_2.equals(10) } } @@ -148,8 +148,8 @@ fun case_10(x: Inv?) { */ inline fun case_11(x: Inv?) { if (x?.prop_1!!.prop_1?.prop_1?.prop_2 == null) else { - x.prop_1.prop_1.prop_1.prop_2 - x.prop_1.prop_1.prop_1.prop_2.equals(10) + x.prop_1.prop_1.prop_1.prop_2 + x.prop_1.prop_1.prop_1.prop_2.equals(10) } } @@ -161,7 +161,7 @@ inline fun case_11(x: Inv?) { fun case_12(x: Inv?) { if (x?.prop_1?.prop_1?.prop_1!!.prop_1 == null) else { x.prop_1.prop_1.prop_1.prop_1 - x.prop_1.prop_1.prop_1.prop_1.equals(10) + x.prop_1.prop_1.prop_1.prop_1.equals(10) } } @@ -172,7 +172,7 @@ fun case_12(x: Inv?) { */ inline fun case_13(x: Out?) { if (x?.prop_1?.prop_1!!.prop_1?.prop_1 != null) { - x.prop_1.prop_1.prop_1.prop_1 - x.prop_1.prop_1.prop_1.prop_1.equals(10) + x.prop_1.prop_1.prop_1.prop_1 + x.prop_1.prop_1.prop_1.prop_1.equals(10) } } diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/40.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/40.fir.kt index 11d249deefd..98d850e5a4b 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/40.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/40.fir.kt @@ -109,8 +109,8 @@ fun case_11(x: Any?) { */ fun case_12(x: Any?) { if (x!! as Boolean?) { - x.not() - select(x).not() + x.not() + select(x).not() } } diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/68.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/68.fir.kt index 7b78b7c207f..e26dbca98c3 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/68.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/68.fir.kt @@ -6,8 +6,8 @@ // TESTCASE NUMBER: 1 fun case_1(x: Any?) { if (x!! is Int) { - x - x.inv() + x + x.inv() } } diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/69.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/69.fir.kt index d7d879a243a..bac52516f50 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/69.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/69.fir.kt @@ -5,8 +5,8 @@ // TESTCASE NUMBER: 1 fun test1(x: ClassLevel1?) { if (x!! is ClassLevel2) { - x - x.test2() + x + x.test2() } } @@ -37,6 +37,6 @@ fun case_4(x: Any?) { fun case_5(x: Class) { if (x!!.prop_8 != null) { x - x.prop_8.prop_8 + x.prop_8.prop_8 } }