Get rid of confusing javaToKotlinCovariant map

This commit is contained in:
Alexander Udalov
2015-04-23 22:46:32 +03:00
parent d2cd7b00bb
commit d1f94e8468
2 changed files with 14 additions and 35 deletions
@@ -160,13 +160,15 @@ class LazyJavaTypeResolver(
else -> attr.howThisTypeIsUsedAccordingToAnnotations else -> attr.howThisTypeIsUsedAccordingToAnnotations
} }
val kotlinDescriptor = javaToKotlin.mapJavaToKotlin(fqName) ?: return null
if (howThisTypeIsUsedEffectively == MEMBER_SIGNATURE_COVARIANT || howThisTypeIsUsedEffectively == SUPERTYPE) { if (howThisTypeIsUsedEffectively == MEMBER_SIGNATURE_COVARIANT || howThisTypeIsUsedEffectively == SUPERTYPE) {
javaToKotlin.mapJavaToKotlinCovariant(fqName)?.let { mutableCollectionDescriptor -> if (javaToKotlin.isReadOnlyCollection(kotlinDescriptor)) {
return mutableCollectionDescriptor return javaToKotlin.convertReadOnlyToMutable(kotlinDescriptor)
} }
} }
return javaToKotlin.mapJavaToKotlin(fqName) return kotlinDescriptor
} }
private fun isConstructorTypeParameter(): Boolean { private fun isConstructorTypeParameter(): Boolean {
@@ -36,7 +36,6 @@ public class JavaToKotlinClassMap implements PlatformToKotlinClassMap {
public static final JavaToKotlinClassMap INSTANCE = new JavaToKotlinClassMap(); public static final JavaToKotlinClassMap INSTANCE = new JavaToKotlinClassMap();
private final Map<FqName, ClassDescriptor> javaToKotlin = new HashMap<FqName, ClassDescriptor>(); private final Map<FqName, ClassDescriptor> javaToKotlin = new HashMap<FqName, ClassDescriptor>();
private final Map<FqName, ClassDescriptor> javaToKotlinCovariant = new HashMap<FqName, ClassDescriptor>();
private final Map<FqNameUnsafe, ClassId> kotlinToJava = new HashMap<FqNameUnsafe, ClassId>(); private final Map<FqNameUnsafe, ClassId> kotlinToJava = new HashMap<FqNameUnsafe, ClassId>();
private final Map<ClassDescriptor, ClassDescriptor> mutableToReadOnly = new HashMap<ClassDescriptor, ClassDescriptor>(); private final Map<ClassDescriptor, ClassDescriptor> mutableToReadOnly = new HashMap<ClassDescriptor, ClassDescriptor>();
@@ -86,6 +85,7 @@ public class JavaToKotlinClassMap implements PlatformToKotlinClassMap {
* java.lang.Integer -> kotlin.Int * java.lang.Integer -> kotlin.Int
* kotlin.jvm.internal.IntCompanionObject -> kotlin.Int.Companion * kotlin.jvm.internal.IntCompanionObject -> kotlin.Int.Companion
* java.util.List -> kotlin.List * java.util.List -> kotlin.List
* java.util.Map.Entry -> kotlin.Map.Entry
* java.lang.Void -> null * java.lang.Void -> null
*/ */
@Nullable @Nullable
@@ -93,17 +93,6 @@ public class JavaToKotlinClassMap implements PlatformToKotlinClassMap {
return javaToKotlin.get(fqName); return javaToKotlin.get(fqName);
} }
/**
* E.g.
* java.util.Collection -> kotlin.MutableCollection
* java.util.Map.Entry -> kotlin.MutableMap.MutableEntry
* java.lang.String -> null
*/
@Nullable
public ClassDescriptor mapJavaToKotlinCovariant(@NotNull FqName fqName) {
return javaToKotlinCovariant.get(fqName);
}
/** /**
* E.g. * E.g.
* kotlin.Throwable -> java.lang.Throwable * kotlin.Throwable -> java.lang.Throwable
@@ -125,8 +114,6 @@ public class JavaToKotlinClassMap implements PlatformToKotlinClassMap {
ClassId javaClassId = classId(javaClass); ClassId javaClassId = classId(javaClass);
add(javaClassId, kotlinDescriptor); add(javaClassId, kotlinDescriptor);
addJavaToKotlinCovariant(javaClassId, kotlinMutableDescriptor);
addKotlinToJava(javaClassId, kotlinMutableDescriptor); addKotlinToJava(javaClassId, kotlinMutableDescriptor);
mutableToReadOnly.put(kotlinMutableDescriptor, kotlinDescriptor); mutableToReadOnly.put(kotlinMutableDescriptor, kotlinDescriptor);
@@ -146,10 +133,6 @@ public class JavaToKotlinClassMap implements PlatformToKotlinClassMap {
javaToKotlin.put(javaClassId.asSingleFqName(), kotlinDescriptor); javaToKotlin.put(javaClassId.asSingleFqName(), kotlinDescriptor);
} }
private void addJavaToKotlinCovariant(@NotNull ClassId javaClassId, @NotNull ClassDescriptor kotlinDescriptor) {
javaToKotlinCovariant.put(javaClassId.asSingleFqName(), kotlinDescriptor);
}
private void addKotlinToJava(@NotNull ClassId javaClassId, @NotNull ClassDescriptor kotlinDescriptor) { private void addKotlinToJava(@NotNull ClassId javaClassId, @NotNull ClassDescriptor kotlinDescriptor) {
kotlinToJava.put(DescriptorUtils.getFqName(kotlinDescriptor), javaClassId); kotlinToJava.put(DescriptorUtils.getFqName(kotlinDescriptor), javaClassId);
} }
@@ -166,25 +149,19 @@ public class JavaToKotlinClassMap implements PlatformToKotlinClassMap {
@NotNull @NotNull
public Collection<ClassDescriptor> mapPlatformClass(@NotNull FqName fqName) { public Collection<ClassDescriptor> mapPlatformClass(@NotNull FqName fqName) {
ClassDescriptor kotlinAnalog = mapJavaToKotlin(fqName); ClassDescriptor kotlinAnalog = mapJavaToKotlin(fqName);
ClassDescriptor kotlinCovariantAnalog = mapJavaToKotlinCovariant(fqName); if (kotlinAnalog == null) return Collections.emptySet();
List<ClassDescriptor> descriptors = new ArrayList<ClassDescriptor>(2);
if (kotlinAnalog != null) { ClassDescriptor kotlinMutableAnalog = readOnlyToMutable.get(kotlinAnalog);
descriptors.add(kotlinAnalog); if (kotlinMutableAnalog == null) return Collections.singleton(kotlinAnalog);
}
if (kotlinCovariantAnalog != null) { return Arrays.asList(kotlinAnalog, kotlinMutableAnalog);
descriptors.add(kotlinCovariantAnalog);
}
return descriptors;
} }
@Override @Override
@NotNull @NotNull
public Collection<ClassDescriptor> mapPlatformClass(@NotNull ClassDescriptor classDescriptor) { public Collection<ClassDescriptor> mapPlatformClass(@NotNull ClassDescriptor classDescriptor) {
FqNameUnsafe className = DescriptorUtils.getFqName(classDescriptor); FqNameUnsafe className = DescriptorUtils.getFqName(classDescriptor);
if (!className.isSafe()) { return className.isSafe() ? mapPlatformClass(className.toSafe()) : Collections.<ClassDescriptor>emptySet();
return Collections.emptyList();
}
return mapPlatformClass(className.toSafe());
} }
public boolean isMutableCollection(@NotNull ClassDescriptor mutable) { public boolean isMutableCollection(@NotNull ClassDescriptor mutable) {
@@ -220,7 +197,7 @@ public class JavaToKotlinClassMap implements PlatformToKotlinClassMap {
List<ClassDescriptor> result = new ArrayList<ClassDescriptor>(); List<ClassDescriptor> result = new ArrayList<ClassDescriptor>();
result.addAll(javaToKotlin.values()); result.addAll(javaToKotlin.values());
result.addAll(javaToKotlinCovariant.values()); result.addAll(readOnlyToMutable.values());
for (PrimitiveType type : PrimitiveType.values()) { for (PrimitiveType type : PrimitiveType.values()) {
result.add(builtIns.getPrimitiveArrayClassDescriptor(type)); result.add(builtIns.getPrimitiveArrayClassDescriptor(type));