Skip to content

Commit 374f271

Browse files
committed
Refactor parameter handling in SuspendTransformFirTransformer
1 parent abfee0b commit 374f271

File tree

1 file changed

+63
-69
lines changed

1 file changed

+63
-69
lines changed

compiler/suspend-transform-plugin/src/main/kotlin/love/forte/plugin/suspendtrans/fir/SuspendTransformFirTransformer.kt

Lines changed: 63 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ class SuspendTransformFirTransformer(
108108
val dependenciesSymbolProvider = session.dependenciesSymbolProvider
109109

110110
suspendTransformConfiguration.transformers
111-
.forEach { (platform, transformerList) ->
111+
.forEach { (_, transformerList) ->
112112
for (transformer in transformerList) {
113113
val transformFunctionInfo = transformer.transformFunctionInfo
114114
val packageName = transformFunctionInfo.packageName
@@ -435,19 +435,8 @@ class SuspendTransformFirTransformer(
435435
// CoroutineScope? -> this as? CoroutineScope
436436
// CoroutineScope -> this or throw error
437437
// CoroutineScope (optional) -> this or ignore
438-
// TODO Any -> this
439-
// TODO 后面的所有参数处理
440-
441-
// val listIterator = valueParameterSymbols.listIterator(1)
442-
// listIterator.forEach { otherParameter ->
443-
//
444-
// }
445-
446-
val secondParameter = valueParameterSymbols[1]
447-
448-
val secondParameterType = secondParameter.resolvedReturnType
449-
val secondParameterTypeNotNullable =
450-
secondParameterType.makeConeTypeDefinitelyNotNullOrNotNull(session.typeContext)
438+
// Any -> this
439+
// index 1 以及后面的所有参数都进行处理
451440

452441
fun ConeKotlinType.isCoroutineScope(): Boolean {
453442
return isSubtypeOf(
@@ -456,74 +445,79 @@ class SuspendTransformFirTransformer(
456445
)
457446
}
458447

459-
val isCoroutineScope = secondParameterTypeNotNullable.isCoroutineScope()
460-
461-
if (isCoroutineScope) {
462-
if (secondParameterType.isMarkedNullable) {
463-
// this as? CoroutineScope
464-
val secondParameterTypeNotNullable =
465-
secondParameterType.makeConeTypeDefinitelyNotNullOrNotNull(
466-
session.typeContext
467-
)
468-
469-
put(
470-
buildTypeOperatorCall {
471-
source = originFunSymbol.source
472-
coneTypeOrNull = secondParameterTypeNotNullable
473-
argumentList = buildResolvedArgumentList(
474-
null,
475-
mapping = linkedMapOf<FirExpression, FirValueParameter>().apply {
476-
put(
477-
buildThisReceiverExpression {
478-
coneTypeOrNull = originFunSymbol.dispatchReceiverType
479-
source = originFunSymbol.source
480-
calleeReference = buildImplicitThisReference {
481-
boundSymbol = owner
482-
}
483-
},
484-
secondParameter.fir
485-
)
486-
}
487-
)
488-
operation = FirOperation.SAFE_AS
489-
conversionTypeRef =
490-
secondParameterTypeNotNullable.toFirResolvedTypeRef()
491-
},
492-
secondParameter.fir
493-
)
448+
fun thisReceiverExpression(): FirThisReceiverExpression {
449+
return buildThisReceiverExpression {
450+
coneTypeOrNull =
451+
originFunSymbol.dispatchReceiverType
452+
source = originFunSymbol.source
453+
calleeReference = buildImplicitThisReference {
454+
boundSymbol = owner
455+
}
456+
}
457+
}
494458

495-
} else {
496-
// if this is CoroutineScope, put, or throw error?
459+
val listIterator = valueParameterSymbols.listIterator(1)
460+
listIterator.forEach { parameterSymbol ->
461+
val parameterFir = parameterSymbol.fir
462+
val parameterType = parameterSymbol.resolvedReturnType
497463

498-
var ownerIsCoroutineScopeOrParameterIsOptional = secondParameter.hasDefaultValue
464+
val parameterTypeNotNullable = if (parameterType.isMarkedNullable) {
465+
parameterType.makeConeTypeDefinitelyNotNullOrNotNull(session.typeContext)
466+
} else {
467+
parameterType
468+
}
499469

500-
for (superType in owner.getSuperTypes(session, recursive = false)) {
501-
if (superType.isCoroutineScope()) {
470+
when {
471+
// 参数是 CoroutineScope(?) 类型
472+
parameterTypeNotNullable.isCoroutineScope() -> {
473+
if (parameterType.isMarkedNullable) {
474+
// scope = this as? CoroutineScope
502475
put(
503-
buildThisReceiverExpression {
504-
coneTypeOrNull = originFunSymbol.dispatchReceiverType
476+
buildTypeOperatorCall {
505477
source = originFunSymbol.source
506-
calleeReference = buildImplicitThisReference {
507-
boundSymbol = owner
508-
}
478+
coneTypeOrNull = parameterTypeNotNullable
479+
argumentList = buildResolvedArgumentList(
480+
null,
481+
mapping = linkedMapOf<FirExpression, FirValueParameter>().apply {
482+
put(thisReceiverExpression(), parameterFir)
483+
}
484+
)
485+
operation = FirOperation.SAFE_AS
486+
conversionTypeRef = parameterTypeNotNullable.toFirResolvedTypeRef()
509487
},
510-
secondParameter.fir
488+
parameterFir
511489
)
512-
ownerIsCoroutineScopeOrParameterIsOptional = true
513-
break
490+
} else {
491+
// coroutine not nullable
492+
// put if this is `CoroutineScope` or it is optional, otherwise throw error
493+
var ownerIsCoroutineScopeOrParameterIsOptional = parameterSymbol.hasDefaultValue
494+
for (superType in owner.getSuperTypes(session, recursive = false)) {
495+
if (superType.isCoroutineScope()) {
496+
put(thisReceiverExpression(), parameterFir)
497+
ownerIsCoroutineScopeOrParameterIsOptional = true
498+
break
499+
}
500+
}
501+
502+
// or throw error?
503+
if (!ownerIsCoroutineScopeOrParameterIsOptional) {
504+
error(
505+
"Owner is not a CoroutineScope, " +
506+
"and the transformer function requires a `CoroutineScope` parameter."
507+
)
508+
}
514509
}
515510
}
516511

517-
// or throw error?
518-
if (!ownerIsCoroutineScopeOrParameterIsOptional) {
519-
error(
520-
"Owner is not a CoroutineScope, " +
521-
"and the transformer function requires a `CoroutineScope` parameter."
522-
)
512+
// 参数是 Any(?) 类型
513+
parameterTypeNotNullable == session.builtinTypes.anyType.coneType -> {
514+
// 直接把 this 放进去,不需要转换
515+
put(thisReceiverExpression(), parameterFir)
523516
}
524517
}
525-
526518
}
519+
520+
527521
}
528522

529523
}

0 commit comments

Comments
 (0)