Skip to content

Commit 9a73fe5

Browse files
authored
Merge pull request #5882 from retailcoder/issue5824
Fixes AssignmentNotUsed false positives
2 parents 474aedc + 8c47d89 commit 9a73fe5

File tree

2 files changed

+28
-6
lines changed

2 files changed

+28
-6
lines changed

Rubberduck.CodeAnalysis/Inspections/Concrete/AssignmentNotUsedInspection.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,7 @@ protected override IEnumerable<IdentifierReference> ReferencesInModule(Qualified
8383

8484
protected override bool IsResultReference(IdentifierReference reference, DeclarationFinder finder)
8585
{
86-
return !(IsAssignmentOfNothing(reference)
87-
|| IsPotentiallyUsedViaJump(reference, finder));
86+
return !(IsAssignmentOfNothing(reference) || IsPotentiallyUsedViaJump(reference, finder));
8887
}
8988

9089
protected override string ResultDescription(IdentifierReference reference)
@@ -115,8 +114,11 @@ private static IEnumerable<IdentifierReference> FindUnusedAssignmentReferences(D
115114
? FindUnusedAssignmentNodes(tree, localVariable, allAssignmentsAndReferences)
116115
: allAssignmentsAndReferences.OfType<AssignmentNode>();
117116

118-
return unusedAssignmentNodes.Where(n => !IsDescendentOfNeverFlagNode(n))
119-
.Select(n => n.Reference);
117+
var results = unusedAssignmentNodes
118+
.Where(n => !IsDescendentOfNeverFlagNode(n))
119+
.Select(n => n.Reference);
120+
121+
return results;
120122
}
121123

122124
private static IEnumerable<AssignmentNode> FindUnusedAssignmentNodes(INode node, Declaration localVariable, IEnumerable<INode> allAssignmentsAndReferences)
@@ -136,7 +138,7 @@ private static IEnumerable<AssignmentNode> FindUnusedAssignmentNodes(INode node,
136138
? assignmentExprNodes.TakeWhile(n => n != assignmentExprNodesWithReference.LastOrDefault())
137139
?.LastOrDefault()
138140
?.Nodes(new[] { typeof(AssignmentNode) })
139-
: allAssignmentsAndReferences.TakeWhile(n => n != refNode)
141+
: allAssignmentsAndReferences.TakeWhile(n => n != refNode && !IsDescendentOfNeverFlagNode(n))
140142
.OfType<AssignmentNode>();
141143

142144
if (assignmentsPrecedingReference?.Any() ?? false)
@@ -148,7 +150,7 @@ private static IEnumerable<AssignmentNode> FindUnusedAssignmentNodes(INode node,
148150
return allAssignmentsAndReferences.OfType<AssignmentNode>().Except(usedAssignments);
149151
}
150152

151-
private static bool IsDescendentOfNeverFlagNode(AssignmentNode assignment)
153+
private static bool IsDescendentOfNeverFlagNode(INode assignment)
152154
{
153155
return assignment.TryGetAncestorNode<BranchNode>(out _)
154156
|| assignment.TryGetAncestorNode<LoopNode>(out _);

RubberduckTests/Inspections/AssignmentNotUsedInspectionTests.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -789,6 +789,26 @@ End Function
789789
Assert.AreEqual(expected, results.Count());
790790
}
791791

792+
[Test]
793+
public void ConditionalAssignments_NotConsideredForOverwritingAssignment()
794+
{
795+
string code =
796+
$@"
797+
Public Function Test() As Boolean
798+
Dim value As Boolean
799+
value = True
800+
801+
If True Then
802+
value = False
803+
End If
804+
805+
Test = value
806+
End Function
807+
";
808+
var results = InspectionResultsForStandardModule(code);
809+
Assert.AreEqual(0, results.Count());
810+
}
811+
792812
[Test]
793813
public void ResumeStmt_SingleResult()
794814
{

0 commit comments

Comments
 (0)