From 02d3ef929eca0109366e421d161c3322ea6a330d Mon Sep 17 00:00:00 2001 From: DoctorKrolic Date: Sat, 9 Apr 2022 23:10:04 +0300 Subject: [PATCH 1/3] Trim unnessasary leading lines when removing usings --- .../RemoveUnnecessaryImportsTests.cs | 34 +++++++++++++++++++ .../RemoveUnnecessaryImportsTests.vb | 24 +++++++++++++ ...emoveUnnecessaryImportsService.Rewriter.cs | 21 +++++++++++- ...emoveUnnecessaryImportsService.Rewriter.vb | 16 +++++++++ 4 files changed, 94 insertions(+), 1 deletion(-) diff --git a/src/Analyzers/CSharp/Tests/RemoveUnnecessaryImports/RemoveUnnecessaryImportsTests.cs b/src/Analyzers/CSharp/Tests/RemoveUnnecessaryImports/RemoveUnnecessaryImportsTests.cs index 9955d78a33589..915aaa8b22d0d 100644 --- a/src/Analyzers/CSharp/Tests/RemoveUnnecessaryImports/RemoveUnnecessaryImportsTests.cs +++ b/src/Analyzers/CSharp/Tests/RemoveUnnecessaryImports/RemoveUnnecessaryImportsTests.cs @@ -1984,5 +1984,39 @@ static void Main(string[] args) LanguageVersion = LanguageVersion.CSharp10, }.RunAsync(); } + + [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsRemoveUnnecessaryImports)] + [WorkItem(45866, "https://github.com/dotnet/roslyn/issues/45866")] + public async Task TestUsingGroups_DeleteLeadingBlankLinesIfFirstGroupWasDeleted() + { + await new VerifyCS.Test + { + TestCode = +@"[|{|IDE0005:using System;|} + +using System.Collections.Generic;|] + +class Program +{ + static void Main(string[] args) + { + var argList = new List(args); + } +} +", + FixedCode = +@"using System.Collections.Generic; + +class Program +{ + static void Main(string[] args) + { + var argList = new List(args); + } +} +", + LanguageVersion = LanguageVersion.CSharp9, + }.RunAsync(); + } } } diff --git a/src/Analyzers/VisualBasic/Tests/RemoveUnnecessaryImports/RemoveUnnecessaryImportsTests.vb b/src/Analyzers/VisualBasic/Tests/RemoveUnnecessaryImports/RemoveUnnecessaryImportsTests.vb index 3c1a0f3a09889..0a784c99b6fb0 100644 --- a/src/Analyzers/VisualBasic/Tests/RemoveUnnecessaryImports/RemoveUnnecessaryImportsTests.vb +++ b/src/Analyzers/VisualBasic/Tests/RemoveUnnecessaryImports/RemoveUnnecessaryImportsTests.vb @@ -1214,5 +1214,29 @@ Imports System Event E() End Class|]") End Function + + + + Public Async Function TestImportGroup_DeleteLeadingBlankLinesIfFirstGroupWasDeleted() As Task + Await TestInRegularAndScript1Async( +"[|Imports System.Threading.Tasks + +Imports System|] + +Class C + Function Test() + Console.WriteLine() + End Function +End Class +", +"Imports System + +Class C + Function Test() + Console.WriteLine() + End Function +End Class +") + End Function End Class End Namespace diff --git a/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/CSharp/LanguageServices/CSharpRemoveUnnecessaryImportsService.Rewriter.cs b/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/CSharp/LanguageServices/CSharpRemoveUnnecessaryImportsService.Rewriter.cs index abb7598f08d4a..2c1e80aac29cc 100644 --- a/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/CSharp/LanguageServices/CSharpRemoveUnnecessaryImportsService.Rewriter.cs +++ b/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/CSharp/LanguageServices/CSharpRemoveUnnecessaryImportsService.Rewriter.cs @@ -9,7 +9,6 @@ using System.Linq; using System.Threading; using Microsoft.CodeAnalysis.CSharp.Extensions; -using Microsoft.CodeAnalysis.CSharp.Formatting; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Shared.Extensions; using Roslyn.Utilities; @@ -48,6 +47,9 @@ private static void ProcessUsings( out SyntaxTriviaList finalTrivia) { var currentUsings = new List(usings); + var firstUsingGroup = true; + var hasDeletedUsings = false; + var passedLeadngTrivia = false; finalTrivia = default; for (var i = 0; i < usings.Count; i++) @@ -56,6 +58,7 @@ private static void ProcessUsings( { var currentUsing = currentUsings[i]; currentUsings[i] = null; + hasDeletedUsings = true; var leadingTrivia = currentUsing.GetLeadingTrivia(); // We always preserve trivia on the first using in a file scoped namespace @@ -83,6 +86,8 @@ private static void ProcessUsings( // want to preserve. currentUsings[nextIndex] = nextUsing.WithLeadingTrivia(leadingTrivia); } + + passedLeadngTrivia = true; } else { @@ -90,6 +95,20 @@ private static void ProcessUsings( } } } + else + { + if (firstUsingGroup) + { + if (hasDeletedUsings && !passedLeadngTrivia) + { + var currentUsing = currentUsings[i]; + var currentUsingLeadingTrivia = currentUsing.GetLeadingTrivia(); + currentUsings[i] = currentUsing.WithLeadingTrivia(currentUsingLeadingTrivia.WithoutLeadingBlankLines()); + } + + firstUsingGroup = false; + } + } } finalUsings = currentUsings.WhereNotNull().ToSyntaxList(); diff --git a/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/VisualBasic/LanguageServices/VisualBasicRemoveUnnecessaryImportsService.Rewriter.vb b/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/VisualBasic/LanguageServices/VisualBasicRemoveUnnecessaryImportsService.Rewriter.vb index d04c47dba064e..49b2c3f253b46 100644 --- a/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/VisualBasic/LanguageServices/VisualBasicRemoveUnnecessaryImportsService.Rewriter.vb +++ b/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/VisualBasic/LanguageServices/VisualBasicRemoveUnnecessaryImportsService.Rewriter.vb @@ -39,6 +39,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.RemoveUnnecessaryImports Private Function ProcessImports(compilationUnit As CompilationUnitSyntax) As CompilationUnitSyntax Dim oldImports = compilationUnit.Imports.ToList() + Dim firstImportGroup = True + Dim hasDeletedImports = False + Dim passedLeadingTrivia = False Dim remainingTrivia As SyntaxTriviaList = Nothing For i = 0 To oldImports.Count - 1 @@ -46,6 +49,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.RemoveUnnecessaryImports If oldImport.HasAnnotation(_annotation) Then ' Found a node we marked to delete. Remove it. oldImports(i) = Nothing + hasDeletedImports = True Dim leadingTrivia = oldImport.GetLeadingTrivia() If ShouldPreserveTrivia(leadingTrivia) Then @@ -65,6 +69,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.RemoveUnnecessaryImports ' want to preserve. oldImports(nextIndex) = nextImport.WithLeadingTrivia(leadingTrivia) End If + + passedLeadingTrivia = True Else remainingTrivia = leadingTrivia End If @@ -85,6 +91,16 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.RemoveUnnecessaryImports oldImports(index) = previousImport.WithTrailingTrivia(trailingTrivia) End If End If + Else + If firstImportGroup Then + If hasDeletedImports AndAlso Not passedLeadingTrivia Then + Dim currentImport = oldImports(i) + Dim currentImportLeadingTrivia = currentImport.GetLeadingTrivia() + oldImports(i) = currentImport.WithLeadingTrivia(currentImportLeadingTrivia.WithoutLeadingWhitespaceOrEndOfLine()) + End If + + firstImportGroup = False + End If End If Next From fef5ba3e318c75a59694ad6261ee0e26f78db981 Mon Sep 17 00:00:00 2001 From: DoctorKrolic Date: Sat, 9 Apr 2022 23:29:58 +0300 Subject: [PATCH 2/3] Deleted unnessasary flag, renamed other one --- .../CSharpRemoveUnnecessaryImportsService.Rewriter.cs | 10 ++++------ ...ualBasicRemoveUnnecessaryImportsService.Rewriter.vb | 10 ++++------ 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/CSharp/LanguageServices/CSharpRemoveUnnecessaryImportsService.Rewriter.cs b/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/CSharp/LanguageServices/CSharpRemoveUnnecessaryImportsService.Rewriter.cs index 2c1e80aac29cc..f3199aadb7c22 100644 --- a/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/CSharp/LanguageServices/CSharpRemoveUnnecessaryImportsService.Rewriter.cs +++ b/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/CSharp/LanguageServices/CSharpRemoveUnnecessaryImportsService.Rewriter.cs @@ -47,8 +47,7 @@ private static void ProcessUsings( out SyntaxTriviaList finalTrivia) { var currentUsings = new List(usings); - var firstUsingGroup = true; - var hasDeletedUsings = false; + var onlyDeletedUsingsBefore = true; var passedLeadngTrivia = false; finalTrivia = default; @@ -58,7 +57,6 @@ private static void ProcessUsings( { var currentUsing = currentUsings[i]; currentUsings[i] = null; - hasDeletedUsings = true; var leadingTrivia = currentUsing.GetLeadingTrivia(); // We always preserve trivia on the first using in a file scoped namespace @@ -97,16 +95,16 @@ private static void ProcessUsings( } else { - if (firstUsingGroup) + if (onlyDeletedUsingsBefore) { - if (hasDeletedUsings && !passedLeadngTrivia) + if (i > 0 && !passedLeadngTrivia) { var currentUsing = currentUsings[i]; var currentUsingLeadingTrivia = currentUsing.GetLeadingTrivia(); currentUsings[i] = currentUsing.WithLeadingTrivia(currentUsingLeadingTrivia.WithoutLeadingBlankLines()); } - firstUsingGroup = false; + onlyDeletedUsingsBefore = false; } } } diff --git a/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/VisualBasic/LanguageServices/VisualBasicRemoveUnnecessaryImportsService.Rewriter.vb b/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/VisualBasic/LanguageServices/VisualBasicRemoveUnnecessaryImportsService.Rewriter.vb index 49b2c3f253b46..07ba66f00867e 100644 --- a/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/VisualBasic/LanguageServices/VisualBasicRemoveUnnecessaryImportsService.Rewriter.vb +++ b/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/VisualBasic/LanguageServices/VisualBasicRemoveUnnecessaryImportsService.Rewriter.vb @@ -39,8 +39,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.RemoveUnnecessaryImports Private Function ProcessImports(compilationUnit As CompilationUnitSyntax) As CompilationUnitSyntax Dim oldImports = compilationUnit.Imports.ToList() - Dim firstImportGroup = True - Dim hasDeletedImports = False + Dim onlyDeletedImportsBefore = True Dim passedLeadingTrivia = False Dim remainingTrivia As SyntaxTriviaList = Nothing @@ -49,7 +48,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.RemoveUnnecessaryImports If oldImport.HasAnnotation(_annotation) Then ' Found a node we marked to delete. Remove it. oldImports(i) = Nothing - hasDeletedImports = True Dim leadingTrivia = oldImport.GetLeadingTrivia() If ShouldPreserveTrivia(leadingTrivia) Then @@ -92,14 +90,14 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.RemoveUnnecessaryImports End If End If Else - If firstImportGroup Then - If hasDeletedImports AndAlso Not passedLeadingTrivia Then + If onlyDeletedImportsBefore Then + If i > 0 AndAlso Not passedLeadingTrivia Then Dim currentImport = oldImports(i) Dim currentImportLeadingTrivia = currentImport.GetLeadingTrivia() oldImports(i) = currentImport.WithLeadingTrivia(currentImportLeadingTrivia.WithoutLeadingWhitespaceOrEndOfLine()) End If - firstImportGroup = False + onlyDeletedImportsBefore = False End If End If Next From 0181fe86091215c03be91be248e791c57f91188e Mon Sep 17 00:00:00 2001 From: DoctorKrolic Date: Sun, 10 Apr 2022 13:24:55 +0300 Subject: [PATCH 3/3] PR feedback --- .../RemoveUnnecessaryImportsTests.cs | 109 +++++++++++++++++- .../RemoveUnnecessaryImportsTests.vb | 81 ++++++++++++- ...emoveUnnecessaryImportsService.Rewriter.cs | 33 ++++-- ...emoveUnnecessaryImportsService.Rewriter.vb | 32 +++-- 4 files changed, 231 insertions(+), 24 deletions(-) diff --git a/src/Analyzers/CSharp/Tests/RemoveUnnecessaryImports/RemoveUnnecessaryImportsTests.cs b/src/Analyzers/CSharp/Tests/RemoveUnnecessaryImports/RemoveUnnecessaryImportsTests.cs index 915aaa8b22d0d..e2f714c21ccc6 100644 --- a/src/Analyzers/CSharp/Tests/RemoveUnnecessaryImports/RemoveUnnecessaryImportsTests.cs +++ b/src/Analyzers/CSharp/Tests/RemoveUnnecessaryImports/RemoveUnnecessaryImportsTests.cs @@ -1987,7 +1987,7 @@ static void Main(string[] args) [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsRemoveUnnecessaryImports)] [WorkItem(45866, "https://github.com/dotnet/roslyn/issues/45866")] - public async Task TestUsingGroups_DeleteLeadingBlankLinesIfFirstGroupWasDeleted() + public async Task TestUsingGroups_DeleteLeadingBlankLinesIfFirstGroupWasDeleted_SingleUsing() { await new VerifyCS.Test { @@ -2007,6 +2007,29 @@ static void Main(string[] args) FixedCode = @"using System.Collections.Generic; +class Program +{ + static void Main(string[] args) + { + var argList = new List(args); + } +} +" + }.RunAsync(); + } + + [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsRemoveUnnecessaryImports)] + [WorkItem(45866, "https://github.com/dotnet/roslyn/issues/45866")] + public async Task TestUsingGroups_DeleteLeadingBlankLinesIfFirstGroupWasDeleted_MultipleUsings() + { + await new VerifyCS.Test + { + TestCode = +@"[|{|IDE0005:using System; +using System.Threading.Tasks;|} + +using System.Collections.Generic;|] + class Program { static void Main(string[] args) @@ -2015,7 +2038,89 @@ static void Main(string[] args) } } ", - LanguageVersion = LanguageVersion.CSharp9, + FixedCode = +@"using System.Collections.Generic; + +class Program +{ + static void Main(string[] args) + { + var argList = new List(args); + } +} +" + }.RunAsync(); + } + + [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsRemoveUnnecessaryImports)] + [WorkItem(45866, "https://github.com/dotnet/roslyn/issues/45866")] + public async Task TestUsingGroups_NotAllFirstGroupIsDeleted() + { + await new VerifyCS.Test + { + TestCode = +@"[|{|IDE0005:using System;|} +using System.Threading.Tasks; + +using System.Collections.Generic;|] + +class Program +{ + static void Main(string[] args) + { + var argList = new List(args); + Task task = null; + } +} +", + FixedCode = +@"using System.Threading.Tasks; + +using System.Collections.Generic; + +class Program +{ + static void Main(string[] args) + { + var argList = new List(args); + Task task = null; + } +} +" + }.RunAsync(); + } + + [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsRemoveUnnecessaryImports)] + [WorkItem(45866, "https://github.com/dotnet/roslyn/issues/45866")] + public async Task TestUsingGroups_AllLastGroupIsDeleted() + { + await new VerifyCS.Test + { + TestCode = +@"[|using System.Collections.Generic; + +{|IDE0005:using System; +using System.Threading.Tasks;|}|] + +class Program +{ + static void Main(string[] args) + { + var argList = new List(args); + } +} +", + FixedCode = +@"using System.Collections.Generic; + +class Program +{ + static void Main(string[] args) + { + var argList = new List(args); + } +} +" }.RunAsync(); } } diff --git a/src/Analyzers/VisualBasic/Tests/RemoveUnnecessaryImports/RemoveUnnecessaryImportsTests.vb b/src/Analyzers/VisualBasic/Tests/RemoveUnnecessaryImports/RemoveUnnecessaryImportsTests.vb index 0a784c99b6fb0..313984f4194a0 100644 --- a/src/Analyzers/VisualBasic/Tests/RemoveUnnecessaryImports/RemoveUnnecessaryImportsTests.vb +++ b/src/Analyzers/VisualBasic/Tests/RemoveUnnecessaryImports/RemoveUnnecessaryImportsTests.vb @@ -1217,7 +1217,7 @@ End Class|]") - Public Async Function TestImportGroup_DeleteLeadingBlankLinesIfFirstGroupWasDeleted() As Task + Public Async Function TestImportGroup_DeleteLeadingBlankLinesIfFirstGroupWasDeleted_SingleImport() As Task Await TestInRegularAndScript1Async( "[|Imports System.Threading.Tasks @@ -1231,6 +1231,85 @@ End Class ", "Imports System +Class C + Function Test() + Console.WriteLine() + End Function +End Class +") + End Function + + + + Public Async Function TestImportGroup_DeleteLeadingBlankLinesIfFirstGroupWasDeleted_MultipleImports() As Task + Await TestInRegularAndScript1Async( +"[|Imports System.Threading.Tasks +Imports System.Collections.Generic + +Imports System|] + +Class C + Function Test() + Console.WriteLine() + End Function +End Class +", +"Imports System + +Class C + Function Test() + Console.WriteLine() + End Function +End Class +") + End Function + + + + Public Async Function TestImportGroup_NotAllFirstGroupIsDeleted() As Task + Await TestInRegularAndScript1Async( +"[|Imports System.Threading.Tasks +Imports System.Collections.Generic + +Imports System|] + +Class C + Function Test() + Console.WriteLine() + Dim list As List(Of Integer) = Nothing + End Function +End Class +", +"Imports System.Collections.Generic + +Imports System + +Class C + Function Test() + Console.WriteLine() + Dim list As List(Of Integer) = Nothing + End Function +End Class +") + End Function + + + + Public Async Function TestImportGroup_AllLastGroupIsDeleted() As Task + Await TestInRegularAndScript1Async( +"[|Imports System + +Imports System.Threading.Tasks +Imports System.Collections.Generic|] + +Class C + Function Test() + Console.WriteLine() + End Function +End Class +", +"Imports System + Class C Function Test() Console.WriteLine() diff --git a/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/CSharp/LanguageServices/CSharpRemoveUnnecessaryImportsService.Rewriter.cs b/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/CSharp/LanguageServices/CSharpRemoveUnnecessaryImportsService.Rewriter.cs index f3199aadb7c22..58d544ab8a313 100644 --- a/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/CSharp/LanguageServices/CSharpRemoveUnnecessaryImportsService.Rewriter.cs +++ b/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/CSharp/LanguageServices/CSharpRemoveUnnecessaryImportsService.Rewriter.cs @@ -47,7 +47,7 @@ private static void ProcessUsings( out SyntaxTriviaList finalTrivia) { var currentUsings = new List(usings); - var onlyDeletedUsingsBefore = true; + var firstUsingNotBeingRemoved = true; var passedLeadngTrivia = false; finalTrivia = default; @@ -93,19 +93,30 @@ private static void ProcessUsings( } } } - else + else if (firstUsingNotBeingRemoved) { - if (onlyDeletedUsingsBefore) + // 1) We only apply this logic for not first using, that is saved: + // =================== + // namespace N; + // + // using System; <- if we save this using, we don't need to cut leading lines + // =================== + // 2) If leading trivia was saved from the previous using, that was removed, + // we don't bother cutting blank lines as well: + // =================== + // namespace N; + // + // using System; <- need to delete this using + // using System.Collections.Generic; <- this using is saved, no need to eat the line, + // otherwise https://github.com/dotnet/roslyn/issues/58972 will happen + if (i > 0 && !passedLeadngTrivia) { - if (i > 0 && !passedLeadngTrivia) - { - var currentUsing = currentUsings[i]; - var currentUsingLeadingTrivia = currentUsing.GetLeadingTrivia(); - currentUsings[i] = currentUsing.WithLeadingTrivia(currentUsingLeadingTrivia.WithoutLeadingBlankLines()); - } - - onlyDeletedUsingsBefore = false; + var currentUsing = currentUsings[i]; + var currentUsingLeadingTrivia = currentUsing.GetLeadingTrivia(); + currentUsings[i] = currentUsing.WithLeadingTrivia(currentUsingLeadingTrivia.WithoutLeadingBlankLines()); } + + firstUsingNotBeingRemoved = false; } } diff --git a/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/VisualBasic/LanguageServices/VisualBasicRemoveUnnecessaryImportsService.Rewriter.vb b/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/VisualBasic/LanguageServices/VisualBasicRemoveUnnecessaryImportsService.Rewriter.vb index 07ba66f00867e..65e9b36a8ac75 100644 --- a/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/VisualBasic/LanguageServices/VisualBasicRemoveUnnecessaryImportsService.Rewriter.vb +++ b/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/VisualBasic/LanguageServices/VisualBasicRemoveUnnecessaryImportsService.Rewriter.vb @@ -39,7 +39,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.RemoveUnnecessaryImports Private Function ProcessImports(compilationUnit As CompilationUnitSyntax) As CompilationUnitSyntax Dim oldImports = compilationUnit.Imports.ToList() - Dim onlyDeletedImportsBefore = True + Dim firstImportNotBeingRemoved = True Dim passedLeadingTrivia = False Dim remainingTrivia As SyntaxTriviaList = Nothing @@ -89,16 +89,28 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.RemoveUnnecessaryImports oldImports(index) = previousImport.WithTrailingTrivia(trailingTrivia) End If End If - Else - If onlyDeletedImportsBefore Then - If i > 0 AndAlso Not passedLeadingTrivia Then - Dim currentImport = oldImports(i) - Dim currentImportLeadingTrivia = currentImport.GetLeadingTrivia() - oldImports(i) = currentImport.WithLeadingTrivia(currentImportLeadingTrivia.WithoutLeadingWhitespaceOrEndOfLine()) - End If - - onlyDeletedImportsBefore = False + ElseIf firstImportNotBeingRemoved Then + ' 1) We only apply this logic for Not first using, that is saved: + ' =================== + ' #Const A = 1 + ' + ' Imports System <- if we save this import, we don't need to cut leading lines + ' =================== + ' 2) If leading trivia was saved from the previous import, that was removed, + ' we don't bother cutting blank lines as well: + ' =================== + ' #Const A = 1 + ' + ' Imports System <- need to delete this import + ' Imports System.Collections.Generic <- this import is saved, no need to eat the line, + ' otherwise https://github.com/dotnet/roslyn/issues/58972 will happen + If i > 0 AndAlso Not passedLeadingTrivia Then + Dim currentImport = oldImports(i) + Dim currentImportLeadingTrivia = currentImport.GetLeadingTrivia() + oldImports(i) = currentImport.WithLeadingTrivia(currentImportLeadingTrivia.WithoutLeadingWhitespaceOrEndOfLine()) End If + + firstImportNotBeingRemoved = False End If Next