From 9c8b3adbf39c524cd4aa7a538bab256aa5d6405b Mon Sep 17 00:00:00 2001 From: Sam Harwell Date: Tue, 29 Jan 2019 12:39:01 -0600 Subject: [PATCH] Avoid making unnecessary copies --- .../Microsoft.CodeAnalysis.CodeStyle.csproj | 1 + .../Sessions/CurlyBraceCompletionSession.cs | 4 +- ...orFormattingService.PasteFormattingRule.cs | 2 +- .../Indentation/SmartTokenFormatter.cs | 8 ++-- .../Indentation/SpecialFormattingOperation.vb | 10 ++--- .../Utilities/LineAdjustmentFormattingRule.vb | 4 +- .../ChangeSignatureFormattingRule.cs | 4 +- ...SharpMethodExtractor.FormattingProvider.cs | 4 +- .../CSharpUseAutoPropertyCodeFixProvider.cs | 8 ++-- ...LineConditionalExpressionFormattingRule.cs | 2 +- ...AbstractAddMissingImportsFeatureService.cs | 2 +- .../FormatLargeBinaryExpressionRule.cs | 2 +- ...eService.AbstractMetadataFormattingRule.cs | 2 +- .../ChangeSignatureFormattingRule.vb | 4 +- .../VisualBasicMethodExtractor.vb | 4 +- ...LineConditionalExpressionFormattingRule.vb | 4 +- .../Impl/CodeModel/EndRegionFormattingRule.cs | 2 +- ...lankLineInGeneratedMethodFormattingRule.cs | 2 +- ...ContainedDocumentPreserveFormattingRule.cs | 8 ++-- .../Formatting/DefaultOperationProvider.cs | 4 +- .../Rules/ElasticTriviaFormattingRule.cs | 4 +- .../Rules/EndOfFileTokenFormattingRule.cs | 4 +- .../Rules/NewLineUserSettingFormattingRule.cs | 4 +- .../Rules/QueryExpressionFormattingRule.cs | 2 +- .../Formatting/Rules/SpacingFormattingRule.cs | 2 +- .../Rules/StructuredTriviaFormattingRule.cs | 4 +- .../Rules/TokenBasedFormattingRule.cs | 4 +- .../Engine/ChainedFormattingRules.cs | 6 +-- .../Formatting/Engine/OperationCache`1.cs | 3 +- .../Rules/AbstractFormattingRule.cs | 4 +- .../Rules/CompatAbstractFormattingRule.cs | 45 +++++++++++++++++++ .../Formatting/DefaultOperationProvider.vb | 6 +-- .../Rules/AdjustSpaceFormattingRule.vb | 2 +- .../Formatting/Rules/BaseFormattingRule.vb | 2 +- .../Rules/ElasticTriviaFormattingRule.vb | 4 +- .../Rules/StructuredTriviaFormattingRule.vb | 4 +- 36 files changed, 113 insertions(+), 68 deletions(-) create mode 100644 src/Workspaces/Core/Portable/Formatting/Rules/CompatAbstractFormattingRule.cs diff --git a/src/CodeStyle/Core/Analyzers/Microsoft.CodeAnalysis.CodeStyle.csproj b/src/CodeStyle/Core/Analyzers/Microsoft.CodeAnalysis.CodeStyle.csproj index 548577a6549..14f9895ba92 100644 --- a/src/CodeStyle/Core/Analyzers/Microsoft.CodeAnalysis.CodeStyle.csproj +++ b/src/CodeStyle/Core/Analyzers/Microsoft.CodeAnalysis.CodeStyle.csproj @@ -98,6 +98,7 @@ + diff --git a/src/EditorFeatures/CSharp/AutomaticCompletion/Sessions/CurlyBraceCompletionSession.cs b/src/EditorFeatures/CSharp/AutomaticCompletion/Sessions/CurlyBraceCompletionSession.cs index bec5f2b16f5..20b50121678 100644 --- a/src/EditorFeatures/CSharp/AutomaticCompletion/Sessions/CurlyBraceCompletionSession.cs +++ b/src/EditorFeatures/CSharp/AutomaticCompletion/Sessions/CurlyBraceCompletionSession.cs @@ -197,7 +197,7 @@ private class BraceCompletionFormattingRule : BaseFormattingRule public static readonly AbstractFormattingRule Instance = new BraceCompletionFormattingRule(); - public override AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, ref NextOperation nextOperation) + public override AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, in NextOperation nextOperation) { // Eg Cases - // new MyObject { @@ -221,7 +221,7 @@ public override AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken p } } - return base.GetAdjustNewLinesOperation(previousToken, currentToken, optionSet, ref nextOperation); + return base.GetAdjustNewLinesOperation(previousToken, currentToken, optionSet, in nextOperation); } public override void AddAlignTokensOperations(List list, SyntaxNode node, OptionSet optionSet, NextAction nextOperation) diff --git a/src/EditorFeatures/CSharp/Formatting/CSharpEditorFormattingService.PasteFormattingRule.cs b/src/EditorFeatures/CSharp/Formatting/CSharpEditorFormattingService.PasteFormattingRule.cs index d8622a6d3f8..2c28773dd93 100644 --- a/src/EditorFeatures/CSharp/Formatting/CSharpEditorFormattingService.PasteFormattingRule.cs +++ b/src/EditorFeatures/CSharp/Formatting/CSharpEditorFormattingService.PasteFormattingRule.cs @@ -10,7 +10,7 @@ internal partial class CSharpEditorFormattingService : IEditorFormattingService { internal class PasteFormattingRule : AbstractFormattingRule { - public override AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, ref NextOperation nextOperation) + public override AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, in NextOperation nextOperation) { if (currentToken.Parent != null) { diff --git a/src/EditorFeatures/CSharp/Formatting/Indentation/SmartTokenFormatter.cs b/src/EditorFeatures/CSharp/Formatting/Indentation/SmartTokenFormatter.cs index f9fff2da8b1..d4fd09666b7 100644 --- a/src/EditorFeatures/CSharp/Formatting/Indentation/SmartTokenFormatter.cs +++ b/src/EditorFeatures/CSharp/Formatting/Indentation/SmartTokenFormatter.cs @@ -118,10 +118,10 @@ private bool CloseBraceOfTryOrDoBlock(SyntaxToken endToken) private class NoLineChangeFormattingRule : AbstractFormattingRule { - public override AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, ref NextOperation nextOperation) + public override AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, in NextOperation nextOperation) { // no line operation. no line changes what so ever - var lineOperation = base.GetAdjustNewLinesOperation(previousToken, currentToken, optionSet, ref nextOperation); + var lineOperation = base.GetAdjustNewLinesOperation(previousToken, currentToken, optionSet, in nextOperation); if (lineOperation != null) { // ignore force if same line option @@ -146,9 +146,9 @@ public override void AddSuppressOperations(List list, SyntaxN // don't suppress anything } - public override AdjustSpacesOperation GetAdjustSpacesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, ref NextOperation nextOperation) + public override AdjustSpacesOperation GetAdjustSpacesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, in NextOperation nextOperation) { - var spaceOperation = base.GetAdjustSpacesOperation(previousToken, currentToken, optionSet, ref nextOperation); + var spaceOperation = base.GetAdjustSpacesOperation(previousToken, currentToken, optionSet, in nextOperation); // if there is force space operation, convert it to ForceSpaceIfSingleLine operation. // (force space basically means remove all line breaks) diff --git a/src/EditorFeatures/VisualBasic/Formatting/Indentation/SpecialFormattingOperation.vb b/src/EditorFeatures/VisualBasic/Formatting/Indentation/SpecialFormattingOperation.vb index 5851aa51fd0..1066347707d 100644 --- a/src/EditorFeatures/VisualBasic/Formatting/Indentation/SpecialFormattingOperation.vb +++ b/src/EditorFeatures/VisualBasic/Formatting/Indentation/SpecialFormattingOperation.vb @@ -10,7 +10,7 @@ Imports Microsoft.CodeAnalysis.VisualBasic.Syntax Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.Formatting.Indentation Friend Class SpecialFormattingRule - Inherits AbstractFormattingRule + Inherits CompatAbstractFormattingRule Public Sub New() End Sub @@ -19,7 +19,7 @@ Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.Formatting.Indentation ' don't suppress anything End Sub - Public Overrides Function GetAdjustNewLinesOperation(previousToken As SyntaxToken, currentToken As SyntaxToken, optionSet As OptionSet, ByRef nextOperation As NextOperation(Of AdjustNewLinesOperation)) As AdjustNewLinesOperation + Public Overrides Function GetAdjustNewLinesOperationSlow(previousToken As SyntaxToken, currentToken As SyntaxToken, optionSet As OptionSet, ByRef nextOperation As NextOperation(Of AdjustNewLinesOperation)) As AdjustNewLinesOperation ' unlike regular one. force position of attribute Dim attributeNode = TryCast(previousToken.Parent, AttributeListSyntax) @@ -28,7 +28,7 @@ Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.Formatting.Indentation End If ' no line operation. no line changes what so ever - Dim lineOperation = MyBase.GetAdjustNewLinesOperation(previousToken, currentToken, optionSet, nextOperation) + Dim lineOperation = MyBase.GetAdjustNewLinesOperationSlow(previousToken, currentToken, optionSet, nextOperation) If lineOperation IsNot Nothing Then ' basically means don't ever put new line if there isn't already one, but do ' indentation. @@ -38,8 +38,8 @@ Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.Formatting.Indentation Return Nothing End Function - Public Overrides Function GetAdjustSpacesOperation(previousToken As SyntaxToken, currentToken As SyntaxToken, optionSet As OptionSet, ByRef nextOperation As NextOperation(Of AdjustSpacesOperation)) As AdjustSpacesOperation - Dim spaceOperation = MyBase.GetAdjustSpacesOperation(previousToken, currentToken, optionSet, nextOperation) + Public Overrides Function GetAdjustSpacesOperationSlow(previousToken As SyntaxToken, currentToken As SyntaxToken, optionSet As OptionSet, ByRef nextOperation As NextOperation(Of AdjustSpacesOperation)) As AdjustSpacesOperation + Dim spaceOperation = MyBase.GetAdjustSpacesOperationSlow(previousToken, currentToken, optionSet, nextOperation) ' if there is force space operation, convert it to ForceSpaceIfSingleLine operation. ' (force space basically means remove all line breaks) diff --git a/src/EditorFeatures/VisualBasic/Utilities/LineAdjustmentFormattingRule.vb b/src/EditorFeatures/VisualBasic/Utilities/LineAdjustmentFormattingRule.vb index df71271b585..2d9a5aecc60 100644 --- a/src/EditorFeatures/VisualBasic/Utilities/LineAdjustmentFormattingRule.vb +++ b/src/EditorFeatures/VisualBasic/Utilities/LineAdjustmentFormattingRule.vb @@ -8,14 +8,14 @@ Imports Microsoft.CodeAnalysis.VisualBasic.Syntax Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.Utilities Friend NotInheritable Class LineAdjustmentFormattingRule - Inherits AbstractFormattingRule + Inherits CompatAbstractFormattingRule Public Shared ReadOnly Instance As New LineAdjustmentFormattingRule() Private Sub New() End Sub - Public Overrides Function GetAdjustNewLinesOperation(previousToken As SyntaxToken, currentToken As SyntaxToken, optionSet As OptionSet, ByRef nextOperation As NextOperation(Of AdjustNewLinesOperation)) As AdjustNewLinesOperation + Public Overrides Function GetAdjustNewLinesOperationSlow(previousToken As SyntaxToken, currentToken As SyntaxToken, optionSet As OptionSet, ByRef nextOperation As NextOperation(Of AdjustNewLinesOperation)) As AdjustNewLinesOperation If Not CommonFormattingHelpers.HasAnyWhitespaceElasticTrivia(previousToken, currentToken) Then Return nextOperation.Invoke() End If diff --git a/src/Features/CSharp/Portable/ChangeSignature/ChangeSignatureFormattingRule.cs b/src/Features/CSharp/Portable/ChangeSignature/ChangeSignatureFormattingRule.cs index 92bc6bd609f..65846184be5 100644 --- a/src/Features/CSharp/Portable/ChangeSignature/ChangeSignatureFormattingRule.cs +++ b/src/Features/CSharp/Portable/ChangeSignature/ChangeSignatureFormattingRule.cs @@ -44,14 +44,14 @@ private void AddChangeSignatureIndentOperation(List list, } } - public override AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, ref NextOperation nextOperation) + public override AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, in NextOperation nextOperation) { if (previousToken.Kind() == SyntaxKind.CommaToken && s_allowableKinds.Contains(previousToken.Parent.Kind())) { return FormattingOperations.CreateAdjustNewLinesOperation(0, AdjustNewLinesOption.PreserveLines); } - return base.GetAdjustNewLinesOperation(previousToken, currentToken, optionSet, ref nextOperation); + return base.GetAdjustNewLinesOperation(previousToken, currentToken, optionSet, in nextOperation); } } } diff --git a/src/Features/CSharp/Portable/ExtractMethod/CSharpMethodExtractor.FormattingProvider.cs b/src/Features/CSharp/Portable/ExtractMethod/CSharpMethodExtractor.FormattingProvider.cs index c4ab832c643..fc71462f959 100644 --- a/src/Features/CSharp/Portable/ExtractMethod/CSharpMethodExtractor.FormattingProvider.cs +++ b/src/Features/CSharp/Portable/ExtractMethod/CSharpMethodExtractor.FormattingProvider.cs @@ -15,10 +15,10 @@ public FormattingRule() { } - public override AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, ref NextOperation nextOperation) + public override AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, in NextOperation nextOperation) { // for extract method case, for a hybrid case, don't force rule, but preserve user style - var operation = base.GetAdjustNewLinesOperation(previousToken, currentToken, optionSet, ref nextOperation); + var operation = base.GetAdjustNewLinesOperation(previousToken, currentToken, optionSet, in nextOperation); if (operation == null) { return null; diff --git a/src/Features/CSharp/Portable/UseAutoProperty/CSharpUseAutoPropertyCodeFixProvider.cs b/src/Features/CSharp/Portable/UseAutoProperty/CSharpUseAutoPropertyCodeFixProvider.cs index 4c838c6c6b8..a1c66b039a9 100644 --- a/src/Features/CSharp/Portable/UseAutoProperty/CSharpUseAutoPropertyCodeFixProvider.cs +++ b/src/Features/CSharp/Portable/UseAutoProperty/CSharpUseAutoPropertyCodeFixProvider.cs @@ -96,24 +96,24 @@ private bool ForceSingleSpace(SyntaxToken previousToken, SyntaxToken currentToke return false; } - public override AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, ref NextOperation nextOperation) + public override AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, in NextOperation nextOperation) { if (ForceSingleSpace(previousToken, currentToken)) { return null; } - return base.GetAdjustNewLinesOperation(previousToken, currentToken, optionSet, ref nextOperation); + return base.GetAdjustNewLinesOperation(previousToken, currentToken, optionSet, in nextOperation); } - public override AdjustSpacesOperation GetAdjustSpacesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, ref NextOperation nextOperation) + public override AdjustSpacesOperation GetAdjustSpacesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, in NextOperation nextOperation) { if (ForceSingleSpace(previousToken, currentToken)) { return new AdjustSpacesOperation(1, AdjustSpacesOption.ForceSpaces); } - return base.GetAdjustSpacesOperation(previousToken, currentToken, optionSet, ref nextOperation); + return base.GetAdjustSpacesOperation(previousToken, currentToken, optionSet, in nextOperation); } } diff --git a/src/Features/CSharp/Portable/UseConditionalExpression/MultiLineConditionalExpressionFormattingRule.cs b/src/Features/CSharp/Portable/UseConditionalExpression/MultiLineConditionalExpressionFormattingRule.cs index c39d2c4393a..c07dc16ff5e 100644 --- a/src/Features/CSharp/Portable/UseConditionalExpression/MultiLineConditionalExpressionFormattingRule.cs +++ b/src/Features/CSharp/Portable/UseConditionalExpression/MultiLineConditionalExpressionFormattingRule.cs @@ -40,7 +40,7 @@ private bool IsQuestionOrColonOfNewConditional(SyntaxToken token) } public override AdjustNewLinesOperation GetAdjustNewLinesOperation( - SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, ref NextOperation nextOperation) + SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, in NextOperation nextOperation) { if (IsQuestionOrColonOfNewConditional(currentToken)) { diff --git a/src/Features/Core/Portable/CodeRefactorings/AddMissingImports/AbstractAddMissingImportsFeatureService.cs b/src/Features/Core/Portable/CodeRefactorings/AddMissingImports/AbstractAddMissingImportsFeatureService.cs index c7ff91bfcd0..f931eb3cdd2 100644 --- a/src/Features/Core/Portable/CodeRefactorings/AddMissingImports/AbstractAddMissingImportsFeatureService.cs +++ b/src/Features/Core/Portable/CodeRefactorings/AddMissingImports/AbstractAddMissingImportsFeatureService.cs @@ -243,7 +243,7 @@ public CleanUpNewLinesFormatter(SourceText text) _text = text; } - public override AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, ref NextOperation nextOperation) + public override AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, in NextOperation nextOperation) { // Since we know the general shape of these new import statements, we simply look for where // tokens are not on the same line and force them to only be separated by a single newline. diff --git a/src/Features/Core/Portable/GenerateEqualsAndGetHashCodeFromMembers/FormatLargeBinaryExpressionRule.cs b/src/Features/Core/Portable/GenerateEqualsAndGetHashCodeFromMembers/FormatLargeBinaryExpressionRule.cs index 4115baeedb8..706837d1eee 100644 --- a/src/Features/Core/Portable/GenerateEqualsAndGetHashCodeFromMembers/FormatLargeBinaryExpressionRule.cs +++ b/src/Features/Core/Portable/GenerateEqualsAndGetHashCodeFromMembers/FormatLargeBinaryExpressionRule.cs @@ -27,7 +27,7 @@ public FormatLargeBinaryExpressionRule(ISyntaxFactsService syntaxFacts) /// Wrap the large && expression after every && token. /// public override AdjustNewLinesOperation GetAdjustNewLinesOperation( - SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, ref NextOperation nextOperation) + SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, in NextOperation nextOperation) { if (_syntaxFacts.IsLogicalAndExpression(previousToken.Parent)) { diff --git a/src/Features/Core/Portable/MetadataAsSource/AbstractMetadataAsSourceService.AbstractMetadataFormattingRule.cs b/src/Features/Core/Portable/MetadataAsSource/AbstractMetadataAsSourceService.AbstractMetadataFormattingRule.cs index b5a79f4995e..1a73a556867 100644 --- a/src/Features/Core/Portable/MetadataAsSource/AbstractMetadataAsSourceService.AbstractMetadataFormattingRule.cs +++ b/src/Features/Core/Portable/MetadataAsSource/AbstractMetadataAsSourceService.AbstractMetadataFormattingRule.cs @@ -16,7 +16,7 @@ protected abstract class AbstractMetadataFormattingRule : AbstractFormattingRule protected abstract bool IsNewLine(char c); public override AdjustNewLinesOperation GetAdjustNewLinesOperation( - SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, ref NextOperation nextOperation) + SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, in NextOperation nextOperation) { if (previousToken.RawKind == 0 || currentToken.RawKind == 0) { diff --git a/src/Features/VisualBasic/Portable/ChangeSignature/ChangeSignatureFormattingRule.vb b/src/Features/VisualBasic/Portable/ChangeSignature/ChangeSignatureFormattingRule.vb index a75b3c95d0a..77f854e77bb 100644 --- a/src/Features/VisualBasic/Portable/ChangeSignature/ChangeSignatureFormattingRule.vb +++ b/src/Features/VisualBasic/Portable/ChangeSignature/ChangeSignatureFormattingRule.vb @@ -32,13 +32,13 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.ChangeSignature End If End Sub - Public Overrides Function GetAdjustNewLinesOperation(previousToken As SyntaxToken, currentToken As SyntaxToken, optionSet As OptionSet, ByRef nextOperation As NextOperation(Of AdjustNewLinesOperation)) As AdjustNewLinesOperation + Public Overrides Function GetAdjustNewLinesOperationSlow(previousToken As SyntaxToken, currentToken As SyntaxToken, optionSet As OptionSet, ByRef nextOperation As NextOperation(Of AdjustNewLinesOperation)) As AdjustNewLinesOperation If previousToken.IsKind(SyntaxKind.CommaToken) AndAlso (previousToken.Parent.IsKind(SyntaxKind.ParameterList) OrElse previousToken.Parent.IsKind(SyntaxKind.ArgumentList)) Then Return FormattingOperations.CreateAdjustNewLinesOperation(0, AdjustNewLinesOption.PreserveLines) End If - Return MyBase.GetAdjustNewLinesOperation(previousToken, currentToken, optionSet, nextOperation) + Return MyBase.GetAdjustNewLinesOperationSlow(previousToken, currentToken, optionSet, nextOperation) End Function End Class End Namespace diff --git a/src/Features/VisualBasic/Portable/ExtractMethod/VisualBasicMethodExtractor.vb b/src/Features/VisualBasic/Portable/ExtractMethod/VisualBasicMethodExtractor.vb index 587335ddff6..e1766e8805a 100644 --- a/src/Features/VisualBasic/Portable/ExtractMethod/VisualBasicMethodExtractor.vb +++ b/src/Features/VisualBasic/Portable/ExtractMethod/VisualBasicMethodExtractor.vb @@ -113,9 +113,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.ExtractMethod End Function Private Class FormattingRule - Inherits AbstractFormattingRule + Inherits CompatAbstractFormattingRule - Public Overrides Function GetAdjustNewLinesOperation(previousToken As SyntaxToken, currentToken As SyntaxToken, optionSet As OptionSet, ByRef nextOperation As NextOperation(Of AdjustNewLinesOperation)) As AdjustNewLinesOperation + Public Overrides Function GetAdjustNewLinesOperationSlow(previousToken As SyntaxToken, currentToken As SyntaxToken, optionSet As OptionSet, ByRef nextOperation As NextOperation(Of AdjustNewLinesOperation)) As AdjustNewLinesOperation If Not previousToken.IsLastTokenOfStatement() Then Return nextOperation.Invoke() End If diff --git a/src/Features/VisualBasic/Portable/UseConditionalExpression/MultiLineConditionalExpressionFormattingRule.vb b/src/Features/VisualBasic/Portable/UseConditionalExpression/MultiLineConditionalExpressionFormattingRule.vb index 4e3e49afb7c..27f1369c4f7 100644 --- a/src/Features/VisualBasic/Portable/UseConditionalExpression/MultiLineConditionalExpressionFormattingRule.vb +++ b/src/Features/VisualBasic/Portable/UseConditionalExpression/MultiLineConditionalExpressionFormattingRule.vb @@ -20,7 +20,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.UseConditionalExpression ''' i.e. both branches will be on a newline, indented once from the parent indentation. ''' Friend Class MultiLineConditionalExpressionFormattingRule - Inherits AbstractFormattingRule + Inherits CompatAbstractFormattingRule Public Shared ReadOnly Instance As New MultiLineConditionalExpressionFormattingRule() @@ -36,7 +36,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.UseConditionalExpression Return False End Function - Public Overrides Function GetAdjustNewLinesOperation( + Public Overrides Function GetAdjustNewLinesOperationSlow( previousToken As SyntaxToken, currentToken As SyntaxToken, optionSet As OptionSet, ByRef nextOperation As NextOperation(Of AdjustNewLinesOperation)) As AdjustNewLinesOperation If IsCommaOfNewConditional(previousToken) Then ' We want to force the expressions after the commas to be put on the diff --git a/src/VisualStudio/CSharp/Impl/CodeModel/EndRegionFormattingRule.cs b/src/VisualStudio/CSharp/Impl/CodeModel/EndRegionFormattingRule.cs index 2a25e32ae33..3dde1a53812 100644 --- a/src/VisualStudio/CSharp/Impl/CodeModel/EndRegionFormattingRule.cs +++ b/src/VisualStudio/CSharp/Impl/CodeModel/EndRegionFormattingRule.cs @@ -26,7 +26,7 @@ private bool IsAfterEndRegionBeforeMethodDeclaration(SyntaxToken previousToken, return false; } - public override AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, ref NextOperation nextOperation) + public override AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, in NextOperation nextOperation) { if (IsAfterEndRegionBeforeMethodDeclaration(previousToken, currentToken)) { diff --git a/src/VisualStudio/CSharp/Impl/Utilities/BlankLineInGeneratedMethodFormattingRule.cs b/src/VisualStudio/CSharp/Impl/Utilities/BlankLineInGeneratedMethodFormattingRule.cs index 68df3dd1856..4b4939805c7 100644 --- a/src/VisualStudio/CSharp/Impl/Utilities/BlankLineInGeneratedMethodFormattingRule.cs +++ b/src/VisualStudio/CSharp/Impl/Utilities/BlankLineInGeneratedMethodFormattingRule.cs @@ -15,7 +15,7 @@ private BlankLineInGeneratedMethodFormattingRule() { } - public override AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, ref NextOperation nextOperation) + public override AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, in NextOperation nextOperation) { // case: insert blank line in empty method body. if (previousToken.Kind() == SyntaxKind.OpenBraceToken && diff --git a/src/VisualStudio/Core/Def/Implementation/Venus/ContainedDocumentPreserveFormattingRule.cs b/src/VisualStudio/Core/Def/Implementation/Venus/ContainedDocumentPreserveFormattingRule.cs index f2cf633c9d8..8d257e3bfb6 100644 --- a/src/VisualStudio/Core/Def/Implementation/Venus/ContainedDocumentPreserveFormattingRule.cs +++ b/src/VisualStudio/Core/Def/Implementation/Venus/ContainedDocumentPreserveFormattingRule.cs @@ -13,9 +13,9 @@ internal class ContainedDocumentPreserveFormattingRule : AbstractFormattingRule private static readonly AdjustSpacesOperation s_preserveSpace = FormattingOperations.CreateAdjustSpacesOperation(0, AdjustSpacesOption.PreserveSpaces); private static readonly AdjustNewLinesOperation s_preserveLine = FormattingOperations.CreateAdjustNewLinesOperation(0, AdjustNewLinesOption.PreserveLines); - public override AdjustSpacesOperation GetAdjustSpacesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, ref NextOperation nextOperation) + public override AdjustSpacesOperation GetAdjustSpacesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, in NextOperation nextOperation) { - var operation = base.GetAdjustSpacesOperation(previousToken, currentToken, optionSet, ref nextOperation); + var operation = base.GetAdjustSpacesOperation(previousToken, currentToken, optionSet, in nextOperation); if (operation != null) { return s_preserveSpace; @@ -24,9 +24,9 @@ public override AdjustSpacesOperation GetAdjustSpacesOperation(SyntaxToken previ return operation; } - public override AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, ref NextOperation nextOperation) + public override AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, in NextOperation nextOperation) { - var operation = base.GetAdjustNewLinesOperation(previousToken, currentToken, optionSet, ref nextOperation); + var operation = base.GetAdjustNewLinesOperation(previousToken, currentToken, optionSet, in nextOperation); if (operation != null) { return s_preserveLine; diff --git a/src/Workspaces/CSharp/Portable/Formatting/DefaultOperationProvider.cs b/src/Workspaces/CSharp/Portable/Formatting/DefaultOperationProvider.cs index ea6a055bd42..ff56e00d4b9 100644 --- a/src/Workspaces/CSharp/Portable/Formatting/DefaultOperationProvider.cs +++ b/src/Workspaces/CSharp/Portable/Formatting/DefaultOperationProvider.cs @@ -34,13 +34,13 @@ public override void AddAlignTokensOperations(List list, S { } - public override AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, ref NextOperation nextOperation) + public override AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, in NextOperation nextOperation) { return null; } // return 1 space for every token pairs as a default operation - public override AdjustSpacesOperation GetAdjustSpacesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, ref NextOperation nextOperation) + public override AdjustSpacesOperation GetAdjustSpacesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, in NextOperation nextOperation) { int space = currentToken.Kind() == SyntaxKind.EndOfFileToken ? 0 : 1; return FormattingOperations.CreateAdjustSpacesOperation(space, AdjustSpacesOption.DefaultSpacesIfOnSingleLine); diff --git a/src/Workspaces/CSharp/Portable/Formatting/Rules/ElasticTriviaFormattingRule.cs b/src/Workspaces/CSharp/Portable/Formatting/Rules/ElasticTriviaFormattingRule.cs index 462563d99f3..4ef65495e9e 100644 --- a/src/Workspaces/CSharp/Portable/Formatting/Rules/ElasticTriviaFormattingRule.cs +++ b/src/Workspaces/CSharp/Portable/Formatting/Rules/ElasticTriviaFormattingRule.cs @@ -96,7 +96,7 @@ private InitializerExpressionSyntax GetInitializerNode(SyntaxNode node) return null; } - public override AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, ref NextOperation nextOperation) + public override AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, in NextOperation nextOperation) { var operation = nextOperation.Invoke(); if (operation == null) @@ -218,7 +218,7 @@ private AdjustNewLinesOperation GetAdjustNewLinesOperationBetweenMembers(SyntaxT return FormattingOperations.CreateAdjustNewLinesOperation(2 /* +1 for member itself and +1 for a blank line*/, AdjustNewLinesOption.ForceLines); } - public override AdjustSpacesOperation GetAdjustSpacesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, ref NextOperation nextOperation) + public override AdjustSpacesOperation GetAdjustSpacesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, in NextOperation nextOperation) { var operation = nextOperation.Invoke(); if (operation == null) diff --git a/src/Workspaces/CSharp/Portable/Formatting/Rules/EndOfFileTokenFormattingRule.cs b/src/Workspaces/CSharp/Portable/Formatting/Rules/EndOfFileTokenFormattingRule.cs index 57472af96bd..ab7c389183a 100644 --- a/src/Workspaces/CSharp/Portable/Formatting/Rules/EndOfFileTokenFormattingRule.cs +++ b/src/Workspaces/CSharp/Portable/Formatting/Rules/EndOfFileTokenFormattingRule.cs @@ -9,7 +9,7 @@ internal class EndOfFileTokenFormattingRule : BaseFormattingRule { internal const string Name = "CSharp End Of File Token Formatting Rule"; - public override AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, ref NextOperation nextOperation) + public override AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, in NextOperation nextOperation) { // * case for C#, make sure we don't insert new line between * and tokens. @@ -21,7 +21,7 @@ public override AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken p return nextOperation.Invoke(); } - public override AdjustSpacesOperation GetAdjustSpacesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, ref NextOperation nextOperation) + public override AdjustSpacesOperation GetAdjustSpacesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, in NextOperation nextOperation) { // * nextOperation) + public override AdjustSpacesOperation GetAdjustSpacesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, in NextOperation nextOperation) { var operation = nextOperation.Invoke(); @@ -166,7 +166,7 @@ public override AdjustSpacesOperation GetAdjustSpacesOperation(SyntaxToken previ return operation; } - public override AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, ref NextOperation nextOperation) + public override AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, in NextOperation nextOperation) { var operation = nextOperation.Invoke(); diff --git a/src/Workspaces/CSharp/Portable/Formatting/Rules/QueryExpressionFormattingRule.cs b/src/Workspaces/CSharp/Portable/Formatting/Rules/QueryExpressionFormattingRule.cs index c5f51092b33..e10357d909b 100644 --- a/src/Workspaces/CSharp/Portable/Formatting/Rules/QueryExpressionFormattingRule.cs +++ b/src/Workspaces/CSharp/Portable/Formatting/Rules/QueryExpressionFormattingRule.cs @@ -105,7 +105,7 @@ public override void AddAnchorIndentationOperations(List nextOperation) + public override AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, in NextOperation nextOperation) { if (previousToken.IsNestedQueryExpression()) { diff --git a/src/Workspaces/CSharp/Portable/Formatting/Rules/SpacingFormattingRule.cs b/src/Workspaces/CSharp/Portable/Formatting/Rules/SpacingFormattingRule.cs index 6cf1090a63e..75f7b429a2b 100644 --- a/src/Workspaces/CSharp/Portable/Formatting/Rules/SpacingFormattingRule.cs +++ b/src/Workspaces/CSharp/Portable/Formatting/Rules/SpacingFormattingRule.cs @@ -11,7 +11,7 @@ namespace Microsoft.CodeAnalysis.CSharp.Formatting { internal class SpacingFormattingRule : BaseFormattingRule { - public override AdjustSpacesOperation GetAdjustSpacesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, ref NextOperation nextOperation) + public override AdjustSpacesOperation GetAdjustSpacesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, in NextOperation nextOperation) { if (optionSet == null) { diff --git a/src/Workspaces/CSharp/Portable/Formatting/Rules/StructuredTriviaFormattingRule.cs b/src/Workspaces/CSharp/Portable/Formatting/Rules/StructuredTriviaFormattingRule.cs index 2d867f0d41d..598604bf319 100644 --- a/src/Workspaces/CSharp/Portable/Formatting/Rules/StructuredTriviaFormattingRule.cs +++ b/src/Workspaces/CSharp/Portable/Formatting/Rules/StructuredTriviaFormattingRule.cs @@ -10,7 +10,7 @@ internal class StructuredTriviaFormattingRule : BaseFormattingRule { internal const string Name = "CSharp Structured Trivia Formatting Rule"; - public override AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, ref NextOperation nextOperation) + public override AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, in NextOperation nextOperation) { if (previousToken.Parent is StructuredTriviaSyntax || currentToken.Parent is StructuredTriviaSyntax) { @@ -20,7 +20,7 @@ public override AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken p return nextOperation.Invoke(); } - public override AdjustSpacesOperation GetAdjustSpacesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, ref NextOperation nextOperation) + public override AdjustSpacesOperation GetAdjustSpacesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, in NextOperation nextOperation) { if (previousToken.Parent is StructuredTriviaSyntax || currentToken.Parent is StructuredTriviaSyntax) { diff --git a/src/Workspaces/CSharp/Portable/Formatting/Rules/TokenBasedFormattingRule.cs b/src/Workspaces/CSharp/Portable/Formatting/Rules/TokenBasedFormattingRule.cs index c65c4fab81b..cfacabb1f23 100644 --- a/src/Workspaces/CSharp/Portable/Formatting/Rules/TokenBasedFormattingRule.cs +++ b/src/Workspaces/CSharp/Portable/Formatting/Rules/TokenBasedFormattingRule.cs @@ -12,7 +12,7 @@ internal class TokenBasedFormattingRule : BaseFormattingRule { internal const string Name = "CSharp Token Based Formatting Rule"; - public override AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, ref NextOperation nextOperation) + public override AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, in NextOperation nextOperation) { //////////////////////////////////////////////////// // brace related operations @@ -186,7 +186,7 @@ public override AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken p return nextOperation.Invoke(); } - public override AdjustSpacesOperation GetAdjustSpacesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, ref NextOperation nextOperation) + public override AdjustSpacesOperation GetAdjustSpacesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, in NextOperation nextOperation) { ////////////////////////////////////////////////////// // ";" related operations diff --git a/src/Workspaces/Core/Portable/Formatting/Engine/ChainedFormattingRules.cs b/src/Workspaces/Core/Portable/Formatting/Engine/ChainedFormattingRules.cs index 961fda2dab9..d0ef09b2f71 100644 --- a/src/Workspaces/Core/Portable/Formatting/Engine/ChainedFormattingRules.cs +++ b/src/Workspaces/Core/Portable/Formatting/Engine/ChainedFormattingRules.cs @@ -53,11 +53,11 @@ public ChainedFormattingRules(IEnumerable formattingRule this.AddContinuedOperations); _newLinesFuncCache = new OperationCache( - (int index, SyntaxToken token1, SyntaxToken token2, ref NextOperation next) => _formattingRules[index].GetAdjustNewLinesOperation(token1, token2, _optionSet, ref next), + (int index, SyntaxToken token1, SyntaxToken token2, in NextOperation next) => _formattingRules[index].GetAdjustNewLinesOperation(token1, token2, _optionSet, in next), this.GetContinuedOperations); _spaceFuncCache = new OperationCache( - (int index, SyntaxToken token1, SyntaxToken token2, ref NextOperation next) => _formattingRules[index].GetAdjustSpacesOperation(token1, token2, _optionSet, ref next), + (int index, SyntaxToken token1, SyntaxToken token2, in NextOperation next) => _formattingRules[index].GetAdjustSpacesOperation(token1, token2, _optionSet, in next), this.GetContinuedOperations); } @@ -118,7 +118,7 @@ private TResult GetContinuedOperations(int index, SyntaxToken token1, S { // Call the handler at the index, passing a continuation that will come back to here with index + 1 var continuation = new NextOperation(index + 1, token1, token2, funcCache); - return funcCache.NextOperation(index, token1, token2, ref continuation); + return funcCache.NextOperation(index, token1, token2, in continuation); } } } diff --git a/src/Workspaces/Core/Portable/Formatting/Engine/OperationCache`1.cs b/src/Workspaces/Core/Portable/Formatting/Engine/OperationCache`1.cs index 77639570bda..e3c9e43a133 100644 --- a/src/Workspaces/Core/Portable/Formatting/Engine/OperationCache`1.cs +++ b/src/Workspaces/Core/Portable/Formatting/Engine/OperationCache`1.cs @@ -1,6 +1,5 @@ // 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 Microsoft.CodeAnalysis.Formatting.Rules; namespace Microsoft.CodeAnalysis.Formatting @@ -10,7 +9,7 @@ namespace Microsoft.CodeAnalysis.Formatting /// internal readonly struct OperationCache { - public delegate TResult NextOperationFunc(int index, SyntaxToken token1, SyntaxToken token2, ref NextOperation next); + public delegate TResult NextOperationFunc(int index, SyntaxToken token1, SyntaxToken token2, in NextOperation next); public delegate TResult ContinuationFunc(int index, SyntaxToken token1, SyntaxToken token2, in OperationCache operationCache); public OperationCache( diff --git a/src/Workspaces/Core/Portable/Formatting/Rules/AbstractFormattingRule.cs b/src/Workspaces/Core/Portable/Formatting/Rules/AbstractFormattingRule.cs index 585d75ebe88..ad081227fc4 100644 --- a/src/Workspaces/Core/Portable/Formatting/Rules/AbstractFormattingRule.cs +++ b/src/Workspaces/Core/Portable/Formatting/Rules/AbstractFormattingRule.cs @@ -47,7 +47,7 @@ public virtual void AddAlignTokensOperations(List list, Sy /// /// returns AdjustNewLinesOperation between two tokens either by itself or by filtering/replacing a operation returned by NextOperation /// - public virtual AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, ref NextOperation nextOperation) + public virtual AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, in NextOperation nextOperation) { return nextOperation.Invoke(); } @@ -55,7 +55,7 @@ public virtual AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken pr /// /// returns AdjustSpacesOperation between two tokens either by itself or by filtering/replacing a operation returned by NextOperation /// - public virtual AdjustSpacesOperation GetAdjustSpacesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, ref NextOperation nextOperation) + public virtual AdjustSpacesOperation GetAdjustSpacesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, in NextOperation nextOperation) { return nextOperation.Invoke(); } diff --git a/src/Workspaces/Core/Portable/Formatting/Rules/CompatAbstractFormattingRule.cs b/src/Workspaces/Core/Portable/Formatting/Rules/CompatAbstractFormattingRule.cs new file mode 100644 index 00000000000..c630c0372ee --- /dev/null +++ b/src/Workspaces/Core/Portable/Formatting/Rules/CompatAbstractFormattingRule.cs @@ -0,0 +1,45 @@ +// 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.ComponentModel; +using Microsoft.CodeAnalysis.Options; + +namespace Microsoft.CodeAnalysis.Formatting.Rules +{ + internal abstract class CompatAbstractFormattingRule : AbstractFormattingRule + { +#pragma warning disable CS0809 // Obsolete member overrides non-obsolete member + [Obsolete("Do not call this method directly (it will Stack Overflow).", error: true)] + [EditorBrowsable(EditorBrowsableState.Never)] + public override sealed AdjustNewLinesOperation GetAdjustNewLinesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, in NextOperation nextOperation) + { + var nextOperationCopy = nextOperation; + return GetAdjustNewLinesOperationSlow(previousToken, currentToken, optionSet, ref nextOperationCopy); + } + + [Obsolete("Do not call this method directly (it will Stack Overflow).", error: true)] + [EditorBrowsable(EditorBrowsableState.Never)] + public override sealed AdjustSpacesOperation GetAdjustSpacesOperation(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, in NextOperation nextOperation) + { + var nextOperationCopy = nextOperation; + return GetAdjustSpacesOperationSlow(previousToken, currentToken, optionSet, ref nextOperationCopy); + } +#pragma warning restore CS0809 // Obsolete member overrides non-obsolete member + + /// + /// returns AdjustNewLinesOperation between two tokens either by itself or by filtering/replacing a operation returned by NextOperation + /// + public virtual AdjustNewLinesOperation GetAdjustNewLinesOperationSlow(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, ref NextOperation nextOperation) + { + return base.GetAdjustNewLinesOperation(previousToken, currentToken, optionSet, in nextOperation); + } + + /// + /// returns AdjustSpacesOperation between two tokens either by itself or by filtering/replacing a operation returned by NextOperation + /// + public virtual AdjustSpacesOperation GetAdjustSpacesOperationSlow(SyntaxToken previousToken, SyntaxToken currentToken, OptionSet optionSet, ref NextOperation nextOperation) + { + return base.GetAdjustSpacesOperation(previousToken, currentToken, optionSet, in nextOperation); + } + } +} diff --git a/src/Workspaces/VisualBasic/Portable/Formatting/DefaultOperationProvider.vb b/src/Workspaces/VisualBasic/Portable/Formatting/DefaultOperationProvider.vb index 4158fe5cd09..cd9163ef161 100644 --- a/src/Workspaces/VisualBasic/Portable/Formatting/DefaultOperationProvider.vb +++ b/src/Workspaces/VisualBasic/Portable/Formatting/DefaultOperationProvider.vb @@ -12,7 +12,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Formatting ' ' to reduce number of unnecessary heap allocations, most of them just return null. Friend NotInheritable Class DefaultOperationProvider - Inherits AbstractFormattingRule + Inherits CompatAbstractFormattingRule Public Shared ReadOnly Instance As New DefaultOperationProvider() @@ -31,7 +31,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Formatting Public Overrides Sub AddAlignTokensOperations(operations As List(Of AlignTokensOperation), node As SyntaxNode, optionSet As OptionSet, nextAction As NextAction(Of AlignTokensOperation)) End Sub - Public Overrides Function GetAdjustNewLinesOperation(previousToken As SyntaxToken, currentToken As SyntaxToken, optionSet As OptionSet, ByRef nextOperation As NextOperation(Of AdjustNewLinesOperation)) As AdjustNewLinesOperation + Public Overrides Function GetAdjustNewLinesOperationSlow(previousToken As SyntaxToken, currentToken As SyntaxToken, optionSet As OptionSet, ByRef nextOperation As NextOperation(Of AdjustNewLinesOperation)) As AdjustNewLinesOperation If previousToken.Parent Is Nothing Then Return Nothing End If @@ -149,7 +149,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Formatting End Function ' return 1 space for every token pairs as a default operation - Public Overrides Function GetAdjustSpacesOperation(previousToken As SyntaxToken, currentToken As SyntaxToken, optionSet As OptionSet, ByRef nextOperation As NextOperation(Of AdjustSpacesOperation)) As AdjustSpacesOperation + Public Overrides Function GetAdjustSpacesOperationSlow(previousToken As SyntaxToken, currentToken As SyntaxToken, optionSet As OptionSet, ByRef nextOperation As NextOperation(Of AdjustSpacesOperation)) As AdjustSpacesOperation If previousToken.Kind = SyntaxKind.ColonToken AndAlso TypeOf previousToken.Parent Is LabelStatementSyntax AndAlso currentToken.Kind <> SyntaxKind.EndOfFileToken Then diff --git a/src/Workspaces/VisualBasic/Portable/Formatting/Rules/AdjustSpaceFormattingRule.vb b/src/Workspaces/VisualBasic/Portable/Formatting/Rules/AdjustSpaceFormattingRule.vb index 03dab8abacc..7c568b40323 100644 --- a/src/Workspaces/VisualBasic/Portable/Formatting/Rules/AdjustSpaceFormattingRule.vb +++ b/src/Workspaces/VisualBasic/Portable/Formatting/Rules/AdjustSpaceFormattingRule.vb @@ -12,7 +12,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Formatting Public Sub New() End Sub - Public Overrides Function GetAdjustSpacesOperation(previousToken As SyntaxToken, currentToken As SyntaxToken, optionSet As OptionSet, ByRef nextFunc As NextOperation(Of AdjustSpacesOperation)) As AdjustSpacesOperation + Public Overrides Function GetAdjustSpacesOperationSlow(previousToken As SyntaxToken, currentToken As SyntaxToken, optionSet As OptionSet, ByRef nextFunc As NextOperation(Of AdjustSpacesOperation)) As AdjustSpacesOperation ' * If currentToken.Kind = SyntaxKind.EndOfFileToken Then Return CreateAdjustSpacesOperation(0, AdjustSpacesOption.ForceSpacesIfOnSingleLine) diff --git a/src/Workspaces/VisualBasic/Portable/Formatting/Rules/BaseFormattingRule.vb b/src/Workspaces/VisualBasic/Portable/Formatting/Rules/BaseFormattingRule.vb index f53d92e62c5..ca7f4d12b50 100644 --- a/src/Workspaces/VisualBasic/Portable/Formatting/Rules/BaseFormattingRule.vb +++ b/src/Workspaces/VisualBasic/Portable/Formatting/Rules/BaseFormattingRule.vb @@ -5,7 +5,7 @@ Imports Microsoft.CodeAnalysis.Text Namespace Microsoft.CodeAnalysis.VisualBasic.Formatting Friend Class BaseFormattingRule - Inherits AbstractFormattingRule + Inherits CompatAbstractFormattingRule Public Sub New() End Sub diff --git a/src/Workspaces/VisualBasic/Portable/Formatting/Rules/ElasticTriviaFormattingRule.vb b/src/Workspaces/VisualBasic/Portable/Formatting/Rules/ElasticTriviaFormattingRule.vb index 00939bdb54b..92020f6b948 100644 --- a/src/Workspaces/VisualBasic/Portable/Formatting/Rules/ElasticTriviaFormattingRule.vb +++ b/src/Workspaces/VisualBasic/Portable/Formatting/Rules/ElasticTriviaFormattingRule.vb @@ -84,7 +84,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Formatting End If End Sub - Public Overrides Function GetAdjustSpacesOperation(previousToken As SyntaxToken, currentToken As SyntaxToken, optionSet As OptionSet, ByRef nextOperation As Rules.NextOperation(Of AdjustSpacesOperation)) As AdjustSpacesOperation + Public Overrides Function GetAdjustSpacesOperationSlow(previousToken As SyntaxToken, currentToken As SyntaxToken, optionSet As OptionSet, ByRef nextOperation As Rules.NextOperation(Of AdjustSpacesOperation)) As AdjustSpacesOperation ' if it doesn't have elastic trivia, pass it through If Not CommonFormattingHelpers.HasAnyWhitespaceElasticTrivia(previousToken, currentToken) Then Return nextOperation.Invoke() @@ -120,7 +120,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Formatting Return operation End Function - Public Overrides Function GetAdjustNewLinesOperation( + Public Overrides Function GetAdjustNewLinesOperationSlow( previousToken As SyntaxToken, currentToken As SyntaxToken, optionSet As OptionSet, diff --git a/src/Workspaces/VisualBasic/Portable/Formatting/Rules/StructuredTriviaFormattingRule.vb b/src/Workspaces/VisualBasic/Portable/Formatting/Rules/StructuredTriviaFormattingRule.vb index b62dfcd2e06..c839a88abe8 100644 --- a/src/Workspaces/VisualBasic/Portable/Formatting/Rules/StructuredTriviaFormattingRule.vb +++ b/src/Workspaces/VisualBasic/Portable/Formatting/Rules/StructuredTriviaFormattingRule.vb @@ -12,7 +12,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Formatting Public Sub New() End Sub - Public Overrides Function GetAdjustNewLinesOperation(previousToken As SyntaxToken, currentToken As SyntaxToken, optionSet As OptionSet, ByRef nextOperation As NextOperation(Of AdjustNewLinesOperation)) As AdjustNewLinesOperation + Public Overrides Function GetAdjustNewLinesOperationSlow(previousToken As SyntaxToken, currentToken As SyntaxToken, optionSet As OptionSet, ByRef nextOperation As NextOperation(Of AdjustNewLinesOperation)) As AdjustNewLinesOperation If UnderStructuredTrivia(previousToken, currentToken) Then Return Nothing End If @@ -21,7 +21,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Formatting End Function - Public Overrides Function GetAdjustSpacesOperation(previousToken As SyntaxToken, currentToken As SyntaxToken, optionSet As OptionSet, ByRef nextOperation As NextOperation(Of AdjustSpacesOperation)) As AdjustSpacesOperation + Public Overrides Function GetAdjustSpacesOperationSlow(previousToken As SyntaxToken, currentToken As SyntaxToken, optionSet As OptionSet, ByRef nextOperation As NextOperation(Of AdjustSpacesOperation)) As AdjustSpacesOperation If UnderStructuredTrivia(previousToken, currentToken) Then If previousToken.Kind = SyntaxKind.HashToken AndAlso SyntaxFacts.IsPreprocessorKeyword(CType(currentToken.Kind, SyntaxKind)) Then Return CreateAdjustSpacesOperation(space:=0, option:=AdjustSpacesOption.ForceSpacesIfOnSingleLine) -- GitLab