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,);`);