提交 41414146 编写于 作者: S Sam Harwell

Remove unnecessary gen-0 allocations from the RecordReplaceOldWithNew fast path

上级 5cf22e55
......@@ -529,13 +529,26 @@ private void RecordDeleteOld(int oldNodeCount)
private void RecordReplaceOldWithNew(int oldNodeCount, int newNodeCount)
{
var oldSpan = GetSpan(_oldNodes, 0, oldNodeCount);
var removedNodes = CopyFirst(_oldNodes, oldNodeCount);
RemoveFirst(_oldNodes, oldNodeCount);
var newSpan = GetSpan(_newNodes, 0, newNodeCount);
var insertedNodes = CopyFirst(_newNodes, newNodeCount);
RemoveFirst(_newNodes, newNodeCount);
RecordChange(new ChangeRecord(new TextChangeRange(oldSpan, newSpan.Length), removedNodes, insertedNodes));
if (oldNodeCount == 1 && newNodeCount == 1)
{
var removedNode = _oldNodes.Pop();
var oldSpan = removedNode.FullSpan;
var insertedNode = _newNodes.Pop();
var newSpan = insertedNode.FullSpan;
RecordChange(new TextChangeRange(oldSpan, newSpan.Length), removedNode, insertedNode);
}
else
{
var oldSpan = GetSpan(_oldNodes, 0, oldNodeCount);
var removedNodes = CopyFirst(_oldNodes, oldNodeCount);
RemoveFirst(_oldNodes, oldNodeCount);
var newSpan = GetSpan(_newNodes, 0, newNodeCount);
var insertedNodes = CopyFirst(_newNodes, newNodeCount);
RemoveFirst(_newNodes, newNodeCount);
RecordChange(new ChangeRecord(new TextChangeRange(oldSpan, newSpan.Length), removedNodes, insertedNodes));
}
}
private void RecordInsertNew(int newNodeCount)
......@@ -568,6 +581,37 @@ private void RecordChange(ChangeRecord change)
_changes.Add(change);
}
private void RecordChange(TextChangeRange textChangeRange, SyntaxNodeOrToken removedNode, SyntaxNodeOrToken insertedNode)
{
if (_changes.Count > 0)
{
var last = _changes[_changes.Count - 1];
if (last.Range.Span.End == textChangeRange.Span.Start)
{
// merge changes...
last.OldNodes?.Enqueue(removedNode);
last.NewNodes?.Enqueue(insertedNode);
_changes[_changes.Count - 1] = new ChangeRecord(
new TextChangeRange(new TextSpan(last.Range.Span.Start, last.Range.Span.Length + textChangeRange.Span.Length), last.Range.NewLength + textChangeRange.NewLength),
last.OldNodes ?? CreateQueue(removedNode),
last.NewNodes ?? CreateQueue(insertedNode));
return;
}
Debug.Assert(textChangeRange.Span.Start >= last.Range.Span.End);
}
_changes.Add(new ChangeRecord(textChangeRange, CreateQueue(removedNode), CreateQueue(insertedNode)));
// Local Functions
Queue<SyntaxNodeOrToken> CreateQueue(SyntaxNodeOrToken nodeOrToken)
{
var queue = new Queue<SyntaxNodeOrToken>();
queue.Enqueue(nodeOrToken);
return queue;
}
}
private static TextSpan GetSpan(Stack<SyntaxNodeOrToken> stack, int first, int length)
{
int start = -1, end = -1, i = 0;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册