KT-2640 Provide jet.MutableIterator and jet.MutableIterable
#KT-2640 fixed
This commit is contained in:
@@ -151,6 +151,8 @@ public class JetTypeMapper {
|
||||
register(JetStandardLibraryNames.ENUM, JL_ENUM_TYPE, JL_ENUM_TYPE);
|
||||
register(JetStandardLibraryNames.ITERABLE, JL_ITERABLE_TYPE, JL_ITERABLE_TYPE);
|
||||
register(JetStandardLibraryNames.ITERATOR, JL_ITERATOR_TYPE, JL_ITERATOR_TYPE);
|
||||
register(JetStandardLibraryNames.MUTABLE_ITERABLE, JL_ITERABLE_TYPE, JL_ITERABLE_TYPE);
|
||||
register(JetStandardLibraryNames.MUTABLE_ITERATOR, JL_ITERATOR_TYPE, JL_ITERATOR_TYPE);
|
||||
|
||||
for (JvmPrimitiveType jvmPrimitiveType : JvmPrimitiveType.values()) {
|
||||
PrimitiveType primitiveType = jvmPrimitiveType.getPrimitiveType();
|
||||
|
||||
+2
-1
@@ -1686,7 +1686,8 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
|
||||
transformedType = semanticServices.getTypeTransformer().transformToType(returnTypeFromAnnotation, typeVariableResolver);
|
||||
}
|
||||
else {
|
||||
transformedType = semanticServices.getTypeTransformer().transformToType(returnType, typeVariableResolver);
|
||||
transformedType = semanticServices.getTypeTransformer().transformToType(
|
||||
returnType, JavaTypeTransformer.TypeUsage.MEMBER_SIGNATURE_COVARIANT, typeVariableResolver);
|
||||
}
|
||||
if (method.getJetMethod().returnTypeNullable()) {
|
||||
return TypeUtils.makeNullableAsSpecified(transformedType, true);
|
||||
|
||||
+20
-3
@@ -17,6 +17,7 @@
|
||||
package org.jetbrains.jet.lang.resolve.java;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Maps;
|
||||
import com.google.common.collect.Sets;
|
||||
import com.intellij.psi.*;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -59,6 +60,7 @@ public class JavaTypeTransformer {
|
||||
|
||||
private Map<String, JetType> primitiveTypesMap;
|
||||
private Map<FqName, ClassDescriptor> classDescriptorMap;
|
||||
private Map<FqName, ClassDescriptor> classDescriptorMapForCovariantPositions;
|
||||
|
||||
|
||||
@NotNull
|
||||
@@ -157,7 +159,7 @@ public class JavaTypeTransformer {
|
||||
// 'L extends List<T>' in Java is a List<T> in Kotlin, not a List<T?>
|
||||
boolean nullable = !EnumSet.of(SUPERTYPE_ARGUMENT, SUPERTYPE).contains(howThisTypeIsUsed);
|
||||
|
||||
ClassDescriptor classData = getKotlinAnalog(new FqName(psiClass.getQualifiedName()));
|
||||
ClassDescriptor classData = getKotlinAnalog(new FqName(psiClass.getQualifiedName()), howThisTypeIsUsed);
|
||||
|
||||
if (classData == null) {
|
||||
classData = resolver.resolveClass(new FqName(psiClass.getQualifiedName()), DescriptorSearchRule.INCLUDE_KOTLIN);
|
||||
@@ -255,7 +257,7 @@ public class JavaTypeTransformer {
|
||||
|
||||
public Map<FqName, ClassDescriptor> getClassDescriptorMap() {
|
||||
if (classDescriptorMap == null) {
|
||||
classDescriptorMap = new HashMap<FqName, ClassDescriptor>();
|
||||
classDescriptorMap = Maps.newHashMap();
|
||||
for (JvmPrimitiveType jvmPrimitiveType : JvmPrimitiveType.values()) {
|
||||
PrimitiveType primitiveType = jvmPrimitiveType.getPrimitiveType();
|
||||
classDescriptorMap.put(jvmPrimitiveType.getWrapper().getFqName(), JetStandardLibrary.getInstance().getPrimitiveClassDescriptor(primitiveType));
|
||||
@@ -273,8 +275,23 @@ public class JavaTypeTransformer {
|
||||
return classDescriptorMap;
|
||||
}
|
||||
|
||||
public Map<FqName, ClassDescriptor> getClassDescriptorMapForCovariantPositions() {
|
||||
if (classDescriptorMapForCovariantPositions == null) {
|
||||
classDescriptorMapForCovariantPositions = Maps.newHashMap();
|
||||
classDescriptorMapForCovariantPositions.put(new FqName("java.lang.Iterable"), JetStandardLibrary.getInstance().getMutableIterable());
|
||||
classDescriptorMapForCovariantPositions.put(new FqName("java.util.Iterator"), JetStandardLibrary.getInstance().getMutableIterator());
|
||||
}
|
||||
return classDescriptorMapForCovariantPositions;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public ClassDescriptor getKotlinAnalog(@NotNull FqName fqName) {
|
||||
public ClassDescriptor getKotlinAnalog(@NotNull FqName fqName, @NotNull TypeUsage typeUsage) {
|
||||
if (typeUsage == MEMBER_SIGNATURE_COVARIANT) {
|
||||
ClassDescriptor descriptor = getClassDescriptorMapForCovariantPositions().get(fqName);
|
||||
if (descriptor != null) {
|
||||
return descriptor;
|
||||
}
|
||||
}
|
||||
return getClassDescriptorMap().get(fqName);
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -95,7 +95,7 @@ public abstract class JetTypeJetSignatureReader extends JetSignatureExceptionsAd
|
||||
|
||||
this.classDescriptor = null;
|
||||
if (!forceReal) {
|
||||
classDescriptor = javaSemanticServices.getTypeTransformer().getKotlinAnalog(ourName);
|
||||
classDescriptor = javaSemanticServices.getTypeTransformer().getKotlinAnalog(ourName, JavaTypeTransformer.TypeUsage.MEMBER_SIGNATURE_INVARIANT);
|
||||
}
|
||||
|
||||
if (classDescriptor == null) {
|
||||
|
||||
@@ -4,6 +4,10 @@ public trait Iterable<out T> {
|
||||
public fun iterator() : Iterator<T>
|
||||
}
|
||||
|
||||
public trait MutableIterable<out T> : Iterable<T> {
|
||||
override fun iterator() : MutableIterator<T>
|
||||
}
|
||||
|
||||
public trait ByteIterable : Iterable<Byte> {
|
||||
public override fun iterator() : ByteIterator
|
||||
}
|
||||
|
||||
@@ -5,6 +5,10 @@ public trait Iterator<out T> {
|
||||
public fun hasNext() : Boolean
|
||||
}
|
||||
|
||||
public trait MutableIterator<out T> : Iterator<T> {
|
||||
public fun remove()
|
||||
}
|
||||
|
||||
public abstract class ByteIterator() : Iterator<Byte> {
|
||||
public abstract open fun nextByte() : Byte
|
||||
|
||||
|
||||
@@ -94,6 +94,8 @@ public class JetStandardLibrary {
|
||||
private ClassDescriptor arrayClass;
|
||||
private ClassDescriptor iterableClass;
|
||||
private ClassDescriptor iteratorClass;
|
||||
private ClassDescriptor mutableIterableClass;
|
||||
private ClassDescriptor mutableIteratorClass;
|
||||
private ClassDescriptor comparableClass;
|
||||
private ClassDescriptor throwableClass;
|
||||
private ClassDescriptor enumClass;
|
||||
@@ -170,6 +172,8 @@ public class JetStandardLibrary {
|
||||
|
||||
this.iterableClass = (ClassDescriptor) libraryScope.getClassifier(Name.identifier("Iterable"));
|
||||
this.iteratorClass = (ClassDescriptor) libraryScope.getClassifier(Name.identifier("Iterator"));
|
||||
this.mutableIterableClass = (ClassDescriptor) libraryScope.getClassifier(Name.identifier("MutableIterable"));
|
||||
this.mutableIteratorClass = (ClassDescriptor) libraryScope.getClassifier(Name.identifier("MutableIterator"));
|
||||
this.comparableClass = (ClassDescriptor) libraryScope.getClassifier(Name.identifier("Comparable"));
|
||||
|
||||
this.stringType = new JetTypeImpl(getString());
|
||||
@@ -213,6 +217,8 @@ public class JetStandardLibrary {
|
||||
classDescriptors.add(throwableClass);
|
||||
classDescriptors.add(iterableClass);
|
||||
classDescriptors.add(iteratorClass);
|
||||
classDescriptors.add(mutableIterableClass);
|
||||
classDescriptors.add(mutableIteratorClass);
|
||||
classDescriptors.add(comparableClass);
|
||||
classDescriptors.add(enumClass);
|
||||
|
||||
@@ -301,6 +307,18 @@ public class JetStandardLibrary {
|
||||
return iteratorClass;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public ClassDescriptor getMutableIterable() {
|
||||
initStdClasses();
|
||||
return mutableIterableClass;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public ClassDescriptor getMutableIterator() {
|
||||
initStdClasses();
|
||||
return mutableIteratorClass;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public ClassDescriptor getComparable() {
|
||||
initStdClasses();
|
||||
|
||||
@@ -41,6 +41,8 @@ public class JetStandardLibraryNames {
|
||||
public static final ClassName COMPARABLE = classIn("Comparable", 1);
|
||||
public static final ClassName ITERABLE = classIn("Iterable", 1);
|
||||
public static final ClassName ITERATOR = classIn("Iterator", 1);
|
||||
public static final ClassName MUTABLE_ITERABLE = classIn("MutableIterable", 1);
|
||||
public static final ClassName MUTABLE_ITERATOR = classIn("MutableIterator", 1);
|
||||
public static final ClassName NOTHING = classIn("Nothing", 0);
|
||||
public static final ClassName STRING = classIn("String", 0);
|
||||
public static final ClassName CHAR_SEQUENCE = classIn("CharSequence", 0);
|
||||
|
||||
@@ -832,6 +832,14 @@ public final class jet.LongRange : jet.Range<jet.Long>, jet.LongIterable {
|
||||
public final val EMPTY: jet.LongRange
|
||||
}
|
||||
}
|
||||
public abstract trait jet.MutableIterable</*0*/ out T : jet.Any?> : jet.Iterable<T> {
|
||||
public abstract override /*1*/ fun iterator(): jet.MutableIterator<T>
|
||||
}
|
||||
public abstract trait jet.MutableIterator</*0*/ out T : jet.Any?> : jet.Iterator<T> {
|
||||
public abstract override /*1*/ fun hasNext(): jet.Boolean
|
||||
public abstract override /*1*/ fun next(): T
|
||||
public abstract fun remove(): jet.Tuple0
|
||||
}
|
||||
public final class jet.Nothing {
|
||||
private final /*constructor*/ fun <init>(): jet.Nothing
|
||||
}
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
//FILE:a/JC.java
|
||||
package a;
|
||||
|
||||
import java.util.Iterator;
|
||||
|
||||
public interface JC<T> {
|
||||
public Iterator<T> getIterator();
|
||||
|
||||
public void setIterator(Iterator<T> iterator);
|
||||
|
||||
public Iterable<T> getIterable();
|
||||
|
||||
public void setIterable(Iterable<T> iterable);
|
||||
}
|
||||
|
||||
//FILE:n.kt
|
||||
package n
|
||||
|
||||
import a.JC
|
||||
|
||||
fun foo(c: JC<Int>, iterator: Iterator<Int>, iterable: Iterable<Int>) {
|
||||
val mutableIterator: MutableIterator<Int>? = c.getIterator()
|
||||
c.setIterator(mutableIterator)
|
||||
c.setIterator(iterator)
|
||||
|
||||
val mutableIterable: MutableIterable<Int>? = c.getIterable()
|
||||
c.setIterable(mutableIterable)
|
||||
c.setIterable(iterable)
|
||||
}
|
||||
@@ -5,7 +5,7 @@ public open class InnerClassesInGeneric<P, Q>() : java.lang.Object() {
|
||||
}
|
||||
|
||||
public open class Inner2() : Inner() {
|
||||
public open fun iterator() : jet.Iterator<P>? {
|
||||
public open fun iterator() : jet.MutableIterator<P>? {
|
||||
throw UnsupportedOperationException()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,6 @@ public open class test.InnerClassesInGeneric</*0*/ P : jet.Any?, /*1*/ Q : jet.A
|
||||
}
|
||||
public open class test.InnerClassesInGeneric.Inner2 : test.InnerClassesInGeneric.Inner {
|
||||
public final /*constructor*/ fun <init>(): test.InnerClassesInGeneric.Inner2
|
||||
public open fun iterator(): jet.Iterator<P>?
|
||||
public open fun iterator(): jet.MutableIterator<P>?
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
/*
|
||||
* Copyright 2010-2012 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package test;
|
||||
|
||||
public interface LoadIterable<T> {
|
||||
public Iterable<T> getIterable();
|
||||
public void setIterable(Iterable<T> Iterable);
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package test
|
||||
|
||||
public trait LoadIterable<T> : java.lang.Object {
|
||||
public fun getIterable(): MutableIterable<T>?
|
||||
public fun setIterable(p0: Iterable<T>?)
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
namespace test
|
||||
|
||||
public abstract trait test.LoadIterable</*0*/ T : jet.Any?> : java.lang.Object {
|
||||
public abstract fun getIterable(): jet.MutableIterable<T>?
|
||||
public abstract fun setIterable(/*0*/ p0: jet.Iterable<T>?): jet.Tuple0
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package test;
|
||||
|
||||
import java.util.Iterator;
|
||||
|
||||
public interface LoadIterator<T> {
|
||||
public Iterator<T> getIterator();
|
||||
public void setIterator(Iterator<T> iterator);
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package test
|
||||
|
||||
public trait LoadIterator<T> : java.lang.Object {
|
||||
public fun getIterator(): MutableIterator<T>?
|
||||
public fun setIterator(p0: Iterator<T>?)
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
namespace test
|
||||
|
||||
public abstract trait test.LoadIterator</*0*/ T : jet.Any?> : java.lang.Object {
|
||||
public abstract fun getIterator(): jet.MutableIterator<T>?
|
||||
public abstract fun setIterator(/*0*/ p0: jet.Iterator<T>?): jet.Tuple0
|
||||
}
|
||||
@@ -12,7 +12,7 @@ public open class test.ModalityOfFakeOverrides : java.util.AbstractList<jet.Stri
|
||||
public open override /*1*/ fun get(/*0*/ p0: jet.Int): jet.String?
|
||||
public open override /*1*/ fun indexOf(/*0*/ p0: jet.Any?): jet.Int
|
||||
public open override /*1*/ fun isEmpty(): jet.Boolean
|
||||
public open override /*1*/ fun iterator(): jet.Iterator<jet.String>?
|
||||
public open override /*1*/ fun iterator(): jet.MutableIterator<jet.String>?
|
||||
public open override /*1*/ fun lastIndexOf(/*0*/ p0: jet.Any?): jet.Int
|
||||
public open override /*1*/ fun listIterator(): java.util.ListIterator<jet.String>?
|
||||
public open override /*1*/ fun listIterator(/*0*/ p0: jet.Int): java.util.ListIterator<jet.String>?
|
||||
|
||||
@@ -1706,6 +1706,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage
|
||||
doTest("compiler/testData/diagnostics/tests/j+k/kt2394.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("mutableIterator.kt")
|
||||
public void testMutableIterator() throws Exception {
|
||||
doTest("compiler/testData/diagnostics/tests/j+k/mutableIterator.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("OverrideVararg.kt")
|
||||
public void testOverrideVararg() throws Exception {
|
||||
doTest("compiler/testData/diagnostics/tests/j+k/OverrideVararg.kt");
|
||||
|
||||
@@ -15,12 +15,15 @@
|
||||
*/
|
||||
package org.jetbrains.jet.jvm.compiler;
|
||||
|
||||
import junit.framework.Assert;
|
||||
import junit.framework.Test;
|
||||
import junit.framework.TestSuite;
|
||||
|
||||
import java.io.File;
|
||||
import org.jetbrains.jet.JetTestUtils;
|
||||
import org.jetbrains.jet.test.TestMetadata;
|
||||
|
||||
import java.io.File;
|
||||
import org.jetbrains.jet.jvm.compiler.AbstractLoadJavaTest;
|
||||
|
||||
/** This class is generated by {@link org.jetbrains.jet.jvm.compiler.AbstractLoadJavaTest}. DO NOT MODIFY MANUALLY */
|
||||
@TestMetadata("compiler/testData/loadJava")
|
||||
@@ -370,6 +373,24 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest {
|
||||
}
|
||||
}
|
||||
|
||||
@TestMetadata("compiler/testData/loadJava/library")
|
||||
public static class Library extends AbstractLoadJavaTest {
|
||||
public void testAllFilesPresentInLibrary() throws Exception {
|
||||
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.jvm.compiler.AbstractLoadJavaTest", new File("compiler/testData/loadJava/library"), "java", false);
|
||||
}
|
||||
|
||||
@TestMetadata("LoadIterable.java")
|
||||
public void testLoadIterable() throws Exception {
|
||||
doTest("compiler/testData/loadJava/library/LoadIterable.java");
|
||||
}
|
||||
|
||||
@TestMetadata("LoadIterator.java")
|
||||
public void testLoadIterator() throws Exception {
|
||||
doTest("compiler/testData/loadJava/library/LoadIterator.java");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@TestMetadata("compiler/testData/loadJava/modality")
|
||||
public static class Modality extends AbstractLoadJavaTest {
|
||||
public void testAllFilesPresentInModality() throws Exception {
|
||||
@@ -431,6 +452,7 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest {
|
||||
suite.addTestSuite(Constructor.class);
|
||||
suite.addTestSuite(JavaBean.class);
|
||||
suite.addTest(KotlinSignature.innerSuite());
|
||||
suite.addTestSuite(Library.class);
|
||||
suite.addTestSuite(Modality.class);
|
||||
suite.addTestSuite(NotNull.class);
|
||||
suite.addTestSuite(Vararg.class);
|
||||
|
||||
Reference in New Issue
Block a user