diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirNotImplementedOverrideChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirNotImplementedOverrideChecker.kt index d8e977ca9b3..3df511135a1 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirNotImplementedOverrideChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirNotImplementedOverrideChecker.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.diagnostics.reportOn import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MANY_INTERFACES_MEMBER_NOT_IMPLEMENTED import org.jetbrains.kotlin.fir.containingClassLookupTag import org.jetbrains.kotlin.fir.declarations.FirClass +import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.utils.* import org.jetbrains.kotlin.fir.delegatedWrapperData @@ -71,7 +72,12 @@ object FirNotImplementedOverrideChecker : FirClassChecker() { val delegatedTo = delegatedWrapperData.wrapped.unwrapFakeOverrides().symbol if (symbol.multipleDelegatesWithTheSameSignature == true) { - manyImplementationsDelegationSymbols.add(symbol) + if (directOverriddenMembersWithBaseScope.isNotEmpty() && + // We should report here if either 2+ members or single member with non-enhancement origin + directOverriddenMembersWithBaseScope.singleOrNull()?.member?.origin != FirDeclarationOrigin.Enhancement + ) { + manyImplementationsDelegationSymbols.add(symbol) + } } val firstFinal = filteredOverriddenMembers.firstOrNull { it.isFinal } diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java index 18588a37a07..65221940182 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java @@ -18445,6 +18445,18 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr runTest("compiler/testData/codegen/box/fir/LookupTags.kt"); } + @Test + @TestMetadata("manyImplFromOneJavaInterfaceWithDelegation.kt") + public void testManyImplFromOneJavaInterfaceWithDelegation() throws Exception { + runTest("compiler/testData/codegen/box/fir/manyImplFromOneJavaInterfaceWithDelegation.kt"); + } + + @Test + @TestMetadata("manyImplFromOneJavaInterfaceWithDelegation2.kt") + public void testManyImplFromOneJavaInterfaceWithDelegation2() throws Exception { + runTest("compiler/testData/codegen/box/fir/manyImplFromOneJavaInterfaceWithDelegation2.kt"); + } + @Test @TestMetadata("NameHighlighter.kt") public void testNameHighlighter() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java index c21cf26d068..57f1f51e28d 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java @@ -18445,6 +18445,18 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo runTest("compiler/testData/codegen/box/fir/LookupTags.kt"); } + @Test + @TestMetadata("manyImplFromOneJavaInterfaceWithDelegation.kt") + public void testManyImplFromOneJavaInterfaceWithDelegation() throws Exception { + runTest("compiler/testData/codegen/box/fir/manyImplFromOneJavaInterfaceWithDelegation.kt"); + } + + @Test + @TestMetadata("manyImplFromOneJavaInterfaceWithDelegation2.kt") + public void testManyImplFromOneJavaInterfaceWithDelegation2() throws Exception { + runTest("compiler/testData/codegen/box/fir/manyImplFromOneJavaInterfaceWithDelegation2.kt"); + } + @Test @TestMetadata("NameHighlighter.kt") public void testNameHighlighter() throws Exception { diff --git a/compiler/testData/codegen/box/fir/manyImplFromOneJavaInterfaceWithDelegation.kt b/compiler/testData/codegen/box/fir/manyImplFromOneJavaInterfaceWithDelegation.kt new file mode 100644 index 00000000000..4cd8528e9f0 --- /dev/null +++ b/compiler/testData/codegen/box/fir/manyImplFromOneJavaInterfaceWithDelegation.kt @@ -0,0 +1,29 @@ +// TARGET_BACKEND: JVM_IR +// JVM_TARGET: 1.8 +// FILE: A.java + +public interface A { + default String foo() { + return "OK"; + } +} + +// FILE: B.java + +public interface B extends A {} + +// FILE: C.java + +public interface C extends A {} + +// FILE: test.kt + +class Adapter : B, C + +class D(val adapter: Adapter) : B by adapter, C by adapter + +fun box(): String { + val adapter = Adapter() + val d = D(adapter) + return d.foo() +} diff --git a/compiler/testData/codegen/box/fir/manyImplFromOneJavaInterfaceWithDelegation2.kt b/compiler/testData/codegen/box/fir/manyImplFromOneJavaInterfaceWithDelegation2.kt new file mode 100644 index 00000000000..28d4e328ca2 --- /dev/null +++ b/compiler/testData/codegen/box/fir/manyImplFromOneJavaInterfaceWithDelegation2.kt @@ -0,0 +1,30 @@ +// TARGET_BACKEND: JVM_IR +// JVM_TARGET: 1.8 +// FILE: A.java + +public interface A { + default String foo() { + return "OK"; + } +} + +// FILE: B.java + +public interface B extends A {} + +// FILE: C.java + +public interface C extends A {} + +// FILE: test.kt + +class Adapter : B, C + +class D(val b: B, val c: C) : B by b, C by c + +fun box(): String { + val b = Adapter() + val c = Adapter() + val d = D(b, c) + return d.foo() +} diff --git a/compiler/testData/diagnostics/tests/override/manyImplFromOneJavaInterfaceWithDelegation.fir.kt b/compiler/testData/diagnostics/tests/override/manyImplFromOneJavaInterfaceWithDelegation.fir.kt deleted file mode 100644 index ce8a6cb4b44..00000000000 --- a/compiler/testData/diagnostics/tests/override/manyImplFromOneJavaInterfaceWithDelegation.fir.kt +++ /dev/null @@ -1,19 +0,0 @@ -// FILE: A.java - -public interface A { - default void foo() {} -} - -// FILE: B.java - -public interface B extends A - -// FILE: C.java - -public interface C extends A - -// FILE: test.kt - -class Adapter : B, C - -class D(val adapter: Adapter) : B by adapter, C by adapter diff --git a/compiler/testData/diagnostics/tests/override/manyImplFromOneJavaInterfaceWithDelegation.kt b/compiler/testData/diagnostics/tests/override/manyImplFromOneJavaInterfaceWithDelegation.kt index 98fca9c346e..460a5b377ab 100644 --- a/compiler/testData/diagnostics/tests/override/manyImplFromOneJavaInterfaceWithDelegation.kt +++ b/compiler/testData/diagnostics/tests/override/manyImplFromOneJavaInterfaceWithDelegation.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // FILE: A.java public interface A { @@ -6,14 +7,22 @@ public interface A { // FILE: B.java -public interface B extends A +public interface B extends A {} // FILE: C.java -public interface C extends A +public interface C extends A {} + +// FILE: CK.kt + +interface CK : A // FILE: test.kt class Adapter : B, C class D(val adapter: Adapter) : B by adapter, C by adapter +class E(val b: B, val c: C) : B by b, C by c + +class AdapterK : B, CK +class F(val adapter: AdapterK) : B by adapter, CK by adapter diff --git a/compiler/testData/diagnostics/tests/override/manyImplFromOneKotlinInterfaceWithDelegation.kt b/compiler/testData/diagnostics/tests/override/manyImplFromOneKotlinInterfaceWithDelegation.kt index 037744443b4..d126425cbf8 100644 --- a/compiler/testData/diagnostics/tests/override/manyImplFromOneKotlinInterfaceWithDelegation.kt +++ b/compiler/testData/diagnostics/tests/override/manyImplFromOneKotlinInterfaceWithDelegation.kt @@ -5,6 +5,10 @@ interface A { fun foo() {} } +// FILE: BJ.java + +public interface BJ extends A {} + // FILE: B.kt interface B : A @@ -18,3 +22,7 @@ interface C : A class Adapter : B, C class D(val adapter: Adapter) : B by adapter, C by adapter + +class AdapterJ : BJ, C + +class DJ(val adapter: AdapterJ) : BJ by adapter, C by adapter diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 17ac6ba6c15..c9b9fe495e7 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -18445,6 +18445,18 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/fir/LookupTags.kt"); } + @Test + @TestMetadata("manyImplFromOneJavaInterfaceWithDelegation.kt") + public void testManyImplFromOneJavaInterfaceWithDelegation() throws Exception { + runTest("compiler/testData/codegen/box/fir/manyImplFromOneJavaInterfaceWithDelegation.kt"); + } + + @Test + @TestMetadata("manyImplFromOneJavaInterfaceWithDelegation2.kt") + public void testManyImplFromOneJavaInterfaceWithDelegation2() throws Exception { + runTest("compiler/testData/codegen/box/fir/manyImplFromOneJavaInterfaceWithDelegation2.kt"); + } + @Test @TestMetadata("NameHighlighter.kt") public void testNameHighlighter() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java index 49b73d94aa8..c5f3417fbb4 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java @@ -18451,6 +18451,12 @@ public class IrBlackBoxCodegenWithIrInlinerTestGenerated extends AbstractIrBlack runTest("compiler/testData/codegen/box/fir/manyImplFromOneJavaInterfaceWithDelegation.kt"); } + @Test + @TestMetadata("manyImplFromOneJavaInterfaceWithDelegation2.kt") + public void testManyImplFromOneJavaInterfaceWithDelegation2() throws Exception { + runTest("compiler/testData/codegen/box/fir/manyImplFromOneJavaInterfaceWithDelegation2.kt"); + } + @Test @TestMetadata("NameHighlighter.kt") public void testNameHighlighter() throws Exception {