KT-55308, KT-55769 Sort InnerClasses entries. Add DONT_SORT_DECLARATIONS directive

This commit is contained in:
Pavel Mikhailovskii
2023-01-13 01:07:10 +00:00
committed by Space Team
parent 63a0660cc3
commit 38a56ba8e8
14 changed files with 432 additions and 57 deletions
@@ -80,10 +80,7 @@ class ClassCodegen private constructor(
private val state get() = context.state
// TODO: the order of entries in this set depends on the order in which methods are generated; this means it is unstable
// under incremental compilation, as calls to `inline fun`s declared in this class cause them to be generated out of order.
private val innerClasses = linkedSetOf<IrClass>()
private val innerClasses = mutableSetOf<IrClass>()
val typeMapper =
if (context.state.oldInnerClassesLogic)
context.defaultTypeMapper
@@ -476,7 +473,7 @@ class ClassCodegen private constructor(
}
}
for (klass in innerClasses) {
for (klass in innerClasses.sortedBy { it.fqNameWhenAvailable?.asString() }) {
val innerJavaClassId = klass.mapToJava()
val innerClass = innerJavaClassId?.internalName ?: typeMapper.classInternalName(klass)
val outerClass =
@@ -0,0 +1,40 @@
@kotlin.Metadata
public final enum class A$B$C {
// source: 'kt55769.kt'
public final inner class A$B
public final inner class A$B$C
public final enum static field C1: A$B$C
public final enum static field C2: A$B$C
public final enum static field C3: A$B$C
private synthetic final static field $VALUES: A$B$C[]
private method <init>(p0: java.lang.String, p1: int): void
public static method values(): A$B$C[]
public static method valueOf(p0: java.lang.String): A$B$C
private synthetic final static method $values(): A$B$C[]
static method <clinit>(): void
}
@kotlin.Metadata
public final class A$B {
// source: 'kt55769.kt'
public final inner class A$B
public final inner class A$B$C
public method <init>(): void
}
@kotlin.Metadata
public final class A {
// source: 'kt55769.kt'
public final inner class A$B
public method <init>(): void
}
@kotlin.Metadata
public final class Main {
// source: 'kt55769.kt'
public final inner class A$B
public final inner class A$B$C
private final @org.jetbrains.annotations.NotNull field field: A$B$C
public method <init>(): void
public final @org.jetbrains.annotations.NotNull method getField(): A$B$C
}
+15
View File
@@ -0,0 +1,15 @@
// DONT_SORT_DECLARATIONS
class Main {
val field = A.B.C.C1
}
class A {
class B {
enum class C {
C1,
C2,
C3
}
}
}
+37
View File
@@ -0,0 +1,37 @@
@kotlin.Metadata
public final enum class A$B$C {
// source: 'kt55769.kt'
public final inner class A$B$C
public final inner class A$B
public final enum static field C1: A$B$C
public final enum static field C2: A$B$C
public final enum static field C3: A$B$C
private synthetic final static field $VALUES: A$B$C[]
static method <clinit>(): void
private method <init>(p0: java.lang.String, p1: int): void
public static method values(): A$B$C[]
public static method valueOf(p0: java.lang.String): A$B$C
}
@kotlin.Metadata
public final class A$B {
// source: 'kt55769.kt'
public final inner class A$B$C
public final inner class A$B
public method <init>(): void
}
@kotlin.Metadata
public final class A {
// source: 'kt55769.kt'
public final inner class A$B
public method <init>(): void
}
@kotlin.Metadata
public final class Main {
// source: 'kt55769.kt'
private final @org.jetbrains.annotations.NotNull field field: A$B$C
public final @org.jetbrains.annotations.NotNull method getField(): A$B$C
public method <init>(): void
}
@@ -211,6 +211,12 @@ public class BytecodeListingTestGenerated extends AbstractBytecodeListingTest {
runTest("compiler/testData/codegen/bytecodeListing/kt47328.kt");
}
@Test
@TestMetadata("kt55769.kt")
public void testKt55769() throws Exception {
runTest("compiler/testData/codegen/bytecodeListing/kt55769.kt");
}
@Test
@TestMetadata("noCollectionStubMethodsInInterface.kt")
public void testNoCollectionStubMethodsInInterface() throws Exception {
@@ -217,6 +217,12 @@ public class IrBytecodeListingTestGenerated extends AbstractIrBytecodeListingTes
runTest("compiler/testData/codegen/bytecodeListing/kt47328.kt");
}
@Test
@TestMetadata("kt55769.kt")
public void testKt55769() throws Exception {
runTest("compiler/testData/codegen/bytecodeListing/kt55769.kt");
}
@Test
@TestMetadata("noCollectionStubMethodsInInterface.kt")
public void testNoCollectionStubMethodsInInterface() throws Exception {
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.test.backend.handlers
import org.jetbrains.kotlin.codegen.BytecodeListingTextCollectingVisitor
import org.jetbrains.kotlin.test.directives.CodegenTestDirectives
import org.jetbrains.kotlin.test.directives.CodegenTestDirectives.CHECK_BYTECODE_LISTING
import org.jetbrains.kotlin.test.directives.CodegenTestDirectives.DONT_SORT_DECLARATIONS
import org.jetbrains.kotlin.test.directives.CodegenTestDirectives.IGNORE_ANNOTATIONS
import org.jetbrains.kotlin.test.directives.CodegenTestDirectives.WITH_SIGNATURES
import org.jetbrains.kotlin.test.directives.FirDiagnosticsDirectives.FIR_IDENTICAL
@@ -36,6 +37,7 @@ class BytecodeListingHandler(testServices: TestServices) : JvmBinaryArtifactHand
BytecodeListingTextCollectingVisitor.Filter.ForCodegenTests,
withSignatures = WITH_SIGNATURES in module.directives,
withAnnotations = IGNORE_ANNOTATIONS !in module.directives,
sortDeclarations = DONT_SORT_DECLARATIONS !in module.directives,
)
multiModuleInfoDumper.builderForModule(module).append(dump)
}
@@ -81,6 +81,11 @@ object CodegenTestDirectives : SimpleDirectivesContainer() {
applicability = Global
)
val DONT_SORT_DECLARATIONS by directive(
description = "Do not sort declarations",
applicability = Global
)
val RUN_DEX_CHECKER by directive(
description = "Run DxChecker and D8Checker"
)
@@ -22,14 +22,15 @@ class BytecodeListingTextCollectingVisitor(
factory: ClassFileFactory,
filter: Filter = Filter.EMPTY,
withSignatures: Boolean = false,
withAnnotations: Boolean = true
withAnnotations: Boolean = true,
sortDeclarations: Boolean = true
) = factory.getClassFiles()
.sortedBy { it.relativePath }
.mapNotNull {
val cr = ClassReader(it.asByteArray())
val node = ClassNode(Opcodes.API_VERSION)
cr.accept(node, ClassReader.SKIP_CODE)
val visitor = BytecodeListingTextCollectingVisitor(filter, withSignatures, withAnnotations = withAnnotations)
val visitor = BytecodeListingTextCollectingVisitor(filter, withSignatures, withAnnotations = withAnnotations, sortDeclarations = sortDeclarations)
node.accept(visitor)
if (!filter.shouldWriteClass(node)) null else visitor.text
@@ -0,0 +1,100 @@
@kotlin.Metadata()
public enum E {
/*public static final*/ X /* = new E() */,
/*public static final*/ Y /* = new E() */;
E() {
}
public abstract void a();
public final void b() {
}
@kotlin.Metadata()
public static final class NestedClass {
public NestedClass() {
super();
}
}
@kotlin.Metadata()
public static final class Obj {
@org.jetbrains.annotations.NotNull()
public static final E.Obj INSTANCE = null;
private Obj() {
super();
}
}
}
////////////////////
@kotlin.Metadata()
public enum E2 {
/*public static final*/ X /* = new E2() */,
/*public static final*/ Y /* = new E2() */;
E2(int n) {
}
E2(java.lang.String s) {
}
public abstract void a();
}
////////////////////
@kotlin.Metadata()
public enum E3 {
/*public static final*/ X /* = new E3() */,
/*public static final*/ Y /* = new E3() */;
@org.jetbrains.annotations.NotNull()
private final java.lang.String a = null;
E3(java.lang.String a) {
}
@org.jetbrains.annotations.NotNull()
public final java.lang.String getA() {
return null;
}
}
////////////////////
@kotlin.Metadata()
public enum E4 {
/*public static final*/ X /* = new E4() */;
@org.jetbrains.annotations.NotNull()
private final java.lang.String a = null;
private final int b = 0;
private final long c = 0L;
private final boolean d = false;
E4(java.lang.String a, int b, long c, boolean d) {
}
@org.jetbrains.annotations.NotNull()
public final java.lang.String getA() {
return null;
}
public final int getB() {
return 0;
}
public final long getC() {
return 0L;
}
public final boolean getD() {
return false;
}
}
@@ -29,6 +29,22 @@ public final class A$B {
}
}
@kotlin.Metadata()
public static final class D$$$E {
public D$$$E() {
super();
}
}
@kotlin.Metadata()
public static final class D$$E {
public D$$E() {
super();
}
}
@kotlin.Metadata()
public static final class D$E {
@kotlin.jvm.JvmField()
@@ -60,22 +76,6 @@ public final class A$B {
}
}
}
@kotlin.Metadata()
public static final class D$$E {
public D$$E() {
super();
}
}
@kotlin.Metadata()
public static final class D$$$E {
public D$$$E() {
super();
}
}
}
////////////////////
@@ -88,11 +88,6 @@ public final class Experiment {
super();
}
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
@kotlin.Metadata()
public static abstract @interface Type {
}
@Experiment.Type()
@kotlin.Metadata()
public static final class Group {
@@ -141,6 +136,11 @@ public final class Experiment {
return null;
}
}
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
@kotlin.Metadata()
public static abstract @interface Type {
}
}
////////////////////
@@ -31,6 +31,22 @@ public final class A$B {
}
}
@kotlin.Metadata()
public static final class D$$$E {
public D$$$E() {
super();
}
}
@kotlin.Metadata()
public static final class D$$E {
public D$$E() {
super();
}
}
@kotlin.Metadata()
public static final class D$E {
@kotlin.jvm.JvmField()
@@ -62,22 +78,6 @@ public final class A$B {
}
}
}
@kotlin.Metadata()
public static final class D$$E {
public D$$E() {
super();
}
}
@kotlin.Metadata()
public static final class D$$$E {
public D$$$E() {
super();
}
}
}
////////////////////
@@ -91,11 +91,6 @@ public final class Experiment {
super();
}
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
@kotlin.Metadata()
public static abstract @interface Type {
}
@test.Experiment.Type()
@kotlin.Metadata()
public static final class Group {
@@ -140,6 +135,11 @@ public final class Experiment {
return null;
}
}
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
@kotlin.Metadata()
public static abstract @interface Type {
}
}
////////////////////
@@ -0,0 +1,166 @@
@kotlin.Metadata()
public final class A {
@org.jetbrains.annotations.Nullable()
private final A x = null;
public A() {
super();
}
@org.jetbrains.annotations.Nullable()
public final A getX() {
return null;
}
@org.jetbrains.annotations.Nullable()
public final A f1(@org.jetbrains.annotations.NotNull()
A a, @org.jetbrains.annotations.NotNull()
A.B b) {
return null;
}
@kotlin.Metadata()
public static abstract interface B {
@org.jetbrains.annotations.Nullable()
public abstract A.B getY();
@kotlin.Metadata()
public static final class DefaultImpls {
public DefaultImpls() {
super();
}
}
}
@kotlin.Metadata()
public static final class C {
@org.jetbrains.annotations.NotNull()
public static final A.C INSTANCE = null;
private C() {
super();
}
}
}
////////////////////
@kotlin.Metadata()
public final class A2 {
public A2() {
super();
}
@kotlin.Metadata()
public static final class B {
public B() {
super();
}
@kotlin.Metadata()
public static final class C {
public C() {
super();
}
@kotlin.Metadata()
public static final class D {
public D() {
super();
}
@kotlin.Metadata()
public static final class Cme {
public Cme() {
super();
}
}
@kotlin.Metadata()
public static final class E {
public E() {
super();
}
}
}
}
}
}
////////////////////
@kotlin.Metadata()
public final class Foo {
public Foo() {
super();
}
}
////////////////////
@kotlin.Metadata()
public final class Test {
public Test() {
super();
}
@kotlin.Metadata()
public final class Inner {
public Inner() {
super();
}
}
@kotlin.Metadata()
public static final class Nested {
public Nested() {
super();
}
@kotlin.Metadata()
public static final class NestedNested {
public NestedNested() {
super();
}
}
}
@kotlin.Metadata()
public static enum NestedEnum {
/*public static final*/ BLACK /* = new NestedEnum() */,
/*public static final*/ WHITE /* = new NestedEnum() */;
NestedEnum() {
}
}
@kotlin.Metadata()
public static abstract interface NestedInterface {
}
@kotlin.Metadata()
public static final class NestedObject {
@org.jetbrains.annotations.NotNull()
public static final Test.NestedObject INSTANCE = null;
private NestedObject() {
super();
}
}
}
@@ -37,6 +37,14 @@ public final class Simple {
}
}
@kotlin.Metadata()
public final class InnerClass {
public InnerClass() {
super();
}
}
@kotlin.Metadata()
public static final class NestedClass {
@@ -52,12 +60,4 @@ public final class Simple {
}
}
}
@kotlin.Metadata()
public final class InnerClass {
public InnerClass() {
super();
}
}
}