diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/binding/CodegenBinding.java b/compiler/backend/src/org/jetbrains/jet/codegen/binding/CodegenBinding.java index 22b59fe3049..f44a9de2dfd 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/binding/CodegenBinding.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/binding/CodegenBinding.java @@ -28,10 +28,8 @@ import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall; -import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; -import org.jetbrains.jet.lang.resolve.name.SpecialNames; import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; @@ -292,47 +290,6 @@ public class CodegenBinding { return type; } - @NotNull - public static Type computeAsmType(@NotNull BindingContext bindingContext, @NotNull ClassDescriptor klass) { - Type alreadyComputedType = bindingContext.get(ASM_TYPE, klass); - if (alreadyComputedType != null) { - return alreadyComputedType; - } - - Type asmType = Type.getObjectType(computeAsmTypeImpl(bindingContext, klass)); - assert PsiCodegenPredictor.checkPredictedNameFromPsi(klass, asmType); - return asmType; - } - - @NotNull - private static String computeAsmTypeImpl(@NotNull BindingContext bindingContext, @NotNull ClassDescriptor klass) { - DeclarationDescriptor container = klass.getContainingDeclaration(); - - Name name = SpecialNames.safeIdentifier(klass.getName()); - if (container instanceof PackageFragmentDescriptor) { - String shortName = name.getIdentifier(); - FqName fqName = ((PackageFragmentDescriptor) container).getFqName(); - return fqName.isRoot() ? shortName : fqName.asString().replace('.', '/') + '/' + shortName; - } - - if (container instanceof ScriptDescriptor) { - Type scriptType = asmTypeForScriptDescriptor(bindingContext, (ScriptDescriptor) container); - return scriptType.getInternalName() + "$" + name.getIdentifier(); - } - - assert container instanceof ClassDescriptor : "Unexpected container: " + container + " for " + klass; - - String containerInternalName = computeAsmTypeImpl(bindingContext, (ClassDescriptor) container); - switch (klass.getKind()) { - case ENUM_ENTRY: - return containerInternalName; - case CLASS_OBJECT: - return containerInternalName + JvmAbi.CLASS_OBJECT_SUFFIX; - default: - return containerInternalName + "$" + name.getIdentifier(); - } - } - @Nullable private static ResolvedCall findSuperCall( @NotNull BindingContext bindingContext, diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java index 5fcd27830ac..737d4333065 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java @@ -23,6 +23,7 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.codegen.*; import org.jetbrains.jet.codegen.binding.CalculatedClosure; import org.jetbrains.jet.codegen.binding.CodegenBinding; +import org.jetbrains.jet.codegen.binding.PsiCodegenPredictor; import org.jetbrains.jet.codegen.context.CodegenContext; import org.jetbrains.jet.codegen.signature.BothSignatureWriter; import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedCallableMemberDescriptor; @@ -48,6 +49,7 @@ import org.jetbrains.jet.lang.resolve.java.mapping.KotlinToJavaTypesMap; import org.jetbrains.jet.lang.resolve.kotlin.PackagePartClassUtils; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe; +import org.jetbrains.jet.lang.resolve.name.SpecialNames; import org.jetbrains.jet.lang.types.*; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import org.jetbrains.org.objectweb.asm.Type; @@ -277,7 +279,7 @@ public class JetTypeMapper { } if (descriptor instanceof ClassDescriptor) { - Type asmType = computeAsmType(bindingContext, (ClassDescriptor) descriptor.getOriginal()); + Type asmType = computeAsmType((ClassDescriptor) descriptor.getOriginal()); writeGenericType(signatureVisitor, asmType, jetType, howThisTypeIsUsed, projectionsAllowed); return asmType; } @@ -294,6 +296,45 @@ public class JetTypeMapper { throw new UnsupportedOperationException("Unknown type " + jetType); } + @NotNull + private Type computeAsmType(@NotNull ClassDescriptor klass) { + Type alreadyComputedType = bindingContext.get(ASM_TYPE, klass); + if (alreadyComputedType != null) { + return alreadyComputedType; + } + + Type asmType = Type.getObjectType(computeAsmTypeImpl(klass)); + assert PsiCodegenPredictor.checkPredictedNameFromPsi(klass, asmType); + return asmType; + } + + @NotNull + private String computeAsmTypeImpl(@NotNull ClassDescriptor klass) { + DeclarationDescriptor container = klass.getContainingDeclaration(); + + String name = SpecialNames.safeIdentifier(klass.getName()).getIdentifier(); + if (container instanceof PackageFragmentDescriptor) { + FqName fqName = ((PackageFragmentDescriptor) container).getFqName(); + return fqName.isRoot() ? name : fqName.asString().replace('.', '/') + '/' + name; + } + + if (container instanceof ScriptDescriptor) { + return asmTypeForScriptDescriptor(bindingContext, (ScriptDescriptor) container).getInternalName() + "$" + name; + } + + assert container instanceof ClassDescriptor : "Unexpected container: " + container + " for " + klass; + + String containerInternalName = computeAsmTypeImpl((ClassDescriptor) container); + switch (klass.getKind()) { + case ENUM_ENTRY: + return containerInternalName; + case CLASS_OBJECT: + return containerInternalName + JvmAbi.CLASS_OBJECT_SUFFIX; + default: + return containerInternalName + "$" + name; + } + } + @NotNull public Type mapTraitImpl(@NotNull ClassDescriptor descriptor) { return Type.getObjectType(mapType(descriptor).getInternalName() + JvmAbi.TRAIT_IMPL_SUFFIX);