Skip to content

Commit b4bb8bf

Browse files
dzharkovSpace Team
authored andcommitted
FIR2IR: Pass original expected type to applySuspendConversionIfNeeded
It will be used in the next commit ^KT-82590 In Progress
1 parent 4718830 commit b4bb8bf

File tree

2 files changed

+17
-15
lines changed

2 files changed

+17
-15
lines changed

compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/AdapterGenerator.kt

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,16 @@ import org.jetbrains.kotlin.fir.backend.utils.convertWithOffsets
1414
import org.jetbrains.kotlin.fir.backend.utils.createWhenForSafeFall
1515
import org.jetbrains.kotlin.fir.backend.utils.varargElementType
1616
import 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
1820
import org.jetbrains.kotlin.fir.declarations.utils.*
1921
import org.jetbrains.kotlin.fir.expressions.*
2022
import org.jetbrains.kotlin.fir.references.FirResolvedCallableReference
2123
import org.jetbrains.kotlin.fir.render
2224
import org.jetbrains.kotlin.fir.resolve.FirSamResolver
23-
import org.jetbrains.kotlin.fir.resolve.calls.stages.FirFakeArgumentForCallableReference
2425
import org.jetbrains.kotlin.fir.resolve.calls.ResolvedCallArgument
26+
import org.jetbrains.kotlin.fir.resolve.calls.stages.FirFakeArgumentForCallableReference
2527
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
2628
import org.jetbrains.kotlin.fir.resolve.substitution.AbstractConeSubstitutor
2729
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
@@ -31,7 +33,6 @@ import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterLookupTag
3133
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
3234
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
3335
import org.jetbrains.kotlin.fir.types.*
34-
import org.jetbrains.kotlin.fir.types.ConeStarProjection
3536
import org.jetbrains.kotlin.ir.declarations.*
3637
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl
3738
import org.jetbrains.kotlin.ir.expressions.*
@@ -44,7 +45,10 @@ import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl
4445
import org.jetbrains.kotlin.ir.types.*
4546
import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl
4647
import 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
4852
import org.jetbrains.kotlin.name.Name
4953
import org.jetbrains.kotlin.name.SpecialNames
5054
import 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 =

compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/utils/ImplicitConversionUtils.kt

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,7 @@ import org.jetbrains.kotlin.fir.expressions.FirVarargArgumentsExpression
1212
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
1313
import org.jetbrains.kotlin.fir.types.ConeKotlinType
1414
import org.jetbrains.kotlin.fir.types.resolvedType
15-
import org.jetbrains.kotlin.ir.expressions.IrBlock
16-
import org.jetbrains.kotlin.ir.expressions.IrContainerExpression
17-
import org.jetbrains.kotlin.ir.expressions.IrExpression
18-
import org.jetbrains.kotlin.ir.expressions.IrStatementContainer
19-
import org.jetbrains.kotlin.ir.expressions.IrVararg
15+
import org.jetbrains.kotlin.ir.expressions.*
2016
import org.jetbrains.kotlin.ir.util.render
2117

2218
context(c: Fir2IrComponents)
@@ -47,8 +43,7 @@ fun IrExpression.prepareExpressionForGivenExpectedType(
4743
}
4844

4945
return with(c.adapterGenerator) {
50-
val samFunctionType = getFunctionTypeForPossibleSamType(substitutedExpectedType) ?: substitutedExpectedType
51-
expressionWithCast.applySuspendConversionIfNeeded(expression, samFunctionType)
46+
expressionWithCast.applySuspendConversionIfNeeded(expression, substitutedExpectedType)
5247
.applySamConversionIfNeeded(expression)
5348
}
5449
}

0 commit comments

Comments
 (0)