From 0922833b460a69e62168de94d0a27570d2ab4b00 Mon Sep 17 00:00:00 2001 From: Nikita Bobko Date: Tue, 5 Sep 2023 16:57:16 +0200 Subject: [PATCH] KMP: Put "prohbit actual typealias to Nothing and Nullable" under the flag ^KT-61668 Fixed Review: https://jetbrains.team/p/kt/reviews/12062/timeline --- ...PPDiagnosticsWithLightTreeTestGenerated.java | 12 ++++++++++++ ...ntendMPPDiagnosticsWithPsiTestGenerated.java | 12 ++++++++++++ .../declaration/FirActualTypeAliasChecker.kt | 17 ++++++++++------- .../kotlin/resolve/DeclarationsChecker.kt | 16 +++++++++------- ...TypealiasToNothing_oldLanguageVersion.fir.kt | 14 ++++++++++++++ ...tualTypealiasToNothing_oldLanguageVersion.kt | 14 ++++++++++++++ ...ypealiasToNullableType_oldLanguageVersion.kt | 15 +++++++++++++++ .../test/runners/DiagnosticTestGenerated.java | 12 ++++++++++++ 8 files changed, 98 insertions(+), 14 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/multiplatform/typealias/actualTypealiasToNothing_oldLanguageVersion.fir.kt create mode 100644 compiler/testData/diagnostics/tests/multiplatform/typealias/actualTypealiasToNothing_oldLanguageVersion.kt create mode 100644 compiler/testData/diagnostics/tests/multiplatform/typealias/actualTypealiasToNullableType_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 ba0f8e6b488..11896cdca51 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 @@ -1683,12 +1683,24 @@ public class FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated extends Abst runTest("compiler/testData/diagnostics/tests/multiplatform/typealias/actualTypealiasToNothing.kt"); } + @Test + @TestMetadata("actualTypealiasToNothing_oldLanguageVersion.kt") + public void testActualTypealiasToNothing_oldLanguageVersion() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/typealias/actualTypealiasToNothing_oldLanguageVersion.kt"); + } + @Test @TestMetadata("actualTypealiasToNullableType.kt") public void testActualTypealiasToNullableType() throws Exception { runTest("compiler/testData/diagnostics/tests/multiplatform/typealias/actualTypealiasToNullableType.kt"); } + @Test + @TestMetadata("actualTypealiasToNullableType_oldLanguageVersion.kt") + public void testActualTypealiasToNullableType_oldLanguageVersion() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/typealias/actualTypealiasToNullableType_oldLanguageVersion.kt"); + } + @Test public void testAllFilesPresentInTypealias() throws Exception { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/multiplatform/typealias"), Pattern.compile("^(.*)\\.kts?$"), Pattern.compile("^(.+)\\.(reversed|fir|ll)\\.kts?$"), TargetBackend.JVM_IR, true); 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 2251ca30f25..01925bae600 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 @@ -1683,12 +1683,24 @@ public class FirOldFrontendMPPDiagnosticsWithPsiTestGenerated extends AbstractFi runTest("compiler/testData/diagnostics/tests/multiplatform/typealias/actualTypealiasToNothing.kt"); } + @Test + @TestMetadata("actualTypealiasToNothing_oldLanguageVersion.kt") + public void testActualTypealiasToNothing_oldLanguageVersion() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/typealias/actualTypealiasToNothing_oldLanguageVersion.kt"); + } + @Test @TestMetadata("actualTypealiasToNullableType.kt") public void testActualTypealiasToNullableType() throws Exception { runTest("compiler/testData/diagnostics/tests/multiplatform/typealias/actualTypealiasToNullableType.kt"); } + @Test + @TestMetadata("actualTypealiasToNullableType_oldLanguageVersion.kt") + public void testActualTypealiasToNullableType_oldLanguageVersion() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/typealias/actualTypealiasToNullableType_oldLanguageVersion.kt"); + } + @Test public void testAllFilesPresentInTypealias() throws Exception { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/multiplatform/typealias"), Pattern.compile("^(.*)\\.kts?$"), Pattern.compile("^(.+)\\.(reversed|fir|ll)\\.kts?$"), TargetBackend.JVM_IR, true); diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirActualTypeAliasChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirActualTypeAliasChecker.kt index 2af0b3b8b4f..b78d9a211bc 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirActualTypeAliasChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirActualTypeAliasChecker.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.fir.analysis.checkers.declaration +import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.diagnostics.reportOn import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext @@ -62,14 +63,16 @@ object FirActualTypeAliasChecker : FirTypeAliasChecker() { reporter.reportOn(declaration.source, FirErrors.ACTUAL_TYPE_ALIAS_WITH_COMPLEX_SUBSTITUTION, context) } - @OptIn(UnexpandedTypeCheck::class) - // an earlier check ensures we have an ACTUAL_TYPE_ALIAS_NOT_TO_CLASS error on non-expanded type alias - if (expandedTypeRef.isNothing) { - reporter.reportOn(declaration.source, FirErrors.ACTUAL_TYPE_ALIAS_TO_NOTHING, context) - } + if (context.languageVersionSettings.supportsFeature(LanguageFeature.MultiplatformRestrictions)) { + @OptIn(UnexpandedTypeCheck::class) + // an earlier check ensures we have an ACTUAL_TYPE_ALIAS_NOT_TO_CLASS error on non-expanded type alias + if (expandedTypeRef.isNothing) { + reporter.reportOn(declaration.source, FirErrors.ACTUAL_TYPE_ALIAS_TO_NOTHING, context) + } - if (expandedTypeRef.isMarkedNullable == true) { - reporter.reportOn(declaration.source, FirErrors.ACTUAL_TYPE_ALIAS_TO_NULLABLE_TYPE, context) + if (expandedTypeRef.isMarkedNullable == true) { + reporter.reportOn(declaration.source, FirErrors.ACTUAL_TYPE_ALIAS_TO_NULLABLE_TYPE, context) + } } } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt index 85620158e06..948c466ecda 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt @@ -191,14 +191,16 @@ class DeclarationsChecker( return } - if (rhs.isNothing()) { - trace.report(ACTUAL_TYPE_ALIAS_TO_NOTHING.on(declaration)) - return - } + if (languageVersionSettings.supportsFeature(LanguageFeature.MultiplatformRestrictions)) { + if (rhs.isNothing()) { + trace.report(ACTUAL_TYPE_ALIAS_TO_NOTHING.on(declaration)) + return + } - if (rhs.isMarkedNullable) { - trace.report(ACTUAL_TYPE_ALIAS_TO_NULLABLE_TYPE.on(declaration)) - return + if (rhs.isMarkedNullable) { + trace.report(ACTUAL_TYPE_ALIAS_TO_NULLABLE_TYPE.on(declaration)) + return + } } } diff --git a/compiler/testData/diagnostics/tests/multiplatform/typealias/actualTypealiasToNothing_oldLanguageVersion.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/typealias/actualTypealiasToNothing_oldLanguageVersion.fir.kt new file mode 100644 index 00000000000..a39dbbb57e7 --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/typealias/actualTypealiasToNothing_oldLanguageVersion.fir.kt @@ -0,0 +1,14 @@ +// LANGUAGE: -MultiplatformRestrictions +// MODULE: m1-common +// FILE: common.kt + +expect class E01 +expect class E02 + +// MODULE: m1-jvm()()(m1-common) +// FILE: jvm.kt + +typealias MyNothing = Nothing + +actual typealias E01 = Nothing +actual typealias E02 = MyNothing diff --git a/compiler/testData/diagnostics/tests/multiplatform/typealias/actualTypealiasToNothing_oldLanguageVersion.kt b/compiler/testData/diagnostics/tests/multiplatform/typealias/actualTypealiasToNothing_oldLanguageVersion.kt new file mode 100644 index 00000000000..501cf8ae712 --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/typealias/actualTypealiasToNothing_oldLanguageVersion.kt @@ -0,0 +1,14 @@ +// LANGUAGE: -MultiplatformRestrictions +// MODULE: m1-common +// FILE: common.kt + +expect class E01 +expect class E02 + +// MODULE: m1-jvm()()(m1-common) +// FILE: jvm.kt + +typealias MyNothing = Nothing + +actual typealias E01 = Nothing +actual typealias E02 = MyNothing diff --git a/compiler/testData/diagnostics/tests/multiplatform/typealias/actualTypealiasToNullableType_oldLanguageVersion.kt b/compiler/testData/diagnostics/tests/multiplatform/typealias/actualTypealiasToNullableType_oldLanguageVersion.kt new file mode 100644 index 00000000000..ce078632895 --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/typealias/actualTypealiasToNullableType_oldLanguageVersion.kt @@ -0,0 +1,15 @@ +// LANGUAGE: -MultiplatformRestrictions +// FIR_IDENTICAL +// MODULE: m1-common +// FILE: common.kt + +expect class E01 +expect class E02 + +// MODULE: m1-jvm()()(m1-common) +// FILE: jvm.kt + +typealias MyNullable = String? + +actual typealias E01 = String? +actual typealias E02 = MyNullable 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 2e39d25bc55..5a7650fa69f 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 @@ -24678,12 +24678,24 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/multiplatform/typealias/actualTypealiasToNothing.kt"); } + @Test + @TestMetadata("actualTypealiasToNothing_oldLanguageVersion.kt") + public void testActualTypealiasToNothing_oldLanguageVersion() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/typealias/actualTypealiasToNothing_oldLanguageVersion.kt"); + } + @Test @TestMetadata("actualTypealiasToNullableType.kt") public void testActualTypealiasToNullableType() throws Exception { runTest("compiler/testData/diagnostics/tests/multiplatform/typealias/actualTypealiasToNullableType.kt"); } + @Test + @TestMetadata("actualTypealiasToNullableType_oldLanguageVersion.kt") + public void testActualTypealiasToNullableType_oldLanguageVersion() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/typealias/actualTypealiasToNullableType_oldLanguageVersion.kt"); + } + @Test public void testAllFilesPresentInTypealias() throws Exception { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/multiplatform/typealias"), Pattern.compile("^(.*)\\.kts?$"), Pattern.compile("^(.+)\\.(reversed|fir|ll)\\.kts?$"), true);