From 2efc92d1dc35c5683cb7bcf438f5f72351a19220 Mon Sep 17 00:00:00 2001 From: Andy Date: Mon, 18 Dec 2017 10:54:54 -0800 Subject: [PATCH] Adjust formatting rule priority: Never delete space after `case` (#20615) --- src/services/formatting/rules.ts | 11 ++++++----- .../fourslash/server/formatBracketInSwitchCase.ts | 11 +++++++++++ 2 files changed, 17 insertions(+), 5 deletions(-) create mode 100644 tests/cases/fourslash/server/formatBracketInSwitchCase.ts diff --git a/src/services/formatting/rules.ts b/src/services/formatting/rules.ts index 8214ffd6f2d..91c133ca352 100644 --- a/src/services/formatting/rules.ts +++ b/src/services/formatting/rules.ts @@ -302,7 +302,7 @@ namespace ts.formatting { rule("NoSpaceAfterTypeAssertion", SyntaxKind.GreaterThanToken, anyToken, [isOptionDisabledOrUndefined("insertSpaceAfterTypeAssertion"), isNonJsxSameLineTokenContext, isTypeAssertionContext], RuleAction.Delete), ]; - // These rules are lower in priority than user-configurable + // These rules are lower in priority than user-configurable. Rules earlier in this list have priority over rules later in the list. const lowPriorityCommonRules = [ // Space after keyword but not before ; or : or ? rule("NoSpaceBeforeSemicolon", anyToken, SyntaxKind.SemicolonToken, [isNonJsxSameLineTokenContext], RuleAction.Delete), @@ -312,10 +312,6 @@ namespace ts.formatting { rule("SpaceBeforeOpenBraceInTypeScriptDeclWithBlock", typeScriptOpenBraceLeftTokenRange, SyntaxKind.OpenBraceToken, [isOptionDisabledOrUndefinedOrTokensOnSameLine("placeOpenBraceOnNewLineForFunctions"), isTypeScriptDeclWithBlockContext, isNotFormatOnEnter, isSameLineTokenOrBeforeBlockContext], RuleAction.Space, RuleFlags.CanDeleteNewLines), rule("NoSpaceBeforeComma", anyToken, SyntaxKind.CommaToken, [isNonJsxSameLineTokenContext], RuleAction.Delete), - // No space before and after indexer - rule("NoSpaceBeforeOpenBracket", anyTokenExcept(SyntaxKind.AsyncKeyword), SyntaxKind.OpenBracketToken, [isNonJsxSameLineTokenContext], RuleAction.Delete), - rule("NoSpaceAfterCloseBracket", SyntaxKind.CloseBracketToken, anyToken, [isNonJsxSameLineTokenContext, isNotBeforeBlockInFunctionDeclarationContext], RuleAction.Delete), - rule("SpaceAfterSemicolon", SyntaxKind.SemicolonToken, anyToken, [isNonJsxSameLineTokenContext], RuleAction.Space), // Add a space between statements. All keywords except (do,else,case) has open/close parens after them. // So, we have a rule to add a space for [),Any], [do,Any], [else,Any], and [case,Any] @@ -327,6 +323,11 @@ namespace ts.formatting { RuleAction.Space), // This low-pri rule takes care of "try {" and "finally {" in case the rule SpaceBeforeOpenBraceInControl didn't execute on FormatOnEnter. rule("SpaceAfterTryFinally", [SyntaxKind.TryKeyword, SyntaxKind.FinallyKeyword], SyntaxKind.OpenBraceToken, [isNonJsxSameLineTokenContext], RuleAction.Space), + + // No space before and after indexer `x[]` + rule("NoSpaceBeforeOpenBracket", anyTokenExcept(SyntaxKind.AsyncKeyword), SyntaxKind.OpenBracketToken, [isNonJsxSameLineTokenContext], RuleAction.Delete), + rule("NoSpaceAfterCloseBracket", SyntaxKind.CloseBracketToken, anyToken, [isNonJsxSameLineTokenContext, isNotBeforeBlockInFunctionDeclarationContext], RuleAction.Delete), + rule("SpaceAfterSemicolon", SyntaxKind.SemicolonToken, anyToken, [isNonJsxSameLineTokenContext], RuleAction.Space), ]; return [ diff --git a/tests/cases/fourslash/server/formatBracketInSwitchCase.ts b/tests/cases/fourslash/server/formatBracketInSwitchCase.ts new file mode 100644 index 00000000000..116138f9743 --- /dev/null +++ b/tests/cases/fourslash/server/formatBracketInSwitchCase.ts @@ -0,0 +1,11 @@ +/// + +////switch (x) { +//// case[]: +////} + +format.document(); +verify.currentFileContentIs( +`switch (x) { + case []: +}`);