[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 { val assignmentLeftArgument = buildDesugaredAssignmentValueReferenceExpression {
expressionRef = FirExpressionRef<FirExpression>().apply { bind(unwrappedLeftArgument) } expressionRef = FirExpressionRef<FirExpression>().apply { bind(unwrappedLeftArgument) }
source = leftArgument.source?.fakeElement(KtFakeSourceElementKind.DesugaredCompoundAssignment) source = leftArgument.source?.fakeElement(KtFakeSourceElementKind.DesugaredCompoundAssignment)
}.also { storeTypeFromCallee(it) } }
val assignment = val assignment =
buildVariableAssignment { buildVariableAssignment {
@@ -861,7 +861,19 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
desugaredAssignmentValueReferenceExpression: FirDesugaredAssignmentValueReferenceExpression, desugaredAssignmentValueReferenceExpression: FirDesugaredAssignmentValueReferenceExpression,
data: ResolutionMode data: ResolutionMode
): FirStatement { ): 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 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)
}
}
} }