Skip to content

Commit 5c8bce1

Browse files
committed
Reduce the number of allocations required to register additional syntax kinds
1 parent 7487306 commit 5c8bce1

6 files changed

Lines changed: 80 additions & 106 deletions

StyleCop.Analyzers/StyleCop.Analyzers/AnalyzerExtensions.cs

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -106,32 +106,6 @@ public static void RegisterSyntaxNodeActionHonorExclusions<TLanguageKindEnum>(th
106106
context.RegisterSyntaxNodeActionHonorExclusions(action, LanguageKindArrays<TLanguageKindEnum>.GetOrCreateArray(syntaxKind));
107107
}
108108

109-
/// <summary>
110-
/// Register an action to be executed at completion of semantic analysis of a <see cref="SyntaxNode"/> with an
111-
/// appropriate kind. A syntax node action can report diagnostics about a <see cref="SyntaxNode"/>, and can also
112-
/// collect state information to be used by other syntax node actions or code block end actions.
113-
/// </summary>
114-
/// <remarks>This method honors exclusions.</remarks>
115-
/// <param name="context">Action will be executed only if the kind of a <see cref="SyntaxNode"/> matches one of
116-
/// the <paramref name="syntaxKinds"/> values.</param>
117-
/// <param name="action">Action to be executed at completion of semantic analysis of a
118-
/// <see cref="SyntaxNode"/>.</param>
119-
/// <param name="syntaxKinds">The kinds of syntax that should be analyzed.</param>
120-
/// <typeparam name="TLanguageKindEnum">Enum type giving the syntax node kinds of the source language for which
121-
/// the action applies.</typeparam>
122-
public static void RegisterSyntaxNodeActionHonorExclusions<TLanguageKindEnum>(this CompilationStartAnalysisContext context, Action<SyntaxNodeAnalysisContext> action, params TLanguageKindEnum[] syntaxKinds)
123-
where TLanguageKindEnum : struct
124-
{
125-
if (syntaxKinds == null)
126-
{
127-
RegisterSyntaxNodeActionHonorExclusions(context, action, default(ImmutableArray<TLanguageKindEnum>));
128-
}
129-
else
130-
{
131-
RegisterSyntaxNodeActionHonorExclusions(context, action, syntaxKinds.ToImmutableArray());
132-
}
133-
}
134-
135109
/// <summary>
136110
/// Register an action to be executed at completion of semantic analysis of a <see cref="SyntaxNode"/> with an
137111
/// appropriate kind. A syntax node action can report diagnostics about a <see cref="SyntaxNode"/>, and can also

StyleCop.Analyzers/StyleCop.Analyzers/DocumentationRules/SA1648InheritDocMustBeUsedWithInheritingClass.cs

Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,15 @@ internal class SA1648InheritDocMustBeUsedWithInheritingClass : DiagnosticAnalyze
3737
private static readonly DiagnosticDescriptor Descriptor =
3838
new DiagnosticDescriptor(DiagnosticId, Title, MessageFormat, AnalyzerCategory.DocumentationRules, DiagnosticSeverity.Warning, AnalyzerConstants.EnabledByDefault, Description, HelpLink);
3939

40+
private static readonly ImmutableArray<SyntaxKind> HandledTypeLikeDeclarationKinds =
41+
ImmutableArray.Create(SyntaxKind.ClassDeclaration, SyntaxKind.StructDeclaration, SyntaxKind.InterfaceDeclaration, SyntaxKind.EnumDeclaration, SyntaxKind.DelegateDeclaration);
42+
43+
private static readonly ImmutableArray<SyntaxKind> MemberDeclarationKinds =
44+
ImmutableArray.Create(SyntaxKind.ConstructorDeclaration, SyntaxKind.EventDeclaration, SyntaxKind.MethodDeclaration, SyntaxKind.PropertyDeclaration, SyntaxKind.EventFieldDeclaration, SyntaxKind.FieldDeclaration, SyntaxKind.IndexerDeclaration);
45+
4046
private static readonly Action<CompilationStartAnalysisContext> CompilationStartAction = HandleCompilationStart;
41-
private static readonly Action<SyntaxNodeAnalysisContext> BaseTypeDeclarationSyntaxAction = HandleBaseTypeDeclarationSyntax;
42-
private static readonly Action<SyntaxNodeAnalysisContext> MemberSyntaxAction = HandleMemberSyntax;
47+
private static readonly Action<SyntaxNodeAnalysisContext> BaseTypeLikeDeclarationAction = HandleBaseTypeLikeDeclaration;
48+
private static readonly Action<SyntaxNodeAnalysisContext> MemberDeclarationAction = HandleMemberDeclaration;
4349

