提交 d39218a3 编写于 作者: C CyrusNajmabadi

Reduce allocations when creating sytem items.

上级 6b0afc57
......@@ -1366,17 +1366,8 @@ public static SyntaxTriviaList TriviaList(params SyntaxTrivia[] trivias)
/// <param name="trivias">A sequence of trivia.</param>
public static SyntaxTriviaList TriviaList(IEnumerable<SyntaxTrivia> trivias)
{
if (trivias == null)
{
return default(SyntaxTriviaList);
}
SyntaxTriviaListBuilder builder = SyntaxTriviaListBuilder.Create();
foreach (SyntaxTrivia trivia in trivias)
{
builder.Add(trivia);
}
var builder = SyntaxTriviaListBuilder.Create();
builder.AddRange(trivias);
return builder.ToList();
}
......
......@@ -3,11 +3,12 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using Microsoft.CodeAnalysis.Syntax;
using Microsoft.CodeAnalysis.Text;
using Roslyn.Utilities;
using System.Runtime.InteropServices;
namespace Microsoft.CodeAnalysis
{
......@@ -248,21 +249,31 @@ public SyntaxTriviaList InsertRange(int index, IEnumerable<SyntaxTrivia> trivia)
throw new ArgumentOutOfRangeException(nameof(index));
}
var items = trivia.ToList();
if (items.Count == 0)
if (trivia == null)
{
return this;
throw new ArgumentNullException(nameof(trivia));
}
var list = this.ToList();
list.InsertRange(index, items);
var builder = SyntaxTriviaListBuilder.Create();
var current = 0;
foreach (var thisTrivia in this)
{
if (current == index)
{
builder.AddRange(trivia);
}
builder.Add(thisTrivia);
current++;
}
if (list.Count == 0)
if (current == index)
{
return this;
builder.AddRange(trivia);
}
return new SyntaxTriviaList(default(SyntaxToken), list[0].UnderlyingNode.CreateList(list.Select(n => n.UnderlyingNode)), 0, 0);
return builder.ToList();
}
/// <summary>
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections;
using System.Collections.Generic;
namespace Microsoft.CodeAnalysis.Syntax
{
......@@ -42,6 +44,17 @@ public void Clear()
}
}
public void AddRange(IEnumerable<SyntaxTrivia> items)
{
if (items != null)
{
foreach (var item in items)
{
this.Add(item);
}
}
}
public SyntaxTriviaListBuilder Add(SyntaxTrivia item)
{
if (_nodes == null || _count >= _nodes.Length)
......
......@@ -15,10 +15,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
<Extension()>
Public Function ToSyntaxTriviaList(sequence As IEnumerable(Of SyntaxTrivia)) As SyntaxTriviaList
Return SyntaxFactory.TriviaList(sequence.Aggregate(New List(Of SyntaxTrivia), Function(list, trivia)
list.Add(trivia)
Return list
End Function))
Return SyntaxFactory.TriviaList(sequence)
End Function
<Extension()>
......
......@@ -825,14 +825,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
''' </summary>
''' <param name="trivias">A sequence of trivia.</param>
Public Shared Function TriviaList(trivias As IEnumerable(Of SyntaxTrivia)) As SyntaxTriviaList
If trivias IsNot Nothing Then
Dim builder = SyntaxTriviaListBuilder.Create()
For Each t In trivias
builder.Add(t)
Next
Return builder.ToList
End If
Return New SyntaxTriviaList()
Dim builder = SyntaxTriviaListBuilder.Create()
builder.AddRange(trivias)
Return builder.ToList()
End Function
''' <summary>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册