diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index 3be58c0c16c..76273912f07 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -34327,6 +34327,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/incorrectUseExperimental.kt"); } + @Test + @TestMetadata("noRetentionAfter.kt") + public void testNoRetentionAfter() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/noRetentionAfter.kt"); + } + @Test @TestMetadata("override.kt") public void testOverride() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java index b3e352a93dd..8f6b68ddf7f 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java @@ -34327,6 +34327,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/incorrectUseExperimental.kt"); } + @Test + @TestMetadata("noRetentionAfter.kt") + public void testNoRetentionAfter() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/noRetentionAfter.kt"); + } + @Test @TestMetadata("override.kt") public void testOverride() throws Exception { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java index 1f04af12dbf..eb93faa4e04 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java @@ -284,6 +284,7 @@ public interface Errors { DiagnosticFactory0 USE_EXPERIMENTAL_WITHOUT_ARGUMENTS = DiagnosticFactory0.create(WARNING); DiagnosticFactory1 USE_EXPERIMENTAL_ARGUMENT_IS_NOT_MARKER = DiagnosticFactory1.create(WARNING); DiagnosticFactory1 EXPERIMENTAL_ANNOTATION_WITH_WRONG_TARGET = DiagnosticFactory1.create(ERROR); + DiagnosticFactory0 EXPERIMENTAL_ANNOTATION_WITH_WRONG_RETENTION = DiagnosticFactory0.create(ERROR); DiagnosticFactory1 EXPERIMENTAL_UNSIGNED_LITERALS = DiagnosticFactory1.create(WARNING); DiagnosticFactory1 EXPERIMENTAL_UNSIGNED_LITERALS_ERROR = DiagnosticFactory1.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 7773b2a55d5..006b7ef3298 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -168,6 +168,7 @@ public class DefaultErrorMessages { MAP.put(USE_EXPERIMENTAL_WITHOUT_ARGUMENTS, "@OptIn without any arguments has no effect"); 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_ANNOTATION_WITH_WRONG_RETENTION, "Opt-in requirement marker annotation cannot be used with SOURCE retention. Please replace retention with BINARY"); MAP.put(EXPERIMENTAL_UNSIGNED_LITERALS, "{0}", STRING); MAP.put(EXPERIMENTAL_UNSIGNED_LITERALS_ERROR, "{0}", STRING); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExperimentalMarkerDeclarationAnnotationChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExperimentalMarkerDeclarationAnnotationChecker.kt index 45bf75eb8fe..2f389d2e965 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExperimentalMarkerDeclarationAnnotationChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExperimentalMarkerDeclarationAnnotationChecker.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.resolve.checkers import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor +import org.jetbrains.kotlin.descriptors.annotations.KotlinRetention import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.psi.KtAnnotationEntry @@ -19,12 +20,17 @@ import org.jetbrains.kotlin.resolve.constants.ArrayValue import org.jetbrains.kotlin.resolve.constants.ConstantValue import org.jetbrains.kotlin.resolve.constants.KClassValue import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe +import org.jetbrains.kotlin.resolve.descriptorUtil.getAnnotationRetention import org.jetbrains.kotlin.utils.addToStdlib.safeAs class ExperimentalMarkerDeclarationAnnotationChecker(private val module: ModuleDescriptor) : AdditionalAnnotationChecker { private val WRONG_TARGETS_FOR_MARKER = setOf(KotlinTarget.EXPRESSION, KotlinTarget.FILE) - override fun checkEntries(entries: List, actualTargets: List, trace: BindingTrace) { + override fun checkEntries( + entries: List, + actualTargets: List, + trace: BindingTrace + ) { var isAnnotatedWithExperimental = false for (entry in entries) { @@ -43,7 +49,7 @@ class ExperimentalMarkerDeclarationAnnotationChecker(private val module: ModuleD } if (isAnnotatedWithExperimental) { - checkMarkerTargets(entries, trace) + checkMarkerTargetsAndRetention(entries, trace) } } @@ -66,19 +72,35 @@ class ExperimentalMarkerDeclarationAnnotationChecker(private val module: ModuleD } } - private fun checkMarkerTargets(entries: List, trace: BindingTrace) { - val targetEntry = - entries.associate { entry -> entry to trace.bindingContext.get(BindingContext.ANNOTATION, entry) } - .entries - .firstOrNull { (_, descriptor) -> descriptor != null && descriptor.fqName == StandardNames.FqNames.target } - ?: return - val (entry, descriptor) = targetEntry - val allowedTargets = AnnotationChecker.loadAnnotationTargets(descriptor!!) ?: return - val wrongTargets = allowedTargets.intersect(WRONG_TARGETS_FOR_MARKER) - if (wrongTargets.isNotEmpty()) { - trace.report( - Errors.EXPERIMENTAL_ANNOTATION_WITH_WRONG_TARGET.on(entry, wrongTargets.joinToString(transform = KotlinTarget::description)) - ) + private fun checkMarkerTargetsAndRetention( + entries: List, + trace: BindingTrace + ) { + val associatedEntries = entries.associateWith { entry -> trace.bindingContext.get(BindingContext.ANNOTATION, entry) }.entries + val targetEntry = associatedEntries.firstOrNull { (_, descriptor) -> + descriptor?.fqName == StandardNames.FqNames.target + } + if (targetEntry != null) { + val (entry, descriptor) = targetEntry + val allowedTargets = AnnotationChecker.loadAnnotationTargets(descriptor!!) ?: return + val wrongTargets = allowedTargets.intersect(WRONG_TARGETS_FOR_MARKER) + if (wrongTargets.isNotEmpty()) { + trace.report( + Errors.EXPERIMENTAL_ANNOTATION_WITH_WRONG_TARGET.on( + entry, + wrongTargets.joinToString(transform = KotlinTarget::description) + ) + ) + } + } + val retentionEntry = associatedEntries.firstOrNull { (_, descriptor) -> + descriptor?.fqName == StandardNames.FqNames.retention + } + if (retentionEntry != null) { + val (entry, descriptor) = retentionEntry + if (descriptor?.getAnnotationRetention() == KotlinRetention.SOURCE) { + trace.report(Errors.EXPERIMENTAL_ANNOTATION_WITH_WRONG_RETENTION.on(entry)) + } } } } diff --git a/compiler/testData/cli/jvm/experimentalDeprecatedWarning.kt b/compiler/testData/cli/jvm/experimentalDeprecatedWarning.kt index dd37cdcd25c..da1bc5e10d8 100644 --- a/compiler/testData/cli/jvm/experimentalDeprecatedWarning.kt +++ b/compiler/testData/cli/jvm/experimentalDeprecatedWarning.kt @@ -2,8 +2,10 @@ package org.test @Deprecated("Warning1", level = DeprecationLevel.WARNING) @RequiresOptIn +@Retention(AnnotationRetention.BINARY) annotation class Warning1 @Deprecated("Warning2", level = DeprecationLevel.WARNING) @RequiresOptIn +@Retention(AnnotationRetention.BINARY) annotation class Warning2 diff --git a/compiler/testData/cli/jvm/experimentalNested.kt b/compiler/testData/cli/jvm/experimentalNested.kt index 86f162043c7..abb960baf4d 100644 --- a/compiler/testData/cli/jvm/experimentalNested.kt +++ b/compiler/testData/cli/jvm/experimentalNested.kt @@ -2,6 +2,7 @@ package org.test class Outer { @RequiresOptIn + @Retention(AnnotationRetention.BINARY) annotation class Nested } diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/annotation.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/annotation.fir.kt index 2b2cdb1b892..80a28d3870e 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/annotation.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/annotation.fir.kt @@ -7,11 +7,13 @@ package api @RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.TYPE, AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.TYPEALIAS, AnnotationTarget.VALUE_PARAMETER) +@Retention(AnnotationRetention.BINARY) annotation class ExperimentalAPI @ExperimentalAPI @Target(AnnotationTarget.TYPE, AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.TYPEALIAS, AnnotationTarget.VALUE_PARAMETER) +@Retention(AnnotationRetention.BINARY) annotation class EAnno // FILE: usage-propagate.kt diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/annotation.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/annotation.kt index a9203f58c5e..b00898eabba 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/annotation.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/annotation.kt @@ -7,11 +7,13 @@ package api @RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.TYPE, AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.TYPEALIAS, AnnotationTarget.VALUE_PARAMETER) +@Retention(AnnotationRetention.BINARY) annotation class ExperimentalAPI @ExperimentalAPI @Target(AnnotationTarget.TYPE, AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.TYPEALIAS, AnnotationTarget.VALUE_PARAMETER) +@Retention(AnnotationRetention.BINARY) annotation class EAnno // FILE: usage-propagate.kt diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/annotation.txt b/compiler/testData/diagnostics/testsWithStdLib/experimental/annotation.txt index 8985d3d18f1..b97b9d58359 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/annotation.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/annotation.txt @@ -2,14 +2,14 @@ package package api { - @api.ExperimentalAPI @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.TYPE, AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.TYPEALIAS, AnnotationTarget.VALUE_PARAMETER}) public final annotation class EAnno : kotlin.Annotation { + @api.ExperimentalAPI @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.TYPE, AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.TYPEALIAS, AnnotationTarget.VALUE_PARAMETER}) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) public final annotation class EAnno : kotlin.Annotation { public constructor EAnno() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } - @kotlin.RequiresOptIn(level = Level.WARNING) @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.TYPE, AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.TYPEALIAS, AnnotationTarget.VALUE_PARAMETER}) public final annotation class ExperimentalAPI : kotlin.Annotation { + @kotlin.RequiresOptIn(level = Level.WARNING) @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.TYPE, AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.TYPEALIAS, AnnotationTarget.VALUE_PARAMETER}) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) public final annotation class ExperimentalAPI : kotlin.Annotation { public constructor ExperimentalAPI() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/bodyUsages.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/bodyUsages.kt index bed56f97ad1..68b1b0e7ea4 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/bodyUsages.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/bodyUsages.kt @@ -5,6 +5,7 @@ package api @RequiresOptIn(level = RequiresOptIn.Level.WARNING) +@Retention(AnnotationRetention.BINARY) annotation class ExperimentalAPI interface I diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/bodyUsages.txt b/compiler/testData/diagnostics/testsWithStdLib/experimental/bodyUsages.txt index 9f4882f54a3..f0118eefe37 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/bodyUsages.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/bodyUsages.txt @@ -2,7 +2,7 @@ package package api { - @kotlin.RequiresOptIn(level = Level.WARNING) public final annotation class ExperimentalAPI : kotlin.Annotation { + @kotlin.RequiresOptIn(level = Level.WARNING) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) public final annotation class ExperimentalAPI : kotlin.Annotation { public constructor ExperimentalAPI() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/bodyUsagesAndInline.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/bodyUsagesAndInline.fir.kt index 2698e543abe..7a259fd1178 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/bodyUsagesAndInline.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/bodyUsagesAndInline.fir.kt @@ -5,6 +5,7 @@ package api @RequiresOptIn(level = RequiresOptIn.Level.WARNING) +@Retention(AnnotationRetention.BINARY) annotation class API @API diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/bodyUsagesAndInline.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/bodyUsagesAndInline.kt index 7c00f240fc0..19c2a5546df 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/bodyUsagesAndInline.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/bodyUsagesAndInline.kt @@ -5,6 +5,7 @@ package api @RequiresOptIn(level = RequiresOptIn.Level.WARNING) +@Retention(AnnotationRetention.BINARY) annotation class API @API diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/bodyUsagesAndInline.txt b/compiler/testData/diagnostics/testsWithStdLib/experimental/bodyUsagesAndInline.txt index 21da806a978..884c58c7e40 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/bodyUsagesAndInline.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/bodyUsagesAndInline.txt @@ -3,7 +3,7 @@ package package api { @api.API public fun f(): kotlin.Unit - @kotlin.RequiresOptIn(level = Level.WARNING) public final annotation class API : kotlin.Annotation { + @kotlin.RequiresOptIn(level = Level.WARNING) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) public final annotation class API : kotlin.Annotation { public constructor API() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembers.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembers.fir.kt index 233fb40dd7a..9840eb4985a 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembers.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembers.fir.kt @@ -5,6 +5,7 @@ package api @RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION) +@Retention(AnnotationRetention.BINARY) annotation class ExperimentalAPI @ExperimentalAPI diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembers.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembers.kt index 8b1707958bc..8e416c446d8 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembers.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembers.kt @@ -5,6 +5,7 @@ package api @RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION) +@Retention(AnnotationRetention.BINARY) annotation class ExperimentalAPI @ExperimentalAPI diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembers.txt b/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembers.txt index 1f4fb126cf5..9af272f6edc 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembers.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembers.txt @@ -26,7 +26,7 @@ package api { } } - @kotlin.RequiresOptIn(level = Level.WARNING) @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.FUNCTION}) public final annotation class ExperimentalAPI : kotlin.Annotation { + @kotlin.RequiresOptIn(level = Level.WARNING) @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.FUNCTION}) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) public final annotation class ExperimentalAPI : kotlin.Annotation { public constructor ExperimentalAPI() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembersOverlyExperimental.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembersOverlyExperimental.fir.kt index 7768721ec4e..2839cc25257 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembersOverlyExperimental.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembersOverlyExperimental.fir.kt @@ -5,6 +5,7 @@ package api @RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY) +@Retention(AnnotationRetention.BINARY) annotation class ExperimentalAPI @ExperimentalAPI diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembersOverlyExperimental.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembersOverlyExperimental.kt index 9ff4388e696..9a740c921be 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembersOverlyExperimental.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembersOverlyExperimental.kt @@ -5,6 +5,7 @@ package api @RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY) +@Retention(AnnotationRetention.BINARY) annotation class ExperimentalAPI @ExperimentalAPI diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembersOverlyExperimental.txt b/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembersOverlyExperimental.txt index 8ae8ef25a75..a95b6dcf4d5 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembersOverlyExperimental.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/classMembersOverlyExperimental.txt @@ -19,7 +19,7 @@ package api { } } - @kotlin.RequiresOptIn(level = Level.WARNING) @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY}) public final annotation class ExperimentalAPI : kotlin.Annotation { + @kotlin.RequiresOptIn(level = Level.WARNING) @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY}) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) public final annotation class ExperimentalAPI : kotlin.Annotation { public constructor ExperimentalAPI() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/constVal.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/constVal.fir.kt index 01cbf7fcc3e..51a76bb11ed 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/constVal.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/constVal.fir.kt @@ -5,6 +5,7 @@ package api @RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.PROPERTY, AnnotationTarget.FUNCTION) +@Retention(AnnotationRetention.BINARY) annotation class ExperimentalAPI @ExperimentalAPI diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/constVal.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/constVal.kt index 1e7f81eacd3..392113f0a5f 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/constVal.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/constVal.kt @@ -5,6 +5,7 @@ package api @RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.PROPERTY, AnnotationTarget.FUNCTION) +@Retention(AnnotationRetention.BINARY) annotation class ExperimentalAPI @ExperimentalAPI diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/constVal.txt b/compiler/testData/diagnostics/testsWithStdLib/experimental/constVal.txt index 38722e634e9..faaac9da4be 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/constVal.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/constVal.txt @@ -11,7 +11,7 @@ package api { public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } - @kotlin.RequiresOptIn(level = Level.WARNING) @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.PROPERTY, AnnotationTarget.FUNCTION}) public final annotation class ExperimentalAPI : kotlin.Annotation { + @kotlin.RequiresOptIn(level = Level.WARNING) @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.PROPERTY, AnnotationTarget.FUNCTION}) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) public final annotation class ExperimentalAPI : kotlin.Annotation { public constructor ExperimentalAPI() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/deeplyNestedClass.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/deeplyNestedClass.fir.kt index 7513ef819b5..51f61ffd04d 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/deeplyNestedClass.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/deeplyNestedClass.fir.kt @@ -5,6 +5,7 @@ package api @RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION) +@Retention(AnnotationRetention.BINARY) annotation class ExperimentalAPI @ExperimentalAPI diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/deeplyNestedClass.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/deeplyNestedClass.kt index e127c4b22f3..3a32420b1eb 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/deeplyNestedClass.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/deeplyNestedClass.kt @@ -5,6 +5,7 @@ package api @RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION) +@Retention(AnnotationRetention.BINARY) annotation class ExperimentalAPI @ExperimentalAPI diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/deeplyNestedClass.txt b/compiler/testData/diagnostics/testsWithStdLib/experimental/deeplyNestedClass.txt index 7505d09cf20..38c75f1386a 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/deeplyNestedClass.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/deeplyNestedClass.txt @@ -30,7 +30,7 @@ package api { } } - @kotlin.RequiresOptIn(level = Level.WARNING) @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.FUNCTION}) public final annotation class ExperimentalAPI : kotlin.Annotation { + @kotlin.RequiresOptIn(level = Level.WARNING) @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.FUNCTION}) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) public final annotation class ExperimentalAPI : kotlin.Annotation { public constructor ExperimentalAPI() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/errors.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/errors.fir.kt index 607d2281796..abec45129a1 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/errors.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/errors.fir.kt @@ -4,6 +4,7 @@ package api @RequiresOptIn +@Retention(AnnotationRetention.BINARY) annotation class E open class Base { diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/errors.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/errors.kt index e2db43c83c9..c681a01b008 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/errors.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/errors.kt @@ -4,6 +4,7 @@ package api @RequiresOptIn +@Retention(AnnotationRetention.BINARY) annotation class E open class Base { diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/errors.txt b/compiler/testData/diagnostics/testsWithStdLib/experimental/errors.txt index 7f71b618832..b6e34724360 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/errors.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/errors.txt @@ -10,7 +10,7 @@ package api { public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } - @kotlin.RequiresOptIn public final annotation class E : kotlin.Annotation { + @kotlin.RequiresOptIn @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) public final annotation class E : kotlin.Annotation { public constructor E() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/experimentalIsNotEnabled.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/experimentalIsNotEnabled.fir.kt index 4dada25aec0..1672323348e 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/experimentalIsNotEnabled.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/experimentalIsNotEnabled.fir.kt @@ -1,6 +1,7 @@ // FILE: api.kt @RequiresOptIn +@Retention(AnnotationRetention.BINARY) annotation class Marker @Marker diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/experimentalIsNotEnabled.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/experimentalIsNotEnabled.kt index 5b45f36b6b3..62eb555f97b 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/experimentalIsNotEnabled.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/experimentalIsNotEnabled.kt @@ -1,6 +1,7 @@ // FILE: api.kt @RequiresOptIn +@Retention(AnnotationRetention.BINARY) annotation class Marker @Marker diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/experimentalIsNotEnabled.txt b/compiler/testData/diagnostics/testsWithStdLib/experimental/experimentalIsNotEnabled.txt index f192792172e..f5c16ad8b82 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/experimentalIsNotEnabled.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/experimentalIsNotEnabled.txt @@ -5,7 +5,7 @@ public fun use1(): kotlin.Unit @Marker public fun use2(): kotlin.Unit @kotlin.OptIn(markerClass = {Marker::class}) public fun use3(): kotlin.Unit -@kotlin.RequiresOptIn public final annotation class Marker : kotlin.Annotation { +@kotlin.RequiresOptIn @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) public final annotation class Marker : kotlin.Annotation { public constructor Marker() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/experimentalOnWholeModule.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/experimentalOnWholeModule.kt index b39f625ac4a..11c28e3c3e6 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/experimentalOnWholeModule.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/experimentalOnWholeModule.kt @@ -7,6 +7,7 @@ package api @RequiresOptIn +@Retention(AnnotationRetention.BINARY) annotation class ExperimentalAPI @ExperimentalAPI diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/experimentalOnWholeModule.txt b/compiler/testData/diagnostics/testsWithStdLib/experimental/experimentalOnWholeModule.txt index 5c2ed887dd5..875bbdbb51e 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/experimentalOnWholeModule.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/experimentalOnWholeModule.txt @@ -4,7 +4,7 @@ package package api { @api.ExperimentalAPI public fun function(): kotlin.String - @kotlin.RequiresOptIn public final annotation class ExperimentalAPI : kotlin.Annotation { + @kotlin.RequiresOptIn @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) public final annotation class ExperimentalAPI : kotlin.Annotation { public constructor ExperimentalAPI() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/fullFqNameUsage.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/fullFqNameUsage.kt index 4ce54e29715..c3be8817258 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/fullFqNameUsage.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/fullFqNameUsage.kt @@ -4,6 +4,7 @@ package test.abc @RequiresOptIn +@Retention(AnnotationRetention.BINARY) annotation class E @OptIn(test.abc.E::class) diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/fullFqNameUsage.txt b/compiler/testData/diagnostics/testsWithStdLib/experimental/fullFqNameUsage.txt index ff68fc7a431..248fe284317 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/fullFqNameUsage.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/fullFqNameUsage.txt @@ -6,7 +6,7 @@ package test { @kotlin.OptIn(markerClass = {test.abc.E::class}) public fun f(): kotlin.Unit @test.abc.E public fun g(): kotlin.Unit - @kotlin.RequiresOptIn public final annotation class E : kotlin.Annotation { + @kotlin.RequiresOptIn @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) public final annotation class E : kotlin.Annotation { public constructor E() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/importStatement.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/importStatement.kt index 4af08974b1f..70c8a909d2e 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/importStatement.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/importStatement.kt @@ -5,6 +5,7 @@ package feature.experimental.self @RequiresOptIn +@Retention(AnnotationRetention.BINARY) annotation class ImportedMarker @ImportedMarker diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/importStatement.txt b/compiler/testData/diagnostics/testsWithStdLib/experimental/importStatement.txt index 3a8144ca653..16f0ec09634 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/importStatement.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/importStatement.txt @@ -16,7 +16,7 @@ package feature { public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } - @kotlin.RequiresOptIn public final annotation class ImportedMarker : kotlin.Annotation { + @kotlin.RequiresOptIn @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) public final annotation class ImportedMarker : kotlin.Annotation { public constructor ImportedMarker() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/incorrectTargetsForExperimentalAnnotation.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/incorrectTargetsForExperimentalAnnotation.fir.kt index 5d1e4cfc983..e729db8d180 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/incorrectTargetsForExperimentalAnnotation.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/incorrectTargetsForExperimentalAnnotation.fir.kt @@ -8,6 +8,7 @@ import kotlin.annotation.AnnotationTarget.* @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) +@Retention(AnnotationRetention.BINARY) annotation class E1 @RequiresOptIn(level = RequiresOptIn.Level.WARNING) diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/incorrectTargetsForExperimentalAnnotation.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/incorrectTargetsForExperimentalAnnotation.kt index 02ee045ffdd..4e6747fb202 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/incorrectTargetsForExperimentalAnnotation.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/incorrectTargetsForExperimentalAnnotation.kt @@ -8,6 +8,7 @@ import kotlin.annotation.AnnotationTarget.* @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) +@Retention(AnnotationRetention.BINARY) annotation class E1 @RequiresOptIn(level = RequiresOptIn.Level.WARNING) @@ -16,10 +17,10 @@ annotation class E2 @RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(EXPRESSION) -@Retention(AnnotationRetention.SOURCE) +@Retention(AnnotationRetention.SOURCE) annotation class E3 @RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(FILE, EXPRESSION) -@Retention(AnnotationRetention.SOURCE) +@Retention(AnnotationRetention.SOURCE) annotation class E4 diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/incorrectTargetsForExperimentalAnnotation.txt b/compiler/testData/diagnostics/testsWithStdLib/experimental/incorrectTargetsForExperimentalAnnotation.txt index 8ff5d4813e9..9883d6e56d2 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/incorrectTargetsForExperimentalAnnotation.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/incorrectTargetsForExperimentalAnnotation.txt @@ -2,7 +2,7 @@ package package api { - @kotlin.RequiresOptIn(level = Level.WARNING) @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.TYPE_PARAMETER, AnnotationTarget.PROPERTY, AnnotationTarget.FIELD, AnnotationTarget.LOCAL_VARIABLE, AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.TYPE, AnnotationTarget.TYPEALIAS}) public final annotation class E1 : kotlin.Annotation { + @kotlin.RequiresOptIn(level = Level.WARNING) @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.TYPE_PARAMETER, AnnotationTarget.PROPERTY, AnnotationTarget.FIELD, AnnotationTarget.LOCAL_VARIABLE, AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.TYPE, AnnotationTarget.TYPEALIAS}) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) public final annotation class E1 : kotlin.Annotation { public constructor E1() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/noRetentionAfter.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/noRetentionAfter.kt new file mode 100644 index 00000000000..c42d9533872 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/noRetentionAfter.kt @@ -0,0 +1,5 @@ +// FIR_IDENTICAL +// !USE_EXPERIMENTAL: kotlin.RequiresOptIn + +@RequiresOptIn +annotation class ExperimentalAPI diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/noRetentionAfter.txt b/compiler/testData/diagnostics/testsWithStdLib/experimental/noRetentionAfter.txt new file mode 100644 index 00000000000..a5fd23897cb --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/noRetentionAfter.txt @@ -0,0 +1,8 @@ +package + +@kotlin.RequiresOptIn public final annotation class ExperimentalAPI : kotlin.Annotation { + public constructor ExperimentalAPI() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/override.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/override.fir.kt index 7f7018f6131..4823abf57de 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/override.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/override.fir.kt @@ -4,6 +4,7 @@ package api @RequiresOptIn(level = RequiresOptIn.Level.WARNING) +@Retention(AnnotationRetention.BINARY) 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 4efe8120847..bbdce2d4bac 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/override.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/override.kt @@ -4,6 +4,7 @@ package api @RequiresOptIn(level = RequiresOptIn.Level.WARNING) +@Retention(AnnotationRetention.BINARY) annotation class E open class Base { diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/override.txt b/compiler/testData/diagnostics/testsWithStdLib/experimental/override.txt index 100b7f17435..7d0dc858c11 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/override.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/override.txt @@ -18,7 +18,7 @@ package api { public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } - @kotlin.RequiresOptIn(level = Level.WARNING) public final annotation class E : kotlin.Annotation { + @kotlin.RequiresOptIn(level = Level.WARNING) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) public final annotation class E : kotlin.Annotation { public constructor E() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/overrideDifferentExperimentalities.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/overrideDifferentExperimentalities.fir.kt index 7f515612f94..21816cf8471 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/overrideDifferentExperimentalities.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/overrideDifferentExperimentalities.fir.kt @@ -1,8 +1,11 @@ // !USE_EXPERIMENTAL: kotlin.RequiresOptIn @RequiresOptIn(level = RequiresOptIn.Level.WARNING) +@Retention(AnnotationRetention.BINARY) annotation class E1 + @RequiresOptIn(level = RequiresOptIn.Level.WARNING) +@Retention(AnnotationRetention.BINARY) annotation class E3 interface Base1 { diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/overrideDifferentExperimentalities.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/overrideDifferentExperimentalities.kt index ca364f1ad0a..ff6f0b2e990 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/overrideDifferentExperimentalities.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/overrideDifferentExperimentalities.kt @@ -1,8 +1,11 @@ // !USE_EXPERIMENTAL: kotlin.RequiresOptIn @RequiresOptIn(level = RequiresOptIn.Level.WARNING) +@Retention(AnnotationRetention.BINARY) annotation class E1 + @RequiresOptIn(level = RequiresOptIn.Level.WARNING) +@Retention(AnnotationRetention.BINARY) annotation class E3 interface Base1 { diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/overrideDifferentExperimentalities.txt b/compiler/testData/diagnostics/testsWithStdLib/experimental/overrideDifferentExperimentalities.txt index 67499a50027..16e0ede2b22 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/overrideDifferentExperimentalities.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/overrideDifferentExperimentalities.txt @@ -45,14 +45,14 @@ public final class DerivedC : Base1, Base2, Base3 { public open override /*3*/ /*fake_override*/ fun toString(): kotlin.String } -@kotlin.RequiresOptIn(level = Level.WARNING) public final annotation class E1 : kotlin.Annotation { +@kotlin.RequiresOptIn(level = Level.WARNING) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) public final annotation class E1 : kotlin.Annotation { public constructor E1() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } -@kotlin.RequiresOptIn(level = Level.WARNING) public final annotation class E3 : kotlin.Annotation { +@kotlin.RequiresOptIn(level = Level.WARNING) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) public final annotation class E3 : kotlin.Annotation { public constructor E3() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/topLevel.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/topLevel.fir.kt index f0c00e916e4..841aa99d113 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/topLevel.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/topLevel.fir.kt @@ -7,6 +7,7 @@ package api @RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.TYPE, AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.TYPEALIAS, AnnotationTarget.VALUE_PARAMETER) +@Retention(AnnotationRetention.BINARY) annotation class ExperimentalAPI @ExperimentalAPI diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/topLevel.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/topLevel.kt index f333ffb381b..08c54ae3220 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/topLevel.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/topLevel.kt @@ -7,6 +7,7 @@ package api @RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.TYPE, AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.TYPEALIAS, AnnotationTarget.VALUE_PARAMETER) +@Retention(AnnotationRetention.BINARY) annotation class ExperimentalAPI @ExperimentalAPI diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/topLevel.txt b/compiler/testData/diagnostics/testsWithStdLib/experimental/topLevel.txt index 9010130875f..2707a3a6fc4 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/topLevel.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/topLevel.txt @@ -4,7 +4,7 @@ package api { @api.ExperimentalAPI public val property: kotlin.String = "" @api.ExperimentalAPI public fun function(): kotlin.String - @kotlin.RequiresOptIn(level = Level.WARNING) @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.TYPE, AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.TYPEALIAS, AnnotationTarget.VALUE_PARAMETER}) public final annotation class ExperimentalAPI : kotlin.Annotation { + @kotlin.RequiresOptIn(level = Level.WARNING) @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.TYPE, AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.TYPEALIAS, AnnotationTarget.VALUE_PARAMETER}) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) public final annotation class ExperimentalAPI : kotlin.Annotation { public constructor ExperimentalAPI() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/typealias.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/typealias.fir.kt index 66d9461bcdf..8dbc8b6eb7d 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/typealias.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/typealias.fir.kt @@ -5,6 +5,7 @@ package api @RequiresOptIn @Target(AnnotationTarget.CLASS) +@Retention(AnnotationRetention.BINARY) annotation class ExperimentalAPI @ExperimentalAPI diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/typealias.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/typealias.kt index 8454f3ad510..7971d0a5ebc 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/typealias.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/typealias.kt @@ -5,6 +5,7 @@ package api @RequiresOptIn @Target(AnnotationTarget.CLASS) +@Retention(AnnotationRetention.BINARY) annotation class ExperimentalAPI @ExperimentalAPI diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/typealias.txt b/compiler/testData/diagnostics/testsWithStdLib/experimental/typealias.txt index b6c7a495ec0..16b4841739a 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/typealias.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/typealias.txt @@ -2,7 +2,7 @@ package package api { - @kotlin.RequiresOptIn @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS}) public final annotation class ExperimentalAPI : kotlin.Annotation { + @kotlin.RequiresOptIn @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS}) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) public final annotation class ExperimentalAPI : kotlin.Annotation { public constructor ExperimentalAPI() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/usageNotAsAnnotation.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/usageNotAsAnnotation.fir.kt index 9ad4047b48b..9d474cd8791 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/usageNotAsAnnotation.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/usageNotAsAnnotation.fir.kt @@ -15,6 +15,7 @@ import kotlin.RequiresOptIn // Usages with FQ names should be OK @kotlin.RequiresOptIn(level = kotlin.RequiresOptIn.Level.ERROR) +@Retention(AnnotationRetention.BINARY) annotation class M diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/usageNotAsAnnotation.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/usageNotAsAnnotation.kt index 32f2c326cb3..9f4b7280aa3 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/usageNotAsAnnotation.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/usageNotAsAnnotation.kt @@ -15,6 +15,7 @@ import kotlin.RequiresOptIn // Usages with FQ names should be OK @kotlin.RequiresOptIn(level = kotlin.RequiresOptIn.Level.ERROR) +@Retention(AnnotationRetention.BINARY) annotation class M diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/usageNotAsAnnotation.txt b/compiler/testData/diagnostics/testsWithStdLib/experimental/usageNotAsAnnotation.txt index 808449a8811..a0aa934274f 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/usageNotAsAnnotation.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/usageNotAsAnnotation.txt @@ -12,7 +12,7 @@ package test { public fun f8(): test.Marker? public fun f9(/*0*/ m: test.Marker0 /* = test.Marker */): kotlin.Unit - @kotlin.RequiresOptIn(level = Level.ERROR) public final annotation class M : kotlin.Annotation { + @kotlin.RequiresOptIn(level = Level.ERROR) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) public final annotation class M : kotlin.Annotation { public constructor M() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnFile.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnFile.fir.kt index 6c3a55b5a7c..cd69530b2bf 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnFile.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnFile.fir.kt @@ -5,10 +5,12 @@ package api @RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.FUNCTION) +@Retention(AnnotationRetention.BINARY) annotation class ExperimentalAPI1 @RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.FUNCTION) +@Retention(AnnotationRetention.BINARY) annotation class ExperimentalAPI2 @ExperimentalAPI1 diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnFile.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnFile.kt index 4b9a116a69d..a3ec21e0e38 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnFile.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnFile.kt @@ -5,10 +5,12 @@ package api @RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.FUNCTION) +@Retention(AnnotationRetention.BINARY) annotation class ExperimentalAPI1 @RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.FUNCTION) +@Retention(AnnotationRetention.BINARY) annotation class ExperimentalAPI2 @ExperimentalAPI1 diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnFile.txt b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnFile.txt index 4ff26cea44a..1860b8cae20 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnFile.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnFile.txt @@ -4,14 +4,14 @@ package api { @api.ExperimentalAPI1 public fun compilation(): kotlin.Unit @api.ExperimentalAPI2 public fun runtime(): kotlin.Unit - @kotlin.RequiresOptIn(level = Level.WARNING) @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.FUNCTION}) public final annotation class ExperimentalAPI1 : kotlin.Annotation { + @kotlin.RequiresOptIn(level = Level.WARNING) @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.FUNCTION}) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) public final annotation class ExperimentalAPI1 : kotlin.Annotation { public constructor ExperimentalAPI1() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } - @kotlin.RequiresOptIn(level = Level.WARNING) @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.FUNCTION}) public final annotation class ExperimentalAPI2 : kotlin.Annotation { + @kotlin.RequiresOptIn(level = Level.WARNING) @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.FUNCTION}) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) public final annotation class ExperimentalAPI2 : kotlin.Annotation { public constructor ExperimentalAPI2() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnFileWithVeryExperimentalMarker.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnFileWithVeryExperimentalMarker.kt index ed11e8a3a4c..03f2bd78bcf 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnFileWithVeryExperimentalMarker.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnFileWithVeryExperimentalMarker.kt @@ -5,10 +5,12 @@ package api @RequiresOptIn(level = RequiresOptIn.Level.WARNING) +@Retention(AnnotationRetention.BINARY) annotation class ExperimentalAPI @ExperimentalAPI @RequiresOptIn(level = RequiresOptIn.Level.WARNING) +@Retention(AnnotationRetention.BINARY) annotation class VeryExperimentalAPI @ExperimentalAPI diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnFileWithVeryExperimentalMarker.txt b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnFileWithVeryExperimentalMarker.txt index 6485db9b0eb..94788bbea68 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnFileWithVeryExperimentalMarker.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnFileWithVeryExperimentalMarker.txt @@ -4,14 +4,14 @@ package api { @api.ExperimentalAPI @api.VeryExperimentalAPI public fun f(): kotlin.Unit @api.ExperimentalAPI public fun g(): kotlin.Unit - @kotlin.RequiresOptIn(level = Level.WARNING) public final annotation class ExperimentalAPI : kotlin.Annotation { + @kotlin.RequiresOptIn(level = Level.WARNING) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) public final annotation class ExperimentalAPI : kotlin.Annotation { public constructor ExperimentalAPI() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } - @api.ExperimentalAPI @kotlin.RequiresOptIn(level = Level.WARNING) public final annotation class VeryExperimentalAPI : kotlin.Annotation { + @api.ExperimentalAPI @kotlin.RequiresOptIn(level = Level.WARNING) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) public final annotation class VeryExperimentalAPI : kotlin.Annotation { public constructor VeryExperimentalAPI() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnWholeModule.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnWholeModule.kt index 7f70e71b9ad..1048be83bcf 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnWholeModule.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnWholeModule.kt @@ -6,6 +6,7 @@ package api @RequiresOptIn(level = RequiresOptIn.Level.ERROR) +@Retention(AnnotationRetention.BINARY) annotation class ExperimentalAPI @ExperimentalAPI diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnWholeModule.txt b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnWholeModule.txt index a9e0900d491..36940feb62e 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnWholeModule.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalOnWholeModule.txt @@ -4,7 +4,7 @@ package package api { @api.ExperimentalAPI public fun function(): kotlin.String - @kotlin.RequiresOptIn(level = Level.ERROR) public final annotation class ExperimentalAPI : kotlin.Annotation { + @kotlin.RequiresOptIn(level = Level.ERROR) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) public final annotation class ExperimentalAPI : kotlin.Annotation { public constructor ExperimentalAPI() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalTargets.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalTargets.kt index 87c9b33e3dd..1cc03e5f142 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalTargets.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalTargets.kt @@ -7,6 +7,7 @@ package api @RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.CLASS) +@Retention(AnnotationRetention.BINARY) annotation class E @E diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalTargets.txt b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalTargets.txt index 53f8ce03a14..82fab52a65d 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalTargets.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalTargets.txt @@ -23,7 +23,7 @@ public final class Constructor { package api { - @kotlin.RequiresOptIn(level = Level.WARNING) @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS}) public final annotation class E : kotlin.Annotation { + @kotlin.RequiresOptIn(level = Level.WARNING) @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS}) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) public final annotation class E : kotlin.Annotation { public constructor E() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalWithSeveralAnnotations.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalWithSeveralAnnotations.fir.kt index 5aa9fee7d05..b0513efe4ba 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalWithSeveralAnnotations.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalWithSeveralAnnotations.fir.kt @@ -5,14 +5,17 @@ package api @RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.FUNCTION) +@Retention(AnnotationRetention.BINARY) annotation class E1 @RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.FUNCTION) +@Retention(AnnotationRetention.BINARY) annotation class E2 @RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.FUNCTION) +@Retention(AnnotationRetention.BINARY) annotation class E3 @E1 diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalWithSeveralAnnotations.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalWithSeveralAnnotations.kt index f649e7d0bf6..f68256bebaa 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalWithSeveralAnnotations.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalWithSeveralAnnotations.kt @@ -5,14 +5,17 @@ package api @RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.FUNCTION) +@Retention(AnnotationRetention.BINARY) annotation class E1 @RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.FUNCTION) +@Retention(AnnotationRetention.BINARY) annotation class E2 @RequiresOptIn(level = RequiresOptIn.Level.WARNING) @Target(AnnotationTarget.FUNCTION) +@Retention(AnnotationRetention.BINARY) annotation class E3 @E1 diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalWithSeveralAnnotations.txt b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalWithSeveralAnnotations.txt index 32a65a63c79..7ca1c8d60a9 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalWithSeveralAnnotations.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/useExperimentalWithSeveralAnnotations.txt @@ -5,21 +5,21 @@ package api { @api.E2 public fun e2(): kotlin.Unit @api.E3 public fun e3(): kotlin.Unit - @kotlin.RequiresOptIn(level = Level.WARNING) @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.FUNCTION}) public final annotation class E1 : kotlin.Annotation { + @kotlin.RequiresOptIn(level = Level.WARNING) @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.FUNCTION}) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) public final annotation class E1 : kotlin.Annotation { public constructor E1() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } - @kotlin.RequiresOptIn(level = Level.WARNING) @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.FUNCTION}) public final annotation class E2 : kotlin.Annotation { + @kotlin.RequiresOptIn(level = Level.WARNING) @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.FUNCTION}) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) public final annotation class E2 : kotlin.Annotation { public constructor E2() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } - @kotlin.RequiresOptIn(level = Level.WARNING) @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.FUNCTION}) public final annotation class E3 : kotlin.Annotation { + @kotlin.RequiresOptIn(level = Level.WARNING) @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.FUNCTION}) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) public final annotation class E3 : kotlin.Annotation { public constructor E3() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/wasExperimental.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/wasExperimental.fir.kt index 97b827d82f5..b63e7c53bb3 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/wasExperimental.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/wasExperimental.fir.kt @@ -7,6 +7,7 @@ fun newPublishedFun() {} @RequiresOptIn +@Retention(AnnotationRetention.BINARY) annotation class Marker @SinceKotlin("1.4") diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/wasExperimental.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/wasExperimental.kt index 19d9c9cb670..6cd6b051419 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/wasExperimental.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/wasExperimental.kt @@ -7,6 +7,7 @@ fun newPublishedFun() {} @RequiresOptIn +@Retention(AnnotationRetention.BINARY) annotation class Marker @SinceKotlin("1.4") diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/wasExperimental.txt b/compiler/testData/diagnostics/testsWithStdLib/experimental/wasExperimental.txt index 56181c45c5b..556be63c71b 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/wasExperimental.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/wasExperimental.txt @@ -7,7 +7,7 @@ public fun use1(/*0*/ c1: NewClassExperimentalInThePast, /*1*/ t1: TypeAliasToNe @kotlin.OptIn(markerClass = {Marker::class}) public fun use2(/*0*/ c2: NewClassExperimentalInThePast, /*1*/ t2: TypeAliasToNewClass /* = NewClassExperimentalInThePast */): kotlin.Unit @Marker public fun use3(/*0*/ c3: NewClassExperimentalInThePast, /*1*/ t3: TypeAliasToNewClass /* = NewClassExperimentalInThePast */): kotlin.Unit -@kotlin.RequiresOptIn public final annotation class Marker : kotlin.Annotation { +@kotlin.RequiresOptIn @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) public final annotation class Marker : kotlin.Annotation { public constructor Marker() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index 6d1c8af712b..58f8724969e 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -34423,6 +34423,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/incorrectUseExperimental.kt"); } + @Test + @TestMetadata("noRetentionAfter.kt") + public void testNoRetentionAfter() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/noRetentionAfter.kt"); + } + @Test @TestMetadata("override.kt") public void testOverride() throws Exception { diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.kt index f7ab0e3eaa7..60317aa1d6e 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.kt @@ -207,9 +207,11 @@ fun Annotated.isDocumentedAnnotation(): Boolean = annotations.findAnnotation(StandardNames.FqNames.mustBeDocumented) != null fun Annotated.getAnnotationRetention(): KotlinRetention? { - val retentionArgumentValue = - annotations.findAnnotation(StandardNames.FqNames.retention)?.allValueArguments?.get(RETENTION_PARAMETER_NAME) - as? EnumValue ?: return null + return annotations.findAnnotation(StandardNames.FqNames.retention)?.getAnnotationRetention() +} + +fun AnnotationDescriptor.getAnnotationRetention(): KotlinRetention? { + val retentionArgumentValue = allValueArguments[RETENTION_PARAMETER_NAME] as? EnumValue ?: return null val retentionArgumentValueName = retentionArgumentValue.enumEntryName.asString() return KotlinRetention.values().firstOrNull { it.name == retentionArgumentValueName } diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index 9c033c773ac..1889e7e197c 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -30141,6 +30141,11 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/incorrectUseExperimental.kt"); } + @TestMetadata("noRetentionAfter.kt") + public void testNoRetentionAfter() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/noRetentionAfter.kt"); + } + @TestMetadata("override.kt") public void testOverride() throws Exception { runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/override.kt");