From 141bc9cac95eb257fb5db29aa484afe0c0690f15 Mon Sep 17 00:00:00 2001 From: Nikita Bobko Date: Tue, 5 Sep 2023 16:53:22 +0200 Subject: [PATCH] KMP: Put "prohbit actual typealias if expect has default params" under the flag ^KT-61668 Fixed Review: https://jetbrains.team/p/kt/reviews/12062/timeline --- ...PPDiagnosticsWithLightTreeTestGenerated.java | 6 ++++++ ...ntendMPPDiagnosticsWithPsiTestGenerated.java | 6 ++++++ .../FirExpectActualDeclarationChecker.kt | 1 + .../ExpectedActualDeclarationChecker.kt | 7 ++++--- ...ArgsViaActualTypealias_oldLanguageVersion.kt | 17 +++++++++++++++++ .../test/runners/DiagnosticTestGenerated.java | 6 ++++++ 6 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/multiplatform/defaultArguments/methodDefaultArgsViaActualTypealias_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 5ef2fa555d7..ba0f8e6b488 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 @@ -999,6 +999,12 @@ public class FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated extends Abst public void testMethodDefaultArgsViaActualTypealias() throws Exception { runTest("compiler/testData/diagnostics/tests/multiplatform/defaultArguments/methodDefaultArgsViaActualTypealias.kt"); } + + @Test + @TestMetadata("methodDefaultArgsViaActualTypealias_oldLanguageVersion.kt") + public void testMethodDefaultArgsViaActualTypealias_oldLanguageVersion() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/defaultArguments/methodDefaultArgsViaActualTypealias_oldLanguageVersion.kt"); + } } @Nested 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 1c3c26b0bf9..2251ca30f25 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 @@ -999,6 +999,12 @@ public class FirOldFrontendMPPDiagnosticsWithPsiTestGenerated extends AbstractFi public void testMethodDefaultArgsViaActualTypealias() throws Exception { runTest("compiler/testData/diagnostics/tests/multiplatform/defaultArguments/methodDefaultArgsViaActualTypealias.kt"); } + + @Test + @TestMetadata("methodDefaultArgsViaActualTypealias_oldLanguageVersion.kt") + public void testMethodDefaultArgsViaActualTypealias_oldLanguageVersion() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/defaultArguments/methodDefaultArgsViaActualTypealias_oldLanguageVersion.kt"); + } } @Nested 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 b400b0814c6..581ec55a160 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 @@ -231,6 +231,7 @@ object FirExpectActualDeclarationChecker : FirBasicDeclarationChecker() { context: CheckerContext, reporter: DiagnosticReporter, ) { + if (!context.languageVersionSettings.supportsFeature(LanguageFeature.MultiplatformRestrictions)) return if (expectSymbol !is FirClassSymbol || actualSymbol !is FirTypeAliasSymbol || expectSymbol.classKind == ClassKind.ANNOTATION_CLASS 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 48f7abb0ecd..8d7c2c1d365 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExpectedActualDeclarationChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExpectedActualDeclarationChecker.kt @@ -241,8 +241,9 @@ class ExpectedActualDeclarationChecker( private fun checkIfExpectHasDefaultArgumentsAndActualizedWithTypealias( expectDescriptor: MemberDescriptor, actualDeclaration: KtNamedDeclaration, - trace: BindingTrace, + context: DeclarationCheckerContext, ) { + if (!context.languageVersionSettings.supportsFeature(LanguageFeature.MultiplatformRestrictions)) return if (expectDescriptor !is ClassDescriptor || actualDeclaration !is KtTypeAlias || expectDescriptor.kind == ClassKind.ANNOTATION_CLASS @@ -257,7 +258,7 @@ class ExpectedActualDeclarationChecker( if (membersWithDefaultValueParameters.isEmpty()) return - trace.report( + context.trace.report( Errors.DEFAULT_ARGUMENTS_IN_EXPECT_WITH_ACTUAL_TYPEALIAS.on( actualDeclaration, expectDescriptor, @@ -381,7 +382,7 @@ class ExpectedActualDeclarationChecker( // We want to report errors even if a candidate is incompatible, but it's single val expectSingleCandidate = (compatibility[Compatible] ?: compatibility.values.singleOrNull())?.singleOrNull() if (expectSingleCandidate != null) { - checkIfExpectHasDefaultArgumentsAndActualizedWithTypealias(expectSingleCandidate, reportOn, trace) + checkIfExpectHasDefaultArgumentsAndActualizedWithTypealias(expectSingleCandidate, reportOn, context) checkAnnotationsMatch(expectSingleCandidate, descriptor, reportOn, context) } } diff --git a/compiler/testData/diagnostics/tests/multiplatform/defaultArguments/methodDefaultArgsViaActualTypealias_oldLanguageVersion.kt b/compiler/testData/diagnostics/tests/multiplatform/defaultArguments/methodDefaultArgsViaActualTypealias_oldLanguageVersion.kt new file mode 100644 index 00000000000..e9bc1c6e42e --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/defaultArguments/methodDefaultArgsViaActualTypealias_oldLanguageVersion.kt @@ -0,0 +1,17 @@ +// FIR_IDENTICAL +// !DIAGNOSTICS: -ACTUAL_WITHOUT_EXPECT +// LANGUAGE: -MultiplatformRestrictions +// MODULE: m1-common +// FILE: common.kt +expect class A { + fun foo(p: String = "common") +} + +// MODULE: m2-jvm()()(m1-common) +// FILE: jvm.kt + +class AImpl { + fun foo(p: String) {} +} + +actual typealias A = AImpl 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 0be7ca8e931..2e39d25bc55 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 @@ -23994,6 +23994,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { public void testMethodDefaultArgsViaActualTypealias() throws Exception { runTest("compiler/testData/diagnostics/tests/multiplatform/defaultArguments/methodDefaultArgsViaActualTypealias.kt"); } + + @Test + @TestMetadata("methodDefaultArgsViaActualTypealias_oldLanguageVersion.kt") + public void testMethodDefaultArgsViaActualTypealias_oldLanguageVersion() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/defaultArguments/methodDefaultArgsViaActualTypealias_oldLanguageVersion.kt"); + } } @Nested