@@ -14,14 +14,16 @@ import org.jetbrains.kotlin.fir.backend.utils.convertWithOffsets
1414import org.jetbrains.kotlin.fir.backend.utils.createWhenForSafeFall
1515import org.jetbrains.kotlin.fir.backend.utils.varargElementType
1616import org.jetbrains.kotlin.fir.containingClassLookupTag
17- import org.jetbrains.kotlin.fir.declarations.*
17+ import org.jetbrains.kotlin.fir.declarations.FirConstructor
18+ import org.jetbrains.kotlin.fir.declarations.FirFunction
19+ import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
1820import org.jetbrains.kotlin.fir.declarations.utils.*
1921import org.jetbrains.kotlin.fir.expressions.*
2022import org.jetbrains.kotlin.fir.references.FirResolvedCallableReference
2123import org.jetbrains.kotlin.fir.render
2224import org.jetbrains.kotlin.fir.resolve.FirSamResolver
23- import org.jetbrains.kotlin.fir.resolve.calls.stages.FirFakeArgumentForCallableReference
2425import org.jetbrains.kotlin.fir.resolve.calls.ResolvedCallArgument
26+ import org.jetbrains.kotlin.fir.resolve.calls.stages.FirFakeArgumentForCallableReference
2527import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
2628import org.jetbrains.kotlin.fir.resolve.substitution.AbstractConeSubstitutor
2729import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
@@ -31,7 +33,6 @@ import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterLookupTag
3133import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
3234import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
3335import org.jetbrains.kotlin.fir.types.*
34- import org.jetbrains.kotlin.fir.types.ConeStarProjection
3536import org.jetbrains.kotlin.ir.declarations.*
3637import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl
3738import org.jetbrains.kotlin.ir.expressions.*
@@ -44,7 +45,10 @@ import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl
4445import org.jetbrains.kotlin.ir.types.*
4546import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl
4647import org.jetbrains.kotlin.ir.types.impl.makeTypeProjection
47- import org.jetbrains.kotlin.ir.util.*
48+ import org.jetbrains.kotlin.ir.util.isPrimitiveArray
49+ import org.jetbrains.kotlin.ir.util.isSuspendFunction
50+ import org.jetbrains.kotlin.ir.util.isTypeParameter
51+ import org.jetbrains.kotlin.ir.util.render
4852import org.jetbrains.kotlin.name.Name
4953import org.jetbrains.kotlin.name.SpecialNames
5054import org.jetbrains.kotlin.types.Variance
@@ -541,20 +545,23 @@ class AdapterGenerator(
541545 */
542546 internal fun IrExpression.applySuspendConversionIfNeeded (
543547 argument : FirExpression ,
544- parameterType : ConeKotlinType
548+ expectedType : ConeKotlinType ,
545549 ): IrExpression {
546550 if (this is IrBlock && origin == IrStatementOrigin .ADAPTED_FUNCTION_REFERENCE ) {
547551 return this
548552 }
553+
554+ val unwrappedExpectedType = getFunctionTypeForPossibleSamType(expectedType) ? : expectedType
555+
549556 // Expect the expected type to be a suspend functional type.
550- if (! parameterType .isSuspendOrKSuspendFunctionType(session)) {
557+ if (! unwrappedExpectedType .isSuspendOrKSuspendFunctionType(session)) {
551558 return this
552559 }
553- val expectedFunctionalType = parameterType .customFunctionTypeToSimpleFunctionType(session)
560+ val expectedFunctionalType = unwrappedExpectedType .customFunctionTypeToSimpleFunctionType(session)
554561
555562 val functionalArgumentType = calculateFunctionalArgumentType(argument)
556563 val invokeSymbol = findInvokeSymbol(expectedFunctionalType, functionalArgumentType) ? : return this
557- val suspendConvertedType = parameterType .toIrType() as IrSimpleType
564+ val suspendConvertedType = unwrappedExpectedType .toIrType() as IrSimpleType
558565 return argument.convertWithOffsets { startOffset, endOffset ->
559566 val argumentType = functionalArgumentType.toIrType()
560567 val irAdapterFunction =
0 commit comments