Skip to content

Commit 4585f44

Browse files
a-tarasyukDanielRosenwasser
authored andcommitted
fix(35179): formatter incorrectly remove spaces (microsoft#35979)
1 parent a8944e6 commit 4585f44

File tree

2 files changed

+70
-2
lines changed

2 files changed

+70
-2
lines changed

src/services/formatting/rules.ts

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@ namespace ts.formatting {
7070
rule("NoSpaceAfterUnaryPrefixOperator", unaryPrefixOperators, unaryPrefixExpressions, [isNonJsxSameLineTokenContext, isNotBinaryOpContext], RuleAction.DeleteSpace),
7171
rule("NoSpaceAfterUnaryPreincrementOperator", SyntaxKind.PlusPlusToken, unaryPreincrementExpressions, [isNonJsxSameLineTokenContext], RuleAction.DeleteSpace),
7272
rule("NoSpaceAfterUnaryPredecrementOperator", SyntaxKind.MinusMinusToken, unaryPredecrementExpressions, [isNonJsxSameLineTokenContext], RuleAction.DeleteSpace),
73-
rule("NoSpaceBeforeUnaryPostincrementOperator", unaryPostincrementExpressions, SyntaxKind.PlusPlusToken, [isNonJsxSameLineTokenContext], RuleAction.DeleteSpace),
74-
rule("NoSpaceBeforeUnaryPostdecrementOperator", unaryPostdecrementExpressions, SyntaxKind.MinusMinusToken, [isNonJsxSameLineTokenContext], RuleAction.DeleteSpace),
73+
rule("NoSpaceBeforeUnaryPostincrementOperator", unaryPostincrementExpressions, SyntaxKind.PlusPlusToken, [isNonJsxSameLineTokenContext, isNotStatementConditionContext], RuleAction.DeleteSpace),
74+
rule("NoSpaceBeforeUnaryPostdecrementOperator", unaryPostdecrementExpressions, SyntaxKind.MinusMinusToken, [isNonJsxSameLineTokenContext, isNotStatementConditionContext], RuleAction.DeleteSpace),
7575

7676
// More unary operator special-casing.
7777
// DevDiv 181814: Be careful when removing leading whitespace
@@ -790,6 +790,25 @@ namespace ts.formatting {
790790
return context.contextNode.kind === SyntaxKind.NonNullExpression;
791791
}
792792

793+
function isNotStatementConditionContext(context: FormattingContext): boolean {
794+
return !isStatementConditionContext(context);
795+
}
796+
797+
function isStatementConditionContext(context: FormattingContext): boolean {
798+
switch (context.contextNode.kind) {
799+
case SyntaxKind.IfStatement:
800+
case SyntaxKind.ForStatement:
801+
case SyntaxKind.ForInStatement:
802+
case SyntaxKind.ForOfStatement:
803+
case SyntaxKind.DoStatement:
804+
case SyntaxKind.WhileStatement:
805+
return true;
806+
807+
default:
808+
return false;
809+
}
810+
}
811+
793812
function isSemicolonDeletionContext(context: FormattingContext): boolean {
794813
let nextTokenKind = context.nextTokenSpan.kind;
795814
let nextTokenStart = context.nextTokenSpan.pos;
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/// <reference path="fourslash.ts"/>
2+
3+
////let i = 0;
4+
////
5+
////if(i<0) ++i;
6+
////if(i<0) --i;
7+
////
8+
////while(i<0) ++i;
9+
////while(i<0) --i;
10+
////
11+
////do ++i;
12+
////while(i<0)
13+
////do --i;
14+
////while(i<0)
15+
////
16+
////for(let prop in { foo: 1 }) ++i;
17+
////for(let prop in { foo: 1 }) --i;
18+
////
19+
////for(let foo of [1, 2]) ++i;
20+
////for(let foo of [1, 2]) --i;
21+
////
22+
////for(let j = 0; j < 10; j++) ++i;
23+
////for(let j = 0; j < 10; j++) --i;
24+
////
25+
26+
format.document();
27+
verify.currentFileContentIs(
28+
`let i = 0;
29+
30+
if (i < 0) ++i;
31+
if (i < 0) --i;
32+
33+
while (i < 0) ++i;
34+
while (i < 0) --i;
35+
36+
do ++i;
37+
while (i < 0)
38+
do --i;
39+
while (i < 0)
40+
41+
for (let prop in { foo: 1 }) ++i;
42+
for (let prop in { foo: 1 }) --i;
43+
44+
for (let foo of [1, 2]) ++i;
45+
for (let foo of [1, 2]) --i;
46+
47+
for (let j = 0; j < 10; j++) ++i;
48+
for (let j = 0; j < 10; j++) --i;
49+
`);

0 commit comments

Comments
 (0)