Browse Source

Fix #119: LocalVariableOnlyAssignedIssue does not recognize usage through unary operator expression

newNRvisualizers
Daniel Grunwald 13 years ago
parent
commit
75925d5aaf
  1. 4
      ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/VariableOnlyAssignedIssues/LocalVariableOnlyAssignedIssue.cs
  2. 4
      ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/VariableOnlyAssignedIssues/ParameterOnlyAssignedIssue.cs
  3. 5
      ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/VariableOnlyAssignedIssues/VariableOnlyAssignedIssue.cs
  4. 20
      ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/LocalVariableOnlyAssignedIssueTests.cs

4
ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/VariableOnlyAssignedIssues/LocalVariableOnlyAssignedIssue.cs

@ -30,7 +30,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
{ {
[IssueDescription ("Local variable is only assigned", [IssueDescription ("Local variable is only assigned",
Description = "Local variable is assigned by its value is never used", Description = "Local variable is assigned but its value is never used",
Category = IssueCategories.CodeQualityIssues, Category = IssueCategories.CodeQualityIssues,
Severity = Severity.Warning, Severity = Severity.Warning,
IssueMarker = IssueMarker.Underline)] IssueMarker = IssueMarker.Underline)]
@ -62,7 +62,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
if (!TestOnlyAssigned (ctx, decl.Parent, resolveResult.Variable)) if (!TestOnlyAssigned (ctx, decl.Parent, resolveResult.Variable))
return; return;
AddIssue (variableInitializer.NameToken, AddIssue (variableInitializer.NameToken,
ctx.TranslateString ("Local variable is assigned by its value is never used")); ctx.TranslateString ("Local variable is assigned but its value is never used"));
} }
} }
} }

4
ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/VariableOnlyAssignedIssues/ParameterOnlyAssignedIssue.cs

@ -28,7 +28,7 @@ using ICSharpCode.NRefactory.Semantics;
namespace ICSharpCode.NRefactory.CSharp.Refactoring namespace ICSharpCode.NRefactory.CSharp.Refactoring
{ {
[IssueDescription ("Parameter is only assigned", [IssueDescription ("Parameter is only assigned",
Description = "Parameter is assigned by its value is never used.", Description = "Parameter is assigned but its value is never used.",
Category = IssueCategories.CodeQualityIssues, Category = IssueCategories.CodeQualityIssues,
Severity = Severity.Warning, Severity = Severity.Warning,
IssueMarker = IssueMarker.Underline)] IssueMarker = IssueMarker.Underline)]
@ -60,7 +60,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
return; return;
} }
AddIssue(parameterDeclaration.NameToken, AddIssue(parameterDeclaration.NameToken,
ctx.TranslateString("Parameter is assigned by its value is never used")); ctx.TranslateString("Parameter is assigned but its value is never used"));
} }
} }
} }

5
ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/VariableOnlyAssignedIssues/VariableOnlyAssignedIssue.cs

@ -66,11 +66,16 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
case UnaryOperatorType.Decrement: case UnaryOperatorType.Decrement:
case UnaryOperatorType.PostDecrement: case UnaryOperatorType.PostDecrement:
assignment = true; assignment = true;
if (!(parent.Parent is ExpressionStatement))
nonAssignment = true;
continue; continue;
} }
} else if (parent is DirectionExpression) { } else if (parent is DirectionExpression) {
if (((DirectionExpression)parent).FieldDirection == FieldDirection.Out) { if (((DirectionExpression)parent).FieldDirection == FieldDirection.Out) {
assignment = true; assignment = true;
// Using dummy variables is necessary for ignoring
// out-arguments, so we don't want to warn for those.
nonAssignment = true;
continue; continue;
} }
} }

20
ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/LocalVariableOnlyAssignedIssueTests.cs

@ -85,13 +85,29 @@ class TestClass
{ {
i = 1; i = 1;
} }
void TestMethod()
{
int tmp;
Test (out tmp);
}
}";
// should not warn because ignoring out-arguments is legitimate
Test<LocalVariableOnlyAssignedIssue> (input1, 0);
}
[Test]
public void TestIncrement ()
{
var input1 = @"
class TestClass
{
void TestMethod() void TestMethod()
{ {
int i = 1; int i = 1;
Test (out i); Test (i++);
} }
}"; }";
Test<LocalVariableOnlyAssignedIssue> (input1, 1); Test<LocalVariableOnlyAssignedIssue> (input1, 0);
} }
} }
} }

Loading…
Cancel
Save