alvr
05/09/2024, 10:24 AMalvr
05/09/2024, 10:25 AMcontext(IrPluginContext)
private fun IrClass.createBuildLambdaFunction(mutableClass: IrClass) {
val buildFun = irFactory.buildFun {
name = Name.identifier("build")
returnType = irBuiltIns.unitType
origin = IrDeclarationOrigin.DEFINED
visibility = DescriptorVisibilities.PUBLIC
}.apply {
parent = this@createBuildLambdaFunction
val blockParameter = buildValueParameter(this) {
name = Name.identifier("block")
type = irBuiltIns.functionN(2).typeWith(
mutableClass.defaultType,
this@createBuildLambdaFunction.defaultType,
irBuiltIns.unitType,
)
}
valueParameters += blockParameter
}
buildFun.body = irFactory.createBlockBody(UNDEFINED_OFFSET, UNDEFINED_OFFSET) // TODO
declarations += buildFun
}
Tóth István Zoltán
05/09/2024, 10:51 AMstatic
? You can try to dump the class to see what is actually built: println(yourClass.dump())
I typically check the dump and compare it to the dump of some actual code I wrote manually to see the difference.alvr
05/09/2024, 10:57 AMpublic static final void build(@NotNull Function2<? super MutableTestClass, ? super TestClass, Unit> function2) {
Intrinsics.checkNotNullParameter(function2, "block");
}
and this the result of dump:
FUN name:build visibility:public modality:FINAL <> (block:kotlin.Function2<sample.TestClass.MutableTestClass, sample.TestClass, kotlin.Unit>) returnType:kotlin.Unit
VALUE_PARAMETER name:block type:kotlin.Function2<sample.TestClass.MutableTestClass, sample.TestClass, kotlin.Unit>
BLOCK_BODY
Tóth István Zoltán
05/09/2024, 11:01 AMirFactory.buildFun {
}.also {
it.dispatchReceiverParameter = irGet(irClass.thisReceiver!!)
}
alvr
05/09/2024, 11:37 AM