Public/Get-PSModuleRefactoringCandidates.ps1
|
<# .SYNOPSIS Identifies functions that are potential refactoring candidates. .DESCRIPTION Get-PSModuleRefactoringCandidates analyzes function size, complexity, reference count, and documentation indicators to detect functions that may benefit from refactoring. Issues are reported as a comma-separated list and can include: - LargeFunction - HighComplexity - UnusedPrivateFunction - NoDocumentation .PARAMETER ModuleName Specifies the module to analyze. Use the module name as recognized by PowerShell (for example, a loaded module or module discoverable in PSModulePath). .PARAMETER MaxLines Specifies the maximum recommended function size in lines. Functions above this threshold are flagged as LargeFunction. Default value: 150. .PARAMETER MaxComplexity Specifies the maximum recommended cyclomatic complexity. Functions above this threshold are flagged as HighComplexity. Default value: 10. .EXAMPLE Get-PSModuleRefactoringCandidates -ModuleName PSModuleQuantityAnalyzer Returns functions in PSModuleQuantityAnalyzer that match one or more default refactoring criteria. .EXAMPLE Get-PSModuleRefactoringCandidates -ModuleName PSModuleQuantityAnalyzer -MaxLines 120 -MaxComplexity 8 Runs a stricter analysis by lowering size and complexity thresholds. .OUTPUTS PSCustomObject. The output includes ModuleName, Version, Function, TotalLines, Complexity, References, Issues, PartOfFile, and FullName. .NOTES Complexity values are sourced from Get-PSModuleComplexity. #> function Get-PSModuleRefactoringCandidates { [CmdletBinding()] param( [Parameter(Mandatory)] [string]$ModuleName, [int]$MaxLines = 150, [int]$MaxComplexity = 10 ) $quantity = Get-PSModuleQuantity -ModuleName $ModuleName $complexity = Get-PSModuleComplexity -ModuleName $ModuleName $complexityMap = @{} foreach ($c in $complexity) { $complexityMap[$c.Function] = $c.Complexity } foreach ($f in $quantity) { $comp = if ($complexityMap.ContainsKey($f.Function)) { $complexityMap[$f.Function] } else { 1 } $issues = @() if ($f.TotalLines -gt $MaxLines) { $issues += "LargeFunction" } if ($comp -gt $MaxComplexity) { $issues += "HighComplexity" } if ($f.References -eq 0 -and $f.Visibility -eq "Private") { $issues += "UnusedPrivateFunction" } if ($f.HasHelp -eq $false) { $issues += "NoDocumentation" } if ($issues.Count -gt 0) { [PSCustomObject]@{ ModuleName = $f.ModuleName Version = $f.Version Function = $f.Function TotalLines = $f.TotalLines Complexity = $comp References = $f.References Issues = ($issues -join ",") PartOfFile = $f.PartOfFile FullName = $f.FullName } } } } |