Disperse primitive type mapping in JavaToKotlinClassMap
This commit is contained in:
+9
-11
@@ -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,
|
||||
|
||||
+5
-3
@@ -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();
|
||||
}
|
||||
|
||||
+5
-18
@@ -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<FqName, ClassDescriptor> classDescriptorMap = new HashMap<FqName, ClassDescriptor>();
|
||||
private final Map<FqName, ClassDescriptor> classDescriptorMapForCovariantPositions = new HashMap<FqName, ClassDescriptor>();
|
||||
private final Map<String, JetType> primitiveTypesMap = new LinkedHashMap<String, JetType>();
|
||||
private final Set<ClassDescriptor> allKotlinClasses = new LinkedHashSet<ClassDescriptor>();
|
||||
|
||||
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
|
||||
|
||||
+10
@@ -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<FqName> WRAPPERS_CLASS_NAMES;
|
||||
private static final Map<String, JvmPrimitiveType> TYPE_BY_NAME;
|
||||
|
||||
static {
|
||||
WRAPPERS_CLASS_NAMES = new HashSet<FqName>();
|
||||
TYPE_BY_NAME = new HashMap<String, JvmPrimitiveType>();
|
||||
|
||||
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;
|
||||
|
||||
Reference in New Issue
Block a user