Private/Get-KoanAst.ps1

using namespace System.Management.Automation.Language

function Get-KoanAst {
    <#
    .SYNOPSIS
        Get the AST for a Koan.

    .DESCRIPTION
        Parse the content of a Koan file into an AST. Ignores "using module" statements.

    .PARAMETER Path
        The path to a Koan file.

    #>


    [CmdletBinding()]
    [OutputType([System.Management.Automation.Language.ScriptBlockAst])]
    param (
        [Parameter(ValueFromPipeline, ValueFromPipelineByPropertyName)]
        [Alias('PSPath')]
        [string]
        $Path
    )

    process {
        try {
            if (-not (Test-Path $Path)) {
                return
            }

            $tokens = $errors = $null

            # Remove the "using module" line. Avoids a slow call to Get-Module -ListAvailable from "using module".
            $content = Get-Content -Path $Path -Raw
            foreach ($match in [Regex]::Matches($content, 'using module \S+')) {
                $content = $content.Remove(
                    $match.Index,
                    $match.Length
                ).Insert(
                    $match.Index,
                    ' ' * $match.Length
                )
            }

            [Parser]::ParseInput(
                $content,
                [Ref]$tokens,
                [Ref]$errors
            )
        }
        catch {
            $PSCmdlet.ThrowTerminatingError($_)
        }
    }
}