Private/FindFunction.ps1

#Helper function
Function FindFunction {
    [CmdletBinding()]
    param (
        [string]$ScriptBlock
    )
    #Just in case we have some oddness going on
    $ScriptBlock = $ScriptBlock -replace '`','``'
    # Tokenize the script
    $tokens = [Management.Automation.PSParser]::Tokenize($ScriptBlock, [ref]$null)

    # First Pass - Grab all tokens between the first param block.
    $functionsearch = $false
    $IsName=$False
    $Counter = 0
    $SpaceCount = 0
    for ($i = 0; $i -lt $tokens.Count; $i++) {
        if (!$functionsearch) {
            if ($tokens[$i].Content -eq "function" -AND $tokens[$i].Type -eq 'Keyword') {
                $functionsearch = $true
                $IsName=$False
                $Definition = New-Object System.Text.StringBuilder
                $i++
            }
        }
        if ($functionsearch) {
            If ($i -gt 1 -AND ($tokens[$i].StartLine -eq $tokens[$i-1].EndLine)) {
                $SpaceCount = $tokens[$i].StartColumn - $tokens[$i-1].EndColumn
                $space = ' '*"$($SpaceCount)"
                If ($SpaceCount -gt 0) {
                    If ($SpaceCount -notmatch '^[5|9]$') {
                        Write-Verbose "Adding Space: $($SpaceCount)"
                        [void]$Definition.Append($Space)
                    } ElseIf ($SpaceCount -match '^[5|9]$') {
                        Write-Verbose "Adding NewLine"
                        [void]$Definition.Append("`n")
                    }
                }
            }
            Write-Verbose $tokens[$i].Content
            Switch ($tokens[$i].Type) {
                'NewLine' {
                    Write-Verbose 'Adding NewLine'
                    [void]$Definition.Append("`n")
                }
                'CommandArgument' {
                    If (-NOT $IsName) {
                        $Name = $tokens[$i].Content
                        $IsName = $True
                        $ExpectingStart=$True
                    } Else {
                        [void]$Definition.Append($tokens[$i].Content)
                    }
                }
                'GroupStart' {
                    If ($tokens[$i].Content -eq '{') {
                        $Counter++
                        If ($ExpectingStart) {
                            $ExpectingStart = $False
                        }
                    }
                    [void]$Definition.Append($tokens[$i].Content)
                }
                'GroupEnd' {
                    If ($tokens[$i].Content -eq '}') {
                        $Counter--
                       If ($ExpectingStart) {
                            $ExpectingStart = $False
                       }
                    }
                    [void]$Definition.Append($tokens[$i].Content)
                }
                'Variable' {
                    [void]$Definition.Append("`$$($tokens[$i].Content)")
                }
                'Type' {
                    Switch ($PSVersionTable.PSVersion.Major) {
                        '2' {
                            [void]$Definition.Append("[$($tokens[$i].Content)]")
                        }
                        Default {
                            [void]$Definition.Append($($tokens[$i].Content))
                        }
                    }
                }
                Default {
                    [void]$Definition.Append($tokens[$i].Content)
                }
            }
            if ($Counter -eq 0 -AND -NOT $ExpectingStart) {
                $functionsearch = $false
                #Create the object and display it
                New-Object PSObject -Property @{
                    Name = $Name
                    Body = $Definition.ToString()
                }
            }
        }
    }
}