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 c7adcf6b8b7..6943d51aa42 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 @@ -26681,6 +26681,18 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/multiplatform/hmpp/ambiguousActuals.kt"); } + @Test + @TestMetadata("hmppRedeclaration.kt") + public void testHmppRedeclaration() { + runTest("compiler/testData/diagnostics/tests/multiplatform/hmpp/hmppRedeclaration.kt"); + } + + @Test + @TestMetadata("hmppRedeclarationWithExpectActualPair.kt") + public void testHmppRedeclarationWithExpectActualPair() { + runTest("compiler/testData/diagnostics/tests/multiplatform/hmpp/hmppRedeclarationWithExpectActualPair.kt"); + } + @Test @TestMetadata("intermediateActualHasAdditionalSupertypes.kt") public void testIntermediateActualHasAdditionalSupertypes() { 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 47fe52a522e..84570012a76 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 @@ -26681,6 +26681,18 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/multiplatform/hmpp/ambiguousActuals.kt"); } + @Test + @TestMetadata("hmppRedeclaration.kt") + public void testHmppRedeclaration() { + runTest("compiler/testData/diagnostics/tests/multiplatform/hmpp/hmppRedeclaration.kt"); + } + + @Test + @TestMetadata("hmppRedeclarationWithExpectActualPair.kt") + public void testHmppRedeclarationWithExpectActualPair() { + runTest("compiler/testData/diagnostics/tests/multiplatform/hmpp/hmppRedeclarationWithExpectActualPair.kt"); + } + @Test @TestMetadata("intermediateActualHasAdditionalSupertypes.kt") public void testIntermediateActualHasAdditionalSupertypes() { 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 c5f945e4bfd..bdc6b964dc9 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 @@ -1740,6 +1740,18 @@ public class FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated extends Abst runTest("compiler/testData/diagnostics/tests/multiplatform/hmpp/ambiguousActuals.kt"); } + @Test + @TestMetadata("hmppRedeclaration.kt") + public void testHmppRedeclaration() { + runTest("compiler/testData/diagnostics/tests/multiplatform/hmpp/hmppRedeclaration.kt"); + } + + @Test + @TestMetadata("hmppRedeclarationWithExpectActualPair.kt") + public void testHmppRedeclarationWithExpectActualPair() { + runTest("compiler/testData/diagnostics/tests/multiplatform/hmpp/hmppRedeclarationWithExpectActualPair.kt"); + } + @Test @TestMetadata("intermediateActualHasAdditionalSupertypes.kt") public void testIntermediateActualHasAdditionalSupertypes() { 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 71d2167e4cb..22f4146ae8c 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 @@ -1740,6 +1740,18 @@ public class FirOldFrontendMPPDiagnosticsWithPsiTestGenerated extends AbstractFi runTest("compiler/testData/diagnostics/tests/multiplatform/hmpp/ambiguousActuals.kt"); } + @Test + @TestMetadata("hmppRedeclaration.kt") + public void testHmppRedeclaration() { + runTest("compiler/testData/diagnostics/tests/multiplatform/hmpp/hmppRedeclaration.kt"); + } + + @Test + @TestMetadata("hmppRedeclarationWithExpectActualPair.kt") + public void testHmppRedeclarationWithExpectActualPair() { + runTest("compiler/testData/diagnostics/tests/multiplatform/hmpp/hmppRedeclarationWithExpectActualPair.kt"); + } + @Test @TestMetadata("intermediateActualHasAdditionalSupertypes.kt") public void testIntermediateActualHasAdditionalSupertypes() { diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirConflictsHelpers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirConflictsHelpers.kt index 1f8db2a5f9c..113446997f8 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirConflictsHelpers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirConflictsHelpers.kt @@ -16,7 +16,6 @@ import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirNameConflictsTr import org.jetbrains.kotlin.fir.analysis.checkers.declaration.isEffectivelyFinal import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.declarations.* -import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl.Companion.DEFAULT_STATUS_FOR_STATUSLESS_DECLARATIONS import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl.Companion.DEFAULT_STATUS_FOR_SUSPEND_MAIN_FUNCTION import org.jetbrains.kotlin.fir.declarations.impl.modifiersRepresentation @@ -439,6 +438,10 @@ private fun FirClassLikeSymbol<*>.expandedClassWithConstructorsScope(context: Ch } } +private fun shouldCheckForMultiplatformRedeclaration(dependency: FirBasedSymbol<*>, dependent: FirBasedSymbol<*>): Boolean = + dependent.moduleData.allDependsOnDependencies.contains(dependency.moduleData) && + dependency.resolvedStatus?.isExpect != true // ACTUAL_MISSING takes care of this case + private fun FirDeclarationCollector>.collectTopLevelConflict( declaration: FirBasedSymbol<*>, declarationPresentation: String, @@ -448,7 +451,11 @@ private fun FirDeclarationCollector>.collectTopLevelConflict( conflictingFile: FirFile? = null, ) { conflictingSymbol.lazyResolveToPhase(FirResolvePhase.STATUS) - if (conflictingSymbol == declaration || declaration.moduleData != conflictingSymbol.moduleData) return + if (conflictingSymbol == declaration) return + if ( + declaration.moduleData != conflictingSymbol.moduleData && + !shouldCheckForMultiplatformRedeclaration(declaration, conflictingSymbol) + ) return val actualConflictingPresentation = conflictingPresentation ?: FirRedeclarationPresenter.represent(conflictingSymbol) if (actualConflictingPresentation != declarationPresentation) return val actualConflictingFile = diff --git a/compiler/testData/diagnostics/klibSerializationTests/signatureClash_MPP.diag.txt b/compiler/testData/diagnostics/klibSerializationTests/signatureClash_MPP.diag.txt index 3c000159e41..c4b3a4a4997 100644 --- a/compiler/testData/diagnostics/klibSerializationTests/signatureClash_MPP.diag.txt +++ b/compiler/testData/diagnostics/klibSerializationTests/signatureClash_MPP.diag.txt @@ -1,8 +1,14 @@ Module: common +/common.kt:8:1: error: Conflicting overloads: +fun foo(): Int + /common.kt:8:1: error: Platform declaration clash: The following functions have the same IR signature (/foo|foo(){}[0]): fun foo(): kotlin.Int defined in root package fun foo(): kotlin.String defined in root package +/common.kt:11:1: error: Conflicting overloads: +fun bar(x: B): Int + /common.kt:11:1: error: Platform declaration clash: The following functions have the same IR signature (/bar|bar(B){}[0]): fun bar(x: B): kotlin.Int defined in root package fun bar(x: B): kotlin.Int defined in root package diff --git a/compiler/testData/diagnostics/klibSerializationTests/signatureClash_MPP.kt b/compiler/testData/diagnostics/klibSerializationTests/signatureClash_MPP.kt index 0e98bd6fe5e..b1bc0d940ff 100644 --- a/compiler/testData/diagnostics/klibSerializationTests/signatureClash_MPP.kt +++ b/compiler/testData/diagnostics/klibSerializationTests/signatureClash_MPP.kt @@ -5,10 +5,10 @@ // MODULE: common // FILE: common.kt -fun foo(): String = "" +fun foo(): String = "" expect class A -fun bar(x: A): Int = 2 +fun bar(x: A): Int = 2 @Suppress("REDECLARATION") val param = 0 diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualTypealiasForNotExpectClass.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/actualTypealiasForNotExpectClass.fir.kt index f0a0bff70d6..e2b9b41247e 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualTypealiasForNotExpectClass.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualTypealiasForNotExpectClass.fir.kt @@ -1,7 +1,7 @@ // MODULE: m1-common // FILE: common.kt -open class A { +open class A { open fun foo(): String = "Fail" } expect class C1() : A diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualTypealiasForNotExpectClass.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/actualTypealiasForNotExpectClass.ll.kt new file mode 100644 index 00000000000..f0a0bff70d6 --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/actualTypealiasForNotExpectClass.ll.kt @@ -0,0 +1,29 @@ +// MODULE: m1-common +// FILE: common.kt + +open class A { + open fun foo(): String = "Fail" +} +expect class C1() : A +expect class C2() : A + +// MODULE: m2-jvm()()(m1-common) +// FILE: A_J.java +public class A_J {} + +// FILE: B_J.java +public class B_J extends A_J { + public String foo() { return "O"; } +} + +// FILE: C2_J.java +public class C2_J extends B_J { + public String foo() { return "K"; } +} + +// FILE: main.kt +actual typealias A = A_J + +// Indirect subtyping is allowed in K2 KT-59356 +actual class C1 : B_J() +actual typealias C2 = C2_J diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualWithoutExpectWhenExpectIsFakeOverride.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/actualWithoutExpectWhenExpectIsFakeOverride.fir.kt index aae0305138a..2242efa7cf1 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualWithoutExpectWhenExpectIsFakeOverride.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualWithoutExpectWhenExpectIsFakeOverride.fir.kt @@ -1,8 +1,8 @@ // MODULE: m1-common // FILE: common.kt -fun foo() {} -class Foo +fun foo() {} +class Foo open class Base { open fun foo() {} diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualWithoutExpectWhenExpectIsFakeOverride.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/actualWithoutExpectWhenExpectIsFakeOverride.ll.kt new file mode 100644 index 00000000000..aae0305138a --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/actualWithoutExpectWhenExpectIsFakeOverride.ll.kt @@ -0,0 +1,33 @@ +// MODULE: m1-common +// FILE: common.kt + +fun foo() {} +class Foo + +open class Base { + open fun foo() {} +} +expect class Bar : Base { +} + +expect open class ExpectBase { + open fun foo() +} +expect class Baz : ExpectBase + +// MODULE: m1-jvm()()(m1-common) +// FILE: jvm.kt + +actual fun foo() {} +actual class Foo + +actual class Bar : Base() { + actual override fun foo() {} +} + +actual open class ExpectBase { + actual open fun foo() {} +} +actual class Baz : ExpectBase() { + actual override fun foo() {} +} diff --git a/compiler/testData/diagnostics/tests/multiplatform/expectActualMainInTheSameModuleDifferentFiles.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/expectActualMainInTheSameModuleDifferentFiles.fir.kt index bcb8c0eb00f..8ade4922c0a 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/expectActualMainInTheSameModuleDifferentFiles.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/expectActualMainInTheSameModuleDifferentFiles.fir.kt @@ -3,7 +3,7 @@ expect fun main() // FILE: common2.kt -actual fun main() {} +actual fun main() {} // MODULE: m1-jvm()()(m1-common) // FILE: jvm.kt diff --git a/compiler/testData/diagnostics/tests/multiplatform/expectActualMainInTheSameModuleDifferentFiles.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/expectActualMainInTheSameModuleDifferentFiles.ll.kt new file mode 100644 index 00000000000..bcb8c0eb00f --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/expectActualMainInTheSameModuleDifferentFiles.ll.kt @@ -0,0 +1,13 @@ +// MODULE: m1-common +// FILE: common.kt +expect fun main() + +// FILE: common2.kt +actual fun main() {} + +// MODULE: m1-jvm()()(m1-common) +// FILE: jvm.kt +expect fun main() + +// FILE: jvm2.kt +actual fun main() {} diff --git a/compiler/testData/diagnostics/tests/multiplatform/hmpp/ambiguousActuals.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/hmpp/ambiguousActuals.fir.kt index dff2f6f3810..f10067eda91 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/hmpp/ambiguousActuals.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/hmpp/ambiguousActuals.fir.kt @@ -4,7 +4,7 @@ // MODULE: intermediate()()(common) // TARGET_PLATFORM: Common -actual fun foo() {} +actual fun foo() {} // MODULE: main()()(common, intermediate) actual fun foo() {} diff --git a/compiler/testData/diagnostics/tests/multiplatform/hmpp/hmppRedeclaration.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/hmpp/hmppRedeclaration.fir.kt new file mode 100644 index 00000000000..7c4656cbe3c --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/hmpp/hmppRedeclaration.fir.kt @@ -0,0 +1,19 @@ +// MODULE: common +// TARGET_PLATFORM: Common + +class A + +class C + +// MODULE: intermediate()()(common) +// TARGET_PLATFORM: Common + +class A + +class B + +// MODULE: main()()(common, intermediate) + +class B + +class C diff --git a/compiler/testData/diagnostics/tests/multiplatform/hmpp/hmppRedeclaration.kt b/compiler/testData/diagnostics/tests/multiplatform/hmpp/hmppRedeclaration.kt new file mode 100644 index 00000000000..5632adf6264 --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/hmpp/hmppRedeclaration.kt @@ -0,0 +1,19 @@ +// MODULE: common +// TARGET_PLATFORM: Common + +class A + +class C + +// MODULE: intermediate()()(common) +// TARGET_PLATFORM: Common + +class A + +class B + +// MODULE: main()()(common, intermediate) + +class B + +class C diff --git a/compiler/testData/diagnostics/tests/multiplatform/hmpp/hmppRedeclaration.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/hmpp/hmppRedeclaration.ll.kt new file mode 100644 index 00000000000..6a8158d0d72 --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/hmpp/hmppRedeclaration.ll.kt @@ -0,0 +1,19 @@ +// MODULE: common +// TARGET_PLATFORM: Common + +class A + +class C + +// MODULE: intermediate()()(common) +// TARGET_PLATFORM: Common + +class A + +class B + +// MODULE: main()()(common, intermediate) + +class B + +class C diff --git a/compiler/testData/diagnostics/tests/multiplatform/hmpp/hmppRedeclarationWithExpectActualPair.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/hmpp/hmppRedeclarationWithExpectActualPair.fir.kt new file mode 100644 index 00000000000..1aa8d96f5ba --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/hmpp/hmppRedeclarationWithExpectActualPair.fir.kt @@ -0,0 +1,25 @@ +// MODULE: common +// TARGET_PLATFORM: Common + +expect class A + +expect class B + +class C + +// MODULE: intermediate()()(common) +// TARGET_PLATFORM: Common + +actual class A + +class B + +expect class C + +// MODULE: main()()(common, intermediate) + +class A + +actual class B + +actual class C diff --git a/compiler/testData/diagnostics/tests/multiplatform/hmpp/hmppRedeclarationWithExpectActualPair.kt b/compiler/testData/diagnostics/tests/multiplatform/hmpp/hmppRedeclarationWithExpectActualPair.kt new file mode 100644 index 00000000000..e49df4e2d3e --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/hmpp/hmppRedeclarationWithExpectActualPair.kt @@ -0,0 +1,25 @@ +// MODULE: common +// TARGET_PLATFORM: Common + +expect class A + +expect class B + +class C + +// MODULE: intermediate()()(common) +// TARGET_PLATFORM: Common + +actual class A + +class B + +expect class C + +// MODULE: main()()(common, intermediate) + +class A + +actual class B + +actual class C diff --git a/compiler/testData/diagnostics/tests/multiplatform/hmpp/hmppRedeclarationWithExpectActualPair.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/hmpp/hmppRedeclarationWithExpectActualPair.ll.kt new file mode 100644 index 00000000000..366f8447a27 --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/hmpp/hmppRedeclarationWithExpectActualPair.ll.kt @@ -0,0 +1,25 @@ +// MODULE: common +// TARGET_PLATFORM: Common + +expect class A + +expect class B + +class C + +// MODULE: intermediate()()(common) +// TARGET_PLATFORM: Common + +actual class A + +class B + +expect class C + +// MODULE: main()()(common, intermediate) + +class A + +actual class B + +actual class C 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 5ae487b8ff0..134a7764a6b 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 @@ -26681,6 +26681,18 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/multiplatform/hmpp/ambiguousActuals.kt"); } + @Test + @TestMetadata("hmppRedeclaration.kt") + public void testHmppRedeclaration() { + runTest("compiler/testData/diagnostics/tests/multiplatform/hmpp/hmppRedeclaration.kt"); + } + + @Test + @TestMetadata("hmppRedeclarationWithExpectActualPair.kt") + public void testHmppRedeclarationWithExpectActualPair() { + runTest("compiler/testData/diagnostics/tests/multiplatform/hmpp/hmppRedeclarationWithExpectActualPair.kt"); + } + @Test @TestMetadata("intermediateActualHasAdditionalSupertypes.kt") public void testIntermediateActualHasAdditionalSupertypes() {