Kotlin: ¿La function local se pasa a funciones en línea como parámetro en línea?

Al pasar una function lambda o anónima a funciones en línea como parámetro, es bastante simple, el código se pega a la position de llamada, pero al pasar una function local como parámetro, el resultado parece diferente (como se muestra a continuación). Me pregunto si está en línea? ¿Por qué o por qué no?

Por ejemplo:

inline fun foo(arg: () -> Int): Int { return arg() } fun bar(): Int { return 0 } fun main(args: Array<String>) { foo(::bar) } 

Y el código de Java descomstackdo:

 public final class InlinedFuncKt { public static final int foo(@NotNull Function0 arg) { Intrinsics.checkParameterIsNotNull(arg, "arg"); return ((Number)arg.invoke()).intValue(); } public static final int bar() { return 0; } public static final void main(@NotNull String[] args) { Intrinsics.checkParameterIsNotNull(args, "args"); bar(); } } 

bar() no está declarado como inline . Entonces, ¿por qué esperas que esté en línea?

En otras palabras: sería simplemente incorrecto que la firma del método A afecte (implícitamente) a la firma de otro método B.

Tu idea (de alguna manera) afectaría a la "semántica" de bar (), simplemente porque usaste bar() como argumento para otra llamada a método.

Como puede hacerlo en el código descomstackdo , kotlin no incluye la bar en línea en su caso, pero sí la inserta si está declarada como inline fun bar() .

La regla es que las lambdas están en línea cuando se pasan a una function en línea. En todos los demás casos, como pasar una reference de function o un object lambda, no se realiza ninguna alignment.