From b484e03fa8255d53a28af4d6f259fc8ad87844d7 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Fri, 22 Feb 2019 13:10:08 +0300 Subject: [PATCH] Allow use `contract` function by FQN. #KT-29772 fixed --- .../jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt | 7 ++++++- .../contracts/dsl/fqnContractFunction.kt | 20 +++++++++++++++++++ .../contracts/dsl/fqnContractFunction.txt | 6 ++++++ .../DiagnosticsTestWithStdLibGenerated.java | 5 +++++ ...ticsTestWithStdLibUsingJavacGenerated.java | 5 +++++ 5 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/fqnContractFunction.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/fqnContractFunction.txt diff --git a/compiler/psi/src/org/jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt b/compiler/psi/src/org/jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt index f9aa8f36afb..2800de007fc 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt +++ b/compiler/psi/src/org/jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt @@ -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 ----------------------------------------------------------------------------------------------------------------------- diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/fqnContractFunction.kt b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/fqnContractFunction.kt new file mode 100644 index 00000000000..d47cf86de0f --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/fqnContractFunction.kt @@ -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) +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/fqnContractFunction.txt b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/fqnContractFunction.txt new file mode 100644 index 00000000000..ca04e6c7d71 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/fqnContractFunction.txt @@ -0,0 +1,6 @@ +package + +public inline fun foo(/*0*/ block: () -> kotlin.Unit): kotlin.Unit + CallsInPlace(block, EXACTLY_ONCE) + +public fun main(): kotlin.Unit diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java index 3d07c4ae0a7..f9fb66c5462 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java @@ -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"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java index 14ffaffe3b5..9d8ea906ae4 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java @@ -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");