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() {
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;
}
@@ -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) {
@@ -1,5 +1,5 @@
class Foo {
class MyClass() {
inner class MyClass() {
}
}
@@ -1,5 +1,5 @@
class Foo {
private class MyClass() {
private inner class MyClass() {
}
}
@@ -1,5 +1,5 @@
class Foo {
public class MyClass() {
public inner class MyClass() {
}
}
@@ -1,5 +1,5 @@
class Foo {
class MyClass() {
inner class MyClass() {
}
}
@@ -1,5 +1,5 @@
class Foo {
private class MyClass() {
private inner class MyClass() {
}
}
@@ -1,5 +1,5 @@
class Foo {
public class MyClass() {
public inner class MyClass() {
}
}