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

Avoid closure allocations in ApplyTriviaOperations

上级 da78b3ec
......@@ -11,6 +11,7 @@
<ItemGroup>
<PackageReference Include="Microsoft.VisualStudio.CodingConventions" Version="$(MicrosoftVisualStudioCodingConventionsVersion)" />
<PackageReference Include="Microsoft.CodeAnalysis.Common" Version="$(MicrosoftCodeAnalysisCommonFixedVersion)" />
<PackageReference Include="System.Threading.Tasks.Extensions" Version="$(SystemThreadingTasksExtensionsVersion)" />
</ItemGroup>
<ItemGroup>
<!--
......@@ -30,6 +31,7 @@
<Compile Include="..\..\..\Compilers\Core\Portable\InternalUtilities\ExceptionUtilities.cs" Link="InternalUtilities\ExceptionUtilities.cs" />
<Compile Include="..\..\..\Compilers\Core\Portable\InternalUtilities\IReadOnlySet.cs" Link="InternalUtilities\IReadOnlySet.cs" />
<Compile Include="..\..\..\Compilers\Core\Portable\InternalUtilities\KeyValuePairUtil.cs" Link="InternalUtilities\KeyValuePairUtil.cs" />
<Compile Include="..\..\..\Compilers\Core\Portable\InternalUtilities\PerformanceSensitiveAttribute.cs" Link="PerformanceSensitiveAttribute.cs" />
<Compile Include="..\..\..\Compilers\Core\Portable\InternalUtilities\SpecializedCollections.cs" Link="InternalUtilities\SpecializedCollections.cs" />
<Compile Include="..\..\..\Compilers\Core\Portable\InternalUtilities\SpecializedCollections.Empty.Collection.cs" Link="InternalUtilities\SpecializedCollections.Empty.Collection.cs" />
<Compile Include="..\..\..\Compilers\Core\Portable\InternalUtilities\SpecializedCollections.Empty.cs" Link="InternalUtilities\SpecializedCollections.Empty.cs" />
......
......@@ -100,7 +100,8 @@ private bool ShouldFormat(FormattingContext context)
public override void Format(
FormattingContext context,
ChainedFormattingRules formattingRules,
Action<int, TriviaData> formattingResultApplier,
Action<int, TokenStream, TriviaData> formattingResultApplier,
TokenStream tokenStream,
CancellationToken cancellationToken,
int tokenPairIndex = TokenPairIndexNotNeeded)
{
......@@ -109,7 +110,7 @@ private bool ShouldFormat(FormattingContext context)
return;
}
formattingResultApplier(tokenPairIndex, Format(context, formattingRules, this.LineBreaks, this.Spaces, cancellationToken));
formattingResultApplier(tokenPairIndex, tokenStream, Format(context, formattingRules, this.LineBreaks, this.Spaces, cancellationToken));
}
public override List<SyntaxTrivia> GetTriviaList(CancellationToken cancellationToken)
......
......@@ -78,7 +78,7 @@ public override TriviaData WithIndentation(int indentation, FormattingContext co
throw new NotImplementedException();
}
public override void Format(FormattingContext context, ChainedFormattingRules formattingRules, Action<int, TriviaData> formattingResultApplier, CancellationToken cancellationToken, int tokenPairIndex = TokenPairIndexNotNeeded)
public override void Format(FormattingContext context, ChainedFormattingRules formattingRules, Action<int, TokenStream, TriviaData> formattingResultApplier, TokenStream tokenStream, CancellationToken cancellationToken, int tokenPairIndex = TokenPairIndexNotNeeded)
{
throw new NotImplementedException();
}
......
......@@ -71,7 +71,8 @@ public override TriviaData WithSpace(int space, FormattingContext context, Chain
public override void Format(
FormattingContext context,
ChainedFormattingRules formattingRules,
Action<int, TriviaData> formattingResultApplier,
Action<int, TokenStream, TriviaData> formattingResultApplier,
TokenStream tokenStream,
CancellationToken cancellationToken,
int tokenPairIndex = TokenPairIndexNotNeeded)
{
......@@ -90,6 +91,7 @@ public override TriviaData WithSpace(int space, FormattingContext context, Chain
}
formattingResultApplier(tokenPairIndex,
tokenStream,
new FormattedComplexTrivia(
context,
formattingRules,
......
......@@ -252,15 +252,15 @@ private List<T> AddOperations<T>(List<SyntaxNode> nodes, Action<List<T>, SyntaxN
return;
}
void beginningOfTreeTriviaInfoApplier(int i, TriviaData info)
void beginningOfTreeTriviaInfoApplier(int i, TokenStream ts, TriviaData info)
{
tokenStream.ApplyBeginningOfTreeChange(info);
ts.ApplyBeginningOfTreeChange(info);
}
// remove all leading indentation
var triviaInfo = tokenStream.GetTriviaDataAtBeginningOfTree().WithIndentation(0, context, _formattingRules, cancellationToken);
triviaInfo.Format(context, _formattingRules, beginningOfTreeTriviaInfoApplier, cancellationToken);
triviaInfo.Format(context, _formattingRules, beginningOfTreeTriviaInfoApplier, tokenStream, cancellationToken);
}
private void ApplyEndOfTreeTriviaOperation(
......@@ -271,36 +271,41 @@ void beginningOfTreeTriviaInfoApplier(int i, TriviaData info)
return;
}
void endOfTreeTriviaInfoApplier(int i, TriviaData info)
void endOfTreeTriviaInfoApplier(int i, TokenStream ts, TriviaData info)
{
tokenStream.ApplyEndOfTreeChange(info);
ts.ApplyEndOfTreeChange(info);
}
// remove all trailing indentation
var triviaInfo = tokenStream.GetTriviaDataAtEndOfTree().WithIndentation(0, context, _formattingRules, cancellationToken);
triviaInfo.Format(context, _formattingRules, endOfTreeTriviaInfoApplier, cancellationToken);
triviaInfo.Format(context, _formattingRules, endOfTreeTriviaInfoApplier, tokenStream, cancellationToken);
}
[PerformanceSensitive("https://github.com/dotnet/roslyn/issues/30819", AllowCaptures = false)]
private void ApplyTriviaOperations(FormattingContext context, TokenStream tokenStream, CancellationToken cancellationToken)
{
// trivia formatting result appliers
void regularApplier(int tokenPairIndex, TriviaData info)
void regularApplier(int tokenPairIndex, TriviaData info, TokenStream ts)
{
tokenStream.ApplyChange(tokenPairIndex, info);
ts.ApplyChange(tokenPairIndex, info);
}
// trivia formatting applier
void triviaFormatter(int tokenPairIndex)
void triviaFormatter(int tokenPairIndex, FormattingContext ctx, ChainedFormattingRules formattingRules, TokenStream ts, CancellationToken ct)
{
var triviaInfo = tokenStream.GetTriviaData(tokenPairIndex);
triviaInfo.Format(context, _formattingRules, regularApplier, cancellationToken, tokenPairIndex);
var triviaInfo = ts.GetTriviaData(tokenPairIndex);
triviaInfo.Format(
ctx,
formattingRules,
(int tokenPairIndex1, TokenStream ts2, TriviaData info) => regularApplier(tokenPairIndex1, info, ts2),
ts,
ct,
tokenPairIndex);
}
for (var i = 0; i < tokenStream.TokenCount - 1; i++)
{
cancellationToken.ThrowIfCancellationRequested();
triviaFormatter(i);
triviaFormatter(i, context, _formattingRules, tokenStream, cancellationToken);
}
}
......
......@@ -69,7 +69,7 @@ public override TriviaData WithIndentation(int indentation, FormattingContext co
}
public override void Format(
FormattingContext context, ChainedFormattingRules formattingRules, Action<int, TriviaData> formattingResultApplier, CancellationToken cancellationToken, int tokenPairIndex = TokenPairIndexNotNeeded)
FormattingContext context, ChainedFormattingRules formattingRules, Action<int, TokenStream, TriviaData> formattingResultApplier, TokenStream tokenStream, CancellationToken cancellationToken, int tokenPairIndex = TokenPairIndexNotNeeded)
{
throw new NotImplementedException();
}
......
......@@ -77,11 +77,12 @@ public override TriviaData WithLine(int line, int indentation, FormattingContext
public override void Format(
FormattingContext context,
ChainedFormattingRules formattingRules,
Action<int, TriviaData> formattingResultApplier,
Action<int, TokenStream, TriviaData> formattingResultApplier,
TokenStream tokenStream,
CancellationToken cancellationToken,
int tokenPairIndex = TokenPairIndexNotNeeded)
{
formattingResultApplier(tokenPairIndex, new FormattedWhitespace(this.OptionSet, this.LineBreaks, this.Spaces, this.Language));
formattingResultApplier(tokenPairIndex, tokenStream, new FormattedWhitespace(this.OptionSet, this.LineBreaks, this.Spaces, this.Language));
}
}
}
......
......@@ -78,7 +78,8 @@ public override TriviaData WithLine(int line, int indentation, FormattingContext
public override void Format(
FormattingContext context,
ChainedFormattingRules formattingRules,
Action<int, TriviaData> formattingResultApplier,
Action<int, TokenStream, TriviaData> formattingResultApplier,
TokenStream tokenStream,
CancellationToken cancellationToken,
int tokenPairIndex = TokenPairIndexNotNeeded)
{
......
......@@ -49,7 +49,8 @@ protected TriviaData(OptionSet optionSet, string language)
public abstract void Format(
FormattingContext context,
ChainedFormattingRules formattingRules,
Action<int, TriviaData> formattingResultApplier,
Action<int, TokenStream, TriviaData> formattingResultApplier,
TokenStream tokenStream,
CancellationToken cancellationToken,
int tokenPairIndex = TokenPairIndexNotNeeded);
}
......
......@@ -57,11 +57,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Formatting
Public Overrides Sub Format(context As FormattingContext,
formattingRules As ChainedFormattingRules,
formattingResultApplier As Action(Of Integer, TriviaData),
formattingResultApplier As Action(Of Integer, TokenStream, TriviaData),
tokenStream As TokenStream,
cancellationToken As CancellationToken,
Optional tokenPairIndex As Integer = TokenPairIndexNotNeeded)
If Me.ContainsChanges Then
formattingResultApplier(tokenPairIndex, Me)
formattingResultApplier(tokenPairIndex, tokenStream, Me)
End If
End Sub
End Class
......
......@@ -90,14 +90,15 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Formatting
Public Overrides Sub Format(context As FormattingContext,
formattingRules As ChainedFormattingRules,
formattingResultApplier As Action(Of Integer, TriviaData),
formattingResultApplier As Action(Of Integer, TokenStream, TriviaData),
tokenStream As TokenStream,
cancellationToken As CancellationToken,
Optional tokenPairIndex As Integer = TokenPairIndexNotNeeded)
If Not ShouldFormat(context) Then
Return
End If
formattingResultApplier(tokenPairIndex, Format(context, formattingRules, Me.LineBreaks, Me.Spaces, cancellationToken))
formattingResultApplier(tokenPairIndex, tokenStream, Format(context, formattingRules, Me.LineBreaks, Me.Spaces, cancellationToken))
End Sub
Public Overrides Function GetTextChanges(span As TextSpan) As IEnumerable(Of TextChange)
......
......@@ -63,7 +63,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Formatting
Public Overrides Sub Format(context As FormattingContext,
formattingRules As ChainedFormattingRules,
formattingResultApplier As Action(Of Integer, TriviaData),
formattingResultApplier As Action(Of Integer, TokenStream, TriviaData),
tokenStream As TokenStream,
cancellationToken As CancellationToken,
Optional tokenPairIndex As Integer = TokenPairIndexNotNeeded)
Throw New NotImplementedException()
......
......@@ -69,7 +69,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Formatting
Public Overrides Sub Format(context As FormattingContext,
formattingRules As ChainedFormattingRules,
formattingResultApplier As Action(Of Integer, TriviaData),
formattingResultApplier As Action(Of Integer, TokenStream, TriviaData),
tokenStream As TokenStream,
cancellationToken As CancellationToken,
Optional tokenPairIndex As Integer = TokenPairIndexNotNeeded)
Contract.ThrowIfFalse(Me.SecondTokenIsFirstTokenOnLine)
......@@ -87,6 +88,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Formatting
formattingResultApplier(
tokenPairIndex,
tokenStream,
New FormattedComplexTrivia(context, formattingRules, Me._original.Token1, Me._original.Token2, Me.LineBreaks, Me.Spaces, Me._original.OriginalString, cancellationToken))
End Sub
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册