11package love.forte.plugin.suspendtrans.ir
22
3- import love.forte.plugin.suspendtrans.*
3+ import love.forte.plugin.suspendtrans.SuspendTransformConfiguration
4+ import love.forte.plugin.suspendtrans.SuspendTransformUserData
5+ import love.forte.plugin.suspendtrans.SuspendTransformUserDataKey
6+ import love.forte.plugin.suspendtrans.fqn
47import love.forte.plugin.suspendtrans.utils.*
58import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext
69import org.jetbrains.kotlin.backend.common.extensions.FirIncompatiblePluginAPI
@@ -9,16 +12,20 @@ import org.jetbrains.kotlin.descriptors.CallableDescriptor
912import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor
1013import org.jetbrains.kotlin.ir.IrStatement
1114import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
12- import org.jetbrains.kotlin.ir.builders.irBlockBody
13- import org.jetbrains.kotlin.ir.builders.irCall
14- import org.jetbrains.kotlin.ir.builders.irGet
15- import org.jetbrains.kotlin.ir.builders.irReturn
16- import org.jetbrains.kotlin.ir.declarations.*
15+ import org.jetbrains.kotlin.ir.builders.*
16+ import org.jetbrains.kotlin.ir.declarations.IrDeclaration
17+ import org.jetbrains.kotlin.ir.declarations.IrDeclarationContainer
18+ import org.jetbrains.kotlin.ir.declarations.IrFunction
19+ import org.jetbrains.kotlin.ir.declarations.IrProperty
1720import org.jetbrains.kotlin.ir.expressions.IrBody
21+ import org.jetbrains.kotlin.ir.expressions.IrTypeOperator
22+ import org.jetbrains.kotlin.ir.expressions.impl.IrTypeOperatorCallImpl
1823import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
24+ import org.jetbrains.kotlin.ir.types.defaultType
1925import org.jetbrains.kotlin.ir.types.isSubtypeOfClass
2026import org.jetbrains.kotlin.ir.types.typeWith
21- import org.jetbrains.kotlin.ir.util.*
27+ import org.jetbrains.kotlin.ir.util.isAnnotationWithEqualFqName
28+ import org.jetbrains.kotlin.ir.util.primaryConstructor
2229import org.jetbrains.kotlin.name.ClassId
2330import org.jetbrains.kotlin.name.FqName
2431
@@ -92,7 +99,8 @@ class SuspendTransformTransformer(
9299
93100 private fun resolveFunctionBodyByDescriptor (declaration : IrFunction , descriptor : CallableDescriptor ): IrFunction ? {
94101 val userData = descriptor.getUserData(SuspendTransformUserDataKey ) ? : return null
95- val callableFunction = pluginContext.referenceFunctions(userData.transformer.transformFunctionInfo.toCallableId()).firstOrNull()
102+ val callableFunction =
103+ pluginContext.referenceFunctions(userData.transformer.transformFunctionInfo.toCallableId()).firstOrNull()
96104 ? : throw IllegalStateException (" Transform function ${userData.transformer.transformFunctionInfo} not found" )
97105
98106 val generatedOriginFunction = resolveFunctionBody(declaration, userData.originFunction, callableFunction)
@@ -112,7 +120,7 @@ class SuspendTransformTransformer(
112120 currentAnnotations.any { a -> a.isAnnotationWithEqualFqName(name) }
113121 addAll(currentAnnotations)
114122
115- val syntheticFunctionIncludes = userData.transformer.originFunctionIncludeAnnotations
123+ val syntheticFunctionIncludes = userData.transformer.originFunctionIncludeAnnotations
116124
117125 syntheticFunctionIncludes.forEach { include ->
118126 val classId = include.classInfo.toClassId()
@@ -213,9 +221,26 @@ private fun generateTransformBodyForFunction(
213221 if (secondType.isClassType(coroutineScopeTypeNameUnsafe)) {
214222 function.dispatchReceiverParameter?.also { dispatchReceiverParameter ->
215223 context.referenceClass(coroutineScopeTypeClassId)?.also { coroutineScopeRef ->
224+ // irGet(dispatchReceiverParameter)
225+ // irAs(irGet(dispatchReceiverParameter), coroutineScopeRef).safeAs<>()
216226 if (dispatchReceiverParameter.type.isSubtypeOfClass(coroutineScopeRef)) {
217227 // put 'this' to second arg
218228 putValueArgument(1 , irGet(dispatchReceiverParameter))
229+ } else {
230+ // TODO scope safe cast
231+ val scopeType = coroutineScopeRef.defaultType
232+ // irAs(irGet(dispatchReceiverParameter), coroutineScopeRef.defaultType)
233+
234+ val irSafeAs = IrTypeOperatorCallImpl (
235+ startOffset,
236+ endOffset,
237+ scopeType,
238+ IrTypeOperator .SAFE_CAST ,
239+ scopeType,
240+ irGet(dispatchReceiverParameter)
241+ )
242+
243+ putValueArgument(1 , irSafeAs)
219244 }
220245 }
221246 }
0 commit comments