diff --git a/src/Features/CSharpTest/InvertIf/InvertIfTests.Elseless.cs b/src/Features/CSharpTest/InvertIf/InvertIfTests.Elseless.cs index b69f6484d85c0..f6ab58fcbb1f5 100644 --- a/src/Features/CSharpTest/InvertIf/InvertIfTests.Elseless.cs +++ b/src/Features/CSharpTest/InvertIf/InvertIfTests.Elseless.cs @@ -483,6 +483,76 @@ 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, 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() { diff --git a/src/Features/Core/Portable/InvertIf/AbstractInvertIfCodeRefactoringProvider.cs b/src/Features/Core/Portable/InvertIf/AbstractInvertIfCodeRefactoringProvider.cs index 312b2ebb81871..45959cc1b0c36 100644 --- a/src/Features/Core/Portable/InvertIf/AbstractInvertIfCodeRefactoringProvider.cs +++ b/src/Features/Core/Portable/InvertIf/AbstractInvertIfCodeRefactoringProvider.cs @@ -570,6 +570,11 @@ private SyntaxNode GetRootWithInvertIfStatement( var statementsAfterIf = statements.Skip(index + 1); var ifBody = GetIfBody(ifNode); + //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, ifNode: ifNode, @@ -580,6 +585,11 @@ private SyntaxNode GetRootWithInvertIfStatement( currentParent, statementsBeforeIf.Concat(updatedIf)); + var updatedParentLastToken = updatedParent.ChildTokens().Last(); + updatedParent = updatedParent.ReplaceToken( + updatedParentLastToken, + updatedParentLastToken.WithoutLeadingTrivia()); + return root.ReplaceNode(currentParent, updatedParent.WithAdditionalAnnotations(Formatter.Annotation)); }