@@ -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