From 86bb01edcf746a9d8b95b891d4341ac58f2c7378 Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Wed, 21 Dec 2011 09:04:08 +0300 Subject: [PATCH] Correct inner/outer class relation in kotlin => java run --- .../org/jetbrains/jet/codegen/ClassBodyCodegen.java | 2 -- .../src/org/jetbrains/jet/codegen/ClassCodegen.java | 13 ++++++++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBodyCodegen.java index 83d535a52a1..a277a4b5444 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBodyCodegen.java @@ -48,8 +48,6 @@ public abstract class ClassBodyCodegen { generateSyntheticParts(accessors); generateStaticInitializer(); - - v.done(); } protected abstract void generateDeclaration(); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClassCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClassCodegen.java index be784975f03..50996384f19 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ClassCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClassCodegen.java @@ -26,6 +26,12 @@ public class ClassCodegen { } final CodegenContext contextForInners = context.intoClass(descriptor, OwnerKind.IMPLEMENTATION, state.getTypeMapper()); + + if (!classBuilder.generateCode()) { + // Outer class implementation must happen prior inner classes so we get proper scoping tree in JetLightClass's delegate + generateImplementation(context, aClass, OwnerKind.IMPLEMENTATION, contextForInners.accessors, classBuilder); + } + for (JetDeclaration declaration : aClass.getDeclarations()) { if (declaration instanceof JetClass && !(declaration instanceof JetEnumEntry)) { generate(contextForInners, (JetClass) declaration); @@ -35,7 +41,11 @@ public class ClassCodegen { } } - generateImplementation(context, aClass, OwnerKind.IMPLEMENTATION, contextForInners.accessors, classBuilder); + if (classBuilder.generateCode()) { + generateImplementation(context, aClass, OwnerKind.IMPLEMENTATION, contextForInners.accessors, classBuilder); + } + + classBuilder.done(); } private void generateImplementation(CodegenContext context, JetClassOrObject aClass, OwnerKind kind, HashMap accessors, ClassBuilder classBuilder) { @@ -46,6 +56,7 @@ public class ClassCodegen { if(aClass instanceof JetClass && ((JetClass)aClass).isTrait()) { ClassBuilder traitBuilder = state.forTraitImplementation(descriptor); new TraitImplBodyCodegen(aClass, context.intoClass(descriptor, OwnerKind.TRAIT_IMPL, state.getTypeMapper()), traitBuilder, state).generate(null); + traitBuilder.done(); } } }