diff --git a/ChangeLog.md b/ChangeLog.md index e527077e9e..8eb9ce0c64 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fix analyzer [RCS1246](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS1246) ([PR](https://github.com/dotnet/roslynator/pull/1676)) - Fix analyzer [RCS1248](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS1248) ([PR](https://github.com/dotnet/roslynator/pull/1677)) +- Fix refactoring [Check expression for null](https://josefpihrt.github.io/docs/roslynator/refactorings/RR0024) ([PR](https://github.com/dotnet/roslynator/pull/1682)) ## [4.14.0] - 2025-07-26 diff --git a/src/Refactorings/CSharp/Refactorings/CheckExpressionForNullRefactoring.cs b/src/Refactorings/CSharp/Refactorings/CheckExpressionForNullRefactoring.cs index 21486325d3..827c4fc4c6 100644 --- a/src/Refactorings/CSharp/Refactorings/CheckExpressionForNullRefactoring.cs +++ b/src/Refactorings/CSharp/Refactorings/CheckExpressionForNullRefactoring.cs @@ -253,7 +253,17 @@ private static async Task RefactorAsync( } } - return await document.InsertNodeAfterAsync(statement, CreateNullCheck(expression), cancellationToken).ConfigureAwait(false); + SyntaxNode nodeInList = statement; + IfStatementSyntax nullCheck = CreateNullCheck(expression); + SyntaxNode newNode = nullCheck; + + if (nodeInList.Parent is GlobalStatementSyntax globalStatement) + { + newNode = globalStatement.WithStatement(nullCheck); + nodeInList = globalStatement; + } + + return await document.InsertNodeAfterAsync(nodeInList, newNode, cancellationToken).ConfigureAwait(false); } private static Task RefactorAsync( diff --git a/src/Tests/Refactorings.Tests/RR0024CheckExpressionForNullTests.cs b/src/Tests/Refactorings.Tests/RR0024CheckExpressionForNullTests.cs new file mode 100644 index 0000000000..363bda6f05 --- /dev/null +++ b/src/Tests/Refactorings.Tests/RR0024CheckExpressionForNullTests.cs @@ -0,0 +1,57 @@ +using System.Threading.Tasks; +using Roslynator.Testing.CSharp; +using Xunit; + +namespace Roslynator.CSharp.Refactorings.Tests; + +public class RR0024CheckExpressionForNullTests : AbstractCSharpRefactoringVerifier +{ + public override string RefactoringId { get; } = RefactoringIdentifiers.CheckExpressionForNull; + + [Fact, Trait(Traits.Refactoring, RefactoringIdentifiers.CheckParameterForNull)] + public async Task Test() + { + await VerifyRefactoringAsync(""" +class C +{ + void M() + { + var [|x|] = "".ToString(); + } +} +""", """ +class C +{ + void M() + { + var x = "".ToString(); + if (x != null) + { + + } + } +} +""", equivalenceKey: EquivalenceKey.Create(RefactoringId)); + } + + [Fact, Trait(Traits.Refactoring, RefactoringIdentifiers.CheckParameterForNull)] + public async Task Test_TopLevelStatement() + { + await VerifyRefactoringAsync(""" + +var [|x|] = "".ToString(); +var y = x.ToString(); + +""", """ + +var x = "".ToString(); + +if (x != null) +{ + +} +var y = x.ToString(); + +""", equivalenceKey: EquivalenceKey.Create(RefactoringId)); + } +}