Generate metadata and annotations for hidden constructor

Reflection expects to see a callable method for a hidden constructor,
thus, it should be a synthetic accessor.
JVM method signature in metadata should point to the synthetic accessor.
Annotations for hidden constructor should be written on the synthetic
accessor.
This commit is contained in:
Dmitry Petrov
2018-09-11 18:08:22 +03:00
parent 3e3ffd14a9
commit 792c5f8b3f
16 changed files with 219 additions and 12 deletions
@@ -0,0 +1,18 @@
// !LANGUAGE: +InlineClasses
annotation class Ann
inline class Z(val x: Int)
class Test @Ann constructor(@Ann val z: Z) {
@Ann constructor(z: Z, @Ann a: Int) : this(z)
@Ann private constructor(z: Z, @Ann s: String) : this(z)
inner class Inner @Ann constructor(x: Int, @Ann val z2: Z, @Ann y: String)
}
sealed class Sealed @Ann constructor(@Ann val z: Z) {
class Derived @Ann constructor(z: Z) : Sealed(z)
inner class Inner @Ann constructor(x: Int, @Ann val z2: Z, @Ann y: String)
}
@@ -0,0 +1,69 @@
@java.lang.annotation.Retention
@kotlin.Metadata
public annotation class Ann
@kotlin.Metadata
public final class Sealed$Derived {
inner class Sealed$Derived
private method <init>(p0: int): void
public synthetic @Ann method <init>(p0: int, p1: kotlin.jvm.internal.DefaultConstructorMarker): void
}
@kotlin.Metadata
public final class Sealed$Inner {
synthetic final field this$0: Sealed
private final field z2: int
inner class Sealed$Inner
public synthetic @Ann method <init>(@java.lang.Synthetic p0: Sealed, p1: int, @Ann p2: int, @Ann p3: java.lang.String, p4: kotlin.jvm.internal.DefaultConstructorMarker): void
private method <init>(p0: Sealed, p1: int, p2: int, p3: java.lang.String): void
public final method getZ2(): int
}
@kotlin.Metadata
public abstract class Sealed {
private final field z: int
inner class Sealed$Derived
inner class Sealed$Inner
private @Ann method <init>(@Ann p0: int): void
public synthetic method <init>(@Ann p0: int, p1: kotlin.jvm.internal.DefaultConstructorMarker): void
public final method getZ(): int
}
@kotlin.Metadata
public final class Test$Inner {
synthetic final field this$0: Test
private final field z2: int
inner class Test$Inner
public synthetic @Ann method <init>(@java.lang.Synthetic p0: Test, p1: int, @Ann p2: int, @Ann p3: java.lang.String, p4: kotlin.jvm.internal.DefaultConstructorMarker): void
private method <init>(p0: Test, p1: int, p2: int, p3: java.lang.String): void
public final method getZ2(): int
}
@kotlin.Metadata
public final class Test {
private final field z: int
inner class Test$Inner
public synthetic @Ann method <init>(@Ann p0: int, p1: kotlin.jvm.internal.DefaultConstructorMarker): void
private method <init>(p0: int): void
public synthetic @Ann method <init>(p0: int, @Ann p1: int, p2: kotlin.jvm.internal.DefaultConstructorMarker): void
private @Ann method <init>(p0: int, @Ann p1: java.lang.String): void
private method <init>(p0: int, p1: int): void
public final method getZ(): int
}
@kotlin.Metadata
public final class Z {
private final field x: int
private synthetic method <init>(p0: int): void
public synthetic final static @org.jetbrains.annotations.NotNull method box-impl(p0: int): Z
public static method constructor-impl(p0: int): int
public method equals(p0: java.lang.Object): boolean
public static method equals-impl(p0: int, @org.jetbrains.annotations.Nullable p1: java.lang.Object): boolean
public final static method equals-impl0(p0: int, p1: int): boolean
public final method getX(): int
public method hashCode(): int
public static method hashCode-impl(p0: int): int
public method toString(): java.lang.String
public static @org.jetbrains.annotations.NotNull method toString-impl(p0: int): java.lang.String
public synthetic final method unbox-impl(): int
}
@@ -11,11 +11,11 @@ public interface PublicMarker
public class TestBasic {
private final field z: int
private method <init>(p0: int): void
public synthetic method <init>(p0: int, @org.jetbrains.annotations.NotNull p1: ProtectedMarker, p2: kotlin.jvm.internal.DefaultConstructorMarker): void
public synthetic method <init>(p0: int, @org.jetbrains.annotations.NotNull p1: PublicMarker, p2: kotlin.jvm.internal.DefaultConstructorMarker): void
private method <init>(p0: int, p1: PrivateMarker): void
private method <init>(p0: int, p1: ProtectedMarker): void
public synthetic method <init>(p0: int, p1: ProtectedMarker, p2: kotlin.jvm.internal.DefaultConstructorMarker): void
private method <init>(p0: int, p1: PublicMarker): void
public synthetic method <init>(p0: int, p1: PublicMarker, p2: kotlin.jvm.internal.DefaultConstructorMarker): void
public synthetic method <init>(p0: int, p1: kotlin.jvm.internal.DefaultConstructorMarker): void
public final method getZ(): int
}
@@ -0,0 +1,15 @@
// !LANGUAGE: +InlineClasses
package test
annotation class Ann
inline class Z(val x: Int)
class Test @Ann constructor(@Ann val z: Z) {
@Ann constructor(z: Z, @Ann a: Int) : this(z)
@Ann private constructor(z: Z, @Ann s: String) : this(z)
}
sealed class Sealed @Ann constructor(@Ann val z: Z) {
class Derived @Ann constructor(z: Z) : Sealed(z)
}
@@ -0,0 +1,31 @@
package test
public final annotation class Ann : kotlin.Annotation {
/*primary*/ public constructor Ann()
}
public sealed class Sealed {
/*primary*/ @test.Ann private constructor Sealed(/*0*/ @test.Ann z: test.Z)
public final val z: test.Z
public final fun <get-z>(): test.Z
public final class Derived : test.Sealed {
/*primary*/ @test.Ann public constructor Derived(/*0*/ z: test.Z)
public final override /*1*/ /*fake_override*/ val z: test.Z
public final override /*1*/ /*fake_override*/ fun <get-z>(): test.Z
}
}
public final class Test {
/*primary*/ @test.Ann public constructor Test(/*0*/ @test.Ann z: test.Z)
@test.Ann public constructor Test(/*0*/ z: test.Z, /*1*/ @test.Ann a: kotlin.Int)
@test.Ann private constructor Test(/*0*/ z: test.Z, /*1*/ @test.Ann s: kotlin.String)
public final val z: test.Z
public final fun <get-z>(): test.Z
}
public final inline class Z {
/*primary*/ public constructor Z(/*0*/ x: kotlin.Int)
public final val x: kotlin.Int
public final fun <get-x>(): kotlin.Int
}