Skip to content

Commit 6a8e828

Browse files
bergmeisterJamesWTruher
authored andcommitted
Fix PSUseDeclaredVarsMoreThanAssignments to not give false positives when using += operator (#935)
* fix false positives such as '$a=@(); $b | foreach-object { $a+=$c}' because the rule misunderstood += as assignment * add test (it turns out a regression happened for 'flags strongly typed variables' * fix regression for strongly typed variables by being more selective about the if/else decision * add additional test case for unassigned variable
1 parent 2427610 commit 6a8e828

File tree

2 files changed

+22
-2
lines changed

2 files changed

+22
-2
lines changed

Rules/UseDeclaredVarsMoreThanAssignments.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,9 +173,19 @@ private IEnumerable<DiagnosticRecord> AnalyzeScriptBlockAst(ScriptBlockAst scrip
173173
// Try casting to AssignmentStatementAst to be able to catch case where a variable is assigned more than once (https://github.com/PowerShell/PSScriptAnalyzer/issues/833)
174174
var varInAssignmentAsStatementAst = varInAssignment.Parent as AssignmentStatementAst;
175175
var varAstAsAssignmentStatementAst = varAst.Parent as AssignmentStatementAst;
176-
if (varInAssignmentAsStatementAst != null && varAstAsAssignmentStatementAst != null)
176+
if (varAstAsAssignmentStatementAst != null)
177177
{
178-
inAssignment = varInAssignmentAsStatementAst.Left.Extent.Text.Equals(varAstAsAssignmentStatementAst.Left.Extent.Text, StringComparison.OrdinalIgnoreCase);
178+
if (varAstAsAssignmentStatementAst.Operator == TokenKind.Equals)
179+
{
180+
if (varInAssignmentAsStatementAst != null)
181+
{
182+
inAssignment = varInAssignmentAsStatementAst.Left.Extent.Text.Equals(varAstAsAssignmentStatementAst.Left.Extent.Text, StringComparison.OrdinalIgnoreCase);
183+
}
184+
else
185+
{
186+
inAssignment = varInAssignment.Equals(varAst);
187+
}
188+
}
179189
}
180190
else
181191
{

Tests/Rules/UseDeclaredVarsMoreThanAssignments.tests.ps1

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,5 +73,15 @@ function MyFunc2() {
7373
It "returns no violations" {
7474
$noViolations.Count | Should -Be 0
7575
}
76+
77+
It "Does not flag += operator" {
78+
$results = Invoke-ScriptAnalyzer -ScriptDefinition '$array=@(); $list | ForEach-Object { $array += $c }' | Where-Object { $_.RuleName -eq $violationName }
79+
$results.Count | Should -Be 0
80+
}
81+
82+
It "Does not flag += operator when using unassigned variable" {
83+
$results = Invoke-ScriptAnalyzer -ScriptDefinition '$list | ForEach-Object { $array += $c }' | Where-Object { $_.RuleName -eq $violationName }
84+
$results.Count | Should -Be 0
85+
}
7686
}
7787
}

0 commit comments

Comments
 (0)