TTAPSModuleBuilder.psm1

function Get-PowerShellAst {
    [CmdletBinding(
        DefaultParameterSetName='File'
    )]
    Param (

        [Parameter(
            ParameterSetName='File',
            Position=0,
            Mandatory,
            ValueFromPipeline,
            ValueFromPipelineByPropertyName
        )]
        [Alias('FullName')]
        [String]
        $Path,

        [Parameter(
            ParameterSetName='ScriptBlock',
            Position=0,
            Mandatory,
            ValueFromPipeline
        )]
        [ScriptBlock]
        $Code,

        [ArgumentCompleter({
                Param(
                    $commandName,
                    $parameterName,
                    $wordToComplete,
                    $commandAst,
                    $fakeBoundParameters
                )

                [PSObject].Assembly.GetTypes().Where{$_.Name.EndsWith('Ast')}.Name | Sort-Object | Where-Object {  $_.LogName -like "$wordToComplete*" } | Foreach-Object { 
                    [System.Management.Automation.CompletionResult]::new($_, $_, "ParameterValue", $_)
                }
        })]
        $AstType = '*',

        [Switch]
        $NoRecursion
        
    )

    Begin {

        $predicate = {

            Param(
                $astObject
            ) 
            
            $astObject.GetType().Name -like $AstType 
        
        }
    }  

    Process {

        $errors = $null

        $ast = switch  ($PSCmdlet.ParameterSetName) {

            'File' {

                $_file = (Resolve-Path $File).Path
                [System.Management.Automation.Language.Parser]::ParseFile($_file, [ref]$null, [ref]$errors)
            }
            'Code' { 
                [System.Management.Automation.Language.Parser]::ParseInput($Code, [ref]$null, [ref]$errors) 
            }

        }
        
        if ($errors) { 
            throw [System.InvalidCastException]::new("Submitted text could not be converted to PowerShell because it contains syntax errors: $($errors | Out-String)")
        }

        $ast.FindAll($predicate, !$NoRecursion) | Add-Member -MemberType ScriptProperty -Name Type -Value {

            $this.GetType().Name

        } -PassThru

    }

} 


function Invoke-ModuleBuilder {
    [CmdletBinding()]
    Param(

    )

    

} 


function Get-PowerShellAst {
    [CmdletBinding(
        DefaultParameterSetName='File'
    )]
    Param (

        [Parameter(
            ParameterSetName='File',
            Position=0,
            Mandatory,
            ValueFromPipeline,
            ValueFromPipelineByPropertyName
        )]
        [Alias('FullName')]
        [String]
        $Path,

        [Parameter(
            ParameterSetName='ScriptBlock',
            Position=0,
            Mandatory,
            ValueFromPipeline
        )]
        [ScriptBlock]
        $Code,

        [ArgumentCompleter({
                Param(
                    $commandName,
                    $parameterName,
                    $wordToComplete,
                    $commandAst,
                    $fakeBoundParameters
                )

                [PSObject].Assembly.GetTypes().Where{$_.Name.EndsWith('Ast')}.Name | Sort-Object | Where-Object {  $_.LogName -like "$wordToComplete*" } | Foreach-Object { 
                    [System.Management.Automation.CompletionResult]::new($_, $_, "ParameterValue", $_)
                }
        })]
        $AstType = '*',

        [Switch]
        $NoRecursion
        
    )

    Begin {

        $predicate = {

            Param(
                $astObject
            ) 
            
            $astObject.GetType().Name -like $AstType 
        
        }
    }  

    Process {

        $errors = $null

        $ast = switch  ($PSCmdlet.ParameterSetName) {

            'File' {

                $_file = (Resolve-Path $File).Path
                [System.Management.Automation.Language.Parser]::ParseFile($_file, [ref]$null, [ref]$errors)
            }
            'Code' { 
                [System.Management.Automation.Language.Parser]::ParseInput($Code, [ref]$null, [ref]$errors) 
            }

        }
        
        if ($errors) { 
            throw [System.InvalidCastException]::new("Submitted text could not be converted to PowerShell because it contains syntax errors: $($errors | Out-String)")
        }

        $ast.FindAll($predicate, !$NoRecursion) | Add-Member -MemberType ScriptProperty -Name Type -Value {

            $this.GetType().Name

        } -PassThru

    }

} 


function Invoke-ModuleBuilder {
    [CmdletBinding()]
    Param(

    )

    

}