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() {
|
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() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user