From 50d9dbbfc10792f54c0c5acf37786ec60ba6fa23 Mon Sep 17 00:00:00 2001 From: "victor.petukhov" Date: Tue, 11 Sep 2018 14:19:10 +0300 Subject: [PATCH] Fix inheritance in stdlib contracts code (KT-26409) --- .../contractBuilder/common/neg/13.kt | 20 ++++++++++++++ .../contractBuilder/common/neg/13.txt | 3 +++ .../contractBuilder/common/pos/5.kt | 15 +++++++---- .../contractBuilder/common/pos/5.txt | 7 +++-- .../contractBuilder/common/pos/6.kt | 26 ------------------- .../contractBuilder/common/pos/6.txt | 7 ----- .../DiagnosticsTestSpecGenerated.java | 10 +++---- .../stdlib/src/kotlin/contracts/Effect.kt | 7 +++-- .../kotlin-stdlib-runtime-merged.txt | 4 +-- 9 files changed, 50 insertions(+), 49 deletions(-) create mode 100644 compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/neg/13.kt create mode 100644 compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/neg/13.txt delete mode 100644 compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/pos/6.kt delete mode 100644 compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/pos/6.txt diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/neg/13.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/neg/13.kt new file mode 100644 index 00000000000..3547efe4ab4 --- /dev/null +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/neg/13.kt @@ -0,0 +1,20 @@ +// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect +// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER -UNUSED_VARIABLE -UNUSED_PARAMETER -UNREACHABLE_CODE -UNUSED_EXPRESSION +// !USE_EXPERIMENTAL: kotlin.contracts.ExperimentalContracts + +/* + KOTLIN DIAGNOSTICS NOT LINKED SPEC TEST (NEGATIVE) + + SECTION: contracts + CATEGORY: declarations, contractBuilder, common + NUMBER: 13 + DESCRIPTION: Contract function with CallsInPlace effect with not allowed implies. + ISSUES: KT-26409 + */ + +import kotlin.contracts.* + +fun case_1(value_1: Any?, block: () -> Unit) { + contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) implies (value_1 != null) } + if (value_1 != null) block() +} diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/neg/13.txt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/neg/13.txt new file mode 100644 index 00000000000..617f44b4f0e --- /dev/null +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/neg/13.txt @@ -0,0 +1,3 @@ +package + +public fun case_1(/*0*/ value_1: kotlin.Any?, /*1*/ block: () -> kotlin.Unit): kotlin.Unit diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/pos/5.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/pos/5.kt index ca6c46eec14..2fa2bd9f330 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/pos/5.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/pos/5.kt @@ -8,14 +8,19 @@ SECTION: contracts CATEGORY: declarations, contractBuilder, common NUMBER: 5 - DESCRIPTION: Contract function with CallsInPlace effect with not allowed implies. + DESCRIPTION: contracts with not allowed conditions with boolean constants or constant expressions in implies. UNEXPECTED BEHAVIOUR - ISSUES: KT-26409 + ISSUES: KT-26491 */ import kotlin.contracts.* -fun case_1(value_1: Any?, block: () -> Unit) { - contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) implies (value_1 != null) } - if (value_1 != null) block() +fun case_1(): Boolean { + contract { returns(true) implies true } + return true } + +fun case_2(): Boolean { + contract { returns(true) implies (true || false) } + return true || false +} \ No newline at end of file diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/pos/5.txt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/pos/5.txt index c4c60e0a3aa..2f6a1654cbb 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/pos/5.txt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/pos/5.txt @@ -1,4 +1,7 @@ package -public fun case_1(/*0*/ value_1: kotlin.Any?, /*1*/ block: () -> kotlin.Unit): kotlin.Unit - CallsInPlace(block, EXACTLY_ONCE) -> value_1 != null +public fun case_1(): kotlin.Boolean + Returns(TRUE) -> TRUE + +public fun case_2(): kotlin.Boolean + Returns(TRUE) -> TRUE || FALSE diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/pos/6.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/pos/6.kt deleted file mode 100644 index 4c41a966631..00000000000 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/pos/6.kt +++ /dev/null @@ -1,26 +0,0 @@ -// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect -// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER -UNUSED_VARIABLE -UNUSED_PARAMETER -UNREACHABLE_CODE -UNUSED_EXPRESSION -// !USE_EXPERIMENTAL: kotlin.contracts.ExperimentalContracts - -/* - KOTLIN DIAGNOSTICS NOT LINKED SPEC TEST (POSITIVE) - - SECTION: contracts - CATEGORY: declarations, contractBuilder, common - NUMBER: 6 - DESCRIPTION: contracts with not allowed conditions with boolean constants or constant expressions in implies. - UNEXPECTED BEHAVIOUR - ISSUES: KT-26491 - */ - -import kotlin.contracts.* - -fun case_1(): Boolean { - contract { returns(true) implies true } - return true -} - -fun case_2(): Boolean { - contract { returns(true) implies (true || false) } - return true || false -} \ No newline at end of file diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/pos/6.txt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/pos/6.txt deleted file mode 100644 index 2f6a1654cbb..00000000000 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/pos/6.txt +++ /dev/null @@ -1,7 +0,0 @@ -package - -public fun case_1(): kotlin.Boolean - Returns(TRUE) -> TRUE - -public fun case_2(): kotlin.Boolean - Returns(TRUE) -> TRUE || FALSE diff --git a/compiler/tests-spec/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestSpecGenerated.java b/compiler/tests-spec/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestSpecGenerated.java index 96fb4cd20fa..cd5f6cc34a6 100644 --- a/compiler/tests-spec/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestSpecGenerated.java +++ b/compiler/tests-spec/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestSpecGenerated.java @@ -1085,6 +1085,11 @@ public class DiagnosticsTestSpecGenerated extends AbstractDiagnosticsTestSpec { runTest("compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/neg/12.kt"); } + @TestMetadata("13.kt") + public void test13() throws Exception { + runTest("compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/neg/13.kt"); + } + @TestMetadata("2.kt") public void test2() throws Exception { runTest("compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/neg/2.kt"); @@ -1163,11 +1168,6 @@ public class DiagnosticsTestSpecGenerated extends AbstractDiagnosticsTestSpec { runTest("compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/pos/5.kt"); } - @TestMetadata("6.kt") - public void test6() throws Exception { - runTest("compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/pos/6.kt"); - } - public void testAllFilesPresentInPos() throws Exception { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/pos"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); } diff --git a/libraries/stdlib/src/kotlin/contracts/Effect.kt b/libraries/stdlib/src/kotlin/contracts/Effect.kt index 90269498338..48493de1a25 100644 --- a/libraries/stdlib/src/kotlin/contracts/Effect.kt +++ b/libraries/stdlib/src/kotlin/contracts/Effect.kt @@ -7,6 +7,9 @@ package kotlin.contracts import kotlin.internal.ContractsDsl +/** + * Abstract effect, the inheritors of which are used in [ContractBuilder] to describe the contract function. + */ @ContractsDsl @ExperimentalContracts @SinceKotlin("1.3") @@ -29,7 +32,7 @@ public interface ConditionalEffect : Effect @ContractsDsl @ExperimentalContracts @SinceKotlin("1.3") -public interface SimpleEffect { +public interface SimpleEffect : Effect { /** * The function to specify an additional condition for some `SimpleEffect`. * @@ -71,4 +74,4 @@ public interface ReturnsNotNull : SimpleEffect @ContractsDsl @ExperimentalContracts @SinceKotlin("1.3") -public interface CallsInPlace : SimpleEffect \ No newline at end of file +public interface CallsInPlace : Effect \ No newline at end of file diff --git a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt index a807a00f008..a6418948dff 100644 --- a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt +++ b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt @@ -2570,7 +2570,7 @@ public final class kotlin/concurrent/TimersKt { public static final fun timer (Ljava/lang/String;Z)Ljava/util/Timer; } -public abstract interface class kotlin/contracts/CallsInPlace : kotlin/contracts/SimpleEffect { +public abstract interface class kotlin/contracts/CallsInPlace : kotlin/contracts/Effect { } public abstract interface class kotlin/contracts/ConditionalEffect : kotlin/contracts/Effect { @@ -2608,7 +2608,7 @@ public abstract interface class kotlin/contracts/Returns : kotlin/contracts/Simp public abstract interface class kotlin/contracts/ReturnsNotNull : kotlin/contracts/SimpleEffect { } -public abstract interface class kotlin/contracts/SimpleEffect { +public abstract interface class kotlin/contracts/SimpleEffect : kotlin/contracts/Effect { public abstract fun implies (Z)Lkotlin/contracts/ConditionalEffect; }