Skip to content

Commit cd1d898

Browse files
committed
Merge pull request #1689 from sharwell/reduce-allocations
Reduce allocations in HandleCompilationStart
2 parents 49b706d + b008586 commit cd1d898

98 files changed

Lines changed: 571 additions & 334 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

StyleCop.Analyzers/StyleCop.Analyzers/MaintainabilityRules/SA1119StatementMustNotUseUnnecessaryParenthesis.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ internal class SA1119StatementMustNotUseUnnecessaryParenthesis : DiagnosticAnaly
6565
new DiagnosticDescriptor(ParenthesesDiagnosticId, Title, MessageFormat, AnalyzerCategory.MaintainabilityRules, DiagnosticSeverity.Hidden, AnalyzerConstants.EnabledByDefault, Description, HelpLink, customTags: new[] { WellKnownDiagnosticTags.Unnecessary, WellKnownDiagnosticTags.NotConfigurable });
6666

6767
private static readonly Action<CompilationStartAnalysisContext> CompilationStartAction = HandleCompilationStart;
68+
private static readonly Action<SyntaxNodeAnalysisContext> ParenthesizedExpressionAction = HandleParenthesizedExpression;
6869

6970
/// <inheritdoc/>
7071
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get; } =
@@ -85,7 +86,7 @@ private static void HandleCompilationStart(CompilationStartAnalysisContext conte
8586
// is disabled
8687
if (context.Compilation.Options.SpecificDiagnosticOptions.GetValueOrDefault(Descriptor.Id) != Microsoft.CodeAnalysis.ReportDiagnostic.Suppress)
8788
{
88-
context.RegisterSyntaxNodeActionHonorExclusions(HandleParenthesizedExpression, SyntaxKind.ParenthesizedExpression);
89+
context.RegisterSyntaxNodeActionHonorExclusions(ParenthesizedExpressionAction, SyntaxKind.ParenthesizedExpression);
8990
}
9091
}
9192

StyleCop.Analyzers/StyleCop.Analyzers/MaintainabilityRules/SA1400AccessModifierMustBeDeclared.cs

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,21 @@ internal class SA1400AccessModifierMustBeDeclared : DiagnosticAnalyzer
3636
private static readonly DiagnosticDescriptor Descriptor =
3737
new DiagnosticDescriptor(DiagnosticId, Title, MessageFormat, AnalyzerCategory.MaintainabilityRules, DiagnosticSeverity.Warning, AnalyzerConstants.EnabledByDefault, Description, HelpLink);
3838

39+
private static readonly ImmutableArray<SyntaxKind> BaseTypeDeclarationKinds =
40+
ImmutableArray.Create(SyntaxKind.ClassDeclaration, SyntaxKind.StructDeclaration, SyntaxKind.InterfaceDeclaration, SyntaxKind.EnumDeclaration);
41+
42+
private static readonly ImmutableArray<SyntaxKind> BaseFieldDeclarationKinds =
43+
ImmutableArray.Create(SyntaxKind.EventFieldDeclaration, SyntaxKind.FieldDeclaration);
44+
3945
private static readonly Action<CompilationStartAnalysisContext> CompilationStartAction = HandleCompilationStart;
46+
private static readonly Action<SyntaxNodeAnalysisContext> BaseTypeDeclarationAction = HandleBaseTypeDeclaration;
47+
private static readonly Action<SyntaxNodeAnalysisContext> DelegateDeclarationAction = HandleDelegateDeclaration;
48+
private static readonly Action<SyntaxNodeAnalysisContext> EventDeclarationAction = HandleEventDeclaration;
49+
private static readonly Action<SyntaxNodeAnalysisContext> MethodDeclarationAction = HandleMethodDeclaration;
50+
private static readonly Action<SyntaxNodeAnalysisContext> PropertyDeclarationAction = HandlePropertyDeclaration;
51+
private static readonly Action<SyntaxNodeAnalysisContext> BaseFieldDeclarationAction = HandleBaseFieldDeclaration;
52+
private static readonly Action<SyntaxNodeAnalysisContext> IndexerDeclarationAction = HandleIndexerDeclaration;
53+
private static readonly Action<SyntaxNodeAnalysisContext> ConstructorDeclarationAction = HandleConstructorDeclaration;
4054

4155
/// <inheritdoc/>
4256
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get; } =
@@ -50,33 +64,29 @@ public override void Initialize(AnalysisContext context)
5064

