From f954a6c812bfde5caedffc84f81357ed9541497f Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 18 Dec 2019 19:22:38 +0100 Subject: [PATCH] Support custom message in RequiresOptIn #KT-34648 Fixed --- .../jetbrains/kotlin/diagnostics/Errors.java | 12 ++-- .../rendering/DefaultErrorMessages.java | 12 ++-- .../checkers/ExperimentalUsageChecker.kt | 56 ++++++++++++++----- .../evaluate/ConstantExpressionEvaluator.kt | 9 ++- .../experimental/annotation.fir.kt | 2 +- .../experimental/annotation.kt | 2 +- .../experimental/bodyUsages.fir.kt | 2 +- .../experimental/bodyUsages.kt | 2 +- .../experimental/bodyUsagesAndInline.fir.kt | 2 +- .../experimental/bodyUsagesAndInline.kt | 2 +- .../experimental/classMembers.fir.kt | 2 +- .../experimental/classMembers.kt | 2 +- .../classMembersOverlyExperimental.fir.kt | 2 +- .../classMembersOverlyExperimental.kt | 2 +- .../experimental/constVal.fir.kt | 2 +- .../testsWithStdLib/experimental/constVal.kt | 2 +- .../experimental/deeplyNestedClass.fir.kt | 2 +- .../experimental/deeplyNestedClass.kt | 2 +- ...ectTargetsForExperimentalAnnotation.fir.kt | 8 +-- ...correctTargetsForExperimentalAnnotation.kt | 8 +-- .../experimental/override.fir.kt | 2 +- .../testsWithStdLib/experimental/override.kt | 2 +- .../overrideDifferentExperimentalities.fir.kt | 4 +- .../overrideDifferentExperimentalities.kt | 4 +- .../testsWithStdLib/experimental/scripts.kts | 2 +- .../experimental/topLevel.fir.kt | 2 +- .../testsWithStdLib/experimental/topLevel.kt | 2 +- .../experimental/usageNotAsAnnotation.fir.kt | 2 +- .../experimental/usageNotAsAnnotation.kt | 2 +- .../experimental/useExperimentalOnFile.fir.kt | 4 +- .../experimental/useExperimentalOnFile.kt | 4 +- ...talOnFileWithVeryExperimentalMarker.fir.kt | 4 +- ...imentalOnFileWithVeryExperimentalMarker.kt | 4 +- .../useExperimentalOnWholeModule.fir.kt | 2 +- .../useExperimentalOnWholeModule.kt | 2 +- .../useExperimentalTargets.fir.kt | 2 +- .../experimental/useExperimentalTargets.kt | 2 +- ...eExperimentalWithSeveralAnnotations.fir.kt | 6 +- .../useExperimentalWithSeveralAnnotations.kt | 6 +- .../stdlib/src/kotlin/annotations/OptIn.kt | 14 ++++- .../kotlin-stdlib-runtime-merged.txt | 1 + 41 files changed, 124 insertions(+), 82 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java index c78403cf9e2..0a06489be8e 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java @@ -255,11 +255,11 @@ public interface Errors { DiagnosticFactory1 ILLEGAL_KOTLIN_VERSION_STRING_VALUE = DiagnosticFactory1.create(ERROR); DiagnosticFactory1 NEWER_VERSION_IN_SINCE_KOTLIN = DiagnosticFactory1.create(WARNING); - DiagnosticFactory1 EXPERIMENTAL_API_USAGE = DiagnosticFactory1.create(WARNING); - DiagnosticFactory1 EXPERIMENTAL_API_USAGE_ERROR = DiagnosticFactory1.create(ERROR); + DiagnosticFactory1 EXPERIMENTAL_API_USAGE = DiagnosticFactory1.create(WARNING); + DiagnosticFactory1 EXPERIMENTAL_API_USAGE_ERROR = DiagnosticFactory1.create(ERROR); - DiagnosticFactory2 EXPERIMENTAL_OVERRIDE = DiagnosticFactory2.create(WARNING); - DiagnosticFactory2 EXPERIMENTAL_OVERRIDE_ERROR = DiagnosticFactory2.create(ERROR); + DiagnosticFactory1 EXPERIMENTAL_OVERRIDE = DiagnosticFactory1.create(WARNING); + DiagnosticFactory1 EXPERIMENTAL_OVERRIDE_ERROR = DiagnosticFactory1.create(ERROR); DiagnosticFactory0 EXPERIMENTAL_IS_NOT_ENABLED = DiagnosticFactory0.create(WARNING); DiagnosticFactory0 EXPERIMENTAL_CAN_ONLY_BE_USED_AS_ANNOTATION = DiagnosticFactory0.create(ERROR); @@ -270,8 +270,8 @@ public interface Errors { DiagnosticFactory1 USE_EXPERIMENTAL_ARGUMENT_IS_NOT_MARKER = DiagnosticFactory1.create(WARNING); DiagnosticFactory1 EXPERIMENTAL_ANNOTATION_WITH_WRONG_TARGET = DiagnosticFactory1.create(ERROR); - DiagnosticFactory1 EXPERIMENTAL_UNSIGNED_LITERALS = DiagnosticFactory1.create(WARNING); - DiagnosticFactory1 EXPERIMENTAL_UNSIGNED_LITERALS_ERROR = DiagnosticFactory1.create(ERROR); + DiagnosticFactory1 EXPERIMENTAL_UNSIGNED_LITERALS = DiagnosticFactory1.create(WARNING); + DiagnosticFactory1 EXPERIMENTAL_UNSIGNED_LITERALS_ERROR = DiagnosticFactory1.create(ERROR); DiagnosticFactory0 NON_PARENTHESIZED_ANNOTATIONS_ON_FUNCTIONAL_TYPES = DiagnosticFactory0.create(ERROR); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java index f612ecf5817..3201c756752 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -147,11 +147,11 @@ public class DefaultErrorMessages { MAP.put(ILLEGAL_KOTLIN_VERSION_STRING_VALUE, "Invalid @{0} annotation value (should be ''major.minor'' or ''major.minor.patch'')", TO_STRING); MAP.put(NEWER_VERSION_IN_SINCE_KOTLIN, "The version is greater than the specified API version {0}", STRING); - MAP.put(EXPERIMENTAL_API_USAGE, "This declaration is experimental and its usage should be marked with ''@{0}'' or ''@OptIn({0}::class)''", TO_STRING); - MAP.put(EXPERIMENTAL_API_USAGE_ERROR, "This declaration is experimental and its usage must be marked with ''@{0}'' or ''@OptIn({0}::class)''", TO_STRING); + MAP.put(EXPERIMENTAL_API_USAGE, "{0}", STRING); + MAP.put(EXPERIMENTAL_API_USAGE_ERROR, "{0}", STRING); - MAP.put(EXPERIMENTAL_OVERRIDE, "This declaration overrides experimental member of supertype ''{1}'' and should be annotated with ''@{0}''", TO_STRING, NAME); - MAP.put(EXPERIMENTAL_OVERRIDE_ERROR, "This declaration overrides experimental member of supertype ''{1}'' and must be annotated with ''@{0}''", TO_STRING, NAME); + MAP.put(EXPERIMENTAL_OVERRIDE, "{0}", STRING); + MAP.put(EXPERIMENTAL_OVERRIDE_ERROR, "{0}", STRING); MAP.put(EXPERIMENTAL_IS_NOT_ENABLED, "This class can only be used with the compiler argument '-Xopt-in=kotlin.RequiresOptIn'"); MAP.put(EXPERIMENTAL_CAN_ONLY_BE_USED_AS_ANNOTATION, "This class can only be used as an annotation"); @@ -161,8 +161,8 @@ public class DefaultErrorMessages { MAP.put(USE_EXPERIMENTAL_ARGUMENT_IS_NOT_MARKER, "Annotation ''{0}'' is not an opt-in requirement marker, therefore its usage in @OptIn is ignored", TO_STRING); MAP.put(EXPERIMENTAL_ANNOTATION_WITH_WRONG_TARGET, "Opt-in requirement marker annotation cannot be used on the following code elements: {0}. Please remove these targets", STRING); - MAP.put(EXPERIMENTAL_UNSIGNED_LITERALS, "Unsigned literals are experimental and their usages should be marked with ''@{0}'' or ''@OptIn({0}::class)''", TO_STRING); - MAP.put(EXPERIMENTAL_UNSIGNED_LITERALS_ERROR, "Unsigned literals are experimental and their usages must be marked with ''@{0}'' or ''@OptIn({0}::class)''", TO_STRING); + MAP.put(EXPERIMENTAL_UNSIGNED_LITERALS, "{0}", STRING); + MAP.put(EXPERIMENTAL_UNSIGNED_LITERALS_ERROR, "{0}", STRING); MAP.put(NON_PARENTHESIZED_ANNOTATIONS_ON_FUNCTIONAL_TYPES, "Non-parenthesized annotations on function types without receiver aren't yet supported (see KT-31734 for details)"); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExperimentalUsageChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExperimentalUsageChecker.kt index 87996d09774..854fd50f4a1 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExperimentalUsageChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExperimentalUsageChecker.kt @@ -37,6 +37,7 @@ import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.constants.ArrayValue import org.jetbrains.kotlin.resolve.constants.EnumValue import org.jetbrains.kotlin.resolve.constants.KClassValue +import org.jetbrains.kotlin.resolve.constants.StringValue import org.jetbrains.kotlin.resolve.deprecation.CoroutineCompatibilitySupport import org.jetbrains.kotlin.resolve.deprecation.DeprecationLevelValue import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver @@ -51,7 +52,7 @@ import org.jetbrains.kotlin.utils.addIfNotNull class ExperimentalUsageChecker(project: Project) : CallChecker { private val moduleAnnotationsResolver = ModuleAnnotationsResolver.getInstance(project) - data class Experimentality(val annotationFqName: FqName, val severity: Severity) { + data class Experimentality(val annotationFqName: FqName, val severity: Severity, val message: String?) { enum class Severity { WARNING, ERROR } companion object { @@ -59,9 +60,14 @@ class ExperimentalUsageChecker(project: Project) : CallChecker { } } + class ExperimentalityDiagnostic( + val factory: DiagnosticFactory1, + val defaultMessage: (FqName) -> String + ) + data class ExperimentalityDiagnostics( - val warning: DiagnosticFactory1, - val error: DiagnosticFactory1 + val warning: ExperimentalityDiagnostic, + val error: ExperimentalityDiagnostic ) override fun check(resolvedCall: ResolvedCall<*>, reportOn: PsiElement, context: CallCheckerContext) { @@ -84,18 +90,30 @@ class ExperimentalUsageChecker(project: Project) : CallChecker { internal val WAS_EXPERIMENTAL_ANNOTATION_CLASS = Name.identifier("markerClass") private val LEVEL = Name.identifier("level") + private val MESSAGE = Name.identifier("message") private val WARNING_LEVEL = Name.identifier("WARNING") private val ERROR_LEVEL = Name.identifier("ERROR") - private val EXPERIMENTAL_API_DIAGNOSTICS = ExperimentalityDiagnostics( - Errors.EXPERIMENTAL_API_USAGE, Errors.EXPERIMENTAL_API_USAGE_ERROR + internal fun getDefaultDiagnosticMessage(prefix: String) = fun(fqName: FqName): String { + return "$prefix with '@${fqName.asString()}' or '@OptIn(${fqName.asString()}::class)'" + } + + private val USAGE_DIAGNOSTICS = ExperimentalityDiagnostics( + warning = ExperimentalityDiagnostic( + Errors.EXPERIMENTAL_API_USAGE, + getDefaultDiagnosticMessage("This declaration is experimental and its usage should be marked") + ), + error = ExperimentalityDiagnostic( + Errors.EXPERIMENTAL_API_USAGE_ERROR, + getDefaultDiagnosticMessage("This declaration is experimental and its usage must be marked") + ) ) fun reportNotAcceptedExperimentalities( experimentalities: Collection, element: PsiElement, context: CheckerContext ) { reportNotAcceptedExperimentalities( - experimentalities, element, context.languageVersionSettings, context.trace, EXPERIMENTAL_API_DIAGNOSTICS + experimentalities, element, context.languageVersionSettings, context.trace, USAGE_DIAGNOSTICS ) } @@ -106,13 +124,13 @@ class ExperimentalUsageChecker(project: Project) : CallChecker { trace: BindingTrace, diagnostics: ExperimentalityDiagnostics ) { - for ((annotationFqName, severity) in experimentalities) { + for ((annotationFqName, severity, message) in experimentalities) { if (!element.isExperimentalityAccepted(annotationFqName, languageVersionSettings, trace.bindingContext)) { val diagnostic = when (severity) { Experimentality.Severity.WARNING -> diagnostics.warning Experimentality.Severity.ERROR -> diagnostics.error } - trace.reportDiagnosticOnce(diagnostic.on(element, annotationFqName)) + trace.reportDiagnosticOnce(diagnostic.factory.on(element, message ?: diagnostic.defaultMessage(annotationFqName))) } } } @@ -153,13 +171,16 @@ class ExperimentalUsageChecker(project: Project) : CallChecker { ?: annotations.findAnnotation(OLD_EXPERIMENTAL_FQ_NAME) ?: return null - val severity = when ((experimental.allValueArguments[LEVEL] as? EnumValue)?.enumEntryName) { + val arguments = experimental.allValueArguments + val severity = when ((arguments[LEVEL] as? EnumValue)?.enumEntryName) { WARNING_LEVEL -> Experimentality.Severity.WARNING ERROR_LEVEL -> Experimentality.Severity.ERROR else -> Experimentality.DEFAULT_SEVERITY } - return Experimentality(fqNameSafe, severity) + val message = (arguments[MESSAGE] as? StringValue)?.value + + return Experimentality(fqNameSafe, severity, message) } private fun PsiElement.isExperimentalityAccepted(annotationFqName: FqName, context: CheckerContext): Boolean = @@ -344,12 +365,17 @@ class ExperimentalUsageChecker(project: Project) : CallChecker { for ((experimentality, member) in experimentalOverridden) { if (!declaration.isExperimentalityAccepted(experimentality.annotationFqName, context)) { - val diagnostic = when (experimentality.severity) { - Experimentality.Severity.WARNING -> Errors.EXPERIMENTAL_OVERRIDE - Experimentality.Severity.ERROR -> Errors.EXPERIMENTAL_OVERRIDE_ERROR - } val reportOn = (declaration as? KtNamedDeclaration)?.nameIdentifier ?: declaration - context.trace.report(diagnostic.on(reportOn, experimentality.annotationFqName, member.containingDeclaration)) + + val (diagnostic, defaultMessageVerb) = when (experimentality.severity) { + Experimentality.Severity.WARNING -> Errors.EXPERIMENTAL_OVERRIDE to "should" + Experimentality.Severity.ERROR -> Errors.EXPERIMENTAL_OVERRIDE_ERROR to "must" + } + val message = experimentality.message + ?: "This declaration overrides experimental member of supertype " + + "'${member.containingDeclaration.name.asString()}' and $defaultMessageVerb be annotated " + + "with '@${experimentality.annotationFqName.asString()}'" + context.trace.report(diagnostic.on(reportOn, message)) } } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/constants/evaluate/ConstantExpressionEvaluator.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/constants/evaluate/ConstantExpressionEvaluator.kt index d3f542d2f26..5a6017de7f6 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/constants/evaluate/ConstantExpressionEvaluator.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/constants/evaluate/ConstantExpressionEvaluator.kt @@ -319,7 +319,14 @@ class ConstantExpressionEvaluator( companion object { private val EXPERIMENTAL_UNSIGNED_LITERALS_DIAGNOSTICS = ExperimentalUsageChecker.ExperimentalityDiagnostics( - Errors.EXPERIMENTAL_UNSIGNED_LITERALS, Errors.EXPERIMENTAL_UNSIGNED_LITERALS_ERROR + warning = ExperimentalUsageChecker.ExperimentalityDiagnostic( + Errors.EXPERIMENTAL_UNSIGNED_LITERALS, + ExperimentalUsageChecker.getDefaultDiagnosticMessage("Unsigned literals are experimental and their usages should be marked") + ), + error = ExperimentalUsageChecker.ExperimentalityDiagnostic( + Errors.EXPERIMENTAL_UNSIGNED_LITERALS_ERROR, + ExperimentalUsageChecker.getDefaultDiagnosticMessage("Unsigned literals are experimental and their usages must be marked") + ) ) @JvmStatic diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/annotation.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/annotation.fir.kt index e34d1f49fff..2b2cdb1b892 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/annotation.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/annotation.fir.kt @@ -4,7 +4,7 @@ package api -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.TYPE, AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.TYPEALIAS, AnnotationTarget.VALUE_PARAMETER) annotation class ExperimentalAPI diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/annotation.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/annotation.kt index 778f4d0a394..a9203f58c5e 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/annotation.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/annotation.kt @@ -4,7 +4,7 @@ package api -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.TYPE, AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.TYPEALIAS, AnnotationTarget.VALUE_PARAMETER) annotation class ExperimentalAPI diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/bodyUsages.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/bodyUsages.fir.kt index 89296f28d77..cef19037bac 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/bodyUsages.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/bodyUsages.fir.kt @@ -3,7 +3,7 @@ package api -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) annotation class ExperimentalAPI interface I diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/bodyUsages.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/bodyUsages.kt index 89296f28d77..cef19037bac 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/bodyUsages.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/bodyUsages.kt @@ -3,7 +3,7 @@ package api -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) annotation class ExperimentalAPI interface I diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/bodyUsagesAndInline.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/bodyUsagesAndInline.fir.kt index 3c65b6e3809..2698e543abe 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/bodyUsagesAndInline.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/bodyUsagesAndInline.fir.kt @@ -4,7 +4,7 @@ package api -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) annotation class API @API diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/bodyUsagesAndInline.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/bodyUsagesAndInline.kt index 4b4e880a362..7c00f240fc0 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/bodyUsagesAndInline.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/bodyUsagesAndInline.kt @@ -4,7 +4,7 @@ package api -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) annotation class API @API diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembers.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembers.fir.kt index 9d690c4f626..233fb40dd7a 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembers.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembers.fir.kt @@ -3,7 +3,7 @@ package api -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION) annotation class ExperimentalAPI diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembers.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembers.kt index a57c4ff562b..8b1707958bc 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembers.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembers.kt @@ -3,7 +3,7 @@ package api -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION) annotation class ExperimentalAPI diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembersOverlyExperimental.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembersOverlyExperimental.fir.kt index 247dc8d9a5c..7768721ec4e 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembersOverlyExperimental.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembersOverlyExperimental.fir.kt @@ -3,7 +3,7 @@ package api -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY) annotation class ExperimentalAPI diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembersOverlyExperimental.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembersOverlyExperimental.kt index 1bc33ff2897..9ff4388e696 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembersOverlyExperimental.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembersOverlyExperimental.kt @@ -3,7 +3,7 @@ package api -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY) annotation class ExperimentalAPI diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/constVal.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/constVal.fir.kt index a1a4798b589..01cbf7fcc3e 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/constVal.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/constVal.fir.kt @@ -3,7 +3,7 @@ package api -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.PROPERTY, AnnotationTarget.FUNCTION) annotation class ExperimentalAPI diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/constVal.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/constVal.kt index 6b2714f68d3..1e7f81eacd3 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/constVal.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/constVal.kt @@ -3,7 +3,7 @@ package api -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.PROPERTY, AnnotationTarget.FUNCTION) annotation class ExperimentalAPI diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/deeplyNestedClass.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/deeplyNestedClass.fir.kt index dff3ba9322f..7513ef819b5 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/deeplyNestedClass.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/deeplyNestedClass.fir.kt @@ -3,7 +3,7 @@ package api -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION) annotation class ExperimentalAPI diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/deeplyNestedClass.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/deeplyNestedClass.kt index a4a76dfee8d..e127c4b22f3 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/deeplyNestedClass.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/deeplyNestedClass.kt @@ -3,7 +3,7 @@ package api -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION) annotation class ExperimentalAPI diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/incorrectTargetsForExperimentalAnnotation.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/incorrectTargetsForExperimentalAnnotation.fir.kt index 384d0e37f0e..5d1e4cfc983 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/incorrectTargetsForExperimentalAnnotation.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/incorrectTargetsForExperimentalAnnotation.fir.kt @@ -5,21 +5,21 @@ package api import kotlin.annotation.AnnotationTarget.* -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(CLASS, ANNOTATION_CLASS, TYPE_PARAMETER, PROPERTY, FIELD, LOCAL_VARIABLE, VALUE_PARAMETER, CONSTRUCTOR, FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER, TYPE, TYPEALIAS) annotation class E1 -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(FILE) annotation class E2 -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(EXPRESSION) @Retention(AnnotationRetention.SOURCE) annotation class E3 -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(FILE, EXPRESSION) @Retention(AnnotationRetention.SOURCE) annotation class E4 diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/incorrectTargetsForExperimentalAnnotation.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/incorrectTargetsForExperimentalAnnotation.kt index 2e0c8e15551..02ee045ffdd 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/incorrectTargetsForExperimentalAnnotation.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/incorrectTargetsForExperimentalAnnotation.kt @@ -5,21 +5,21 @@ package api import kotlin.annotation.AnnotationTarget.* -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(CLASS, ANNOTATION_CLASS, TYPE_PARAMETER, PROPERTY, FIELD, LOCAL_VARIABLE, VALUE_PARAMETER, CONSTRUCTOR, FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER, TYPE, TYPEALIAS) annotation class E1 -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(FILE) annotation class E2 -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(EXPRESSION) @Retention(AnnotationRetention.SOURCE) annotation class E3 -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(FILE, EXPRESSION) @Retention(AnnotationRetention.SOURCE) annotation class E4 diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/override.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/override.fir.kt index a8ba479ebbd..7f7018f6131 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/override.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/override.fir.kt @@ -3,7 +3,7 @@ package api -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) annotation class E open class Base { diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/override.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/override.kt index be6181b8740..4efe8120847 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/override.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/override.kt @@ -3,7 +3,7 @@ package api -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) annotation class E open class Base { diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/overrideDifferentExperimentalities.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/overrideDifferentExperimentalities.fir.kt index e50a444a7b7..7f515612f94 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/overrideDifferentExperimentalities.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/overrideDifferentExperimentalities.fir.kt @@ -1,8 +1,8 @@ // !USE_EXPERIMENTAL: kotlin.RequiresOptIn -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) annotation class E1 -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) annotation class E3 interface Base1 { diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/overrideDifferentExperimentalities.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/overrideDifferentExperimentalities.kt index 31a5a112682..ca364f1ad0a 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/overrideDifferentExperimentalities.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/overrideDifferentExperimentalities.kt @@ -1,8 +1,8 @@ // !USE_EXPERIMENTAL: kotlin.RequiresOptIn -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) annotation class E1 -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) annotation class E3 interface Base1 { diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/scripts.kts b/compiler/testData/diagnostics/testsWithStdLib/experimental/scripts.kts index f10f81c703e..3d80857c1a0 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/scripts.kts +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/scripts.kts @@ -4,7 +4,7 @@ package api -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) annotation class ExperimentalAPI @ExperimentalAPI diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/topLevel.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/topLevel.fir.kt index a0d50df50a7..cdd4daa6d13 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/topLevel.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/topLevel.fir.kt @@ -4,7 +4,7 @@ package api -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.TYPE, AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.TYPEALIAS, AnnotationTarget.VALUE_PARAMETER) annotation class ExperimentalAPI diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/topLevel.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/topLevel.kt index 6bdde3e0fb7..f333ffb381b 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/topLevel.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/topLevel.kt @@ -4,7 +4,7 @@ package api -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.TYPE, AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.TYPEALIAS, AnnotationTarget.VALUE_PARAMETER) annotation class ExperimentalAPI diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/usageNotAsAnnotation.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/usageNotAsAnnotation.fir.kt index d2ef7cacb02..9ad4047b48b 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/usageNotAsAnnotation.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/usageNotAsAnnotation.fir.kt @@ -14,7 +14,7 @@ import kotlin.RequiresOptIn // Usages with FQ names should be OK -@kotlin.RequiresOptIn(kotlin.RequiresOptIn.Level.ERROR) +@kotlin.RequiresOptIn(level = kotlin.RequiresOptIn.Level.ERROR) annotation class M diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/usageNotAsAnnotation.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/usageNotAsAnnotation.kt index a44700b9643..32f2c326cb3 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/usageNotAsAnnotation.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/usageNotAsAnnotation.kt @@ -14,7 +14,7 @@ import kotlin.RequiresOptIn // Usages with FQ names should be OK -@kotlin.RequiresOptIn(kotlin.RequiresOptIn.Level.ERROR) +@kotlin.RequiresOptIn(level = kotlin.RequiresOptIn.Level.ERROR) annotation class M diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnFile.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnFile.fir.kt index 819bf3a6e07..6c3a55b5a7c 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnFile.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnFile.fir.kt @@ -3,11 +3,11 @@ package api -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.FUNCTION) annotation class ExperimentalAPI1 -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.FUNCTION) annotation class ExperimentalAPI2 diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnFile.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnFile.kt index f05ba2f28ac..4b9a116a69d 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnFile.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnFile.kt @@ -3,11 +3,11 @@ package api -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.FUNCTION) annotation class ExperimentalAPI1 -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.FUNCTION) annotation class ExperimentalAPI2 diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnFileWithVeryExperimentalMarker.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnFileWithVeryExperimentalMarker.fir.kt index 7b5956ed159..66e053a6a5c 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnFileWithVeryExperimentalMarker.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnFileWithVeryExperimentalMarker.fir.kt @@ -3,11 +3,11 @@ package api -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) annotation class ExperimentalAPI @ExperimentalAPI -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) annotation class VeryExperimentalAPI @ExperimentalAPI diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnFileWithVeryExperimentalMarker.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnFileWithVeryExperimentalMarker.kt index 7b5956ed159..66e053a6a5c 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnFileWithVeryExperimentalMarker.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnFileWithVeryExperimentalMarker.kt @@ -3,11 +3,11 @@ package api -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) annotation class ExperimentalAPI @ExperimentalAPI -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) annotation class VeryExperimentalAPI @ExperimentalAPI diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnWholeModule.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnWholeModule.fir.kt index 5db3e27b54e..3232fc29ef5 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnWholeModule.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnWholeModule.fir.kt @@ -4,7 +4,7 @@ package api -@RequiresOptIn(RequiresOptIn.Level.ERROR) +@RequiresOptIn(level = RequiresOptIn.Level.ERROR) annotation class ExperimentalAPI @ExperimentalAPI diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnWholeModule.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnWholeModule.kt index 5db3e27b54e..3232fc29ef5 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnWholeModule.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnWholeModule.kt @@ -4,7 +4,7 @@ package api -@RequiresOptIn(RequiresOptIn.Level.ERROR) +@RequiresOptIn(level = RequiresOptIn.Level.ERROR) annotation class ExperimentalAPI @ExperimentalAPI diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalTargets.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalTargets.fir.kt index c11c525ac07..d7b55663e0b 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalTargets.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalTargets.fir.kt @@ -4,7 +4,7 @@ package api -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.CLASS) annotation class E diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalTargets.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalTargets.kt index c11c525ac07..d7b55663e0b 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalTargets.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalTargets.kt @@ -4,7 +4,7 @@ package api -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.CLASS) annotation class E diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalWithSeveralAnnotations.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalWithSeveralAnnotations.fir.kt index a9a0c20df36..5aa9fee7d05 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalWithSeveralAnnotations.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalWithSeveralAnnotations.fir.kt @@ -3,15 +3,15 @@ package api -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.FUNCTION) annotation class E1 -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.FUNCTION) annotation class E2 -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.FUNCTION) annotation class E3 diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalWithSeveralAnnotations.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalWithSeveralAnnotations.kt index 6a6cef8dc85..f649e7d0bf6 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalWithSeveralAnnotations.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalWithSeveralAnnotations.kt @@ -3,15 +3,15 @@ package api -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.FUNCTION) annotation class E1 -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.FUNCTION) annotation class E2 -@RequiresOptIn(RequiresOptIn.Level.WARNING) +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.FUNCTION) annotation class E3 diff --git a/libraries/stdlib/src/kotlin/annotations/OptIn.kt b/libraries/stdlib/src/kotlin/annotations/OptIn.kt index eb58daa58f5..16af31201be 100644 --- a/libraries/stdlib/src/kotlin/annotations/OptIn.kt +++ b/libraries/stdlib/src/kotlin/annotations/OptIn.kt @@ -15,16 +15,24 @@ import kotlin.reflect.KClass /** * Signals that the annotated annotation class is a marker of an API that requires an explicit opt-in. * - * Call sites of any declaration annotated with that marker should opt-in to the API either by using [OptIn], + * Call sites of any declaration annotated with that marker should opt in to the API either by using [OptIn], * or by being annotated with that marker themselves, effectively causing further propagation of the opt-in requirement. * * This class requires opt-in itself and can only be used with the compiler argument `-Xopt-in=kotlin.RequiresOptIn`. + * + * @property message message to be reported on usages of API without an explicit opt-in, or empty string for the default message. + * The default message is: "This declaration is experimental and its usage should be marked with 'Marker' + * or '@OptIn(Marker::class)'", where `Marker` is the opt-in requirement marker. + * @property level specifies how usages of API without an explicit opt-in are reported in code. */ @Target(ANNOTATION_CLASS) @Retention(BINARY) @SinceKotlin("1.3") @RequireKotlin("1.3.70", versionKind = RequireKotlinVersionKind.COMPILER_VERSION) -public annotation class RequiresOptIn(val level: Level = Level.ERROR) { +public annotation class RequiresOptIn( + val message: String = "", + val level: Level = Level.ERROR +) { /** * Severity of the diagnostic that should be reported on usages which did not explicitly opted into * the API either by using [OptIn] or by being annotated with the corresponding marker annotation. @@ -40,7 +48,7 @@ public annotation class RequiresOptIn(val level: Level = Level.ERROR) { /** * Allows to use the API denoted by the given markers in the annotated file, declaration, or expression. - * If a declaration is annotated with [OptIn], its usages are **not** required to opt-in to that API. + * If a declaration is annotated with [OptIn], its usages are **not** required to opt in to that API. * * This class requires opt-in itself and can only be used with the compiler argument `-Xopt-in=kotlin.RequiresOptIn`. */ 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 e6b89c5f63c..17fe225375b 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 @@ -160,6 +160,7 @@ public abstract interface annotation class kotlin/ReplaceWith : java/lang/annota public abstract interface annotation class kotlin/RequiresOptIn : java/lang/annotation/Annotation { public abstract fun level ()Lkotlin/RequiresOptIn$Level; + public abstract fun message ()Ljava/lang/String; } public final class kotlin/RequiresOptIn$Level : java/lang/Enum {