diff --git a/src/services/formatting/formatting.ts b/src/services/formatting/formatting.ts index 47cf646ba69..08792f76368 100644 --- a/src/services/formatting/formatting.ts +++ b/src/services/formatting/formatting.ts @@ -1191,7 +1191,7 @@ namespace ts.formatting { break; case RuleAction.DeleteToken: recordDelete(previousRange.pos, previousRange.end - previousRange.pos); - return onLaterLine ? LineAction.LineRemoved : LineAction.None; + break; case RuleAction.NewLine: // exit early if we on different lines and rule cannot change number of newlines // if line1 and line2 are on subsequent lines then no edits are required - ok to exit diff --git a/src/services/formatting/rules.ts b/src/services/formatting/rules.ts index 827378e3eed..0ddc304e2f9 100644 --- a/src/services/formatting/rules.ts +++ b/src/services/formatting/rules.ts @@ -778,15 +778,18 @@ namespace ts.formatting { } function isSemicolonDeletionContext(context: FormattingContext): boolean { - if (context.TokensAreOnSameLine()) { - return context.nextTokenSpan.kind === SyntaxKind.CloseBraceToken - || context.nextTokenSpan.kind === SyntaxKind.EndOfFileToken; - } - const nextToken = isTrivia(context.nextTokenSpan.kind) ? context.nextTokenParent.getChildAt(0) : context.nextTokenSpan; + const startLine = context.sourceFile.getLineAndCharacterOfPosition(context.currentTokenSpan.pos).line; + const endLine = context.sourceFile.getLineAndCharacterOfPosition(nextToken.pos).line; + if (startLine === endLine) { + return nextToken.kind === SyntaxKind.CloseBraceToken + || nextToken.kind === SyntaxKind.EndOfFileToken; + } + + if (nextToken.kind === SyntaxKind.SemicolonClassElement || nextToken.kind === SyntaxKind.SemicolonToken ) { diff --git a/src/services/types.ts b/src/services/types.ts index 1e6da950567..475594dfa5c 100644 --- a/src/services/types.ts +++ b/src/services/types.ts @@ -758,7 +758,7 @@ namespace ts { insertSpaceBeforeFunctionParenthesis: false, placeOpenBraceOnNewLineForFunctions: false, placeOpenBraceOnNewLineForControlBlocks: false, - // insertTrailingSemicolon: false, + insertTrailingSemicolon: false, }; } diff --git a/tests/cases/fourslash/formatRemoveSemicolons1.ts b/tests/cases/fourslash/formatRemoveSemicolons1.ts index 8b4150e4229..fe87970baa4 100644 --- a/tests/cases/fourslash/formatRemoveSemicolons1.ts +++ b/tests/cases/fourslash/formatRemoveSemicolons1.ts @@ -43,9 +43,9 @@ verify.currentFileContentIs(`; (function f() { })() const a = 3; + 4 const b = 3 -+ 4 + + 4 const c = 3 + -4 + 4 class C { prop ["p"] diff --git a/tests/cases/fourslash/formatRemoveSemicolons2.ts b/tests/cases/fourslash/formatRemoveSemicolons2.ts index 9760cc4f206..1371b94151f 100644 --- a/tests/cases/fourslash/formatRemoveSemicolons2.ts +++ b/tests/cases/fourslash/formatRemoveSemicolons2.ts @@ -1,15 +1,21 @@ /// -////interface I { -//// a: string; -//// /** @internal */ -//// b: string; +////namespace ts { +//// let x = 0; +//// interface I { +//// a: string; +//// /** @internal */ +//// b: string; +//// } ////} format.setFormatOptions({ ...format.copyFormatOptions(), insertTrailingSemicolon: false }); format.document(); -verify.currentFileContentIs(`interface I { - a: string - /** @internal */ - b: string +verify.currentFileContentIs(`namespace ts { + let x = 0 + interface I { + a: string + /** @internal */ + b: string + } }`);