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 a0bb84949a1..ef209e6a011 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 @@ -34513,6 +34513,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/errors.kt"); } + @Test + @TestMetadata("experimentalAfterRelease.kt") + public void testExperimentalAfterRelease() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/experimentalAfterRelease.kt"); + } + @Test @TestMetadata("experimentalAnnotationOnConstructorProperty.kt") public void testExperimentalAnnotationOnConstructorProperty() 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 6329370d77e..8736daf741f 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 @@ -34513,6 +34513,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/errors.kt"); } + @Test + @TestMetadata("experimentalAfterRelease.kt") + public void testExperimentalAfterRelease() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/experimentalAfterRelease.kt"); + } + @Test @TestMetadata("experimentalAnnotationOnConstructorProperty.kt") public void testExperimentalAnnotationOnConstructorProperty() throws Exception { diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirOptInAnnotationCallChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirOptInAnnotationCallChecker.kt index 7a86860492f..181731d42a2 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirOptInAnnotationCallChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirOptInAnnotationCallChecker.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.fir.analysis.checkers.expression import org.jetbrains.kotlin.config.AnalysisFlags +import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.extractClassesFromArgument @@ -55,8 +56,11 @@ object FirOptInAnnotationCallChecker : FirAnnotationCallChecker() { context: CheckerContext, reporter: DiagnosticReporter ) { - val useExperimentalFqNames = context.session.languageVersionSettings.getFlag(AnalysisFlags.useExperimental) - if (OptInNames.REQUIRES_OPT_IN_FQ_NAME.asString() !in useExperimentalFqNames) { + val languageVersionSettings = context.session.languageVersionSettings + val useExperimentalFqNames = languageVersionSettings.getFlag(AnalysisFlags.useExperimental) + if (!languageVersionSettings.supportsFeature(LanguageFeature.OptInRelease) && + OptInNames.REQUIRES_OPT_IN_FQ_NAME.asString() !in useExperimentalFqNames + ) { reporter.reportOn(element, FirErrors.EXPERIMENTAL_IS_NOT_ENABLED, context) } } 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 604332394f1..1e8d56627fe 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExperimentalUsageChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExperimentalUsageChecker.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.resolve.checkers import com.intellij.openapi.project.Project import com.intellij.psi.PsiElement import org.jetbrains.kotlin.config.AnalysisFlags +import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.diagnostics.DiagnosticFactory2 @@ -404,7 +405,8 @@ class ExperimentalUsageChecker(project: Project) : CallChecker { private fun checkUsageOfKotlinExperimentalOrUseExperimental(element: PsiElement, context: CheckerContext) { val useExperimentalFqNames = context.languageVersionSettings.getFlag(AnalysisFlags.useExperimental) - if (REQUIRES_OPT_IN_FQ_NAME.asString() !in useExperimentalFqNames && + if (!context.languageVersionSettings.supportsFeature(LanguageFeature.OptInRelease) && + REQUIRES_OPT_IN_FQ_NAME.asString() !in useExperimentalFqNames && OLD_EXPERIMENTAL_FQ_NAME.asString() !in useExperimentalFqNames ) { context.trace.report(Errors.EXPERIMENTAL_IS_NOT_ENABLED.on(element)) diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/experimentalAfterRelease.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/experimentalAfterRelease.kt new file mode 100644 index 00000000000..871a85a34d9 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/experimentalAfterRelease.kt @@ -0,0 +1,6 @@ +// FIR_IDENTICAL +// !LANGUAGE: +OptInRelease + +@RequiresOptIn +@Retention(AnnotationRetention.BINARY) +annotation class Marker diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/experimentalAfterRelease.txt b/compiler/testData/diagnostics/testsWithStdLib/experimental/experimentalAfterRelease.txt new file mode 100644 index 00000000000..a669df9d2ac --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/experimentalAfterRelease.txt @@ -0,0 +1,8 @@ +package + +@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 + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} 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 b0dae78ad3d..34ef749cadc 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 @@ -34609,6 +34609,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/errors.kt"); } + @Test + @TestMetadata("experimentalAfterRelease.kt") + public void testExperimentalAfterRelease() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/experimentalAfterRelease.kt"); + } + @Test @TestMetadata("experimentalAnnotationOnConstructorProperty.kt") public void testExperimentalAnnotationOnConstructorProperty() throws Exception { diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt index 403ea19ba20..c9158937dda 100644 --- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt +++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt @@ -214,6 +214,7 @@ enum class LanguageFeature( SafeCallsAreAlwaysNullable(KOTLIN_1_6), ProhibitSimplificationOfNonTrivialConstBooleanExpressions(KOTLIN_1_6), TypeInferenceOnCallsWithSelfTypes(KOTLIN_1_6), + OptInRelease(KOTLIN_1_6), // Temporarily disabled, see KT-27084/KT-22379 SoundSmartcastFromLoopConditionForLoopAssignedVariables(sinceVersion = null, kind = BUG_FIX), 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 99a63dafca6..9044aa6759e 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 @@ -34513,6 +34513,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/errors.kt"); } + @Test + @TestMetadata("experimentalAfterRelease.kt") + public void testExperimentalAfterRelease() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/experimentalAfterRelease.kt"); + } + @Test @TestMetadata("experimentalAnnotationOnConstructorProperty.kt") public void testExperimentalAnnotationOnConstructorProperty() throws Exception {