Skip to content

Commit 868006e

Browse files
committed
WIP: 尝试支持对 CoroutineScope 的安全类型转化支持
1 parent 67618da commit 868006e

File tree

1 file changed

+34
-9
lines changed

1 file changed

+34
-9
lines changed

compiler/suspend-transform-plugin/src/main/kotlin/love/forte/plugin/suspendtrans/ir/SuspendTransformTransformer.kt

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package 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
47
import love.forte.plugin.suspendtrans.utils.*
58
import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext
69
import org.jetbrains.kotlin.backend.common.extensions.FirIncompatiblePluginAPI
@@ -9,16 +12,20 @@ import org.jetbrains.kotlin.descriptors.CallableDescriptor
912
import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor
1013
import org.jetbrains.kotlin.ir.IrStatement
1114
import 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
1720
import org.jetbrains.kotlin.ir.expressions.IrBody
21+
import org.jetbrains.kotlin.ir.expressions.IrTypeOperator
22+
import org.jetbrains.kotlin.ir.expressions.impl.IrTypeOperatorCallImpl
1823
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
24+
import org.jetbrains.kotlin.ir.types.defaultType
1925
import org.jetbrains.kotlin.ir.types.isSubtypeOfClass
2026
import 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
2229
import org.jetbrains.kotlin.name.ClassId
2330
import 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

Comments
 (0)