4450
/// <inheritdoc/>
4551
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get; } =
@@ -53,25 +59,11 @@ public override void Initialize(AnalysisContext context)
5359

5460
private static void HandleCompilationStart(CompilationStartAnalysisContext context)
5561
{
56-
context.RegisterSyntaxNodeActionHonorExclusions(
57-
BaseTypeDeclarationSyntaxAction,
58-
SyntaxKind.ClassDeclaration,
59-
SyntaxKind.InterfaceDeclaration,
60-
SyntaxKind.EnumDeclaration,
61-
SyntaxKind.StructDeclaration,
62-
SyntaxKind.DelegateDeclaration);
63-
context.RegisterSyntaxNodeActionHonorExclusions(
64-
MemberSyntaxAction,
65-
SyntaxKind.ConstructorDeclaration,
66-
SyntaxKind.EventDeclaration,
67-
SyntaxKind.MethodDeclaration,
68-
SyntaxKind.PropertyDeclaration,
69-
SyntaxKind.EventFieldDeclaration,
70-
SyntaxKind.FieldDeclaration,
71-
SyntaxKind.IndexerDeclaration);
62+
context.RegisterSyntaxNodeActionHonorExclusions(BaseTypeLikeDeclarationAction, HandledTypeLikeDeclarationKinds);
63+
context.RegisterSyntaxNodeActionHonorExclusions(MemberDeclarationAction, MemberDeclarationKinds);
7264
}
7365

74-
private static void HandleBaseTypeDeclarationSyntax(SyntaxNodeAnalysisContext context)
66+
private static void HandleBaseTypeLikeDeclaration(SyntaxNodeAnalysisContext context)
7567
{
7668
BaseTypeDeclarationSyntax baseType = context.Node as BaseTypeDeclarationSyntax;
7769

@@ -91,9 +83,9 @@ private static void HandleBaseTypeDeclarationSyntax(SyntaxNodeAnalysisContext co
9183
}
9284
}
9385

