[JS IR] Fix reflection generation
This commit is contained in:
+9
-4
@@ -91,20 +91,24 @@ class CallableReferenceLowering(private val context: CommonBackendContext) : Bod
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun buildFunctionReference(expression: IrFunctionReference): Pair<IrClass, IrConstructor> {
|
private fun buildFunctionReference(expression: IrFunctionReference): Pair<IrClass, IrConstructor> {
|
||||||
return CallableReferenceBuilder(expression.symbol.owner, expression, false).build()
|
val target = expression.symbol.owner
|
||||||
|
val reflectionTarget = expression.reflectionTarget?.owner ?: target
|
||||||
|
return CallableReferenceBuilder(target, expression, reflectionTarget).build()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun buildLambdaReference(function: IrSimpleFunction, expression: IrFunctionExpression): Pair<IrClass, IrConstructor> {
|
private fun buildLambdaReference(function: IrSimpleFunction, expression: IrFunctionExpression): Pair<IrClass, IrConstructor> {
|
||||||
return CallableReferenceBuilder(function, expression, true).build()
|
return CallableReferenceBuilder(function, expression, null).build()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private inner class CallableReferenceBuilder(
|
private inner class CallableReferenceBuilder(
|
||||||
private val function: IrFunction,
|
private val function: IrFunction,
|
||||||
private val reference: IrExpression,
|
private val reference: IrExpression,
|
||||||
private val isLambda: Boolean
|
private val reflectionTarget: IrFunction?
|
||||||
) {
|
) {
|
||||||
|
|
||||||
|
private val isLambda: Boolean get() = reflectionTarget == null
|
||||||
|
|
||||||
private val isSuspendLambda = isLambda && function.isSuspend
|
private val isSuspendLambda = isLambda && function.isSuspend
|
||||||
|
|
||||||
private val superClass = if (isSuspendLambda) context.ir.symbols.coroutineImpl.owner.defaultType else context.irBuiltIns.anyType
|
private val superClass = if (isSuspendLambda) context.ir.symbols.coroutineImpl.owner.defaultType else context.irBuiltIns.anyType
|
||||||
@@ -362,11 +366,12 @@ class CallableReferenceLowering(private val context: CommonBackendContext) : Bod
|
|||||||
type = clazz.defaultType
|
type = clazz.defaultType
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: What name should be in case of constructor? <init> or class name?
|
||||||
getter.body = context.irFactory.createBlockBody(
|
getter.body = context.irFactory.createBlockBody(
|
||||||
UNDEFINED_OFFSET, UNDEFINED_OFFSET, listOf(
|
UNDEFINED_OFFSET, UNDEFINED_OFFSET, listOf(
|
||||||
IrReturnImpl(
|
IrReturnImpl(
|
||||||
UNDEFINED_OFFSET, UNDEFINED_OFFSET, nothingType, getter.symbol, IrConstImpl.string(
|
UNDEFINED_OFFSET, UNDEFINED_OFFSET, nothingType, getter.symbol, IrConstImpl.string(
|
||||||
UNDEFINED_OFFSET, UNDEFINED_OFFSET, stringType, function.name.asString()
|
UNDEFINED_OFFSET, UNDEFINED_OFFSET, stringType, reflectionTarget!!.name.asString()
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user