Effects: add diagnostic tests on contracts
- Make AbstractDiagnosticsTest dump function contracts - Add diagnostics tests on parsing contracts - Add diagnostics tests on smartcats in presence of functions with contracts - Add diagnostics tests on initialization and flow in presence of in-place called lambdas ========== Introduction of EffectSystem: 16/18
This commit is contained in:
+35
@@ -0,0 +1,35 @@
|
||||
// !LANGUAGE: +ReturnsEffect
|
||||
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
|
||||
|
||||
import kotlin.internal.contracts.*
|
||||
|
||||
fun isString(x: Any?): Boolean {
|
||||
contract {
|
||||
returns(true) implies (x is String)
|
||||
}
|
||||
return x is String
|
||||
}
|
||||
|
||||
fun exhaustive(x: Any?) {
|
||||
when (isString(x)) {
|
||||
true -> <!DEBUG_INFO_SMARTCAST!>x<!>.length
|
||||
false -> x.<!UNRESOLVED_REFERENCE!>length<!>
|
||||
}
|
||||
|
||||
when(!isString(x)) {
|
||||
true -> x.<!UNRESOLVED_REFERENCE!>length<!>
|
||||
false -> <!DEBUG_INFO_SMARTCAST!>x<!>.length
|
||||
}
|
||||
}
|
||||
|
||||
fun smartcastInElse(x: Any?) {
|
||||
when (isString(x)) {
|
||||
false -> x.<!UNRESOLVED_REFERENCE!>length<!>
|
||||
else -> <!DEBUG_INFO_SMARTCAST!>x<!>.length
|
||||
}
|
||||
|
||||
when (!isString(x)) {
|
||||
true -> x.<!UNRESOLVED_REFERENCE!>length<!>
|
||||
else -> <!DEBUG_INFO_SMARTCAST!>x<!>.length
|
||||
}
|
||||
}
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
package
|
||||
|
||||
public fun exhaustive(/*0*/ x: kotlin.Any?): kotlin.Unit
|
||||
public fun isString(/*0*/ x: kotlin.Any?): kotlin.Boolean
|
||||
Returns(TRUE) -> x is String
|
||||
|
||||
public fun smartcastInElse(/*0*/ x: kotlin.Any?): kotlin.Unit
|
||||
+55
@@ -0,0 +1,55 @@
|
||||
// !LANGUAGE: +ReturnsEffect
|
||||
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
|
||||
|
||||
import kotlin.internal.contracts.*
|
||||
|
||||
fun safeIsString(x: Any?): Boolean? {
|
||||
contract {
|
||||
returns(true) implies (x is String)
|
||||
}
|
||||
return x?.let { it is String }
|
||||
}
|
||||
|
||||
fun elseWithNullableResult(x: Any?) {
|
||||
when (safeIsString(x)) {
|
||||
false -> x.<!UNRESOLVED_REFERENCE!>length<!>
|
||||
else -> x.<!UNRESOLVED_REFERENCE!>length<!>
|
||||
}
|
||||
|
||||
when (safeIsString(x)) {
|
||||
true -> <!DEBUG_INFO_SMARTCAST!>x<!>.length
|
||||
else -> x.<!UNRESOLVED_REFERENCE!>length<!>
|
||||
}
|
||||
|
||||
when (safeIsString(x)) {
|
||||
true -> <!DEBUG_INFO_SMARTCAST!>x<!>.length
|
||||
false -> x.<!UNRESOLVED_REFERENCE!>length<!>
|
||||
else -> x.<!UNRESOLVED_REFERENCE!>length<!>
|
||||
}
|
||||
|
||||
when (safeIsString(x)) {
|
||||
true -> <!DEBUG_INFO_SMARTCAST!>x<!>.length
|
||||
null -> x.<!UNRESOLVED_REFERENCE!>length<!>
|
||||
else -> x.<!UNRESOLVED_REFERENCE!>length<!>
|
||||
}
|
||||
}
|
||||
|
||||
fun exhaustiveWithNullableResult(x: Any?) {
|
||||
when (safeIsString(x)) {
|
||||
true -> <!DEBUG_INFO_SMARTCAST!>x<!>.length
|
||||
false -> x.<!UNRESOLVED_REFERENCE!>length<!>
|
||||
null -> x.<!UNRESOLVED_REFERENCE!>length<!>
|
||||
}
|
||||
|
||||
when (safeIsString(x)) {
|
||||
false -> x.<!UNRESOLVED_REFERENCE!>length<!>
|
||||
true -> <!DEBUG_INFO_SMARTCAST!>x<!>.length
|
||||
null -> x.<!UNRESOLVED_REFERENCE!>length<!>
|
||||
}
|
||||
|
||||
when (safeIsString(x)) {
|
||||
false -> x.<!UNRESOLVED_REFERENCE!>length<!>
|
||||
null -> x.<!UNRESOLVED_REFERENCE!>length<!>
|
||||
true -> <!DEBUG_INFO_SMARTCAST!>x<!>.length
|
||||
}
|
||||
}
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
package
|
||||
|
||||
public fun elseWithNullableResult(/*0*/ x: kotlin.Any?): kotlin.Unit
|
||||
public fun exhaustiveWithNullableResult(/*0*/ x: kotlin.Any?): kotlin.Unit
|
||||
public fun safeIsString(/*0*/ x: kotlin.Any?): kotlin.Boolean?
|
||||
Returns(TRUE) -> x is String
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
// !LANGUAGE: +ReturnsEffect
|
||||
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
|
||||
|
||||
import kotlin.internal.contracts.*
|
||||
|
||||
fun isString(x: Any?): Boolean {
|
||||
contract {
|
||||
returns(true) implies (x is String)
|
||||
}
|
||||
return x is String
|
||||
}
|
||||
|
||||
fun exhaustive(x: Any?) {
|
||||
when {
|
||||
isString(x) -> <!DEBUG_INFO_SMARTCAST!>x<!>.length
|
||||
!isString(x) -> x.<!UNRESOLVED_REFERENCE!>length<!>
|
||||
}
|
||||
|
||||
when {
|
||||
!isString(x) -> x.<!UNRESOLVED_REFERENCE!>length<!>
|
||||
isString(x) -> <!DEBUG_INFO_SMARTCAST!>x<!>.length
|
||||
}
|
||||
}
|
||||
|
||||
fun smartcastInElse(x: Any?) {
|
||||
when {
|
||||
!isString(x) -> x.<!UNRESOLVED_REFERENCE!>length<!>
|
||||
else -> <!DEBUG_INFO_SMARTCAST!>x<!>.length
|
||||
}
|
||||
}
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
package
|
||||
|
||||
public fun exhaustive(/*0*/ x: kotlin.Any?): kotlin.Unit
|
||||
public fun isString(/*0*/ x: kotlin.Any?): kotlin.Boolean
|
||||
Returns(TRUE) -> x is String
|
||||
|
||||
public fun smartcastInElse(/*0*/ x: kotlin.Any?): kotlin.Unit
|
||||
Reference in New Issue
Block a user