diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/PutInsideUsingAction.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/PutInsideUsingAction.cs index 88dd4bdcbe..0978f12e23 100644 --- a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/PutInsideUsingAction.cs +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/PutInsideUsingAction.cs @@ -29,6 +29,7 @@ using System.Linq; using ICSharpCode.NRefactory.CSharp.Resolver; using ICSharpCode.NRefactory.Semantics; using ICSharpCode.NRefactory.TypeSystem; +using ICSharpCode.NRefactory.PatternMatching; namespace ICSharpCode.NRefactory.CSharp.Refactoring { @@ -99,6 +100,11 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring foreach (var decl in variableToMoveOutside) script.InsertBefore (variableDecl, decl); + if (body.Statements.Count > 0) { + var lastStatement = body.Statements.Last (); + if (IsDisposeInvocation (resolveResult.Variable.Name, lastStatement)) + lastStatement.Remove (); + } var usingStatement = new UsingStatement { ResourceAcquisition = new VariableDeclarationStatement (variableDecl.Type.Clone (), node.Name, @@ -143,5 +149,12 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring }, context.CancellationToken); return lastReference; } + + static bool IsDisposeInvocation (string variableName, Statement statement) + { + var memberReferenceExpr = new MemberReferenceExpression (new IdentifierExpression (variableName), "Dispose"); + var pattern = new ExpressionStatement (new InvocationExpression (memberReferenceExpr)); + return pattern.Match (statement).Success; + } } } diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeActions/PutInsideUsingTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeActions/PutInsideUsingTests.cs index b681e110b3..f9c746d203 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeActions/PutInsideUsingTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeActions/PutInsideUsingTests.cs @@ -185,6 +185,30 @@ class TestClass } a++; } +}"); + } + + [Test] + public void TestRemoveDisposeInvocation () + { + Test (@" +class TestClass +{ + void TestMethod () + { + System.IDisposable obj $= null; + obj.Method (); + obj.Dispose(); + } +}", @" +class TestClass +{ + void TestMethod () + { + using (System.IDisposable obj = null) { + obj.Method (); + } + } }"); } }