Support inner/nested classes in JVM back-end
#KT-1174 In Progress
This commit is contained in:
@@ -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() {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user