From 172c04c96a1343c728b3bd1cd9e4a04a6b224de1 Mon Sep 17 00:00:00 2001 From: Nikita Bobko Date: Tue, 5 Sep 2023 15:50:13 +0200 Subject: [PATCH] KMP: Put "prohibit expect actual OptIn annotations" under the flag ^KT-61668 Fixed Review: https://jetbrains.team/p/kt/reviews/12062/timeline --- ...DiagnosticsWithLightTreeTestGenerated.java | 6 ++++++ ...endMPPDiagnosticsWithPsiTestGenerated.java | 6 ++++++ .../FirExpectActualDeclarationChecker.kt | 3 ++- .../ExpectedActualDeclarationChecker.kt | 11 ++++++----- ...xpectOptInAnnotation_oldLanguageVersion.kt | 19 +++++++++++++++++++ .../test/runners/DiagnosticTestGenerated.java | 6 ++++++ 6 files changed, 45 insertions(+), 6 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/multiplatform/expectOptInAnnotation_oldLanguageVersion.kt diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated.java index 11896cdca51..34c5637b12b 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated.java @@ -163,6 +163,12 @@ public class FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated extends Abst runTest("compiler/testData/diagnostics/tests/multiplatform/expectOptInAnnotation.kt"); } + @Test + @TestMetadata("expectOptInAnnotation_oldLanguageVersion.kt") + public void testExpectOptInAnnotation_oldLanguageVersion() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/expectOptInAnnotation_oldLanguageVersion.kt"); + } + @Test @TestMetadata("expectTailrec.kt") public void testExpectTailrec() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithPsiTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithPsiTestGenerated.java index 01925bae600..d30b2816b61 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithPsiTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithPsiTestGenerated.java @@ -163,6 +163,12 @@ public class FirOldFrontendMPPDiagnosticsWithPsiTestGenerated extends AbstractFi runTest("compiler/testData/diagnostics/tests/multiplatform/expectOptInAnnotation.kt"); } + @Test + @TestMetadata("expectOptInAnnotation_oldLanguageVersion.kt") + public void testExpectOptInAnnotation_oldLanguageVersion() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/expectOptInAnnotation_oldLanguageVersion.kt"); + } + @Test @TestMetadata("expectTailrec.kt") public void testExpectTailrec() throws Exception { diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExpectActualDeclarationChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExpectActualDeclarationChecker.kt index 581ec55a160..4028bdaa33a 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExpectActualDeclarationChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExpectActualDeclarationChecker.kt @@ -291,7 +291,8 @@ object FirExpectActualDeclarationChecker : FirBasicDeclarationChecker() { context: CheckerContext, reporter: DiagnosticReporter, ) { - if (declaration is FirClass && + if (context.languageVersionSettings.supportsFeature(LanguageFeature.MultiplatformRestrictions) && + declaration is FirClass && declaration.classKind == ClassKind.ANNOTATION_CLASS && !expectDeclarationSymbol.hasAnnotation(StandardClassIds.Annotations.OptionalExpectation, context.session) && declaration.hasAnnotation(OptInNames.REQUIRES_OPT_IN_CLASS_ID, context.session) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExpectedActualDeclarationChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExpectedActualDeclarationChecker.kt index 8d7c2c1d365..67094adc650 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExpectedActualDeclarationChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExpectedActualDeclarationChecker.kt @@ -70,7 +70,7 @@ class ExpectedActualDeclarationChecker( declaration, descriptor, context.trace, checkActualModifier, context ) - checkOptInAnnotation(declaration, descriptor, descriptor, context.trace) + checkOptInAnnotation(declaration, descriptor, descriptor, context) } if (descriptor.isActualOrSomeContainerIsActual()) { val allDependsOnModules = moduleStructureOracle.findAllDependsOnPaths(descriptor.module).flatMap { it.nodes }.toHashSet() @@ -376,7 +376,7 @@ class ExpectedActualDeclarationChecker( if (expectedConstructor != null && actualConstructor != null) { checkAnnotationConstructors(expectedConstructor, actualConstructor, trace, reportOn) } - checkOptInAnnotation(reportOn, descriptor, expected, trace) + checkOptInAnnotation(reportOn, descriptor, expected, context) } } // We want to report errors even if a candidate is incompatible, but it's single @@ -475,14 +475,15 @@ class ExpectedActualDeclarationChecker( reportOn: KtNamedDeclaration, descriptor: MemberDescriptor, expectDescriptor: MemberDescriptor, - trace: BindingTrace, + context: DeclarationCheckerContext, ) { - if (descriptor is ClassDescriptor && + if (context.languageVersionSettings.supportsFeature(LanguageFeature.MultiplatformRestrictions) && + descriptor is ClassDescriptor && descriptor.kind == ClassKind.ANNOTATION_CLASS && descriptor.annotations.hasAnnotation(OptInNames.REQUIRES_OPT_IN_FQ_NAME) && !expectDescriptor.annotations.hasAnnotation(OptionalAnnotationUtil.OPTIONAL_EXPECTATION_FQ_NAME) ) { - trace.report(Errors.EXPECT_ACTUAL_OPT_IN_ANNOTATION.on(reportOn)) + context.trace.report(Errors.EXPECT_ACTUAL_OPT_IN_ANNOTATION.on(reportOn)) } } diff --git a/compiler/testData/diagnostics/tests/multiplatform/expectOptInAnnotation_oldLanguageVersion.kt b/compiler/testData/diagnostics/tests/multiplatform/expectOptInAnnotation_oldLanguageVersion.kt new file mode 100644 index 00000000000..d5283136b80 --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/expectOptInAnnotation_oldLanguageVersion.kt @@ -0,0 +1,19 @@ +// FIR_IDENTICAL +// LANGUAGE: -MultiplatformRestrictions +// WITH_STDLIB +// MODULE: m1-common +// FILE: common.kt +@file:OptIn(ExperimentalMultiplatform::class) + +expect annotation class ActualOnly + +@RequiresOptIn +expect annotation class Both + +// MODULE: m1-jvm()()(m1-common) +// FILE: jvm.kt +@RequiresOptIn +actual annotation class ActualOnly + +@RequiresOptIn +actual annotation class Both 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 5a7650fa69f..5680e8f9ce7 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 @@ -23158,6 +23158,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/multiplatform/expectOptInAnnotation.kt"); } + @Test + @TestMetadata("expectOptInAnnotation_oldLanguageVersion.kt") + public void testExpectOptInAnnotation_oldLanguageVersion() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/expectOptInAnnotation_oldLanguageVersion.kt"); + } + @Test @TestMetadata("expectTailrec.kt") public void testExpectTailrec() throws Exception {