[IR] Support object-like interaction with MFVC function references

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

#KT-1179
This commit is contained in:
Evgeniy.Zhelenskiy
2022-10-20 06:56:03 +02:00
committed by Space Team
parent 1660dc21b9
commit c6e54e6433
6 changed files with 303 additions and 85 deletions
@@ -15,6 +15,16 @@ class A(val point: DPoint) {
fun f(otherDPoint: DPoint, z: Double) = point.f(z) * otherDPoint.f(z)
}
fun consume(point1: DPoint, point2: DPoint, f: (DPoint, DPoint) -> DPoint) = f(point1, point2)
inline fun consumeInline(point1: DPoint, point2: DPoint, f: (DPoint, DPoint) -> DPoint) = f(point1, point2)
operator fun DPoint.plus(other: DPoint) = DPoint(this.x + other.x, this.y + other.y)
fun makeDPoint(x: Double, y: Double, maker: (Double, Double) -> DPoint) = maker(x, y)
inline fun makeDPointInline(x: Double, y: Double, maker: (Double, Double) -> DPoint) = maker(x, y)
fun box(): String {
val dPoint = DPoint(1.0, 2.0)
val a = A(dPoint)
@@ -29,5 +39,17 @@ fun box(): String {
require((::g)(dPoint, DPoint(1.0, 3.0).y) == 6.0)
require((a::f)(dPoint, DPoint(1.0, 3.0).y) == 36.0)
require(consume(DPoint(1.0, 2.0), DPoint(3.0, 4.0), DPoint::plus) == DPoint(4.0, 6.0))
require(consumeInline(DPoint(1.0, 2.0), DPoint(3.0, 4.0), DPoint::plus) == DPoint(4.0, 6.0))
require(makeDPoint(1.0, 2.0, ::DPoint) == DPoint(1.0, 2.0))
require(makeDPointInline(1.0, 2.0, ::DPoint) == DPoint(1.0, 2.0))
require(::DPoint == ::DPoint)
require(dPoint::f == dPoint::f)
require(::g == ::g)
require(a::f == a::f)
require(DPoint::plus == DPoint::plus)
return "OK"
}
@@ -31,9 +31,163 @@ public final class DPoint {
public synthetic final method unbox-impl-1(): double
}
@kotlin.Metadata
synthetic final class FunctionReferencesKt$box$11 {
// source: 'functionReferences.kt'
enclosing method FunctionReferencesKt.box()Ljava/lang/String;
public final static field INSTANCE: FunctionReferencesKt$box$11
inner (anonymous) class FunctionReferencesKt$box$11
static method <clinit>(): void
method <init>(): void
public final @org.jetbrains.annotations.NotNull method invoke(p0: double, p1: double): DPoint
public synthetic bridge method invoke(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object
}
@kotlin.Metadata
synthetic final class FunctionReferencesKt$box$13 {
// source: 'functionReferences.kt'
enclosing method FunctionReferencesKt.box()Ljava/lang/String;
public final static field INSTANCE: FunctionReferencesKt$box$13
inner (anonymous) class FunctionReferencesKt$box$13
static method <clinit>(): void
method <init>(): void
public final @org.jetbrains.annotations.NotNull method invoke(p0: double, p1: double): DPoint
public synthetic bridge method invoke(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object
}
@kotlin.Metadata
synthetic final class FunctionReferencesKt$box$14 {
// source: 'functionReferences.kt'
enclosing method FunctionReferencesKt.box()Ljava/lang/String;
public final static field INSTANCE: FunctionReferencesKt$box$14
inner (anonymous) class FunctionReferencesKt$box$14
static method <clinit>(): void
method <init>(): void
public final @org.jetbrains.annotations.NotNull method invoke(p0: double, p1: double): DPoint
public synthetic bridge method invoke(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object
}
@kotlin.Metadata
synthetic final class FunctionReferencesKt$box$15 {
// source: 'functionReferences.kt'
enclosing method FunctionReferencesKt.box()Ljava/lang/String;
inner (anonymous) class FunctionReferencesKt$box$15
method <init>(p0: java.lang.Object): void
public final @org.jetbrains.annotations.NotNull method invoke(p0: double): java.lang.Double
public synthetic bridge method invoke(p0: java.lang.Object): java.lang.Object
}
@kotlin.Metadata
synthetic final class FunctionReferencesKt$box$16 {
// source: 'functionReferences.kt'
enclosing method FunctionReferencesKt.box()Ljava/lang/String;
inner (anonymous) class FunctionReferencesKt$box$16
method <init>(p0: java.lang.Object): void
public final @org.jetbrains.annotations.NotNull method invoke(p0: double): java.lang.Double
public synthetic bridge method invoke(p0: java.lang.Object): java.lang.Object
}
@kotlin.Metadata
synthetic final class FunctionReferencesKt$box$17 {
// source: 'functionReferences.kt'
enclosing method FunctionReferencesKt.box()Ljava/lang/String;
public final static field INSTANCE: FunctionReferencesKt$box$17
inner (anonymous) class FunctionReferencesKt$box$17
static method <clinit>(): void
method <init>(): void
public synthetic bridge method invoke(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object
public final @org.jetbrains.annotations.NotNull method invoke-GPBa7dw(p0: double, p1: double, p2: double): java.lang.Double
}
@kotlin.Metadata
synthetic final class FunctionReferencesKt$box$18 {
// source: 'functionReferences.kt'
enclosing method FunctionReferencesKt.box()Ljava/lang/String;
public final static field INSTANCE: FunctionReferencesKt$box$18
inner (anonymous) class FunctionReferencesKt$box$18
static method <clinit>(): void
method <init>(): void
public synthetic bridge method invoke(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object
public final @org.jetbrains.annotations.NotNull method invoke-GPBa7dw(p0: double, p1: double, p2: double): java.lang.Double
}
@kotlin.Metadata
synthetic final class FunctionReferencesKt$box$19 {
// source: 'functionReferences.kt'
enclosing method FunctionReferencesKt.box()Ljava/lang/String;
inner (anonymous) class FunctionReferencesKt$box$19
method <init>(p0: java.lang.Object): void
public synthetic bridge method invoke(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object
public final @org.jetbrains.annotations.NotNull method invoke-GPBa7dw(p0: double, p1: double, p2: double): java.lang.Double
}
@kotlin.Metadata
synthetic final class FunctionReferencesKt$box$20 {
// source: 'functionReferences.kt'
enclosing method FunctionReferencesKt.box()Ljava/lang/String;
inner (anonymous) class FunctionReferencesKt$box$20
method <init>(p0: java.lang.Object): void
public synthetic bridge method invoke(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object
public final @org.jetbrains.annotations.NotNull method invoke-GPBa7dw(p0: double, p1: double, p2: double): java.lang.Double
}
@kotlin.Metadata
synthetic final class FunctionReferencesKt$box$21 {
// source: 'functionReferences.kt'
enclosing method FunctionReferencesKt.box()Ljava/lang/String;
public final static field INSTANCE: FunctionReferencesKt$box$21
inner (anonymous) class FunctionReferencesKt$box$21
static method <clinit>(): void
method <init>(): void
public synthetic bridge method invoke(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object
public final @org.jetbrains.annotations.NotNull method invoke-GPBa7dw(p0: double, p1: double, p2: double, p3: double): DPoint
}
@kotlin.Metadata
synthetic final class FunctionReferencesKt$box$22 {
// source: 'functionReferences.kt'
enclosing method FunctionReferencesKt.box()Ljava/lang/String;
public final static field INSTANCE: FunctionReferencesKt$box$22
inner (anonymous) class FunctionReferencesKt$box$22
static method <clinit>(): void
method <init>(): void
public synthetic bridge method invoke(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object
public final @org.jetbrains.annotations.NotNull method invoke-GPBa7dw(p0: double, p1: double, p2: double, p3: double): DPoint
}
@kotlin.Metadata
synthetic final class FunctionReferencesKt$box$9 {
// source: 'functionReferences.kt'
enclosing method FunctionReferencesKt.box()Ljava/lang/String;
public final static field INSTANCE: FunctionReferencesKt$box$9
inner (anonymous) class FunctionReferencesKt$box$9
static method <clinit>(): void
method <init>(): void
public synthetic bridge method invoke(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object
public final @org.jetbrains.annotations.NotNull method invoke-GPBa7dw(p0: double, p1: double, p2: double, p3: double): DPoint
}
@kotlin.Metadata
public final class FunctionReferencesKt {
// source: 'functionReferences.kt'
inner (anonymous) class FunctionReferencesKt$box$11
inner (anonymous) class FunctionReferencesKt$box$13
inner (anonymous) class FunctionReferencesKt$box$14
inner (anonymous) class FunctionReferencesKt$box$15
inner (anonymous) class FunctionReferencesKt$box$16
inner (anonymous) class FunctionReferencesKt$box$17
inner (anonymous) class FunctionReferencesKt$box$18
inner (anonymous) class FunctionReferencesKt$box$19
inner (anonymous) class FunctionReferencesKt$box$20
inner (anonymous) class FunctionReferencesKt$box$21
inner (anonymous) class FunctionReferencesKt$box$22
inner (anonymous) class FunctionReferencesKt$box$9
public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String
public final static @org.jetbrains.annotations.NotNull method consume-lIoT8es(p0: double, p1: double, p2: double, p3: double, @org.jetbrains.annotations.NotNull p4: kotlin.jvm.functions.Function2): DPoint
public final static @org.jetbrains.annotations.NotNull method consumeInline-lIoT8es(p0: double, p1: double, p2: double, p3: double, @org.jetbrains.annotations.NotNull p4: kotlin.jvm.functions.Function2): DPoint
public final static method g-GPBa7dw(p0: double, p1: double, p2: double): double
public final static @org.jetbrains.annotations.NotNull method makeDPoint(p0: double, p1: double, @org.jetbrains.annotations.NotNull p2: kotlin.jvm.functions.Function2): DPoint
public final static @org.jetbrains.annotations.NotNull method makeDPointInline(p0: double, p1: double, @org.jetbrains.annotations.NotNull p2: kotlin.jvm.functions.Function2): DPoint
public synthetic final static method mfvcConstructorReferenceHelper$0(p0: double, p1: double): DPoint
public final static @org.jetbrains.annotations.NotNull method plus-GPBa7dw(p0: double, p1: double, p2: double, p3: double): DPoint
}