in DataExtraction/SourceGraphExtractionUtils/GraphDataExtractor.cs [539:586]
private static SourceGraph GetCompressedGraph(SourceGraph graph)
{
var compressedGraph = SourceGraph.Create(graph);
var nodeToReplacement = ComputeNodeCompressionMap(graph);
foreach (var sourceNode in graph.Nodes)
{
var newSourceNode = sourceNode;
if (sourceNode.IsNode)
{
if (nodeToReplacement.TryGetValue(sourceNode.AsNode(), out var replacementSourceNode))
{
newSourceNode = replacementSourceNode;
}
}
foreach (var edge in graph.GetOutEdges(sourceNode))
{
SyntaxNodeOrToken newTargetNode = edge.Target;
if (edge.Target.IsNode)
{
var targetSyntaxNode = edge.Target.AsNode();
while (targetSyntaxNode != null && nodeToReplacement.TryGetValue(targetSyntaxNode, out SyntaxNodeOrToken replacementTargetNode))
{
if (replacementTargetNode.IsNode)
{
targetSyntaxNode = replacementTargetNode.AsNode();
}
else
{
targetSyntaxNode = null;
}
newTargetNode = replacementTargetNode;
}
}
//Don't make links between replaced nodes into cycles:
if (newSourceNode == newTargetNode && sourceNode != edge.Target)
{
continue;
}
compressedGraph.AddEdge(newSourceNode, edge.Label, newTargetNode);
}
}
return compressedGraph;
}