From a59fa5015ecd14811eacb65a9e5e20db15f379b1 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 22 Apr 2015 05:01:46 +0300 Subject: [PATCH] Merge KotlinToJavaTypesMap into JavaToKotlinClassMap Also use this new Kotlin->Java mapping in RuntimeTypeMapper instead of inheriting directly from JavaToKotlinClassMapBuilder --- .../kotlin/codegen/state/JetTypeMapper.java | 4 +- .../TypeTransformingVisitor.java | 3 +- .../jvm/types/KotlinToJavaTypesMap.java | 75 ------------------- .../kotlin/platform/JavaToKotlinClassMap.java | 62 +++++++++++---- .../reflect/jvm/internal/RuntimeTypeMapper.kt | 25 +------ .../navigation/JetSourceNavigationHelper.java | 4 +- .../smart/TypeInstantiationItems.kt | 4 +- 7 files changed, 58 insertions(+), 119 deletions(-) delete mode 100644 compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/types/KotlinToJavaTypesMap.java diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java index da3941559d0..fa397e01e70 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java @@ -37,6 +37,7 @@ import org.jetbrains.kotlin.load.kotlin.PackageClassUtils; import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils; import org.jetbrains.kotlin.load.kotlin.nativeDeclarations.NativeDeclarationsPackage; import org.jetbrains.kotlin.name.*; +import org.jetbrains.kotlin.platform.JavaToKotlinClassMap; import org.jetbrains.kotlin.psi.JetExpression; import org.jetbrains.kotlin.psi.JetFile; import org.jetbrains.kotlin.psi.JetFunctionLiteral; @@ -56,7 +57,6 @@ import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType; import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodParameterKind; import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodParameterSignature; import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature; -import org.jetbrains.kotlin.resolve.jvm.types.KotlinToJavaTypesMap; import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor; import org.jetbrains.kotlin.types.*; import org.jetbrains.org.objectweb.asm.Type; @@ -386,7 +386,7 @@ public class JetTypeMapper { return Type.getType("[" + JvmPrimitiveType.get(arrayElementType).getDesc()); } - ClassId classId = KotlinToJavaTypesMap.getInstance().mapKotlinFqNameToJava(fqName); + ClassId classId = JavaToKotlinClassMap.INSTANCE.mapKotlinToJava(fqName); if (classId != null) { return Type.getObjectType(JvmClassName.byClassId(classId).getInternalName()); } diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/kotlinSignature/TypeTransformingVisitor.java b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/kotlinSignature/TypeTransformingVisitor.java index 2cc25a06fa2..fa0900556a7 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/kotlinSignature/TypeTransformingVisitor.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/kotlinSignature/TypeTransformingVisitor.java @@ -33,7 +33,6 @@ import org.jetbrains.kotlin.renderer.DescriptorRenderer; import org.jetbrains.kotlin.resolve.DescriptorUtils; import org.jetbrains.kotlin.resolve.TypeResolver; import org.jetbrains.kotlin.resolve.jvm.JvmPackage; -import org.jetbrains.kotlin.resolve.jvm.types.KotlinToJavaTypesMap; import org.jetbrains.kotlin.resolve.scopes.JetScope; import org.jetbrains.kotlin.types.*; @@ -220,7 +219,7 @@ public class TypeTransformingVisitor extends JetVisitor { @NotNull FqNameUnsafe originalClassFqName, @NotNull String qualifiedName ) { - ClassId javaClassId = KotlinToJavaTypesMap.getInstance().mapKotlinFqNameToJava(originalClassFqName); + ClassId javaClassId = JavaToKotlinClassMap.INSTANCE.mapKotlinToJava(originalClassFqName); if (javaClassId == null) return null; Collection descriptors = JavaToKotlinClassMap.INSTANCE.mapPlatformClass(javaClassId.asSingleFqName()); diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/types/KotlinToJavaTypesMap.java b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/types/KotlinToJavaTypesMap.java deleted file mode 100644 index be339b491f2..00000000000 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/types/KotlinToJavaTypesMap.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright 2010-2015 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 org.jetbrains.kotlin.resolve.jvm.types; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.kotlin.descriptors.ClassDescriptor; -import org.jetbrains.kotlin.name.ClassId; -import org.jetbrains.kotlin.name.FqNameUnsafe; -import org.jetbrains.kotlin.platform.JavaToKotlinClassMapBuilder; -import org.jetbrains.kotlin.resolve.DescriptorUtils; - -import java.util.HashMap; -import java.util.Map; - -public class KotlinToJavaTypesMap extends JavaToKotlinClassMapBuilder { - private static KotlinToJavaTypesMap instance = null; - - @NotNull - public static KotlinToJavaTypesMap getInstance() { - if (instance == null) { - instance = new KotlinToJavaTypesMap(); - } - return instance; - } - - private final Map map = new HashMap(); - - private KotlinToJavaTypesMap() { - init(); - } - - /** - * E.g. - * kotlin.Throwable -> java.lang.Throwable - * kotlin.deprecated -> java.lang.Deprecated - * kotlin.Int -> java.lang.Integer - * kotlin.IntArray -> null - */ - @Nullable - public ClassId mapKotlinFqNameToJava(@NotNull FqNameUnsafe kotlinFqName) { - return map.get(kotlinFqName); - } - - @Override - protected void register(@NotNull ClassId javaClassId, @NotNull ClassDescriptor kotlinDescriptor, @NotNull Direction direction) { - if (direction == Direction.BOTH || direction == Direction.KOTLIN_TO_JAVA) { - map.put(DescriptorUtils.getFqName(kotlinDescriptor), javaClassId); - } - } - - @Override - protected void register( - @NotNull ClassId javaClassId, - @NotNull ClassDescriptor kotlinDescriptor, - @NotNull ClassDescriptor kotlinMutableDescriptor - ) { - register(javaClassId, kotlinDescriptor, Direction.BOTH); - register(javaClassId, kotlinMutableDescriptor, Direction.BOTH); - } -} 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 0f153a8bdca..cd05a462b8c 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 @@ -31,27 +31,57 @@ import java.util.*; public class JavaToKotlinClassMap extends JavaToKotlinClassMapBuilder implements PlatformToKotlinClassMap { public static final JavaToKotlinClassMap INSTANCE = new JavaToKotlinClassMap(); - private final Map classDescriptorMap = new HashMap(); - private final Map classDescriptorMapForCovariantPositions = new HashMap(); + private final Map javaToKotlin = new HashMap(); + private final Map javaToKotlinCovariant = new HashMap(); + private final Map kotlinToJava = new HashMap(); private JavaToKotlinClassMap() { init(); } + /** + * E.g. + * java.lang.String -> kotlin.String + * java.lang.Deprecated -> kotlin.deprecated + * java.lang.Integer -> kotlin.Int + * java.util.List -> kotlin.List + * java.lang.Void -> null + */ @Nullable public ClassDescriptor mapJavaToKotlin(@NotNull FqName fqName) { - return classDescriptorMap.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 classDescriptorMapForCovariantPositions.get(fqName); + return javaToKotlinCovariant.get(fqName); + } + + /** + * E.g. + * kotlin.Throwable -> java.lang.Throwable + * kotlin.Int -> java.lang.Integer + * kotlin.Nothing -> java.lang.Void + * kotlin.IntArray -> null + */ + @Nullable + public ClassId mapKotlinToJava(@NotNull FqNameUnsafe kotlinFqName) { + return kotlinToJava.get(kotlinFqName); } @Override protected void register(@NotNull ClassId javaClassId, @NotNull ClassDescriptor kotlinDescriptor, @NotNull Direction direction) { if (direction == Direction.BOTH || direction == Direction.JAVA_TO_KOTLIN) { - register(javaClassId, kotlinDescriptor); + addJavaToKotlin(javaClassId, kotlinDescriptor); + } + if (direction == Direction.BOTH || direction == Direction.KOTLIN_TO_JAVA) { + addKotlinToJava(javaClassId, kotlinDescriptor); } } @@ -61,16 +91,22 @@ public class JavaToKotlinClassMap extends JavaToKotlinClassMapBuilder implements @NotNull ClassDescriptor kotlinDescriptor, @NotNull ClassDescriptor kotlinMutableDescriptor ) { - register(javaClassId, kotlinDescriptor); - registerCovariant(javaClassId, kotlinMutableDescriptor); + addJavaToKotlin(javaClassId, kotlinDescriptor); + addJavaToKotlinCovariant(javaClassId, kotlinMutableDescriptor); + addKotlinToJava(javaClassId, kotlinDescriptor); + addKotlinToJava(javaClassId, kotlinMutableDescriptor); } - private void register(@NotNull ClassId javaClassId, @NotNull ClassDescriptor kotlinDescriptor) { - classDescriptorMap.put(javaClassId.asSingleFqName(), kotlinDescriptor); + private void addJavaToKotlin(@NotNull ClassId javaClassId, @NotNull ClassDescriptor kotlinDescriptor) { + javaToKotlin.put(javaClassId.asSingleFqName(), kotlinDescriptor); } - private void registerCovariant(@NotNull ClassId javaClassId, @NotNull ClassDescriptor kotlinDescriptor) { - classDescriptorMapForCovariantPositions.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); } @NotNull @@ -103,8 +139,8 @@ public class JavaToKotlinClassMap extends JavaToKotlinClassMapBuilder implements KotlinBuiltIns builtIns = KotlinBuiltIns.getInstance(); List result = new ArrayList(); - result.addAll(classDescriptorMap.values()); - result.addAll(classDescriptorMapForCovariantPositions.values()); + result.addAll(javaToKotlin.values()); + result.addAll(javaToKotlinCovariant.values()); for (PrimitiveType type : PrimitiveType.values()) { result.add(builtIns.getPrimitiveArrayClassDescriptor(type)); 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 08d90fcf862..ca889a37459 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/RuntimeTypeMapper.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/RuntimeTypeMapper.kt @@ -23,11 +23,7 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.load.java.structure.reflect.classId import org.jetbrains.kotlin.name.ClassId -import org.jetbrains.kotlin.name.FqNameUnsafe import org.jetbrains.kotlin.platform.JavaToKotlinClassMap -import org.jetbrains.kotlin.platform.JavaToKotlinClassMapBuilder -import org.jetbrains.kotlin.platform.JavaToKotlinClassMapBuilder.Direction.BOTH -import org.jetbrains.kotlin.platform.JavaToKotlinClassMapBuilder.Direction.KOTLIN_TO_JAVA import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.descriptorUtil.classId import org.jetbrains.kotlin.resolve.jvm.JvmClassName @@ -35,24 +31,7 @@ import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType import org.jetbrains.kotlin.types.JetType import org.jetbrains.kotlin.types.TypeUtils -object RuntimeTypeMapper : JavaToKotlinClassMapBuilder() { - private val kotlinFqNameToJvmDesc = linkedMapOf() - - init { - init() - } - - override fun register(javaClassId: ClassId, kotlinDescriptor: ClassDescriptor, direction: JavaToKotlinClassMapBuilder.Direction) { - if (direction == BOTH || direction == KOTLIN_TO_JAVA) { - kotlinFqNameToJvmDesc[DescriptorUtils.getFqName(kotlinDescriptor)] = javaClassId.desc - } - } - - override fun register(javaClassId: ClassId, kotlinDescriptor: ClassDescriptor, kotlinMutableDescriptor: ClassDescriptor) { - register(javaClassId, kotlinMutableDescriptor, JavaToKotlinClassMapBuilder.Direction.BOTH) - register(javaClassId, kotlinDescriptor, JavaToKotlinClassMapBuilder.Direction.BOTH) - } - +object RuntimeTypeMapper { // TODO: this logic must be shared with JetTypeMapper fun mapTypeToJvmDesc(type: JetType): String { val classifier = type.getConstructor().getDeclarationDescriptor() @@ -79,7 +58,7 @@ object RuntimeTypeMapper : JavaToKotlinClassMapBuilder() { return "[" + JvmPrimitiveType.get(primitiveType).getDesc() } - kotlinFqNameToJvmDesc[fqName]?.let { return it } + JavaToKotlinClassMap.INSTANCE.mapKotlinToJava(fqName)?.let { return it.desc } if (classDescriptor.isCompanionObject()) { IntrinsicObjects.mapType(classDescriptor)?.let { fqName -> diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/navigation/JetSourceNavigationHelper.java b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/navigation/JetSourceNavigationHelper.java index 79695fccb32..7a52f8c89c2 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/navigation/JetSourceNavigationHelper.java +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/navigation/JetSourceNavigationHelper.java @@ -53,6 +53,7 @@ import org.jetbrains.kotlin.lexer.JetTokens; import org.jetbrains.kotlin.name.ClassId; import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.Name; +import org.jetbrains.kotlin.platform.JavaToKotlinClassMap; import org.jetbrains.kotlin.platform.PlatformToKotlinClassMap; import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.resolve.AdditionalCheckerProvider; @@ -60,7 +61,6 @@ import org.jetbrains.kotlin.resolve.BindingTraceContext; import org.jetbrains.kotlin.resolve.DescriptorUtils; import org.jetbrains.kotlin.resolve.jvm.JvmClassName; import org.jetbrains.kotlin.resolve.jvm.TopDownAnalyzerFacadeForJVM; -import org.jetbrains.kotlin.resolve.jvm.types.KotlinToJavaTypesMap; import org.jetbrains.kotlin.resolve.lazy.KotlinCodeAnalyzer; import org.jetbrains.kotlin.resolve.lazy.ResolveSession; import org.jetbrains.kotlin.resolve.lazy.declarations.FileBasedDeclarationProviderFactory; @@ -367,7 +367,7 @@ public class JetSourceNavigationHelper { assert className != null : "Class from BuiltIns should have a name"; ClassDescriptor classDescriptor = KotlinBuiltIns.getInstance().getBuiltInClassByName(className); - ClassId javaClassId = KotlinToJavaTypesMap.getInstance().mapKotlinFqNameToJava(DescriptorUtils.getFqName(classDescriptor)); + ClassId javaClassId = JavaToKotlinClassMap.INSTANCE.mapKotlinToJava(DescriptorUtils.getFqName(classDescriptor)); if (javaClassId != null) { return JavaPsiFacade.getInstance(classOrObject.getProject()).findClass( javaClassId.asSingleFqName().asString(), diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/TypeInstantiationItems.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/TypeInstantiationItems.kt index b12f31e70bc..630cb57ad0a 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/TypeInstantiationItems.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/TypeInstantiationItems.kt @@ -37,6 +37,7 @@ import org.jetbrains.kotlin.idea.core.psiClassToDescriptor import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers import org.jetbrains.kotlin.idea.util.makeNotNullable import org.jetbrains.kotlin.load.java.descriptors.SamConstructorDescriptor +import org.jetbrains.kotlin.platform.JavaToKotlinClassMap import org.jetbrains.kotlin.psi.JetClassOrObject import org.jetbrains.kotlin.psi.JetDeclaration import org.jetbrains.kotlin.renderer.DescriptorRenderer @@ -45,7 +46,6 @@ import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.PossiblyBareType import org.jetbrains.kotlin.resolve.descriptorUtil.resolveTopLevelClass -import org.jetbrains.kotlin.resolve.jvm.types.KotlinToJavaTypesMap import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf import org.jetbrains.kotlin.utils.addIfNotNull @@ -90,7 +90,7 @@ class TypeInstantiationItems( if (!KotlinBuiltIns.isAny(classifier)) { // do not search inheritors of Any inheritanceSearchers.addInheritorSearcher(classifier, classifier, typeArgs, tail) - val javaClassId = KotlinToJavaTypesMap.getInstance().mapKotlinFqNameToJava(DescriptorUtils.getFqName(classifier)) + val javaClassId = JavaToKotlinClassMap.INSTANCE.mapKotlinToJava(DescriptorUtils.getFqName(classifier)) if (javaClassId != null) { val javaAnalog = moduleDescriptor.resolveTopLevelClass(javaClassId.asSingleFqName()) if (javaAnalog != null) {