PowerShell / PowerShell/PSScriptAnalyzer

When a line ends in an operator, automatically indent the next line since it is part of the same code statement

オープン
#2,003 コメント 1 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

Area - Formatter Area-Code Formatting Issue-Enhancement
主要言語
C#
スター
2.2k
フォーク
414
平均マージ
13時間 1分
マージ済み PR(30日)
2

説明

Summary of the new feature

As a user, when a line ends in a line continuation operator (=, +, -, etc.), I would like the next line to be indented so that it is clear both lines are part of the same statement, and that the 2nd line is not the start of a new code statement. This behaviour is already implemented for the pipe | operator, and it would be great if the other operators followed the same rules. This behaviour would also match the default behaviour of other languages, such as C# in Visual Studio. In VS Code, this behaviour is controlled for the pipe operator with the powershell.codeFormatting.pipelineIndentationStyle setting.

For example, when using the VS Code setting powershell.codeFormatting.pipelineIndentationStyle = IncreaseIndentationForFirstPipeline, the code is currently formatted like this:

$result =
Get-Process |
    Select-Object -First 1

I would prefer = to follow the same rules as | and have the code formatted like this:

$result =
    Get-Process |
    Select-Object -First 1

In this small example it may look silly to not just do:

$result = Get-Process |
    Select-Object -First 1

However, sometimes with fully qualified namespaces and descriptive variable names, the left-side of the equal operator may get very lengthy, such as:

[System.Collections.ArrayList] $listOfCustomersWithValidDriversLicenses = Get-CustomersFromCmdletWithAVeryLongName -Country Canada -AreaCode 123

This would look much better and prevent horizontal scrolling as:

[System.Collections.ArrayList] $listOfCustomersWithValidDriversLicenses = 
    Get-CustomersFromCmdletWithAVeryLongName -Country Canada -AreaCode 123

Currently, VS Code formats the code like this:

[System.Collections.ArrayList] $listOfCustomersWithValidDriversLicenses = 
Get-CustomersFromCmdletWithAVeryLongName -Country Canada -AreaCode 123

The current formatting makes it easy to overlook that the results returned from Get-CustomersFromCmdletWithAVeryLongName are being saved in a variable.

The example above is for the = operator, but I think it would make sense to do the same thing for +, -, and any other line continuation operators (i.e. that don't require a backtick ` to have the statement continue onto the next line).

Aside: I originally posted this issue in the vscode-powershell repo here, but I think this is the proper place for this feature request.

What is the latest version of PSScriptAnalyzer at the point of writing

The latest stable version of PSScriptAnalyzer is currently v1.22.0.

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

まず、PSScriptAnalyzer の formatter における既存のパイプ | のインデント動作と、行継続演算子がどのように分類されているかを追跡します。同じルールを =+- などの演算子にも拡張し、その後、例および既存のパイプの動作に照らして整形後の出力を検証します。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
powershell
領域
tooling
issue の種類
機能追加
難易度
4/5
見積もり時間
3〜5日
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
35/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。