Skip to content

Commit 525f326

Browse files
authored
Fix analyzer RCS1260 (#1668)
1 parent 646f429 commit 525f326

File tree

4 files changed

+123
-0
lines changed

4 files changed

+123
-0
lines changed

ChangeLog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1616
- Fix analyzer [RCS1264](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS1264) ([PR](https://github.com/dotnet/roslynator/pull/1666))
1717
- Fix analyzer [RCS1229](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS1229) ([PR](https://github.com/dotnet/roslynator/pull/1667))
1818
- Fix analyzer [RCS1250](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS1250) ([PR](https://github.com/dotnet/roslynator/pull/1652) by @aihnatiuk)
19+
- Fix analyzer [RCS1260](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS1260) ([PR](https://github.com/dotnet/roslynator/pull/1668))
1920

2021
## [4.13.1] - 2025-02-23
2122

src/Analyzers.CodeFixes/CSharp/CodeFixes/AddOrRemoveTrailingCommaCodeFixProvider.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ public override async Task RegisterCodeFixesAsync(CodeFixContext context)
3636
SyntaxKind.ObjectInitializerExpression,
3737
SyntaxKind.CollectionInitializerExpression,
3838
SyntaxKind.EnumDeclaration,
39+
#if ROSLYN_4_7
40+
SyntaxKind.CollectionExpression,
41+
#endif
3942
SyntaxKind.AnonymousObjectCreationExpression)))
4043
{
4144
return;
@@ -69,6 +72,33 @@ public override async Task RegisterCodeFixesAsync(CodeFixContext context)
6972
context.RegisterCodeFix(codeAction, diagnostic);
7073
}
7174
}
75+
#if ROSLYN_4_7
76+
if (node is CollectionExpressionSyntax collectionExpression)
77+
{
78+
SeparatedSyntaxList<CollectionElementSyntax> elements = collectionExpression.Elements;
79+
80+
int count = elements.Count;
81+
82+
if (count == elements.SeparatorCount)
83+
{
84+
CodeAction codeAction = CodeAction.Create(
85+
"Remove comma",
86+
ct => RemoveTrailingComma(document, elements.GetSeparator(count - 1), ct),
87+
GetEquivalenceKey(diagnostic));
88+
89+
context.RegisterCodeFix(codeAction, diagnostic);
90+
}
91+
else
92+
{
93+
CodeAction codeAction = CodeAction.Create(
94+
"Add comma",
95+
ct => AddTrailingComma(document, elements.Last(), ct),
96+
GetEquivalenceKey(diagnostic));
97+
98+
context.RegisterCodeFix(codeAction, diagnostic);
99+
}
100+
}
101+
#endif
72102
else if (node is AnonymousObjectCreationExpressionSyntax objectCreation)
73103
{
74104
SeparatedSyntaxList<AnonymousObjectMemberDeclaratorSyntax> initializers = objectCreation.Initializers;

src/Analyzers/CSharp/Analysis/AddOrRemoveTrailingCommaAnalyzer.cs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ public override void Initialize(AnalysisContext context)
3232

3333
context.RegisterSyntaxNodeAction(f => AnalyzeEnumDeclaration(f), SyntaxKind.EnumDeclaration);
3434
context.RegisterSyntaxNodeAction(f => AnalyzeAnonymousObjectCreationExpression(f), SyntaxKind.AnonymousObjectCreationExpression);
35+
#if ROSLYN_4_7
36+
context.RegisterSyntaxNodeAction(f => AnalyzeCollectionExpression(f), SyntaxKind.CollectionExpression);
37+
#endif
3538

3639
context.RegisterSyntaxNodeAction(
3740
f => AnalyzeInitializerExpression(f),
@@ -169,6 +172,51 @@ private static void AnalyzeAnonymousObjectCreationExpression(SyntaxNodeAnalysisC
169172
}
170173
}
171174

175+
#if ROSLYN_4_7
176+
private static void AnalyzeCollectionExpression(SyntaxNodeAnalysisContext context)
177+
{
178+
TrailingCommaStyle style = context.GetTrailingCommaStyle();
179+
180+
if (style == TrailingCommaStyle.None)
181+
return;
182+
183+
var objectCreation = (CollectionExpressionSyntax)context.Node;
184+
185+
SeparatedSyntaxList<CollectionElementSyntax> elements = objectCreation.Elements;
186+
187+
if (!elements.Any())
188+
return;
189+
190+
int count = elements.Count;
191+
int separatorCount = elements.SeparatorCount;
192+
193+
if (count == separatorCount)
194+
{
195+
if (style == TrailingCommaStyle.Omit)
196+
{
197+
ReportRemove(context, elements.GetSeparator(count - 1));
198+
}
199+
else if (style == TrailingCommaStyle.OmitWhenSingleLine
200+
&& elements.IsSingleLine(cancellationToken: context.CancellationToken))
201+
{
202+
ReportRemove(context, elements.GetSeparator(count - 1));
203+
}
204+
}
205+
else if (separatorCount == count - 1)
206+
{
207+
if (style == TrailingCommaStyle.Include)
208+
{
209+
ReportAdd(context, elements.Last());
210+
}
211+
else if (style == TrailingCommaStyle.OmitWhenSingleLine
212+
&& !elements.IsSingleLine(cancellationToken: context.CancellationToken))
213+
{
214+
ReportAdd(context, elements.Last());
215+
}
216+
}
217+
}
218+
#endif
219+
172220
private static void ReportAdd(SyntaxNodeAnalysisContext context, SyntaxNode lastNode)
173221
{
174222
DiagnosticHelpers.ReportDiagnostic(

src/Tests/Analyzers.Tests/RCS1260AddOrRemoveTrailingCommaTests.cs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,4 +329,48 @@ void M()
329329
}
330330
""", options: Options.AddConfigOption(ConfigOptionKeys.TrailingCommaStyle, ConfigOptionValues.TrailingCommaStyle_OmitWhenSingleLine));
331331
}
332+
333+
[Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.AddOrRemoveTrailingComma)]
334+
public async Task Test_CollectionExpression_Omit()
335+
{
336+
await VerifyDiagnosticAndFixAsync("""
337+
class C
338+
{
339+
void M()
340+
{
341+
int[] x = [1, 2, 3[|,|]];
342+
}
343+
}
344+
""", """
345+
class C
346+
{
347+
void M()
348+
{
349+
int[] x = [1, 2, 3];
350+
}
351+
}
352+
""", options: Options.AddConfigOption(ConfigOptionKeys.TrailingCommaStyle, ConfigOptionValues.TrailingCommaStyle_Omit));
353+
}
354+
355+
[Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.AddOrRemoveTrailingComma)]
356+
public async Task Test_CollectionExpression_OmitWhenSingleLine()
357+
{
358+
await VerifyDiagnosticAndFixAsync("""
359+
class C
360+
{
361+
void M()
362+
{
363+
int[] x = [1, 2, 3[|,|]];
364+
}
365+
}
366+
""", """
367+
class C
368+
{
369+
void M()
370+
{
371+
int[] x = [1, 2, 3];
372+
}
373+
}
374+
""", options: Options.AddConfigOption(ConfigOptionKeys.TrailingCommaStyle, ConfigOptionValues.TrailingCommaStyle_OmitWhenSingleLine));
375+
}
332376
}

0 commit comments

Comments
 (0)