[FIR] Add inline checker for bodies of inline functions

This checker doesn't support `@PublishedAPI` yet, so some BB tests for it
 were muted. #KT-46270
This commit is contained in:
Dmitriy Novozhilov
2021-04-23 10:15:36 +03:00
committed by TeamCityServer
parent 7e052c1eb1
commit 32c3f85679
95 changed files with 804 additions and 543 deletions
@@ -14,7 +14,7 @@ inline fun case_1(block: () -> Unit) {
inline fun case_2(block: () -> Unit) {
10 - 1
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
callsInPlace(<!USAGE_IS_NOT_INLINABLE!>block<!>, InvocationKind.EXACTLY_ONCE)
}
return block()
}
@@ -23,7 +23,7 @@ inline fun case_2(block: () -> Unit) {
inline fun case_3(block: () -> Unit) {
throw Exception()
contract {
callsInPlace(block, InvocationKind.UNKNOWN)
callsInPlace(<!USAGE_IS_NOT_INLINABLE!>block<!>, InvocationKind.UNKNOWN)
}
return block()
}
@@ -35,7 +35,7 @@ inline fun case_3(block: () -> Unit) {
inline fun case_4(block: () -> Unit) {
.0009
return contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
callsInPlace(<!USAGE_IS_NOT_INLINABLE!>block<!>, InvocationKind.EXACTLY_ONCE)
}
}
@@ -8,7 +8,7 @@ import kotlin.contracts.*
// TESTCASE NUMBER: 1, 2
inline fun contractBuilder(block: () -> Unit): ContractBuilder.() -> Unit = {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
callsInPlace(<!USAGE_IS_NOT_INLINABLE!>block<!>, InvocationKind.EXACTLY_ONCE)
}
// FILE: main.kt
@@ -8,7 +8,7 @@ import kotlin.contracts.*
// TESTCASE NUMBER: 1, 2, 3
inline fun ContractBuilder.callsInPlaceEffectBuilder(block: () -> Unit) =
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
callsInPlace(<!USAGE_IS_NOT_INLINABLE!>block<!>, InvocationKind.EXACTLY_ONCE)
fun ContractBuilder.returnsEffectBuilder(value_1: Int?) =
returns(true) implies (value_1 != null)
@@ -6,7 +6,7 @@ import kotlin.contracts.*
// TESTCASE NUMBER: 1
inline fun case_1(block: () -> Unit) {
return contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
callsInPlace(<!USAGE_IS_NOT_INLINABLE!>block<!>, InvocationKind.EXACTLY_ONCE)
}
}
@@ -16,7 +16,7 @@ fun case_2() = contract { }
// TESTCASE NUMBER: 3
inline fun case_3(block: () -> Unit) {
val value_1 = contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
callsInPlace(<!USAGE_IS_NOT_INLINABLE!>block<!>, InvocationKind.EXACTLY_ONCE)
}
block()
}
@@ -40,13 +40,13 @@ inline fun case_5(block: () -> Unit) {
// TESTCASE NUMBER: 6
inline fun case_6(block: () -> Unit) {
throw Exception(contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
callsInPlace(<!USAGE_IS_NOT_INLINABLE!>block<!>, InvocationKind.EXACTLY_ONCE)
}.toString())
}
// TESTCASE NUMBER: 7
inline fun case_7(block: () -> Unit) {
funWithAnyArg(contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
callsInPlace(<!USAGE_IS_NOT_INLINABLE!>block<!>, InvocationKind.EXACTLY_ONCE)
})
}
@@ -58,6 +58,6 @@ class case_2(value_5: Boolean, val value_1: Boolean) {
inline fun <reified K : Number> K.case_2_5(): Boolean? {
contract { <!ERROR_IN_CONTRACT_DESCRIPTION!>returnsNotNull() implies (<!UNRESOLVED_REFERENCE!>value_4<!>)<!> }
return if (value_4) true else null
return if (<!NON_PUBLIC_CALL_FROM_PUBLIC_INLINE!>value_4<!>) true else null
}
}
@@ -6,6 +6,6 @@ import kotlin.contracts.*
// TESTCASE NUMBER: 1
inline fun case_1(block: () -> Unit) = {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
callsInPlace(<!USAGE_IS_NOT_INLINABLE!>block<!>, InvocationKind.EXACTLY_ONCE)
}
}
@@ -6,5 +6,5 @@ import kotlin.contracts.*
inline fun case_1(block: () -> Unit) {
<!WRONG_INVOCATION_KIND!>contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) }<!>
block()
case_1(block)
<!RECURSION_IN_INLINE!>case_1<!>(block)
}