From 1aeefe6c331cff6cef23d5f6ca2ba87c0d7cebf0 Mon Sep 17 00:00:00 2001 From: Nikita Bobko Date: Fri, 1 Dec 2023 16:21:01 +0100 Subject: [PATCH] [FIR] Don't traverse expect hierarchy to check DefaultArgumentsInExpectActualizedByFakeOverride ^KT-63860 Fixed Review: https://jetbrains.team/p/kt/reviews/13334/timeline The previous code was nonsense (I wrote it). It doesn't make sense to subtract actualOverriddenDeclarations from expectOverriddenDeclarations. Default parameters are mentioned on the expect side. So default params in expect/actual supertypes won't be subtracted from expectOverriddenDeclarations (but should be) --- ...CompilerTestFE10TestdataTestGenerated.java | 12 +++++++++ ...sticCompilerFE10TestDataTestGenerated.java | 12 +++++++++ ...DiagnosticsWithLightTreeTestGenerated.java | 12 +++++++++ ...endMPPDiagnosticsWithPsiTestGenerated.java | 12 +++++++++ .../calls/mpp/AbstractExpectActualChecker.kt | 17 ++++++------ .../tests/multiplatform/kt63860.kt | 26 +++++++++++++++++++ .../tests/multiplatform/kt63860_2.kt | 26 +++++++++++++++++++ .../test/runners/DiagnosticTestGenerated.java | 12 +++++++++ 8 files changed, 121 insertions(+), 8 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/multiplatform/kt63860.kt create mode 100644 compiler/testData/diagnostics/tests/multiplatform/kt63860_2.kt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java index ff60bda04c3..e68cc3e83a0 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java @@ -24066,6 +24066,18 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/multiplatform/kt60902.kt"); } + @Test + @TestMetadata("kt63860.kt") + public void testKt63860() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/kt63860.kt"); + } + + @Test + @TestMetadata("kt63860_2.kt") + public void testKt63860_2() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/kt63860_2.kt"); + } + @Test @TestMetadata("manyImplMemberNotImplemented.kt") public void testManyImplMemberNotImplemented() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java index 0b812e9982c..99f3f067e19 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java @@ -24066,6 +24066,18 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/multiplatform/kt60902.kt"); } + @Test + @TestMetadata("kt63860.kt") + public void testKt63860() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/kt63860.kt"); + } + + @Test + @TestMetadata("kt63860_2.kt") + public void testKt63860_2() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/kt63860_2.kt"); + } + @Test @TestMetadata("manyImplMemberNotImplemented.kt") public void testManyImplMemberNotImplemented() throws Exception { 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 a31da5151b1..8fc23bd866f 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 @@ -313,6 +313,18 @@ public class FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated extends Abst runTest("compiler/testData/diagnostics/tests/multiplatform/kt60902.kt"); } + @Test + @TestMetadata("kt63860.kt") + public void testKt63860() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/kt63860.kt"); + } + + @Test + @TestMetadata("kt63860_2.kt") + public void testKt63860_2() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/kt63860_2.kt"); + } + @Test @TestMetadata("manyImplMemberNotImplemented.kt") public void testManyImplMemberNotImplemented() 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 42aff062c05..659de132cc8 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 @@ -313,6 +313,18 @@ public class FirOldFrontendMPPDiagnosticsWithPsiTestGenerated extends AbstractFi runTest("compiler/testData/diagnostics/tests/multiplatform/kt60902.kt"); } + @Test + @TestMetadata("kt63860.kt") + public void testKt63860() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/kt63860.kt"); + } + + @Test + @TestMetadata("kt63860_2.kt") + public void testKt63860_2() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/kt63860_2.kt"); + } + @Test @TestMetadata("manyImplMemberNotImplemented.kt") public void testManyImplMemberNotImplemented() throws Exception { diff --git a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/mpp/AbstractExpectActualChecker.kt b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/mpp/AbstractExpectActualChecker.kt index 0e7adabd6e6..d5cd1123a25 100644 --- a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/mpp/AbstractExpectActualChecker.kt +++ b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/mpp/AbstractExpectActualChecker.kt @@ -373,20 +373,21 @@ object AbstractExpectActualChecker { // "parameters" checks are required only for functions, because only functions can have parameters actualDeclaration is FunctionSymbolMarker && expectDeclaration is FunctionSymbolMarker ) { - val expectOverriddenDeclarations = - expectDeclaration.allRecursivelyOverriddenDeclarationsIncludingSelf(expectContainingClass).toSet() - val actualOverriddenDeclarations = - actualDeclaration.allRecursivelyOverriddenDeclarationsIncludingSelf(actualContainingClass).toSet() if (languageVersionSettings.supportsFeature(LanguageFeature.ProhibitDefaultArgumentsInExpectActualizedByFakeOverride) && + // If expect declaration is a fake-override then default params came from common + // supertypes of actual class and expect class. It's a valid code. + !expectDeclaration.isFakeOverride(expectContainingClass) && (actualDeclaration.isFakeOverride(actualContainingClass) || actualDeclaration.isDelegatedMember) && - // If default params came from common supertypes of actual class and expect class then it's a valid code. - // Here we filter out such default params. - (expectOverriddenDeclarations - actualOverriddenDeclarations).flatMap { it.valueParameters } - .any { it.hasDefaultValueNonRecursive } + expectDeclaration.valueParameters.any { it.hasDefaultValueNonRecursive } ) { return ExpectActualCheckingCompatibility.DefaultArgumentsInExpectActualizedByFakeOverride } + val expectOverriddenDeclarations = + expectDeclaration.allRecursivelyOverriddenDeclarationsIncludingSelf(expectContainingClass).toSet() + val actualOverriddenDeclarations = + actualDeclaration.allRecursivelyOverriddenDeclarationsIncludingSelf(actualContainingClass) + // Actual annotation constructors can have default argument values; their consistency with arguments in the expected annotation // is checked in ExpectedActualDeclarationChecker.checkAnnotationConstructors if (!actualDeclaration.isAnnotationConstructor() && diff --git a/compiler/testData/diagnostics/tests/multiplatform/kt63860.kt b/compiler/testData/diagnostics/tests/multiplatform/kt63860.kt new file mode 100644 index 00000000000..97869a300ad --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/kt63860.kt @@ -0,0 +1,26 @@ +// FIR_IDENTICAL +// MODULE: m1-common +// FILE: common.kt + +expect interface SdkBufferedSink { + public fun write(arg: String = "default") +} + +abstract class AbstractBufferedSinkAdapter() : SdkBufferedSink { + override fun write(arg: String) { + } +} + +expect class BufferedSinkAdapter() : SdkBufferedSink { + override fun write(arg: String) +} + +// MODULE: m2-jvm()()(m1-common) +// FILE: jvm.kt + +actual interface SdkBufferedSink { + public actual fun write(arg: String): Unit +} + +actual class BufferedSinkAdapter actual constructor() : AbstractBufferedSinkAdapter(), SdkBufferedSink { +} diff --git a/compiler/testData/diagnostics/tests/multiplatform/kt63860_2.kt b/compiler/testData/diagnostics/tests/multiplatform/kt63860_2.kt new file mode 100644 index 00000000000..d723064224a --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/kt63860_2.kt @@ -0,0 +1,26 @@ +// FIR_IDENTICAL +// MODULE: m1-common +// FILE: common.kt + +expect interface SdkBufferedSink { + public fun write(arg: String = "default") +} + +abstract class AbstractBufferedSinkAdapter() { + fun write(arg: String) { + } +} + +expect class BufferedSinkAdapter() : SdkBufferedSink { + override fun write(arg: String) +} + +// MODULE: m2-jvm()()(m1-common) +// FILE: jvm.kt + +actual interface SdkBufferedSink { + public actual fun write(arg: String): Unit +} + +actual class BufferedSinkAdapter actual constructor() : AbstractBufferedSinkAdapter(), SdkBufferedSink { +} 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 51ec04892dd..c52776e552a 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 @@ -24066,6 +24066,18 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/multiplatform/kt60902.kt"); } + @Test + @TestMetadata("kt63860.kt") + public void testKt63860() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/kt63860.kt"); + } + + @Test + @TestMetadata("kt63860_2.kt") + public void testKt63860_2() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/kt63860_2.kt"); + } + @Test @TestMetadata("manyImplMemberNotImplemented.kt") public void testManyImplMemberNotImplemented() throws Exception {