[Common IR] Do inlining of callable references of inline functions

^KT-52805 Fixed
This commit is contained in:
Alexander Korepanov
2022-07-27 09:33:51 +02:00
committed by Space
parent 3424e756ad
commit bb8da65188
21 changed files with 166 additions and 5 deletions
@@ -0,0 +1,41 @@
typealias Callback = () -> Unit
class CallbackComposer {
inline fun addTo(noinline block: Callback) {
asDynamic().push(block)
}
}
inline fun CallbackComposer.addToExtension(noinline block: Callback) {
asDynamic().push(block)
}
fun createCallbackBuilder(builder: CallbackComposer.() -> Unit): () -> Callback = {
val callbacks = arrayOf<Callback>()
builder(callbacks.unsafeCast<CallbackComposer>())
val composed: Callback = {
for (cb in callbacks) {
cb()
}
}
composed
}
var retVal = ""
fun appendToRetVal(c: String): () -> Unit = {
retVal += c
}
fun box(): String {
val callbackBuilder = createCallbackBuilder {
appendToRetVal("O").also(::addTo)
appendToRetVal("K").also(::addToExtension)
}
val callback = callbackBuilder()
callback()
return retVal
}