diff --git a/Rules/UseDeclaredVarsMoreThanAssignments.cs b/Rules/UseDeclaredVarsMoreThanAssignments.cs index 11d9f9594..296d79da9 100644 --- a/Rules/UseDeclaredVarsMoreThanAssignments.cs +++ b/Rules/UseDeclaredVarsMoreThanAssignments.cs @@ -173,9 +173,19 @@ private IEnumerable AnalyzeScriptBlockAst(ScriptBlockAst scrip // 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) var varInAssignmentAsStatementAst = varInAssignment.Parent as AssignmentStatementAst; var varAstAsAssignmentStatementAst = varAst.Parent as AssignmentStatementAst; - if (varInAssignmentAsStatementAst != null && varAstAsAssignmentStatementAst != null) + if (varAstAsAssignmentStatementAst != null) { - inAssignment = varInAssignmentAsStatementAst.Left.Extent.Text.Equals(varAstAsAssignmentStatementAst.Left.Extent.Text, StringComparison.OrdinalIgnoreCase); + if (varAstAsAssignmentStatementAst.Operator == TokenKind.Equals) + { + if (varInAssignmentAsStatementAst != null) + { + inAssignment = varInAssignmentAsStatementAst.Left.Extent.Text.Equals(varAstAsAssignmentStatementAst.Left.Extent.Text, StringComparison.OrdinalIgnoreCase); + } + else + { + inAssignment = varInAssignment.Equals(varAst); + } + } } else { diff --git a/Tests/Rules/UseDeclaredVarsMoreThanAssignments.tests.ps1 b/Tests/Rules/UseDeclaredVarsMoreThanAssignments.tests.ps1 index daa766b06..4e4f43df7 100644 --- a/Tests/Rules/UseDeclaredVarsMoreThanAssignments.tests.ps1 +++ b/Tests/Rules/UseDeclaredVarsMoreThanAssignments.tests.ps1 @@ -73,5 +73,15 @@ function MyFunc2() { It "returns no violations" { $noViolations.Count | Should -Be 0 } + + It "Does not flag += operator" { + $results = Invoke-ScriptAnalyzer -ScriptDefinition '$array=@(); $list | ForEach-Object { $array += $c }' | Where-Object { $_.RuleName -eq $violationName } + $results.Count | Should -Be 0 + } + + It "Does not flag += operator when using unassigned variable" { + $results = Invoke-ScriptAnalyzer -ScriptDefinition '$list | ForEach-Object { $array += $c }' | Where-Object { $_.RuleName -eq $violationName } + $results.Count | Should -Be 0 + } } } \ No newline at end of file