diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticExtensionsScope.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticExtensionsScope.kt index 8d3c153763b..b0867f93d40 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticExtensionsScope.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticExtensionsScope.kt @@ -110,7 +110,7 @@ class JavaSyntheticExtensionsScope(storageManager: StorageManager) : JetScope by .asSequence() .flatMap { memberScope.getFunctions(it).asSequence() } .singleOrNull { - it.kind != CallableMemberDescriptor.Kind.FAKE_OVERRIDE && isGoodGetMethod(it) && it.hasJavaOriginInHierarchy() + isGoodGetMethod(it) && it.hasJavaOriginInHierarchy() } ?: return null // don't accept "uRL" for "getURL" etc @@ -144,7 +144,6 @@ class JavaSyntheticExtensionsScope(storageManager: StorageManager) : JetScope by val propertyType = getMethod.returnType ?: return false val parameter = descriptor.valueParameters.singleOrNull() ?: return false if (parameter.type != propertyType) { - if (descriptor.kind != CallableMemberDescriptor.Kind.FAKE_OVERRIDE) return false // real setter must exactly match getter's type if (!propertyType.isSubtypeOf(parameter.type)) return false if (descriptor.findOverridden { val baseProperty = SyntheticJavaPropertyDescriptor.findByGetterOrSetter(it, this) diff --git a/compiler/testData/codegen/boxAgainstJava/syntheticExtensions/fromTwoBases.java b/compiler/testData/codegen/boxAgainstJava/syntheticExtensions/fromTwoBases.java new file mode 100644 index 00000000000..43794724a9c --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/syntheticExtensions/fromTwoBases.java @@ -0,0 +1,14 @@ +interface A { + String getOk(); +} + +interface B { + String getOk(); +} + +interface C extends A, B { +} + +class JavaClass implements C { + public String getOk() { return "OK"; } +} diff --git a/compiler/testData/codegen/boxAgainstJava/syntheticExtensions/fromTwoBases.kt b/compiler/testData/codegen/boxAgainstJava/syntheticExtensions/fromTwoBases.kt new file mode 100644 index 00000000000..ca57a4e6155 --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/syntheticExtensions/fromTwoBases.kt @@ -0,0 +1,5 @@ +fun box(): String { + return f(JavaClass()) +} + +fun f(c: C) = c.ok diff --git a/compiler/testData/diagnostics/tests/syntheticExtensions/FromTwoBases.kt b/compiler/testData/diagnostics/tests/syntheticExtensions/FromTwoBases.kt new file mode 100644 index 00000000000..d329ecc0d80 --- /dev/null +++ b/compiler/testData/diagnostics/tests/syntheticExtensions/FromTwoBases.kt @@ -0,0 +1,19 @@ +// FILE: KotlinFile.kt + +interface C : A, B + +fun foo(c: C) { + c.setSomething(c.getSomething() + 1) + c.something++ +} + +// FILE: A.java +public interface A { + int getSomething(); +} + +// FILE: B.java +public interface B { + int getSomething(); + void setSomething(int value); +} diff --git a/compiler/testData/diagnostics/tests/syntheticExtensions/FromTwoBases.txt b/compiler/testData/diagnostics/tests/syntheticExtensions/FromTwoBases.txt new file mode 100644 index 00000000000..658ddecc2a3 --- /dev/null +++ b/compiler/testData/diagnostics/tests/syntheticExtensions/FromTwoBases.txt @@ -0,0 +1,27 @@ +package + +public /*synthesized*/ fun A(/*0*/ function: () -> kotlin.Int): A +internal fun foo(/*0*/ c: C): kotlin.Unit + +public interface A { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public abstract fun getSomething(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface B { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public abstract fun getSomething(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public abstract fun setSomething(/*0*/ value: kotlin.Int): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +internal interface C : A, B { + public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public abstract override /*2*/ /*fake_override*/ fun getSomething(): kotlin.Int + public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int + public abstract override /*1*/ /*fake_override*/ fun setSomething(/*0*/ value: kotlin.Int): kotlin.Unit + public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/tests/syntheticExtensions/KotlinOverridesJava4.kt b/compiler/testData/diagnostics/tests/syntheticExtensions/KotlinOverridesJava4.kt index a53a67f5084..ef65896c7cb 100644 --- a/compiler/testData/diagnostics/tests/syntheticExtensions/KotlinOverridesJava4.kt +++ b/compiler/testData/diagnostics/tests/syntheticExtensions/KotlinOverridesJava4.kt @@ -9,7 +9,7 @@ fun foo(k: KotlinClass) { if (k.something == null) return k.setSomething("") - k.something = "" + k.something = "" } fun useString(i: String) {} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java index 9609029d56a..f566d4292aa 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java @@ -14052,6 +14052,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("FromTwoBases.kt") + public void testFromTwoBases() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/syntheticExtensions/FromTwoBases.kt"); + doTest(fileName); + } + @TestMetadata("GenericClass.kt") public void testGenericClass() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/syntheticExtensions/GenericClass.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxAgainstJavaCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxAgainstJavaCodegenTestGenerated.java index 86f18641a95..b623aa01867 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxAgainstJavaCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxAgainstJavaCodegenTestGenerated.java @@ -835,6 +835,12 @@ public class BlackBoxAgainstJavaCodegenTestGenerated extends AbstractBlackBoxCod JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/boxAgainstJava/syntheticExtensions"), Pattern.compile("^(.+)\\.kt$"), true); } + @TestMetadata("fromTwoBases.kt") + public void testFromTwoBases() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxAgainstJava/syntheticExtensions/fromTwoBases.kt"); + doTestAgainstJava(fileName); + } + @TestMetadata("getter.kt") public void testGetter() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxAgainstJava/syntheticExtensions/getter.kt");