diff --git a/src/services/formatting/rules.ts b/src/services/formatting/rules.ts index d93ce595ae1..3b32797b086 100644 --- a/src/services/formatting/rules.ts +++ b/src/services/formatting/rules.ts @@ -70,8 +70,8 @@ namespace ts.formatting { rule("NoSpaceAfterUnaryPrefixOperator", unaryPrefixOperators, unaryPrefixExpressions, [isNonJsxSameLineTokenContext, isNotBinaryOpContext], RuleAction.DeleteSpace), rule("NoSpaceAfterUnaryPreincrementOperator", SyntaxKind.PlusPlusToken, unaryPreincrementExpressions, [isNonJsxSameLineTokenContext], RuleAction.DeleteSpace), rule("NoSpaceAfterUnaryPredecrementOperator", SyntaxKind.MinusMinusToken, unaryPredecrementExpressions, [isNonJsxSameLineTokenContext], RuleAction.DeleteSpace), - rule("NoSpaceBeforeUnaryPostincrementOperator", unaryPostincrementExpressions, SyntaxKind.PlusPlusToken, [isNonJsxSameLineTokenContext], RuleAction.DeleteSpace), - rule("NoSpaceBeforeUnaryPostdecrementOperator", unaryPostdecrementExpressions, SyntaxKind.MinusMinusToken, [isNonJsxSameLineTokenContext], RuleAction.DeleteSpace), + rule("NoSpaceBeforeUnaryPostincrementOperator", unaryPostincrementExpressions, SyntaxKind.PlusPlusToken, [isNonJsxSameLineTokenContext, isNotStatementConditionContext], RuleAction.DeleteSpace), + rule("NoSpaceBeforeUnaryPostdecrementOperator", unaryPostdecrementExpressions, SyntaxKind.MinusMinusToken, [isNonJsxSameLineTokenContext, isNotStatementConditionContext], RuleAction.DeleteSpace), // More unary operator special-casing. // DevDiv 181814: Be careful when removing leading whitespace @@ -790,6 +790,25 @@ namespace ts.formatting { return context.contextNode.kind === SyntaxKind.NonNullExpression; } + function isNotStatementConditionContext(context: FormattingContext): boolean { + return !isStatementConditionContext(context); + } + + function isStatementConditionContext(context: FormattingContext): boolean { + switch (context.contextNode.kind) { + case SyntaxKind.IfStatement: + case SyntaxKind.ForStatement: + case SyntaxKind.ForInStatement: + case SyntaxKind.ForOfStatement: + case SyntaxKind.DoStatement: + case SyntaxKind.WhileStatement: + return true; + + default: + return false; + } + } + function isSemicolonDeletionContext(context: FormattingContext): boolean { let nextTokenKind = context.nextTokenSpan.kind; let nextTokenStart = context.nextTokenSpan.pos; diff --git a/tests/cases/fourslash/spaceAfterStatementConditions.ts b/tests/cases/fourslash/spaceAfterStatementConditions.ts new file mode 100644 index 00000000000..2dc6f0f302f --- /dev/null +++ b/tests/cases/fourslash/spaceAfterStatementConditions.ts @@ -0,0 +1,49 @@ +/// + +////let i = 0; +//// +////if(i<0) ++i; +////if(i<0) --i; +//// +////while(i<0) ++i; +////while(i<0) --i; +//// +////do ++i; +////while(i<0) +////do --i; +////while(i<0) +//// +////for(let prop in { foo: 1 }) ++i; +////for(let prop in { foo: 1 }) --i; +//// +////for(let foo of [1, 2]) ++i; +////for(let foo of [1, 2]) --i; +//// +////for(let j = 0; j < 10; j++) ++i; +////for(let j = 0; j < 10; j++) --i; +//// + +format.document(); +verify.currentFileContentIs( +`let i = 0; + +if (i < 0) ++i; +if (i < 0) --i; + +while (i < 0) ++i; +while (i < 0) --i; + +do ++i; +while (i < 0) +do --i; +while (i < 0) + +for (let prop in { foo: 1 }) ++i; +for (let prop in { foo: 1 }) --i; + +for (let foo of [1, 2]) ++i; +for (let foo of [1, 2]) --i; + +for (let j = 0; j < 10; j++) ++i; +for (let j = 0; j < 10; j++) --i; +`);