Browse Source

Fixed variable inlining missing parentheses issues.

pull/32/merge
Mike Krüger 13 years ago
parent
commit
5c45761c90
  1. 35
      ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/InlineLocalVariableAction.cs
  2. 184
      ICSharpCode.NRefactory.Tests/CSharp/CodeActions/InlineLocalVariableTests.cs

35
ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/InlineLocalVariableAction.cs

@ -58,9 +58,42 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -58,9 +58,42 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
yield break;
}
yield return new CodeAction(context.TranslateString("Inline local variable"), script => {
refFinder.FindLocalReferences(resolveResult.Variable, context.UnresolvedFile, unit, context.Compilation, (n, r) => script.Replace(n, initializer.Initializer.Clone()), default(CancellationToken));
refFinder.FindLocalReferences(resolveResult.Variable, context.UnresolvedFile, unit, context.Compilation, (n, r) => script.Replace(n, AddParensIfRequired (n, initializer.Initializer.Clone())), default(CancellationToken));
script.Remove(node);
});
}
public static bool RequiresParens(AstNode replaceNode, AstNode replaceWithNode)
{
if (!(replaceWithNode is BinaryOperatorExpression) &&
!(replaceWithNode is AsExpression) &&
!(replaceWithNode is IsExpression) &&
!(replaceWithNode is ConditionalExpression)) {
return false;
}
var cond = replaceNode.Parent as ConditionalExpression;
if (cond != null && cond.Condition == replaceNode)
return true;
var indexer = replaceNode.Parent as IndexerExpression;
if (indexer != null && indexer.Target == replaceNode)
return true;
return replaceNode.Parent is BinaryOperatorExpression ||
replaceNode.Parent is UnaryOperatorExpression ||
replaceNode.Parent is MemberReferenceExpression ||
replaceNode.Parent is AsExpression ||
replaceNode.Parent is IsExpression ||
replaceNode.Parent is CastExpression ||
replaceNode.Parent is PointerReferenceExpression;
}
static Expression AddParensIfRequired(AstNode replaceNode, Expression expression)
{
if (RequiresParens(replaceNode, expression))
return new ParenthesizedExpression(expression);
return expression;
}
}
}

184
ICSharpCode.NRefactory.Tests/CSharp/CodeActions/InlineLocalVariableTests.cs

@ -33,7 +33,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeActions @@ -33,7 +33,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeActions
[TestFixture]
public class InlineLocalVariableTests : ContextActionTestBase
{
[Test()]
[Test]
public void TestSimpleInline ()
{
Test<InlineLocalVariableAction> (@"class TestClass
@ -51,6 +51,186 @@ namespace ICSharpCode.NRefactory.CSharp.CodeActions @@ -51,6 +51,186 @@ namespace ICSharpCode.NRefactory.CSharp.CodeActions
}
}");
}
[Test]
public void TestAddNoParensForSimpleReplacement ()
{
Test<InlineLocalVariableAction> (@"class TestClass
{
void Test (int foo)
{
int $tmp = foo;
Console.WriteLine (tmp.ToString ());
}
}", @"class TestClass
{
void Test (int foo)
{
Console.WriteLine (foo.ToString ());
}
}");
}
[Test]
public void TestAddNoParensForMemberReferenceReplacement ()
{
Test<InlineLocalVariableAction> (@"class TestClass
{
static int Foo;
void Test ()
{
int $tmp = TestClass.Foo;
Console.WriteLine (tmp.ToString ());
}
}", @"class TestClass
{
static int Foo;
void Test ()
{
Console.WriteLine (TestClass.Foo.ToString ());
}
}");
}
[Test]
public void TestAddParens ()
{
Test<InlineLocalVariableAction> (@"class TestClass
{
void Test ()
{
int $tmp = 5 + 6;
Console.WriteLine (tmp.ToString ());
Console.WriteLine (tmp * 3);
}
}", @"class TestClass
{
void Test ()
{
Console.WriteLine ((5 + 6).ToString ());
Console.WriteLine ((5 + 6) * 3);
}
}");
}
[Test]
public void TestAddParensConditionalOperatorCase ()
{
Test<InlineLocalVariableAction> (@"class TestClass
{
void Test ()
{
bool $tmp = 3 == 5;
Console.WriteLine (tmp ? tmp : 2);
}
}", @"class TestClass
{
void Test ()
{
Console.WriteLine ((3 == 5) ? 3 == 5 : 2);
}
}");
}
[Test]
public void TestAddParensAsOperatorCase ()
{
Test<InlineLocalVariableAction> (@"class TestClass
{
void Test ()
{
object $tmp = 3 == 5;
Console.WriteLine (tmp as bool);
}
}", @"class TestClass
{
void Test ()
{
Console.WriteLine ((3 == 5) as bool);
}
}");
}
[Test]
public void TestAddParensIsOperatorCase ()
{
Test<InlineLocalVariableAction> (@"class TestClass
{
void Test ()
{
object $tmp = 3 == 5;
Console.WriteLine (tmp is bool);
}
}", @"class TestClass
{
void Test ()
{
Console.WriteLine ((3 == 5) is bool);
}
}");
}
[Test]
public void TestAddParensCastOperatorCase ()
{
Test<InlineLocalVariableAction> (@"class TestClass
{
void Test ()
{
object $tmp = 3 == 5;
Console.WriteLine ((bool)tmp);
}
}", @"class TestClass
{
void Test ()
{
Console.WriteLine ((bool)(3 == 5));
}
}");
}
[Test]
public void TestPointerReferenceExpression ()
{
Test<InlineLocalVariableAction> (@"unsafe class TestClass
{
public void Test (int* foo)
{
int* $ptr = foo + 5;
Console.WriteLine (ptr->ToString ());
}
}", @"unsafe class TestClass
{
public void Test (int* foo)
{
Console.WriteLine ((foo + 5)->ToString ());
}
}");
}
[Test]
public void TestUnaryOperatorCase ()
{
Test<InlineLocalVariableAction> (@"class TestClass
{
void Test ()
{
bool $tmp = 3 == 5;
Console.WriteLine (!tmp);
}
}", @"class TestClass
{
void Test ()
{
Console.WriteLine (!(3 == 5));
}
}");
}
}
}
Loading…
Cancel
Save