K2: Set special function kind to function param with receiver

`StubBasedFirTypeDeserializer` handles function parameter with a
receiver with a special exception, which sets it as
`ExtensionFunctionType`, but skips setting special function kinds for it
even when the function parameter type is a special function kind. This
drops `Composable` annotation from a lambda expression if the function
parameter taking the lambda expression as an argument has a receiver,
which causes a severe CodeGen error for Compose app on K2 Android
Studio.

^KT-66526 Fixed
This commit is contained in:
Jaebaek Seo
2024-03-07 10:35:11 -08:00
committed by Space Cloud
parent cc6e0eb218
commit 90ccdb79ed
5 changed files with 70 additions and 1 deletions
@@ -0,0 +1,15 @@
MODULE_FRAGMENT
FILE fqName:<root> fileName:main.kt
FUN name:AuthorAndReadTime visibility:public modality:FINAL <> (b:p2.B) returnType:kotlin.Unit
VALUE_PARAMETER name:b index:0 type:p2.B
BLOCK_BODY
CALL 'public final fun Row (a: p2.A, content: @[MyComposable] @[ExtensionFunctionType] kotlin.Function1<p3.RowScope, kotlin.Unit>): kotlin.Unit [inline] declared in p3' type=kotlin.Unit origin=null
a: CONSTRUCTOR_CALL 'public constructor <init> () [primary] declared in p2.A' type=p2.A origin=null
content: FUN_EXPR type=@[ExtensionFunctionType] kotlin.Function1<p3.RowScope, kotlin.Unit> origin=LAMBDA
FUN LOCAL_FUNCTION_FOR_LAMBDA name:<anonymous> visibility:local modality:FINAL <> ($receiver:p3.RowScope) returnType:kotlin.Unit
annotations:
MyComposable
$receiver: VALUE_PARAMETER name:$this$Row type:p3.RowScope
BLOCK_BODY
CALL 'public final fun callB (): kotlin.Unit declared in p2.B' type=kotlin.Unit origin=null
$this: GET_VAR 'b: p2.B declared in <root>.AuthorAndReadTime' type=p2.B origin=null
@@ -0,0 +1,40 @@
// WITH_FIR_TEST_COMPILER_PLUGIN
// DUMP_IR
// MODULE: lib
// MODULE_KIND: LibraryBinary
// FILE: p2/foo.kt
package p2
class A {
fun callA() {}
}
class B {
fun callB() {}
}
// MODULE: lib2(lib)
// MODULE_KIND: LibraryBinary
// FILE: p3/bar.kt
package p3
import org.jetbrains.kotlin.fir.plugin.MyComposable
import p2.A
interface RowScope
inline fun Row(a: A, content: @MyComposable RowScope.() -> Unit) {
a.callA()
}
// MODULE: main(lib, lib2)
// FILE: main.kt
import org.jetbrains.kotlin.fir.plugin.MyComposable
import p2.A
import p2.B
import p3.Row
fun AuthorAndReadTime(b: B) {
Row(A()) {
b.callB()
}
}
@@ -0,0 +1,4 @@
public final class MainKt {
// source: 'main.kt'
public final static method AuthorAndReadTime(p0: p2.B): void
}