From e1e305bf6dc1a36b1dd4ae92ab4bb3cafb81d8ba Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Mon, 26 Jun 2023 14:49:50 +0300 Subject: [PATCH] [FIR] Set proper source for synthetic function calls --- .../FirExpressionsResolveTransformer.kt | 38 ++++++++++++++++--- 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt index 72baba44aab..abd896efeef 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt @@ -590,7 +590,13 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT val rightArgument = assignmentOperatorStatement.rightArgument.transformSingle(transformer, ResolutionMode.ContextDependent) dataFlowAnalyzer.exitCallArguments() - val generator = GeneratorOfPlusAssignCalls(assignmentOperatorStatement, operation, leftArgument, rightArgument) + val generator = GeneratorOfPlusAssignCalls( + assignmentOperatorStatement, + assignmentOperatorStatement.calleeReference?.source, + operation, + leftArgument, + rightArgument + ) // x.plusAssign(y) val assignOperatorCall = generator.createAssignOperatorCall() @@ -1336,6 +1342,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT private class GeneratorOfPlusAssignCalls( val baseElement: FirStatement, + val referenceSource: KtSourceElement?, val operation: FirOperation, val lhs: FirExpression, val rhs: FirExpression @@ -1344,6 +1351,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT fun createFunctionCall( name: Name, source: KtSourceElement?, + referenceSource: KtSourceElement?, receiver: FirExpression, vararg arguments: FirExpression ): FirFunctionCall = buildFunctionCall { @@ -1357,8 +1365,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT } } calleeReference = buildSimpleNamedReference { - // TODO: Use source of operator for callee reference source - this.source = source + this.source = referenceSource ?: source this.name = name } origin = FirFunctionCallOrigin.Operator @@ -1366,7 +1373,13 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT } private fun createFunctionCall(name: Name): FirFunctionCall { - return createFunctionCall(name, baseElement.source?.fakeElement(KtFakeSourceElementKind.DesugaredCompoundAssignment), lhs, rhs) + return createFunctionCall( + name, + baseElement.source?.fakeElement(KtFakeSourceElementKind.DesugaredCompoundAssignment), + referenceSource, + lhs, + rhs + ) } fun createAssignOperatorCall(): FirFunctionCall { @@ -1401,7 +1414,13 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT val transformedRhs = augmentedArraySetCall.rhs.transformSingle(transformer, ResolutionMode.ContextDependent) dataFlowAnalyzer.exitCallArguments() - val generator = GeneratorOfPlusAssignCalls(augmentedArraySetCall, operation, transformedLhsCall, transformedRhs) + val generator = GeneratorOfPlusAssignCalls( + augmentedArraySetCall, + augmentedArraySetCall.calleeReference.source, + operation, + transformedLhsCall, + transformedRhs + ) // a.get(b).plusAssign(c) val assignOperatorCall = generator.createAssignOperatorCall() @@ -1582,7 +1601,13 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT typeRef = lhsGetCall.typeRef } - val generator = GeneratorOfPlusAssignCalls(augmentedArraySetCall, augmentedArraySetCall.operation, getCall, transformedRhs) + val generator = GeneratorOfPlusAssignCalls( + augmentedArraySetCall, + augmentedArraySetCall.calleeReference.source, + augmentedArraySetCall.operation, + getCall, + transformedRhs + ) val operatorCall = generator.createSimpleOperatorCall() val resolvedOperatorCall = resolveCandidateForAssignmentOperatorCall { @@ -1592,6 +1617,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT val setCall = GeneratorOfPlusAssignCalls.createFunctionCall( OperatorNameConventions.SET, augmentedArraySetCall.source, + augmentedArraySetCall.calleeReference.source, receiver = arrayAccess, // a *indicesQualifiedAccess.toTypedArray(), // indices resolvedOperatorCall // a.get(b).plus(c)