diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java index f73937259fd..4c28b134333 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java @@ -211,8 +211,8 @@ public class ExpressionCodegen extends JetVisitor implem ClassContext objectContext = context.intoAnonymousClass(classDescriptor, this, OwnerKind.IMPLEMENTATION); MemberCodegen literalCodegen = new ImplementationBodyCodegen( - objectDeclaration, objectContext, classBuilder, state, getParentCodegen() - ); + objectDeclaration, objectContext, classBuilder, state, getParentCodegen(), + /* isLocal = */ true); literalCodegen.generate(); addReifiedParametersFromSignature(literalCodegen, classDescriptor); @@ -330,7 +330,7 @@ public class ExpressionCodegen extends JetVisitor implem ClassBuilder classBuilder = state.getFactory().newVisitor(OtherOrigin(declaration, descriptor), asmType, declaration.getContainingFile()); ClassContext objectContext = context.intoAnonymousClass(descriptor, this, OwnerKind.IMPLEMENTATION); - new ImplementationBodyCodegen(declaration, objectContext, classBuilder, state, getParentCodegen()).generate(); + new ImplementationBodyCodegen(declaration, objectContext, classBuilder, state, getParentCodegen(), /* isLocal = */ true).generate(); if (declaration instanceof JetClass && ((JetClass) declaration).isInterface()) { Type traitImplType = state.getTypeMapper().mapDefaultImpls(descriptor); diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java index 1587b54923c..b60df240b79 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java @@ -100,6 +100,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { @Nullable // null means java/lang/Object private JetType superClassType; private final Type classAsmType; + private final boolean isLocal; private List companionObjectPropertiesToCopy; @@ -111,10 +112,12 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { @NotNull ClassContext context, @NotNull ClassBuilder v, @NotNull GenerationState state, - @Nullable MemberCodegen parentCodegen + @Nullable MemberCodegen parentCodegen, + boolean isLocal ) { super(aClass, context, v, state, parentCodegen); this.classAsmType = typeMapper.mapClass(descriptor); + this.isLocal = isLocal; } @Override @@ -231,6 +234,22 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { generateEnumEntries(); } + @Override + protected void generateBody() { + super.generateBody(); + if (isInterface(descriptor) && !isLocal) { + Type defaultImplsType = state.getTypeMapper().mapDefaultImpls(descriptor); + ClassBuilder defaultImplsBuilder = + state.getFactory().newVisitor(TraitImpl(myClass, descriptor), defaultImplsType, myClass.getContainingFile()); + + CodegenContext parentContext = context.getParentContext(); + assert parentContext != null : "Parent context of interface declaration should not be null"; + + ClassContext defaultImplsContext = parentContext.intoClass(descriptor, OwnerKind.DEFAULT_IMPLS, state); + new InterfaceImplBodyCodegen(myClass, defaultImplsContext, defaultImplsBuilder, state, this).generate(); + } + } + @Override protected void generateKotlinAnnotation() { if (state.getClassBuilderMode() != ClassBuilderMode.FULL) return; diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java index 49119b02d3d..717953fc5fa 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java @@ -205,14 +205,7 @@ public abstract class MemberCodegen