From 7667b36aa088b479c2bf90d707814137b180b37f Mon Sep 17 00:00:00 2001 From: Nikita Bobko Date: Tue, 5 Sep 2023 16:20:52 +0200 Subject: [PATCH] KMP: Put "prohibit member scope mismatch for non-final expect" under the flag ^KT-61668 Fixed Review: https://jetbrains.team/p/kt/reviews/12062/timeline --- ...DiagnosticsWithLightTreeTestGenerated.java | 6 ++++++ ...endMPPDiagnosticsWithPsiTestGenerated.java | 6 ++++++ ...embersAsNonFinalExpectClassifierChecker.kt | 1 + .../memberScopeMismatch_oldLanguageVersion.kt | 19 +++++++++++++++++++ .../test/runners/DiagnosticTestGenerated.java | 6 ++++++ .../kotlin/config/LanguageVersionSettings.kt | 4 ++++ 6 files changed, 42 insertions(+) create mode 100644 compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/memberScopeMismatch_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 f1d322238a8..8563dfa249f 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 @@ -610,6 +610,12 @@ public class FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated extends Abst runTest("compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/injectVarargParameterOverload.kt"); } + @Test + @TestMetadata("memberScopeMismatch_oldLanguageVersion.kt") + public void testMemberScopeMismatch_oldLanguageVersion() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/memberScopeMismatch_oldLanguageVersion.kt"); + } + @Test @TestMetadata("nestedExpectOpenClass.kt") public void testNestedExpectOpenClass() 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 281c9a780af..84b1236ab00 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 @@ -610,6 +610,12 @@ public class FirOldFrontendMPPDiagnosticsWithPsiTestGenerated extends AbstractFi runTest("compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/injectVarargParameterOverload.kt"); } + @Test + @TestMetadata("memberScopeMismatch_oldLanguageVersion.kt") + public void testMemberScopeMismatch_oldLanguageVersion() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/memberScopeMismatch_oldLanguageVersion.kt"); + } + @Test @TestMetadata("nestedExpectOpenClass.kt") public void testNestedExpectOpenClass() throws Exception { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ActualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ActualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker.kt index 6e266e6d596..62622cac1c8 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ActualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ActualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker.kt @@ -25,6 +25,7 @@ import kotlin.contracts.contract object ActualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker : DeclarationChecker { override fun check(declaration: KtDeclaration, descriptor: DeclarationDescriptor, context: DeclarationCheckerContext) { + if (!context.languageVersionSettings.supportsFeature(LanguageFeature.MultiplatformRestrictions)) return val (actual, expect) = matchActualWithNonFinalExpect(declaration, descriptor, context) ?: return // The explicit casts won't be necessary when we start compiling kotlin with K2. K1 doesn't build CFG properly diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/memberScopeMismatch_oldLanguageVersion.kt b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/memberScopeMismatch_oldLanguageVersion.kt new file mode 100644 index 00000000000..4a30b3c8967 --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/memberScopeMismatch_oldLanguageVersion.kt @@ -0,0 +1,19 @@ +// FIR_IDENTICAL +// LANGUAGE: -MultiplatformRestrictions +// MODULE: m1-common +// FILE: common.kt + +expect open class Foo { + fun existingMethod() + val existingParam: Int +} + +// MODULE: m2-jvm()()(m1-common) +// FILE: jvm.kt + +actual open class Foo { + actual fun existingMethod() {} + actual val existingParam: Int = 904 + + fun injectedMethod() {} +} 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 6c57afb2ca6..93b68f81d4d 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 @@ -23605,6 +23605,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/injectVarargParameterOverload.kt"); } + @Test + @TestMetadata("memberScopeMismatch_oldLanguageVersion.kt") + public void testMemberScopeMismatch_oldLanguageVersion() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/memberScopeMismatch_oldLanguageVersion.kt"); + } + @Test @TestMetadata("nestedExpectOpenClass.kt") public void testNestedExpectOpenClass() 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 1a7cac7e282..7d9fa3d3ca0 100644 --- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt +++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt @@ -278,6 +278,10 @@ enum class LanguageFeature( ProhibitUsingNullableTypeParameterAgainstNotNullAnnotated(sinceVersion = KOTLIN_1_9), // KT-36770 NoSourceCodeInNotNullAssertionExceptions(KOTLIN_1_9, sinceApiVersion = ApiVersion.KOTLIN_1_4, kind = OTHER), // KT-57570 + // 1.9.20 KMP stabilization. Unfortunately, we don't have 1.9.20 LV. So LV=1.9 is the best we can do. + // At least there won't be false positives for 1.8 users + MultiplatformRestrictions(KOTLIN_1_9, kind = BUG_FIX), // KT-61668 + // End of 1.* language features -------------------------------------------------- // 2.0