Delete AsmUtil.fqNameByAsmTypeUnsafe, refactor KotlinToJavaTypesMap
This commit is contained in:
+11
-11
@@ -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)) {
|
||||
|
||||
+27
-18
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user