From dddc4660a1134e1d6fdafff6814efa469c34d205 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Sat, 7 Mar 2015 13:33:02 -0800 Subject: [PATCH] Simplify code to emit indent code. --- src/compiler/emitter.ts | 74 ++++++++----------- src/compiler/parser.ts | 9 ++- src/compiler/types.ts | 2 + .../baselines/reference/APISample_compile.js | 2 + .../reference/APISample_compile.types | 8 ++ tests/baselines/reference/APISample_linter.js | 2 + .../reference/APISample_linter.types | 8 ++ .../reference/APISample_transform.js | 2 + .../reference/APISample_transform.types | 8 ++ .../baselines/reference/APISample_watcher.js | 2 + .../reference/APISample_watcher.types | 8 ++ 11 files changed, 80 insertions(+), 45 deletions(-) diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 9cdcfeef09d..154b0874548 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -2917,6 +2917,7 @@ module ts { function createPropertyAccessExpression(expression: LeftHandSideExpression, name: Identifier): PropertyAccessExpression { var result = createSynthesizedNode(SyntaxKind.PropertyAccessExpression); result.expression = expression; + result.dotToken = createSynthesizedNode(SyntaxKind.DotToken); result.name = name; return result; @@ -3032,6 +3033,20 @@ module ts { return false; } + function indentIfOnDifferentLines(parent: Node, node1: Node, node2: Node) { + var isSynthesized = nodeIsSynthesized(parent); + + var realNodesAreOnDifferentLines = !isSynthesized && !nodeEndIsOnSameLineAsNodeStart(node1, node2); + var synthesizedNodeIsOnDifferentLine = synthesizedNodeStartsOnNewLine(node2); + if (realNodesAreOnDifferentLines || synthesizedNodeIsOnDifferentLine) { + increaseIndent(); + writeLine(); + return true; + } + + return false; + } + function emitPropertyAccess(node: PropertyAccessExpression) { if (tryEmitConstantValue(node)) { return; @@ -3039,21 +3054,11 @@ module ts { emit(node.expression); - var indented = false; - var isSynthesied = nodeIsSynthesized(node); - if (!isSynthesied && !nodeEndIsOnSameLineAsNodeStart(node.expression, node.dotToken)) { - indented = true; - increaseIndent(); - writeLine(); - } + var indented = indentIfOnDifferentLines(node, node.expression, node.dotToken); write("."); - if (!isSynthesied && !nodeEndIsOnSameLineAsNodeStart(node.dotToken, node.name) && !indented) { - indented = true; - increaseIndent(); - writeLine(); - } + indented = indented || indentIfOnDifferentLines(node, node.dotToken, node.name); emit(node.name); @@ -3292,42 +3297,28 @@ module ts { // If there was a newline between the left side of the binary expression and the // operator, then try to preserve that. - var indented = false; - var isSynthesied = nodeIsSynthesized(node); - if (!isSynthesied && !nodeEndIsOnSameLineAsNodeStart(node.left, node.operatorToken)) { - indented = true; - increaseIndent(); - writeLine(); - } - else { - // Otherwise just emit the operator right afterwards. For everything but - // comma, emit a space before the operator. - if (node.operatorToken.kind !== SyntaxKind.CommaToken) { - write(" "); - } + var indented1 = indentIfOnDifferentLines(node, node.left, node.operatorToken); + + // Otherwise just emit the operator right afterwards. For everything but + // comma, emit a space before the operator. + if (!indented1 && node.operatorToken.kind !== SyntaxKind.CommaToken) { + write(" "); } write(tokenToString(node.operatorToken.kind)); - // If there was a newline after the operator (or this is a synthesized node that - // wants to be on a new line), then put a newline in. But only if we haven't - // already done this for the left side. - var wantsIndent = (!isSynthesied && !nodeEndIsOnSameLineAsNodeStart(node.operatorToken, node.right)) || - synthesizedNodeStartsOnNewLine(node.right); + if (!indented1) { + var indented2 = indentIfOnDifferentLines(node, node.operatorToken, node.right); + } - if (wantsIndent && !indented) { - indented = true; - increaseIndent(); - writeLine(); - emit(node.right); - } - else { + if (!indented2) { write(" "); - emit(node.right); } + emit(node.right); + // If we indented the left or the right side, then dedent now. - if (indented) { + if (indented1 || indented2) { decreaseIndent(); } } @@ -3741,10 +3732,7 @@ module ts { if (propName.kind !== SyntaxKind.Identifier) { return createElementAccess(object, propName); } - var node = createSynthesizedNode(SyntaxKind.PropertyAccessExpression); - node.expression = parenthesizeForAccess(object); - node.name = propName; - return node; + return createPropertyAccessExpression(parenthesizeForAccess(object), propName); } function createElementAccess(object: Expression, index: Expression): Expression { diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 557d6505984..3b3a2ddeda9 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -157,7 +157,9 @@ module ts { visitNode(cbNode, (node).right); case SyntaxKind.ConditionalExpression: return visitNode(cbNode, (node).condition) || + visitNode(cbNode, (node).questionToken) || visitNode(cbNode, (node).whenTrue) || + visitNode(cbNode, (node).colonToken) || visitNode(cbNode, (node).whenFalse); case SyntaxKind.SpreadElementExpression: return visitNode(cbNode, (node).expression); @@ -3177,7 +3179,8 @@ module ts { function parseConditionalExpressionRest(leftOperand: Expression): Expression { // Note: we are passed in an expression which was produced from parseBinaryExpressionOrHigher. - if (!parseOptional(SyntaxKind.QuestionToken)) { + var questionToken = parseOptionalToken(SyntaxKind.QuestionToken); + if (!questionToken) { return leftOperand; } @@ -3185,8 +3188,10 @@ module ts { // we do not that for the 'whenFalse' part. var node = createNode(SyntaxKind.ConditionalExpression, leftOperand.pos); node.condition = leftOperand; + node.questionToken = questionToken; node.whenTrue = allowInAnd(parseAssignmentExpressionOrHigher); - parseExpected(SyntaxKind.ColonToken); + node.colonToken = parseExpectedToken(SyntaxKind.ColonToken, /*reportAtCurrentPosition:*/ false, + Diagnostics._0_expected, tokenToString(SyntaxKind.ColonToken)); node.whenFalse = parseAssignmentExpressionOrHigher(); return finishNode(node); } diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 97706ac324b..e4132655f38 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -640,7 +640,9 @@ module ts { export interface ConditionalExpression extends Expression { condition: Expression; + questionToken: Node; whenTrue: Expression; + colonToken: Node; whenFalse: Expression; } diff --git a/tests/baselines/reference/APISample_compile.js b/tests/baselines/reference/APISample_compile.js index f10e9c9030c..88add2f8685 100644 --- a/tests/baselines/reference/APISample_compile.js +++ b/tests/baselines/reference/APISample_compile.js @@ -542,7 +542,9 @@ declare module "typescript" { } interface ConditionalExpression extends Expression { condition: Expression; + questionToken: Node; whenTrue: Expression; + colonToken: Node; whenFalse: Expression; } interface FunctionExpression extends PrimaryExpression, FunctionLikeDeclaration { diff --git a/tests/baselines/reference/APISample_compile.types b/tests/baselines/reference/APISample_compile.types index 1365a0e903b..7715fd36c77 100644 --- a/tests/baselines/reference/APISample_compile.types +++ b/tests/baselines/reference/APISample_compile.types @@ -1633,10 +1633,18 @@ declare module "typescript" { >condition : Expression >Expression : Expression + questionToken: Node; +>questionToken : Node +>Node : Node + whenTrue: Expression; >whenTrue : Expression >Expression : Expression + colonToken: Node; +>colonToken : Node +>Node : Node + whenFalse: Expression; >whenFalse : Expression >Expression : Expression diff --git a/tests/baselines/reference/APISample_linter.js b/tests/baselines/reference/APISample_linter.js index 3e8c579a051..c8845aab968 100644 --- a/tests/baselines/reference/APISample_linter.js +++ b/tests/baselines/reference/APISample_linter.js @@ -573,7 +573,9 @@ declare module "typescript" { } interface ConditionalExpression extends Expression { condition: Expression; + questionToken: Node; whenTrue: Expression; + colonToken: Node; whenFalse: Expression; } interface FunctionExpression extends PrimaryExpression, FunctionLikeDeclaration { diff --git a/tests/baselines/reference/APISample_linter.types b/tests/baselines/reference/APISample_linter.types index 0f428ecdec2..a0550e967a1 100644 --- a/tests/baselines/reference/APISample_linter.types +++ b/tests/baselines/reference/APISample_linter.types @@ -1779,10 +1779,18 @@ declare module "typescript" { >condition : Expression >Expression : Expression + questionToken: Node; +>questionToken : Node +>Node : Node + whenTrue: Expression; >whenTrue : Expression >Expression : Expression + colonToken: Node; +>colonToken : Node +>Node : Node + whenFalse: Expression; >whenFalse : Expression >Expression : Expression diff --git a/tests/baselines/reference/APISample_transform.js b/tests/baselines/reference/APISample_transform.js index 27e04bec1a0..9c0777413a0 100644 --- a/tests/baselines/reference/APISample_transform.js +++ b/tests/baselines/reference/APISample_transform.js @@ -574,7 +574,9 @@ declare module "typescript" { } interface ConditionalExpression extends Expression { condition: Expression; + questionToken: Node; whenTrue: Expression; + colonToken: Node; whenFalse: Expression; } interface FunctionExpression extends PrimaryExpression, FunctionLikeDeclaration { diff --git a/tests/baselines/reference/APISample_transform.types b/tests/baselines/reference/APISample_transform.types index b78b0565a45..4803a94f39b 100644 --- a/tests/baselines/reference/APISample_transform.types +++ b/tests/baselines/reference/APISample_transform.types @@ -1729,10 +1729,18 @@ declare module "typescript" { >condition : Expression >Expression : Expression + questionToken: Node; +>questionToken : Node +>Node : Node + whenTrue: Expression; >whenTrue : Expression >Expression : Expression + colonToken: Node; +>colonToken : Node +>Node : Node + whenFalse: Expression; >whenFalse : Expression >Expression : Expression diff --git a/tests/baselines/reference/APISample_watcher.js b/tests/baselines/reference/APISample_watcher.js index 139af5b7cd2..2426c0544d9 100644 --- a/tests/baselines/reference/APISample_watcher.js +++ b/tests/baselines/reference/APISample_watcher.js @@ -611,7 +611,9 @@ declare module "typescript" { } interface ConditionalExpression extends Expression { condition: Expression; + questionToken: Node; whenTrue: Expression; + colonToken: Node; whenFalse: Expression; } interface FunctionExpression extends PrimaryExpression, FunctionLikeDeclaration { diff --git a/tests/baselines/reference/APISample_watcher.types b/tests/baselines/reference/APISample_watcher.types index 5570c9ff12a..8cb082050fa 100644 --- a/tests/baselines/reference/APISample_watcher.types +++ b/tests/baselines/reference/APISample_watcher.types @@ -1902,10 +1902,18 @@ declare module "typescript" { >condition : Expression >Expression : Expression + questionToken: Node; +>questionToken : Node +>Node : Node + whenTrue: Expression; >whenTrue : Expression >Expression : Expression + colonToken: Node; +>colonToken : Node +>Node : Node + whenFalse: Expression; >whenFalse : Expression >Expression : Expression