[FIR] Set proper source for synthetic function calls
This commit is contained in:
committed by
Space Team
parent
10054c584c
commit
e1e305bf6d
+32
-6
@@ -590,7 +590,13 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
|
|||||||
val rightArgument = assignmentOperatorStatement.rightArgument.transformSingle(transformer, ResolutionMode.ContextDependent)
|
val rightArgument = assignmentOperatorStatement.rightArgument.transformSingle(transformer, ResolutionMode.ContextDependent)
|
||||||
dataFlowAnalyzer.exitCallArguments()
|
dataFlowAnalyzer.exitCallArguments()
|
||||||
|
|
||||||
val generator = GeneratorOfPlusAssignCalls(assignmentOperatorStatement, operation, leftArgument, rightArgument)
|
val generator = GeneratorOfPlusAssignCalls(
|
||||||
|
assignmentOperatorStatement,
|
||||||
|
assignmentOperatorStatement.calleeReference?.source,
|
||||||
|
operation,
|
||||||
|
leftArgument,
|
||||||
|
rightArgument
|
||||||
|
)
|
||||||
|
|
||||||
// x.plusAssign(y)
|
// x.plusAssign(y)
|
||||||
val assignOperatorCall = generator.createAssignOperatorCall()
|
val assignOperatorCall = generator.createAssignOperatorCall()
|
||||||
@@ -1336,6 +1342,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
|
|||||||
|
|
||||||
private class GeneratorOfPlusAssignCalls(
|
private class GeneratorOfPlusAssignCalls(
|
||||||
val baseElement: FirStatement,
|
val baseElement: FirStatement,
|
||||||
|
val referenceSource: KtSourceElement?,
|
||||||
val operation: FirOperation,
|
val operation: FirOperation,
|
||||||
val lhs: FirExpression,
|
val lhs: FirExpression,
|
||||||
val rhs: FirExpression
|
val rhs: FirExpression
|
||||||
@@ -1344,6 +1351,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
|
|||||||
fun createFunctionCall(
|
fun createFunctionCall(
|
||||||
name: Name,
|
name: Name,
|
||||||
source: KtSourceElement?,
|
source: KtSourceElement?,
|
||||||
|
referenceSource: KtSourceElement?,
|
||||||
receiver: FirExpression,
|
receiver: FirExpression,
|
||||||
vararg arguments: FirExpression
|
vararg arguments: FirExpression
|
||||||
): FirFunctionCall = buildFunctionCall {
|
): FirFunctionCall = buildFunctionCall {
|
||||||
@@ -1357,8 +1365,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
calleeReference = buildSimpleNamedReference {
|
calleeReference = buildSimpleNamedReference {
|
||||||
// TODO: Use source of operator for callee reference source
|
this.source = referenceSource ?: source
|
||||||
this.source = source
|
|
||||||
this.name = name
|
this.name = name
|
||||||
}
|
}
|
||||||
origin = FirFunctionCallOrigin.Operator
|
origin = FirFunctionCallOrigin.Operator
|
||||||
@@ -1366,7 +1373,13 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun createFunctionCall(name: Name): FirFunctionCall {
|
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 {
|
fun createAssignOperatorCall(): FirFunctionCall {
|
||||||
@@ -1401,7 +1414,13 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
|
|||||||
val transformedRhs = augmentedArraySetCall.rhs.transformSingle(transformer, ResolutionMode.ContextDependent)
|
val transformedRhs = augmentedArraySetCall.rhs.transformSingle(transformer, ResolutionMode.ContextDependent)
|
||||||
dataFlowAnalyzer.exitCallArguments()
|
dataFlowAnalyzer.exitCallArguments()
|
||||||
|
|
||||||
val generator = GeneratorOfPlusAssignCalls(augmentedArraySetCall, operation, transformedLhsCall, transformedRhs)
|
val generator = GeneratorOfPlusAssignCalls(
|
||||||
|
augmentedArraySetCall,
|
||||||
|
augmentedArraySetCall.calleeReference.source,
|
||||||
|
operation,
|
||||||
|
transformedLhsCall,
|
||||||
|
transformedRhs
|
||||||
|
)
|
||||||
|
|
||||||
// a.get(b).plusAssign(c)
|
// a.get(b).plusAssign(c)
|
||||||
val assignOperatorCall = generator.createAssignOperatorCall()
|
val assignOperatorCall = generator.createAssignOperatorCall()
|
||||||
@@ -1582,7 +1601,13 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
|
|||||||
typeRef = lhsGetCall.typeRef
|
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 operatorCall = generator.createSimpleOperatorCall()
|
||||||
val resolvedOperatorCall = resolveCandidateForAssignmentOperatorCall {
|
val resolvedOperatorCall = resolveCandidateForAssignmentOperatorCall {
|
||||||
@@ -1592,6 +1617,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
|
|||||||
val setCall = GeneratorOfPlusAssignCalls.createFunctionCall(
|
val setCall = GeneratorOfPlusAssignCalls.createFunctionCall(
|
||||||
OperatorNameConventions.SET,
|
OperatorNameConventions.SET,
|
||||||
augmentedArraySetCall.source,
|
augmentedArraySetCall.source,
|
||||||
|
augmentedArraySetCall.calleeReference.source,
|
||||||
receiver = arrayAccess, // a
|
receiver = arrayAccess, // a
|
||||||
*indicesQualifiedAccess.toTypedArray(), // indices
|
*indicesQualifiedAccess.toTypedArray(), // indices
|
||||||
resolvedOperatorCall // a.get(b).plus(c)
|
resolvedOperatorCall // a.get(b).plus(c)
|
||||||
|
|||||||
Reference in New Issue
Block a user