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_SUFFIX = "$ClassObject$";
public static final String CLASS_OBJECT_CLASS_NAME = "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 { public class JvmClassName {
@NotNull @NotNull
private final FqName fqName; private final String internalName;
public JvmClassName(@NotNull String fqName) { private JvmClassName(@NotNull String internalName) {
this(new FqName(fqName)); this.internalName = internalName;
}
public JvmClassName(@NotNull FqName fqName) {
this.fqName = fqName;
} }
@NotNull
public static JvmClassName byInternalName(@NotNull String internalName) { public static JvmClassName byInternalName(@NotNull String internalName) {
JvmClassName r = new JvmClassName(internalName.replace('/', '.')); return new JvmClassName(internalName);
r.internalName = internalName;
return r;
} }
@NotNull
public static JvmClassName byType(@NotNull Type type) { public static JvmClassName byType(@NotNull Type type) {
if (type.getSort() != Type.OBJECT) { if (type.getSort() != Type.OBJECT) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
@@ -50,20 +46,37 @@ public class JvmClassName {
return byInternalName(type.getInternalName()); 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 @NotNull
public FqName getFqName() { public FqName getFqName() {
if (fqName == null) {
this.fqName = new FqName(internalName.replace('$', '.').replace('/', '.'));
}
return fqName; return fqName;
} }
private String internalName; @NotNull
public String getInternalName() { public String getInternalName() {
if (internalName == null) {
String descriptor = getDescriptor();
internalName = descriptor.substring(1, descriptor.length() - 1);
}
return internalName; return internalName;
} }
@@ -71,9 +84,9 @@ public class JvmClassName {
public String getDescriptor() { public String getDescriptor() {
if (descriptor == null) { if (descriptor == null) {
StringBuilder sb = new StringBuilder(fqName.getFqName().length() + 2); StringBuilder sb = new StringBuilder(internalName.length() + 2);
sb.append('L'); sb.append('L');
sb.append(fqName.getFqName().replace('.', '/')); sb.append(internalName);
sb.append(';'); sb.append(';');
descriptor = sb.toString(); descriptor = sb.toString();
} }
@@ -48,11 +48,11 @@ public enum JvmPrimitiveType {
private JvmPrimitiveType(PrimitiveType primitiveType, String name, String wrapperClassName, Type asmType) { private JvmPrimitiveType(PrimitiveType primitiveType, String name, String wrapperClassName, Type asmType) {
this.primitiveType = primitiveType; this.primitiveType = primitiveType;
this.name = name; this.name = name;
this.wrapper = new JvmClassName(wrapperClassName); this.wrapper = JvmClassName.byFqNameWithoutInnerClasses(wrapperClassName);
this.asmType = asmType; this.asmType = asmType;
this.jvmLetter = asmType.getDescriptor().charAt(0); this.jvmLetter = asmType.getDescriptor().charAt(0);
this.asmArrayType = makeArrayType(asmType); 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) { private static Type makeArrayType(Type type) {
@@ -24,7 +24,7 @@ import jet.runtime.typeinfo.KotlinSignature;
*/ */
public class JvmStdlibNames { 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_NAME_FIELD = "name";
public static final String JET_VALUE_PARAMETER_HAS_DEFAULT_VALUE_FIELD = "hasDefaultValue"; 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 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 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_KIND_FIELD = "kind";
public static final String JET_METHOD_NULLABLE_RETURN_TYPE_FIELD = "nullableReturnType"; 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_PROPERTY = 1;
public static final int JET_METHOD_KIND_DEFAULT = JET_METHOD_KIND_REGULAR; 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 * @deprecated
@@ -59,17 +59,17 @@ public class JvmStdlibNames {
public static final String JET_CONSTRUCTOR_HIDDEN_FIELD = "hidden"; 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 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"; public static final String KOTLIN_SIGNATURE_VALUE_METHOD = "value";
private JvmStdlibNames() { private JvmStdlibNames() {