5165
private static void HandleCompilationStart(CompilationStartAnalysisContext context)
5266
{
53-
context.RegisterSyntaxNodeActionHonorExclusions(HandleBaseTypeDeclarationSyntax, SyntaxKind.ClassDeclaration);
54-
context.RegisterSyntaxNodeActionHonorExclusions(HandleBaseTypeDeclarationSyntax, SyntaxKind.InterfaceDeclaration);
55-
context.RegisterSyntaxNodeActionHonorExclusions(HandleBaseTypeDeclarationSyntax, SyntaxKind.EnumDeclaration);
56-
context.RegisterSyntaxNodeActionHonorExclusions(HandleBaseTypeDeclarationSyntax, SyntaxKind.StructDeclaration);
57-
context.RegisterSyntaxNodeActionHonorExclusions(HandleDelegateDeclarationSyntax, SyntaxKind.DelegateDeclaration);
58-
context.RegisterSyntaxNodeActionHonorExclusions(HandleEventDeclarationSyntax, SyntaxKind.EventDeclaration);
59-
context.RegisterSyntaxNodeActionHonorExclusions(HandleMethodDeclarationSyntax, SyntaxKind.MethodDeclaration);
60-
context.RegisterSyntaxNodeActionHonorExclusions(HandlePropertyDeclarationSyntax, SyntaxKind.PropertyDeclaration);
61-
context.RegisterSyntaxNodeActionHonorExclusions(HandleBaseFieldDeclarationSyntax, SyntaxKind.EventFieldDeclaration);
62-
context.RegisterSyntaxNodeActionHonorExclusions(HandleBaseFieldDeclarationSyntax, SyntaxKind.FieldDeclaration);
63-
context.RegisterSyntaxNodeActionHonorExclusions(HandleIndexerDeclarationSyntax, SyntaxKind.IndexerDeclaration);
64-
context.RegisterSyntaxNodeActionHonorExclusions(HandleConstructorDeclarationSyntax, SyntaxKind.ConstructorDeclaration);
67+
context.RegisterSyntaxNodeActionHonorExclusions(BaseTypeDeclarationAction, BaseTypeDeclarationKinds);
68+
context.RegisterSyntaxNodeActionHonorExclusions(DelegateDeclarationAction, SyntaxKind.DelegateDeclaration);
69+
context.RegisterSyntaxNodeActionHonorExclusions(EventDeclarationAction, SyntaxKind.EventDeclaration);
70+
context.RegisterSyntaxNodeActionHonorExclusions(MethodDeclarationAction, SyntaxKind.MethodDeclaration);
71+
context.RegisterSyntaxNodeActionHonorExclusions(PropertyDeclarationAction, SyntaxKind.PropertyDeclaration);
72+
context.RegisterSyntaxNodeActionHonorExclusions(BaseFieldDeclarationAction, BaseFieldDeclarationKinds);
73+
context.RegisterSyntaxNodeActionHonorExclusions(IndexerDeclarationAction, SyntaxKind.IndexerDeclaration);
74+
context.RegisterSyntaxNodeActionHonorExclusions(ConstructorDeclarationAction, SyntaxKind.ConstructorDeclaration);
6575
}
6676

67-
private static void HandleBaseTypeDeclarationSyntax(SyntaxNodeAnalysisContext context)
77+
private static void HandleBaseTypeDeclaration(SyntaxNodeAnalysisContext context)
6878
{
6979
var syntax = (BaseTypeDeclarationSyntax)context.Node;
7080
CheckAccessModifiers(context, syntax.Identifier, syntax.Modifiers);
7181
}
7282

73-
private static void HandleDelegateDeclarationSyntax(SyntaxNodeAnalysisContext context)
83+
private static void HandleDelegateDeclaration(SyntaxNodeAnalysisContext context)
7484
{
7585
var syntax = (DelegateDeclarationSyntax)context.Node;
7686
CheckAccessModifiers(context, syntax.Identifier, syntax.Modifiers);
7787
}
7888

