From e742d43ee03ad61ee793ad7807816c666a857252 Mon Sep 17 00:00:00 2001 From: Nikita Bobko Date: Tue, 5 Sep 2023 16:15:47 +0200 Subject: [PATCH] KMP: Put "prohibit expect/actual tailrec/external" under the flag ^KT-61668 Fixed Review: https://jetbrains.team/p/kt/reviews/12062/timeline --- ...tendMPPDiagnosticsWithLightTreeTestGenerated.java | 12 ++++++++++++ ...ldFrontendMPPDiagnosticsWithPsiTestGenerated.java | 12 ++++++++++++ .../declaration/FirExpectActualDeclarationChecker.kt | 8 ++++++-- .../jetbrains/kotlin/resolve/DeclarationsChecker.kt | 8 +++++--- .../expectExternal_oldLanguageVersion.kt | 10 ++++++++++ .../expectTailrec_oldLanguageVersion.fir.kt | 9 +++++++++ .../expectTailrec_oldLanguageVersion.kt | 9 +++++++++ .../kotlin/test/runners/DiagnosticTestGenerated.java | 12 ++++++++++++ 8 files changed, 75 insertions(+), 5 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/multiplatform/expectExternal_oldLanguageVersion.kt create mode 100644 compiler/testData/diagnostics/tests/multiplatform/expectTailrec_oldLanguageVersion.fir.kt create mode 100644 compiler/testData/diagnostics/tests/multiplatform/expectTailrec_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 34c5637b12b..d52b450614f 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 @@ -145,6 +145,12 @@ public class FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated extends Abst runTest("compiler/testData/diagnostics/tests/multiplatform/expectExternal.kt"); } + @Test + @TestMetadata("expectExternal_oldLanguageVersion.kt") + public void testExpectExternal_oldLanguageVersion() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/expectExternal_oldLanguageVersion.kt"); + } + @Test @TestMetadata("expectInterfaceApplicability.kt") public void testExpectInterfaceApplicability() throws Exception { @@ -175,6 +181,12 @@ public class FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated extends Abst runTest("compiler/testData/diagnostics/tests/multiplatform/expectTailrec.kt"); } + @Test + @TestMetadata("expectTailrec_oldLanguageVersion.kt") + public void testExpectTailrec_oldLanguageVersion() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/expectTailrec_oldLanguageVersion.kt"); + } + @Test @TestMetadata("headerFunInNonHeaderClass.kt") public void testHeaderFunInNonHeaderClass() 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 d30b2816b61..0809793ffc2 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 @@ -145,6 +145,12 @@ public class FirOldFrontendMPPDiagnosticsWithPsiTestGenerated extends AbstractFi runTest("compiler/testData/diagnostics/tests/multiplatform/expectExternal.kt"); } + @Test + @TestMetadata("expectExternal_oldLanguageVersion.kt") + public void testExpectExternal_oldLanguageVersion() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/expectExternal_oldLanguageVersion.kt"); + } + @Test @TestMetadata("expectInterfaceApplicability.kt") public void testExpectInterfaceApplicability() throws Exception { @@ -175,6 +181,12 @@ public class FirOldFrontendMPPDiagnosticsWithPsiTestGenerated extends AbstractFi runTest("compiler/testData/diagnostics/tests/multiplatform/expectTailrec.kt"); } + @Test + @TestMetadata("expectTailrec_oldLanguageVersion.kt") + public void testExpectTailrec_oldLanguageVersion() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/expectTailrec_oldLanguageVersion.kt"); + } + @Test @TestMetadata("headerFunInNonHeaderClass.kt") public void testHeaderFunInNonHeaderClass() 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 4028bdaa33a..f262e65352b 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 @@ -76,7 +76,9 @@ object FirExpectActualDeclarationChecker : FirBasicDeclarationChecker() { if (declaration is FirProperty) { checkExpectPropertyAccessorsModifiers(declaration, context, reporter) } - if (declaration is FirFunction && declaration.isTailRec) { + if (context.languageVersionSettings.supportsFeature(LanguageFeature.MultiplatformRestrictions) && + declaration is FirFunction && declaration.isTailRec + ) { reporter.reportOn(declaration.source, FirErrors.EXPECTED_TAILREC_FUNCTION, context) } } @@ -108,7 +110,9 @@ object FirExpectActualDeclarationChecker : FirBasicDeclarationChecker() { context: CheckerContext, reporter: DiagnosticReporter, ) { - if (declaration.isExternal) { + if (context.languageVersionSettings.supportsFeature(LanguageFeature.MultiplatformRestrictions) && + declaration.isExternal + ) { reporter.reportOn(declaration.source, FirErrors.EXPECTED_EXTERNAL_DECLARATION, context) } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt index 948c466ecda..fd8f462c8bb 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt @@ -637,7 +637,7 @@ class DeclarationsChecker( } checkExpectDeclarationHasNoExternalModifier(declaration) - if (declaration is KtFunction) { + if (declaration is KtFunction && languageVersionSettings.supportsFeature(LanguageFeature.MultiplatformRestrictions)) { declaration.modifierList?.getModifier(KtTokens.TAILREC_KEYWORD)?.let { trace.report(EXPECTED_TAILREC_FUNCTION.on(it)) } @@ -645,8 +645,10 @@ class DeclarationsChecker( } private fun checkExpectDeclarationHasNoExternalModifier(declaration: KtDeclaration) { - declaration.modifierList?.getModifier(KtTokens.EXTERNAL_KEYWORD)?.let { - trace.report(EXPECTED_EXTERNAL_DECLARATION.on(it)) + if (languageVersionSettings.supportsFeature(LanguageFeature.MultiplatformRestrictions)) { + declaration.modifierList?.getModifier(KtTokens.EXTERNAL_KEYWORD)?.let { + trace.report(EXPECTED_EXTERNAL_DECLARATION.on(it)) + } } } diff --git a/compiler/testData/diagnostics/tests/multiplatform/expectExternal_oldLanguageVersion.kt b/compiler/testData/diagnostics/tests/multiplatform/expectExternal_oldLanguageVersion.kt new file mode 100644 index 00000000000..0c88e456742 --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/expectExternal_oldLanguageVersion.kt @@ -0,0 +1,10 @@ +// FIR_IDENTICAL +// LANGUAGE: -MultiplatformRestrictions +// MODULE: m1-common +// FILE: common.kt + +expect external fun foo() + +// MODULE: m1-jvm()()(m1-common) +// FILE: jvm.kt +actual external fun foo() diff --git a/compiler/testData/diagnostics/tests/multiplatform/expectTailrec_oldLanguageVersion.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/expectTailrec_oldLanguageVersion.fir.kt new file mode 100644 index 00000000000..beb82135171 --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/expectTailrec_oldLanguageVersion.fir.kt @@ -0,0 +1,9 @@ +// LANGUAGE: -MultiplatformRestrictions +// MODULE: m1-common +// FILE: common.kt + +expect tailrec fun foo(p: Int): Int + +// MODULE: m1-jvm()()(m1-common) +// FILE: jvm.kt +actual tailrec fun foo(p: Int): Int = foo(p) diff --git a/compiler/testData/diagnostics/tests/multiplatform/expectTailrec_oldLanguageVersion.kt b/compiler/testData/diagnostics/tests/multiplatform/expectTailrec_oldLanguageVersion.kt new file mode 100644 index 00000000000..01b3e99fcb1 --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/expectTailrec_oldLanguageVersion.kt @@ -0,0 +1,9 @@ +// LANGUAGE: -MultiplatformRestrictions +// MODULE: m1-common +// FILE: common.kt + +expect tailrec fun foo(p: Int): Int + +// MODULE: m1-jvm()()(m1-common) +// FILE: jvm.kt +actual tailrec fun foo(p: Int): Int = foo(p) 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 5680e8f9ce7..9f678c1dddb 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 @@ -23140,6 +23140,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/multiplatform/expectExternal.kt"); } + @Test + @TestMetadata("expectExternal_oldLanguageVersion.kt") + public void testExpectExternal_oldLanguageVersion() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/expectExternal_oldLanguageVersion.kt"); + } + @Test @TestMetadata("expectInterfaceApplicability.kt") public void testExpectInterfaceApplicability() throws Exception { @@ -23170,6 +23176,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/multiplatform/expectTailrec.kt"); } + @Test + @TestMetadata("expectTailrec_oldLanguageVersion.kt") + public void testExpectTailrec_oldLanguageVersion() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/expectTailrec_oldLanguageVersion.kt"); + } + @Test @TestMetadata("headerFunInNonHeaderClass.kt") public void testHeaderFunInNonHeaderClass() throws Exception {