From 1e5e70670e7ef3b86422f291a78a349640706deb Mon Sep 17 00:00:00 2001 From: Giovanni Braconi Date: Tue, 25 Jun 2024 16:20:49 +0200 Subject: [PATCH 1/4] Fix 'invert if' refactor to properly enclose #region/#endregion blocks --- .../InvertIf/InvertIfTests.Elseless.cs | 32 +++++++++++++++++++ ...AbstractInvertIfCodeRefactoringProvider.cs | 9 ++++++ 2 files changed, 41 insertions(+) diff --git a/src/Features/CSharpTest/InvertIf/InvertIfTests.Elseless.cs b/src/Features/CSharpTest/InvertIf/InvertIfTests.Elseless.cs index b69f6484d85c0..fd5490c039321 100644 --- a/src/Features/CSharpTest/InvertIf/InvertIfTests.Elseless.cs +++ b/src/Features/CSharpTest/InvertIf/InvertIfTests.Elseless.cs @@ -483,6 +483,38 @@ void M() """); } + [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/73917")] + public async Task IfWithoutElse_MoveSubsequentStatementsToIfBody4() + { + await TestAsync(""" + public void SomeMethod() + { + object something = null; + + [||]if (something == null) + { + return; + } + + #region A region + something = new object(); + #endregion + } + """, """ + public void SomeMethod() + { + object something = null; + + if (something != null) + { + #region A region + something = new object(); + #endregion + } + } + """); + } + [Fact] public async Task IfWithoutElse_SwapIfBodyWithSubsequentStatements1() { diff --git a/src/Features/Core/Portable/InvertIf/AbstractInvertIfCodeRefactoringProvider.cs b/src/Features/Core/Portable/InvertIf/AbstractInvertIfCodeRefactoringProvider.cs index 312b2ebb81871..8b1e8cd2c098c 100644 --- a/src/Features/Core/Portable/InvertIf/AbstractInvertIfCodeRefactoringProvider.cs +++ b/src/Features/Core/Portable/InvertIf/AbstractInvertIfCodeRefactoringProvider.cs @@ -570,6 +570,12 @@ private SyntaxNode GetRootWithInvertIfStatement( var statementsAfterIf = statements.Skip(index + 1); var ifBody = GetIfBody(ifNode); + var currentParentClosingBrace = currentParent.ChildTokens().Last(); + var updatedLastStatement = statementsAfterIf.Last().WithTrailingTrivia(currentParentClosingBrace.LeadingTrivia); + + statementsAfterIf = statementsAfterIf.Take(statementsAfterIf.Count() - 1); + statementsAfterIf = statementsAfterIf.Append(updatedLastStatement); + var updatedIf = UpdateIf( text, ifNode: ifNode, @@ -580,6 +586,9 @@ private SyntaxNode GetRootWithInvertIfStatement( currentParent, statementsBeforeIf.Concat(updatedIf)); + var updatedParentClosingBrace = updatedParent.ChildTokens().Last(); + updatedParent = updatedParent.ReplaceToken(updatedParentClosingBrace, updatedParentClosingBrace.WithoutLeadingTrivia()); + return root.ReplaceNode(currentParent, updatedParent.WithAdditionalAnnotations(Formatter.Annotation)); } From 8c25372249d24e128017728ca30ac831ec217b2f Mon Sep 17 00:00:00 2001 From: Giovanni Braconi Date: Wed, 26 Jun 2024 19:22:51 +0200 Subject: [PATCH 2/4] Doc closing brace leading trivia handling --- .../InvertIf/AbstractInvertIfCodeRefactoringProvider.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Features/Core/Portable/InvertIf/AbstractInvertIfCodeRefactoringProvider.cs b/src/Features/Core/Portable/InvertIf/AbstractInvertIfCodeRefactoringProvider.cs index 8b1e8cd2c098c..6c8a54ff83d79 100644 --- a/src/Features/Core/Portable/InvertIf/AbstractInvertIfCodeRefactoringProvider.cs +++ b/src/Features/Core/Portable/InvertIf/AbstractInvertIfCodeRefactoringProvider.cs @@ -570,9 +570,9 @@ private SyntaxNode GetRootWithInvertIfStatement( var statementsAfterIf = statements.Skip(index + 1); var ifBody = GetIfBody(ifNode); + //Get any final structured trivia on the closing brace and move it with the statements var currentParentClosingBrace = currentParent.ChildTokens().Last(); var updatedLastStatement = statementsAfterIf.Last().WithTrailingTrivia(currentParentClosingBrace.LeadingTrivia); - statementsAfterIf = statementsAfterIf.Take(statementsAfterIf.Count() - 1); statementsAfterIf = statementsAfterIf.Append(updatedLastStatement); From db8ed27e4257d8c58c8ecdf2b12fae41766fabb6 Mon Sep 17 00:00:00 2001 From: Giovanni Braconi Date: Thu, 27 Jun 2024 12:19:25 +0200 Subject: [PATCH 3/4] Add switch case block test --- .../InvertIf/InvertIfTests.Elseless.cs | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/Features/CSharpTest/InvertIf/InvertIfTests.Elseless.cs b/src/Features/CSharpTest/InvertIf/InvertIfTests.Elseless.cs index fd5490c039321..f6ab58fcbb1f5 100644 --- a/src/Features/CSharpTest/InvertIf/InvertIfTests.Elseless.cs +++ b/src/Features/CSharpTest/InvertIf/InvertIfTests.Elseless.cs @@ -515,6 +515,44 @@ public void SomeMethod() """); } + [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/73917")] + public async Task IfWithoutElse_MoveSubsequentStatementsToIfBody5() + { + await TestAsync(""" + switch (o) + { + case 1: + something = new object(); + + [||]if (something == null) + { + return; + } + + #region A region + something = new object(); + #endregion + break; + } + """, """ + switch (o) + { + case 1: + something = new object(); + + if (something != null) + { + #region A region + something = new object(); + #endregion + break; + } + + return; + } + """); + } + [Fact] public async Task IfWithoutElse_SwapIfBodyWithSubsequentStatements1() { From 6d69411c69572d3c6affeca528f27b7eb9b8bd8d Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Mon, 20 Jan 2025 13:46:48 -0800 Subject: [PATCH 4/4] Renames --- .../AbstractInvertIfCodeRefactoringProvider.cs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/Features/Core/Portable/InvertIf/AbstractInvertIfCodeRefactoringProvider.cs b/src/Features/Core/Portable/InvertIf/AbstractInvertIfCodeRefactoringProvider.cs index 6c8a54ff83d79..45959cc1b0c36 100644 --- a/src/Features/Core/Portable/InvertIf/AbstractInvertIfCodeRefactoringProvider.cs +++ b/src/Features/Core/Portable/InvertIf/AbstractInvertIfCodeRefactoringProvider.cs @@ -570,11 +570,10 @@ private SyntaxNode GetRootWithInvertIfStatement( var statementsAfterIf = statements.Skip(index + 1); var ifBody = GetIfBody(ifNode); - //Get any final structured trivia on the closing brace and move it with the statements - var currentParentClosingBrace = currentParent.ChildTokens().Last(); - var updatedLastStatement = statementsAfterIf.Last().WithTrailingTrivia(currentParentClosingBrace.LeadingTrivia); - statementsAfterIf = statementsAfterIf.Take(statementsAfterIf.Count() - 1); - statementsAfterIf = statementsAfterIf.Append(updatedLastStatement); + //Get any final structured trivia on the last token of the parent and move it with the statements + statementsAfterIf = statementsAfterIf + .Take(statementsAfterIf.Count() - 1) + .Append(statementsAfterIf.Last().WithTrailingTrivia(currentParent.ChildTokens().Last().LeadingTrivia)); var updatedIf = UpdateIf( text, @@ -586,8 +585,10 @@ private SyntaxNode GetRootWithInvertIfStatement( currentParent, statementsBeforeIf.Concat(updatedIf)); - var updatedParentClosingBrace = updatedParent.ChildTokens().Last(); - updatedParent = updatedParent.ReplaceToken(updatedParentClosingBrace, updatedParentClosingBrace.WithoutLeadingTrivia()); + var updatedParentLastToken = updatedParent.ChildTokens().Last(); + updatedParent = updatedParent.ReplaceToken( + updatedParentLastToken, + updatedParentLastToken.WithoutLeadingTrivia()); return root.ReplaceNode(currentParent, updatedParent.WithAdditionalAnnotations(Formatter.Annotation)); }