[IR] Support MFVC-typed properties and interfaces delegates

Signed-off-by: Evgeniy.Zhelenskiy <Evgeniy.Zhelenskiy@jetbrains.com>

#KT-1179
This commit is contained in:
Evgeniy.Zhelenskiy
2022-10-23 05:40:53 +02:00
committed by Space Team
parent 4d426fc4cd
commit 38c80192f9
15 changed files with 690 additions and 64 deletions
@@ -0,0 +1,84 @@
@kotlin.jvm.JvmInline
@kotlin.Metadata
public final class A {
// source: 'delegating.kt'
private final field field-0: int
private final field field-1: int
private synthetic method <init>(p0: int, p1: int): void
public synthetic final static method box-impl(p0: int, p1: int): A
public final static method constructor-impl(p0: int, p1: int): void
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
public static method equals-impl(p0: int, p1: int, p2: java.lang.Object): boolean
public final static method equals-sUp7gFk(p0: int, p1: int, p2: int, p3: int): boolean
public final static method getValue-impl(p0: int, p1: int, @org.jetbrains.annotations.Nullable p2: java.lang.Object, @org.jetbrains.annotations.NotNull p3: kotlin.reflect.KProperty): int
public final method getX(): int
public method hashCode(): int
public static method hashCode-impl(p0: int, p1: int): int
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
public static method toString-impl(p0: int, p1: int): java.lang.String
public synthetic final method unbox-impl-0(): int
public synthetic final method unbox-impl-1(): int
}
@kotlin.Metadata
public interface Abstract {
// source: 'delegating.kt'
public abstract method getX(): int
}
@kotlin.Metadata
final class B$a$2 {
// source: 'delegating.kt'
enclosing method B.<init>(IILA;)V
public final static field INSTANCE: B$a$2
inner (anonymous) class B$a$2
static method <clinit>(): void
method <init>(): void
public final @org.jetbrains.annotations.NotNull method invoke(): A
public synthetic bridge method invoke(): java.lang.Object
}
@kotlin.Metadata
public final class B {
// source: 'delegating.kt'
synthetic final static field $$delegatedProperties: kotlin.reflect.KProperty[]
private final @org.jetbrains.annotations.NotNull field a$delegate: kotlin.Lazy
private final field b$delegate-0: int
private final field b$delegate-1: int
private field x-0: int
private field x-1: int
private @org.jetbrains.annotations.Nullable field y: A
inner (anonymous) class B$a$2
static method <clinit>(): void
private method <init>(p0: int, p1: int, p2: A): void
public synthetic method <init>(p0: int, p1: int, p2: A, p3: kotlin.jvm.internal.DefaultConstructorMarker): void
public final @org.jetbrains.annotations.NotNull method getA(): A
public synthetic final method getA-0(): int
public synthetic final method getA-1(): int
public final method getB(): int
private static method getC$delegate(p0: B): java.lang.Object
public final @org.jetbrains.annotations.NotNull method getC(): A
public synthetic final method getC-0(): int
public synthetic final method getC-1(): int
public final @org.jetbrains.annotations.NotNull method getX(): A
public synthetic final method getX-0(): int
public synthetic final method getX-1(): int
public final @org.jetbrains.annotations.Nullable method getY(): A
public final method setX-sUp7gFk(p0: int, p1: int): void
public final method setY(@org.jetbrains.annotations.Nullable p0: A): void
}
@kotlin.Metadata
public final class C {
// source: 'delegating.kt'
private synthetic final field <$$delegate_0-0>: int
private synthetic final field <$$delegate_0-1>: int
public method <init>(p0: int, p1: int): void
public method getX(): int
}
@kotlin.Metadata
public final class DelegatingKt {
// source: 'delegating.kt'
public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String
}
@@ -0,0 +1,48 @@
// !LANGUAGE: +ValueClasses
// WITH_STDLIB
// WORKS_WHEN_VALUE_CLASS
// TARGET_BACKEND: JVM_IR
// CHECK_BYTECODE_LISTING
import kotlin.reflect.KProperty
interface Abstract {
val x: Int
}
@JvmInline
value class A(override val x: Int, val y: Int): Abstract {
operator fun getValue(thisRef: Any?, property: KProperty<*>): Int {
return x + y
}
}
class B(var x: A, var y: A?) {
val a by lazy { A(-100, -200) }
val b by A(-100, -200)
val c by ::a
}
class C(a: A): Abstract by a
fun box(): String {
val a = A(1, 2)
val b = B(a, a)
require(b.x == b.y)
require(b.x.x == b.y?.x)
require(b.x.y == b.y?.y)
require(b.x.hashCode() == b.y.hashCode())
require(b.a == A(-100, -200))
require(b.a.x == -100)
require(b.a.y == -200)
require(b.b == -300)
require(b.c == A(-100, -200))
require(b.c.x == -100)
require(b.c.y == -200)
require(C(a).x == 1)
return "OK"
}
@@ -0,0 +1,84 @@
@kotlin.jvm.JvmInline
@kotlin.Metadata
public final class A {
// source: 'delegating.kt'
private final field field-0: int
private final field field-1: int
private synthetic method <init>(p0: int, p1: int): void
public synthetic final static method box-impl(p0: int, p1: int): A
public final static method constructor-impl(p0: int, p1: int): void
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
public static method equals-impl(p0: int, p1: int, p2: java.lang.Object): boolean
public final static method equals-sUp7gFk(p0: int, p1: int, p2: int, p3: int): boolean
public final static method getValue-impl(p0: int, p1: int, @org.jetbrains.annotations.Nullable p2: java.lang.Object, @org.jetbrains.annotations.NotNull p3: kotlin.reflect.KProperty): int
public method getX(): int
public method hashCode(): int
public static method hashCode-impl(p0: int, p1: int): int
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
public static method toString-impl(p0: int, p1: int): java.lang.String
public synthetic final method unbox-impl-0(): int
public synthetic final method unbox-impl-1(): int
}
@kotlin.Metadata
public interface Abstract {
// source: 'delegating.kt'
public abstract method getX(): int
}
@kotlin.Metadata
final class B$a$2 {
// source: 'delegating.kt'
enclosing method B.<init>(IILA;)V
public final static field INSTANCE: B$a$2
inner (anonymous) class B$a$2
static method <clinit>(): void
method <init>(): void
public final @org.jetbrains.annotations.NotNull method invoke(): A
public synthetic bridge method invoke(): java.lang.Object
}
@kotlin.Metadata
public final class B {
// source: 'delegating.kt'
synthetic final static field $$delegatedProperties: kotlin.reflect.KProperty[]
private final @org.jetbrains.annotations.NotNull field a$delegate: kotlin.Lazy
private final field b$delegate-0: int
private final field b$delegate-1: int
private field x-0: int
private field x-1: int
private @org.jetbrains.annotations.Nullable field y: A
inner (anonymous) class B$a$2
static method <clinit>(): void
private method <init>(p0: int, p1: int, p2: A): void
public synthetic method <init>(p0: int, p1: int, p2: A, p3: kotlin.jvm.internal.DefaultConstructorMarker): void
public final @org.jetbrains.annotations.NotNull method getA(): A
public synthetic final method getA-0(): int
public synthetic final method getA-1(): int
public final method getB(): int
private static method getC$delegate(p0: B): java.lang.Object
public final @org.jetbrains.annotations.NotNull method getC(): A
public synthetic final method getC-0(): int
public synthetic final method getC-1(): int
public final @org.jetbrains.annotations.NotNull method getX(): A
public synthetic final method getX-0(): int
public synthetic final method getX-1(): int
public final @org.jetbrains.annotations.Nullable method getY(): A
public final method setX-sUp7gFk(p0: int, p1: int): void
public final method setY(@org.jetbrains.annotations.Nullable p0: A): void
}
@kotlin.Metadata
public final class C {
// source: 'delegating.kt'
private synthetic final field $$delegate_0-0: int
private synthetic final field $$delegate_0-1: int
public method <init>(p0: int, p1: int): void
public method getX(): int
}
@kotlin.Metadata
public final class DelegatingKt {
// source: 'delegating.kt'
public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String
}
@@ -0,0 +1,120 @@
// !LANGUAGE: +ValueClasses
// WITH_STDLIB
// WORKS_WHEN_VALUE_CLASS
// FIR_IDENTICAL
// TARGET_BACKEND: JVM_IR
import kotlin.reflect.KProperty
@Repeatable
annotation class Ann
@[Ann Ann]
@JvmInline
value class A @Ann constructor(
@[Ann Ann]
@param:[Ann Ann]
@property:[Ann Ann]
@field:[Ann Ann]
@get:[Ann Ann]
val x: Int,
@[Ann Ann]
@param:[Ann Ann]
@property:[Ann Ann]
@field:[Ann Ann]
@get:[Ann Ann]
val y: Int,
) {
operator fun getValue(thisRef: Any?, property: KProperty<*>): Int {
return 0
}
}
@[Ann Ann]
@JvmInline
value class B @Ann constructor(
@property:[Ann Ann]
val x: A,
@[Ann Ann]
@param:[Ann Ann]
@property:[Ann Ann]
@field:[Ann Ann]
@get:[Ann Ann]
val y: A?,
)
@[Ann Ann]
class C @Ann constructor(
@property:[Ann Ann]
@set:[Ann Ann]
var x: A,
@[Ann Ann]
@param:[Ann Ann]
@property:[Ann Ann]
@field:[Ann Ann]
@get:[Ann Ann]
@set:[Ann Ann]
@setparam:[Ann Ann]
var y: A?,
) {
@delegate:[Ann Ann]
@property:[Ann Ann]
val z by lazy { A(-100, -200) }
@property:[Ann Ann]
@get:[Ann Ann]
val t by A(-100, -200)
@property:[Ann Ann]
val d by ::z
init {
if (2 + 2 == 4) {
@[Ann Ann]
val x = 4
val y = A(1, 2)
}
fun f() {
if (2 + 2 == 4) {
@[Ann Ann]
val x = 4
val y = A(1, 2)
}
}
}
}
@[Ann Ann]
fun A.t(a: A, b: B, @[Ann Ann] c: C) {
if (2 + 2 == 4) {
@[Ann Ann]
val x = 4
val y = A(1, 2)
}
fun f() {
if (2 + 2 == 4) {
@[Ann Ann]
val x1 = 4
val y1 = A(1, 2)
}
}
}
@[Ann Ann]
fun @receiver:[Ann Ann] C.t(a: A, b: B, @[Ann Ann] c: C) = 4
@[Ann Ann]
var A.t
@[Ann Ann]
get() = A(1, 2)
@[Ann Ann]
set(_) = Unit
@[Ann Ann]
var @receiver:[Ann Ann] C.t
@[Ann Ann]
get() = A(1, 2)
@[Ann Ann]
set(_) = Unit
@@ -0,0 +1,134 @@
@Ann$Container(value=[Ann, Ann])
@kotlin.jvm.JvmInline
@kotlin.Metadata
public final class A {
// source: 'annotations.kt'
private final @Ann$Container(value=[Ann, Ann]) field field-0: int
private final @Ann$Container(value=[Ann, Ann]) field field-1: int
private synthetic method <init>(p0: int, p1: int): void
public synthetic final static method box-impl(p0: int, p1: int): A
public final static @Ann method constructor-impl(@Ann$Container(value=[Ann, Ann, Ann, Ann]) p0: int, @Ann$Container(value=[Ann, Ann, Ann, Ann]) p1: int): void
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
public static method equals-impl(p0: int, p1: int, p2: java.lang.Object): boolean
public final static method equals-sUp7gFk(p0: int, p1: int, p2: int, p3: int): boolean
public final static method getValue-impl(p0: int, p1: int, @org.jetbrains.annotations.Nullable p2: java.lang.Object, @org.jetbrains.annotations.NotNull p3: kotlin.reflect.KProperty): int
public synthetic deprecated static @Ann$Container(value=[Ann, Ann]) method getX$annotations(): void
public synthetic deprecated static @Ann$Container(value=[Ann, Ann]) method getY$annotations(): void
public method hashCode(): int
public static method hashCode-impl(p0: int, p1: int): int
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
public static method toString-impl(p0: int, p1: int): java.lang.String
public synthetic final method unbox-impl-0(): int
public synthetic final method unbox-impl-1(): int
public inner class Ann$Container
}
@kotlin.jvm.internal.RepeatableContainer
@java.lang.annotation.Retention(value=RUNTIME)
@kotlin.Metadata
public annotation class Ann$Container {
// source: 'annotations.kt'
public abstract method value(): Ann[]
public inner class Ann$Container
}
@kotlin.annotation.Repeatable
@java.lang.annotation.Retention(value=RUNTIME)
@java.lang.annotation.Repeatable(value=Ann$Container::class)
@kotlin.Metadata
public annotation class Ann {
// source: 'annotations.kt'
public inner class Ann$Container
}
@kotlin.Metadata
public final class AnnotationsKt {
// source: 'annotations.kt'
public synthetic deprecated static @Ann$Container(value=[Ann, Ann]) method getT$annotations(p0: A): void
public synthetic deprecated static @Ann$Container(value=[Ann, Ann]) method getT$annotations(p0: C): void
public final static @Ann$Container(value=[Ann, Ann]) @org.jetbrains.annotations.NotNull method getT(@Ann$Container(value=[Ann, Ann]) @org.jetbrains.annotations.NotNull p0: C): A
public final static @Ann$Container(value=[Ann, Ann]) @org.jetbrains.annotations.NotNull method getT-sUp7gFk(p0: int, p1: int): A
public final static @Ann$Container(value=[Ann, Ann]) method setT-GPBa7dw(@Ann$Container(value=[Ann, Ann]) @org.jetbrains.annotations.NotNull p0: C, p1: int, p2: int): void
public final static @Ann$Container(value=[Ann, Ann]) method setT-GPBa7dw(p0: int, p1: int, p2: int, p3: int): void
public final static @Ann$Container(value=[Ann, Ann]) method t-552ch2I(@Ann$Container(value=[Ann, Ann]) @org.jetbrains.annotations.NotNull p0: C, p1: int, p2: int, p3: int, p4: int, @org.jetbrains.annotations.Nullable p5: A, @Ann$Container(value=[Ann, Ann]) @org.jetbrains.annotations.NotNull p6: C): int
public final static @Ann$Container(value=[Ann, Ann]) method t-552ch2I(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, @org.jetbrains.annotations.Nullable p6: A, @Ann$Container(value=[Ann, Ann]) @org.jetbrains.annotations.NotNull p7: C): void
private final static method t_552ch2I$f(): void
public inner class Ann$Container
}
@Ann$Container(value=[Ann, Ann])
@kotlin.jvm.JvmInline
@kotlin.Metadata
public final class B {
// source: 'annotations.kt'
private final field field-0-0: int
private final field field-0-1: int
private final @Ann$Container(value=[Ann, Ann]) @org.jetbrains.annotations.Nullable field field-1: A
private synthetic method <init>(p0: int, p1: int, p2: A): void
public synthetic final static method box-impl(p0: int, p1: int, p2: A): B
public final static @Ann method constructor-impl(p0: int, p1: int, @Ann$Container(value=[Ann, Ann, Ann, Ann]) @org.jetbrains.annotations.Nullable p2: A): void
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
public static method equals-impl(p0: int, p1: int, p2: A, p3: java.lang.Object): boolean
public final static method equals-sUp7gFk(p0: int, p1: int, p2: A, p3: int, p4: int, p5: A): boolean
public synthetic deprecated static @Ann$Container(value=[Ann, Ann]) method getX$annotations(): void
public synthetic deprecated static @Ann$Container(value=[Ann, Ann]) method getY$annotations(): void
public method hashCode(): int
public static method hashCode-impl(p0: int, p1: int, p2: A): int
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
public static method toString-impl(p0: int, p1: int, p2: A): java.lang.String
public synthetic final method unbox-impl-0(): A
public synthetic final method unbox-impl-0-0(): int
public synthetic final method unbox-impl-0-1(): int
public synthetic final method unbox-impl-1(): A
public inner class Ann$Container
}
@kotlin.Metadata
final class C$z$2 {
// source: 'annotations.kt'
enclosing method C.<init>(IILA;)V
public final static field INSTANCE: C$z$2
inner (anonymous) class C$z$2
static method <clinit>(): void
method <init>(): void
public final @org.jetbrains.annotations.NotNull method invoke(): A
public synthetic bridge method invoke(): java.lang.Object
}
@Ann$Container(value=[Ann, Ann])
@kotlin.Metadata
public final class C {
// source: 'annotations.kt'
synthetic final static field $$delegatedProperties: kotlin.reflect.KProperty[]
private final field t$delegate-0: int
private final field t$delegate-1: int
private field x-0: int
private field x-1: int
private @Ann$Container(value=[Ann, Ann]) @org.jetbrains.annotations.Nullable field y: A
private final @Ann$Container(value=[Ann, Ann]) @org.jetbrains.annotations.NotNull field z$delegate: kotlin.Lazy
inner (anonymous) class C$z$2
static method <clinit>(): void
public synthetic @Ann method <init>(p0: int, p1: int, @Ann$Container(value=[Ann, Ann, Ann, Ann]) p2: A, p3: kotlin.jvm.internal.DefaultConstructorMarker): void
private method <init>(p0: int, p1: int, p2: A): void
private final static method _init_$f(): void
public synthetic deprecated static @Ann$Container(value=[Ann, Ann]) method getD$annotations(): void
private static method getD$delegate(p0: C): java.lang.Object
public final @org.jetbrains.annotations.NotNull method getD(): A
public synthetic final method getD-0(): int
public synthetic final method getD-1(): int
public synthetic deprecated static @Ann$Container(value=[Ann, Ann]) method getT$annotations(): void
public final @Ann$Container(value=[Ann, Ann]) method getT(): int
public synthetic deprecated static @Ann$Container(value=[Ann, Ann]) method getX$annotations(): void
public final @org.jetbrains.annotations.NotNull method getX(): A
public synthetic final method getX-0(): int
public synthetic final method getX-1(): int
public synthetic deprecated static @Ann$Container(value=[Ann, Ann]) method getY$annotations(): void
public final @Ann$Container(value=[Ann, Ann]) @org.jetbrains.annotations.Nullable method getY(): A
public synthetic deprecated static @Ann$Container(value=[Ann, Ann]) method getZ$annotations(): void
public final @org.jetbrains.annotations.NotNull method getZ(): A
public synthetic final method getZ-0(): int
public synthetic final method getZ-1(): int
public final @Ann$Container(value=[Ann, Ann]) method setX-sUp7gFk(p0: int, p1: int): void
public final @Ann$Container(value=[Ann, Ann]) method setY(@Ann$Container(value=[Ann, Ann]) @org.jetbrains.annotations.Nullable p0: A): void
public inner class Ann$Container
}