Support inner/nested classes in JVM back-end

#KT-1174 In Progress
This commit is contained in:
Alexander Udalov
2012-12-06 18:08:44 +04:00
parent 051e94b1c5
commit cc5ba53c80
8 changed files with 21 additions and 13 deletions
@@ -187,7 +187,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
private void writeInnerClasses() { private void writeInnerClasses() {
for (ClassDescriptor innerClass : getInnerClassesAndObjects(descriptor)) { for (ClassDescriptor innerClass : getInnerClassesAndObjects(descriptor)) {
writeInnerClass(innerClass, false /* TODO */); writeInnerClass(innerClass);
} }
ClassDescriptor classObjectDescriptor = descriptor.getClassObjectDescriptor(); 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 // TODO: proper access
int innerClassAccess = getVisibilityAccessFlag(innerClass); int innerClassAccess = getVisibilityAccessFlag(innerClass);
if (innerClass.getModality() == Modality.FINAL) { if (innerClass.getModality() == Modality.FINAL) {
@@ -216,7 +216,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
innerClassAccess |= ACC_ENUM; innerClassAccess |= ACC_ENUM;
} }
if (isStatic) { if (!innerClass.isInner()) {
innerClassAccess |= ACC_STATIC; innerClassAccess |= ACC_STATIC;
} }
@@ -134,17 +134,25 @@ public class CodegenBinding {
} }
public static boolean canHaveOuter(BindingContext bindingContext, @NotNull ClassDescriptor classDescriptor) { public static boolean canHaveOuter(BindingContext bindingContext, @NotNull ClassDescriptor classDescriptor) {
final ClassKind kind = classDescriptor.getKind();
if (isSingleton(bindingContext, classDescriptor)) { if (isSingleton(bindingContext, classDescriptor)) {
return false; return false;
} }
if (kind == ClassKind.ENUM_CLASS) { ClassDescriptor enclosing = enclosingClassDescriptor(bindingContext, classDescriptor);
if (enclosing == null) {
return false; return false;
} }
final ClassDescriptor enclosing = enclosingClassDescriptor(bindingContext, classDescriptor); ClassKind kind = classDescriptor.getKind();
return enclosing != null && !isSingleton(bindingContext, enclosing); 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) { public static boolean isSingleton(BindingContext bindingContext, @NotNull ClassDescriptor classDescriptor) {
@@ -1,5 +1,5 @@
class Foo { class Foo {
class MyClass() { inner class MyClass() {
} }
} }
@@ -1,5 +1,5 @@
class Foo { class Foo {
private class MyClass() { private inner class MyClass() {
} }
} }
@@ -1,5 +1,5 @@
class Foo { class Foo {
public class MyClass() { public inner class MyClass() {
} }
} }
@@ -1,5 +1,5 @@
class Foo { class Foo {
class MyClass() { inner class MyClass() {
} }
} }
@@ -1,5 +1,5 @@
class Foo { class Foo {
private class MyClass() { private inner class MyClass() {
} }
} }
@@ -1,5 +1,5 @@
class Foo { class Foo {
public class MyClass() { public inner class MyClass() {
} }
} }