Skip to content

Commit dbb52ef

Browse files
committed
problem: It seemed that there was a problem with using inline value classes when using generics.
1 parent 11c2177 commit dbb52ef

File tree

1 file changed

+36
-26
lines changed

1 file changed

+36
-26
lines changed

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

Lines changed: 36 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -310,16 +310,16 @@ class SuspendTransformFirTransformer(
310310
owner: FirClassSymbol<*>,
311311
thisContextParameters: List<FirValueParameter>,
312312
thisReceiverParameter: FirReceiverParameter?,
313-
newFunSymbol: FirBasedSymbol<*>,
314313
thisValueParameters: List<FirValueParameter>,
315314
bridgeFunSymbol: FirNamedFunctionSymbol,
316315
newFunTarget: FirFunctionTarget,
317-
funData: SyntheticFunData,
318316
originalTypeParameterCache: MutableList<CopiedTypeParameterPair>,
319-
returnTypeRef: FirTypeRef
317+
functionReturnTypeRef: FirTypeRef,
320318
): FirBlock = buildBlock {
321319
this.source = originFunc.body?.source
322320

321+
val originalFunReturnType = originFunSymbol.resolvedReturnTypeRef.coneType.copyConeTypeOrSelf(originalTypeParameterCache)
322+
323323
// lambda: suspend () -> T
324324
val lambdaTarget = FirFunctionTarget(null, isLambda = true)
325325
val lambda = buildAnonymousFunction {
@@ -329,8 +329,12 @@ class SuspendTransformFirTransformer(
329329
this.moduleData = originFunSymbol.moduleData
330330
// this.origin = FirDeclarationOrigin.Source
331331
// this.origin = FirDeclarationOrigin.Synthetic.FakeFunction
332-
this.origin = FirDeclarationOrigin.Plugin(SuspendTransformK2V3Key)
333-
this.returnTypeRef = originFunSymbol.resolvedReturnTypeRef
332+
this.origin = SuspendTransformK2V3Key.origin
333+
// lambda 的返回值类型,() -> T 的 T, 应当是原始函数真正的返回值
334+
this.returnTypeRef = buildResolvedTypeRef {
335+
coneType = originalFunReturnType
336+
}
337+
334338
this.hasExplicitParameterList = false
335339
// this.status = FirResolvedDeclarationStatusImpl.DEFAULT_STATUS_FOR_SUSPEND_FUNCTION_EXPRESSION
336340
this.status = this.status.copy(isSuspend = true)
@@ -340,7 +344,8 @@ class SuspendTransformFirTransformer(
340344
target = lambdaTarget
341345
result = buildFunctionCall {
342346
// Call original fun
343-
this.coneTypeOrNull = originFunSymbol.resolvedReturnTypeRef.coneType
347+
// this.coneTypeOrNull = originFunSymbol.resolvedReturnTypeRef.coneType
348+
this.coneTypeOrNull = originalFunReturnType
344349
this.source = originFunSymbol.source
345350
this.calleeReference = buildResolvedNamedReference {
346351
this.source = originFunSymbol.source
@@ -399,16 +404,20 @@ class SuspendTransformFirTransformer(
399404

400405
this.typeRef = buildResolvedTypeRef {
401406
this.coneType = StandardClassIds.SuspendFunctionN(0)
402-
.createConeType(session, arrayOf(originFunSymbol.resolvedReturnType))
407+
// .createConeType(session, arrayOf(originFunSymbol.resolvedReturnType))
408+
.createConeType(session, arrayOf(originalFunReturnType))
403409
}
404410
}
405411
lambdaTarget.bind(lambda)
406412

413+
// 合成函数内部
407414
this.statements.add(
415+
// 调用桥接函数并返回
408416
buildReturnExpression {
409417
this.target = newFunTarget
410418
this.result = buildFunctionCall {
411-
this.coneTypeOrNull = returnTypeRef.coneType
419+
// 返回合成函数应该返回的类型
420+
this.coneTypeOrNull = functionReturnTypeRef.coneType
412421
this.source = originFunc.body?.source
413422
this.calleeReference = buildResolvedNamedReference {
414423
this.source = bridgeFunSymbol.source
@@ -521,10 +530,7 @@ class SuspendTransformFirTransformer(
521530
}
522531
}
523532
}
524-
525-
526533
}
527-
528534
}
529535
)
530536
}
@@ -556,12 +562,12 @@ class SuspendTransformFirTransformer(
556562

557563
val newFunSymbol = FirNamedFunctionSymbol(callableId)
558564

559-
val key = SuspendTransformK2V3Key
565+
val pluginKey = SuspendTransformK2V3Key
560566
val originalTypeParameterCache = mutableListOf<CopiedTypeParameterPair>()
561567

562568
val newFunTarget = FirFunctionTarget(null, isLambda = false)
563569
val newFun = buildSimpleFunctionCopy(originFunc) {
564-
origin = FirDeclarationOrigin.Plugin(SuspendTransformK2V3Key)
570+
origin = pluginKey.origin
565571
source = originFunc.source?.fakeElement(KtFakeSourceElementKind.PluginGenerated)
566572
name = callableId.callableName
567573
symbol = newFunSymbol
@@ -588,7 +594,12 @@ class SuspendTransformFirTransformer(
588594
copyParameters(originalTypeParameterCache)
589595

590596
// resolve returnType (with wrapped) after copyParameters
591-
returnTypeRef = resolveReturnType(funData, returnTypeRef, originalTypeParameterCache)
597+
returnTypeRef = resolveReturnType(
598+
funData,
599+
returnTypeRef,
600+
originalTypeParameterCache,
601+
funData.markAnnotationTypeArgument
602+
)
592603

593604
val thisReceiverParameter = this.receiverParameter
594605
val thisContextParameters = this.contextParameters
@@ -603,16 +614,12 @@ class SuspendTransformFirTransformer(
603614
owner,
604615
thisContextParameters,
605616
thisReceiverParameter,
606-
newFunSymbol,
607617
thisValueParameters,
608618
realBridgeFunSymbol,
609619
newFunTarget,
610-
funData,
611620
originalTypeParameterCache,
612-
returnTypeRef
621+
returnTypeRef,
613622
)
614-
615-
origin = key.origin
616623
}
617624

618625
newFunTarget.bind(newFun)
@@ -678,7 +685,12 @@ class SuspendTransformFirTransformer(
678685
)
679686

680687
// copy完了再resolve,这样里面包的type parameter就不会有问题了(如果有type parameter的话)
681-
val resolvedReturnType = resolveReturnType(funData, copiedReturnType, originalTypeParameterCache)
688+
val resolvedReturnType = resolveReturnType(
689+
funData,
690+
copiedReturnType,
691+
originalTypeParameterCache,
692+
funData.markAnnotationTypeArgument
693+
)
682694

683695
val newFunTarget = FirFunctionTarget(null, isLambda = false)
684696

@@ -755,16 +767,14 @@ class SuspendTransformFirTransformer(
755767
owner,
756768
emptyList(),
757769
null,
758-
propertyAccessorSymbol,
759770
thisValueParameters,
760771
funData.transformerFunctionSymbol(
761772
transformerFunctionSymbolMap,
762773
::findTransformerFunctionSymbol
763774
),
764775
newFunTarget,
765-
funData,
766776
originalTypeParameterCache,
767-
returnTypeRef
777+
returnTypeRef,
768778
)
769779
}.also { getter ->
770780
newFunTarget.bind(getter)
@@ -972,12 +982,12 @@ class SuspendTransformFirTransformer(
972982
private fun resolveReturnType(
973983
funData: SyntheticFunData,
974984
returnTypeRef: FirTypeRef,
975-
originalTypeParameterCache: MutableList<CopiedTypeParameterPair>
985+
originalTypeParameterCache: MutableList<CopiedTypeParameterPair>,
986+
returnTypeFromProjection: FirTypeProjection?
976987
): FirTypeRef {
977988
val transformer = funData.transformer
978-
val returnTypeArg = funData.markAnnotationTypeArgument
979989

980-
val returnTypeConeType: ConeKotlinType = returnTypeArg?.toConeTypeProjection()?.let {
990+
val returnTypeConeType: ConeKotlinType = returnTypeFromProjection?.toConeTypeProjection()?.let {
981991
// TODO if is star projection, use Any or Nothing? and the nullable?
982992
it.type
983993
?.copyConeTypeOrSelf(originalTypeParameterCache)

0 commit comments

Comments
 (0)