Private/Get-TokenColor.ps1

. (Join-Path (Join-Path $PSScriptRoot '..\Public') 'HighlightTheme.ps1')

function Get-TokenColor(
    [System.Management.Automation.Language.TokenKind]$tokenKind,
    [System.Management.Automation.Language.TokenFlags]$tokenFlags) {

    Write-Debug "<# tk: $tokenKind, Tf: $tokenFlags #>";

    # We need to test either, or both of these:
    # - [Enum]::GetValues([System.Management.Automation.Language.TokenKind])
    # See: https://learn.microsoft.com/en-us/dotnet/api/system.management.automation.language.tokenkind
    # - [Enum]::GetValues([System.Management.Automation.Language.TokenFlags])
    # See: https://learn.microsoft.com/en-us/dotnet/api/system.management.automation.language.tokenflags

    # First, we check the token kind...
    if ($tokenKind -eq [System.Management.Automation.Language.TokenKind]::Number) {
        return $h_NumberColor;
    }

    if ($tokenKind -eq [System.Management.Automation.Language.TokenKind]::Variable) {
        return $h_VariableColor;
    }

    if ($tokenKind -eq [System.Management.Automation.Language.TokenKind]::Parameter) {
        return $h_ParameterColor;
    }

    if ($tokenKind -eq [System.Management.Automation.Language.TokenKind]::SplattedVariable) {
        return $h_VariableColor;
    }

    ## A redirection operator such as '2>&1' or '>>'.
    if ($tokenKind -eq [System.Management.Automation.Language.TokenKind]::Redirection) {
        return $h_RedirectionOperatorColor;
    }

    if ($tokenKind -eq [System.Management.Automation.Language.TokenKind]::NewLine) {
        return $h_GenericColor; # Not really used, a new line is emmitted.
    }

    if ($tokenKind -eq [System.Management.Automation.Language.TokenKind]::Comment) {
        return $h_CommentColor;
    }

    # The 'param' keyword itself (VS Code incorrectly colors this, in this very code snippet!)
    if ($tokenKind -eq [System.Management.Automation.Language.TokenKind]::Param) {
        return $h_KeyWordColor;
    }

    # the `Function` keyword itself
    if ($tokenKind -eq [System.Management.Automation.Language.TokenKind]::Function) {
        return $h_KeyWordColor;
    }

    if ($tokenKind -eq [System.Management.Automation.Language.TokenKind]::StringExpandable -or
        $tokenKind -eq [System.Management.Automation.Language.TokenKind]::StringLiteral -or
        $tokenKind -eq [System.Management.Automation.Language.TokenKind]::HereStringExpandable
    ) {
        return $h_StringColor;
    }

    if ($tokenKind -eq [System.Management.Automation.Language.TokenKind]::LBracket -or
        $tokenKind -eq [System.Management.Automation.Language.TokenKind]::RBracket) {
        return $h_OperatorColor;
    }

    # Now we switch to checking tokenFlags...

    # The token is one of the assignment operators: '=', '+=', '-=', '*=', '/=', '%=' or '??='
    if ($tokenFlags.HasFlag([System.Management.Automation.Language.TokenFlags]::AssignmentOperator)) {
        return $h_OperatorColor;
    }

    # UnaryOperator ++, --
    if ($tokenFlags.HasFlag([System.Management.Automation.Language.TokenFlags]::UnaryOperator)) {
        return $h_OperatorColor;
    }

    if ($tokenFlags.HasFlag([System.Management.Automation.Language.TokenFlags]::CommandName)) {
        return $h_CommandColor;
    }

    if ($tokenFlags.HasFlag([System.Management.Automation.Language.TokenFlags]::TypeName)) {
        return $h_TypeNameColor;
    }

    if ($tokenFlags.HasFlag([System.Management.Automation.Language.TokenFlags]::MemberName)) {
        return $h_MemberColor;
    }

    if ($tokenFlags.HasFlag([System.Management.Automation.Language.TokenFlags]::SpecialOperator)) {
        return $h_OperatorColor;
    }

    if ($tokenFlags.HasFlag([System.Management.Automation.Language.TokenFlags]::BinaryOperator)) {
        return $h_OperatorColor;
    }

    if ($tokenFlags.HasFlag([System.Management.Automation.Language.TokenFlags]::Keyword)) {
        return $h_KeyWordColor;
    }

    if ($tokenFlags.HasFlag([System.Management.Automation.Language.TokenFlags]::ParseModeInvariant)) {
        return $h_OperatorColor; # consider: this was gray instead of darkgray before
    }

    # A simple identifier, always begins with a letter or '', and is followed by letters, numbers, or ''.
    # example: "-ErrorAction SilentlyContinue" -- the "SilentlyContinue" is such an identifier.
    if ($tokenKind -eq [System.Management.Automation.Language.TokenKind]::Identifier) {
        return $h_IdentifierColor;
    }

    # Last chance...
    if ($tokenKind -eq [System.Management.Automation.Language.TokenKind]::Generic) {
        return $h_GenericColor;
    }

    # Unrecognised token... Was not colored....
    Write-Debug "`n****`n****`nUNRECOGNISED TOKEN`n<# TokenKind: $tokenKind, TokenFlags: $tokenFlags #>`n****";

    return $h_UnrecognizedColor;
}

<#
[Enum]::GetValues( [System.Management.Automation.Language.TokenKind] ) |
 % { return ('if ($tokenKind -eq [System.Management.Automation.Language.TokenKind]::' + "$_) {`n # $_`n return `$$($_)_color;`n}") }
 
 [Enum]::GetValues( [System.Management.Automation.Language.TokenFlags] ) |
 % { return ('if ($tokenFlags.HasFlag([System.Management.Automation.Language.TokenFlags]::' + "$_)) {`n # $_`n return `$$($_)_color;`n}") }
 
#>