diff --git a/src/NetAnalyzers/CSharp/Microsoft.NetCore.Analyzers/Performance/CSharpUseStringMethodCharOverloadWithSingleCharacters.Fixer.cs b/src/NetAnalyzers/CSharp/Microsoft.NetCore.Analyzers/Performance/CSharpUseStringMethodCharOverloadWithSingleCharacters.Fixer.cs index 7a83248d07..f5fe2be553 100644 --- a/src/NetAnalyzers/CSharp/Microsoft.NetCore.Analyzers/Performance/CSharpUseStringMethodCharOverloadWithSingleCharacters.Fixer.cs +++ b/src/NetAnalyzers/CSharp/Microsoft.NetCore.Analyzers/Performance/CSharpUseStringMethodCharOverloadWithSingleCharacters.Fixer.cs @@ -81,7 +81,7 @@ protected override void ApplyFix( .Select(arg => arg!.Syntax)); var argumentListNode = SyntaxFactory.ArgumentList(SyntaxFactory.SeparatedList(arguments)); - editor.ReplaceNode(oldArgumentListNode, argumentListNode); + editor.ReplaceNode(oldArgumentListNode, argumentListNode.WithTriviaFrom(oldArgumentListNode)); } } } diff --git a/src/NetAnalyzers/UnitTests/Microsoft.NetCore.Analyzers/Performance/UseStringMethodCharOverloadWithSingleCharactersTests.cs b/src/NetAnalyzers/UnitTests/Microsoft.NetCore.Analyzers/Performance/UseStringMethodCharOverloadWithSingleCharactersTests.cs index e75b574383..8923c41fe0 100644 --- a/src/NetAnalyzers/UnitTests/Microsoft.NetCore.Analyzers/Performance/UseStringMethodCharOverloadWithSingleCharactersTests.cs +++ b/src/NetAnalyzers/UnitTests/Microsoft.NetCore.Analyzers/Performance/UseStringMethodCharOverloadWithSingleCharactersTests.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Testing; +using Test.Utilities; using Xunit; using VerifyCS = Test.Utilities.CSharpCodeFixVerifier< Microsoft.CodeAnalysis.CSharp.NetAnalyzers.Microsoft.NetCore.Analyzers.Performance.CSharpUseStringMethodCharOverloadWithSingleCharacters, @@ -119,6 +120,47 @@ await VerifyCSAsync( }); } + [Fact] + [WorkItem(6930, "https://github.com/dotnet/roslyn-analyzers/issues/6930")] + public async Task CS_PreservesTrivia() + { + var testCode = $$""" + using System; + + public class TestClass + { + public void TestMethod(string str) + { + if (str != "abc" + || 2 == str.IndexOf{|CA1865:(".", StringComparison.Ordinal)|} + || str == "test") + { + return; + } + } + } + """; + + var fixedCode = $$""" + using System; + + public class TestClass + { + public void TestMethod(string str) + { + if (str != "abc" + || 2 == str.IndexOf('.') + || str == "test") + { + return; + } + } + } + """; + + await VerifyCSAsync(testCode, ReferenceAssemblies.NetStandard.NetStandard21, fixedCode); + } + [Theory] [MemberData(nameof(IndexOfLastIndexOfMethods))] public async Task CS_IndexOfLastIndexOf_PreservesStartsIndexAndCount(string method) @@ -346,6 +388,41 @@ End Class await VerifyVBAsync(testCode, ReferenceAssemblies.NetStandard.NetStandard21); } + [Fact] + [WorkItem(6930, "https://github.com/dotnet/roslyn-analyzers/issues/6930")] + public async Task VB_PreservesTrivia() + { + var testCode = $$""" + Imports System + + Public Class TestClass + Public Sub TestMethod(str As String) + If str <> "abc" _ + Or 2 = str.IndexOf{|CA1865:(".", StringComparison.Ordinal)|} _ + Or str = "test" + Return + End If + End Sub + End Class + """; + + var fixedCode = $$""" + Imports System + + Public Class TestClass + Public Sub TestMethod(str As String) + If str <> "abc" _ + Or 2 = str.IndexOf("."c) _ + Or str = "test" + Return + End If + End Sub + End Class + """; + + await VerifyVBAsync(testCode, ReferenceAssemblies.NetStandard.NetStandard21, fixedCode); + } + [Theory] [MemberData(nameof(Methods))] public async Task VB_RegularStringLiteral(string method) diff --git a/src/NetAnalyzers/VisualBasic/Microsoft.NetCore.Analyzers/Performance/BasicUseStringMethodCharOverloadWithSingleCharacters.Fixer.vb b/src/NetAnalyzers/VisualBasic/Microsoft.NetCore.Analyzers/Performance/BasicUseStringMethodCharOverloadWithSingleCharacters.Fixer.vb index 6211ff9f0e..0af3fc0eaf 100644 --- a/src/NetAnalyzers/VisualBasic/Microsoft.NetCore.Analyzers/Performance/BasicUseStringMethodCharOverloadWithSingleCharacters.Fixer.vb +++ b/src/NetAnalyzers/VisualBasic/Microsoft.NetCore.Analyzers/Performance/BasicUseStringMethodCharOverloadWithSingleCharacters.Fixer.vb @@ -71,7 +71,7 @@ Namespace Microsoft.NetCore.VisualBasic.Analyzers.Performance [Select](Function(arg) TryCast(model.GetOperation(arg), IArgumentOperation)).Where(Function(arg) PreserveArgument(arg)).[Select](Function(arg) arg.Syntax)) Dim argumentListNode = SyntaxFactory.ArgumentList(SyntaxFactory.SeparatedList(arguments)) - editor.ReplaceNode(oldArgumentListNode, argumentListNode) + editor.ReplaceNode(oldArgumentListNode, argumentListNode.WithTriviaFrom(oldArgumentListNode)) End Sub End Class End Class