Skip to content

Commit 2b6ef79

Browse files
committed
Fixed incorrect insertSpaceBeforeFunctionParenthesis behavior on functions with type-arguments
There was an interference between the SpaceBeforeOpenParenInFuncDecl and the NoSpaceAfterCloseAngularBracket rules. So, the NoSpaceAfterCloseAngularBracket eliminated a space which has been added by the SpaceBeforeOpenParenInFuncDecl rule.
1 parent e5f8287 commit 2b6ef79

3 files changed

Lines changed: 13 additions & 3 deletions

File tree

src/services/formatting/rules.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -379,7 +379,7 @@ namespace ts.formatting {
379379
this.NoSpaceBetweenCloseParenAndAngularBracket = new Rule(RuleDescriptor.create1(SyntaxKind.CloseParenToken, SyntaxKind.LessThanToken), RuleOperation.create2(new RuleOperationContext(Rules.IsNonJsxSameLineTokenContext, Rules.IsTypeArgumentOrParameterOrAssertionContext), RuleAction.Delete));
380380
this.NoSpaceAfterOpenAngularBracket = new Rule(RuleDescriptor.create3(SyntaxKind.LessThanToken, Shared.TokenRange.Any), RuleOperation.create2(new RuleOperationContext(Rules.IsNonJsxSameLineTokenContext, Rules.IsTypeArgumentOrParameterOrAssertionContext), RuleAction.Delete));
381381
this.NoSpaceBeforeCloseAngularBracket = new Rule(RuleDescriptor.create2(Shared.TokenRange.Any, SyntaxKind.GreaterThanToken), RuleOperation.create2(new RuleOperationContext(Rules.IsNonJsxSameLineTokenContext, Rules.IsTypeArgumentOrParameterOrAssertionContext), RuleAction.Delete));
382-
this.NoSpaceAfterCloseAngularBracket = new Rule(RuleDescriptor.create3(SyntaxKind.GreaterThanToken, Shared.TokenRange.FromTokens([SyntaxKind.OpenParenToken, SyntaxKind.OpenBracketToken, SyntaxKind.GreaterThanToken, SyntaxKind.CommaToken])), RuleOperation.create2(new RuleOperationContext(Rules.IsNonJsxSameLineTokenContext, Rules.IsTypeArgumentOrParameterOrAssertionContext), RuleAction.Delete));
382+
this.NoSpaceAfterCloseAngularBracket = new Rule(RuleDescriptor.create3(SyntaxKind.GreaterThanToken, Shared.TokenRange.FromTokens([SyntaxKind.OpenParenToken, SyntaxKind.OpenBracketToken, SyntaxKind.GreaterThanToken, SyntaxKind.CommaToken])), RuleOperation.create2(new RuleOperationContext(Rules.IsNonJsxSameLineTokenContext, Rules.IsTypeArgumentOrParameterOrAssertionContext, Rules.IsNotFunctionDeclContext /*To prevent an interference with the SpaceBeforeOpenParenInFuncDecl rule*/), RuleAction.Delete));
383383

384384
// Remove spaces in empty interface literals. e.g.: x: {}
385385
this.NoSpaceBetweenEmptyInterfaceBraceBrackets = new Rule(RuleDescriptor.create1(SyntaxKind.OpenBraceToken, SyntaxKind.CloseBraceToken), RuleOperation.create2(new RuleOperationContext(Rules.IsNonJsxSameLineTokenContext, Rules.IsObjectTypeContext), RuleAction.Delete));
@@ -718,6 +718,10 @@ namespace ts.formatting {
718718
return false;
719719
}
720720

721+
static IsNotFunctionDeclContext(context: FormattingContext): boolean {
722+
return !Rules.IsFunctionDeclContext(context);
723+
}
724+
721725
static IsFunctionDeclarationOrFunctionExpressionContext(context: FormattingContext): boolean {
722726
return context.contextNode.kind === SyntaxKind.FunctionDeclaration || context.contextNode.kind === SyntaxKind.FunctionExpression;
723727
}

tests/cases/fourslash/formattingSpaceBeforeFunctionParen.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
/////*2*/function boo () { }
55
/////*3*/var bar = function foo() { };
66
/////*4*/var foo = { bar() { } };
7+
/////*5*/function tmpl <T> () { }
78

89
format.setOption("InsertSpaceBeforeFunctionParenthesis", true);
910

@@ -16,4 +17,6 @@ verify.currentLineContentIs('function boo () { }');
1617
goTo.marker('3');
1718
verify.currentLineContentIs('var bar = function foo () { };');
1819
goTo.marker('4');
19-
verify.currentLineContentIs('var foo = { bar () { } };');
20+
verify.currentLineContentIs('var foo = { bar () { } };');
21+
goTo.marker('5');
22+
verify.currentLineContentIs('function tmpl<T> () { }');

tests/cases/fourslash/genericsFormatting.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
////foo()<number, string, T >();
1616
////(a + b)<number, string, T >();
1717
////
18-
////function bar<T>() {
18+
/////*inFunctionDeclaration*/function bar <T> () {
1919
/////*inClassExpression*/ return class < T2 > {
2020
//// }
2121
////}
@@ -42,6 +42,9 @@ verify.currentLineContentIs(" new <T>(a: T);");
4242
goTo.marker("inOptionalMethodSignature");
4343
verify.currentLineContentIs(" op?<T, M>(a: T, b: M);");
4444

45+
goTo.marker("inFunctionDeclaration");
46+
verify.currentLineContentIs("function bar<T>() {");
47+
4548
goTo.marker("inClassExpression");
4649
verify.currentLineContentIs(" return class <T2> {");
4750

0 commit comments

Comments
 (0)