Browse Source

[CodeIssues] Fix handling of member references in AssignmentMadeToSameVariableIssue.

newNRvisualizers
Simon Lindgren 13 years ago
parent
commit
b71617d816
  1. 18
      ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/AssignmentMadeToSameVariableIssue.cs
  2. 65
      ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/AssignmentMadeToSameVariableIssueTests.cs

18
ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/AssignmentMadeToSameVariableIssue.cs

@ -29,6 +29,7 @@ using System.Collections.Generic; @@ -29,6 +29,7 @@ using System.Collections.Generic;
using ICSharpCode.NRefactory.Semantics;
using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.NRefactory.PatternMatching;
using System.Linq;
namespace ICSharpCode.NRefactory.CSharp.Refactoring
{
@ -62,14 +63,9 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -62,14 +63,9 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
var resolveResult = ctx.Resolve (assignmentExpression.Left);
var memberResolveResult = resolveResult as MemberResolveResult;
if (memberResolveResult != null) {
if (!(memberResolveResult.Member is IField))
var memberResolveResult2 = ctx.Resolve (assignmentExpression.Right) as MemberResolveResult;
if (memberResolveResult2 == null || !AreEquivalent(memberResolveResult, memberResolveResult2))
return;
if (!assignmentExpression.Left.Match (assignmentExpression.Right).Success) {
// in case: this.field = field
var memberResolveResult2 = ctx.Resolve (assignmentExpression.Right) as MemberResolveResult;
if (memberResolveResult2 == null || memberResolveResult.Member != memberResolveResult2.Member)
return;
}
} else if (resolveResult is LocalResolveResult) {
if (!assignmentExpression.Left.Match (assignmentExpression.Right).Success)
return;
@ -89,6 +85,14 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -89,6 +85,14 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
AddIssue (node, ctx.TranslateString ("CS1717:Assignment made to same variable"),
new [] { new CodeAction (ctx.TranslateString ("Remove assignment"), action) });
}
static bool AreEquivalent(ResolveResult first, ResolveResult second)
{
var firstPath = InitializerPath.FromResolveResult(first);
var secondPath = InitializerPath.FromResolveResult(second);
return firstPath != null && firstPath.Equals(secondPath) && !firstPath.MemberPath.Any(m => !(m is IField)) &&
(firstPath.MemberRoot == null || firstPath.MemberRoot is IField);
}
}
}
}

65
ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/AssignmentMadeToSameVariableIssueTests.cs

@ -127,7 +127,7 @@ class TestClass @@ -127,7 +127,7 @@ class TestClass
}";
Test<AssignmentMadeToSameVariableIssue> (input, 2, output);
}
[Test]
public void TestNoIssue ()
{
@ -146,6 +146,69 @@ class TestClass @@ -146,6 +146,69 @@ class TestClass
this.a = a;
Prop = Prop;
}
}";
Test<AssignmentMadeToSameVariableIssue> (input, 0);
}
[Test]
public void IgnoresAssignmentWithDifferentRootObjects ()
{
var input = @"
class TestClass
{
int a;
void TestMethod (TestClass tc)
{
a = tc.a;
}
}";
Test<AssignmentMadeToSameVariableIssue> (input, 0);
}
[Test]
public void NestedFieldAccess ()
{
var input = @"
class TestClass
{
int a;
TestClass nested;
void TestMethod ()
{
nested.nested.a = nested.nested.a;
}
}";
var output = @"
class TestClass
{
int a;
TestClass nested;
void TestMethod ()
{
}
}";
Test<AssignmentMadeToSameVariableIssue> (input, 1, output);
}
[Test]
public void NestedPropertyAccess ()
{
var input = @"
class TestClass
{
int a;
TestClass nested { get; set; }
void TestMethod ()
{
nested.nested.a = nested.nested.a;
}
}";
Test<AssignmentMadeToSameVariableIssue> (input, 0);
}

Loading…
Cancel
Save