From d1f94e84682fb389b6435547324b168c5b3f3ff4 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 23 Apr 2015 22:46:32 +0300 Subject: [PATCH] Get rid of confusing javaToKotlinCovariant map --- .../java/lazy/types/LazyJavaTypeResolver.kt | 8 ++-- .../kotlin/platform/JavaToKotlinClassMap.java | 41 ++++--------------- 2 files changed, 14 insertions(+), 35 deletions(-) diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/LazyJavaTypeResolver.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/LazyJavaTypeResolver.kt index 6445e7274f3..ed4e5eb9c47 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/LazyJavaTypeResolver.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/LazyJavaTypeResolver.kt @@ -160,13 +160,15 @@ class LazyJavaTypeResolver( else -> attr.howThisTypeIsUsedAccordingToAnnotations } + val kotlinDescriptor = javaToKotlin.mapJavaToKotlin(fqName) ?: return null + if (howThisTypeIsUsedEffectively == MEMBER_SIGNATURE_COVARIANT || howThisTypeIsUsedEffectively == SUPERTYPE) { - javaToKotlin.mapJavaToKotlinCovariant(fqName)?.let { mutableCollectionDescriptor -> - return mutableCollectionDescriptor + if (javaToKotlin.isReadOnlyCollection(kotlinDescriptor)) { + return javaToKotlin.convertReadOnlyToMutable(kotlinDescriptor) } } - return javaToKotlin.mapJavaToKotlin(fqName) + return kotlinDescriptor } private fun isConstructorTypeParameter(): Boolean { diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/platform/JavaToKotlinClassMap.java b/core/descriptor.loader.java/src/org/jetbrains/kotlin/platform/JavaToKotlinClassMap.java index 6df914ef4f0..e64f49d1413 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/platform/JavaToKotlinClassMap.java +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/platform/JavaToKotlinClassMap.java @@ -36,7 +36,6 @@ public class JavaToKotlinClassMap implements PlatformToKotlinClassMap { public static final JavaToKotlinClassMap INSTANCE = new JavaToKotlinClassMap(); private final Map javaToKotlin = new HashMap(); - private final Map javaToKotlinCovariant = new HashMap(); private final Map kotlinToJava = new HashMap(); private final Map mutableToReadOnly = new HashMap(); @@ -86,6 +85,7 @@ public class JavaToKotlinClassMap implements PlatformToKotlinClassMap { * java.lang.Integer -> kotlin.Int * kotlin.jvm.internal.IntCompanionObject -> kotlin.Int.Companion * java.util.List -> kotlin.List + * java.util.Map.Entry -> kotlin.Map.Entry * java.lang.Void -> null */ @Nullable @@ -93,17 +93,6 @@ public class JavaToKotlinClassMap implements PlatformToKotlinClassMap { 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. * kotlin.Throwable -> java.lang.Throwable @@ -125,8 +114,6 @@ public class JavaToKotlinClassMap implements PlatformToKotlinClassMap { ClassId javaClassId = classId(javaClass); add(javaClassId, kotlinDescriptor); - - addJavaToKotlinCovariant(javaClassId, kotlinMutableDescriptor); addKotlinToJava(javaClassId, kotlinMutableDescriptor); mutableToReadOnly.put(kotlinMutableDescriptor, kotlinDescriptor); @@ -146,10 +133,6 @@ public class JavaToKotlinClassMap implements PlatformToKotlinClassMap { 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) { kotlinToJava.put(DescriptorUtils.getFqName(kotlinDescriptor), javaClassId); } @@ -166,25 +149,19 @@ public class JavaToKotlinClassMap implements PlatformToKotlinClassMap { @NotNull public Collection mapPlatformClass(@NotNull FqName fqName) { ClassDescriptor kotlinAnalog = mapJavaToKotlin(fqName); - ClassDescriptor kotlinCovariantAnalog = mapJavaToKotlinCovariant(fqName); - List descriptors = new ArrayList(2); - if (kotlinAnalog != null) { - descriptors.add(kotlinAnalog); - } - if (kotlinCovariantAnalog != null) { - descriptors.add(kotlinCovariantAnalog); - } - return descriptors; + if (kotlinAnalog == null) return Collections.emptySet(); + + ClassDescriptor kotlinMutableAnalog = readOnlyToMutable.get(kotlinAnalog); + if (kotlinMutableAnalog == null) return Collections.singleton(kotlinAnalog); + + return Arrays.asList(kotlinAnalog, kotlinMutableAnalog); } @Override @NotNull public Collection mapPlatformClass(@NotNull ClassDescriptor classDescriptor) { FqNameUnsafe className = DescriptorUtils.getFqName(classDescriptor); - if (!className.isSafe()) { - return Collections.emptyList(); - } - return mapPlatformClass(className.toSafe()); + return className.isSafe() ? mapPlatformClass(className.toSafe()) : Collections.emptySet(); } public boolean isMutableCollection(@NotNull ClassDescriptor mutable) { @@ -220,7 +197,7 @@ public class JavaToKotlinClassMap implements PlatformToKotlinClassMap { List result = new ArrayList(); result.addAll(javaToKotlin.values()); - result.addAll(javaToKotlinCovariant.values()); + result.addAll(readOnlyToMutable.values()); for (PrimitiveType type : PrimitiveType.values()) { result.add(builtIns.getPrimitiveArrayClassDescriptor(type));