From 639c2315bcb7a110b49141914459fa63c9763f0c Mon Sep 17 00:00:00 2001 From: Josef Pihrt Date: Sun, 9 Aug 2026 18:07:28 +0200 Subject: [PATCH 1/3] fix(analyzers): align RCS1260 single-line check with initializer braces Use brace span for omit_when_single_line on initializer expressions, matching other RCS1260 analyzers. Regression tests for #1439. Fixes #1439. Co-authored-by: Cursor --- .../AddOrRemoveTrailingCommaAnalyzer.cs | 5 ++- .../RCS1260AddOrRemoveTrailingCommaTests.cs | 41 +++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/Analyzers/CSharp/Analysis/AddOrRemoveTrailingCommaAnalyzer.cs b/src/Analyzers/CSharp/Analysis/AddOrRemoveTrailingCommaAnalyzer.cs index 8ead2e12f7..10cf78bd66 100644 --- a/src/Analyzers/CSharp/Analysis/AddOrRemoveTrailingCommaAnalyzer.cs +++ b/src/Analyzers/CSharp/Analysis/AddOrRemoveTrailingCommaAnalyzer.cs @@ -61,6 +61,7 @@ private static void AnalyzeInitializerExpression(SyntaxNodeAnalysisContext conte int count = expressions.Count; int separatorCount = expressions.SeparatorCount; + TextSpan bracesSpan = TextSpan.FromBounds(initializer.OpenBraceToken.SpanStart, initializer.CloseBraceToken.Span.End); if (count == separatorCount) { @@ -69,7 +70,7 @@ private static void AnalyzeInitializerExpression(SyntaxNodeAnalysisContext conte ReportRemove(context, expressions.GetSeparator(count - 1)); } else if (style == TrailingCommaStyle.OmitWhenSingleLine - && initializer.IsSingleLine(cancellationToken: context.CancellationToken)) + && bracesSpan.IsSingleLine(initializer.SyntaxTree, cancellationToken: context.CancellationToken)) { ReportRemove(context, expressions.GetSeparator(count - 1)); } @@ -81,7 +82,7 @@ private static void AnalyzeInitializerExpression(SyntaxNodeAnalysisContext conte ReportAdd(context, expressions.Last()); } else if (style == TrailingCommaStyle.OmitWhenSingleLine - && !initializer.IsSingleLine(cancellationToken: context.CancellationToken)) + && !bracesSpan.IsSingleLine(initializer.SyntaxTree, cancellationToken: context.CancellationToken)) { ReportAdd(context, expressions.Last()); } diff --git a/src/Tests/Analyzers.Tests/RCS1260AddOrRemoveTrailingCommaTests.cs b/src/Tests/Analyzers.Tests/RCS1260AddOrRemoveTrailingCommaTests.cs index 065137a18c..ba0d97d832 100644 --- a/src/Tests/Analyzers.Tests/RCS1260AddOrRemoveTrailingCommaTests.cs +++ b/src/Tests/Analyzers.Tests/RCS1260AddOrRemoveTrailingCommaTests.cs @@ -569,4 +569,45 @@ void M(C p) } """, options: Options.AddConfigOption(ConfigOptionKeys.TrailingCommaStyle, ConfigOptionValues.TrailingCommaStyle_Omit)); } + + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.AddOrRemoveTrailingComma)] + public async Task TestNoDiagnostic_ObjectInitializer_OmitWhenSingleLine_SingleProperty() + { + await VerifyNoDiagnosticAsync(""" +class Object +{ + public string Property1 { get; set; } +} + +class C +{ + void M() + { + var value = new Object + { + Property1 = "Value", + }; + } +} +""", options: Options.AddConfigOption(ConfigOptionKeys.TrailingCommaStyle, ConfigOptionValues.TrailingCommaStyle_OmitWhenSingleLine)); + } + + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.AddOrRemoveTrailingComma)] + public async Task TestNoDiagnostic_CollectionInitializer_OmitWhenSingleLine_SingleElement() + { + await VerifyNoDiagnosticAsync(""" +using System.Collections.Generic; + +class C +{ + void M() + { + var dict = new Dictionary + { + { 1, 2 }, + }; + } +} +""", options: Options.AddConfigOption(ConfigOptionKeys.TrailingCommaStyle, ConfigOptionValues.TrailingCommaStyle_OmitWhenSingleLine)); + } } From 6e92a1277f564b2fa9278763fde7b275192d7c63 Mon Sep 17 00:00:00 2001 From: Josef Pihrt Date: Sun, 9 Aug 2026 18:07:33 +0200 Subject: [PATCH 2/3] chore: add changelog entry for RCS1260 #1439 fix Co-authored-by: Cursor --- ChangeLog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog.md b/ChangeLog.md index 0291904a0d..76739dc3be 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +- Fix analyzer [RCS1260](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS1260) false positive for `omit_when_single_line` on multi-line object/collection initializers ([#1439](https://github.com/dotnet/roslynator/issues/1439)) - Fix analyzer [RCS1046](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS1046) to report `async void` methods without `Async` suffix ([PR](https://github.com/dotnet/roslynator/pull/1790)) - Fix analyzer [RCS1265](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS1265) to not report catch clauses with a `when` filter ([PR](https://github.com/dotnet/roslynator/pull/1789)) - Fix analyzer [RCS0034](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS0034) for types with a primary constructor and multiple constraint clauses ([PR](https://github.com/dotnet/roslynator/pull/1791)) From 2fc0ca82bc1b984e94b66691ff0090034934cab7 Mon Sep 17 00:00:00 2001 From: Josef Pihrt Date: Sun, 9 Aug 2026 18:11:56 +0200 Subject: [PATCH 3/3] chore: add PR link for RCS1260 fix in changelog Co-authored-by: Cursor --- ChangeLog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index 76739dc3be..1de7d55deb 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -9,7 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed -- Fix analyzer [RCS1260](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS1260) false positive for `omit_when_single_line` on multi-line object/collection initializers ([#1439](https://github.com/dotnet/roslynator/issues/1439)) +- Fix analyzer [RCS1260](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS1260) false positive for `omit_when_single_line` on multi-line object/collection initializers ([#1439](https://github.com/dotnet/roslynator/issues/1439)) ([PR](https://github.com/dotnet/roslynator/pull/1808)) - Fix analyzer [RCS1046](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS1046) to report `async void` methods without `Async` suffix ([PR](https://github.com/dotnet/roslynator/pull/1790)) - Fix analyzer [RCS1265](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS1265) to not report catch clauses with a `when` filter ([PR](https://github.com/dotnet/roslynator/pull/1789)) - Fix analyzer [RCS0034](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS0034) for types with a primary constructor and multiple constraint clauses ([PR](https://github.com/dotnet/roslynator/pull/1791))