KotlinToJavaTypesMap refactoring
removed repeating type names from 'isForceReal' removed class SpecialTypeKey (added map for nullable types) moved mapping Any-Object from JetTypeMapper
This commit is contained in:
@@ -419,18 +419,10 @@ public class JetTypeMapper {
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (JetStandardClasses.getAny().equals(descriptor)) {
|
|
||||||
if (signatureVisitor != null) {
|
|
||||||
writeSimpleType(signatureVisitor, TYPE_OBJECT, jetType.isNullable());
|
|
||||||
}
|
|
||||||
checkValidType(TYPE_OBJECT);
|
|
||||||
return TYPE_OBJECT;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (descriptor instanceof ClassDescriptor) {
|
if (descriptor instanceof ClassDescriptor) {
|
||||||
JvmClassName name = getJvmClassName((ClassDescriptor) descriptor);
|
JvmClassName name = getJvmClassName((ClassDescriptor) descriptor);
|
||||||
Type asmType = Type.getObjectType(name.getInternalName() + (kind == MapTypeMode.TRAIT_IMPL ? JvmAbi.TRAIT_IMPL_SUFFIX : ""));
|
Type asmType = Type.getObjectType(name.getInternalName() + (kind == MapTypeMode.TRAIT_IMPL ? JvmAbi.TRAIT_IMPL_SUFFIX : ""));
|
||||||
boolean forceReal = KotlinToJavaTypesMap.isForceReal(name);
|
boolean forceReal = KotlinToJavaTypesMap.getInstance().isForceReal(name);
|
||||||
|
|
||||||
writeGenericType(jetType, signatureVisitor, asmType, forceReal);
|
writeGenericType(jetType, signatureVisitor, asmType, forceReal);
|
||||||
|
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
package org.jetbrains.jet.codegen;
|
package org.jetbrains.jet.codegen;
|
||||||
|
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.asm4.Type;
|
import org.jetbrains.asm4.Type;
|
||||||
@@ -31,6 +32,7 @@ import org.jetbrains.jet.lang.types.lang.PrimitiveType;
|
|||||||
import org.jetbrains.jet.lang.types.ref.ClassName;
|
import org.jetbrains.jet.lang.types.ref.ClassName;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import static org.jetbrains.jet.codegen.JetTypeMapper.*;
|
import static org.jetbrains.jet.codegen.JetTypeMapper.*;
|
||||||
import static org.jetbrains.jet.lang.types.lang.JetStandardLibraryNames.*;
|
import static org.jetbrains.jet.lang.types.lang.JetStandardLibraryNames.*;
|
||||||
@@ -49,7 +51,9 @@ public class KotlinToJavaTypesMap {
|
|||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
private final Map<SpecialTypeKey, Type> asmTypes = Maps.newHashMap();
|
private final Map<FqNameUnsafe, Type> asmTypes = Maps.newHashMap();
|
||||||
|
private final Map<FqNameUnsafe, Type> asmNullableTypes = Maps.newHashMap();
|
||||||
|
private final Set<String> asmTypeNames = Sets.newHashSet();
|
||||||
|
|
||||||
private KotlinToJavaTypesMap() {
|
private KotlinToJavaTypesMap() {
|
||||||
init();
|
init();
|
||||||
@@ -59,26 +63,36 @@ public class KotlinToJavaTypesMap {
|
|||||||
public Type getJavaAnalog(@NotNull JetType jetType) {
|
public Type getJavaAnalog(@NotNull JetType jetType) {
|
||||||
ClassifierDescriptor classifier = jetType.getConstructor().getDeclarationDescriptor();
|
ClassifierDescriptor classifier = jetType.getConstructor().getDeclarationDescriptor();
|
||||||
assert classifier != null;
|
assert classifier != null;
|
||||||
return asmTypes.get(new SpecialTypeKey(DescriptorUtils.getFQName(classifier), jetType.isNullable()));
|
FqNameUnsafe className = DescriptorUtils.getFQName(classifier);
|
||||||
|
if (jetType.isNullable()) {
|
||||||
|
Type nullableType = asmNullableTypes.get(className);
|
||||||
|
if (nullableType != null) {
|
||||||
|
return nullableType;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return asmTypes.get(className);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void register(@NotNull ClassName className, @NotNull Type type) {
|
private void register(@NotNull ClassName className, @NotNull Type type) {
|
||||||
register(className, type, type);
|
asmTypeNames.add(type.getClassName());
|
||||||
|
asmTypes.put(className.getFqName().toUnsafe(), type);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void register(@NotNull ClassName className, @NotNull Type nonNullType, @NotNull Type nullableType) {
|
private void registerNullable(@NotNull ClassName className, @NotNull Type nullableType) {
|
||||||
asmTypes.put(new SpecialTypeKey(className.getFqName().toUnsafe(), true), nullableType);
|
asmNullableTypes.put(className.getFqName().toUnsafe(), nullableType);
|
||||||
asmTypes.put(new SpecialTypeKey(className.getFqName().toUnsafe(), false), nonNullType);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void init() {
|
public void init() {
|
||||||
register(NOTHING, TYPE_NOTHING);
|
register(NOTHING, TYPE_NOTHING);
|
||||||
|
|
||||||
for (JvmPrimitiveType jvmPrimitiveType : JvmPrimitiveType.values()) {
|
for (JvmPrimitiveType jvmPrimitiveType : JvmPrimitiveType.values()) {
|
||||||
PrimitiveType primitiveType = jvmPrimitiveType.getPrimitiveType();
|
ClassName className = jvmPrimitiveType.getPrimitiveType().getClassName();
|
||||||
register(primitiveType.getClassName(), jvmPrimitiveType.getAsmType(), jvmPrimitiveType.getWrapper().getAsmType());
|
|
||||||
|
register(className, jvmPrimitiveType.getAsmType());
|
||||||
|
registerNullable(className, jvmPrimitiveType.getWrapper().getAsmType());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
register(ANY, TYPE_OBJECT);
|
||||||
register(NUMBER, JL_NUMBER_TYPE);
|
register(NUMBER, JL_NUMBER_TYPE);
|
||||||
register(STRING, JL_STRING_TYPE);
|
register(STRING, JL_STRING_TYPE);
|
||||||
register(CHAR_SEQUENCE, JL_CHAR_SEQUENCE_TYPE);
|
register(CHAR_SEQUENCE, JL_CHAR_SEQUENCE_TYPE);
|
||||||
@@ -96,45 +110,8 @@ public class KotlinToJavaTypesMap {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isForceReal(JvmClassName className) {
|
public boolean isForceReal(JvmClassName className) {
|
||||||
return JvmPrimitiveType.getByWrapperClass(className) != null
|
return JvmPrimitiveType.getByWrapperClass(className) != null
|
||||||
|| className.getFqName().getFqName().equals("java.lang.String")
|
|| asmTypeNames.contains(className.getFqName().getFqName());
|
||||||
|| className.getFqName().getFqName().equals("java.lang.CharSequence")
|
|
||||||
|| className.getFqName().getFqName().equals("java.lang.Object")
|
|
||||||
|| className.getFqName().getFqName().equals("java.lang.Number")
|
|
||||||
|| className.getFqName().getFqName().equals("java.lang.Enum")
|
|
||||||
|| className.getFqName().getFqName().equals("java.lang.Comparable");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private static final class SpecialTypeKey {
|
|
||||||
@NotNull
|
|
||||||
private final FqNameUnsafe className;
|
|
||||||
private final boolean nullable;
|
|
||||||
|
|
||||||
private SpecialTypeKey(@NotNull FqNameUnsafe className, boolean nullable) {
|
|
||||||
this.className = className;
|
|
||||||
this.nullable = nullable;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object o) {
|
|
||||||
if (this == o) return true;
|
|
||||||
if (o == null || getClass() != o.getClass()) return false;
|
|
||||||
|
|
||||||
SpecialTypeKey that = (SpecialTypeKey) o;
|
|
||||||
|
|
||||||
if (nullable != that.nullable) return false;
|
|
||||||
if (!className.equals(that.className)) return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
int result = className.hashCode();
|
|
||||||
result = 31 * result + (nullable ? 1 : 0);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ public class JetStandardLibraryNames {
|
|||||||
typeParameterCount);
|
typeParameterCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static final ClassName ANY = classIn("Any", 0);
|
||||||
public static final ClassName ARRAY = classIn("Array", 1);
|
public static final ClassName ARRAY = classIn("Array", 1);
|
||||||
public static final ClassName VOLATILE = classIn("volatile", 0);
|
public static final ClassName VOLATILE = classIn("volatile", 0);
|
||||||
public static final ClassName INT = PrimitiveType.INT.getClassName();
|
public static final ClassName INT = PrimitiveType.INT.getClassName();
|
||||||
|
|||||||
Reference in New Issue
Block a user