Private/Private.psm1

function GetUsingVariables {
    param ([scriptblock]$ScriptBlock)
    $ScriptBlock.ast.FindAll({
            $args[0] -is [System.Management.Automation.Language.UsingExpressionAst]
        }, $True)
}

function ConvertScript {
    param (
        [scriptblock]$ScriptBlock,
        [bool]$HasParam,
        $UsingVariables,
        $UsingVariableValues,
        $HashTable
    )
    # $HasParam unused
    $List = New-Object 'System.Collections.Generic.List`1[System.Management.Automation.Language.VariableExpressionAst]'
    $Params = New-Object System.Collections.ArrayList
    if ($UsingVariables) {
        foreach ($Ast in $UsingVariables) {
            [void]$list.Add($Ast.SubExpression)
        }
    }
    if ($UsingVariableValues) {
        [void]$Params.AddRange(@($UsingVariableValues.NewName))
    }
    if ($HashTable) {
        [void]$Params.Add('$HashTable')
    }
    $NewParams = $Params -join ', '
    $Tuple = [Tuple]::Create($list, $NewParams)
    $bindingFlags = [Reflection.BindingFlags]"Default,NonPublic,Instance"
    
    $GetWithInputHandlingForInvokeCommandImpl = ($ScriptBlock.ast.gettype().GetMethod('GetWithInputHandlingForInvokeCommandImpl', $bindingFlags))
    $StringScriptBlock = $GetWithInputHandlingForInvokeCommandImpl.Invoke($ScriptBlock.ast, @($Tuple))
    if ([scriptblock]::Create($StringScriptBlock).ast.endblock[0].statements.extent.text.startswith('$input |')) {
        $StringScriptBlock = $StringScriptBlock -replace '\$Input \|'
    }
    if (-NOT $ScriptBlock.Ast.ParamBlock) {
        $StringScriptBlock = "Param($($NewParams))`n$($StringScriptBlock)"
        [scriptblock]::Create($StringScriptBlock)
    }
    else {
        [scriptblock]::Create($StringScriptBlock)
    }
}