From 66e710704a90533756e16dd1fdf0ad212bafb1d7 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Fri, 5 Aug 2022 19:50:14 +0200 Subject: [PATCH] Protect SubclassOptInRequired with opt-in marker --- libraries/stdlib/api/js-v1/kotlin.kt | 8 ++++++++ libraries/stdlib/api/js/kotlin.kt | 8 ++++++++ libraries/stdlib/src/kotlin/annotations/OptIn.kt | 14 +++++++++++--- .../kotlin-stdlib-runtime-merged.txt | 3 +++ 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/libraries/stdlib/api/js-v1/kotlin.kt b/libraries/stdlib/api/js-v1/kotlin.kt index af0f95984ef..d60f7ebefe3 100644 --- a/libraries/stdlib/api/js-v1/kotlin.kt +++ b/libraries/stdlib/api/js-v1/kotlin.kt @@ -1649,6 +1649,13 @@ public final annotation class ExperimentalStdlibApi : kotlin.Annotation { /*∆*/ public constructor ExperimentalStdlibApi() /*∆*/ } /*∆*/ +@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS}) +@kotlin.annotation.Retention(value = AnnotationRetention.BINARY) +@kotlin.SinceKotlin(version = "1.8") +public final annotation class ExperimentalSubclassOptIn : kotlin.Annotation { + public constructor ExperimentalSubclassOptIn() +} + @kotlin.RequiresOptIn(level = Level.WARNING) @kotlin.annotation.MustBeDocumented @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.FIELD, AnnotationTarget.LOCAL_VARIABLE, AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.TYPEALIAS}) @@ -2758,6 +2765,7 @@ public final class String : kotlin.Comparable, kotlin.CharSequenc @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS}) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) @kotlin.SinceKotlin(version = "1.8") +@kotlin.ExperimentalSubclassOptIn public final annotation class SubclassOptInRequired : kotlin.Annotation { public constructor SubclassOptInRequired(markerClass: kotlin.reflect.KClass) diff --git a/libraries/stdlib/api/js/kotlin.kt b/libraries/stdlib/api/js/kotlin.kt index ba47e9c3f0d..b24778c4c98 100644 --- a/libraries/stdlib/api/js/kotlin.kt +++ b/libraries/stdlib/api/js/kotlin.kt @@ -1485,6 +1485,13 @@ public final annotation class ExperimentalStdlibApi : kotlin.Annotation { public constructor ExperimentalStdlibApi() } +@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS}) +@kotlin.annotation.Retention(value = AnnotationRetention.BINARY) +@kotlin.SinceKotlin(version = "1.8") +public final annotation class ExperimentalSubclassOptIn : kotlin.Annotation { + public constructor ExperimentalSubclassOptIn() +} + @kotlin.RequiresOptIn(level = Level.WARNING) @kotlin.annotation.MustBeDocumented @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.FIELD, AnnotationTarget.LOCAL_VARIABLE, AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.TYPEALIAS}) @@ -2392,6 +2399,7 @@ public final class String : kotlin.Comparable, kotlin.CharSequenc @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS}) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) @kotlin.SinceKotlin(version = "1.8") +@kotlin.ExperimentalSubclassOptIn public final annotation class SubclassOptInRequired : kotlin.Annotation { public constructor SubclassOptInRequired(markerClass: kotlin.reflect.KClass) diff --git a/libraries/stdlib/src/kotlin/annotations/OptIn.kt b/libraries/stdlib/src/kotlin/annotations/OptIn.kt index a72b6e098d6..4fc9b18393e 100644 --- a/libraries/stdlib/src/kotlin/annotations/OptIn.kt +++ b/libraries/stdlib/src/kotlin/annotations/OptIn.kt @@ -5,8 +5,7 @@ package kotlin -import kotlin.annotation.AnnotationRetention.BINARY -import kotlin.annotation.AnnotationRetention.SOURCE +import kotlin.annotation.AnnotationRetention.* import kotlin.annotation.AnnotationTarget.* import kotlin.internal.RequireKotlin import kotlin.internal.RequireKotlinVersionKind @@ -57,7 +56,15 @@ public annotation class OptIn( ) /** - * Forbids creation of subclasses/sub-interfaces from the annotated class/interface without explicit OptIn. + * Opt-in marker annotation which allows to use [SubclassOptInRequired]. + */ +@Target(CLASS) +@Retention(BINARY) +@SinceKotlin("1.8") +public annotation class ExperimentalSubclassOptIn + +/** + * Forbids creation of subclasses/sub-interfaces from the annotated class/interface without explicit [OptIn]. * * This annotation is devoted to specific case when we want subclassing to be experimental. * In this case we annotated the base class or interface with [SubclassOptInRequired]. @@ -76,6 +83,7 @@ public annotation class OptIn( @Target(CLASS) @Retention(BINARY) @SinceKotlin("1.8") +@ExperimentalSubclassOptIn public annotation class SubclassOptInRequired( val markerClass: KClass ) 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 b56e6b8aa9a..88b625fedef 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 @@ -66,6 +66,9 @@ public abstract interface annotation class kotlin/ExperimentalMultiplatform : ja public abstract interface annotation class kotlin/ExperimentalStdlibApi : java/lang/annotation/Annotation { } +public abstract interface annotation class kotlin/ExperimentalSubclassOptIn : java/lang/annotation/Annotation { +} + public abstract interface annotation class kotlin/ExperimentalUnsignedTypes : java/lang/annotation/Annotation { }