diff --git a/ChangeLog.md b/ChangeLog.md index f0629df64f..c490bcb686 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -6,6 +6,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +- Fix [RCS1016](https://github.com/JosefPihrt/Roslynator/blob/main/docs/analyzers/RCS1016.md) ([#1090](https://github.com/josefpihrt/roslynator/pull/1090)). ### Fixed diff --git a/src/CSharp/CSharp/SyntaxRewriters/WhitespaceRemover.cs b/src/CSharp/CSharp/SyntaxRewriters/WhitespaceRemover.cs index a1378653f4..6383b50029 100644 --- a/src/CSharp/CSharp/SyntaxRewriters/WhitespaceRemover.cs +++ b/src/CSharp/CSharp/SyntaxRewriters/WhitespaceRemover.cs @@ -33,10 +33,20 @@ public static WhitespaceRemover GetInstance(TextSpan? span = null) public override SyntaxTrivia VisitTrivia(SyntaxTrivia trivia) { - if (trivia.IsWhitespaceOrEndOfLineTrivia() - && (Span?.Contains(trivia.Span) != false)) - { + if (Span?.Contains(trivia.Span) == false) + return base.VisitTrivia(trivia); + + if (trivia.IsKind(SyntaxKind.WhitespaceTrivia)) return Replacement; + + if (trivia.IsKind(SyntaxKind.EndOfLineTrivia)){ + // We can only safely remove EndOfLineTrivia if it is not proceeded by a SingleLineComment + var triviaIndex = trivia.Token.TrailingTrivia.IndexOf(trivia); + if (triviaIndex == 0) + return Replacement; + var prevTrivia = trivia.Token.TrailingTrivia[triviaIndex - 1]; + if (!prevTrivia.IsKind(SyntaxKind.SingleLineCommentTrivia)) + return Replacement; } return base.VisitTrivia(trivia); diff --git a/src/Tests/Analyzers.Tests/RCS1016UseBlockBodyTests.cs b/src/Tests/Analyzers.Tests/RCS1016UseBlockBodyTests.cs index 5ccf16d561..64f5599bff 100644 --- a/src/Tests/Analyzers.Tests/RCS1016UseBlockBodyTests.cs +++ b/src/Tests/Analyzers.Tests/RCS1016UseBlockBodyTests.cs @@ -246,6 +246,28 @@ string P ", options: Options.AddConfigOption(ConfigOptionKeys.BodyStyle, ConfigOptionValues.BodyStyle_Block)); } + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.UseBlockBodyOrExpressionBody)] + public async Task Test_GetterTrailingComment() + { + await VerifyDiagnosticAndFixAsync(@" +class C +{ + string P [|=> null|]; // some comment +} +", @" +class C +{ + string P + { + get + { + return null;// some comment + } + } +} +", options: Options.AddConfigOption(ConfigOptionKeys.BodyStyle, ConfigOptionValues.BodyStyle_Block)); + } + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.UseBlockBodyOrExpressionBody)] public async Task Test_PropertyWithGetter_MultilineExpression() {