diff --git a/Rules/UseDeclaredVarsMoreThanAssignments.cs b/Rules/UseDeclaredVarsMoreThanAssignments.cs index f2731474a..09db386f7 100644 --- a/Rules/UseDeclaredVarsMoreThanAssignments.cs +++ b/Rules/UseDeclaredVarsMoreThanAssignments.cs @@ -135,6 +135,17 @@ private IEnumerable AnalyzeScriptBlockAst(ScriptBlockAst scrip // Only checks for the case where lhs is a variable. Ignore things like $foo.property VariableExpressionAst assignmentVarAst = assignmentAst.Left as VariableExpressionAst; + if (assignmentVarAst == null) + { + // If the variable is declared in a strongly typed way, e.g. [string]$s = 'foo' then the type is ConvertExpressionAst. + // Therefore we need to the VariableExpressionAst from its Child property. + var assignmentVarAstAsConvertExpressionAst = assignmentAst.Left as ConvertExpressionAst; + if (assignmentVarAstAsConvertExpressionAst != null && assignmentVarAstAsConvertExpressionAst.Child != null) + { + assignmentVarAst = assignmentVarAstAsConvertExpressionAst.Child as VariableExpressionAst; + } + } + if (assignmentVarAst != null) { // Ignore if variable is global or environment variable or scope is function diff --git a/Tests/Rules/UseDeclaredVarsMoreThanAssignments.tests.ps1 b/Tests/Rules/UseDeclaredVarsMoreThanAssignments.tests.ps1 index 4f94c35d3..7d3f0eba3 100644 --- a/Tests/Rules/UseDeclaredVarsMoreThanAssignments.tests.ps1 +++ b/Tests/Rules/UseDeclaredVarsMoreThanAssignments.tests.ps1 @@ -38,6 +38,12 @@ function MyFunc2() { Should Be 1 } + It "flags strongly typed variables" { + Invoke-ScriptAnalyzer -ScriptDefinition '[string]$s=''mystring''' -IncludeRule $violationName | ` + Get-Count | ` + Should Be 1 + } + It "does not flag `$InformationPreference variable" { Invoke-ScriptAnalyzer -ScriptDefinition '$InformationPreference=Stop' -IncludeRule $violationName | ` Get-Count | `