diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java index a952004557f..53105217b91 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java @@ -40,6 +40,7 @@ import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.incremental.components.NoLookupLocation; import org.jetbrains.kotlin.lexer.KtTokens; import org.jetbrains.kotlin.load.java.JvmAbi; +import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor; import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.psi.*; @@ -430,9 +431,16 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { private void generateToArray() { if (descriptor.getKind() == ClassKind.INTERFACE) return; - KotlinBuiltIns builtIns = DescriptorUtilsKt.getBuiltIns(descriptor); + final KotlinBuiltIns builtIns = DescriptorUtilsKt.getBuiltIns(descriptor); if (!isSubclass(descriptor, builtIns.getCollection())) return; + if (CollectionsKt.any(DescriptorUtilsKt.getAllSuperclassesWithoutAny(descriptor), new Function1() { + @Override + public Boolean invoke(ClassDescriptor classDescriptor) { + return !(classDescriptor instanceof JavaClassDescriptor) && isSubclass(classDescriptor, builtIns.getCollection()); + } + })) return; + Collection functions = descriptor.getDefaultType().getMemberScope().getContributedFunctions( Name.identifier("toArray"), NoLookupLocation.FROM_BACKEND ); diff --git a/compiler/testData/codegen/bytecodeListing/collectionStubs/noStubsInJavaSuperClass.txt b/compiler/testData/codegen/bytecodeListing/collectionStubs/noStubsInJavaSuperClass.txt index 85b94f11d6f..e845fe24ba8 100644 --- a/compiler/testData/codegen/bytecodeListing/collectionStubs/noStubsInJavaSuperClass.txt +++ b/compiler/testData/codegen/bytecodeListing/collectionStubs/noStubsInJavaSuperClass.txt @@ -30,8 +30,6 @@ public final class test/C { public method remove(p0: int): java.lang.Object public method set(p0: int, p1: java.lang.Object): java.lang.Object public @org.jetbrains.annotations.NotNull method subList(p0: int, p1: int): java.util.List - public method toArray(): java.lang.Object[] - public method toArray(p0: java.lang.Object[]): java.lang.Object[] } @kotlin.Metadata diff --git a/compiler/testData/codegen/bytecodeListing/collectionStubs/stubsFromSuperclass.txt b/compiler/testData/codegen/bytecodeListing/collectionStubs/stubsFromSuperclass.txt index 4a96f406083..d2de540b9bf 100644 --- a/compiler/testData/codegen/bytecodeListing/collectionStubs/stubsFromSuperclass.txt +++ b/compiler/testData/codegen/bytecodeListing/collectionStubs/stubsFromSuperclass.txt @@ -20,8 +20,6 @@ public class A { @kotlin.Metadata public class B { public method (): void - public method toArray(): java.lang.Object[] - public method toArray(p0: java.lang.Object[]): java.lang.Object[] } @kotlin.Metadata @@ -37,6 +35,4 @@ public final class C { public method remove(p0: int): java.lang.Object public method set(p0: int, p1: java.lang.Object): java.lang.Object public @org.jetbrains.annotations.NotNull method subList(p0: int, p1: int): java.util.List - public method toArray(): java.lang.Object[] - public method toArray(p0: java.lang.Object[]): java.lang.Object[] } diff --git a/compiler/testData/codegen/bytecodeListing/collectionStubs/stubsFromSuperclassNoBridges.txt b/compiler/testData/codegen/bytecodeListing/collectionStubs/stubsFromSuperclassNoBridges.txt index 532e1f3e574..4aa8e2d93ef 100644 --- a/compiler/testData/codegen/bytecodeListing/collectionStubs/stubsFromSuperclassNoBridges.txt +++ b/compiler/testData/codegen/bytecodeListing/collectionStubs/stubsFromSuperclassNoBridges.txt @@ -22,8 +22,6 @@ public class B { public method (): void public method contains(p0: java.lang.CharSequence): boolean public final method contains(p0: java.lang.Object): boolean - public method toArray(): java.lang.Object[] - public method toArray(p0: java.lang.Object[]): java.lang.Object[] } @kotlin.Metadata @@ -45,6 +43,4 @@ public final class C { public method set(p0: int, p1: java.lang.CharSequence): java.lang.CharSequence public synthetic method set(p0: int, p1: java.lang.Object): java.lang.Object public @org.jetbrains.annotations.NotNull method subList(p0: int, p1: int): java.util.List - public method toArray(): java.lang.Object[] - public method toArray(p0: java.lang.Object[]): java.lang.Object[] } diff --git a/compiler/testData/codegen/bytecodeListing/noToArrayInJava.kt b/compiler/testData/codegen/bytecodeListing/noToArrayInJava.kt new file mode 100644 index 00000000000..0687d450900 --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/noToArrayInJava.kt @@ -0,0 +1,14 @@ +// FILE: test/JavaClass.java +package test; + +public abstract class JavaClass implements A { + +} + +// FILE: main.kt +package test + +interface A : Collection + +// There must be toArray methods in B +abstract class B : JavaClass() diff --git a/compiler/testData/codegen/bytecodeListing/noToArrayInJava.txt b/compiler/testData/codegen/bytecodeListing/noToArrayInJava.txt new file mode 100644 index 00000000000..373322520bf --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/noToArrayInJava.txt @@ -0,0 +1,19 @@ +@kotlin.Metadata +public interface test/A + +@kotlin.Metadata +public abstract class test/B { + public method (): void + public method add(p0: java.lang.Object): boolean + public method addAll(p0: java.util.Collection): boolean + public method clear(): void + public abstract method contains(p0: java.lang.Object): boolean + public abstract method getSize(): int + public method iterator(): java.util.Iterator + public method remove(p0: java.lang.Object): boolean + public method removeAll(p0: java.util.Collection): boolean + public method retainAll(p0: java.util.Collection): boolean + public final method size(): int + public method toArray(): java.lang.Object[] + public method toArray(p0: java.lang.Object[]): java.lang.Object[] +} diff --git a/compiler/testData/codegen/bytecodeListing/specialBridges/removeAtTwoSpecialBridges.txt b/compiler/testData/codegen/bytecodeListing/specialBridges/removeAtTwoSpecialBridges.txt index 66f71078286..095fdd5764d 100644 --- a/compiler/testData/codegen/bytecodeListing/specialBridges/removeAtTwoSpecialBridges.txt +++ b/compiler/testData/codegen/bytecodeListing/specialBridges/removeAtTwoSpecialBridges.txt @@ -42,8 +42,6 @@ public final class A1 { public method remove(p0: java.lang.String): boolean public synthetic method removeAt(p0: int): java.lang.Object public @org.jetbrains.annotations.NotNull method removeAt(p0: int): java.lang.String - public method toArray(): java.lang.Object[] - public method toArray(p0: java.lang.Object[]): java.lang.Object[] } @kotlin.Metadata @@ -59,6 +57,4 @@ public final class A2 { public final method remove(p0: java.lang.Object): boolean public method remove(p0: java.lang.String): boolean public method removeAt(p0: int): java.lang.String - public method toArray(): java.lang.Object[] - public method toArray(p0: java.lang.Object[]): java.lang.Object[] } diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java index de991782a46..7a93b47f4aa 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java @@ -89,6 +89,12 @@ public class BytecodeListingTestGenerated extends AbstractBytecodeListingTest { doTest(fileName); } + @TestMetadata("noToArrayInJava.kt") + public void testNoToArrayInJava() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeListing/noToArrayInJava.kt"); + doTest(fileName); + } + @TestMetadata("samAdapterAndInlinedOne.kt") public void testSamAdapterAndInlinedOne() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeListing/samAdapterAndInlinedOne.kt");