diff --git a/ChangeLog.md b/ChangeLog.md index 62e4256d4c..ce750ff83b 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -25,6 +25,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [CLI] Fix filtering of projects (relates to `--projects` or `--ignored-projects` parameter) ([#914](https://github.com/josefpihrt/roslynator/pull/914)). - Refactoring "Add using directive" (RR0014) now works when file-scoped namespace is used ([#932](https://github.com/josefpihrt/roslynator/pull/932)). +- Add parentheses if necessary in a code fix for [RCS1197](https://github.com/JosefPihrt/Roslynator/blob/main/docs/analyzers/RCS1197.md) ([#928](https://github.com/josefpihrt/roslynator/pull/928) by @karl-sjogren). ----- diff --git a/src/Analyzers.CodeFixes/CSharp/CodeFixes/OptimizeStringBuilderAppendCallCodeFixProvider.cs b/src/Analyzers.CodeFixes/CSharp/CodeFixes/OptimizeStringBuilderAppendCallCodeFixProvider.cs index 6c9e1081dc..85a63747ad 100644 --- a/src/Analyzers.CodeFixes/CSharp/CodeFixes/OptimizeStringBuilderAppendCallCodeFixProvider.cs +++ b/src/Analyzers.CodeFixes/CSharp/CodeFixes/OptimizeStringBuilderAppendCallCodeFixProvider.cs @@ -264,7 +264,7 @@ private static InvocationExpressionSyntax CreateInvocationExpression( Argument( SubtractExpression( SimpleMemberAccessExpression(invocationInfo.Expression, IdentifierName("Length")), - arguments[0].Expression))); + arguments[0].Expression.Parenthesize()))); return CreateNewInvocationExpression(outerInvocationExpression, "Append", argumentList); } diff --git a/src/Tests/Analyzers.Tests/RCS1197OptimizeStringBuilderAppendCallTests.cs b/src/Tests/Analyzers.Tests/RCS1197OptimizeStringBuilderAppendCallTests.cs index b83a65dfbb..123b11d7e9 100644 --- a/src/Tests/Analyzers.Tests/RCS1197OptimizeStringBuilderAppendCallTests.cs +++ b/src/Tests/Analyzers.Tests/RCS1197OptimizeStringBuilderAppendCallTests.cs @@ -44,6 +44,42 @@ void M() "); } + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.OptimizeStringBuilderAppendCall)] + public async Task Test_Substring_Int32_Int32_Calculation() + { + await VerifyDiagnosticAndFixAsync(@" +using System.Text; + +class C +{ + void M() + { + string s = null; + var start = 2; + var len = 5; + var sb = new StringBuilder(); + + sb.Append([|s.Substring(start + len)|]); + } +} +", @" +using System.Text; + +class C +{ + void M() + { + string s = null; + var start = 2; + var len = 5; + var sb = new StringBuilder(); + + sb.Append(s, start + len, s.Length - (start + len)); + } +} +"); + } + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.OptimizeStringBuilderAppendCall)] public async Task Test_Substring_Int32() {