From 62d2327ca35b8cb5c74fb5f1b74d67495579e1d3 Mon Sep 17 00:00:00 2001 From: Nikita Bobko Date: Mon, 6 Mar 2023 14:24:20 +0100 Subject: [PATCH] Don't issue a warning about expect/actual in the same module for incompatible expect/actual pairs ^KT-57067 Fixed Review: https://jetbrains.team/p/kt/reviews/9123 --- ...CompilerTestFE10TestdataTestGenerated.java | 6 ++++ ...eeOldFrontendDiagnosticsTestGenerated.java | 6 ++++ ...siOldFrontendDiagnosticsTestGenerated.java | 6 ++++ .../ExpectActualInTheSameModuleChecker.kt | 5 ++- .../ExpectedActualDeclarationChecker.kt | 8 ++--- ...ualInTheSameModuleIncompatibilities.fir.kt | 31 +++++++++++++++++++ ...dActualInTheSameModuleIncompatibilities.kt | 31 +++++++++++++++++++ .../test/runners/DiagnosticTestGenerated.java | 6 ++++ 8 files changed, 94 insertions(+), 5 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/multiplatform/hmpp/multiplatformCompositeAnalysis/expectAndActualInTheSameModuleIncompatibilities.fir.kt create mode 100644 compiler/testData/diagnostics/tests/multiplatform/hmpp/multiplatformCompositeAnalysis/expectAndActualInTheSameModuleIncompatibilities.kt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index 9592fdcbb33..ed7131fe392 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -22062,6 +22062,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/tests/multiplatform/hmpp/multiplatformCompositeAnalysis/expectAndActualInTheSameModule.kt"); } + @Test + @TestMetadata("expectAndActualInTheSameModuleIncompatibilities.kt") + public void testExpectAndActualInTheSameModuleIncompatibilities() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/hmpp/multiplatformCompositeAnalysis/expectAndActualInTheSameModuleIncompatibilities.kt"); + } + @Test @TestMetadata("intermediateWithActualAndExpect.kt") public void testIntermediateWithActualAndExpect() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java index f41592533c3..ca6622776dc 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java @@ -22062,6 +22062,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/tests/multiplatform/hmpp/multiplatformCompositeAnalysis/expectAndActualInTheSameModule.kt"); } + @Test + @TestMetadata("expectAndActualInTheSameModuleIncompatibilities.kt") + public void testExpectAndActualInTheSameModuleIncompatibilities() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/hmpp/multiplatformCompositeAnalysis/expectAndActualInTheSameModuleIncompatibilities.kt"); + } + @Test @TestMetadata("intermediateWithActualAndExpect.kt") public void testIntermediateWithActualAndExpect() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java index f32d3b2061a..e0b426e14b4 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java @@ -22068,6 +22068,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/tests/multiplatform/hmpp/multiplatformCompositeAnalysis/expectAndActualInTheSameModule.kt"); } + @Test + @TestMetadata("expectAndActualInTheSameModuleIncompatibilities.kt") + public void testExpectAndActualInTheSameModuleIncompatibilities() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/hmpp/multiplatformCompositeAnalysis/expectAndActualInTheSameModuleIncompatibilities.kt"); + } + @Test @TestMetadata("intermediateWithActualAndExpect.kt") public void testIntermediateWithActualAndExpect() throws Exception { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExpectActualInTheSameModuleChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExpectActualInTheSameModuleChecker.kt index a4b6aa6d44a..73f54ce9f49 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExpectActualInTheSameModuleChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExpectActualInTheSameModuleChecker.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.platform.isCommon import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtNamedDeclaration +import org.jetbrains.kotlin.resolve.checkers.ExpectedActualDeclarationChecker.Companion.isCompatibleOrWeakCompatible import org.jetbrains.kotlin.resolve.descriptorUtil.module import org.jetbrains.kotlin.resolve.multiplatform.ExpectedActualResolver import org.jetbrains.kotlin.resolve.multiplatform.isCommonSource @@ -27,7 +28,9 @@ object ExpectActualInTheSameModuleChecker : DeclarationChecker { // Only look for top level actual members; class members will be handled as a part of that expected class if (descriptor.containingDeclaration !is PackageFragmentDescriptor) return val module = descriptor.module - val actuals = ExpectedActualResolver.findActualForExpected(descriptor, module)?.flatMap { it.value } + val actuals = ExpectedActualResolver.findActualForExpected(descriptor, module) + ?.filter { (compatibility, _) -> compatibility.isCompatibleOrWeakCompatible() } + ?.flatMap { (_, members) -> members } ?.takeIf(List::isNotEmpty) ?: return // There are 4 cases: 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 012b3666f69..c20c5fe73fe 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExpectedActualDeclarationChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExpectedActualDeclarationChecker.kt @@ -329,10 +329,6 @@ class ExpectedActualDeclarationChecker( } } - private fun ExpectActualCompatibility.isCompatibleOrWeakCompatible() = - this is Compatible || - this is Incompatible && kind == IncompatibilityKind.WEAK - // we don't require `actual` modifier on // - annotation constructors, because annotation classes can only have one constructor // - inline class primary constructors, because inline class must have primary constructor @@ -399,6 +395,10 @@ class ExpectedActualDeclarationChecker( companion object { fun Map, Collection>.allStrongIncompatibilities(): Boolean = this.keys.all { it is Incompatible && it.kind == IncompatibilityKind.STRONG } + + internal fun ExpectActualCompatibility.isCompatibleOrWeakCompatible() = + this is Compatible || + this is Incompatible && kind == IncompatibilityKind.WEAK } } diff --git a/compiler/testData/diagnostics/tests/multiplatform/hmpp/multiplatformCompositeAnalysis/expectAndActualInTheSameModuleIncompatibilities.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/hmpp/multiplatformCompositeAnalysis/expectAndActualInTheSameModuleIncompatibilities.fir.kt new file mode 100644 index 00000000000..cafba300f0c --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/hmpp/multiplatformCompositeAnalysis/expectAndActualInTheSameModuleIncompatibilities.fir.kt @@ -0,0 +1,31 @@ +// MODULE: common +// TARGET_PLATFORM: Common + +expect fun parameterCount() +fun parameterCount(p: String) {} + +expect fun parameterCount2() +actual fun parameterCount2(p: String) {} + +expect fun callableKind(): Int +val callableKind: Int = 1 + +expect fun typeParameterCount() +fun typeParameterCount() {} + +expect enum class EnumEntries { + ONE, TWO; +} +actual enum class EnumEntries { + ONE; +} + +expect fun vararg(bar: Int) +fun vararg(vararg bar: Int) = Unit + +// MODULE: main()()(common) + +actual fun parameterCount() {} +actual fun typeParameterCount() {} +actual fun callableKind(): Int = 1 +actual fun vararg(bar: Int) = Unit diff --git a/compiler/testData/diagnostics/tests/multiplatform/hmpp/multiplatformCompositeAnalysis/expectAndActualInTheSameModuleIncompatibilities.kt b/compiler/testData/diagnostics/tests/multiplatform/hmpp/multiplatformCompositeAnalysis/expectAndActualInTheSameModuleIncompatibilities.kt new file mode 100644 index 00000000000..9e138499cb7 --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/hmpp/multiplatformCompositeAnalysis/expectAndActualInTheSameModuleIncompatibilities.kt @@ -0,0 +1,31 @@ +// MODULE: common +// TARGET_PLATFORM: Common + +expect fun parameterCount() +fun parameterCount(p: String) {} + +expect fun parameterCount2() +actual fun parameterCount2(p: String) {} + +expect fun callableKind(): Int +val callableKind: Int = 1 + +expect fun typeParameterCount() +fun typeParameterCount() {} + +expect enum class EnumEntries { + ONE, TWO; +} +actual enum class EnumEntries { + ONE; +} + +expect fun vararg(bar: Int) +fun vararg(vararg bar: Int) = Unit + +// MODULE: main()()(common) + +actual fun parameterCount() {} +actual fun typeParameterCount() {} +actual fun callableKind(): Int = 1 +actual fun vararg(bar: Int) = Unit 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 4685c0b2cad..75f2f83c574 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 @@ -22068,6 +22068,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/multiplatform/hmpp/multiplatformCompositeAnalysis/expectAndActualInTheSameModule.kt"); } + @Test + @TestMetadata("expectAndActualInTheSameModuleIncompatibilities.kt") + public void testExpectAndActualInTheSameModuleIncompatibilities() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/hmpp/multiplatformCompositeAnalysis/expectAndActualInTheSameModuleIncompatibilities.kt"); + } + @Test @TestMetadata("intermediateWithActualAndExpect.kt") public void testIntermediateWithActualAndExpect() throws Exception {