PSScriptAnalyzer icon indicating copy to clipboard operation
PSScriptAnalyzer copied to clipboard

Formatting misses certain keywords (unary operators, 'until')

Open TMA-2 opened this issue 9 months ago • 4 comments

I found that during formatting, some keywords aren't separated from leading braces (while), and some are seemingly ignored entirely (until). Also, unary operators (-not, -bnot, etc.) aren't separated with whitespace the same way as binary operators (-eq, -like, etc.).

Steps to reproduce

  1. Paste the following into a script
  2. Use Invoke-Formatter or the PowerShell VSCode extension to format the document
if(-not$false) {
    do{
        "Hello!"
    }until(
        $True
    )
    do{
        "Oh, hi!"
    }while(
        -not$True
    )
    while(-not$True) {
        "This won't show up."
    }
}

Expected behavior

Roughly the following output. Some is dependent on brace style (OTBS in this case), but all rules for inserting whitespace around keywords and operators should be enabled.

if (-not $false) {
    do {
        'Hello!'
    } until (
        $True
    )
    do {
        'Oh, hi!'
    } while (
        -not $True
    )
    while (-not $True) {
        "This won't show up."
    }
}

Actual behavior

if (-not$false) { # -not isn't separated by whitespace
    do {
        'Hello!'
    }until( # no whitespace around Until
        $True
    )
    do {
        'Oh, hi!'
    }while ( # only trailing whitespace for While
        -not$True # no separation
    )
    while (-not$True) { # no separation for -not and -bnot
        "This won't show up."
    }
}

Environment data

> $PSVersionTable
Name                           Value
----                           -----
PSVersion                      5.1.19041.5737
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.19041.5737
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

> (Get-Module -ListAvailable PSScriptAnalyzer).Version | ForEach-Object { $_.ToString() }
1.23.0

1.23.0 is the version included with the current (2025.0.0) VSCode PowerShell extension. I've also installed and tested 1.24.0 with the same results.

TMA-2 avatar Apr 15 '25 17:04 TMA-2

Suggest to try the new 1.24.0 release, which is in the preview version of the vc code ps extension. some things around whitespaces are tweaked but not your cases I think. UseConsistentWhitespace has CheckOperator option, which could be enhanced with your -not$false case and keywords like do-while should probably be a new option

bergmeister avatar Apr 17 '25 10:04 bergmeister

Suggest to try the new 1.24.0 release, which is in the preview version of the vc code ps extension. some things around whitespaces are tweaked but not your cases I think. UseConsistentWhitespace has CheckOperator option, which could be enhanced with your -not$false case and keywords like do-while should probably be a new option

Thanks for the reply. I've tried 1.24.0 with the same results, so I think it might just be something that needs to be added like you said.

TMA-2 avatar Apr 22 '25 15:04 TMA-2

Overhauled a bit of the logic in UseConstantWhitespace to knock this one out. PR is good to go.

DrSkillIssue avatar Jun 17 '25 12:06 DrSkillIssue

Update: I just noticed that using -join is also affected when used as a unary operator:

Invoke-Formatter -ScriptDefinition '-join$Array'
# Output: -join$Array
Invoke-Formatter -ScriptDefinition '$Array-join","'
# Output: $Array -join ","

TMA-2 avatar Oct 08 '25 18:10 TMA-2