-
Notifications
You must be signed in to change notification settings - Fork 407
Fix PSUseConsistentIndentationRule to handle pipes correctly when there is a multi-line statement after a pipe and add PipelineIndentation customisation option for it #1102
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 8 commits
6d72212
eddbbcc
0991326
99611c7
abff01a
524caea
d636fb2
6e56087
f2a518f
24b1ae7
bcf7c9a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -57,6 +57,24 @@ public string Kind | |
| } | ||
| } | ||
|
|
||
|
|
||
| [ConfigurableRuleProperty(defaultValue: "IncreaseIndentationForFirstPipeline")] | ||
| public string PipelineIndentation | ||
| { | ||
| get | ||
| { | ||
| return pipelineIndentationStyle.ToString(); | ||
| } | ||
| set | ||
| { | ||
| if (String.IsNullOrWhiteSpace(value) || | ||
| !Enum.TryParse(value, true, out pipelineIndentationStyle)) | ||
| { | ||
| pipelineIndentationStyle = PipelineIndentationStyle.IncreaseIndentationAfterEveryPipeline; | ||
| } | ||
| } | ||
| } | ||
|
|
||
| private bool insertSpaces; | ||
| private char indentationChar; | ||
| private int indentationLevelMultiplier; | ||
|
|
@@ -68,9 +86,17 @@ private enum IndentationKind { | |
| // Auto | ||
| }; | ||
|
|
||
| private enum PipelineIndentationStyle | ||
| { | ||
| IncreaseIndentationForFirstPipeline, | ||
| IncreaseIndentationAfterEveryPipeline, | ||
| NoIndentation | ||
| } | ||
|
|
||
| // TODO make this configurable | ||
| private IndentationKind indentationKind = IndentationKind.Space; | ||
|
|
||
| private PipelineIndentationStyle pipelineIndentationStyle = PipelineIndentationStyle.IncreaseIndentationAfterEveryPipeline; | ||
|
|
||
| /// <summary> | ||
| /// Analyzes the given ast to find violations. | ||
|
|
@@ -104,6 +130,7 @@ public override IEnumerable<DiagnosticRecord> AnalyzeScript(Ast ast, string file | |
| var diagnosticRecords = new List<DiagnosticRecord>(); | ||
| var indentationLevel = 0; | ||
| var onNewLine = true; | ||
| var pipelineAsts = ast.FindAll(testAst => testAst is PipelineAst && (testAst as PipelineAst).PipelineElements.Count > 1, true); | ||
| for (int k = 0; k < tokens.Length; k++) | ||
| { | ||
| var token = tokens[k]; | ||
|
|
@@ -123,6 +150,27 @@ public override IEnumerable<DiagnosticRecord> AnalyzeScript(Ast ast, string file | |
| AddViolation(token, indentationLevel++, diagnosticRecords, ref onNewLine); | ||
| break; | ||
|
|
||
| case TokenKind.Pipe: | ||
| var pipelineIsFollowedByNewlineOrLineContinuation = k < tokens.Length - 1 && k > 0 && | ||
| (tokens[k + 1].Kind == TokenKind.NewLine || tokens[k + 1].Kind == TokenKind.LineContinuation); | ||
| if (!pipelineIsFollowedByNewlineOrLineContinuation) | ||
| { | ||
| break; | ||
| } | ||
| if (pipelineIndentationStyle == PipelineIndentationStyle.IncreaseIndentationAfterEveryPipeline) | ||
| { | ||
| AddViolation(token, indentationLevel++, diagnosticRecords, ref onNewLine); | ||
| } | ||
| else if (pipelineIndentationStyle == PipelineIndentationStyle.IncreaseIndentationForFirstPipeline) | ||
|
||
| { | ||
| var isFirstPipeInPipeline = pipelineAsts.Any(pipelineAst => PositionIsEqual(((PipelineAst)pipelineAst).PipelineElements[0].Extent.EndScriptPosition, tokens[k - 1].Extent.EndScriptPosition)); | ||
bergmeister marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| if (isFirstPipeInPipeline) | ||
| { | ||
| AddViolation(token, indentationLevel++, diagnosticRecords, ref onNewLine); | ||
| } | ||
| } | ||
| break; | ||
|
|
||
| case TokenKind.RParen: | ||
| case TokenKind.RCurly: | ||
| indentationLevel = ClipNegative(indentationLevel - 1); | ||
|
|
@@ -156,22 +204,44 @@ public override IEnumerable<DiagnosticRecord> AnalyzeScript(Ast ast, string file | |
| { | ||
| --j; | ||
| } | ||
|
|
||
| if (j >= 0 && tokens[j].Kind == TokenKind.Pipe) | ||
| { | ||
| ++tempIndentationLevel; | ||
| } | ||
| } | ||
|
|
||
| AddViolation(token, tempIndentationLevel, diagnosticRecords, ref onNewLine); | ||
| var lineHasPipelineBeforeToken = tokens.Any(oneToken => | ||
| oneToken.Kind == TokenKind.Pipe && | ||
| oneToken.Extent.StartLineNumber == token.Extent.StartLineNumber && | ||
| oneToken.Extent.StartColumnNumber < token.Extent.StartColumnNumber); | ||
|
|
||
| AddViolation(token, tempIndentationLevel, diagnosticRecords, ref onNewLine, lineHasPipelineBeforeToken); | ||
| } | ||
| break; | ||
| } | ||
|
|
||
| // Check if the current token matches the end of a PipelineAst | ||
| var matchingPipeLineAstEnd = pipelineAsts.FirstOrDefault(pipelineAst => | ||
| PositionIsEqual(pipelineAst.Extent.EndScriptPosition, token.Extent.EndScriptPosition)) as PipelineAst; | ||
| if (matchingPipeLineAstEnd != null) | ||
| { | ||
| if (pipelineIndentationStyle == PipelineIndentationStyle.IncreaseIndentationForFirstPipeline) | ||
| { | ||
| indentationLevel = ClipNegative(indentationLevel - 1); | ||
| } | ||
| else if (pipelineIndentationStyle == PipelineIndentationStyle.IncreaseIndentationAfterEveryPipeline) | ||
| { | ||
| indentationLevel = ClipNegative(indentationLevel - (matchingPipeLineAstEnd.PipelineElements.Count - 1)); | ||
| } | ||
| } | ||
| } | ||
|
|
||
| return diagnosticRecords; | ||
| } | ||
|
|
||
| private static bool PositionIsEqual(IScriptPosition position1, IScriptPosition position2) | ||
| { | ||
| return position1.ColumnNumber == position2.ColumnNumber && | ||
| position1.LineNumber == position2.LineNumber && | ||
| position1.File == position2.File; | ||
| } | ||
|
|
||
| /// <summary> | ||
| /// Retrieves the common name of this rule. | ||
| /// </summary> | ||
|
|
@@ -237,7 +307,8 @@ private void AddViolation( | |
| Token token, | ||
| int expectedIndentationLevel, | ||
| List<DiagnosticRecord> diagnosticRecords, | ||
| ref bool onNewLine) | ||
| ref bool onNewLine, | ||
| bool lineHasPipelineBeforeToken = false) | ||
| { | ||
| if (onNewLine) | ||
| { | ||
|
|
@@ -265,26 +336,28 @@ private void AddViolation( | |
| GetDiagnosticSeverity(), | ||
| fileName, | ||
| null, | ||
| GetSuggestedCorrections(token, expectedIndentationLevel))); | ||
| GetSuggestedCorrections(token, expectedIndentationLevel, lineHasPipelineBeforeToken))); | ||
| } | ||
| } | ||
| } | ||
|
|
||
| private List<CorrectionExtent> GetSuggestedCorrections( | ||
| Token token, | ||
| int indentationLevel) | ||
| int indentationLevel, | ||
| bool lineHasPipelineBeforeToken = false) | ||
| { | ||
| // TODO Add another constructor for correction extent that takes extent | ||
| // TODO handle param block | ||
| // TODO handle multiline commands | ||
|
|
||
| var corrections = new List<CorrectionExtent>(); | ||
| var optionalPipeline = lineHasPipelineBeforeToken ? "| " : string.Empty; | ||
| corrections.Add(new CorrectionExtent( | ||
| token.Extent.StartLineNumber, | ||
| token.Extent.EndLineNumber, | ||
| 1, | ||
| token.Extent.EndColumnNumber, | ||
| GetIndentationString(indentationLevel) + token.Extent.Text, | ||
| GetIndentationString(indentationLevel) + optionalPipeline + token.Extent.Text, | ||
| token.Extent.File)); | ||
| return corrections; | ||
| } | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.