diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt index a5cefb7827c..0c5b0e140ce 100644 --- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt +++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt @@ -74,6 +74,7 @@ enum class LanguageFeature( ReadDeserializedContracts(KOTLIN_1_3), UseReturnsEffect(KOTLIN_1_3), UseCallsInPlaceEffect(KOTLIN_1_3), + AllowContractsForCustomFunctions(KOTLIN_1_3), VariableDeclarationInWhenSubject(KOTLIN_1_3), ProhibitLocalAnnotations(KOTLIN_1_3, kind = BUG_FIX), ProhibitSmartcastsOnLocalDelegatedProperty(KOTLIN_1_3, kind = BUG_FIX), @@ -100,8 +101,6 @@ enum class LanguageFeature( State.ENABLED_WITH_WARNING ), - AllowContractsForCustomFunctions(sinceVersion = null, defaultState = State.DISABLED, kind = UNSTABLE_FEATURE), - MultiPlatformProjects(sinceVersion = null, defaultState = State.DISABLED), NewInference(sinceVersion = KOTLIN_1_3, defaultState = State.DISABLED), diff --git a/libraries/kotlin.test/common/build.gradle b/libraries/kotlin.test/common/build.gradle index 555d30c1830..c46136d8a18 100644 --- a/libraries/kotlin.test/common/build.gradle +++ b/libraries/kotlin.test/common/build.gradle @@ -36,7 +36,8 @@ compileKotlinCommon { kotlinOptions { freeCompilerArgs = [ "-module-name", project.name, - "-Xallow-kotlin-package" + "-Xallow-kotlin-package", + "-Xuse-experimental=kotlin.contracts.ExperimentalContracts" ] } } \ No newline at end of file diff --git a/libraries/kotlin.test/common/src/main/kotlin/kotlin/test/Assertions.kt b/libraries/kotlin.test/common/src/main/kotlin/kotlin/test/Assertions.kt index e3abde699aa..0222f1d40ad 100644 --- a/libraries/kotlin.test/common/src/main/kotlin/kotlin/test/Assertions.kt +++ b/libraries/kotlin.test/common/src/main/kotlin/kotlin/test/Assertions.kt @@ -12,8 +12,8 @@ package kotlin.test +import kotlin.contracts.* import kotlin.internal.* -import kotlin.internal.contracts.* import kotlin.reflect.KClass /** diff --git a/libraries/kotlin.test/js/build.gradle b/libraries/kotlin.test/js/build.gradle index 8b5ca0abf5c..267ca24d98a 100644 --- a/libraries/kotlin.test/js/build.gradle +++ b/libraries/kotlin.test/js/build.gradle @@ -12,7 +12,7 @@ dependencies { } compileKotlin2Js { - kotlinOptions.freeCompilerArgs = ["-Xallow-kotlin-package"] + kotlinOptions.freeCompilerArgs = ["-Xallow-kotlin-package", "-Xuse-experimental=kotlin.contracts.ExperimentalContracts"] kotlinOptions { moduleKind = "umd" outputFile = "${buildDir}/classes/main/kotlin-test.js" diff --git a/libraries/kotlin.test/jvm/build.gradle b/libraries/kotlin.test/jvm/build.gradle index 32563ea119b..28859728813 100644 --- a/libraries/kotlin.test/jvm/build.gradle +++ b/libraries/kotlin.test/jvm/build.gradle @@ -41,7 +41,8 @@ dist { compileKotlin { kotlinOptions.freeCompilerArgs = ["-Xallow-kotlin-package", "-Xnormalize-constructor-calls=enable", - "-module-name", project.archivesBaseName] + "-Xuse-experimental=kotlin.contracts.ExperimentalContracts", + "-module-name", project.archivesBaseName, ] } compileTestKotlin { diff --git a/libraries/stdlib/common/build.gradle b/libraries/stdlib/common/build.gradle index c81df719acb..0453464a156 100644 --- a/libraries/stdlib/common/build.gradle +++ b/libraries/stdlib/common/build.gradle @@ -54,6 +54,7 @@ compileKotlinCommon { "-module-name", project.name, "-Xuse-experimental=kotlin.Experimental", "-Xuse-experimental=kotlin.ExperimentalUnsignedTypes", + "-Xuse-experimental=kotlin.contracts.ExperimentalContracts", "-XXLanguage:+InlineClasses", "-Xallow-kotlin-package" ] @@ -66,6 +67,7 @@ compileCoroutinesKotlinCommon { apiVersion = "1.3" freeCompilerArgs = [ "-module-name", project.name+"-coroutines", + "-Xuse-experimental=kotlin.contracts.ExperimentalContracts", "-Xallow-kotlin-package" ] } diff --git a/libraries/stdlib/coroutines/src/kotlin/SuccessOrFailure.kt b/libraries/stdlib/coroutines/src/kotlin/SuccessOrFailure.kt index 3513d027868..aed058fab66 100644 --- a/libraries/stdlib/coroutines/src/kotlin/SuccessOrFailure.kt +++ b/libraries/stdlib/coroutines/src/kotlin/SuccessOrFailure.kt @@ -16,8 +16,8 @@ package kotlin +import kotlin.contracts.* import kotlin.internal.InlineOnly -import kotlin.internal.contracts.* import kotlin.jvm.JvmField /** diff --git a/libraries/stdlib/js/build.gradle b/libraries/stdlib/js/build.gradle index f32854e99f9..9e17e9f8c4e 100644 --- a/libraries/stdlib/js/build.gradle +++ b/libraries/stdlib/js/build.gradle @@ -149,6 +149,7 @@ compileKotlin2Js { freeCompilerArgs += [ "-source-map-base-dirs", [builtinsSrcDir, jsSrcDir, commonSrcDir, commonSrcDir2].collect { file(it).absoluteFile }.join(File.pathSeparator), "-Xuse-experimental=kotlin.Experimental", + "-Xuse-experimental=kotlin.contracts.ExperimentalContracts", "-XXLanguage:+InlineClasses", "-XXLanguage:-ReleaseCoroutines" ] @@ -174,6 +175,9 @@ compileCoroutinesKotlin2Js { outputFile = "${buildDir}/classes/coroutines/kotlin.js" sourceMap = true sourceMapPrefix = "./" + freeCompilerArgs += [ + "-Xuse-experimental=kotlin.contracts.ExperimentalContracts" + ] } } diff --git a/libraries/stdlib/js/src/kotlin/concurrent.kt b/libraries/stdlib/js/src/kotlin/concurrent.kt index 3ecd424bd6a..fd9943c0c87 100644 --- a/libraries/stdlib/js/src/kotlin/concurrent.kt +++ b/libraries/stdlib/js/src/kotlin/concurrent.kt @@ -5,7 +5,7 @@ package kotlin -import kotlin.internal.contracts.* +import kotlin.contracts.* @Deprecated("Use Synchronized annotation from kotlin.jvm package", ReplaceWith("kotlin.jvm.Synchronized"), level = DeprecationLevel.WARNING) diff --git a/libraries/stdlib/jvm-minimal-for-test/build.gradle.kts b/libraries/stdlib/jvm-minimal-for-test/build.gradle.kts index b3635be0234..d78a1263022 100644 --- a/libraries/stdlib/jvm-minimal-for-test/build.gradle.kts +++ b/libraries/stdlib/jvm-minimal-for-test/build.gradle.kts @@ -33,8 +33,8 @@ val copySources by task { from(stdlibProjectDir.resolve("../src")) .include("kotlin/util/Standard.kt", "kotlin/internal/Annotations.kt", - "kotlin/internal/contracts/ContractBuilder.kt", - "kotlin/internal/contracts/Effect.kt") + "kotlin/contracts/ContractBuilder.kt", + "kotlin/contracts/Effect.kt") into(File(buildDir, "src")) } @@ -46,7 +46,13 @@ tasks.withType { tasks.withType { dependsOn(copySources) kotlinOptions { - freeCompilerArgs += listOf("-module-name", "kotlin-stdlib", "-Xmulti-platform") + freeCompilerArgs += listOf( + "-module-name", + "kotlin-stdlib", + "-Xmulti-platform", + "-Xuse-experimental=kotlin.contracts.ExperimentalContracts", + "-Xuse-experimental=kotlin.Experimental" + ) } } diff --git a/libraries/stdlib/jvm/build.gradle b/libraries/stdlib/jvm/build.gradle index b8127f7be93..f9b6056fe00 100644 --- a/libraries/stdlib/jvm/build.gradle +++ b/libraries/stdlib/jvm/build.gradle @@ -181,6 +181,7 @@ compileKotlin { "-Xnormalize-constructor-calls=enable", "-module-name", "kotlin-stdlib", "-Xuse-experimental=kotlin.Experimental", + "-Xuse-experimental=kotlin.contracts.ExperimentalContracts", "-XXLanguage:-ReleaseCoroutines", "-XXLanguage:+InlineClasses" ] @@ -211,6 +212,7 @@ compileCoroutinesKotlin { "-version", "-Xallow-kotlin-package", "-Xmultifile-parts-inherit", + "-Xuse-experimental=kotlin.contracts.ExperimentalContracts", "-module-name", "kotlin-stdlib-coroutines" ] } diff --git a/libraries/stdlib/jvm/src/kotlin/util/Synchronized.kt b/libraries/stdlib/jvm/src/kotlin/util/Synchronized.kt index ede49dc2008..f4f68f39189 100644 --- a/libraries/stdlib/jvm/src/kotlin/util/Synchronized.kt +++ b/libraries/stdlib/jvm/src/kotlin/util/Synchronized.kt @@ -7,7 +7,7 @@ @file:kotlin.jvm.JvmName("StandardKt") package kotlin -import kotlin.internal.contracts.* +import kotlin.contracts.* import kotlin.jvm.internal.unsafe.* /** diff --git a/libraries/stdlib/src/kotlin/collections/Arrays.kt b/libraries/stdlib/src/kotlin/collections/Arrays.kt index 1b77e4581ad..1234e6a0941 100644 --- a/libraries/stdlib/src/kotlin/collections/Arrays.kt +++ b/libraries/stdlib/src/kotlin/collections/Arrays.kt @@ -9,7 +9,7 @@ package kotlin.collections -import kotlin.internal.contracts.* +import kotlin.contracts.* /** diff --git a/libraries/stdlib/src/kotlin/collections/Collections.kt b/libraries/stdlib/src/kotlin/collections/Collections.kt index e21d0a18458..1575d30bd1f 100644 --- a/libraries/stdlib/src/kotlin/collections/Collections.kt +++ b/libraries/stdlib/src/kotlin/collections/Collections.kt @@ -10,7 +10,7 @@ package kotlin.collections import kotlin.* import kotlin.comparisons.compareValues -import kotlin.internal.contracts.* +import kotlin.contracts.* internal object EmptyIterator : ListIterator { override fun hasNext(): Boolean = false diff --git a/libraries/stdlib/src/kotlin/collections/Maps.kt b/libraries/stdlib/src/kotlin/collections/Maps.kt index fcc6808122b..83e27d6c7e0 100644 --- a/libraries/stdlib/src/kotlin/collections/Maps.kt +++ b/libraries/stdlib/src/kotlin/collections/Maps.kt @@ -8,7 +8,7 @@ package kotlin.collections -import kotlin.internal.contracts.* +import kotlin.contracts.* private object EmptyMap : Map, Serializable { private const val serialVersionUID: Long = 8246714829545688274 diff --git a/libraries/stdlib/src/kotlin/contracts/ContractBuilder.kt b/libraries/stdlib/src/kotlin/contracts/ContractBuilder.kt new file mode 100644 index 00000000000..fb540a5ac1d --- /dev/null +++ b/libraries/stdlib/src/kotlin/contracts/ContractBuilder.kt @@ -0,0 +1,41 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package kotlin.contracts + +import kotlin.internal.ContractsDsl +import kotlin.internal.InlineOnly + +@Retention(AnnotationRetention.BINARY) +@SinceKotlin("1.3") +@Experimental +public annotation class ExperimentalContracts + +@ContractsDsl +@ExperimentalContracts +@SinceKotlin("1.3") +public interface ContractBuilder { + @ContractsDsl public fun returns(): Returns + @ContractsDsl public fun returns(value: Any?): Returns + @ContractsDsl public fun returnsNotNull(): ReturnsNotNull + @ContractsDsl public fun callsInPlace(lambda: Function, kind: InvocationKind = InvocationKind.UNKNOWN): CallsInPlace +} + +@ContractsDsl +@ExperimentalContracts +@SinceKotlin("1.3") +public enum class InvocationKind { + @ContractsDsl AT_MOST_ONCE, + @ContractsDsl AT_LEAST_ONCE, + @ContractsDsl EXACTLY_ONCE, + @ContractsDsl UNKNOWN +} + +@ContractsDsl +@ExperimentalContracts +@InlineOnly +@SinceKotlin("1.3") +@Suppress("UNUSED_PARAMETER") +public inline fun contract(builder: ContractBuilder.() -> Unit) { } \ No newline at end of file diff --git a/libraries/stdlib/src/kotlin/contracts/Effect.kt b/libraries/stdlib/src/kotlin/contracts/Effect.kt new file mode 100644 index 00000000000..2550ad0d0d1 --- /dev/null +++ b/libraries/stdlib/src/kotlin/contracts/Effect.kt @@ -0,0 +1,43 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package kotlin.contracts + +import kotlin.internal.ContractsDsl + +@ContractsDsl +@ExperimentalContracts +@SinceKotlin("1.3") +public interface Effect + +@ContractsDsl +@ExperimentalContracts +@SinceKotlin("1.3") +public interface ConditionalEffect : Effect + +@ContractsDsl +@ExperimentalContracts +@SinceKotlin("1.3") +public interface SimpleEffect { + @ContractsDsl + @ExperimentalContracts + public infix fun implies(booleanExpression: Boolean): ConditionalEffect +} + + +@ContractsDsl +@ExperimentalContracts +@SinceKotlin("1.3") +public interface Returns : SimpleEffect + +@ContractsDsl +@ExperimentalContracts +@SinceKotlin("1.3") +public interface ReturnsNotNull : SimpleEffect + +@ContractsDsl +@ExperimentalContracts +@SinceKotlin("1.3") +public interface CallsInPlace : SimpleEffect \ No newline at end of file diff --git a/libraries/stdlib/src/kotlin/internal/contracts/ContractBuilder.kt b/libraries/stdlib/src/kotlin/internal/contracts/ContractBuilder.kt deleted file mode 100644 index ad0fa728478..00000000000 --- a/libraries/stdlib/src/kotlin/internal/contracts/ContractBuilder.kt +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license - * that can be found in the license/LICENSE.txt file. - */ - -package kotlin.internal.contracts - -import kotlin.internal.ContractsDsl -import kotlin.internal.InlineOnly - -@ContractsDsl -@SinceKotlin("1.2") -internal interface ContractBuilder { - @ContractsDsl fun returns(): Returns - @ContractsDsl fun returns(value: Any?): Returns - @ContractsDsl fun returnsNotNull(): ReturnsNotNull - @ContractsDsl fun callsInPlace(lambda: Function, kind: InvocationKind = InvocationKind.UNKNOWN): CallsInPlace -} - -@ContractsDsl -@SinceKotlin("1.2") -internal enum class InvocationKind { - @ContractsDsl AT_MOST_ONCE, - @ContractsDsl AT_LEAST_ONCE, - @ContractsDsl EXACTLY_ONCE, - @ContractsDsl UNKNOWN -} - -@ContractsDsl -@InlineOnly -@SinceKotlin("1.2") -internal inline fun contract(builder: ContractBuilder.() -> Unit) { } \ No newline at end of file diff --git a/libraries/stdlib/src/kotlin/internal/contracts/Effect.kt b/libraries/stdlib/src/kotlin/internal/contracts/Effect.kt deleted file mode 100644 index dd3ef1edfbe..00000000000 --- a/libraries/stdlib/src/kotlin/internal/contracts/Effect.kt +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license - * that can be found in the license/LICENSE.txt file. - */ - -package kotlin.internal.contracts - -import kotlin.internal.ContractsDsl - -@ContractsDsl -@SinceKotlin("1.2") -internal interface Effect - -@ContractsDsl -@SinceKotlin("1.2") -internal interface ConditionalEffect : Effect - -@ContractsDsl -@SinceKotlin("1.2") -internal interface SimpleEffect { - @ContractsDsl - infix fun implies(booleanExpression: Boolean): ConditionalEffect -} - - -@ContractsDsl -@SinceKotlin("1.2") -internal interface Returns : SimpleEffect - -@ContractsDsl -@SinceKotlin("1.2") -internal interface ReturnsNotNull : SimpleEffect - -@ContractsDsl -@SinceKotlin("1.2") -internal interface CallsInPlace : SimpleEffect \ No newline at end of file diff --git a/libraries/stdlib/src/kotlin/text/Strings.kt b/libraries/stdlib/src/kotlin/text/Strings.kt index fd3d76c8212..3ca18e47569 100644 --- a/libraries/stdlib/src/kotlin/text/Strings.kt +++ b/libraries/stdlib/src/kotlin/text/Strings.kt @@ -11,7 +11,7 @@ package kotlin.text import kotlin.* import kotlin.comparisons.* -import kotlin.internal.contracts.* +import kotlin.contracts.contract /** diff --git a/libraries/stdlib/src/kotlin/util/Preconditions.kt b/libraries/stdlib/src/kotlin/util/Preconditions.kt index 7f87628b38d..94892e7f6df 100644 --- a/libraries/stdlib/src/kotlin/util/Preconditions.kt +++ b/libraries/stdlib/src/kotlin/util/Preconditions.kt @@ -8,7 +8,7 @@ package kotlin -import kotlin.internal.contracts.* +import kotlin.contracts.contract /** * Throws an [IllegalArgumentException] if the [value] is false. diff --git a/libraries/stdlib/src/kotlin/util/Standard.kt b/libraries/stdlib/src/kotlin/util/Standard.kt index f8dbbaabd5a..da34bc0eb01 100644 --- a/libraries/stdlib/src/kotlin/util/Standard.kt +++ b/libraries/stdlib/src/kotlin/util/Standard.kt @@ -7,7 +7,7 @@ @file:kotlin.jvm.JvmName("StandardKt") package kotlin -import kotlin.internal.contracts.* +import kotlin.contracts.* /** * An exception is thrown to indicate that a method body remains to be implemented. 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 89868585e42..bb9254faa25 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 @@ -2539,6 +2539,48 @@ 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/ConditionalEffect : kotlin/contracts/Effect { +} + +public abstract interface class kotlin/contracts/ContractBuilder { + public abstract fun callsInPlace (Lkotlin/Function;Lkotlin/contracts/InvocationKind;)Lkotlin/contracts/CallsInPlace; + public abstract fun returns ()Lkotlin/contracts/Returns; + public abstract fun returns (Ljava/lang/Object;)Lkotlin/contracts/Returns; + public abstract fun returnsNotNull ()Lkotlin/contracts/ReturnsNotNull; +} + +public final class kotlin/contracts/ContractBuilder$DefaultImpls { + public static synthetic fun callsInPlace$default (Lkotlin/contracts/ContractBuilder;Lkotlin/Function;Lkotlin/contracts/InvocationKind;ILjava/lang/Object;)Lkotlin/contracts/CallsInPlace; +} + +public abstract interface class kotlin/contracts/Effect { +} + +public abstract interface annotation class kotlin/contracts/ExperimentalContracts : java/lang/annotation/Annotation { +} + +public final class kotlin/contracts/InvocationKind : java/lang/Enum { + public static final field AT_LEAST_ONCE Lkotlin/contracts/InvocationKind; + public static final field AT_MOST_ONCE Lkotlin/contracts/InvocationKind; + public static final field EXACTLY_ONCE Lkotlin/contracts/InvocationKind; + public static final field UNKNOWN Lkotlin/contracts/InvocationKind; + public static fun valueOf (Ljava/lang/String;)Lkotlin/contracts/InvocationKind; + public static fun values ()[Lkotlin/contracts/InvocationKind; +} + +public abstract interface class kotlin/contracts/Returns : kotlin/contracts/SimpleEffect { +} + +public abstract interface class kotlin/contracts/ReturnsNotNull : kotlin/contracts/SimpleEffect { +} + +public abstract interface class kotlin/contracts/SimpleEffect { + public abstract fun implies (Z)Lkotlin/contracts/ConditionalEffect; +} + public abstract class kotlin/coroutines/AbstractCoroutineContextElement : kotlin/coroutines/CoroutineContext$Element { public fun (Lkotlin/coroutines/CoroutineContext$Key;)V public fun fold (Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object;