From 57ed81521d27d121a0f556d015d07d20a39671cc Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Sun, 29 Sep 2013 21:05:33 +0400 Subject: [PATCH] Don't call .getFqName() when writing package src class name Package$src class names contain dollars, and JvmClassName.getFqName() doesn't work very well for such names --- .../src/org/jetbrains/jet/codegen/AsmUtil.java | 7 +++++++ .../org/jetbrains/jet/codegen/FunctionCodegen.java | 5 ++--- .../jet/codegen/JavaSerializerExtension.java | 9 ++++++--- .../src/org/jetbrains/jet/codegen/MemberMap.java | 11 +++++------ .../org/jetbrains/jet/codegen/PropertyCodegen.java | 9 ++++----- 5 files changed, 24 insertions(+), 17 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java b/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java index 715366d4a99..ae7214d63db 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java @@ -669,4 +669,11 @@ public class AsmUtil { public static String asmDescByFqNameWithoutInnerClasses(@NotNull FqName fqName) { return "L" + JvmClassName.byFqNameWithoutInnerClasses(fqName).getInternalName() + ';'; } + + @NotNull + public static String shortNameByAsmType(@NotNull Type type) { + String internalName = type.getInternalName(); + int lastSlash = internalName.lastIndexOf('/'); + return lastSlash < 0 ? internalName : internalName.substring(lastSlash + 1); + } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java index e22a6e8544c..3cf1be5b8c4 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java @@ -43,7 +43,6 @@ import org.jetbrains.jet.lang.psi.JetNamedFunction; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.lang.resolve.java.JvmClassName; -import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; import java.util.*; @@ -113,8 +112,8 @@ public class FunctionCodegen extends GenerationStateAware { OwnerKind contextKind = owner.getContextKind(); if (contextKind instanceof OwnerKind.StaticDelegateKind) { - FqName fqName = ((OwnerKind.StaticDelegateKind) contextKind).getOwnerClass().getFqName(); - v.getMemberMap().recordSrcClassNameForCallable(functionDescriptor, fqName.shortName()); + JvmClassName ownerName = ((OwnerKind.StaticDelegateKind) contextKind).getOwnerClass(); + v.getMemberMap().recordSrcClassNameForCallable(functionDescriptor, shortNameByAsmType(ownerName.getAsmType())); } else { v.getMemberMap().recordMethodOfDescriptor(functionDescriptor, asmMethod); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/JavaSerializerExtension.java b/compiler/backend/src/org/jetbrains/jet/codegen/JavaSerializerExtension.java index 34e8affa058..8abc10d13c2 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/JavaSerializerExtension.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/JavaSerializerExtension.java @@ -21,7 +21,10 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.asm4.Type; import org.jetbrains.asm4.commons.Method; -import org.jetbrains.jet.descriptors.serialization.*; +import org.jetbrains.jet.descriptors.serialization.JavaProtoBuf; +import org.jetbrains.jet.descriptors.serialization.NameTable; +import org.jetbrains.jet.descriptors.serialization.ProtoBuf; +import org.jetbrains.jet.descriptors.serialization.SerializerExtension; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; @@ -93,9 +96,9 @@ public class JavaSerializerExtension extends SerializerExtension { @NotNull ProtoBuf.Callable.Builder proto, @NotNull NameTable nameTable ) { - Name name = memberMap.getSrcClassNameOfCallable(callable); + String name = memberMap.getSrcClassNameOfCallable(callable); if (name != null) { - proto.setExtension(JavaProtoBuf.srcClassName, nameTable.getSimpleNameIndex(name)); + proto.setExtension(JavaProtoBuf.srcClassName, nameTable.getSimpleNameIndex(Name.identifier(name))); } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/MemberMap.java b/compiler/backend/src/org/jetbrains/jet/codegen/MemberMap.java index 047bf7d54fd..78420bf0643 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/MemberMap.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/MemberMap.java @@ -24,7 +24,6 @@ import org.jetbrains.asm4.commons.Method; import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor; import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; -import org.jetbrains.jet.lang.resolve.name.Name; import java.util.*; @@ -32,7 +31,7 @@ public final class MemberMap { private final Map methodForFunction = new HashMap(); private final Map> fieldForProperty = new HashMap>(); private final Map syntheticMethodNameForProperty = new HashMap(); - private final Map srcClassNameForCallable = new HashMap(); + private final Map srcClassNameForCallable = new HashMap(); private final Set staticFieldInOuterClass = new HashSet(); @NotNull @@ -51,7 +50,7 @@ public final class MemberMap { result.recordSyntheticMethodNameOfProperty(entry.getKey(), entry.getValue()); } - for (Map.Entry entry : map.srcClassNameForCallable.entrySet()) { + for (Map.Entry entry : map.srcClassNameForCallable.entrySet()) { result.recordSrcClassNameForCallable(entry.getKey(), entry.getValue()); } @@ -78,8 +77,8 @@ public final class MemberMap { assert old == null : "Duplicate synthetic method for property: " + descriptor + "; " + old; } - public void recordSrcClassNameForCallable(@NotNull CallableMemberDescriptor descriptor, @NotNull Name name) { - Name old = srcClassNameForCallable.put(descriptor, name); + public void recordSrcClassNameForCallable(@NotNull CallableMemberDescriptor descriptor, @NotNull String name) { + String old = srcClassNameForCallable.put(descriptor, name); assert old == null : "Duplicate src class name for callable: " + descriptor + "; " + old; } @@ -104,7 +103,7 @@ public final class MemberMap { } @Nullable - public Name getSrcClassNameOfCallable(@NotNull CallableMemberDescriptor descriptor) { + public String getSrcClassNameOfCallable(@NotNull CallableMemberDescriptor descriptor) { return srcClassNameForCallable.get(descriptor); } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java index 37efbd34d5b..702117d7d37 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java @@ -37,15 +37,14 @@ import org.jetbrains.jet.lang.resolve.DescriptorFactory; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall; import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; import org.jetbrains.jet.lang.resolve.java.JvmAbi; -import org.jetbrains.jet.lang.resolve.name.FqName; +import org.jetbrains.jet.lang.resolve.java.JvmClassName; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.types.ErrorUtils; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import static org.jetbrains.asm4.Opcodes.*; -import static org.jetbrains.jet.codegen.AsmUtil.getDeprecatedAccessFlag; -import static org.jetbrains.jet.codegen.AsmUtil.getVisibilityForSpecialPropertyBackingField; +import static org.jetbrains.jet.codegen.AsmUtil.*; import static org.jetbrains.jet.codegen.CodegenUtil.getParentBodyCodegen; import static org.jetbrains.jet.codegen.CodegenUtil.isInterface; import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.OBJECT_TYPE; @@ -89,8 +88,8 @@ public class PropertyCodegen extends GenerationStateAware { : "Generating property with a wrong kind (" + kind + "): " + propertyDescriptor; if (kind instanceof OwnerKind.StaticDelegateKind) { - FqName fqName = ((OwnerKind.StaticDelegateKind) kind).getOwnerClass().getFqName(); - v.getMemberMap().recordSrcClassNameForCallable(propertyDescriptor, fqName.shortName()); + JvmClassName ownerName = ((OwnerKind.StaticDelegateKind) kind).getOwnerClass(); + v.getMemberMap().recordSrcClassNameForCallable(propertyDescriptor, shortNameByAsmType(ownerName.getAsmType())); } else if (kind != OwnerKind.TRAIT_IMPL) { generateBackingField(p, propertyDescriptor);