From 2f81d48f5ef274c7f78f29f2288c32b7a6624ec8 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 13 Oct 2016 19:54:27 +0300 Subject: [PATCH] Use ClassId instead of FqName in JavaToKotlinClassMap Extract mapJavaToKotlin which returns ClassId and needs no KotlinBuiltIns instance --- .../KtLightClassForSourceDeclaration.kt | 6 +- .../kotlin/platform/JavaToKotlinClassMap.java | 85 +++++++++++-------- .../kotlin/builtins/CompanionObjectMapping.kt | 29 +++---- .../kotlin/builtins/KotlinBuiltIns.java | 4 +- .../reflect/jvm/internal/RuntimeTypeMapper.kt | 4 +- 5 files changed, 63 insertions(+), 65 deletions(-) diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt index cce17b5ce37..f2959c7ef96 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt @@ -56,7 +56,6 @@ import org.jetbrains.kotlin.psi.debugText.getDebugText import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext import org.jetbrains.kotlin.psi.stubs.KotlinClassOrObjectStub import org.jetbrains.kotlin.resolve.DescriptorUtils -import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns import java.util.* import javax.swing.Icon @@ -411,11 +410,10 @@ abstract class KtLightClassForSourceDeclaration(protected val classOrObject: KtC if (qualifiedName == DescriptorUtils.getFqName(classDescriptor).asString()) return true val fqName = FqNameUnsafe(qualifiedName) - val mappedDescriptor = + val mappedQName = if (fqName.isSafe) - JavaToKotlinClassMap.INSTANCE.mapJavaToKotlin(fqName.toSafe(), classDescriptor.builtIns) + JavaToKotlinClassMap.INSTANCE.mapJavaToKotlin(fqName.toSafe())?.asSingleFqName()?.asString() else null - val mappedQName = if (mappedDescriptor == null) null else DescriptorUtils.getFqName(mappedDescriptor).asString() if (qualifiedName == mappedQName) return true for (superType in classDescriptor.typeConstructor.supertypes) { 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 ff35a43c232..d5395c17453 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 @@ -38,45 +38,50 @@ import static org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt.getF public class JavaToKotlinClassMap implements PlatformToKotlinClassMap { public static final JavaToKotlinClassMap INSTANCE = new JavaToKotlinClassMap(); - private final Map javaToKotlin = new HashMap(); + private final Map javaToKotlin = new HashMap(); private final Map kotlinToJava = new HashMap(); private final Map mutableToReadOnly = new HashMap(); private final Map readOnlyToMutable = new HashMap(); private JavaToKotlinClassMap() { - add(Object.class, FQ_NAMES.any); - add(String.class, FQ_NAMES.string); - add(CharSequence.class, FQ_NAMES.charSequence); - add(Throwable.class, FQ_NAMES.throwable); - add(Cloneable.class, FQ_NAMES.cloneable); - add(Number.class, FQ_NAMES.number); - add(Comparable.class, FQ_NAMES.comparable); - add(Enum.class, FQ_NAMES._enum); - add(Annotation.class, FQ_NAMES.annotation); + addTopLevel(Object.class, FQ_NAMES.any); + addTopLevel(String.class, FQ_NAMES.string); + addTopLevel(CharSequence.class, FQ_NAMES.charSequence); + addTopLevel(Throwable.class, FQ_NAMES.throwable); + addTopLevel(Cloneable.class, FQ_NAMES.cloneable); + addTopLevel(Number.class, FQ_NAMES.number); + addTopLevel(Comparable.class, FQ_NAMES.comparable); + addTopLevel(Enum.class, FQ_NAMES._enum); + addTopLevel(Annotation.class, FQ_NAMES.annotation); - add(Iterable.class, FQ_NAMES.iterable, FQ_NAMES.mutableIterable); - add(Iterator.class, FQ_NAMES.iterator, FQ_NAMES.mutableIterator); - add(Collection.class, FQ_NAMES.collection, FQ_NAMES.mutableCollection); - add(List.class, FQ_NAMES.list, FQ_NAMES.mutableList); - add(Set.class, FQ_NAMES.set, FQ_NAMES.mutableSet); - add(Map.class, FQ_NAMES.map, FQ_NAMES.mutableMap); - add(Map.Entry.class, FQ_NAMES.mapEntry, FQ_NAMES.mutableMapEntry); - add(ListIterator.class, FQ_NAMES.listIterator, FQ_NAMES.mutableListIterator); + addMutableReadOnlyPair(Iterable.class, ClassId.topLevel(FQ_NAMES.iterable), FQ_NAMES.mutableIterable); + addMutableReadOnlyPair(Iterator.class, ClassId.topLevel(FQ_NAMES.iterator), FQ_NAMES.mutableIterator); + addMutableReadOnlyPair(Collection.class, ClassId.topLevel(FQ_NAMES.collection), FQ_NAMES.mutableCollection); + addMutableReadOnlyPair(List.class, ClassId.topLevel(FQ_NAMES.list), FQ_NAMES.mutableList); + addMutableReadOnlyPair(Set.class, ClassId.topLevel(FQ_NAMES.set), FQ_NAMES.mutableSet); + addMutableReadOnlyPair(ListIterator.class, ClassId.topLevel(FQ_NAMES.listIterator), FQ_NAMES.mutableListIterator); + + ClassId mapClassId = ClassId.topLevel(FQ_NAMES.map); + addMutableReadOnlyPair(Map.class, mapClassId, FQ_NAMES.mutableMap); + addMutableReadOnlyPair(Map.Entry.class, mapClassId.createNestedClassId(FQ_NAMES.mapEntry.shortName()), FQ_NAMES.mutableMapEntry); for (JvmPrimitiveType jvmType : JvmPrimitiveType.values()) { - add(ClassId.topLevel(jvmType.getWrapperFqName()), KotlinBuiltIns.getPrimitiveFqName(jvmType.getPrimitiveType())); + add( + ClassId.topLevel(jvmType.getWrapperFqName()), + ClassId.topLevel(KotlinBuiltIns.getPrimitiveFqName(jvmType.getPrimitiveType())) + ); } - for (FqName fqName : CompanionObjectMapping.INSTANCE.allClassesWithIntrinsicCompanions()) { + for (ClassId classId : CompanionObjectMapping.INSTANCE.allClassesWithIntrinsicCompanions()) { add(ClassId.topLevel( - new FqName("kotlin.jvm.internal." + fqName.shortName().asString() + "CompanionObject")), - fqName.child(SpecialNames.DEFAULT_NAME_FOR_COMPANION_OBJECT)); + new FqName("kotlin.jvm.internal." + classId.getShortClassName().asString() + "CompanionObject")), + classId.createNestedClassId(SpecialNames.DEFAULT_NAME_FOR_COMPANION_OBJECT)); } // TODO: support also functions with >= 23 parameters for (int i = 0; i < 23; i++) { - add(ClassId.topLevel(new FqName("kotlin.jvm.functions.Function" + i)), KotlinBuiltIns.getFunctionFqName(i)); + add(ClassId.topLevel(new FqName("kotlin.jvm.functions.Function" + i)), KotlinBuiltIns.getFunctionClassId(i)); FunctionClassDescriptor.Kind kFunction = FunctionClassDescriptor.Kind.KFunction; String kFun = kFunction.getPackageFqName() + "." + kFunction.getClassNamePrefix(); @@ -96,10 +101,15 @@ public class JavaToKotlinClassMap implements PlatformToKotlinClassMap { * java.lang.Void -> null * kotlin.jvm.functions.Function3 -> kotlin.Function3 */ + @Nullable + public ClassId mapJavaToKotlin(@NotNull FqName fqName) { + return javaToKotlin.get(fqName.toUnsafe()); + } + @Nullable public ClassDescriptor mapJavaToKotlin(@NotNull FqName fqName, @NotNull KotlinBuiltIns builtIns) { - FqName kotlinFqName = javaToKotlin.get(fqName.toUnsafe()); - return kotlinFqName != null ? builtIns.getBuiltInClassByFqName(kotlinFqName) : null; + ClassId kotlinClassId = mapJavaToKotlin(fqName); + return kotlinClassId != null ? builtIns.getBuiltInClassByFqName(kotlinClassId.asSingleFqName()) : null; } /** @@ -117,35 +127,36 @@ public class JavaToKotlinClassMap implements PlatformToKotlinClassMap { return kotlinToJava.get(kotlinFqName); } - private void add( + private void addMutableReadOnlyPair( @NotNull Class javaClass, - @NotNull FqName kotlinReadOnlyFqName, + @NotNull ClassId kotlinReadOnlyClassId, @NotNull FqName kotlinMutableFqName ) { ClassId javaClassId = classId(javaClass); - add(javaClassId, kotlinReadOnlyFqName); + add(javaClassId, kotlinReadOnlyClassId); addKotlinToJava(kotlinMutableFqName, javaClassId); + FqName kotlinReadOnlyFqName = kotlinReadOnlyClassId.asSingleFqName(); mutableToReadOnly.put(kotlinMutableFqName.toUnsafe(), kotlinReadOnlyFqName); readOnlyToMutable.put(kotlinReadOnlyFqName.toUnsafe(), kotlinMutableFqName); } - private void add(@NotNull ClassId javaClassId, @NotNull FqName kotlinFqName) { - addJavaToKotlin(javaClassId, kotlinFqName); - addKotlinToJava(kotlinFqName, javaClassId); + private void add(@NotNull ClassId javaClassId, @NotNull ClassId kotlinClassId) { + addJavaToKotlin(javaClassId, kotlinClassId); + addKotlinToJava(kotlinClassId.asSingleFqName(), javaClassId); } - private void add(@NotNull Class javaClass, @NotNull FqNameUnsafe kotlinFqName) { - add(javaClass, kotlinFqName.toSafe()); + private void addTopLevel(@NotNull Class javaClass, @NotNull FqNameUnsafe kotlinFqName) { + addTopLevel(javaClass, kotlinFqName.toSafe()); } - private void add(@NotNull Class javaClass, @NotNull FqName kotlinFqName) { - add(classId(javaClass), kotlinFqName); + private void addTopLevel(@NotNull Class javaClass, @NotNull FqName kotlinFqName) { + add(classId(javaClass), ClassId.topLevel(kotlinFqName)); } - private void addJavaToKotlin(@NotNull ClassId javaClassId, @NotNull FqName kotlinFqName) { - javaToKotlin.put(javaClassId.asSingleFqName().toUnsafe(), kotlinFqName); + private void addJavaToKotlin(@NotNull ClassId javaClassId, @NotNull ClassId kotlinClassId) { + javaToKotlin.put(javaClassId.asSingleFqName().toUnsafe(), kotlinClassId); } private void addKotlinToJava(@NotNull FqName kotlinFqNameUnsafe, @NotNull ClassId javaClassId) { diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/CompanionObjectMapping.kt b/core/descriptors/src/org/jetbrains/kotlin/builtins/CompanionObjectMapping.kt index c5b28e5e1ec..2438009b30c 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/CompanionObjectMapping.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/CompanionObjectMapping.kt @@ -17,29 +17,20 @@ package org.jetbrains.kotlin.builtins import org.jetbrains.kotlin.descriptors.ClassDescriptor -import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.resolve.DescriptorUtils +import org.jetbrains.kotlin.resolve.descriptorUtil.classId import java.util.* object CompanionObjectMapping { - private val classesFqNames = linkedSetOf() + private val classIds = + (PrimitiveType.NUMBER_TYPES.map(KotlinBuiltIns::getPrimitiveFqName) + + KotlinBuiltIns.FQ_NAMES.string.toSafe() + + KotlinBuiltIns.FQ_NAMES._enum.toSafe()).mapTo(linkedSetOf(), ClassId::topLevel) - init { - for (type in PrimitiveType.NUMBER_TYPES) { - classesFqNames.add(KotlinBuiltIns.getPrimitiveFqName(type)) - } - classesFqNames.add(KotlinBuiltIns.FQ_NAMES.string.toSafe()) - classesFqNames.add(KotlinBuiltIns.FQ_NAMES._enum.toSafe()) - } + fun allClassesWithIntrinsicCompanions(): Set = + Collections.unmodifiableSet(classIds) - fun allClassesWithIntrinsicCompanions(): Set = - Collections.unmodifiableSet(classesFqNames) - - fun isMappedIntrinsicCompanionObject(classDescriptor: ClassDescriptor): Boolean { - if (!DescriptorUtils.isCompanionObject(classDescriptor)) return false - val fqName = DescriptorUtils.getFqName(classDescriptor.containingDeclaration) - if (!fqName.isSafe) return false - - return fqName.toSafe() in classesFqNames - } + fun isMappedIntrinsicCompanionObject(classDescriptor: ClassDescriptor): Boolean = + DescriptorUtils.isCompanionObject(classDescriptor) && classDescriptor.classId?.outerClassId in classIds } diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java b/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java index 4f3388ba4e1..d491af86cb8 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java @@ -429,8 +429,8 @@ public abstract class KotlinBuiltIns { } @NotNull - public static FqName getFunctionFqName(int parameterCount) { - return BUILT_INS_PACKAGE_FQ_NAME.child(Name.identifier(getFunctionName(parameterCount))); + public static ClassId getFunctionClassId(int parameterCount) { + return new ClassId(BUILT_INS_PACKAGE_FQ_NAME, Name.identifier(getFunctionName(parameterCount))); } @NotNull diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/RuntimeTypeMapper.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/RuntimeTypeMapper.kt index 2016f7868d1..f93a8c72e9e 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/RuntimeTypeMapper.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/RuntimeTypeMapper.kt @@ -16,7 +16,6 @@ package kotlin.reflect.jvm.internal -import org.jetbrains.kotlin.builtins.DefaultBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.PrimitiveType import org.jetbrains.kotlin.descriptors.FunctionDescriptor @@ -33,7 +32,6 @@ import org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.platform.JavaToKotlinClassMap import org.jetbrains.kotlin.resolve.DescriptorUtils -import org.jetbrains.kotlin.resolve.descriptorUtil.classId import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType import org.jetbrains.kotlin.serialization.ProtoBuf import org.jetbrains.kotlin.serialization.deserialization.NameResolver @@ -271,7 +269,7 @@ internal object RuntimeTypeMapper { val classId = klass.classId if (!classId.isLocal) { - JavaToKotlinClassMap.INSTANCE.mapJavaToKotlin(classId.asSingleFqName(), DefaultBuiltIns.Instance)?.let { return it.classId!! } + JavaToKotlinClassMap.INSTANCE.mapJavaToKotlin(classId.asSingleFqName())?.let { return it } } return classId