Delete AsmUtil.fqNameByAsmTypeUnsafe, refactor KotlinToJavaTypesMap

This commit is contained in:
Alexander Udalov
2013-10-03 19:19:50 +04:00
parent 044a47905e
commit fa4f568437
6 changed files with 57 additions and 60 deletions
@@ -19,7 +19,6 @@ package org.jetbrains.jet.lang.resolve.java.kotlinSignature;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.TestOnly;
import org.jetbrains.asm4.Type;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor;
import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor;
@@ -27,10 +26,10 @@ import org.jetbrains.jet.lang.descriptors.impl.TypeParameterDescriptorImpl;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.TypeResolver;
import org.jetbrains.jet.lang.resolve.java.JvmClassName;
import org.jetbrains.jet.lang.resolve.java.mapping.JavaToKotlinClassMap;
import org.jetbrains.jet.lang.resolve.java.mapping.KotlinToJavaTypesMap;
import org.jetbrains.jet.lang.resolve.java.resolver.TypeUsage;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.types.*;
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
@@ -106,10 +105,11 @@ public class TypeTransformingVisitor extends JetVisitor<JetType, Void> {
TypeConstructor originalTypeConstructor = originalType.getConstructor();
ClassifierDescriptor declarationDescriptor = originalTypeConstructor.getDeclarationDescriptor();
assert declarationDescriptor != null;
String fqName = DescriptorUtils.getFQName(declarationDescriptor).toSafe().asString();
ClassDescriptor classFromLibrary = getAutoTypeAnalogWithinBuiltins(qualifiedName);
if (!isSameName(qualifiedName, fqName) && classFromLibrary == null) {
throw new AlternativeSignatureMismatchException("Alternative signature type mismatch, expected: %s, actual: %s", qualifiedName, fqName);
FqName originalClassFqName = DescriptorUtils.getFQName(declarationDescriptor).toSafe();
ClassDescriptor classFromLibrary = getAutoTypeAnalogWithinBuiltins(originalClassFqName, qualifiedName);
if (!isSameName(qualifiedName, originalClassFqName.asString()) && classFromLibrary == null) {
throw new AlternativeSignatureMismatchException("Alternative signature type mismatch, expected: %s, actual: %s",
qualifiedName, originalClassFqName);
}
TypeConstructor typeConstructor;
@@ -206,11 +206,11 @@ public class TypeTransformingVisitor extends JetVisitor<JetType, Void> {
}
@Nullable
private ClassDescriptor getAutoTypeAnalogWithinBuiltins(String qualifiedName) {
Type javaAnalog = KotlinToJavaTypesMap.getInstance().getJavaAnalog(originalType);
if (javaAnalog == null || javaAnalog.getSort() != Type.OBJECT) return null;
Collection<ClassDescriptor> descriptors =
JavaToKotlinClassMap.getInstance().mapPlatformClass(JvmClassName.byInternalName(javaAnalog.getInternalName()).getFqName());
private static ClassDescriptor getAutoTypeAnalogWithinBuiltins(@NotNull FqName originalClassFqName, @NotNull String qualifiedName) {
FqName javaFqName = KotlinToJavaTypesMap.getInstance().getKotlinToJavaFqName(originalClassFqName);
if (javaFqName == null) return null;
Collection<ClassDescriptor> descriptors = JavaToKotlinClassMap.getInstance().mapPlatformClass(javaFqName);
for (ClassDescriptor descriptor : descriptors) {
String fqName = DescriptorUtils.getFQName(descriptor).asString();
if (isSameName(qualifiedName, fqName)) {
@@ -20,14 +20,12 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.asm4.Type;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants;
import org.jetbrains.jet.lang.resolve.java.JvmClassName;
import org.jetbrains.jet.lang.resolve.java.JvmPrimitiveType;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe;
import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
import org.jetbrains.jet.lang.types.lang.PrimitiveType;
@@ -49,6 +47,7 @@ public class KotlinToJavaTypesMap extends JavaToKotlinClassMapBuilder {
private final Map<FqName, Type> asmTypes = new HashMap<FqName, Type>();
private final Map<FqName, Type> asmNullableTypes = new HashMap<FqName, Type>();
private final Map<FqName, FqName> kotlinToJavaFqName = new HashMap<FqName, FqName>();
private KotlinToJavaTypesMap() {
init();
@@ -64,21 +63,17 @@ public class KotlinToJavaTypesMap extends JavaToKotlinClassMapBuilder {
register(fqName, asmType);
JvmClassName wrapperName = JvmClassName.byFqNameWithoutInnerClasses(jvmPrimitiveType.getWrapperFqName());
registerNullable(fqName, Type.getObjectType(wrapperName.getInternalName()));
FqName wrapperFqName = jvmPrimitiveType.getWrapperFqName();
registerNullable(fqName, Type.getObjectType(JvmClassName.byFqNameWithoutInnerClasses(wrapperFqName).getInternalName()));
registerFqName(fqName, wrapperFqName);
register(builtInsFqName.child(primitiveType.getArrayTypeName()), Type.getType("[" + asmType.getDescriptor()));
}
}
@Nullable
public Type getJavaAnalog(@NotNull JetType jetType) {
ClassifierDescriptor classifier = jetType.getConstructor().getDeclarationDescriptor();
assert classifier != null;
FqNameUnsafe className = DescriptorUtils.getFQName(classifier);
if (!className.isSafe()) return null;
FqName fqName = className.toSafe();
if (jetType.isNullable()) {
public Type getJavaAnalog(@NotNull FqName fqName, boolean isNullable) {
if (isNullable) {
Type nullableType = asmNullableTypes.get(fqName);
if (nullableType != null) {
return nullableType;
@@ -87,10 +82,26 @@ public class KotlinToJavaTypesMap extends JavaToKotlinClassMapBuilder {
return asmTypes.get(fqName);
}
/**
* E.g.
* jet.Throwable -> java.lang.Throwable
* jet.Deprecated -> java.lang.annotation.Deprecated
* jet.Int -> java.lang.Integer
* jet.IntArray -> null
*/
@Nullable
public FqName getKotlinToJavaFqName(@NotNull FqName fqName) {
return kotlinToJavaFqName.get(fqName);
}
@Override
protected void register(@NotNull Class<?> javaClass, @NotNull ClassDescriptor kotlinDescriptor, @NotNull Direction direction) {
if (direction == Direction.BOTH || direction == Direction.KOTLIN_TO_JAVA) {
register(kotlinDescriptor, AsmTypeConstants.getType(javaClass));
FqNameUnsafe fqNameUnsafe = DescriptorUtils.getFQName(kotlinDescriptor);
assert fqNameUnsafe.isSafe() : "FQ name of a mapped class should be safe: " + fqNameUnsafe;
FqName fqName = fqNameUnsafe.toSafe();
register(fqName, AsmTypeConstants.getType(javaClass));
registerFqName(fqName, new FqName(javaClass.getCanonicalName()));
}
}
@@ -107,12 +118,6 @@ public class KotlinToJavaTypesMap extends JavaToKotlinClassMapBuilder {
}
}
private void register(@NotNull ClassDescriptor kotlinDescriptor, @NotNull Type javaType) {
FqNameUnsafe fqName = DescriptorUtils.getFQName(kotlinDescriptor);
assert fqName.isSafe();
register(fqName.toSafe(), javaType);
}
private void register(@NotNull FqName fqName, @NotNull Type type) {
asmTypes.put(fqName, type);
}
@@ -120,4 +125,8 @@ public class KotlinToJavaTypesMap extends JavaToKotlinClassMapBuilder {
private void registerNullable(@NotNull FqName fqName, @NotNull Type nullableType) {
asmNullableTypes.put(fqName, nullableType);
}
private void registerFqName(@NotNull FqName kotlinFqName, @NotNull FqName javaFqName) {
kotlinToJavaFqName.put(kotlinFqName, javaFqName);
}
}