diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/good/returnsImplies/conditionLogic.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/good/returnsImplies/conditionLogic.fir.txt index eac7a472ce7..3e45ef0de81 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/good/returnsImplies/conditionLogic.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/good/returnsImplies/conditionLogic.fir.txt @@ -11,6 +11,7 @@ FILE: conditionLogic.kt @R|kotlin/OptIn|(vararg((Q|kotlin/contracts/ExperimentalContracts|))) public final fun test2(x: R|kotlin/String?|): R|kotlin/Any?| [R|Contract description] < + Returns(NOT_NULL) -> x is kotlin/String && x != null > { [StubStatement] @@ -46,6 +47,7 @@ FILE: conditionLogic.kt @R|kotlin/OptIn|(vararg((Q|kotlin/contracts/ExperimentalContracts|))) public final fun test6(x: R|kotlin/Any?|): R|kotlin/Any?| [R|Contract description] < + Returns(TRUE) -> x is kotlin/String? && x != null > { [StubStatement] @@ -54,6 +56,7 @@ FILE: conditionLogic.kt @R|kotlin/OptIn|(vararg((Q|kotlin/contracts/ExperimentalContracts|))) public final fun test7(x: R|kotlin/Any?|): R|kotlin/Any?| [R|Contract description] < + Returns(TRUE) -> x is kotlin/String? && x != null || x is kotlin/Int > { [StubStatement] @@ -95,6 +98,7 @@ FILE: conditionLogic.kt @R|kotlin/OptIn|(vararg((Q|kotlin/contracts/ExperimentalContracts|))) public final fun test11(x: R|kotlin/Any?|): R|kotlin/Any?| [R|Contract description] < + Returns(TRUE) -> x is kotlin/Comparable<*> && x is kotlin/CharSequence > { [StubStatement] @@ -103,6 +107,7 @@ FILE: conditionLogic.kt @R|kotlin/OptIn|(vararg((Q|kotlin/contracts/ExperimentalContracts|))) public final fun test12(x: R|kotlin/Any?|): R|kotlin/Any?| [R|Contract description] < + Returns(TRUE) -> x is kotlin/Comparable<*> && x is kotlin/CharSequence || x is kotlin/Number > { [StubStatement] @@ -111,6 +116,7 @@ FILE: conditionLogic.kt @R|kotlin/OptIn|(vararg((Q|kotlin/contracts/ExperimentalContracts|))) public final fun test13(x: R|kotlin/Any?|): R|kotlin/Any?| [R|Contract description] < + Returns(TRUE) -> (!)x !is kotlin/Comparable<*> || x !is kotlin/CharSequence && (!x is kotlin/Number) > { [StubStatement] diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/contracts/ConeEffectExtractor.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/contracts/ConeEffectExtractor.kt index 9ba71745f86..23e5803301a 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/contracts/ConeEffectExtractor.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/contracts/ConeEffectExtractor.kt @@ -109,6 +109,13 @@ class ConeEffectExtractor( return ConeIsNullPredicate(arg, isNegated) } + override fun visitExpressionWithSmartcast( + expressionWithSmartcast: FirExpressionWithSmartcast, + data: Nothing? + ): ConeContractDescriptionElement? { + return expressionWithSmartcast.originalExpression.accept(this, data) + } + override fun visitQualifiedAccessExpression( qualifiedAccessExpression: FirQualifiedAccessExpression, data: Nothing? diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/neg/12.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/neg/12.fir.kt index babfa6740a8..32a63789fe8 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/neg/12.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/neg/12.fir.kt @@ -31,5 +31,5 @@ fun case_1(value_1: Any?) { // TESTCASE NUMBER: 2 fun case_2(value_1: Any?, value_2: Number, value_3: Any?, value_4: String?) { value_1.case_2(value_2, value_3, value_4) - println(value_1.toByte()) + println(value_1.toByte()) } diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/11.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/11.fir.kt index 0a357e3fa9f..fca29cd99e1 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/11.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/11.fir.kt @@ -51,8 +51,8 @@ class case_3 { fun case_3(value_1: Any?, value_2: Number?) { val o = case_3() contracts.case_3(value_1, value_2, o.prop_1, this.prop_1) - println(o.prop_1.plus(3)) - println(this.prop_1.plus(3)) + println(o.prop_1.plus(3)) + println(this.prop_1.plus(3)) } } @@ -62,8 +62,8 @@ class case_4 { fun case_4(value_1: Any?, value_2: Number?) { val o = case_4() if (contracts.case_4(value_1, value_2, o.prop_1, this.prop_1)) { - println(o.prop_1.plus(3)) - println(this.prop_1.plus(3)) + println(o.prop_1.plus(3)) + println(this.prop_1.plus(3)) } } } diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/13.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/13.fir.kt index babfa6740a8..32a63789fe8 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/13.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/13.fir.kt @@ -31,5 +31,5 @@ fun case_1(value_1: Any?) { // TESTCASE NUMBER: 2 fun case_2(value_1: Any?, value_2: Number, value_3: Any?, value_4: String?) { value_1.case_2(value_2, value_3, value_4) - println(value_1.toByte()) + println(value_1.toByte()) } diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/3.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/3.fir.kt index e67dd1005fc..6fb01fcd8bf 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/3.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/3.fir.kt @@ -102,9 +102,9 @@ class case_3_class { fun case_3(value_1: Any?, value_2: Number?) { val o = case_3_class() contracts.case_3(value_1, value_2, o.prop_1, this.prop_1) - println(value_1.dec()) + println(value_1.dec()) println(value_2?.toByte()) - println(o.prop_1.plus(3)) + println(o.prop_1.plus(3)) } } @@ -154,24 +154,24 @@ class case_6_class { fun case_6(value_1: Any?, value_2: Number?) { val o = case_6_class() if (contracts.case_6_1(value_1, value_2, o.prop_1, this.prop_1)) { - println(value_1.dec()) + println(value_1.dec()) println(value_2?.toByte()) - println(o.prop_1.plus(3)) + println(o.prop_1.plus(3)) } if (!contracts.case_6_2(value_1, value_2, o.prop_1, this.prop_1)) { - println(value_1.dec()) + println(value_1.dec()) println(value_2?.toByte()) - println(o.prop_1.plus(3)) + println(o.prop_1.plus(3)) } if (contracts.case_6_3(value_1, value_2, o.prop_1, this.prop_1) != null) { - println(value_1.dec()) + println(value_1.dec()) println(value_2?.toByte()) - println(o.prop_1.plus(3)) + println(o.prop_1.plus(3)) } if (contracts.case_6_4(value_1, value_2, o.prop_1, this.prop_1) == null) { - println(value_1.dec()) + println(value_1.dec()) println(value_2?.toByte()) - println(o.prop_1.plus(3)) + println(o.prop_1.plus(3)) } } } diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/5.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/5.fir.kt index 22f5efe5c2f..c33ea8bc085 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/5.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/5.fir.kt @@ -85,41 +85,41 @@ import contracts.* // TESTCASE NUMBER: 1 fun case_1(value_1: Any?) { value_1.case_1() - println(value_1.length) + println(value_1.length) } // TESTCASE NUMBER: 2 fun case_2(value_1: Number?) { value_1.case_2() - println(value_1.inv()) + println(value_1.inv()) } // TESTCASE NUMBER: 3 fun case_3(value_1: Any?) { value_1.case_3() - println(value_1.inv()) + println(value_1.inv()) } // TESTCASE NUMBER: 4 fun case_4(value_1: Any?, value_2: Any?, value_3: Any?) { - when { value_1.case_4_1() -> println(value_1.length) } - when { !value_2.case_4_2() -> println(value_2.length) } - when { value_3.case_4_3() != null -> println(value_3.length) } - when { value_3.case_4_4() == null -> println(value_3.length) } + when { value_1.case_4_1() -> println(value_1.length) } + when { !value_2.case_4_2() -> println(value_2.length) } + when { value_3.case_4_3() != null -> println(value_3.length) } + when { value_3.case_4_4() == null -> println(value_3.length) } } // TESTCASE NUMBER: 5 fun case_5(value_1: Number?, value_2: Number?, value_3: Number?) { - if (value_1.case_5_1()) println(value_1.inv()) - if (!value_2.case_5_2()) println(value_2.inv()) - if (value_3.case_5_3() != null) println(value_3.inv()) - if (value_3.case_5_4() == null) println(value_3.inv()) + if (value_1.case_5_1()) println(value_1.inv()) + if (!value_2.case_5_2()) println(value_2.inv()) + if (value_3.case_5_3() != null) println(value_3.inv()) + if (value_3.case_5_4() == null) println(value_3.inv()) } // TESTCASE NUMBER: 6 fun case_6(value_1: Any?, value_2: Any?, value_3: Any?) { - if (value_1.case_6_1()) println(value_1.inv()) - if (!value_2.case_6_2()) println(value_2.inv()) - if (value_3.case_6_3() != null) println(value_3.inv()) - if (value_3.case_6_4() == null) println(value_3.inv()) + if (value_1.case_6_1()) println(value_1.inv()) + if (!value_2.case_6_2()) println(value_2.inv()) + if (value_3.case_6_3() != null) println(value_3.inv()) + if (value_3.case_6_4() == null) println(value_3.inv()) } diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/6.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/6.fir.kt index e34ca6410b2..3a15f23cfe1 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/6.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/pos/6.fir.kt @@ -109,56 +109,56 @@ import contracts.* // TESTCASE NUMBER: 1 fun case_1(value_1: Any?, value_2: Int?) { value_1.case_1(value_2) - println(value_1.length) - println(value_2.inv()) + println(value_1.length) + println(value_2.inv()) } // TESTCASE NUMBER: 2 fun case_2(value_1: Number?, value_2: Any?) { value_1.case_2(value_2) - println(value_1.inv()) - println(value_2.toByte()) + println(value_1.inv()) + println(value_2.toByte()) } // TESTCASE NUMBER: 3 fun case_3(value_1: Any?, value_2: String?) { value_1.case_3(value_2) - println(value_1.inv()) - println(value_2.length) + println(value_1.inv()) + println(value_2.length) } // TESTCASE NUMBER: 4 fun case_4(value_1: Any?, value_2: Number, value_3: Any?, value_4: String?) { value_1.case_4(value_2, value_3, value_4) - println(value_2.inv()) - println(value_3.toByte()) - println(value_4.length) + println(value_2.inv()) + println(value_3.toByte()) + println(value_4.length) } // TESTCASE NUMBER: 5 fun case_5(value_1: Any?, value_2: Int?, value_3: Any?, value_4: Int?, value_5: Any?, value_6: Int?) { when { value_1.case_5_1(value_2) -> { - println(value_1.length) - println(value_2.inv()) + println(value_1.length) + println(value_2.inv()) } } when { !value_3.case_5_2(value_4) -> { - println(value_3.length) - println(value_4.inv()) + println(value_3.length) + println(value_4.inv()) } } when { value_5.case_5_3(value_6) != null -> { - println(value_5.length) - println(value_6.inv()) + println(value_5.length) + println(value_6.inv()) } } when { value_5.case_5_4(value_6) == null -> { - println(value_5.length) - println(value_6.inv()) + println(value_5.length) + println(value_6.inv()) } } } @@ -166,55 +166,55 @@ fun case_5(value_1: Any?, value_2: Int?, value_3: Any?, value_4: Int?, value_5: // TESTCASE NUMBER: 6 fun case_6(value_1: Number?, value_2: Any?, value_3: Number?, value_4: Any?, value_5: Number?, value_6: Any?) { if (value_1.case_6_1(value_2)) { - println(value_1.inv()) - println(value_2.toByte()) + println(value_1.inv()) + println(value_2.toByte()) } if (!value_3.case_6_2(value_4)) { - println(value_3.inv()) - println(value_4.toByte()) + println(value_3.inv()) + println(value_4.toByte()) } if (value_5.case_6_3(value_6) != null) { - println(value_5.inv()) - println(value_6.toByte()) + println(value_5.inv()) + println(value_6.toByte()) } if (value_5.case_6_4(value_6) == null) { - println(value_5.inv()) - println(value_6.toByte()) + println(value_5.inv()) + println(value_6.toByte()) } } // TESTCASE NUMBER: 7 fun case_7(value_1: Any?, value_2: String?, value_3: Any?, value_4: String?, value_5: Any?, value_6: String?) { if (value_1.case_7_1(value_2)) { - println(value_1.inv()) - println(value_2.length) + println(value_1.inv()) + println(value_2.length) } if (value_3.case_7_2(value_4)) { - println(value_3.inv()) - println(value_4.length) + println(value_3.inv()) + println(value_4.length) } if (value_5.case_7_3(value_6) != null) { - println(value_5.inv()) - println(value_6.length) + println(value_5.inv()) + println(value_6.length) } if (value_5.case_7_4(value_6) == null) { - println(value_5.inv()) - println(value_6.length) + println(value_5.inv()) + println(value_6.length) } } // TESTCASE NUMBER: 8 fun case_8(value_1: Any?, value_2: Number, value_3: Any?, value_4: String?, value_5: Any?, value_6: Number, value_7: Any?, value_8: String?) { - when { value_1.case_8_1(value_2, value_3, value_4) -> println(value_2.inv()) } - when { value_1.case_8_1(value_2, value_3, value_4) -> println(value_3.toByte()) } - when { value_1.case_8_1(value_2, value_3, value_4) -> println(value_4.length) } - when { !value_5.case_8_2(value_6, value_7, value_8) -> println(value_6.inv()) } - when { !value_5.case_8_2(value_6, value_7, value_8) -> println(value_7.toByte()) } - when { !value_5.case_8_2(value_6, value_7, value_8) -> println(value_8.length) } - when { value_5.case_8_3(value_6, value_7, value_8) != null -> println(value_6.inv()) } - when { value_5.case_8_3(value_6, value_7, value_8) != null -> println(value_7.toByte()) } - when { value_5.case_8_3(value_6, value_7, value_8) != null -> println(value_8.length) } - when { value_5.case_8_4(value_6, value_7, value_8) == null -> println(value_6.inv()) } - when { value_5.case_8_4(value_6, value_7, value_8) == null -> println(value_7.toByte()) } - when { value_5.case_8_4(value_6, value_7, value_8) == null -> println(value_8.length) } + when { value_1.case_8_1(value_2, value_3, value_4) -> println(value_2.inv()) } + when { value_1.case_8_1(value_2, value_3, value_4) -> println(value_3.toByte()) } + when { value_1.case_8_1(value_2, value_3, value_4) -> println(value_4.length) } + when { !value_5.case_8_2(value_6, value_7, value_8) -> println(value_6.inv()) } + when { !value_5.case_8_2(value_6, value_7, value_8) -> println(value_7.toByte()) } + when { !value_5.case_8_2(value_6, value_7, value_8) -> println(value_8.length) } + when { value_5.case_8_3(value_6, value_7, value_8) != null -> println(value_6.inv()) } + when { value_5.case_8_3(value_6, value_7, value_8) != null -> println(value_7.toByte()) } + when { value_5.case_8_3(value_6, value_7, value_8) != null -> println(value_8.length) } + when { value_5.case_8_4(value_6, value_7, value_8) == null -> println(value_6.inv()) } + when { value_5.case_8_4(value_6, value_7, value_8) == null -> println(value_7.toByte()) } + when { value_5.case_8_4(value_6, value_7, value_8) == null -> println(value_8.length) } }