[FIR] Add ReturnsImplies effect analyzer

This commit is contained in:
Oleg Ivanov
2020-08-11 12:41:43 +03:00
parent 3454ae7ca4
commit 21b8679799
37 changed files with 1110 additions and 89 deletions
@@ -27,9 +27,9 @@ class Foo {
}
fun A?.goodWithReceiver() {
contract {
<!WRONG_IMPLIES_CONDITION!>contract {
returns() implies (this@goodWithReceiver != null)
}
}<!>
}
fun A?.badWithReceiver() {
@@ -48,8 +48,8 @@ fun doWhileInContract(x: Any?) {
}
fun localValInContract(x: Any?) {
contract {
<!WRONG_IMPLIES_CONDITION!>contract {
val y: Int = 42
returns() implies (x is String)
}
}<!>
}
@@ -5,29 +5,29 @@
import kotlin.contracts.*
inline fun <reified T> referToReifiedGeneric(x: Any?) {
contract {
<!WRONG_IMPLIES_CONDITION!>contract {
returns() implies (x is T)
}
}<!>
}
class Generic<T> {
fun referToCaptured(x: Any?) {
contract {
<!WRONG_IMPLIES_CONDITION!>contract {
returns() implies (x is T)
}
}<!>
}
}
fun referToSubstituted(x: Any?) {
contract {
<!WRONG_IMPLIES_CONDITION!>contract {
returns() implies (x is Generic<String>)
}
}<!>
}
fun referToSubstitutedWithStar(x: Any?) {
contract {
<!WRONG_IMPLIES_CONDITION!>contract {
returns() implies (x is Generic<*>)
}
}<!>
}
typealias GenericString = Generic<String>
@@ -35,19 +35,19 @@ typealias FunctionalType = () -> Unit
typealias SimpleType = Int
fun referToAliasedGeneric(x: Any?) {
contract {
<!WRONG_IMPLIES_CONDITION!>contract {
returns() implies (x is GenericString)
}
}<!>
}
fun referToAliasedFunctionType(x: Any?) {
contract {
<!WRONG_IMPLIES_CONDITION!>contract {
returns() implies (x is FunctionalType)
}
}<!>
}
fun referToAliasedSimpleType(x: Any?) {
contract {
<!WRONG_IMPLIES_CONDITION!>contract {
returns() implies (x is SimpleType)
}
}<!>
}
@@ -5,29 +5,29 @@
import kotlin.contracts.*
inline fun <reified T> referToReifiedGeneric(x: Any?) {
contract {
<!WRONG_IMPLIES_CONDITION!>contract {
returns() implies (x is T)
}
}<!>
}
class Generic<T> {
fun referToCaptured(x: Any?) {
contract {
<!WRONG_IMPLIES_CONDITION!>contract {
returns() implies (x is T)
}
}<!>
}
}
fun referToSubstituted(x: Any?) {
contract {
<!WRONG_IMPLIES_CONDITION!>contract {
returns() implies (x is Generic<String>)
}
}<!>
}
fun referToSubstitutedWithStar(x: Any?) {
contract {
<!WRONG_IMPLIES_CONDITION!>contract {
returns() implies (x is Generic<*>)
}
}<!>
}
typealias GenericString = Generic<String>
@@ -35,19 +35,19 @@ typealias FunctionalType = () -> Unit
typealias SimpleType = Int
fun referToAliasedGeneric(x: Any?) {
contract {
<!WRONG_IMPLIES_CONDITION!>contract {
returns() implies (x is GenericString)
}
}<!>
}
fun referToAliasedFunctionType(x: Any?) {
contract {
<!WRONG_IMPLIES_CONDITION!>contract {
returns() implies (x is FunctionalType)
}
}<!>
}
fun referToAliasedSimpleType(x: Any?) {
contract {
<!WRONG_IMPLIES_CONDITION!>contract {
returns() implies (x is SimpleType)
}
}<!>
}
@@ -5,9 +5,9 @@
import kotlin.contracts.*
fun safeIsString(x: Any?): Boolean? {
contract {
<!WRONG_IMPLIES_CONDITION!>contract {
returns(true) implies (x is String)
}
}<!>
return x?.let { it is String }
}
@@ -5,9 +5,9 @@
import kotlin.contracts.*
fun safeIsString(x: Any?): Boolean? {
contract {
<!WRONG_IMPLIES_CONDITION!>contract {
returns(true) implies (x is String)
}
}<!>
return x?.let { it is String }
}