Files
kotlin-fork/compiler/testData/codegen/box/callableReference/funInterfaceConstructor/funInterfaceConstructedObjectsEquality.kt
T
2023-01-17 18:14:17 +00:00

73 lines
1.8 KiB
Kotlin
Vendored

// !LANGUAGE: +KotlinFunInterfaceConstructorReference
// IGNORE_BACKEND: JVM
// ^ unsupported in old JVM BE
// IGNORE_BACKEND: WASM
// ^ wasm-function[1893]:0x1cf8a: RuntimeError: dereferencing a null pointer
// IGNORE_BACKEND: JS
// IGNORE_BACKEND: JS_IR, JS_IR_ES6
// ^ TypeError: tmp is not a function
// FILE: funInterfaceConstructedObjectsEquality.kt
val ks1: (() -> String) -> KSupplier<String> =
::KSupplier
val ks11Foo = ks1(::foo)
// getter is used to avoid dependency on lazy initialization support
val ks21Foo get() = ks2(::foo)
fun interface KStringSupplier {
fun get(): String
}
val kss: (() -> String) -> KStringSupplier =
::KStringSupplier
val ks11Bar = ks1(::bar)
val kssFoo = kss(::foo)
fun checkEqual(message: String, a1: Any, a2: Any) {
if (a1 != a2) {
throw Exception("$message: equals: $a1 != $a2")
}
if (a1.hashCode() != a2.hashCode()) {
throw Exception("$message: hashCode: ${a1.hashCode()} != ${a2.hashCode()}")
}
}
fun checkNotEqual(message: String, a1: Any, a2: Any) {
if (a1 == a2) {
throw Exception("$message: equals: $a1 == $a2")
}
}
fun box(): String {
checkEqual("ks11Foo == ks12Foo (same ctor, different source files)", ks11Foo, ks12Foo)
checkEqual("ks11Foo == ks21Foo (different ctors, same source file)", ks11Foo, ks21Foo)
checkEqual("ks11Foo == ks22Foo (different ctors, different source files)", ks11Foo, ks22Foo)
checkNotEqual("ks11Foo != ks11Bar (different funs)", ks11Foo, ks11Bar)
checkNotEqual("ks11Foo != kssFoo (different fun interfaces)", ks11Foo, kssFoo)
return "OK"
}
// FILE: KSupplier.kt
fun interface KSupplier<T> {
fun get(): T
}
fun foo() = "abc"
fun bar() = "def"
val ks2: (() -> String) -> KSupplier<String> =
::KSupplier
val ks12Foo get() = ks1(::foo)
val ks22Foo = ks2(::foo)