Skip to content

Commit 7d12b2f

Browse files
committed
Merge pull request #1493 from pdelvo/triviaListAllocations
Reduce trivia list allocations
2 parents 2926117 + e77fd22 commit 7d12b2f

4 files changed

Lines changed: 32 additions & 13 deletions

File tree

StyleCop.Analyzers/StyleCop.Analyzers/Helpers/TriviaHelper.cs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ internal static SyntaxTriviaList WithoutLeadingWhitespace(this SyntaxTriviaList
217217
/// <param name="trivia">The trivia to create the list from.</param>
218218
/// <param name="triviaIndex">The index of the trivia in the created trivia list.</param>
219219
/// <returns>The created trivia list.</returns>
220-
internal static IReadOnlyList<SyntaxTrivia> GetContainingTriviaList(SyntaxTrivia trivia, out int triviaIndex)
220+
internal static DualTriviaListHelper GetContainingTriviaList(SyntaxTrivia trivia, out int triviaIndex)
221221
{
222222
var token = trivia.Token;
223223
SyntaxTriviaList part1;
@@ -249,7 +249,7 @@ internal static IReadOnlyList<SyntaxTrivia> GetContainingTriviaList(SyntaxTrivia
249249
/// <param name="list1">The first part of the new list.</param>
250250
/// <param name="list2">The second part of the new list.</param>
251251
/// <returns>The merged trivia list.</returns>
252-
internal static IReadOnlyList<SyntaxTrivia> MergeTriviaLists(IReadOnlyList<SyntaxTrivia> list1, IReadOnlyList<SyntaxTrivia> list2)
252+
internal static DualTriviaListHelper MergeTriviaLists(SyntaxTriviaList list1, SyntaxTriviaList list2)
253253
{
254254
return new DualTriviaListHelper(list1, list2);
255255
}
@@ -403,13 +403,13 @@ private static int BinarySearch(SyntaxTriviaList leadingTrivia, SyntaxTrivia tri
403403
/// <summary>
404404
/// Helper class that merges two SyntaxTriviaLists with (hopefully) the lowest possible performance penalty.
405405
/// </summary>
406-
private class DualTriviaListHelper : IReadOnlyList<SyntaxTrivia>
406+
internal struct DualTriviaListHelper : IReadOnlyList<SyntaxTrivia>
407407
{
408-
private readonly IReadOnlyList<SyntaxTrivia> part1;
408+
private readonly SyntaxTriviaList part1;
409409
private readonly int part1Count;
410-
private readonly IReadOnlyList<SyntaxTrivia> part2;
410+
private readonly SyntaxTriviaList part2;
411411

412-
public DualTriviaListHelper(IReadOnlyList<SyntaxTrivia> part1, IReadOnlyList<SyntaxTrivia> part2)
412+
public DualTriviaListHelper(SyntaxTriviaList part1, SyntaxTriviaList part2)
413413
{
414414
this.part1 = part1;
415415
this.part2 = part2;
@@ -455,6 +455,16 @@ IEnumerator IEnumerable.GetEnumerator()
455455
{
456456
return this.GetEnumerator();
457457
}
458+
459+
public SyntaxTrivia First()
460+
{
461+
return this[0];
462+
}
463+
464+
public SyntaxTrivia Last()
465+
{
466+
return this[this.Count - 1];
467+
}
458468
}
459469
}
460470
}

StyleCop.Analyzers/StyleCop.Analyzers/LayoutRules/SA1509OpeningCurlyBracketsMustNotBePrecededByBlankLine.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ private static void AnalyzeSyntaxTree(SyntaxTreeAnalysisContext context)
9191
private static void AnalyzeOpenBrace(SyntaxTreeAnalysisContext context, SyntaxToken openBrace)
9292
{
9393
var prevToken = openBrace.GetPreviousToken();
94-
var triviaList = prevToken.IsKind(SyntaxKind.None) ? openBrace.LeadingTrivia : TriviaHelper.MergeTriviaLists(prevToken.TrailingTrivia, openBrace.LeadingTrivia);
94+
var triviaList = TriviaHelper.MergeTriviaLists(prevToken.TrailingTrivia, openBrace.LeadingTrivia);
9595

9696
var done = false;
9797
var eolCount = 0;

StyleCop.Analyzers/StyleCop.Analyzers/OrderingRules/SA1212SA1213CodeFixProvider.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,8 @@ private static AccessorDeclarationSyntax GetNewAccessor(AccessorListSyntax acces
9898
var newLeadingTrivia = GetLeadingTriviaWithoutLeadingBlankLines(secondAccessor);
9999
if (AccessorsAreOnTheSameLine(firstAccessor, secondAccessor))
100100
{
101-
var leadingWhitespace = firstAccessor.GetLeadingTrivia().Where(x => x.IsKind(SyntaxKind.WhitespaceTrivia)).ToList();
102-
newLeadingTrivia = SyntaxFactory.TriviaList(TriviaHelper.MergeTriviaLists(newLeadingTrivia, leadingWhitespace));
101+
var leadingWhitespace = firstAccessor.GetLeadingTrivia().Where(x => x.IsKind(SyntaxKind.WhitespaceTrivia));
102+
newLeadingTrivia = SyntaxFactory.TriviaList(TriviaHelper.MergeTriviaLists(newLeadingTrivia, SyntaxTriviaList.Empty.AddRange(leadingWhitespace)));
103103
}
104104

105105
var newAccessor = accessorList.Accessors[1]

StyleCop.Analyzers/StyleCop.Analyzers/ReadabilityRules/SA1108BlockStatementsMustNotContainEmbeddedComments.cs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -135,11 +135,20 @@ private static void AnalyzeBlock(SyntaxNodeAnalysisContext context)
135135

136136
private static void FindAllComments(SyntaxNodeAnalysisContext context, SyntaxToken previousToken, SyntaxToken openBraceToken)
137137
{
138-
var comments = previousToken.TrailingTrivia.Where(IsComment)
139-
.Concat(openBraceToken.LeadingTrivia.Where(IsComment));
140-
foreach (var comment in comments)
138+
foreach (var comment in previousToken.TrailingTrivia)
141139
{
142-
context.ReportDiagnostic(Diagnostic.Create(Descriptor, comment.GetLocation()));
140+
if (IsComment(comment))
141+
{
142+
context.ReportDiagnostic(Diagnostic.Create(Descriptor, comment.GetLocation()));
143+
}
144+
}
145+
146+
foreach (var comment in openBraceToken.LeadingTrivia)
147+
{
148+
if (IsComment(comment))
149+
{
150+
context.ReportDiagnostic(Diagnostic.Create(Descriptor, comment.GetLocation()));
151+
}
143152
}
144153
}
145154

0 commit comments

Comments
 (0)