Skip to content

Commit b06b16e

Browse files
committed
Simplify duplicated code in SA1000 implementation
1 parent afe095f commit b06b16e

1 file changed

Lines changed: 35 additions & 34 deletions

File tree

StyleCop.Analyzers/StyleCop.Analyzers/SpacingRules/SA1000KeywordsMustBeSpacedCorrectly.cs

Lines changed: 35 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,13 @@ internal class SA1000KeywordsMustBeSpacedCorrectly : DiagnosticAnalyzer
4646

4747
private static readonly Action<SyntaxTreeAnalysisContext> SyntaxTreeAction = HandleSyntaxTree;
4848
private static readonly Action<SyntaxNodeAnalysisContext> InvocationExpressionAction = HandleInvocationExpression;
49+
private static readonly ReportDiagnosticCallback<SyntaxTreeAnalysisContext> ReportSyntaxTreeDiagnostic =
50+
(ref SyntaxTreeAnalysisContext context, Diagnostic diagnostic) => context.ReportDiagnostic(diagnostic);
51+
52+
private static readonly ReportDiagnosticCallback<SyntaxNodeAnalysisContext> ReportSyntaxNodeDiagnostic =
53+
(ref SyntaxNodeAnalysisContext context, Diagnostic diagnostic) => context.ReportDiagnostic(diagnostic);
54+
55+
private delegate void ReportDiagnosticCallback<TContext>(ref TContext context, Diagnostic diagnostic);
4956

5057
/// <inheritdoc/>
5158
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get; } =
@@ -93,18 +100,18 @@ private static void HandleSyntaxTree(SyntaxTreeAnalysisContext context)
93100
case SyntaxKind.WhereKeyword:
94101
case SyntaxKind.WhileKeyword:
95102
case SyntaxKind.YieldKeyword:
96-
HandleRequiredSpaceToken(context, token);
103+
HandleRequiredSpaceToken(ref context, token);
97104
break;
98105

99106
case SyntaxKind.CheckedKeyword:
100107
case SyntaxKind.UncheckedKeyword:
101108
if (token.GetNextToken().IsKind(SyntaxKind.OpenBraceToken))
102109
{
103-
HandleRequiredSpaceToken(context, token);
110+
HandleRequiredSpaceToken(ref context, token);
104111
}
105112
else
106113
{
107-
HandleDisallowedSpaceToken(context, token);
114+
HandleDisallowedSpaceToken(ref context, token);
108115
}
109116

110117
break;
@@ -113,19 +120,19 @@ private static void HandleSyntaxTree(SyntaxTreeAnalysisContext context)
113120
case SyntaxKind.NameOfKeyword:
114121
case SyntaxKind.SizeOfKeyword:
115122
case SyntaxKind.TypeOfKeyword:
116-
HandleDisallowedSpaceToken(context, token);
123+
HandleDisallowedSpaceToken(ref context, token);
117124
break;
118125

119126
case SyntaxKind.NewKeyword:
120-
HandleNewKeywordToken(context, token);
127+
HandleNewKeywordToken(ref context, token);
121128
break;
122129

123130
case SyntaxKind.ReturnKeyword:
124-
HandleReturnKeywordToken(context, token);
131+
HandleReturnKeywordToken(ref context, token);
125132
break;
126133

127134
case SyntaxKind.ThrowKeyword:
128-
HandleThrowKeywordToken(context, token);
135+
HandleThrowKeywordToken(ref context, token);
129136
break;
130137

131138
default:
@@ -157,11 +164,14 @@ private static void HandleInvocationExpression(SyntaxNodeAnalysisContext context
157164
if (constantValue.HasValue && !string.IsNullOrEmpty(constantValue.Value as string))
158165
{
159166
// this is a nameof expression
160-
HandleDisallowedSpaceToken(context, identifierNameSyntax.Identifier);
167+
HandleDisallowedSpaceToken(ref context, identifierNameSyntax.Identifier);
161168
}
162169
}
163170

164-
private static void HandleRequiredSpaceToken(SyntaxTreeAnalysisContext context, SyntaxToken token)
171+
private static void HandleRequiredSpaceToken(ref SyntaxTreeAnalysisContext context, SyntaxToken token)
172+
=> HandleRequiredSpaceToken(ReportSyntaxTreeDiagnostic, ref context, token);
173+
174+
private static void HandleRequiredSpaceToken<TContext>(ReportDiagnosticCallback<TContext> reportDiagnostic, ref TContext context, SyntaxToken token)
165175
{
166176
if (token.IsMissing)
167177
{
@@ -181,25 +191,16 @@ private static void HandleRequiredSpaceToken(SyntaxTreeAnalysisContext context,
181191
}
182192
}
183193

184-
context.ReportDiagnostic(Diagnostic.Create(Descriptor, token.GetLocation(), TokenSpacingProperties.InsertFollowing, token.Text, string.Empty));
194+
reportDiagnostic(ref context, Diagnostic.Create(Descriptor, token.GetLocation(), TokenSpacingProperties.InsertFollowing, token.Text, string.Empty));
185195
}
186196

