Skip to content

PSUseConsistentIndentation.PipelineIndentation.None or 3 deletes commandlet name #1580

Closed
@ninmonkey

Description

@ninmonkey

When PSUseConsistentIndentation.PipelineIndentation is set to None or 3 it deletes where-object and foreach-object

Steps to reproduce

Sample input:

Get-ChildItem |
Where-Object Name -Like 'foo'

Get-ChildItem |
ForEach-Object Name

It happens using the format

foo |
bar

These formats work correctly

foo | bar

foo
| bar

Test cases

$script = @'
Get-ChildItem |
Where-Object Name -Like 'foo'

Get-ChildItem |
ForEach-Object Name
'@

$settings = @{
    IncludeRules = @('PSUseConsistentIndentation')
    Rules        = @{
        PSUseConsistentIndentation = @{
            Enable              = $true
            # Kind                = 'space'
            PipelineIndentation = 'None' # broke
            # IndentationSize     = 4
        }

    }
}
"

To reproduce: PipelineIndentation = None/3`n"
Invoke-Formatter -ScriptDefinition $script -Settings $settings

foreach ($mode in ('IncreaseIndentationAfterEveryPipeline', 'IncreaseIndentationForFirstPipeline', 'IncreaseIndentationAfterEveryPipeline', 'NoIndentation', 'None', ''))
{
    "`n`nMode: '$Mode'`n"
    $settings.Rules.PSUseConsistentIndentation.PipelineIndentation = $Mode
    Invoke-Formatter -ScriptDefinition $script -Settings $settings
}

Expected behavior

Results that contain Foreach-Object and Where-Object

Get-ChildItem |
    Where-Object Name -Like 'foo'

Get-ChildItem |
    ForEach-Object Name

Actual behavior

Get-ChildItem |
Name -Like 'foo'

Get-ChildItem |
Name

All enum types:

Mode: 'IncreaseIndentationAfterEveryPipeline'

Get-ChildItem |
    Where-Object Name -Like 'foo'

Get-ChildItem |
    ForEach-Object Name


Mode: 'IncreaseIndentationForFirstPipeline'

Get-ChildItem |
    Where-Object Name -Like 'foo'

Get-ChildItem |
    ForEach-Object Name


Mode: 'IncreaseIndentationAfterEveryPipeline'

Get-ChildItem |
    Where-Object Name -Like 'foo'

Get-ChildItem |
    ForEach-Object Name


Mode: 'NoIndentation'

Get-ChildItem |
Where-Object Name -Like 'foo'

Get-ChildItem |
ForEach-Object Name

Mode: 'None'

Get-ChildItem |
Name -Like 'foo'

Get-ChildItem |
Name


Mode: ''

Get-ChildItem |
    Where-Object Name -Like 'foo'

Get-ChildItem |
    ForEach-Object Name

Environment data

Occurs in normal powershell and vscode-powershell's integrated terminal

> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      7.0.3
PSEdition                      Core
GitCommitId                    7.0.3
OS                             Microsoft Windows 10.0.19041
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

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

The existing issues like #1168 deal with formatting, not mutating code

Metadata

Metadata

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions