diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmAbi.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmAbi.java index 35498eeba7e..0c155960369 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmAbi.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmAbi.java @@ -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"); } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmClassName.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmClassName.java index bdef4564b8b..f0366f96a0e 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmClassName.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmClassName.java @@ -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(); } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmPrimitiveType.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmPrimitiveType.java index 2603944aac7..395e0887023 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmPrimitiveType.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmPrimitiveType.java @@ -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) { diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmStdlibNames.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmStdlibNames.java index 51239cb6b19..d0ee5ce11e7 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmStdlibNames.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmStdlibNames.java @@ -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() {