Skip to content

Commit bef6a66

Browse files
authored
Add a rule to toggle space after opening brace and before closing brace (#10447)
* Add a rule to toggle space after opening brace and before closing brace * Make the added format option optional * Fix merge issues
1 parent 43e1915 commit bef6a66

File tree

6 files changed

+23
-1
lines changed

6 files changed

+23
-1
lines changed

src/harness/fourslash.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,7 @@ namespace FourSlash {
360360
InsertSpaceAfterFunctionKeywordForAnonymousFunctions: false,
361361
InsertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis: false,
362362
InsertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets: false,
363+
InsertSpaceAfterOpeningAndBeforeClosingNonemptyBraces: true,
363364
InsertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces: false,
364365
InsertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces: false,
365366
PlaceOpenBraceOnNewLineForFunctions: false,

src/server/editorServices.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1594,6 +1594,7 @@ namespace ts.server {
15941594
InsertSpaceAfterFunctionKeywordForAnonymousFunctions: false,
15951595
InsertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis: false,
15961596
InsertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets: false,
1597+
InsertSpaceAfterOpeningAndBeforeClosingNonemptyBraces: true,
15971598
InsertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces: false,
15981599
InsertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces: false,
15991600
PlaceOpenBraceOnNewLineForFunctions: false,

src/services/formatting/rules.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ namespace ts.formatting {
5050
// Insert a space after { and before } in single-line contexts, but remove space from empty object literals {}.
5151
public SpaceAfterOpenBrace: Rule;
5252
public SpaceBeforeCloseBrace: Rule;
53+
public NoSpaceAfterOpenBrace: Rule;
54+
public NoSpaceBeforeCloseBrace: Rule;
5355
public NoSpaceBetweenEmptyBraceBrackets: Rule;
5456

5557
// Insert new line after { and before } in multi-line contexts.
@@ -287,6 +289,8 @@ namespace ts.formatting {
287289
// Insert a space after { and before } in single-line contexts, but remove space from empty object literals {}.
288290
this.SpaceAfterOpenBrace = new Rule(RuleDescriptor.create3(SyntaxKind.OpenBraceToken, Shared.TokenRange.Any), RuleOperation.create2(new RuleOperationContext(Rules.IsSingleLineBlockContext), RuleAction.Space));
289291
this.SpaceBeforeCloseBrace = new Rule(RuleDescriptor.create2(Shared.TokenRange.Any, SyntaxKind.CloseBraceToken), RuleOperation.create2(new RuleOperationContext(Rules.IsSingleLineBlockContext), RuleAction.Space));
292+
this.NoSpaceAfterOpenBrace = new Rule(RuleDescriptor.create3(SyntaxKind.OpenBraceToken, Shared.TokenRange.Any), RuleOperation.create2(new RuleOperationContext(Rules.IsSingleLineBlockContext), RuleAction.Delete));
293+
this.NoSpaceBeforeCloseBrace = new Rule(RuleDescriptor.create2(Shared.TokenRange.Any, SyntaxKind.CloseBraceToken), RuleOperation.create2(new RuleOperationContext(Rules.IsSingleLineBlockContext), RuleAction.Delete));
290294
this.NoSpaceBetweenEmptyBraceBrackets = new Rule(RuleDescriptor.create1(SyntaxKind.OpenBraceToken, SyntaxKind.CloseBraceToken), RuleOperation.create2(new RuleOperationContext(Rules.IsNonJsxSameLineTokenContext, Rules.IsObjectContext), RuleAction.Delete));
291295

292296
// Insert new line after { and before } in multi-line contexts.
@@ -414,7 +418,7 @@ namespace ts.formatting {
414418
this.SpaceAfterPostdecrementWhenFollowedBySubtract,
415419
this.SpaceAfterSubtractWhenFollowedByUnaryMinus, this.SpaceAfterSubtractWhenFollowedByPredecrement,
416420
this.NoSpaceAfterCloseBrace,
417-
this.SpaceAfterOpenBrace, this.SpaceBeforeCloseBrace, this.NewLineBeforeCloseBraceInBlockContext,
421+
this.NewLineBeforeCloseBraceInBlockContext,
418422
this.SpaceAfterCloseBrace, this.SpaceBetweenCloseBraceAndElse, this.SpaceBetweenCloseBraceAndWhile, this.NoSpaceBetweenEmptyBraceBrackets,
419423
this.NoSpaceBetweenFunctionKeywordAndStar, this.SpaceAfterStarInGeneratorDeclaration,
420424
this.SpaceAfterFunctionInFuncDecl, this.NewLineAfterOpenBraceInBlockContext, this.SpaceAfterGetSetInMember,

src/services/formatting/rulesProvider.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,19 @@ namespace ts.formatting {
8181
rules.push(this.globalRules.NoSpaceBetweenBrackets);
8282
}
8383

84+
// The default value of InsertSpaceAfterOpeningAndBeforeClosingNonemptyBraces is true
85+
// so if the option is undefined, we should treat it as true as well
86+
if (options.InsertSpaceAfterOpeningAndBeforeClosingNonemptyBraces !== false) {
87+
rules.push(this.globalRules.SpaceAfterOpenBrace);
88+
rules.push(this.globalRules.SpaceBeforeCloseBrace);
89+
rules.push(this.globalRules.NoSpaceBetweenEmptyBraceBrackets);
90+
}
91+
else {
92+
rules.push(this.globalRules.NoSpaceAfterOpenBrace);
93+
rules.push(this.globalRules.NoSpaceBeforeCloseBrace);
94+
rules.push(this.globalRules.NoSpaceBetweenEmptyBraceBrackets);
95+
}
96+
8497
if (options.InsertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces) {
8598
rules.push(this.globalRules.SpaceAfterTemplateHeadAndMiddle);
8699
rules.push(this.globalRules.SpaceBeforeTemplateMiddleAndTail);

src/services/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,7 @@ namespace ts {
349349
InsertSpaceAfterFunctionKeywordForAnonymousFunctions: boolean;
350350
InsertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis: boolean;
351351
InsertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets: boolean;
352+
InsertSpaceAfterOpeningAndBeforeClosingNonemptyBraces?: boolean;
352353
InsertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces: boolean;
353354
InsertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces?: boolean;
354355
PlaceOpenBraceOnNewLineForFunctions: boolean;

tests/cases/fourslash/formattingOptionsChange.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
////}
1313
/////*PlaceOpenBraceOnNewLineForControlBlocks*/if (true) {
1414
////}
15+
/////*InsertSpaceAfterOpeningAndBeforeClosingNonemptyBraces*/{ var t = 1};
1516

1617
runTest("InsertSpaceAfterCommaDelimiter", "[1, 2, 3];[72,];", "[1,2,3];[72,];");
1718
runTest("InsertSpaceAfterSemicolonInForStatements", "for (i = 0; i; i++);", "for (i = 0;i;i++);");
@@ -23,6 +24,7 @@ runTest("InsertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets", "[ 1 ];[];[];
2324
runTest("InsertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces", "`${ 1 }`; `${ 1 }`", "`${1}`; `${1}`");
2425
runTest("PlaceOpenBraceOnNewLineForFunctions", "class foo", "class foo {");
2526
runTest("PlaceOpenBraceOnNewLineForControlBlocks", "if ( true )", "if ( true ) {");
27+
runTest("InsertSpaceAfterOpeningAndBeforeClosingNonemptyBraces", "{ var t = 1 };", "{var t = 1};");
2628

2729

2830
function runTest(propertyName: string, expectedStringWhenTrue: string, expectedStringWhenFalse: string) {

0 commit comments

Comments
 (0)