From d977d06a0296237b5d481f93b0bbb0685f4db101 Mon Sep 17 00:00:00 2001 From: Josef Pihrt Date: Sun, 31 Aug 2025 11:28:27 +0200 Subject: [PATCH 1/5] fix --- .../AddOrRemoveTrailingCommaAnalyzer.cs | 40 ++++++++------- .../RCS1260AddOrRemoveTrailingCommaTests.cs | 50 +++++++++++++++++++ 2 files changed, 72 insertions(+), 18 deletions(-) diff --git a/src/Analyzers/CSharp/Analysis/AddOrRemoveTrailingCommaAnalyzer.cs b/src/Analyzers/CSharp/Analysis/AddOrRemoveTrailingCommaAnalyzer.cs index 0e39cece2e..651ec1da98 100644 --- a/src/Analyzers/CSharp/Analysis/AddOrRemoveTrailingCommaAnalyzer.cs +++ b/src/Analyzers/CSharp/Analysis/AddOrRemoveTrailingCommaAnalyzer.cs @@ -69,7 +69,7 @@ private static void AnalyzeInitializerExpression(SyntaxNodeAnalysisContext conte ReportRemove(context, expressions.GetSeparator(count - 1)); } else if (style == TrailingCommaStyle.OmitWhenSingleLine - && expressions.IsSingleLine(cancellationToken: context.CancellationToken)) + && initializer.IsSingleLine(cancellationToken: context.CancellationToken)) { ReportRemove(context, expressions.GetSeparator(count - 1)); } @@ -81,7 +81,7 @@ private static void AnalyzeInitializerExpression(SyntaxNodeAnalysisContext conte ReportAdd(context, expressions.Last()); } else if (style == TrailingCommaStyle.OmitWhenSingleLine - && !expressions.IsSingleLine(cancellationToken: context.CancellationToken)) + && !initializer.IsSingleLine(cancellationToken: context.CancellationToken)) { ReportAdd(context, expressions.Last()); } @@ -112,7 +112,7 @@ private static void AnalyzeEnumDeclaration(SyntaxNodeAnalysisContext context) ReportRemove(context, members.GetSeparator(count - 1)); } else if (style == TrailingCommaStyle.OmitWhenSingleLine - && members.IsSingleLine(cancellationToken: context.CancellationToken)) + && enumDeclaration.IsSingleLine(cancellationToken: context.CancellationToken)) { ReportRemove(context, members.GetSeparator(count - 1)); } @@ -124,7 +124,7 @@ private static void AnalyzeEnumDeclaration(SyntaxNodeAnalysisContext context) ReportAdd(context, members.Last()); } else if (style == TrailingCommaStyle.OmitWhenSingleLine - && !members.IsSingleLine(cancellationToken: context.CancellationToken)) + && !enumDeclaration.IsSingleLine(cancellationToken: context.CancellationToken)) { ReportAdd(context, members.Last()); } @@ -147,6 +147,7 @@ private static void AnalyzeAnonymousObjectCreationExpression(SyntaxNodeAnalysisC int count = initializers.Count; int separatorCount = initializers.SeparatorCount; + TextSpan bracesSpan = TextSpan.FromBounds(objectCreation.OpenBraceToken.SpanStart, objectCreation.CloseBraceToken.Span.End); if (count == separatorCount) { @@ -155,7 +156,7 @@ private static void AnalyzeAnonymousObjectCreationExpression(SyntaxNodeAnalysisC ReportRemove(context, initializers.GetSeparator(count - 1)); } else if (style == TrailingCommaStyle.OmitWhenSingleLine - && initializers.IsSingleLine(cancellationToken: context.CancellationToken)) + && bracesSpan.IsSingleLine(objectCreation.SyntaxTree, cancellationToken: context.CancellationToken)) { ReportRemove(context, initializers.GetSeparator(count - 1)); } @@ -167,7 +168,7 @@ private static void AnalyzeAnonymousObjectCreationExpression(SyntaxNodeAnalysisC ReportAdd(context, initializers.Last()); } else if (style == TrailingCommaStyle.OmitWhenSingleLine - && !initializers.IsSingleLine(cancellationToken: context.CancellationToken)) + && !bracesSpan.IsSingleLine(objectCreation.SyntaxTree, cancellationToken: context.CancellationToken)) { ReportAdd(context, initializers.Last()); } @@ -181,15 +182,16 @@ private static void AnalyzeSwitchExpression(SyntaxNodeAnalysisContext context) if (style == TrailingCommaStyle.None) return; - var objectCreation = (SwitchExpressionSyntax)context.Node; + var switchExpression = (SwitchExpressionSyntax)context.Node; - SeparatedSyntaxList arms = objectCreation.Arms; + SeparatedSyntaxList arms = switchExpression.Arms; if (!arms.Any()) return; int count = arms.Count; int separatorCount = arms.SeparatorCount; + TextSpan bracesSpan = TextSpan.FromBounds(switchExpression.OpenBraceToken.SpanStart, switchExpression.CloseBraceToken.Span.End); if (count == separatorCount) { @@ -198,7 +200,7 @@ private static void AnalyzeSwitchExpression(SyntaxNodeAnalysisContext context) ReportRemove(context, arms.GetSeparator(count - 1)); } else if (style == TrailingCommaStyle.OmitWhenSingleLine - && arms.IsSingleLine(cancellationToken: context.CancellationToken)) + && bracesSpan.IsSingleLine(switchExpression.SyntaxTree, cancellationToken: context.CancellationToken)) { ReportRemove(context, arms.GetSeparator(count - 1)); } @@ -210,7 +212,7 @@ private static void AnalyzeSwitchExpression(SyntaxNodeAnalysisContext context) ReportAdd(context, arms.Last()); } else if (style == TrailingCommaStyle.OmitWhenSingleLine - && !arms.IsSingleLine(cancellationToken: context.CancellationToken)) + && !bracesSpan.IsSingleLine(switchExpression.SyntaxTree, cancellationToken: context.CancellationToken)) { ReportAdd(context, arms.Last()); } @@ -224,15 +226,16 @@ private static void AnalyzePropertyPatternClause(SyntaxNodeAnalysisContext conte if (style == TrailingCommaStyle.None) return; - var objectCreation = (PropertyPatternClauseSyntax)context.Node; + var patternClause = (PropertyPatternClauseSyntax)context.Node; - SeparatedSyntaxList subpatterns = objectCreation.Subpatterns; + SeparatedSyntaxList subpatterns = patternClause.Subpatterns; if (!subpatterns.Any()) return; int count = subpatterns.Count; int separatorCount = subpatterns.SeparatorCount; + TextSpan bracesSpan = TextSpan.FromBounds(patternClause.OpenBraceToken.SpanStart, patternClause.CloseBraceToken.Span.End); if (count == separatorCount) { @@ -241,7 +244,7 @@ private static void AnalyzePropertyPatternClause(SyntaxNodeAnalysisContext conte ReportRemove(context, subpatterns.GetSeparator(count - 1)); } else if (style == TrailingCommaStyle.OmitWhenSingleLine - && subpatterns.IsSingleLine(cancellationToken: context.CancellationToken)) + && bracesSpan.IsSingleLine(patternClause.SyntaxTree, cancellationToken: context.CancellationToken)) { ReportRemove(context, subpatterns.GetSeparator(count - 1)); } @@ -253,7 +256,7 @@ private static void AnalyzePropertyPatternClause(SyntaxNodeAnalysisContext conte ReportAdd(context, subpatterns.Last()); } else if (style == TrailingCommaStyle.OmitWhenSingleLine - && !subpatterns.IsSingleLine(cancellationToken: context.CancellationToken)) + && !bracesSpan.IsSingleLine(patternClause.SyntaxTree, cancellationToken: context.CancellationToken)) { ReportAdd(context, subpatterns.Last()); } @@ -268,15 +271,16 @@ private static void AnalyzeCollectionExpression(SyntaxNodeAnalysisContext contex if (style == TrailingCommaStyle.None) return; - var objectCreation = (CollectionExpressionSyntax)context.Node; + var collectionExpression = (CollectionExpressionSyntax)context.Node; - SeparatedSyntaxList elements = objectCreation.Elements; + SeparatedSyntaxList elements = collectionExpression.Elements; if (!elements.Any()) return; int count = elements.Count; int separatorCount = elements.SeparatorCount; + TextSpan bracesSpan = TextSpan.FromBounds(collectionExpression.OpenBracketToken.SpanStart, collectionExpression.CloseBracketToken.Span.End); if (count == separatorCount) { @@ -285,7 +289,7 @@ private static void AnalyzeCollectionExpression(SyntaxNodeAnalysisContext contex ReportRemove(context, elements.GetSeparator(count - 1)); } else if (style == TrailingCommaStyle.OmitWhenSingleLine - && elements.IsSingleLine(cancellationToken: context.CancellationToken)) + && bracesSpan.IsSingleLine(collectionExpression.SyntaxTree, cancellationToken: context.CancellationToken)) { ReportRemove(context, elements.GetSeparator(count - 1)); } @@ -297,7 +301,7 @@ private static void AnalyzeCollectionExpression(SyntaxNodeAnalysisContext contex ReportAdd(context, elements.Last()); } else if (style == TrailingCommaStyle.OmitWhenSingleLine - && !elements.IsSingleLine(cancellationToken: context.CancellationToken)) + && !bracesSpan.IsSingleLine(collectionExpression.SyntaxTree, cancellationToken: context.CancellationToken)) { ReportAdd(context, elements.Last()); } diff --git a/src/Tests/Analyzers.Tests/RCS1260AddOrRemoveTrailingCommaTests.cs b/src/Tests/Analyzers.Tests/RCS1260AddOrRemoveTrailingCommaTests.cs index 3c23e93902..065137a18c 100644 --- a/src/Tests/Analyzers.Tests/RCS1260AddOrRemoveTrailingCommaTests.cs +++ b/src/Tests/Analyzers.Tests/RCS1260AddOrRemoveTrailingCommaTests.cs @@ -108,6 +108,56 @@ void M() """, options: Options.AddConfigOption(ConfigOptionKeys.TrailingCommaStyle, ConfigOptionValues.TrailingCommaStyle_Include)); } + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.AddOrRemoveTrailingComma)] + public async Task Test_ArrayInitializer_OmitWhenSingleLine() + { + await VerifyDiagnosticAndFixAsync(""" +class C +{ + void M() + { + var arr = new[] + { + ""[||] + }; + } +} +""", """ +class C +{ + void M() + { + var arr = new[] + { + "", + }; + } +} +""", options: Options.AddConfigOption(ConfigOptionKeys.TrailingCommaStyle, ConfigOptionValues.TrailingCommaStyle_OmitWhenSingleLine)); + } + + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.AddOrRemoveTrailingComma)] + public async Task Test_ArrayInitializer_OmitWhenSingleLine2() + { + await VerifyDiagnosticAndFixAsync(""" +class C +{ + void M() + { + var arr = new[] { ""[|,|] }; + } +} +""", """ +class C +{ + void M() + { + var arr = new[] { "" }; + } +} +""", options: Options.AddConfigOption(ConfigOptionKeys.TrailingCommaStyle, ConfigOptionValues.TrailingCommaStyle_OmitWhenSingleLine)); + } + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.AddOrRemoveTrailingComma)] public async Task Test_ArrayInitializer_Omit() { From ec37fbf015ceb7fe0ba11906656285b8e5b8c346 Mon Sep 17 00:00:00 2001 From: Josef Pihrt Date: Sun, 31 Aug 2025 11:39:08 +0200 Subject: [PATCH 2/5] changelog --- ChangeLog.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index 0b387e81d5..30efe20133 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -21,6 +21,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fix analyzer [RCS1043](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS1043) ([PR](https://github.com/dotnet/roslynator/pull/1684)) - Fix refactoring [Check expression for null](https://josefpihrt.github.io/docs/roslynator/refactorings/RR0024) ([PR](https://github.com/dotnet/roslynator/pull/1682)) +### Changed + +- Change behavior of analyzer [RCS1206](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS1206) by default ([PR](https://github.com/dotnet/roslynator/pull/1685)) + - The condition for option `omit_when_single_line` is that the braces/brackets are on the same line, not just the expression in the braces/brackets + ## [4.14.0] - 2025-07-26 ### Added From 0557b55a89a386dbad2f47a9460e425e61dcce19 Mon Sep 17 00:00:00 2001 From: Josef Pihrt Date: Sun, 31 Aug 2025 12:02:44 +0200 Subject: [PATCH 3/5] fix --- .../CSharp/Analysis/AddOrRemoveTrailingCommaAnalyzer.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Analyzers/CSharp/Analysis/AddOrRemoveTrailingCommaAnalyzer.cs b/src/Analyzers/CSharp/Analysis/AddOrRemoveTrailingCommaAnalyzer.cs index 651ec1da98..8ead2e12f7 100644 --- a/src/Analyzers/CSharp/Analysis/AddOrRemoveTrailingCommaAnalyzer.cs +++ b/src/Analyzers/CSharp/Analysis/AddOrRemoveTrailingCommaAnalyzer.cs @@ -104,6 +104,7 @@ private static void AnalyzeEnumDeclaration(SyntaxNodeAnalysisContext context) int count = members.Count; int separatorCount = members.SeparatorCount; + TextSpan bracesSpan = TextSpan.FromBounds(enumDeclaration.OpenBraceToken.SpanStart, enumDeclaration.CloseBraceToken.Span.End); if (count == separatorCount) { @@ -112,7 +113,7 @@ private static void AnalyzeEnumDeclaration(SyntaxNodeAnalysisContext context) ReportRemove(context, members.GetSeparator(count - 1)); } else if (style == TrailingCommaStyle.OmitWhenSingleLine - && enumDeclaration.IsSingleLine(cancellationToken: context.CancellationToken)) + && bracesSpan.IsSingleLine(enumDeclaration.SyntaxTree, cancellationToken: context.CancellationToken)) { ReportRemove(context, members.GetSeparator(count - 1)); } @@ -124,7 +125,7 @@ private static void AnalyzeEnumDeclaration(SyntaxNodeAnalysisContext context) ReportAdd(context, members.Last()); } else if (style == TrailingCommaStyle.OmitWhenSingleLine - && !enumDeclaration.IsSingleLine(cancellationToken: context.CancellationToken)) + && !bracesSpan.IsSingleLine(enumDeclaration.SyntaxTree, cancellationToken: context.CancellationToken)) { ReportAdd(context, members.Last()); } From f60276bde5b1ca60dce87d6b97c26e8360cef502 Mon Sep 17 00:00:00 2001 From: Josef Pihrt Date: Sun, 31 Aug 2025 15:29:12 +0200 Subject: [PATCH 4/5] changelog --- ChangeLog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index 30efe20133..76fd863d01 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -24,7 +24,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Change behavior of analyzer [RCS1206](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS1206) by default ([PR](https://github.com/dotnet/roslynator/pull/1685)) - - The condition for option `omit_when_single_line` is that the braces/brackets are on the same line, not just the expression in the braces/brackets + - The condition for option `omit_when_single_line` will be that the braces/brackets are on the same line, not just the expression in the braces/brackets ## [4.14.0] - 2025-07-26 From bb6b1ccb1e72c2ce89ea987eb1df83ca78132801 Mon Sep 17 00:00:00 2001 From: Josef Pihrt Date: Sun, 31 Aug 2025 15:47:57 +0200 Subject: [PATCH 5/5] changelog --- ChangeLog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index 76fd863d01..12f626c68d 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -23,7 +23,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed -- Change behavior of analyzer [RCS1206](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS1206) by default ([PR](https://github.com/dotnet/roslynator/pull/1685)) +- Change behavior of analyzer [RCS1206](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS1206) ([PR](https://github.com/dotnet/roslynator/pull/1685)) - The condition for option `omit_when_single_line` will be that the braces/brackets are on the same line, not just the expression in the braces/brackets ## [4.14.0] - 2025-07-26