functions/Test-ReSyntax.ps1

function Test-ReSyntax {
    <#
    .SYNOPSIS
        Tests whether the syntax of a given scriptfile or scriptcode is valid.
     
    .DESCRIPTION
        Tests whether the syntax of a given scriptfile or scriptcode is valid.
        This uses the PowerShell syntax validation.
        Some cases - especially around PowerShell classes - may evaluate as syntax error when missing dependencies.
     
    .PARAMETER Path
        Path to the file to test.
     
    .PARAMETER LiteralPath
        Non-interpreted path to the file to test.
     
    .PARAMETER Code
        Actual code to test.
 
    .PARAMETER Not
        Reverses the returned logic: A syntax error found returns as $true, an error-free script returns $false.
     
    .EXAMPLE
        PS C:\> Test-ReSyntax .\script.ps1
         
        Verifies the syntax of the file 'script.ps1' in the current path.
    #>

    [OutputType([bool])]
    [CmdletBinding(DefaultParameterSetName = 'path')]
    param (
        [Parameter(Mandatory = $true, ParameterSetName = 'path', Position = 0)]
        [string]
        $Path,

        [Parameter(Mandatory = $true, ParameterSetName = 'literal')]
        [string]
        $LiteralPath,

        [Parameter(Mandatory = $true, ParameterSetName = 'code')]
        [string]
        $Code,

        [switch]
        $Not
    )

    process {
        if ($Code) {
            $result = Read-ReAst -ScriptCode $Code
            return ($result.Errors -as [bool]) -eq $Not
        }
        if ($Path) {
            try { $resolvedPath = Resolve-PSFPath -Path $Path -Provider FileSystem -SingleItem }
            catch { return $Not -as [bool] } # as bool to satisfy output type PSSA warnings and unify result type

            $fileItem = Get-Item -LiteralPath $resolvedPath
        }
        if ($LiteralPath) {
            try { $fileItem = Get-Item -LiteralPath $LiteralPath -ErrorAction Stop }
            catch { return $Not -as [bool] }
        }

        $tokens = $null
        $errors = $null
        $null = [System.Management.Automation.Language.Parser]::ParseFile($fileItem.FullName, [ref]$tokens, [ref]$errors)
        ($errors -as [bool]) -eq $Not
    }
}