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 99ec399c10b..7928dc90f27 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 @@ -85,6 +85,12 @@ public class FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated extends Abst runTest("compiler/testData/diagnostics/tests/multiplatform/kt54827.kt"); } + @Test + @TestMetadata("manyInterfacesMemberNotImplemented.kt") + public void testManyInterfacesMemberNotImplemented() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/manyInterfacesMemberNotImplemented.kt"); + } + @Test @TestMetadata("modifierApplicability.kt") public void testModifierApplicability() 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 4712149b68a..7da0165b417 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 @@ -85,6 +85,12 @@ public class FirOldFrontendMPPDiagnosticsWithPsiTestGenerated extends AbstractFi runTest("compiler/testData/diagnostics/tests/multiplatform/kt54827.kt"); } + @Test + @TestMetadata("manyInterfacesMemberNotImplemented.kt") + public void testManyInterfacesMemberNotImplemented() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/manyInterfacesMemberNotImplemented.kt"); + } + @Test @TestMetadata("modifierApplicability.kt") public void testModifierApplicability() throws Exception { diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/IrActualizerUtils.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/IrActualizerUtils.kt index fb9b441aac9..cc8e269bd66 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/IrActualizerUtils.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/IrActualizerUtils.kt @@ -153,10 +153,6 @@ fun KtDiagnosticReporterWithImplicitIrBasedContext.reportMissingActual(irDeclara at(irDeclaration).report(CommonBackendErrors.NO_ACTUAL_FOR_EXPECT, irDeclaration.module) } -fun KtDiagnosticReporterWithImplicitIrBasedContext.reportManyInterfacesMembersNotImplemented(declaration: IrClass, actualMember: IrDeclarationWithName) { - at(declaration).report(CommonBackendErrors.MANY_INTERFACES_MEMBER_NOT_IMPLEMENTED, actualMember.name.asString()) -} - internal fun IrElement.containsOptionalExpectation(): Boolean { return this is IrClass && this.kind == ClassKind.ANNOTATION_CLASS && diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/MissingFakeOverridesAdder.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/MissingFakeOverridesAdder.kt index 09620da67c6..4f657c0beb7 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/MissingFakeOverridesAdder.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/MissingFakeOverridesAdder.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.backend.common.actualizer import org.jetbrains.kotlin.KtDiagnosticReporterWithImplicitIrBasedContext +import org.jetbrains.kotlin.backend.common.CommonBackendErrors import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.builders.declarations.buildFun import org.jetbrains.kotlin.ir.builders.declarations.buildProperty @@ -39,7 +40,7 @@ class MissingFakeOverridesAdder( private fun processSupertypes(declaration: IrClass) { val members by lazy(LazyThreadSafetyMode.NONE) { - val notBuiltinMembers = declaration.declarations.filter { !it.isBuiltinMember() } + val notBuiltinMembers = declaration.declarations.filterNot { it.isBuiltinMember() } val result = mutableMapOf>() for (member in notBuiltinMembers) { result.getOrPut(generateIrElementFullNameFromExpect(member, typeAliasMap)) { mutableListOf() }.add(member) @@ -71,22 +72,25 @@ class MissingFakeOverridesAdder( } } - private fun addFakeOverride(actualMember: IrDeclaration, members: Map>, declaration: IrClass) { - when (actualMember) { - is IrFunctionImpl, - is IrPropertyImpl -> { - if (members.getMatch(actualMember, expectActualMap, typeAliasMap) != null) { - diagnosticsReporter.reportManyInterfacesMembersNotImplemented(declaration, actualMember as IrDeclarationWithName) - return - } + private fun addFakeOverride( + actualMember: IrDeclaration, + members: MutableMap>, + declaration: IrClass + ) { + val newMember = when (actualMember) { + is IrFunctionImpl -> createFakeOverrideFunction(actualMember, declaration) + is IrPropertyImpl -> createFakeOverrideProperty(actualMember, declaration) + else -> return + } - val newMember = if (actualMember is IrFunctionImpl) { - createFakeOverrideFunction(actualMember, declaration) - } else { - createFakeOverrideProperty(actualMember as IrPropertyImpl, declaration) - } - declaration.declarations.add(newMember) - } + if (members.getMatch(newMember, expectActualMap, typeAliasMap) == null) { + declaration.declarations.add(newMember) + members.getOrPut(generateIrElementFullNameFromExpect(newMember, typeAliasMap)) { mutableListOf() }.add(newMember) + } else { + diagnosticsReporter.at(declaration).report( + CommonBackendErrors.MANY_INTERFACES_MEMBER_NOT_IMPLEMENTED, + (actualMember as IrDeclarationWithName).name.asString() + ) } } } diff --git a/compiler/testData/diagnostics/tests/multiplatform/manyInterfacesMemberNotImplemented.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/manyInterfacesMemberNotImplemented.fir.kt new file mode 100644 index 00000000000..0221ffb1650 --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/manyInterfacesMemberNotImplemented.fir.kt @@ -0,0 +1,25 @@ +// TARGET_BACKEND: JVM +// !LANGUAGE: +MultiPlatformProjects + +// MODULE: common +// TARGET_PLATFORM: Common +// FILE: common.kt + +expect interface S1 +expect interface S2 + +open class A : S1, S2 + +class B : A() + +// MODULE: jvm()()(common) +// TARGET_PLATFORM: JVM +// FILE: main.kt + +actual interface S1 { + fun f() {} +} + +actual interface S2 { + fun f() {} +} diff --git a/compiler/testData/diagnostics/tests/multiplatform/manyInterfacesMemberNotImplemented.kt b/compiler/testData/diagnostics/tests/multiplatform/manyInterfacesMemberNotImplemented.kt new file mode 100644 index 00000000000..db8b3d83aad --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/manyInterfacesMemberNotImplemented.kt @@ -0,0 +1,25 @@ +// TARGET_BACKEND: JVM +// !LANGUAGE: +MultiPlatformProjects + +// MODULE: common +// TARGET_PLATFORM: Common +// FILE: common.kt + +expect interface S1 +expect interface S2 + +open class A : S1, S2 + +class B : A() + +// MODULE: jvm()()(common) +// TARGET_PLATFORM: JVM +// FILE: main.kt + +actual interface S1 { + fun f() {} +} + +actual interface S2 { + fun f() {} +} 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 83c82df4507..cb0445c422c 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 @@ -21732,6 +21732,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/multiplatform/kt54827.kt"); } + @Test + @TestMetadata("manyInterfacesMemberNotImplemented.kt") + public void testManyInterfacesMemberNotImplemented() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/manyInterfacesMemberNotImplemented.kt"); + } + @Test @TestMetadata("modifierApplicability.kt") public void testModifierApplicability() throws Exception {