diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index a8660f9b5ac..ca60d90a3ba 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -187,7 +187,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { private void writeInnerClasses() { for (ClassDescriptor innerClass : getInnerClassesAndObjects(descriptor)) { - writeInnerClass(innerClass, false /* TODO */); + writeInnerClass(innerClass); } ClassDescriptor classObjectDescriptor = descriptor.getClassObjectDescriptor(); @@ -199,7 +199,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { } } - private void writeInnerClass(ClassDescriptor innerClass, boolean isStatic) { + private void writeInnerClass(ClassDescriptor innerClass) { // TODO: proper access int innerClassAccess = getVisibilityAccessFlag(innerClass); if (innerClass.getModality() == Modality.FINAL) { @@ -216,7 +216,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { innerClassAccess |= ACC_ENUM; } - if (isStatic) { + if (!innerClass.isInner()) { innerClassAccess |= ACC_STATIC; } 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 b7423f3895a..7baf8b9ffba 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/binding/CodegenBinding.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/binding/CodegenBinding.java @@ -134,17 +134,25 @@ public class CodegenBinding { } public static boolean canHaveOuter(BindingContext bindingContext, @NotNull ClassDescriptor classDescriptor) { - final ClassKind kind = classDescriptor.getKind(); if (isSingleton(bindingContext, classDescriptor)) { return false; } - if (kind == ClassKind.ENUM_CLASS) { + ClassDescriptor enclosing = enclosingClassDescriptor(bindingContext, classDescriptor); + if (enclosing == null) { return false; } - final ClassDescriptor enclosing = enclosingClassDescriptor(bindingContext, classDescriptor); - return enclosing != null && !isSingleton(bindingContext, enclosing); + ClassKind kind = classDescriptor.getKind(); + if (kind == ClassKind.CLASS) { + return classDescriptor.isInner() || !(classDescriptor.getContainingDeclaration() instanceof ClassDescriptor); + } + else if (kind == ClassKind.OBJECT) { + return !isSingleton(bindingContext, enclosing); + } + else { + return false; + } } public static boolean isSingleton(BindingContext bindingContext, @NotNull ClassDescriptor classDescriptor) { diff --git a/compiler/testData/writeFlags/innerClass/visibility/internal.kt b/compiler/testData/writeFlags/innerClass/visibility/internal.kt index e5e7e408df6..3eeaa2e4e77 100644 --- a/compiler/testData/writeFlags/innerClass/visibility/internal.kt +++ b/compiler/testData/writeFlags/innerClass/visibility/internal.kt @@ -1,5 +1,5 @@ class Foo { - class MyClass() { + inner class MyClass() { } } diff --git a/compiler/testData/writeFlags/innerClass/visibility/private.kt b/compiler/testData/writeFlags/innerClass/visibility/private.kt index 3d691f34c2c..292b313f2a9 100644 --- a/compiler/testData/writeFlags/innerClass/visibility/private.kt +++ b/compiler/testData/writeFlags/innerClass/visibility/private.kt @@ -1,5 +1,5 @@ class Foo { - private class MyClass() { + private inner class MyClass() { } } diff --git a/compiler/testData/writeFlags/innerClass/visibility/public.kt b/compiler/testData/writeFlags/innerClass/visibility/public.kt index bd65e7413a8..2ef3e89581c 100644 --- a/compiler/testData/writeFlags/innerClass/visibility/public.kt +++ b/compiler/testData/writeFlags/innerClass/visibility/public.kt @@ -1,5 +1,5 @@ class Foo { - public class MyClass() { + public inner class MyClass() { } } diff --git a/compiler/testData/writeFlags/property/visibility/internal.kt b/compiler/testData/writeFlags/property/visibility/internal.kt index cd5cb865054..c17dc7a0163 100644 --- a/compiler/testData/writeFlags/property/visibility/internal.kt +++ b/compiler/testData/writeFlags/property/visibility/internal.kt @@ -1,5 +1,5 @@ class Foo { - class MyClass() { + inner class MyClass() { } } diff --git a/compiler/testData/writeFlags/property/visibility/private.kt b/compiler/testData/writeFlags/property/visibility/private.kt index cd2b7140606..b6d56a703e5 100644 --- a/compiler/testData/writeFlags/property/visibility/private.kt +++ b/compiler/testData/writeFlags/property/visibility/private.kt @@ -1,5 +1,5 @@ class Foo { - private class MyClass() { + private inner class MyClass() { } } diff --git a/compiler/testData/writeFlags/property/visibility/public.kt b/compiler/testData/writeFlags/property/visibility/public.kt index a3b8e1b914f..63f97f4fe13 100644 --- a/compiler/testData/writeFlags/property/visibility/public.kt +++ b/compiler/testData/writeFlags/property/visibility/public.kt @@ -1,5 +1,5 @@ class Foo { - public class MyClass() { + public inner class MyClass() { } }