Allow use contract function by FQN. #KT-29772 fixed

This commit is contained in:
Dmitriy Novozhilov
2019-02-22 13:10:08 +03:00
parent 7072b9d179
commit b484e03fa8
5 changed files with 42 additions and 1 deletions
@@ -308,7 +308,12 @@ fun KtNamedFunction.isContractPresentPsiCheck(): Boolean {
}
fun KtExpression.isContractDescriptionCallPsiCheck(): Boolean =
this is KtCallExpression && calleeExpression?.text == "contract"
(this is KtCallExpression && calleeExpression?.text == "contract") || (this is KtQualifiedExpression && isContractDescriptionCallPsiCheck())
fun KtQualifiedExpression.isContractDescriptionCallPsiCheck(): Boolean {
val expression = selectorExpression ?: return false
return receiverExpression.text == "kotlin.contracts" && expression.isContractDescriptionCallPsiCheck()
}
// ----------- Other -----------------------------------------------------------------------------------------------------------------------
@@ -0,0 +1,20 @@
// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect
// !USE_EXPERIMENTAL: kotlin.contracts.ExperimentalContracts
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.contracts.InvocationKind
inline fun foo(block: () -> Unit) {
kotlin.contracts.contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
block()
}
fun main() {
val x: Int
foo {
x = 42
}
println(x)
}
@@ -0,0 +1,6 @@
package
public inline fun foo(/*0*/ block: () -> kotlin.Unit): kotlin.Unit
CallsInPlace(block, EXACTLY_ONCE)
public fun main(): kotlin.Unit
@@ -1137,6 +1137,11 @@ public class DiagnosticsTestWithStdLibGenerated extends AbstractDiagnosticsTestW
runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/callUsualContractFunction.kt");
}
@TestMetadata("fqnContractFunction.kt")
public void testFqnContractFunction() throws Exception {
runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/fqnContractFunction.kt");
}
@TestMetadata("rewriteAtSliceFunctor.kt")
public void testRewriteAtSliceFunctor() throws Exception {
runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/rewriteAtSliceFunctor.kt");
@@ -1137,6 +1137,11 @@ public class DiagnosticsTestWithStdLibUsingJavacGenerated extends AbstractDiagno
runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/callUsualContractFunction.kt");
}
@TestMetadata("fqnContractFunction.kt")
public void testFqnContractFunction() throws Exception {
runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/fqnContractFunction.kt");
}
@TestMetadata("rewriteAtSliceFunctor.kt")
public void testRewriteAtSliceFunctor() throws Exception {
runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/rewriteAtSliceFunctor.kt");