Calculate inner class access flags accurately
This commit is contained in:
@@ -240,7 +240,6 @@ public class AsmUtil {
|
||||
return NO_FLAG_PACKAGE_PRIVATE;
|
||||
}
|
||||
|
||||
|
||||
public static int getVisibilityAccessFlagForAnonymous(@NotNull ClassDescriptor descriptor) {
|
||||
if (isDeclarationInsideInlineFunction(descriptor)) {
|
||||
return ACC_PUBLIC;
|
||||
@@ -248,7 +247,7 @@ public class AsmUtil {
|
||||
return NO_FLAG_PACKAGE_PRIVATE;
|
||||
}
|
||||
|
||||
public static boolean isDeclarationInsideInlineFunction(@NotNull ClassDescriptor descriptor) {
|
||||
private static boolean isDeclarationInsideInlineFunction(@NotNull ClassDescriptor descriptor) {
|
||||
//NB: constructor context couldn't be inline
|
||||
DeclarationDescriptor parentDeclaration = descriptor.getContainingDeclaration();
|
||||
if (parentDeclaration instanceof SimpleFunctionDescriptor &&
|
||||
@@ -258,6 +257,31 @@ public class AsmUtil {
|
||||
return false;
|
||||
}
|
||||
|
||||
public static int calculateInnerClassAccessFlags(@NotNull ClassDescriptor innerClass) {
|
||||
return getVisibilityAccessFlag(innerClass) |
|
||||
innerAccessFlagsForModalityAndKind(innerClass) |
|
||||
(innerClass.isInner() ? 0 : ACC_STATIC);
|
||||
}
|
||||
|
||||
private static int innerAccessFlagsForModalityAndKind(@NotNull ClassDescriptor innerClass) {
|
||||
switch (innerClass.getKind()) {
|
||||
case TRAIT:
|
||||
return ACC_ABSTRACT | ACC_INTERFACE;
|
||||
case ENUM_CLASS:
|
||||
return ACC_FINAL | ACC_ENUM;
|
||||
case ANNOTATION_CLASS:
|
||||
return ACC_ABSTRACT | ACC_ANNOTATION | ACC_INTERFACE;
|
||||
default:
|
||||
if (innerClass.getModality() == Modality.FINAL) {
|
||||
return ACC_FINAL;
|
||||
}
|
||||
else if (innerClass.getModality() == Modality.ABSTRACT) {
|
||||
return ACC_ABSTRACT;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static int getDeprecatedAccessFlag(@NotNull MemberDescriptor descriptor) {
|
||||
if (descriptor instanceof PropertyAccessorDescriptor) {
|
||||
return KotlinBuiltIns.getInstance().isDeprecated(descriptor)
|
||||
|
||||
@@ -285,27 +285,6 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
|
||||
}
|
||||
|
||||
private void writeInnerClass(@NotNull ClassDescriptor innerClass) {
|
||||
// TODO: proper access
|
||||
int innerClassAccess = getVisibilityAccessFlag(innerClass);
|
||||
if (innerClass.getModality() == Modality.FINAL) {
|
||||
innerClassAccess |= ACC_FINAL;
|
||||
}
|
||||
else if (innerClass.getModality() == Modality.ABSTRACT) {
|
||||
innerClassAccess |= ACC_ABSTRACT;
|
||||
}
|
||||
|
||||
if (innerClass.getKind() == ClassKind.TRAIT) {
|
||||
innerClassAccess |= ACC_INTERFACE;
|
||||
}
|
||||
else if (innerClass.getKind() == ClassKind.ENUM_CLASS) {
|
||||
innerClassAccess |= ACC_ENUM;
|
||||
}
|
||||
|
||||
if (!innerClass.isInner()) {
|
||||
innerClassAccess |= ACC_STATIC;
|
||||
}
|
||||
|
||||
// TODO: cache internal names
|
||||
DeclarationDescriptor containing = innerClass.getContainingDeclaration();
|
||||
String outerClassInternalName = containing instanceof ClassDescriptor ? getInternalNameForImpl((ClassDescriptor) containing) : null;
|
||||
|
||||
@@ -321,7 +300,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
|
||||
innerClassInternalName = getInternalNameForImpl(innerClass);
|
||||
}
|
||||
|
||||
v.visitInnerClass(innerClassInternalName, outerClassInternalName, innerName, innerClassAccess);
|
||||
v.visitInnerClass(innerClassInternalName, outerClassInternalName, innerName, calculateInnerClassAccessFlags(innerClass));
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
Reference in New Issue
Block a user