Repository navigation
Closed
Description
Prerequisites
- I have written a descriptive issue title.
- I have searched all open and closed issues to ensure it has not already been reported.
- I have read the troubleshooting guide.
- I am sure this issue is with the extension itself and does not reproduce in a standalone PowerShell instance.
- I have verified that I am using the latest version of Visual Studio Code and the PowerShell extension.
- If this is a security issue, I have read the security issue reporting guidance.
Summary
When formatting the following PowerShell while powershell.codeFormatting.whitespaceBetweenParameters = true, it removes two of the redirectors:
Pre-Format
Import-Module -Name Module 3>&1 2>&1 1>$nullPost-Format
Import-Module -Name Module 1>$nullI would expect the redirectors to be left alone.
PowerShell Version
Name Value
---- -----
PSVersion 7.4.2
PSEdition Core
GitCommitId 7.4.2
OS Microsoft Windows 10.0.22631
Platform Win32NT
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
WSManStackVersion 3.0
Name : Visual Studio Code Host
Version : 2024.2.1
InstanceId : 71fd0027-ddfe-4add-82a3-1e0b2dbe844e
UI : System.Management.Automation.Internal.Host.InternalHostUserInterface
CurrentCulture : en-US
CurrentUICulture : en-US
PrivateData : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
DebuggerEnabled : True
IsRunspacePushed : False
Runspace : System.Management.Automation.Runspaces.LocalRunspaceVisual Studio Code Version
1.88.1
e170252f762678dec6ca2cc69aba1570769a5d39
x64Extension Version
ms-vscode.powershell@2024.2.1Steps to Reproduce
- Save the following to
test.ps1:
Import-Module -Name Module 3>&1 2>&1 1>$null- Press
Shift + Alt + Fto format the document. - Review improper formatting
Visuals
No response
Logs
No response
Activity
SydneyhSmith commentedon May 7, 2024
Thanks @nixuno we were able to reproduce this
liamjpeters commentedon May 13, 2024
This is quite an interesting one 😀. A slightly simplified repro in PSScriptAnalyzer is:
Results in:
The
PSUseConsistentWhitespacerule, whenCheckParameteristrue, is looking over all theCommandAstnodes.For each
CommandAst, it's finding all the direct children of the currentCommandAstnode.PSScriptAnalyzer/Rules/UseConsistentWhitespace.cs
Lines 399 to 400 in e1dc126
It's checking then that each one sequentially is separated by a 1 character gap.
PSScriptAnalyzer/Rules/UseConsistentWhitespace.cs
Lines 410 to 411 in e1dc126
It seems to be making the implicit assumption that the direct children of the
CommandAstare read from the AST in token order. This is, apparently, not the case.Looking at the AST of our example
Invoke-Foo 3>&1 1>&1 2>&1:We see that evidentially, the
MergingRedirectionAstnodes are read from the tree in stream order (very interesting!).I'm not smart enough to confirm this within the main Powershell Repo's parser - but I've tried with various orders of
Invoke-Foo 3>&1 2>&1 1>&1 5>&1 4>&1 6>&1and it appears to be consistent.My unrefined naive solution would be to sort the command parameters (the direct children of the
CommandAst), first by their ExtentsStartLineNumber, then by theStartColumnNumber. Then proceed as planned.This works as expected and our repro code correctly produces:
I would need to look at how badly this sorting impacts performance and for any edge cases.