[FIR] Fix duplicate setting of return type ref in desugared assignment

This commit is contained in:
Kirill Rakhman
2023-02-22 11:39:10 +01:00
committed by Space Team
parent 3904966e2c
commit d8c1830b06
@@ -625,7 +625,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
val assignmentLeftArgument = buildDesugaredAssignmentValueReferenceExpression {
expressionRef = FirExpressionRef<FirExpression>().apply { bind(unwrappedLeftArgument) }
source = leftArgument.source?.fakeElement(KtFakeSourceElementKind.DesugaredCompoundAssignment)
}.also { storeTypeFromCallee(it) }
}
val assignment =
buildVariableAssignment {
@@ -861,7 +861,19 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
desugaredAssignmentValueReferenceExpression: FirDesugaredAssignmentValueReferenceExpression,
data: ResolutionMode
): FirStatement {
storeTypeFromCallee(desugaredAssignmentValueReferenceExpression)
val referencedExpression = desugaredAssignmentValueReferenceExpression.expressionRef.value
if (referencedExpression is FirQualifiedAccessExpression) {
val typeFromCallee = components.typeFromCallee(referencedExpression)
desugaredAssignmentValueReferenceExpression.resultType = typeFromCallee.withReplacedConeType(
session.typeApproximator.approximateToSubType(
typeFromCallee.type,
TypeApproximatorConfiguration.FinalApproximationAfterResolutionAndInference
)
)
} else {
desugaredAssignmentValueReferenceExpression.resultType =
referencedExpression.resultType.copyWithNewSourceKind(KtFakeSourceElementKind.ImplicitTypeRef)
}
return desugaredAssignmentValueReferenceExpression
}
@@ -1539,19 +1551,4 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
)
}
private fun storeTypeFromCallee(expression: FirDesugaredAssignmentValueReferenceExpression) {
val referencedExpression = expression.expressionRef.value
if (referencedExpression is FirQualifiedAccessExpression) {
val typeFromCallee = components.typeFromCallee(referencedExpression)
expression.resultType = typeFromCallee.withReplacedConeType(
session.typeApproximator.approximateToSubType(
typeFromCallee.type,
TypeApproximatorConfiguration.FinalApproximationAfterResolutionAndInference
)
)
} else {
expression.resultType = referencedExpression.resultType.copyWithNewSourceKind(KtFakeSourceElementKind.ImplicitTypeRef)
}
}
}