in dotnet/CSharpSourceGraphExtraction/GraphBuilders/VariableUseGraphBuilder.cs [326:373]
public override (SyntaxToken? entryNode, IEnumerable<SyntaxToken> exitNodes) VisitAssignmentExpression(AssignmentExpressionSyntax node)
{
var (rhsEntry, rhsExits) = Visit(node.Right);
var (lhsEntry, lhsExits) = Visit(node.Left);
// lhsEntry will be None for assignments to static class variables of other classes.
if (lhsEntry.HasValue)
{
AddEdges(lhsEntry.Value, rhsExits);
// We distinguish tuple assignments from others:
if (node.Left is DeclarationExpressionSyntax lhsDeclaration)
{
HandleTupleAssignment(lhsDeclaration.Designation, node.Right);
}
else
{
var writtenToken = lhsExits.First();
foreach (var usedToken in node.Right.DescendantTokens().Where(token => _graph.VariableUseNodes.Contains(token)))
{
_graph.AddEdge(writtenToken, SourceGraphEdge.ComputedFrom, usedToken);
}
_graph.VariableWriteNodes.Add(writtenToken);
}
}
else if (!(node.Parent is InitializerExpressionSyntax))
{
// ComputedFrom edges will be added to the object being initialized and
// not within the initializer.
_graph.AddEdge(node.Left, SourceGraphEdge.ComputedFrom, node.Right);
}
if (rhsEntry != null) // rhsEntry is null if the rhs is just constants
{
if (lhsExits.Any())
{
return (rhsEntry, lhsExits);
}
else
{
return (rhsEntry, rhsExits);
}
}
else
{
return (lhsEntry, lhsExits);
}
}