Skip to content

Commit

Permalink
Merge pull request #5640 from MDoerner/CountForLoopAssignmentAsVariab…
Browse files Browse the repository at this point in the history
…leUsage

Count 'For' loop variable as self-referencing assignment, removes inspection false positive.
  • Loading branch information
retailcoder committed Dec 1, 2020
2 parents 4dc9bab + 616999c commit 06f5b03
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 3 deletions.
Expand Up @@ -54,7 +54,21 @@ protected override bool IsResultDeclaration(Declaration declaration, Declaration
{
return !declaration.IsWithEvents
&& declaration.References
.All(reference => reference.IsAssignment);
.All(reference => reference.IsAssignment)
&& !declaration.References.Any(IsForLoopAssignment);
}

private bool IsForLoopAssignment(IdentifierReference reference)
{
if(!reference.IsAssignment)
{
return false;
}

//A For Next loop has the form For expr1 = expr2 (Step expr3) ... Next (expr1)
var relationalOpAncestor = reference.Context.GetAncestor<VBAParser.RelationalOpContext>();
return relationalOpAncestor != null
&& relationalOpAncestor.Parent is VBAParser.ForNextStmtContext;
}

protected override IInspectionResult InspectionResult(Declaration declaration)
Expand Down
35 changes: 33 additions & 2 deletions RubberduckTests/Inspections/VariableNotUsedInspectionTests.cs
Expand Up @@ -96,10 +96,10 @@ public void VariableNotUsed_UsedInNameStatement_DoesNotReturnsResult()

Assert.AreEqual(0, InspectionResultsForStandardModule(inputCode).Count());
}

//https://github.com/rubberduck-vba/Rubberduck/issues/5088

[Test]
[Category("Inspections")]
//See issue #5610 at https://github.com/rubberduck-vba/Rubberduck/issues/5088
public void VariableNotUsed_AssignedButNeverReferenced_ReturnsResult()
{
const string inputCode =
Expand All @@ -110,6 +110,37 @@ public void VariableNotUsed_AssignedButNeverReferenced_ReturnsResult()

Assert.AreEqual(1, InspectionResultsForStandardModule(inputCode).Count());
}

[Test]
[Category("Inspections")]
//See issue #5610 at https://github.com/rubberduck-vba/Rubberduck/issues/5610
public void VariableNotUsed_AssignedinForLoop_DoesNotReturnResult()
{
const string inputCode =
@"Sub Foo()
Dim counter As Long
For counter = 1 To 1000
'Try something
Next
End Sub";

Assert.AreEqual(0, InspectionResultsForStandardModule(inputCode).Count());
}

[Test]
[Category("Inspections")]
public void VariableNotUsed_AssignedinForEachLoop_ReturnsResult()
{
const string inputCode =
@"Sub Foo()
Dim var1 As Variant
Dim coll As Scription.Collection
For Each var1 In coll
Next
End Sub";

Assert.AreEqual(1, InspectionResultsForStandardModule(inputCode).Count());
}

[Test]
[Category("Inspections")]
Expand Down

0 comments on commit 06f5b03

Please sign in to comment.