KT-55308, KT-55769 Sort InnerClasses entries. Add DONT_SORT_DECLARATIONS directive
This commit is contained in:
committed by
Space Team
parent
63a0660cc3
commit
38a56ba8e8
+2
-5
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
+6
@@ -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 {
|
||||
|
||||
+6
@@ -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 {
|
||||
|
||||
+2
@@ -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)
|
||||
}
|
||||
|
||||
+5
@@ -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"
|
||||
)
|
||||
|
||||
+3
-2
@@ -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 {
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////
|
||||
|
||||
+21
-21
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user