diff --git a/src/services/formatting/formatting.ts b/src/services/formatting/formatting.ts index d7d8d1bcb77..bdd56acd960 100644 --- a/src/services/formatting/formatting.ts +++ b/src/services/formatting/formatting.ts @@ -824,8 +824,11 @@ namespace ts.formatting { if (listEndToken !== SyntaxKind.Unknown && formattingScanner.isOnToken()) { let tokenInfo: TokenInfo | undefined = formattingScanner.readTokenInfo(parent); if (tokenInfo.token.kind === SyntaxKind.CommaToken && isCallLikeExpression(parent)) { - formattingScanner.advance(); - tokenInfo = formattingScanner.isOnToken() ? formattingScanner.readTokenInfo(parent) : undefined; + const commaTokenLine = sourceFile.getLineAndCharacterOfPosition(tokenInfo.token.pos).line; + if (startLine !== commaTokenLine) { + formattingScanner.advance(); + tokenInfo = formattingScanner.isOnToken() ? formattingScanner.readTokenInfo(parent) : undefined; + } } // consume the list end token only if it is still belong to the parent diff --git a/src/services/formatting/rules.ts b/src/services/formatting/rules.ts index 3b32797b086..80fcc6bd9e9 100644 --- a/src/services/formatting/rules.ts +++ b/src/services/formatting/rules.ts @@ -241,7 +241,7 @@ namespace ts.formatting { rule("SpaceAfterConstructor", SyntaxKind.ConstructorKeyword, SyntaxKind.OpenParenToken, [isOptionEnabled("insertSpaceAfterConstructor"), isNonJsxSameLineTokenContext], RuleAction.InsertSpace), rule("NoSpaceAfterConstructor", SyntaxKind.ConstructorKeyword, SyntaxKind.OpenParenToken, [isOptionDisabledOrUndefined("insertSpaceAfterConstructor"), isNonJsxSameLineTokenContext], RuleAction.DeleteSpace), - rule("SpaceAfterComma", SyntaxKind.CommaToken, anyToken, [isOptionEnabled("insertSpaceAfterCommaDelimiter"), isNonJsxSameLineTokenContext, isNonJsxElementOrFragmentContext, isNextTokenNotCloseBracket], RuleAction.InsertSpace), + rule("SpaceAfterComma", SyntaxKind.CommaToken, anyToken, [isOptionEnabled("insertSpaceAfterCommaDelimiter"), isNonJsxSameLineTokenContext, isNonJsxElementOrFragmentContext, isNextTokenNotCloseBracket, isNextTokenNotCloseParen], RuleAction.InsertSpace), rule("NoSpaceAfterComma", SyntaxKind.CommaToken, anyToken, [isOptionDisabledOrUndefined("insertSpaceAfterCommaDelimiter"), isNonJsxSameLineTokenContext, isNonJsxElementOrFragmentContext], RuleAction.DeleteSpace), // Insert space after function keyword for anonymous functions @@ -670,6 +670,10 @@ namespace ts.formatting { return context.nextTokenSpan.kind !== SyntaxKind.CloseBracketToken; } + function isNextTokenNotCloseParen(context: FormattingContext): boolean { + return context.nextTokenSpan.kind !== SyntaxKind.CloseParenToken; + } + function isArrowFunctionContext(context: FormattingContext): boolean { return context.contextNode.kind === SyntaxKind.ArrowFunction; } diff --git a/tests/cases/fourslash/formatNoSpaceBeforeCloseBrace.ts b/tests/cases/fourslash/formatNoSpaceBeforeCloseBrace.ts new file mode 100644 index 00000000000..931d06df8ae --- /dev/null +++ b/tests/cases/fourslash/formatNoSpaceBeforeCloseBrace.ts @@ -0,0 +1,6 @@ +/// + +////foo(1, /* comment */ ); + +format.document(); +verify.currentFileContentIs(`foo(1, /* comment */);`); diff --git a/tests/cases/fourslash/formatNoSpaceBeforeCloseBrace1.ts b/tests/cases/fourslash/formatNoSpaceBeforeCloseBrace1.ts new file mode 100644 index 00000000000..b71ca4a2617 --- /dev/null +++ b/tests/cases/fourslash/formatNoSpaceBeforeCloseBrace1.ts @@ -0,0 +1,6 @@ +/// + +////new Foo(1, /* comment */ ); + +format.document(); +verify.currentFileContentIs(`new Foo(1, /* comment */);`); diff --git a/tests/cases/fourslash/formatNoSpaceBeforeCloseBrace2.ts b/tests/cases/fourslash/formatNoSpaceBeforeCloseBrace2.ts new file mode 100644 index 00000000000..a227ac4ec1e --- /dev/null +++ b/tests/cases/fourslash/formatNoSpaceBeforeCloseBrace2.ts @@ -0,0 +1,6 @@ +/// + +////new Foo(1, ); + +format.document(); +verify.currentFileContentIs(`new Foo(1,);`);