94-
private static void HandleMemberSyntax(SyntaxNodeAnalysisContext context)
86+
private static void HandleMemberDeclaration(SyntaxNodeAnalysisContext context)
9587
{
96-
MemberDeclarationSyntax memberSyntax = context.Node as MemberDeclarationSyntax;
88+
MemberDeclarationSyntax memberSyntax = (MemberDeclarationSyntax)context.Node;
9789

9890
var modifiers = memberSyntax.GetModifiers();
9991

StyleCop.Analyzers/StyleCop.Analyzers/LayoutRules/SA1506ElementDocumentationHeadersMustNotBeFollowedByBlankLine.cs

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,22 @@ internal class SA1506ElementDocumentationHeadersMustNotBeFollowedByBlankLine : D
5050
private static readonly DiagnosticDescriptor Descriptor =
5151
new DiagnosticDescriptor(DiagnosticId, Title, MessageFormat, AnalyzerCategory.LayoutRules, DiagnosticSeverity.Warning, AnalyzerConstants.EnabledByDefault, Description, HelpLink);
5252

53+
private static readonly ImmutableArray<SyntaxKind> HandledSyntaxKinds =
54+
ImmutableArray.Create(
55+
SyntaxKind.ClassDeclaration,
56+
SyntaxKind.StructDeclaration,
57+
SyntaxKind.InterfaceDeclaration,
58+
SyntaxKind.EnumDeclaration,
59+
SyntaxKind.MethodDeclaration,
60+
SyntaxKind.ConstructorDeclaration,
61+
SyntaxKind.DestructorDeclaration,
62+
SyntaxKind.PropertyDeclaration,
63+
SyntaxKind.IndexerDeclaration,
64+
SyntaxKind.FieldDeclaration,
65+
SyntaxKind.DelegateDeclaration,
66+
SyntaxKind.EventDeclaration,
67+
SyntaxKind.EventFieldDeclaration);
68+
5369
private static readonly Action<CompilationStartAnalysisContext> CompilationStartAction = HandleCompilationStart;
5470

5571
/// <inheritdoc/>
@@ -64,21 +80,7 @@ public override void Initialize(AnalysisContext context)
6480

6581
private static void HandleCompilationStart(CompilationStartAnalysisContext context)
6682
{
67-
context.RegisterSyntaxNodeActionHonorExclusions(
68-
HandleDeclaration,
69-
SyntaxKind.ClassDeclaration,
70-
SyntaxKind.StructDeclaration,
71-
SyntaxKind.InterfaceDeclaration,
72-
SyntaxKind.EnumDeclaration,
73-
SyntaxKind.MethodDeclaration,
74-
SyntaxKind.ConstructorDeclaration,
75-
SyntaxKind.DestructorDeclaration,
76-
SyntaxKind.PropertyDeclaration,
77-
SyntaxKind.IndexerDeclaration,
78-
SyntaxKind.FieldDeclaration,
79-
SyntaxKind.DelegateDeclaration,
80-
SyntaxKind.EventDeclaration,
81-
SyntaxKind.EventFieldDeclaration);
83+
context.RegisterSyntaxNodeActionHonorExclusions(HandleDeclaration, HandledSyntaxKinds);
8284
}
8385

8486
private static void HandleDeclaration(SyntaxNodeAnalysisContext context)

StyleCop.Analyzers/StyleCop.Analyzers/LayoutRules/SA1514ElementDocumentationHeaderMustBePrecededByBlankLine.cs

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -74,22 +74,8 @@ internal class SA1514ElementDocumentationHeaderMustBePrecededByBlankLine : Diagn
7474
private static readonly DiagnosticDescriptor Descriptor =
7575
new DiagnosticDescriptor(DiagnosticId, Title, MessageFormat, AnalyzerCategory.LayoutRules, DiagnosticSeverity.Warning, AnalyzerConstants.EnabledByDefault, Description, HelpLink);
7676

77-
private static readonly Action<CompilationStartAnalysisContext> CompilationStartAction = HandleCompilationStart;
78-
79-
/// <inheritdoc/>
80-
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get; } =
81-
ImmutableArray.Create(Descriptor);
82-
83-
/// <inheritdoc/>
84-
public override void Initialize(AnalysisContext context)
85-
{
86-
context.RegisterCompilationStartAction(CompilationStartAction);
87-
}
88-
89-
private static void HandleCompilationStart(CompilationStartAnalysisContext context)
90-
{
91-
context.RegisterSyntaxNodeActionHonorExclusions(
92-
HandleDeclaration,
77+
private static readonly ImmutableArray<SyntaxKind> HandledSyntaxKinds =
78+
ImmutableArray.Create(
9379
SyntaxKind.ClassDeclaration,
9480
SyntaxKind.StructDeclaration,
9581
SyntaxKind.InterfaceDeclaration,
@@ -104,6 +90,22 @@ private static void HandleCompilationStart(CompilationStartAnalysisContext conte
10490
SyntaxKind.DelegateDeclaration,
10591
SyntaxKind.EventDeclaration,
10692
SyntaxKind.EventFieldDeclaration);
93+
94+
private static readonly Action<CompilationStartAnalysisContext> CompilationStartAction = HandleCompilationStart;
95+
96+
/// <inheritdoc/>
97+
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get; } =
98+
ImmutableArray.Create(Descriptor);
99+
100+
/// <inheritdoc/>
101+
public override void Initialize(AnalysisContext context)
102+
{
103+
context.RegisterCompilationStartAction(CompilationStartAction);
104+
}
105+
106+
private static void HandleCompilationStart(CompilationStartAnalysisContext context)
107+
{
108+
context.RegisterSyntaxNodeActionHonorExclusions(HandleDeclaration, HandledSyntaxKinds);
107109
}
108110

109111
private static void HandleDeclaration(SyntaxNodeAnalysisContext context)

StyleCop.Analyzers/StyleCop.Analyzers/OrderingRules/SA1206DeclarationKeywordsMustFollowOrder.cs

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,23 @@ internal class SA1206DeclarationKeywordsMustFollowOrder : DiagnosticAnalyzer
4444
private static readonly DiagnosticDescriptor Descriptor =
4545
new DiagnosticDescriptor(DiagnosticId, Title, MessageFormat, AnalyzerCategory.OrderingRules, DiagnosticSeverity.Warning, AnalyzerConstants.EnabledByDefault, Description, HelpLink);
4646

47+
private static readonly ImmutableArray<SyntaxKind> HandledSyntaxKinds =
48+
ImmutableArray.Create(
49+
SyntaxKind.ClassDeclaration,
50+
SyntaxKind.StructDeclaration,
51+
SyntaxKind.InterfaceDeclaration,
52+
SyntaxKind.EnumDeclaration,
53+
SyntaxKind.DelegateDeclaration,
54+
SyntaxKind.FieldDeclaration,
55+
SyntaxKind.MethodDeclaration,
56+
SyntaxKind.PropertyDeclaration,
57+
SyntaxKind.EventDeclaration,
58+
SyntaxKind.EventFieldDeclaration,
59+
SyntaxKind.IndexerDeclaration,
60+
SyntaxKind.OperatorDeclaration,
61+
SyntaxKind.ConversionOperatorDeclaration,
62+
SyntaxKind.ConstructorDeclaration);
63+
4764
private static readonly Action<CompilationStartAnalysisContext> CompilationStartAction = HandleCompilationStart;
4865

4966
/// <summary>
@@ -84,22 +101,7 @@ public override void Initialize(AnalysisContext context)
84101

85102
private static void HandleCompilationStart(CompilationStartAnalysisContext context)
86103
{
87-
context.RegisterSyntaxNodeActionHonorExclusions(
88-
HandleDeclaration,
89-
SyntaxKind.ClassDeclaration,
90-
SyntaxKind.StructDeclaration,
91-
SyntaxKind.InterfaceDeclaration,
92-
SyntaxKind.EnumDeclaration,
93-
SyntaxKind.DelegateDeclaration,
94-
SyntaxKind.FieldDeclaration,
95-
SyntaxKind.MethodDeclaration,
96-
SyntaxKind.PropertyDeclaration,
97-
SyntaxKind.EventDeclaration,
98-
SyntaxKind.EventFieldDeclaration,
99-
SyntaxKind.IndexerDeclaration,
100-
SyntaxKind.OperatorDeclaration,
101-
SyntaxKind.ConversionOperatorDeclaration,
102-
SyntaxKind.ConstructorDeclaration);
104+
context.RegisterSyntaxNodeActionHonorExclusions(HandleDeclaration, HandledSyntaxKinds);
103105
}
104106

105107
private static void HandleDeclaration(SyntaxNodeAnalysisContext context)

StyleCop.Analyzers/StyleCop.Analyzers/OrderingRules/SA1207ProtectedMustComeBeforeInternal.cs

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,19 @@ internal class SA1207ProtectedMustComeBeforeInternal : DiagnosticAnalyzer
3636
private static readonly DiagnosticDescriptor Descriptor =
3737
new DiagnosticDescriptor(DiagnosticId, Title, MessageFormat, AnalyzerCategory.OrderingRules, DiagnosticSeverity.Warning, AnalyzerConstants.EnabledByDefault, Description, HelpLink);
3838

39+
private static readonly ImmutableArray<SyntaxKind> HandledSyntaxKinds =
40+
ImmutableArray.Create(
41+
SyntaxKind.ClassDeclaration,
42+
SyntaxKind.DelegateDeclaration,
43+
SyntaxKind.EventDeclaration,
44+
SyntaxKind.EventFieldDeclaration,
45+
SyntaxKind.FieldDeclaration,
46+
SyntaxKind.IndexerDeclaration,
47+
SyntaxKind.InterfaceDeclaration,
48+
SyntaxKind.MethodDeclaration,
49+
SyntaxKind.PropertyDeclaration,
50+
SyntaxKind.StructDeclaration);
51+
3952
private static readonly Action<CompilationStartAnalysisContext> CompilationStartAction = HandleCompilationStart;
4053

4154
/// <inheritdoc/>
@@ -50,18 +63,7 @@ public override void Initialize(AnalysisContext context)
5063

5164
private static void HandleCompilationStart(CompilationStartAnalysisContext context)
5265
{
53-
context.RegisterSyntaxNodeActionHonorExclusions(
54-
HandleDeclaration,
55-
SyntaxKind.ClassDeclaration,
56-
SyntaxKind.DelegateDeclaration,
57-
SyntaxKind.EventDeclaration,
58-
SyntaxKind.EventFieldDeclaration,
59-
SyntaxKind.FieldDeclaration,
60-
SyntaxKind.IndexerDeclaration,
61-
SyntaxKind.InterfaceDeclaration,
62-
SyntaxKind.MethodDeclaration,
63-
SyntaxKind.PropertyDeclaration,
64-
SyntaxKind.StructDeclaration);
66+
context.RegisterSyntaxNodeActionHonorExclusions(HandleDeclaration, HandledSyntaxKinds);
6567
}
6668

6769
private static void HandleDeclaration(SyntaxNodeAnalysisContext context)

0 commit comments

Comments
 (0)