diff --git a/Rules/ReviewUnusedParameter.cs b/Rules/ReviewUnusedParameter.cs index 5a06500d8..d6f7d8486 100644 --- a/Rules/ReviewUnusedParameter.cs +++ b/Rules/ReviewUnusedParameter.cs @@ -40,7 +40,7 @@ public IEnumerable AnalyzeScript(Ast ast, string fileName) IEnumerable parameterAsts = scriptBlockAst.FindAll(oneAst => oneAst is ParameterAst, false); // list all variables - IDictionary variableCount = scriptBlockAst.FindAll(oneAst => oneAst is VariableExpressionAst, false) + IDictionary variableCount = scriptBlockAst.FindAll(oneAst => oneAst is VariableExpressionAst, true) .Select(variableExpressionAst => ((VariableExpressionAst)variableExpressionAst).VariablePath.UserPath) .GroupBy(variableName => variableName, StringComparer.OrdinalIgnoreCase) .ToDictionary(variableName => variableName.Key, variableName => variableName.Count(), StringComparer.OrdinalIgnoreCase); diff --git a/Tests/Rules/ReviewUnusedParameter.tests.ps1 b/Tests/Rules/ReviewUnusedParameter.tests.ps1 index f5d6004cc..774f52611 100644 --- a/Tests/Rules/ReviewUnusedParameter.tests.ps1 +++ b/Tests/Rules/ReviewUnusedParameter.tests.ps1 @@ -23,6 +23,26 @@ Describe "ReviewUnusedParameter" { $Violations.Count | Should -Be 1 } + It "traverses child scriptblock scope" { + $ScriptDefinition = 'param($Param1) { $Param1 }' + Invoke-ScriptAnalyzer -ScriptDefinition $ScriptDefinition -IncludeRule $RuleName | Should -BeNullOrEmpty + } + + It "traverses child scriptblock scope within simple function" { + $ScriptDefinition = 'function foo($Param1) { { $Param1 } }' + Invoke-ScriptAnalyzer -ScriptDefinition $ScriptDefinition -IncludeRule $RuleName | Should -BeNullOrEmpty + } + + It "traverses child scriptblock scope within a function that uses param" { + $ScriptDefinition = 'function foo { param($Param1) { $Param1 } }' + Invoke-ScriptAnalyzer -ScriptDefinition $ScriptDefinition -IncludeRule $RuleName | Should -BeNullOrEmpty + } + + It "traverse child function within a function" { + $ScriptDefinition = 'function foo($Param1) { function bar() { { $Param1 } } }' + Invoke-ScriptAnalyzer -ScriptDefinition $ScriptDefinition -IncludeRule $RuleName | Should -BeNullOrEmpty + } + It "doesn't traverse scriptblock scope" { $ScriptDefinition = '{ param ($Param1) }; { $Param1 }' $Violations = Invoke-ScriptAnalyzer -ScriptDefinition $ScriptDefinition -IncludeRule $RuleName