Kapt+JVM_IR: do not generate nested enum as final

#KT-54187 Fixed
This commit is contained in:
Alexander Udalov
2022-09-26 19:57:22 +02:00
committed by Space Team
parent 766a51069c
commit c813e03c1e
3 changed files with 27 additions and 6 deletions
@@ -654,17 +654,17 @@ class ClassFileToSourceStubConverter(val kaptContext: KaptContextForStubGenerati
}
private fun getClassAccessFlags(clazz: ClassNode, descriptor: DeclarationDescriptor, isInner: Boolean, isNested: Boolean): Int {
if ((descriptor.containingDeclaration as? ClassDescriptor)?.kind == ClassKind.INTERFACE) {
// Classes inside interfaces should always be public and static.
// See com.sun.tools.javac.comp.Enter.visitClassDef for more information.
return (clazz.access or Opcodes.ACC_PUBLIC or Opcodes.ACC_STATIC) and
Opcodes.ACC_PRIVATE.inv() and Opcodes.ACC_PROTECTED.inv() // Remove private and protected modifiers
}
var access = clazz.access
if ((descriptor as? ClassDescriptor)?.kind == ClassKind.ENUM_CLASS) {
// Enums are final in the bytecode, but "final enum" is not allowed in Java.
access = access and Opcodes.ACC_FINAL.inv()
}
if ((descriptor.containingDeclaration as? ClassDescriptor)?.kind == ClassKind.INTERFACE) {
// Classes inside interfaces should always be public and static.
// See com.sun.tools.javac.comp.Enter.visitClassDef for more information.
return (access or Opcodes.ACC_PUBLIC or Opcodes.ACC_STATIC) and
Opcodes.ACC_PRIVATE.inv() and Opcodes.ACC_PROTECTED.inv() // Remove private and protected modifiers
}
if (!isInner && isNested) {
access = access or Opcodes.ACC_STATIC
}
@@ -21,3 +21,7 @@ enum class Nested1 {
}
};
}
interface I {
enum class Nested { WHITE }
}
@@ -63,6 +63,23 @@ public enum Enum2 {
////////////////////
import java.lang.System;
@kotlin.Metadata()
public abstract interface I {
@kotlin.Metadata()
public static enum Nested {
/*public static final*/ WHITE /* = new Nested() */;
Nested() {
}
}
}
////////////////////
import java.lang.System;
@kotlin.Metadata()