Pull Java<->Kotlin primitive type mapping up to JavaToKotlinClassMapBuilder

This commit is contained in:
Alexander Udalov
2015-04-22 04:49:07 +03:00
parent 4b07ec11ea
commit b956fb5eb0
4 changed files with 17 additions and 49 deletions
@@ -18,13 +18,11 @@ package org.jetbrains.kotlin.resolve.jvm.types;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
import org.jetbrains.kotlin.descriptors.ClassDescriptor; import org.jetbrains.kotlin.descriptors.ClassDescriptor;
import org.jetbrains.kotlin.name.ClassId; import org.jetbrains.kotlin.name.ClassId;
import org.jetbrains.kotlin.name.FqNameUnsafe; import org.jetbrains.kotlin.name.FqNameUnsafe;
import org.jetbrains.kotlin.platform.JavaToKotlinClassMapBuilder; import org.jetbrains.kotlin.platform.JavaToKotlinClassMapBuilder;
import org.jetbrains.kotlin.resolve.DescriptorUtils; import org.jetbrains.kotlin.resolve.DescriptorUtils;
import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@@ -44,16 +42,6 @@ public class KotlinToJavaTypesMap extends JavaToKotlinClassMapBuilder {
private KotlinToJavaTypesMap() { private KotlinToJavaTypesMap() {
init(); init();
initPrimitives();
}
private void initPrimitives() {
for (JvmPrimitiveType type : JvmPrimitiveType.values()) {
register(
KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME.child(type.getPrimitiveType().getTypeName()).toUnsafe(),
ClassId.topLevel(type.getWrapperFqName())
);
}
} }
/** /**
@@ -71,7 +59,7 @@ public class KotlinToJavaTypesMap extends JavaToKotlinClassMapBuilder {
@Override @Override
protected void register(@NotNull ClassId javaClassId, @NotNull ClassDescriptor kotlinDescriptor, @NotNull Direction direction) { protected void register(@NotNull ClassId javaClassId, @NotNull ClassDescriptor kotlinDescriptor, @NotNull Direction direction) {
if (direction == Direction.BOTH || direction == Direction.KOTLIN_TO_JAVA) { if (direction == Direction.BOTH || direction == Direction.KOTLIN_TO_JAVA) {
register(DescriptorUtils.getFqName(kotlinDescriptor), javaClassId); map.put(DescriptorUtils.getFqName(kotlinDescriptor), javaClassId);
} }
} }
@@ -84,8 +72,4 @@ public class KotlinToJavaTypesMap extends JavaToKotlinClassMapBuilder {
register(javaClassId, kotlinDescriptor, Direction.BOTH); register(javaClassId, kotlinDescriptor, Direction.BOTH);
register(javaClassId, kotlinMutableDescriptor, Direction.BOTH); register(javaClassId, kotlinMutableDescriptor, Direction.BOTH);
} }
private void register(@NotNull FqNameUnsafe kotlinFqName, @NotNull ClassId javaClassId) {
map.put(kotlinFqName, javaClassId);
}
} }
@@ -25,7 +25,6 @@ import org.jetbrains.kotlin.name.ClassId;
import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.name.FqNameUnsafe; import org.jetbrains.kotlin.name.FqNameUnsafe;
import org.jetbrains.kotlin.resolve.DescriptorUtils; import org.jetbrains.kotlin.resolve.DescriptorUtils;
import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType;
import java.util.*; import java.util.*;
@@ -37,15 +36,6 @@ public class JavaToKotlinClassMap extends JavaToKotlinClassMapBuilder implements
private JavaToKotlinClassMap() { private JavaToKotlinClassMap() {
init(); init();
initPrimitives();
}
private void initPrimitives() {
KotlinBuiltIns builtIns = KotlinBuiltIns.getInstance();
for (JvmPrimitiveType jvmType : JvmPrimitiveType.values()) {
register(ClassId.topLevel(jvmType.getWrapperFqName()), builtIns.getPrimitiveClassDescriptor(jvmType.getPrimitiveType()));
}
} }
@Nullable @Nullable
@@ -22,6 +22,7 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor;
import org.jetbrains.kotlin.name.ClassId; import org.jetbrains.kotlin.name.ClassId;
import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType;
import java.lang.annotation.Annotation; import java.lang.annotation.Annotation;
import java.util.*; import java.util.*;
@@ -56,6 +57,14 @@ public abstract class JavaToKotlinClassMapBuilder {
register(Map.Entry.class, kotlinBuiltIns.getMapEntry(), kotlinBuiltIns.getMutableMapEntry()); register(Map.Entry.class, kotlinBuiltIns.getMapEntry(), kotlinBuiltIns.getMutableMapEntry());
register(ListIterator.class, kotlinBuiltIns.getListIterator(), kotlinBuiltIns.getMutableListIterator()); register(ListIterator.class, kotlinBuiltIns.getListIterator(), kotlinBuiltIns.getMutableListIterator());
for (JvmPrimitiveType jvmType : JvmPrimitiveType.values()) {
register(
ClassId.topLevel(jvmType.getWrapperFqName()),
kotlinBuiltIns.getPrimitiveClassDescriptor(jvmType.getPrimitiveType()),
Direction.BOTH
);
}
register(classId(Deprecated.class), kotlinBuiltIns.getDeprecatedAnnotation(), Direction.JAVA_TO_KOTLIN); register(classId(Deprecated.class), kotlinBuiltIns.getDeprecatedAnnotation(), Direction.JAVA_TO_KOTLIN);
register(classId(Void.class), kotlinBuiltIns.getNothing(), Direction.KOTLIN_TO_JAVA); register(classId(Void.class), kotlinBuiltIns.getNothing(), Direction.KOTLIN_TO_JAVA);
@@ -23,7 +23,7 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
import org.jetbrains.kotlin.load.java.structure.reflect.classId import org.jetbrains.kotlin.load.java.structure.reflect.classId
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqNameUnsafe
import org.jetbrains.kotlin.platform.JavaToKotlinClassMap import org.jetbrains.kotlin.platform.JavaToKotlinClassMap
import org.jetbrains.kotlin.platform.JavaToKotlinClassMapBuilder import org.jetbrains.kotlin.platform.JavaToKotlinClassMapBuilder
import org.jetbrains.kotlin.platform.JavaToKotlinClassMapBuilder.Direction.BOTH import org.jetbrains.kotlin.platform.JavaToKotlinClassMapBuilder.Direction.BOTH
@@ -36,28 +36,15 @@ import org.jetbrains.kotlin.types.JetType
import org.jetbrains.kotlin.types.TypeUtils import org.jetbrains.kotlin.types.TypeUtils
object RuntimeTypeMapper : JavaToKotlinClassMapBuilder() { object RuntimeTypeMapper : JavaToKotlinClassMapBuilder() {
private val kotlinFqNameToJvmDesc = linkedMapOf<FqName, String>() private val kotlinFqNameToJvmDesc = linkedMapOf<FqNameUnsafe, String>()
init { init {
init() init()
initPrimitives()
}
private fun initPrimitives() {
val builtIns = KotlinBuiltIns.getInstance()
for (type in JvmPrimitiveType.values()) {
recordKotlinToJvm(builtIns.getPrimitiveClassDescriptor(type.getPrimitiveType()), type.getDesc())
}
}
private fun recordKotlinToJvm(kotlinDescriptor: ClassDescriptor, jvmDesc: String) {
kotlinFqNameToJvmDesc[DescriptorUtils.getFqNameSafe(kotlinDescriptor)] = jvmDesc
} }
override fun register(javaClassId: ClassId, kotlinDescriptor: ClassDescriptor, direction: JavaToKotlinClassMapBuilder.Direction) { override fun register(javaClassId: ClassId, kotlinDescriptor: ClassDescriptor, direction: JavaToKotlinClassMapBuilder.Direction) {
if (direction == BOTH || direction == KOTLIN_TO_JAVA) { if (direction == BOTH || direction == KOTLIN_TO_JAVA) {
recordKotlinToJvm(kotlinDescriptor, javaClassId.desc) kotlinFqNameToJvmDesc[DescriptorUtils.getFqName(kotlinDescriptor)] = javaClassId.desc
} }
} }
@@ -81,20 +68,18 @@ object RuntimeTypeMapper : JavaToKotlinClassMapBuilder() {
} }
val classDescriptor = classifier as ClassDescriptor val classDescriptor = classifier as ClassDescriptor
val fqNameUnsafe = DescriptorUtils.getFqName(classDescriptor) val fqName = DescriptorUtils.getFqName(classDescriptor)
KotlinBuiltIns.getPrimitiveTypeByFqName(fqNameUnsafe)?.let { primitiveType -> KotlinBuiltIns.getPrimitiveTypeByFqName(fqName)?.let { primitiveType ->
val jvmType = JvmPrimitiveType.get(primitiveType) val jvmType = JvmPrimitiveType.get(primitiveType)
return if (TypeUtils.isNullableType(type)) ClassId.topLevel(jvmType.getWrapperFqName()).desc else jvmType.getDesc() return if (TypeUtils.isNullableType(type)) ClassId.topLevel(jvmType.getWrapperFqName()).desc else jvmType.getDesc()
} }
KotlinBuiltIns.getPrimitiveTypeByArrayClassFqName(fqNameUnsafe)?.let { primitiveType -> KotlinBuiltIns.getPrimitiveTypeByArrayClassFqName(fqName)?.let { primitiveType ->
return "[" + JvmPrimitiveType.get(primitiveType).getDesc() return "[" + JvmPrimitiveType.get(primitiveType).getDesc()
} }
if (fqNameUnsafe.isSafe()) { kotlinFqNameToJvmDesc[fqName]?.let { return it }
kotlinFqNameToJvmDesc[fqNameUnsafe.toSafe()]?.let { return it }
}
if (classDescriptor.isCompanionObject()) { if (classDescriptor.isCompanionObject()) {
IntrinsicObjects.mapType(classDescriptor)?.let { fqName -> IntrinsicObjects.mapType(classDescriptor)?.let { fqName ->