From 667aea52e82fc04c6461970e74214c2a2c224fd1 Mon Sep 17 00:00:00 2001 From: Chris Date: Sun, 3 Dec 2017 12:58:29 +0000 Subject: [PATCH 1/2] Fix PSUseDeclaredVarsMoreThanAssignments when variable is assigned more than once to still give a warning. Issue 833: https://github.com/PowerShell/PSScriptAnalyzer/issues/833 --- Rules/UseDeclaredVarsMoreThanAssignments.cs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Rules/UseDeclaredVarsMoreThanAssignments.cs b/Rules/UseDeclaredVarsMoreThanAssignments.cs index f2731474a..1df2840ca 100644 --- a/Rules/UseDeclaredVarsMoreThanAssignments.cs +++ b/Rules/UseDeclaredVarsMoreThanAssignments.cs @@ -166,7 +166,17 @@ private IEnumerable AnalyzeScriptBlockAst(ScriptBlockAst scrip // Checks if this variableAst is part of the logged assignment foreach (VariableExpressionAst varInAssignment in varsInAssignment) { - inAssignment |= varInAssignment.Equals(varAst); + // 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) + { + inAssignment = varInAssignmentAsStatementAst.Left.Extent.Text.Equals(varAstAsAssignmentStatementAst.Left.Extent.Text, StringComparison.OrdinalIgnoreCase); + } + else + { + inAssignment = varInAssignment.Equals(varAst); + } } if (!inAssignment) From f7e46376ceefde1f43f4609b444d9261939b7ff7 Mon Sep 17 00:00:00 2001 From: Chris Date: Sun, 3 Dec 2017 14:32:37 +0000 Subject: [PATCH 2/2] add tests to PSUseDeclaredVarsMoreThanAssignments to check that it flags a variable that is assigned twice but still never used. --- .../UseDeclaredVarsMoreThanAssignments.tests.ps1 | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Tests/Rules/UseDeclaredVarsMoreThanAssignments.tests.ps1 b/Tests/Rules/UseDeclaredVarsMoreThanAssignments.tests.ps1 index 4f94c35d3..2fced774a 100644 --- a/Tests/Rules/UseDeclaredVarsMoreThanAssignments.tests.ps1 +++ b/Tests/Rules/UseDeclaredVarsMoreThanAssignments.tests.ps1 @@ -49,6 +49,18 @@ function MyFunc2() { Get-Count | ` Should Be 0 } + + It "flags a variable that is defined twice but never used" { + Invoke-ScriptAnalyzer -ScriptDefinition '$myvar=1;$myvar=2' -IncludeRule $violationName | ` + Get-Count | ` + Should Be 1 + } + + It "does not flag a variable that is defined twice but gets assigned to another variable and flags the other variable instead" { + $results = Invoke-ScriptAnalyzer -ScriptDefinition '$myvar=1;$myvar=2;$mySecondvar=$myvar' -IncludeRule $violationName + $results | Get-Count | Should Be 1 + $results[0].Extent | Should Be '$mySecondvar' + } } Context "When there are no violations" {