diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBodyCodegen.java index c6d0248aeee..d7a19908f2c 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBodyCodegen.java @@ -28,16 +28,12 @@ import org.jetbrains.jet.lang.descriptors.impl.SimpleFunctionDescriptorImpl; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.name.Name; -import org.jetbrains.jet.lang.types.JetType; -import org.jetbrains.jet.lang.types.TypeUtils; -import org.jetbrains.jet.lang.types.checker.JetTypeChecker; -import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import java.util.Collections; import java.util.List; -import static org.jetbrains.asm4.Opcodes.*; -import static org.jetbrains.jet.codegen.AsmUtil.genMethodThrow; +import static org.jetbrains.asm4.Opcodes.ACC_STATIC; +import static org.jetbrains.asm4.Opcodes.RETURN; import static org.jetbrains.jet.codegen.binding.CodegenBinding.enumEntryNeedSubclass; public abstract class ClassBodyCodegen extends MemberCodegen { @@ -75,8 +71,6 @@ public abstract class ClassBodyCodegen extends MemberCodegen { generateStaticInitializer(); - generateRemoveInIterator(); - generateKotlinAnnotation(); } @@ -196,29 +190,4 @@ public abstract class ClassBodyCodegen extends MemberCodegen { } return clInitCodegen; } - - private void generateRemoveInIterator() { - // generates stub 'remove' function for subclasses of Iterator to be compatible with java.util.Iterator - if (isIteratorWithoutRemoveImpl(descriptor)) { - MethodVisitor mv = v.getVisitor().visitMethod(ACC_PUBLIC, "remove", "()V", null, null); - genMethodThrow(mv, "java/lang/UnsupportedOperationException", "Mutating method called on a Kotlin Iterator"); - } - } - - private static boolean isIteratorWithoutRemoveImpl(@NotNull ClassDescriptor classDescriptor) { - ClassDescriptor iteratorOfT = KotlinBuiltIns.getInstance().getIterator(); - JetType iteratorOfAny = - TypeUtils.substituteParameters(iteratorOfT, Collections.singletonList(KotlinBuiltIns.getInstance().getAnyType())); - if (!JetTypeChecker.INSTANCE.isSubtypeOf(classDescriptor.getDefaultType(), iteratorOfAny)) { - return false; - } - - for (FunctionDescriptor function : classDescriptor.getDefaultType().getMemberScope().getFunctions(Name.identifier("remove"))) { - if (function.getValueParameters().isEmpty() && function.getTypeParameters().isEmpty()) { - return false; - } - } - - return true; - } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index 9dbd7d4a9ec..a4635245f75 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -522,6 +522,13 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { } } + if (isSubclass(descriptor, builtIns.getIterator())) { + if (CodegenUtil.getDeclaredFunctionByRawSignature(descriptor, Name.identifier("remove"), + builtIns.getUnit()) == null) { + result.add("remove()V"); + } + } + return result; } diff --git a/compiler/testData/codegen/box/builtinStubMethods/Iterator.kt b/compiler/testData/codegen/box/builtinStubMethods/Iterator.kt new file mode 100644 index 00000000000..4175f9340c5 --- /dev/null +++ b/compiler/testData/codegen/box/builtinStubMethods/Iterator.kt @@ -0,0 +1,13 @@ +class MyIterator(val v: T): Iterator { + override fun next(): T = v + override fun hasNext(): Boolean = true +} + +fun box(): String { + try { + (MyIterator("") as MutableIterator).remove() + throw AssertionError() + } catch (e: UnsupportedOperationException) { + return "OK" + } +} \ No newline at end of file diff --git a/compiler/testData/codegen/boxWithJava/functions/removeInIterator.java b/compiler/testData/codegen/boxWithJava/functions/removeInIterator.java deleted file mode 100644 index d933139655e..00000000000 --- a/compiler/testData/codegen/boxWithJava/functions/removeInIterator.java +++ /dev/null @@ -1,5 +0,0 @@ -public class removeInIterator { - public static void bar(java.util.Iterator it) { - it.remove(); - } -} diff --git a/compiler/testData/codegen/boxWithJava/functions/removeInIterator.kt b/compiler/testData/codegen/boxWithJava/functions/removeInIterator.kt deleted file mode 100644 index c18671d33e2..00000000000 --- a/compiler/testData/codegen/boxWithJava/functions/removeInIterator.kt +++ /dev/null @@ -1,13 +0,0 @@ -fun box() : String { - try { - removeInIterator.bar(object : Iterator { - public override fun hasNext(): Boolean = false - public override fun next(): Int = 1 - }) - } - catch (e: UnsupportedOperationException) { - if (e.getMessage() == "Mutating method called on a Kotlin Iterator") - return "OK" - } - return "fail" -} diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java index 3f5b22a282b..0ca90e44c46 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java @@ -424,6 +424,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/codegen/box/builtinStubMethods"), Pattern.compile("^(.+)\\.kt$"), true); } + @TestMetadata("Iterator.kt") + public void testIterator() throws Exception { + doTest("compiler/testData/codegen/box/builtinStubMethods/Iterator.kt"); + } + @TestMetadata("List.kt") public void testList() throws Exception { doTest("compiler/testData/codegen/box/builtinStubMethods/List.kt"); diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java index 46f3ab25fd2..785c0817df3 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java @@ -127,11 +127,6 @@ public class BlackBoxWithJavaCodegenTestGenerated extends AbstractBlackBoxCodege doTestWithJava("compiler/testData/codegen/boxWithJava/functions/referencesStaticInnerClassMethodL2.kt"); } - @TestMetadata("removeInIterator.kt") - public void testRemoveInIterator() throws Exception { - doTestWithJava("compiler/testData/codegen/boxWithJava/functions/removeInIterator.kt"); - } - } @TestMetadata("compiler/testData/codegen/boxWithJava/innerClass")