Open C0smin opened 9 months ago
@C0smin what are your formatting settings?
Hi @SydneyhSmith, default VSCode and powershell extension, this is the only non default setting in my editor (this is global user-data settings.json):
{
"powershell.codeFormatting.pipelineIndentationStyle": "IncreaseIndentationForFirstPipeline"
}
I can confirm I can repro with this specific setting. The thing with using different non-default settings for pipelineIndentationStyle is that your mileage might vary, it can achieve it in most cases but there are lots of edge cases that is still doesn't get, hence why it's not the default. Still great to raise it so maybe I can later look at seeing whether we can fix that. I've been doing that for a few years now but due to PowerShell's generic nature it's hard to write generic code covering all cases...
I came here to report this issue as well; glad to see that someone already has 🙂 I too am using the VS Code setting powershell.codeFormatting.pipelineIndentationStyle
= IncreaseIndentationForFirstPipeline
and seeing the same issue.
I can confirm it also occurs when using the IncreaseIndentationAfterEveryPipeline
value, and is much worse since there will be several levels of indentation and the next code statement will continue with the deeper indentation. e.g.
$results.ServersResults |
Select-Object -Property PSComputerName -ExpandProperty Matches |
Select-Object -Property PSComputerName,
Match, FilePath, LineNumber, Line, Pattern |
Sort-Object -Property Match, PSComputerName, FilePath, LineNumber
# This next line should not be indented since it is not part of the above pipeline.
[PSCustomObject[]] $connectionErrors = Convert-ServersConnectionErrorsIntoUserFriendlyMessage
I find it's not consistent though. Sometimes the following statement does end up with the proper indentation, but other times it doesn't. I haven't been able to determine what exactly causes it to mess up sometimes.
I see C0smin reported that it happens when using a pipe inside of parenthesis, and I can reproduce the issue using his code snippet. My snippet does not use a pipe inside of parenthesis though, and actually just pasting my code above in isolation does not reproduce the issue 😕.
Ok, after a bit more testing I'm able to reproduce it with this code:
Process {
$results.ServersResults |
Select-Object -Property PSComputerName -ExpandProperty Matches |
Select-Object -Property PSComputerName,
Match, FilePath, LineNumber, Line, Pattern |
Sort-Object -Property Match, PSComputerName, FilePath, LineNumber
[PSCustomObject[]] $connectionErrors = Convert-ServersConnectionErrorsIntoUserFriendlyMessage
}
Begin {
function SomeFunction {
[string[]] $serverNames = Get-ADComputer -Property DnsHostName |
Sort-Object
}
}
That's the messed up indentation formatting. Down in the SomeFunction
, if you move the Sort-Object
up onto the above line and run the Format-Document
VS Code command, it fixes some of the indentation issues, but not all of them, and you get this:
Process {
$results.ServersResults |
Select-Object -Property PSComputerName -ExpandProperty Matches |
Select-Object -Property PSComputerName,
Match, FilePath, LineNumber, Line, Pattern |
Sort-Object -Property Match, PSComputerName, FilePath, LineNumber
[PSCustomObject[]] $connectionErrors = Convert-ServersConnectionErrorsIntoUserFriendlyMessage
}
Begin {
function SomeFunction {
[string[]] $serverNames = Get-ADComputer -Property DnsHostName | Sort-Object
}
}
If I remove the | Sort-Object
altogether, then it formats everything correctly:
Process {
$results.ServersResults |
Select-Object -Property PSComputerName -ExpandProperty Matches |
Select-Object -Property PSComputerName,
Match, FilePath, LineNumber, Line, Pattern |
Sort-Object -Property Match, PSComputerName, FilePath, LineNumber
[PSCustomObject[]] $connectionErrors = Convert-ServersConnectionErrorsIntoUserFriendlyMessage
}
Begin {
function SomeFunction {
[string[]] $serverNames = Get-ADComputer -Property DnsHostName
}
}
It's odd that code defined further down in the file can mess up the indentation of code above it in completely different scopes. Very weird, but it shows the problem isn't limited just to when you use a pipe inside of parenthesis.
Prerequisites
Summary
The formatting of code breaks, not closing the indentation where it is logical. The conditions are highlighted in the
Steps to reproduce
section but it seems to be related to using both the pipe|
and parenthesis()
in multiple lines.PowerShell Version
Visual Studio Code Version
Extension Version
Steps to Reproduce
Write-Host
is now indented at the same level as the closed parenthesis:Visuals
No response
Logs
No response