Publish ContractsDsl

- Mark @ContractsDsl as @Experimental
- Move Contracts DSL out from 'internal' package
- Change visibility of ContractsDsl from 'internal' to 'public'

^KT-25274 Fixed
^KT-25495 Fixed
This commit is contained in:
Dmitry Savvinov
2018-07-26 17:42:13 +03:00
committed by Ilya Gorbunov
parent 208c3a51ab
commit accbd07b2e
23 changed files with 159 additions and 86 deletions
@@ -74,6 +74,7 @@ enum class LanguageFeature(
ReadDeserializedContracts(KOTLIN_1_3), ReadDeserializedContracts(KOTLIN_1_3),
UseReturnsEffect(KOTLIN_1_3), UseReturnsEffect(KOTLIN_1_3),
UseCallsInPlaceEffect(KOTLIN_1_3), UseCallsInPlaceEffect(KOTLIN_1_3),
AllowContractsForCustomFunctions(KOTLIN_1_3),
VariableDeclarationInWhenSubject(KOTLIN_1_3), VariableDeclarationInWhenSubject(KOTLIN_1_3),
ProhibitLocalAnnotations(KOTLIN_1_3, kind = BUG_FIX), ProhibitLocalAnnotations(KOTLIN_1_3, kind = BUG_FIX),
ProhibitSmartcastsOnLocalDelegatedProperty(KOTLIN_1_3, kind = BUG_FIX), ProhibitSmartcastsOnLocalDelegatedProperty(KOTLIN_1_3, kind = BUG_FIX),
@@ -100,8 +101,6 @@ enum class LanguageFeature(
State.ENABLED_WITH_WARNING State.ENABLED_WITH_WARNING
), ),
AllowContractsForCustomFunctions(sinceVersion = null, defaultState = State.DISABLED, kind = UNSTABLE_FEATURE),
MultiPlatformProjects(sinceVersion = null, defaultState = State.DISABLED), MultiPlatformProjects(sinceVersion = null, defaultState = State.DISABLED),
NewInference(sinceVersion = KOTLIN_1_3, defaultState = State.DISABLED), NewInference(sinceVersion = KOTLIN_1_3, defaultState = State.DISABLED),
+2 -1
View File
@@ -36,7 +36,8 @@ compileKotlinCommon {
kotlinOptions { kotlinOptions {
freeCompilerArgs = [ freeCompilerArgs = [
"-module-name", project.name, "-module-name", project.name,
"-Xallow-kotlin-package" "-Xallow-kotlin-package",
"-Xuse-experimental=kotlin.contracts.ExperimentalContracts"
] ]
} }
} }
@@ -12,8 +12,8 @@
package kotlin.test package kotlin.test
import kotlin.contracts.*
import kotlin.internal.* import kotlin.internal.*
import kotlin.internal.contracts.*
import kotlin.reflect.KClass import kotlin.reflect.KClass
/** /**
+1 -1
View File
@@ -12,7 +12,7 @@ dependencies {
} }
compileKotlin2Js { compileKotlin2Js {
kotlinOptions.freeCompilerArgs = ["-Xallow-kotlin-package"] kotlinOptions.freeCompilerArgs = ["-Xallow-kotlin-package", "-Xuse-experimental=kotlin.contracts.ExperimentalContracts"]
kotlinOptions { kotlinOptions {
moduleKind = "umd" moduleKind = "umd"
outputFile = "${buildDir}/classes/main/kotlin-test.js" outputFile = "${buildDir}/classes/main/kotlin-test.js"
+2 -1
View File
@@ -41,7 +41,8 @@ dist {
compileKotlin { compileKotlin {
kotlinOptions.freeCompilerArgs = ["-Xallow-kotlin-package", "-Xnormalize-constructor-calls=enable", kotlinOptions.freeCompilerArgs = ["-Xallow-kotlin-package", "-Xnormalize-constructor-calls=enable",
"-module-name", project.archivesBaseName] "-Xuse-experimental=kotlin.contracts.ExperimentalContracts",
"-module-name", project.archivesBaseName, ]
} }
compileTestKotlin { compileTestKotlin {
+2
View File
@@ -54,6 +54,7 @@ compileKotlinCommon {
"-module-name", project.name, "-module-name", project.name,
"-Xuse-experimental=kotlin.Experimental", "-Xuse-experimental=kotlin.Experimental",
"-Xuse-experimental=kotlin.ExperimentalUnsignedTypes", "-Xuse-experimental=kotlin.ExperimentalUnsignedTypes",
"-Xuse-experimental=kotlin.contracts.ExperimentalContracts",
"-XXLanguage:+InlineClasses", "-XXLanguage:+InlineClasses",
"-Xallow-kotlin-package" "-Xallow-kotlin-package"
] ]
@@ -66,6 +67,7 @@ compileCoroutinesKotlinCommon {
apiVersion = "1.3" apiVersion = "1.3"
freeCompilerArgs = [ freeCompilerArgs = [
"-module-name", project.name+"-coroutines", "-module-name", project.name+"-coroutines",
"-Xuse-experimental=kotlin.contracts.ExperimentalContracts",
"-Xallow-kotlin-package" "-Xallow-kotlin-package"
] ]
} }
@@ -16,8 +16,8 @@
package kotlin package kotlin
import kotlin.contracts.*
import kotlin.internal.InlineOnly import kotlin.internal.InlineOnly
import kotlin.internal.contracts.*
import kotlin.jvm.JvmField import kotlin.jvm.JvmField
/** /**
+4
View File
@@ -149,6 +149,7 @@ compileKotlin2Js {
freeCompilerArgs += [ freeCompilerArgs += [
"-source-map-base-dirs", [builtinsSrcDir, jsSrcDir, commonSrcDir, commonSrcDir2].collect { file(it).absoluteFile }.join(File.pathSeparator), "-source-map-base-dirs", [builtinsSrcDir, jsSrcDir, commonSrcDir, commonSrcDir2].collect { file(it).absoluteFile }.join(File.pathSeparator),
"-Xuse-experimental=kotlin.Experimental", "-Xuse-experimental=kotlin.Experimental",
"-Xuse-experimental=kotlin.contracts.ExperimentalContracts",
"-XXLanguage:+InlineClasses", "-XXLanguage:+InlineClasses",
"-XXLanguage:-ReleaseCoroutines" "-XXLanguage:-ReleaseCoroutines"
] ]
@@ -174,6 +175,9 @@ compileCoroutinesKotlin2Js {
outputFile = "${buildDir}/classes/coroutines/kotlin.js" outputFile = "${buildDir}/classes/coroutines/kotlin.js"
sourceMap = true sourceMap = true
sourceMapPrefix = "./" sourceMapPrefix = "./"
freeCompilerArgs += [
"-Xuse-experimental=kotlin.contracts.ExperimentalContracts"
]
} }
} }
+1 -1
View File
@@ -5,7 +5,7 @@
package kotlin package kotlin
import kotlin.internal.contracts.* import kotlin.contracts.*
@Deprecated("Use Synchronized annotation from kotlin.jvm package", ReplaceWith("kotlin.jvm.Synchronized"), level = DeprecationLevel.WARNING) @Deprecated("Use Synchronized annotation from kotlin.jvm package", ReplaceWith("kotlin.jvm.Synchronized"), level = DeprecationLevel.WARNING)
@@ -33,8 +33,8 @@ val copySources by task<Sync> {
from(stdlibProjectDir.resolve("../src")) from(stdlibProjectDir.resolve("../src"))
.include("kotlin/util/Standard.kt", .include("kotlin/util/Standard.kt",
"kotlin/internal/Annotations.kt", "kotlin/internal/Annotations.kt",
"kotlin/internal/contracts/ContractBuilder.kt", "kotlin/contracts/ContractBuilder.kt",
"kotlin/internal/contracts/Effect.kt") "kotlin/contracts/Effect.kt")
into(File(buildDir, "src")) into(File(buildDir, "src"))
} }
@@ -46,7 +46,13 @@ tasks.withType<JavaCompile> {
tasks.withType<KotlinCompile> { tasks.withType<KotlinCompile> {
dependsOn(copySources) dependsOn(copySources)
kotlinOptions { 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"
)
} }
} }
+2
View File
@@ -181,6 +181,7 @@ compileKotlin {
"-Xnormalize-constructor-calls=enable", "-Xnormalize-constructor-calls=enable",
"-module-name", "kotlin-stdlib", "-module-name", "kotlin-stdlib",
"-Xuse-experimental=kotlin.Experimental", "-Xuse-experimental=kotlin.Experimental",
"-Xuse-experimental=kotlin.contracts.ExperimentalContracts",
"-XXLanguage:-ReleaseCoroutines", "-XXLanguage:-ReleaseCoroutines",
"-XXLanguage:+InlineClasses" "-XXLanguage:+InlineClasses"
] ]
@@ -211,6 +212,7 @@ compileCoroutinesKotlin {
"-version", "-version",
"-Xallow-kotlin-package", "-Xallow-kotlin-package",
"-Xmultifile-parts-inherit", "-Xmultifile-parts-inherit",
"-Xuse-experimental=kotlin.contracts.ExperimentalContracts",
"-module-name", "kotlin-stdlib-coroutines" "-module-name", "kotlin-stdlib-coroutines"
] ]
} }
@@ -7,7 +7,7 @@
@file:kotlin.jvm.JvmName("StandardKt") @file:kotlin.jvm.JvmName("StandardKt")
package kotlin package kotlin
import kotlin.internal.contracts.* import kotlin.contracts.*
import kotlin.jvm.internal.unsafe.* import kotlin.jvm.internal.unsafe.*
/** /**
@@ -9,7 +9,7 @@
package kotlin.collections package kotlin.collections
import kotlin.internal.contracts.* import kotlin.contracts.*
/** /**
@@ -10,7 +10,7 @@ package kotlin.collections
import kotlin.* import kotlin.*
import kotlin.comparisons.compareValues import kotlin.comparisons.compareValues
import kotlin.internal.contracts.* import kotlin.contracts.*
internal object EmptyIterator : ListIterator<Nothing> { internal object EmptyIterator : ListIterator<Nothing> {
override fun hasNext(): Boolean = false override fun hasNext(): Boolean = false
@@ -8,7 +8,7 @@
package kotlin.collections package kotlin.collections
import kotlin.internal.contracts.* import kotlin.contracts.*
private object EmptyMap : Map<Any?, Nothing>, Serializable { private object EmptyMap : Map<Any?, Nothing>, Serializable {
private const val serialVersionUID: Long = 8246714829545688274 private const val serialVersionUID: Long = 8246714829545688274
@@ -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 <R> callsInPlace(lambda: Function<R>, 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) { }
@@ -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
@@ -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 <R> callsInPlace(lambda: Function<R>, 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) { }
@@ -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
+1 -1
View File
@@ -11,7 +11,7 @@ package kotlin.text
import kotlin.* import kotlin.*
import kotlin.comparisons.* import kotlin.comparisons.*
import kotlin.internal.contracts.* import kotlin.contracts.contract
/** /**
@@ -8,7 +8,7 @@
package kotlin package kotlin
import kotlin.internal.contracts.* import kotlin.contracts.contract
/** /**
* Throws an [IllegalArgumentException] if the [value] is false. * Throws an [IllegalArgumentException] if the [value] is false.
+1 -1
View File
@@ -7,7 +7,7 @@
@file:kotlin.jvm.JvmName("StandardKt") @file:kotlin.jvm.JvmName("StandardKt")
package kotlin package kotlin
import kotlin.internal.contracts.* import kotlin.contracts.*
/** /**
* An exception is thrown to indicate that a method body remains to be implemented. * An exception is thrown to indicate that a method body remains to be implemented.
@@ -2539,6 +2539,48 @@ public final class kotlin/concurrent/TimersKt {
public static final fun timer (Ljava/lang/String;Z)Ljava/util/Timer; 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 abstract class kotlin/coroutines/AbstractCoroutineContextElement : kotlin/coroutines/CoroutineContext$Element {
public fun <init> (Lkotlin/coroutines/CoroutineContext$Key;)V public fun <init> (Lkotlin/coroutines/CoroutineContext$Key;)V
public fun fold (Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; public fun fold (Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object;