From 0a66c784499ca6896475f60836d09d6f3f2e44c5 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 21 Apr 2015 04:19:47 +0300 Subject: [PATCH] Disperse primitive type mapping in JavaToKotlinClassMap --- .../structure/impl/JavaPrimitiveTypeImpl.java | 10 +++++--- .../java/lazy/types/LazyJavaTypeResolver.kt | 20 ++++++++-------- .../java/structure/JavaPrimitiveType.java | 8 ++++--- .../kotlin/platform/JavaToKotlinClassMap.java | 23 ++++--------------- .../kotlin/resolve/jvm/JvmPrimitiveType.java | 10 ++++++++ .../reflect/ReflectJavaPrimitiveType.kt | 7 ++++-- 6 files changed, 41 insertions(+), 37 deletions(-) diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/JavaPrimitiveTypeImpl.java b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/JavaPrimitiveTypeImpl.java index 5cfe4014402..7807a4930a7 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/JavaPrimitiveTypeImpl.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/JavaPrimitiveTypeImpl.java @@ -18,7 +18,10 @@ package org.jetbrains.kotlin.load.java.structure.impl; import com.intellij.psi.PsiPrimitiveType; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.kotlin.builtins.PrimitiveType; import org.jetbrains.kotlin.load.java.structure.JavaPrimitiveType; +import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType; public class JavaPrimitiveTypeImpl extends JavaTypeImpl implements JavaPrimitiveType { public JavaPrimitiveTypeImpl(@NotNull PsiPrimitiveType psiPrimitiveType) { @@ -26,8 +29,9 @@ public class JavaPrimitiveTypeImpl extends JavaTypeImpl implem } @Override - @NotNull - public String getCanonicalText() { - return getPsi().getCanonicalText(); + @Nullable + public PrimitiveType getType() { + String text = getPsi().getCanonicalText(); + return "void".equals(text) ? null : JvmPrimitiveType.get(text).getPrimitiveType(); } } 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 84f837abc95..0f934da7669 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 @@ -55,10 +55,9 @@ class LazyJavaTypeResolver( public fun transformJavaType(javaType: JavaType, attr: JavaTypeAttributes): JetType { return when (javaType) { is JavaPrimitiveType -> { - val canonicalText = javaType.getCanonicalText() - val jetType = JavaToKotlinClassMap.INSTANCE.mapPrimitiveKotlinClass(canonicalText) - assert(jetType != null) { "Primitive type is not found: $canonicalText" } - jetType!! + val primitiveType = javaType.getType() + if (primitiveType != null) KotlinBuiltIns.getInstance().getPrimitiveJetType(primitiveType) + else KotlinBuiltIns.getInstance().getUnitType() } is JavaClassifierType -> if (PLATFORM_TYPES && attr.allowFlexible && attr.howThisTypeIsUsed != SUPERTYPE) @@ -75,13 +74,12 @@ class LazyJavaTypeResolver( public fun transformArrayType(arrayType: JavaArrayType, attr: JavaTypeAttributes, isVararg: Boolean = false): JetType { return run { val javaComponentType = arrayType.getComponentType() - if (javaComponentType is JavaPrimitiveType) { - val jetType = JavaToKotlinClassMap.INSTANCE.mapPrimitiveKotlinClass("[" + javaComponentType.getCanonicalText()) - if (jetType != null) { - return@run if (PLATFORM_TYPES && attr.allowFlexible) - FlexibleJavaClassifierTypeCapabilities.create(jetType, TypeUtils.makeNullable(jetType)) - else TypeUtils.makeNullableAsSpecified(jetType, !attr.isMarkedNotNull) - } + val primitiveType = (javaComponentType as? JavaPrimitiveType)?.getType() + if (primitiveType != null) { + val jetType = KotlinBuiltIns.getInstance().getPrimitiveArrayJetType(primitiveType) + return@run if (PLATFORM_TYPES && attr.allowFlexible) + FlexibleJavaClassifierTypeCapabilities.create(jetType, TypeUtils.makeNullable(jetType)) + else TypeUtils.makeNullableAsSpecified(jetType, !attr.isMarkedNotNull) } val componentType = transformJavaType(javaComponentType, diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/structure/JavaPrimitiveType.java b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/structure/JavaPrimitiveType.java index a745dabb516..21a500f4430 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/structure/JavaPrimitiveType.java +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/structure/JavaPrimitiveType.java @@ -16,9 +16,11 @@ package org.jetbrains.kotlin.load.java.structure; -import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.kotlin.builtins.PrimitiveType; public interface JavaPrimitiveType extends JavaType { - @NotNull - String getCanonicalText(); + /** {@code null} means the {@code void} type. */ + @Nullable + PrimitiveType getType(); } 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 ea5ba6099c9..e2f069210a5 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 @@ -26,7 +26,6 @@ import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.FqNameUnsafe; import org.jetbrains.kotlin.resolve.DescriptorUtils; import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType; -import org.jetbrains.kotlin.types.JetType; import java.util.*; @@ -35,7 +34,6 @@ public class JavaToKotlinClassMap extends JavaToKotlinClassMapBuilder implements private final Map classDescriptorMap = new HashMap(); private final Map classDescriptorMapForCovariantPositions = new HashMap(); - private final Map primitiveTypesMap = new LinkedHashMap(); private final Set allKotlinClasses = new LinkedHashSet(); private JavaToKotlinClassMap() { @@ -46,24 +44,13 @@ public class JavaToKotlinClassMap extends JavaToKotlinClassMapBuilder implements private void initPrimitives() { KotlinBuiltIns builtIns = KotlinBuiltIns.getInstance(); - for (JvmPrimitiveType jvmPrimitiveType : JvmPrimitiveType.values()) { - PrimitiveType primitiveType = jvmPrimitiveType.getPrimitiveType(); - String name = jvmPrimitiveType.getName(); - - register(jvmPrimitiveType.getWrapperFqName(), builtIns.getPrimitiveClassDescriptor(primitiveType)); - primitiveTypesMap.put(name, builtIns.getPrimitiveJetType(primitiveType)); - primitiveTypesMap.put("[" + name, builtIns.getPrimitiveArrayJetType(primitiveType)); + for (JvmPrimitiveType jvmType : JvmPrimitiveType.values()) { + PrimitiveType type = jvmType.getPrimitiveType(); + register(jvmType.getWrapperFqName(), builtIns.getPrimitiveClassDescriptor(type)); + allKotlinClasses.add(builtIns.getPrimitiveArrayClassDescriptor(type)); } - primitiveTypesMap.put("void", builtIns.getUnitType()); - for (JetType type : primitiveTypesMap.values()) { - allKotlinClasses.add((ClassDescriptor) type.getConstructor().getDeclarationDescriptor()); - } - } - - @Nullable - public JetType mapPrimitiveKotlinClass(@NotNull String name) { - return primitiveTypesMap.get(name); + allKotlinClasses.add(builtIns.getUnit()); } @Nullable diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/resolve/jvm/JvmPrimitiveType.java b/core/descriptor.loader.java/src/org/jetbrains/kotlin/resolve/jvm/JvmPrimitiveType.java index 68ed5c2593b..7bccd7d4016 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/resolve/jvm/JvmPrimitiveType.java +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/resolve/jvm/JvmPrimitiveType.java @@ -20,7 +20,9 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.builtins.PrimitiveType; import org.jetbrains.kotlin.name.FqName; +import java.util.HashMap; import java.util.HashSet; +import java.util.Map; import java.util.Set; public enum JvmPrimitiveType { @@ -35,12 +37,15 @@ public enum JvmPrimitiveType { ; private static final Set WRAPPERS_CLASS_NAMES; + private static final Map TYPE_BY_NAME; static { WRAPPERS_CLASS_NAMES = new HashSet(); + TYPE_BY_NAME = new HashMap(); for (JvmPrimitiveType primitiveType : values()) { WRAPPERS_CLASS_NAMES.add(primitiveType.getWrapperFqName()); + TYPE_BY_NAME.put(primitiveType.getName(), primitiveType); } } @@ -48,6 +53,11 @@ public enum JvmPrimitiveType { return WRAPPERS_CLASS_NAMES.contains(className); } + @NotNull + public static JvmPrimitiveType get(@NotNull String name) { + return TYPE_BY_NAME.get(name); + } + private final PrimitiveType primitiveType; private final String name; private final String desc; diff --git a/core/descriptors.runtime/src/org/jetbrains/kotlin/load/java/structure/reflect/ReflectJavaPrimitiveType.kt b/core/descriptors.runtime/src/org/jetbrains/kotlin/load/java/structure/reflect/ReflectJavaPrimitiveType.kt index 4dc3d33b86a..f52672f864a 100644 --- a/core/descriptors.runtime/src/org/jetbrains/kotlin/load/java/structure/reflect/ReflectJavaPrimitiveType.kt +++ b/core/descriptors.runtime/src/org/jetbrains/kotlin/load/java/structure/reflect/ReflectJavaPrimitiveType.kt @@ -17,7 +17,10 @@ package org.jetbrains.kotlin.load.java.structure.reflect import org.jetbrains.kotlin.load.java.structure.JavaPrimitiveType +import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType -public class ReflectJavaPrimitiveType(override val type: Class<*>): ReflectJavaType(), JavaPrimitiveType { - override fun getCanonicalText() = type.getName() +public class ReflectJavaPrimitiveType(override val type: Class<*>) : ReflectJavaType(), JavaPrimitiveType { + override fun getType() = + if (type == Void.TYPE) null + else JvmPrimitiveType.get(type.getName()).getPrimitiveType() }