Browse Source

[CodeActions] PutInsideUsingAction: remove trailing Dispose() invocation

newNRvisualizers
Mansheng Yang 14 years ago
parent
commit
862e3d3156
  1. 13
      ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/PutInsideUsingAction.cs
  2. 24
      ICSharpCode.NRefactory.Tests/CSharp/CodeActions/PutInsideUsingTests.cs

13
ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/PutInsideUsingAction.cs

@ -29,6 +29,7 @@ using System.Linq; @@ -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 @@ -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 @@ -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;
}
}
}

24
ICSharpCode.NRefactory.Tests/CSharp/CodeActions/PutInsideUsingTests.cs

@ -185,6 +185,30 @@ class TestClass @@ -185,6 +185,30 @@ class TestClass
}
a++;
}
}");
}
[Test]
public void TestRemoveDisposeInvocation ()
{
Test<PutInsideUsingAction> (@"
class TestClass
{
void TestMethod ()
{
System.IDisposable obj $= null;
obj.Method ();
obj.Dispose();
}
}", @"
class TestClass
{
void TestMethod ()
{
using (System.IDisposable obj = null) {
obj.Method ();
}
}
}");
}
}

Loading…
Cancel
Save