primary field of JvmClassName must be internal name

because fq name can be mapped to different internal names
This commit is contained in:
Stepan Koltsov
2012-06-08 03:39:04 +04:00
parent 5468af848e
commit a929f86127
4 changed files with 43 additions and 29 deletions
@@ -28,5 +28,6 @@ public class JvmAbi {
public static final String CLASS_OBJECT_SUFFIX = "$ClassObject$";
public static final String CLASS_OBJECT_CLASS_NAME = "ClassObject$";
public static final JvmClassName JETBRAINS_NOT_NULL_ANNOTATION = new JvmClassName("org.jetbrains.annotations.NotNull");
public static final JvmClassName JETBRAINS_NOT_NULL_ANNOTATION =
JvmClassName.byFqNameWithoutInnerClasses("org.jetbrains.annotations.NotNull");
}
@@ -26,22 +26,18 @@ import org.objectweb.asm.Type;
public class JvmClassName {
@NotNull
private final FqName fqName;
private final String internalName;
public JvmClassName(@NotNull String fqName) {
this(new FqName(fqName));
}
public JvmClassName(@NotNull FqName fqName) {
this.fqName = fqName;
private JvmClassName(@NotNull String internalName) {
this.internalName = internalName;
}
@NotNull
public static JvmClassName byInternalName(@NotNull String internalName) {
JvmClassName r = new JvmClassName(internalName.replace('/', '.'));
r.internalName = internalName;
return r;
return new JvmClassName(internalName);
}
@NotNull
public static JvmClassName byType(@NotNull Type type) {
if (type.getSort() != Type.OBJECT) {
throw new IllegalArgumentException(
@@ -50,20 +46,37 @@ public class JvmClassName {
return byInternalName(type.getInternalName());
}
/**
* WARNING: fq name is cannot be uniquely mapped to JVM class name.
*/
@NotNull
public static JvmClassName byFqNameWithoutInnerClasses(@NotNull FqName fqName) {
JvmClassName r = new JvmClassName(fqName.getFqName().replace('.', '/'));
r.fqName = fqName;
return r;
}
@NotNull
public static JvmClassName byFqNameWithoutInnerClasses(@NotNull String fqName) {
return byFqNameWithoutInnerClasses(new FqName(fqName));
}
private transient FqName fqName;
@NotNull
public FqName getFqName() {
if (fqName == null) {
this.fqName = new FqName(internalName.replace('$', '.').replace('/', '.'));
}
return fqName;
}
private String internalName;
@NotNull
public String getInternalName() {
if (internalName == null) {
String descriptor = getDescriptor();
internalName = descriptor.substring(1, descriptor.length() - 1);
}
return internalName;
}
@@ -71,9 +84,9 @@ public class JvmClassName {
public String getDescriptor() {
if (descriptor == null) {
StringBuilder sb = new StringBuilder(fqName.getFqName().length() + 2);
StringBuilder sb = new StringBuilder(internalName.length() + 2);
sb.append('L');
sb.append(fqName.getFqName().replace('.', '/'));
sb.append(internalName);
sb.append(';');
descriptor = sb.toString();
}
@@ -48,11 +48,11 @@ public enum JvmPrimitiveType {
private JvmPrimitiveType(PrimitiveType primitiveType, String name, String wrapperClassName, Type asmType) {
this.primitiveType = primitiveType;
this.name = name;
this.wrapper = new JvmClassName(wrapperClassName);
this.wrapper = JvmClassName.byFqNameWithoutInnerClasses(wrapperClassName);
this.asmType = asmType;
this.jvmLetter = asmType.getDescriptor().charAt(0);
this.asmArrayType = makeArrayType(asmType);
this.iterator = new JvmClassName("jet." + primitiveType.getTypeName() + "Iterator");
this.iterator = JvmClassName.byFqNameWithoutInnerClasses("jet." + primitiveType.getTypeName() + "Iterator");
}
private static Type makeArrayType(Type type) {
@@ -24,7 +24,7 @@ import jet.runtime.typeinfo.KotlinSignature;
*/
public class JvmStdlibNames {
public static final JvmClassName JET_VALUE_PARAMETER = new JvmClassName("jet.runtime.typeinfo.JetValueParameter");
public static final JvmClassName JET_VALUE_PARAMETER = JvmClassName.byFqNameWithoutInnerClasses("jet.runtime.typeinfo.JetValueParameter");
public static final String JET_VALUE_PARAMETER_NAME_FIELD = "name";
public static final String JET_VALUE_PARAMETER_HAS_DEFAULT_VALUE_FIELD = "hasDefaultValue";
@@ -33,12 +33,12 @@ public class JvmStdlibNames {
public static final String JET_VALUE_PARAMETER_RECEIVER_FIELD = "receiver";
public static final JvmClassName JET_TYPE_PARAMETER = new JvmClassName("jet.runtime.typeinfo.JetTypeParameter");
public static final JvmClassName JET_TYPE_PARAMETER = JvmClassName.byFqNameWithoutInnerClasses("jet.runtime.typeinfo.JetTypeParameter");
public static final String JET_TYPE_PARAMETER_NAME_FIELD = "name";
public static final JvmClassName JET_METHOD = new JvmClassName("jet.runtime.typeinfo.JetMethod");
public static final JvmClassName JET_METHOD = JvmClassName.byFqNameWithoutInnerClasses("jet.runtime.typeinfo.JetMethod");
public static final String JET_METHOD_KIND_FIELD = "kind";
public static final String JET_METHOD_NULLABLE_RETURN_TYPE_FIELD = "nullableReturnType";
@@ -50,7 +50,7 @@ public class JvmStdlibNames {
public static final int JET_METHOD_KIND_PROPERTY = 1;
public static final int JET_METHOD_KIND_DEFAULT = JET_METHOD_KIND_REGULAR;
public static final JvmClassName JET_CONSTRUCTOR = new JvmClassName("jet.runtime.typeinfo.JetConstructor");
public static final JvmClassName JET_CONSTRUCTOR = JvmClassName.byFqNameWithoutInnerClasses("jet.runtime.typeinfo.JetConstructor");
/**
* @deprecated
@@ -59,17 +59,17 @@ public class JvmStdlibNames {
public static final String JET_CONSTRUCTOR_HIDDEN_FIELD = "hidden";
public static final JvmClassName JET_CLASS = new JvmClassName("jet.runtime.typeinfo.JetClass");
public static final JvmClassName JET_CLASS = JvmClassName.byFqNameWithoutInnerClasses("jet.runtime.typeinfo.JetClass");
public static final String JET_CLASS_SIGNATURE = "signature";
public static final JvmClassName JET_OBJECT = new JvmClassName("jet.JetObject");
public static final JvmClassName JET_OBJECT = JvmClassName.byFqNameWithoutInnerClasses("jet.JetObject");
public static final JvmClassName ASSERT_INVISIBLE_IN_RESOLVER = new JvmClassName("org.jetbrains.jet.rt.annotation.AssertInvisibleInResolver");
public static final JvmClassName ASSERT_INVISIBLE_IN_RESOLVER = JvmClassName.byFqNameWithoutInnerClasses("org.jetbrains.jet.rt.annotation.AssertInvisibleInResolver");
public static final JvmClassName KOTLIN_SIGNATURE = new JvmClassName("jet.runtime.typeinfo.KotlinSignature");
public static final JvmClassName KOTLIN_SIGNATURE = JvmClassName.byFqNameWithoutInnerClasses("jet.runtime.typeinfo.KotlinSignature");
public static final String KOTLIN_SIGNATURE_VALUE_METHOD = "value";
private JvmStdlibNames() {