187-
private static void HandleDisallowedSpaceToken(SyntaxTreeAnalysisContext context, SyntaxToken token)
188-
{
189-
if (token.IsMissing || !token.HasTrailingTrivia)
190-
{
191-
return;
192-
}
193-
194-
if (!token.TrailingTrivia.First().IsKind(SyntaxKind.WhitespaceTrivia))
195-
{
196-
return;
197-
}
197+
private static void HandleDisallowedSpaceToken(ref SyntaxTreeAnalysisContext context, SyntaxToken token)
198+
=> HandleDisallowedSpaceToken(ReportSyntaxTreeDiagnostic, ref context, token);
198199

199-
context.ReportDiagnostic(Diagnostic.Create(Descriptor, token.GetLocation(), TokenSpacingProperties.RemoveFollowing, token.Text, " not"));
200-
}
200+
private static void HandleDisallowedSpaceToken(ref SyntaxNodeAnalysisContext context, SyntaxToken token)
201+
=> HandleDisallowedSpaceToken(ReportSyntaxNodeDiagnostic, ref context, token);
201202

202-
private static void HandleDisallowedSpaceToken(SyntaxNodeAnalysisContext context, SyntaxToken token)
203+
private static void HandleDisallowedSpaceToken<TContext>(ReportDiagnosticCallback<TContext> reportDiagnostic, ref TContext context, SyntaxToken token)
203204
{
204205
if (token.IsMissing || !token.HasTrailingTrivia)
205206
{
@@ -211,10 +212,10 @@ private static void HandleDisallowedSpaceToken(SyntaxNodeAnalysisContext context
211212
return;
212213
}
213214

214-
context.ReportDiagnostic(Diagnostic.Create(Descriptor, token.GetLocation(), TokenSpacingProperties.RemoveFollowing, token.Text, " not"));
215+
reportDiagnostic(ref context, Diagnostic.Create(Descriptor, token.GetLocation(), TokenSpacingProperties.RemoveFollowing, token.Text, " not"));
215216
}
216217

217-
private static void HandleNewKeywordToken(SyntaxTreeAnalysisContext context, SyntaxToken token)
218+
private static void HandleNewKeywordToken(ref SyntaxTreeAnalysisContext context, SyntaxToken token)
218219
{
219220
if (token.IsMissing)
220221
{
@@ -231,15 +232,15 @@ private static void HandleNewKeywordToken(SyntaxTreeAnalysisContext context, Syn
231232
return;
232233
}
233234

234-
HandleDisallowedSpaceToken(context, token);
235+
HandleDisallowedSpaceToken(ref context, token);
235236
return;
236237
}
237238

238239
// otherwise treat as required
239-
HandleRequiredSpaceToken(context, token);
240+
HandleRequiredSpaceToken(ref context, token);
240241
}
241242

242-
private static void HandleReturnKeywordToken(SyntaxTreeAnalysisContext context, SyntaxToken token)
243+
private static void HandleReturnKeywordToken(ref SyntaxTreeAnalysisContext context, SyntaxToken token)
243244
{
244245
if (token.IsMissing)
245246
{
@@ -253,15 +254,15 @@ private static void HandleReturnKeywordToken(SyntaxTreeAnalysisContext context,
253254
SyntaxToken nextToken = token.GetNextToken();
254255
if (nextToken.IsKind(SyntaxKind.SemicolonToken) || nextToken.IsKind(SyntaxKind.ColonToken))
255256
{
256-
HandleDisallowedSpaceToken(context, token);
257+
HandleDisallowedSpaceToken(ref context, token);
257258
return;
258259
}
259260

260261
// otherwise treat as required
261-
HandleRequiredSpaceToken(context, token);
262+
HandleRequiredSpaceToken(ref context, token);
262263
}
263264

264-
private static void HandleThrowKeywordToken(SyntaxTreeAnalysisContext context, SyntaxToken token)
265+
private static void HandleThrowKeywordToken(ref SyntaxTreeAnalysisContext context, SyntaxToken token)
265266
{
266267
if (token.IsMissing)
267268
{
@@ -274,12 +275,12 @@ private static void HandleThrowKeywordToken(SyntaxTreeAnalysisContext context, S
274275
SyntaxToken nextToken = token.GetNextToken();
275276
if (nextToken.IsKind(SyntaxKind.SemicolonToken))
276277
{
277-
HandleDisallowedSpaceToken(context, token);
278+
HandleDisallowedSpaceToken(ref context, token);
278279
return;
279280
}
280281

281282
// otherwise treat as required
282-
HandleRequiredSpaceToken(context, token);
283+
HandleRequiredSpaceToken(ref context, token);
283284
}
284285
}
285286
}

0 commit comments

Comments
 (0)