Remove dependency of annotation deserializer on ASM Type

This commit is contained in:
Alexander Udalov
2013-09-18 22:31:35 +04:00
parent ed6f908049
commit b9ce7f9289
@@ -47,7 +47,6 @@ import java.io.IOException;
import java.util.*; import java.util.*;
import static org.jetbrains.asm4.ClassReader.*; import static org.jetbrains.asm4.ClassReader.*;
import static org.jetbrains.asm4.Type.*;
import static org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule.IGNORE_KOTLIN_SOURCES; import static org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule.IGNORE_KOTLIN_SOURCES;
import static org.jetbrains.jet.lang.resolve.java.resolver.DeserializedResolverUtils.kotlinFqNameToJavaFqName; import static org.jetbrains.jet.lang.resolve.java.resolver.DeserializedResolverUtils.kotlinFqNameToJavaFqName;
import static org.jetbrains.jet.lang.resolve.java.resolver.DeserializedResolverUtils.naiveKotlinFqName; import static org.jetbrains.jet.lang.resolve.java.resolver.DeserializedResolverUtils.naiveKotlinFqName;
@@ -313,9 +312,9 @@ public class AnnotationDescriptorDeserializer implements AnnotationDeserializer
if (propertySignature.hasField()) { if (propertySignature.hasField()) {
JavaProtoBuf.JavaFieldSignature field = propertySignature.getField(); JavaProtoBuf.JavaFieldSignature field = propertySignature.getField();
Type type = new SignatureDeserializer(nameResolver).type(field.getType()); String type = new SignatureDeserializer(nameResolver).typeDescriptor(field.getType());
Name name = nameResolver.getName(field.getName()); Name name = nameResolver.getName(field.getName());
return MemberSignature.fromFieldNameAndDesc(name.asString(), type.getDescriptor()); return MemberSignature.fromFieldNameAndDesc(name.asString(), type);
} }
else if (propertySignature.hasSyntheticMethodName()) { else if (propertySignature.hasSyntheticMethodName()) {
Name name = nameResolver.getName(propertySignature.getSyntheticMethodName()); Name name = nameResolver.getName(propertySignature.getSyntheticMethodName());
@@ -414,8 +413,7 @@ public class AnnotationDescriptorDeserializer implements AnnotationDeserializer
private static class SignatureDeserializer { private static class SignatureDeserializer {
// These types are ordered according to their sorts, this is significant for deserialization // These types are ordered according to their sorts, this is significant for deserialization
private static final Type[] PRIMITIVE_TYPES = new Type[] private static final char[] PRIMITIVE_TYPES = new char[] { 'V', 'Z', 'C', 'B', 'S', 'I', 'F', 'J', 'D' };
{ VOID_TYPE, BOOLEAN_TYPE, CHAR_TYPE, BYTE_TYPE, SHORT_TYPE, INT_TYPE, FLOAT_TYPE, LONG_TYPE, DOUBLE_TYPE };
private final NameResolver nameResolver; private final NameResolver nameResolver;
@@ -430,30 +428,35 @@ public class AnnotationDescriptorDeserializer implements AnnotationDeserializer
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
sb.append('('); sb.append('(');
for (int i = 0, length = signature.getParameterTypeCount(); i < length; i++) { for (int i = 0, length = signature.getParameterTypeCount(); i < length; i++) {
sb.append(type(signature.getParameterType(i)).getDescriptor()); typeDescriptor(signature.getParameterType(i), sb);
} }
sb.append(')'); sb.append(')');
sb.append(type(signature.getReturnType()).getDescriptor()); typeDescriptor(signature.getReturnType(), sb);
return MemberSignature.fromMethodNameAndDesc(name, sb.toString()); return MemberSignature.fromMethodNameAndDesc(name, sb.toString());
} }
@NotNull @NotNull
public Type type(@NotNull JavaProtoBuf.JavaType type) { public String typeDescriptor(@NotNull JavaProtoBuf.JavaType type) {
Type result; return typeDescriptor(type, new StringBuilder()).toString();
}
@NotNull
private StringBuilder typeDescriptor(@NotNull JavaProtoBuf.JavaType type, @NotNull StringBuilder sb) {
for (int i = 0; i < type.getArrayDimension(); i++) {
sb.append('[');
}
if (type.hasPrimitiveType()) { if (type.hasPrimitiveType()) {
result = PRIMITIVE_TYPES[type.getPrimitiveType().ordinal()]; sb.append(PRIMITIVE_TYPES[type.getPrimitiveType().ordinal()]);
} }
else { else {
result = Type.getObjectType(fqNameToInternalName(nameResolver.getFqName(type.getClassFqName()))); sb.append("L");
sb.append(fqNameToInternalName(nameResolver.getFqName(type.getClassFqName())));
sb.append(";");
} }
StringBuilder brackets = new StringBuilder(type.getArrayDimension()); return sb;
for (int i = 0; i < type.getArrayDimension(); i++) {
brackets.append('[');
}
return Type.getType(brackets + result.getDescriptor());
} }
@NotNull @NotNull