79-
private static void HandleEventDeclarationSyntax(SyntaxNodeAnalysisContext context)
89+
private static void HandleEventDeclaration(SyntaxNodeAnalysisContext context)
8090
{
8191
var syntax = (EventDeclarationSyntax)context.Node;
8292
if (syntax.ExplicitInterfaceSpecifier != null)
@@ -92,7 +102,7 @@ private static void HandleEventDeclarationSyntax(SyntaxNodeAnalysisContext conte
92102
CheckAccessModifiers(context, syntax.Identifier, syntax.Modifiers);
93103
}
94104

95-
private static void HandleMethodDeclarationSyntax(SyntaxNodeAnalysisContext context)
105+
private static void HandleMethodDeclaration(SyntaxNodeAnalysisContext context)
96106
{
97107
var syntax = (MethodDeclarationSyntax)context.Node;
98108
if (syntax.ExplicitInterfaceSpecifier != null)
@@ -108,7 +118,7 @@ private static void HandleMethodDeclarationSyntax(SyntaxNodeAnalysisContext cont
108118
CheckAccessModifiers(context, syntax.Identifier, syntax.Modifiers);
109119
}
110120

111-
private static void HandlePropertyDeclarationSyntax(SyntaxNodeAnalysisContext context)
121+
private static void HandlePropertyDeclaration(SyntaxNodeAnalysisContext context)
112122
{
113123
var syntax = (PropertyDeclarationSyntax)context.Node;
114124
if (syntax.ExplicitInterfaceSpecifier != null)
@@ -124,7 +134,7 @@ private static void HandlePropertyDeclarationSyntax(SyntaxNodeAnalysisContext co
124134
CheckAccessModifiers(context, syntax.Identifier, syntax.Modifiers);
125135
}
126136

127-
private static void HandleBaseFieldDeclarationSyntax(SyntaxNodeAnalysisContext context)
137+
private static void HandleBaseFieldDeclaration(SyntaxNodeAnalysisContext context)
128138
{
129139
var syntax = (BaseFieldDeclarationSyntax)context.Node;
130140
if (syntax.Parent.IsKind(SyntaxKind.InterfaceDeclaration))
@@ -148,7 +158,7 @@ private static void HandleBaseFieldDeclarationSyntax(SyntaxNodeAnalysisContext c
148158
CheckAccessModifiers(context, declarator.Identifier, syntax.Modifiers, declarator);
149159
}
150160

151-
private static void HandleIndexerDeclarationSyntax(SyntaxNodeAnalysisContext context)
161+
private static void HandleIndexerDeclaration(SyntaxNodeAnalysisContext context)
152162
{
153163
var syntax = (IndexerDeclarationSyntax)context.Node;
154164
if (syntax.ExplicitInterfaceSpecifier != null)
@@ -164,7 +174,7 @@ private static void HandleIndexerDeclarationSyntax(SyntaxNodeAnalysisContext con
164174
CheckAccessModifiers(context, syntax.ThisKeyword, syntax.Modifiers);
165175
}
166176

167-
private static void HandleConstructorDeclarationSyntax(SyntaxNodeAnalysisContext context)
177+
private static void HandleConstructorDeclaration(SyntaxNodeAnalysisContext context)
168178
{
169179
var syntax = (ConstructorDeclarationSyntax)context.Node;
170180
CheckAccessModifiers(context, syntax.Identifier, syntax.Modifiers);

StyleCop.Analyzers/StyleCop.Analyzers/MaintainabilityRules/SA1402FileMayOnlyContainASingleClass.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ internal class SA1402FileMayOnlyContainASingleClass : DiagnosticAnalyzer
4040
new DiagnosticDescriptor(DiagnosticId, Title, MessageFormat, AnalyzerCategory.MaintainabilityRules, DiagnosticSeverity.Warning, AnalyzerConstants.EnabledByDefault, Description, HelpLink);
4141

4242
private static readonly Action<CompilationStartAnalysisContext> CompilationStartAction = HandleCompilationStart;
43+
private static readonly Action<SyntaxTreeAnalysisContext> SyntaxTreeAction = HandleSyntaxTree;
4344

4445
/// <inheritdoc/>
4546
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get; } =
@@ -53,7 +54,7 @@ public override void Initialize(AnalysisContext context)
5354

5455
private static void HandleCompilationStart(CompilationStartAnalysisContext context)
5556
{
56-
context.RegisterSyntaxTreeActionHonorExclusions(HandleSyntaxTree);
57+
context.RegisterSyntaxTreeActionHonorExclusions(SyntaxTreeAction);
5758
}
5859

5960
private static void HandleSyntaxTree(SyntaxTreeAnalysisContext context)

StyleCop.Analyzers/StyleCop.Analyzers/MaintainabilityRules/SA1403FileMayOnlyContainASingleNamespace.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ internal class SA1403FileMayOnlyContainASingleNamespace : DiagnosticAnalyzer
3333
new DiagnosticDescriptor(DiagnosticId, Title, MessageFormat, AnalyzerCategory.MaintainabilityRules, DiagnosticSeverity.Warning, AnalyzerConstants.EnabledByDefault, Description, HelpLink);
3434

3535
private static readonly Action<CompilationStartAnalysisContext> CompilationStartAction = HandleCompilationStart;
36+
private static readonly Action<SyntaxTreeAnalysisContext> SyntaxTreeAction = HandleSyntaxTree;
3637

3738
/// <inheritdoc/>
3839
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get; } =
@@ -46,7 +47,7 @@ public override void Initialize(AnalysisContext context)
4647

4748
private static void HandleCompilationStart(CompilationStartAnalysisContext context)
4849
{
49-
context.RegisterSyntaxTreeActionHonorExclusions(HandleSyntaxTree);
50+
context.RegisterSyntaxTreeActionHonorExclusions(SyntaxTreeAction);
5051
}
5152

5253
private static void HandleSyntaxTree(SyntaxTreeAnalysisContext context)

StyleCop.Analyzers/StyleCop.Analyzers/MaintainabilityRules/SA1405DebugAssertMustProvideMessageText.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ internal class SA1405DebugAssertMustProvideMessageText : SystemDiagnosticsDebugD
3838
new DiagnosticDescriptor(DiagnosticId, Title, MessageFormat, AnalyzerCategory.MaintainabilityRules, DiagnosticSeverity.Warning, AnalyzerConstants.EnabledByDefault, Description, HelpLink);
3939

4040
private static readonly Action<CompilationStartAnalysisContext> CompilationStartAction = HandleCompilationStart;
41+
private static readonly Action<SyntaxNodeAnalysisContext> InvocationExpressionAction = HandleInvocationExpression;
4142

4243
/// <inheritdoc/>
4344
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get; } =
@@ -51,10 +52,10 @@ public override void Initialize(AnalysisContext context)
5152

5253
private static void HandleCompilationStart(CompilationStartAnalysisContext context)
5354
{
54-
context.RegisterSyntaxNodeActionHonorExclusions(HandleMethodCall, SyntaxKind.InvocationExpression);
55+
context.RegisterSyntaxNodeActionHonorExclusions(InvocationExpressionAction, SyntaxKind.InvocationExpression);
5556
}
5657

57-
private static void HandleMethodCall(SyntaxNodeAnalysisContext context)
58+
private static void HandleInvocationExpression(SyntaxNodeAnalysisContext context)
5859
{
5960
HandleMethodCall(context, nameof(Debug.Assert), 1, Descriptor);
6061
}

StyleCop.Analyzers/StyleCop.Analyzers/MaintainabilityRules/SA1406DebugFailMustProvideMessageText.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ internal class SA1406DebugFailMustProvideMessageText : SystemDiagnosticsDebugDia
3838
new DiagnosticDescriptor(DiagnosticId, Title, MessageFormat, AnalyzerCategory.MaintainabilityRules, DiagnosticSeverity.Warning, AnalyzerConstants.EnabledByDefault, Description, HelpLink);
3939

4040
private static readonly Action<CompilationStartAnalysisContext> CompilationStartAction = HandleCompilationStart;
41+
private static readonly Action<SyntaxNodeAnalysisContext> InvocationExpressionAction = HandleInvocationExpression;
4142

4243
/// <inheritdoc/>
4344
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get; } =
@@ -51,10 +52,10 @@ public override void Initialize(AnalysisContext context)
5152

5253
private static void HandleCompilationStart(CompilationStartAnalysisContext context)
5354
{
54-
context.RegisterSyntaxNodeActionHonorExclusions(HandleMethodCall, SyntaxKind.InvocationExpression);
55+
context.RegisterSyntaxNodeActionHonorExclusions(InvocationExpressionAction, SyntaxKind.InvocationExpression);
5556
}
5657

57-
private static void HandleMethodCall(SyntaxNodeAnalysisContext context)
58+
private static void HandleInvocationExpression(SyntaxNodeAnalysisContext context)
5859
{
5960
// Debug.Fail is not available in a portable library. So no nameof(Debug.Fail) here
6061
HandleMethodCall(context, "Fail", 0, Descriptor);

StyleCop.Analyzers/StyleCop.Analyzers/MaintainabilityRules/SA1407ArithmeticExpressionsMustDeclarePrecedence.cs

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,18 @@ internal class SA1407ArithmeticExpressionsMustDeclarePrecedence : DiagnosticAnal
5454
private static readonly DiagnosticDescriptor Descriptor =
5555
new DiagnosticDescriptor(DiagnosticId, Title, MessageFormat, AnalyzerCategory.MaintainabilityRules, DiagnosticSeverity.Warning, AnalyzerConstants.EnabledByDefault, Description, HelpLink);
5656

57+
private static readonly ImmutableArray<SyntaxKind> HandledBinaryExpressionKinds =
58+
ImmutableArray.Create(
59+
SyntaxKind.AddExpression,
60+
SyntaxKind.SubtractExpression,
61+
SyntaxKind.MultiplyExpression,
62+
SyntaxKind.DivideExpression,
63+
SyntaxKind.ModuloExpression,
64+
SyntaxKind.LeftShiftExpression,
65+
SyntaxKind.RightShiftExpression);
66+
5767
private static readonly Action<CompilationStartAnalysisContext> CompilationStartAction = HandleCompilationStart;
68+
private static readonly Action<SyntaxNodeAnalysisContext> BinaryExpressionAction = HandleBinaryExpression;
5869

5970
/// <inheritdoc/>
6071
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get; } =
@@ -68,16 +79,10 @@ public override void Initialize(AnalysisContext context)
6879

6980
private static void HandleCompilationStart(CompilationStartAnalysisContext context)
7081
{
71-
context.RegisterSyntaxNodeActionHonorExclusions(HandleMathExpression, SyntaxKind.AddExpression);
72-
context.RegisterSyntaxNodeActionHonorExclusions(HandleMathExpression, SyntaxKind.SubtractExpression);
73-
context.RegisterSyntaxNodeActionHonorExclusions(HandleMathExpression, SyntaxKind.MultiplyExpression);
74-
context.RegisterSyntaxNodeActionHonorExclusions(HandleMathExpression, SyntaxKind.DivideExpression);
75-
context.RegisterSyntaxNodeActionHonorExclusions(HandleMathExpression, SyntaxKind.ModuloExpression);
76-
context.RegisterSyntaxNodeActionHonorExclusions(HandleMathExpression, SyntaxKind.LeftShiftExpression);
77-
context.RegisterSyntaxNodeActionHonorExclusions(HandleMathExpression, SyntaxKind.RightShiftExpression);
82+
context.RegisterSyntaxNodeActionHonorExclusions(BinaryExpressionAction, HandledBinaryExpressionKinds);
7883
}
7984

80-
private static void HandleMathExpression(SyntaxNodeAnalysisContext context)
85+
private static void HandleBinaryExpression(SyntaxNodeAnalysisContext context)
8186
{
8287
BinaryExpressionSyntax binSyntax = (BinaryExpressionSyntax)context.Node;
8388

StyleCop.Analyzers/StyleCop.Analyzers/MaintainabilityRules/SA1408ConditionalExpressionsMustDeclarePrecedence.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,11 @@ internal class SA1408ConditionalExpressionsMustDeclarePrecedence : DiagnosticAna
6666
private static readonly DiagnosticDescriptor Descriptor =
6767
new DiagnosticDescriptor(DiagnosticId, Title, MessageFormat, AnalyzerCategory.MaintainabilityRules, DiagnosticSeverity.Warning, AnalyzerConstants.EnabledByDefault, Description, HelpLink);
6868

69+
private static readonly ImmutableArray<SyntaxKind> HandledBinaryExpressionKinds =
70+
ImmutableArray.Create(SyntaxKind.LogicalAndExpression, SyntaxKind.LogicalOrExpression);
71+
6972
private static readonly Action<CompilationStartAnalysisContext> CompilationStartAction = HandleCompilationStart;
73+
private static readonly Action<SyntaxNodeAnalysisContext> BinaryExpressionAction = HandleBinaryExpression;
7074

7175
/// <inheritdoc/>
7276
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get; } =
@@ -80,11 +84,10 @@ public override void Initialize(AnalysisContext context)
8084

8185
private static void HandleCompilationStart(CompilationStartAnalysisContext context)
8286
{
83-
context.RegisterSyntaxNodeActionHonorExclusions(HandleLogicalExpression, SyntaxKind.LogicalAndExpression);
84-
context.RegisterSyntaxNodeActionHonorExclusions(HandleLogicalExpression, SyntaxKind.LogicalOrExpression);
87+
context.RegisterSyntaxNodeActionHonorExclusions(BinaryExpressionAction, HandledBinaryExpressionKinds);
8588
}
8689

87-
private static void HandleLogicalExpression(SyntaxNodeAnalysisContext context)
90+
private static void HandleBinaryExpression(SyntaxNodeAnalysisContext context)
8891
{
8992
BinaryExpressionSyntax binSyntax = (BinaryExpressionSyntax)context.Node;
9093

0 commit comments

Comments
 (0)