diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index 3442b0cea93..2e1510a65ee 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -18,6 +18,7 @@ package org.jetbrains.jet.codegen; import com.google.common.collect.Lists; import com.google.common.collect.Sets; +import com.google.protobuf.ExtensionRegistry; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.util.Pair; import com.intellij.psi.PsiElement; @@ -42,6 +43,7 @@ import org.jetbrains.jet.descriptors.serialization.DescriptorSerializer; import org.jetbrains.jet.descriptors.serialization.ProtoBuf; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.impl.MutableClassDescriptor; +import org.jetbrains.jet.lang.diagnostics.DiagnosticUtils; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContextUtils; @@ -53,6 +55,7 @@ import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants; import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.lang.resolve.java.JvmAnnotationNames; +import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.types.*; import org.jetbrains.jet.lang.types.checker.JetTypeChecker; @@ -349,25 +352,40 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { } sw.writeSuperclassEnd(); - LinkedHashSet superInterfaces = new LinkedHashSet(); - sw.writeInterface(); - sw.writeClassBegin(Type.getObjectType(JvmAbi.JET_OBJECT.getInternalName())); - sw.writeClassEnd(); - sw.writeInterfaceEnd(); - superInterfaces.add(JvmAbi.JET_OBJECT.getInternalName()); + List interfaceSupertypes = Lists.newArrayList(); + FqNameUnsafe jetObjectFqName = JvmAbi.JET_OBJECT.getFqNameForClassNameWithoutDollars().toUnsafe(); + boolean explicitJetObject = false; for (JetDelegationSpecifier specifier : myClass.getDelegationSpecifiers()) { JetType superType = bindingContext.get(BindingContext.TYPE, specifier.getTypeReference()); assert superType != null : "No supertype for class: " + myClass.getText(); ClassDescriptor superClassDescriptor = (ClassDescriptor) superType.getConstructor().getDeclarationDescriptor(); if (isInterface(superClassDescriptor)) { - sw.writeInterface(); - Type jvmName = typeMapper.mapSupertype(superType, sw); - sw.writeInterfaceEnd(); - superInterfaces.add(jvmName.getInternalName()); + interfaceSupertypes.add(superType); + + assert superClassDescriptor != null : "should be already checked by isInterface()"; + if (jetObjectFqName.equals(DescriptorUtils.getFqName(superClassDescriptor))) { + explicitJetObject = true; + } } } + LinkedHashSet superInterfaces = new LinkedHashSet(); + if (!explicitJetObject) { + sw.writeInterface(); + sw.writeClassBegin(Type.getObjectType(JvmAbi.JET_OBJECT.getInternalName())); + sw.writeClassEnd(); + sw.writeInterfaceEnd(); + superInterfaces.add(JvmAbi.JET_OBJECT.getInternalName()); + } + + for (JetType supertype : interfaceSupertypes) { + sw.writeInterface(); + Type jvmName = typeMapper.mapSupertype(supertype, sw); + sw.writeInterfaceEnd(); + superInterfaces.add(jvmName.getInternalName()); + } + return new JvmClassSignature(classAsmType.getInternalName(), superClassAsmType.getInternalName(), new ArrayList(superInterfaces), sw.makeJavaGenericSignature()); diff --git a/compiler/testData/codegen/boxWithStdlib/regressions/getGenericInterfaces.kt b/compiler/testData/codegen/boxWithStdlib/regressions/getGenericInterfaces.kt index 62882c27798..d20e96e2b41 100644 --- a/compiler/testData/codegen/boxWithStdlib/regressions/getGenericInterfaces.kt +++ b/compiler/testData/codegen/boxWithStdlib/regressions/getGenericInterfaces.kt @@ -8,6 +8,10 @@ class ClassWithGenericSuperInterface: java.util.Comparator { override fun compare(a: String, b: String): Int = 0 } +class ExplicitJetObject: java.util.Comparator, JetObject { + override fun compare(a: String, b: String): Int = 0 +} + fun check(klass: Class<*>) { val interfaces = klass.getInterfaces().toList() val genericInterfaces = klass.getGenericInterfaces().toList() @@ -20,5 +24,6 @@ fun box(): String { check(javaClass()) check(javaClass()) check(javaClass()) + check(javaClass()) return "OK" } \ No newline at end of file