From 6340531a16a1a98bfe7f3143eb9bf1f8fea5ea1a Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Sun, 8 Mar 2015 23:07:03 -0700 Subject: [PATCH 1/3] Simplify indentation code in the emitter. --- src/compiler/emitter.ts | 91 ++++++++++++----------------------------- 1 file changed, 27 insertions(+), 64 deletions(-) diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index c7f132519ae..3b3c4e27eaf 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -3033,7 +3033,7 @@ module ts { return false; } - function indentIfOnDifferentLines(parent: Node, node1: Node, node2: Node) { + function indentIfOnDifferentLines(parent: Node, node1: Node, node2: Node, insertIfNoIndentValue?: string) { // Use a newline for existin code if the original had one, and we're preserving formatting. var realNodesAreOnDifferentLines = preserveNewLines && !nodeIsSynthesized(parent) && !nodeEndIsOnSameLineAsNodeStart(node1, node2); @@ -3045,8 +3045,12 @@ module ts { writeLine(); return true; } - - return false; + else { + if (insertIfNoIndentValue) { + write(insertIfNoIndentValue); + } + return false; + } } function emitPropertyAccess(node: PropertyAccessExpression) { @@ -3056,17 +3060,14 @@ module ts { emit(node.expression); - var indented = indentIfOnDifferentLines(node, node.expression, node.dotToken); - + var indentBeforeDot = indentIfOnDifferentLines(node, node.expression, node.dotToken); write("."); - indented = indented || indentIfOnDifferentLines(node, node.dotToken, node.name); - + var indentAfterDot = indentIfOnDifferentLines(node, node.dotToken, node.name); emit(node.name); - if (indented) { - decreaseIndent(); - } + decreaseIndentIf(indentBeforeDot); + decreaseIndentIf(indentAfterDot); } function emitQualifiedName(node: QualifiedName) { @@ -3300,32 +3301,14 @@ module ts { else { emit(node.left); - // If there was a newline between the left side of the binary expression and the - // operator, then try to preserve that. - 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(" "); - } - + var indentBeforeOperator = indentIfOnDifferentLines(node, node.left, node.operatorToken, node.operatorToken.kind !== SyntaxKind.CommaToken ? " " : undefined); write(tokenToString(node.operatorToken.kind)); - if (!indented1) { - var indented2 = indentIfOnDifferentLines(node, node.operatorToken, node.right); - } - - if (!indented2) { - write(" "); - } - + var indentAfterOperator = indentIfOnDifferentLines(node, node.operatorToken, node.right, " "); emit(node.right); - // If we indented the left or the right side, then dedent now. - if (indented1 || indented2) { - decreaseIndent(); - } + decreaseIndentIf(indentBeforeOperator); + decreaseIndentIf(indentAfterOperator); } } @@ -3335,43 +3318,23 @@ module ts { function emitConditionalExpression(node: ConditionalExpression) { emit(node.condition); - var indent1 = indentIfOnDifferentLines(node, node.condition, node.questionToken); - if (!indent1) { - write(" "); - } - + var indentBeforeQuestion = indentIfOnDifferentLines(node, node.condition, node.questionToken, " "); write("?"); - - if (!indent1) { - var indent2 = indentIfOnDifferentLines(node, node.questionToken, node.whenTrue); - } - - if (!indent2) { - write(" "); - } - + var indentAfterQuestion = indentIfOnDifferentLines(node, node.questionToken, node.whenTrue, " "); emit(node.whenTrue); + decreaseIndentIf(indentBeforeQuestion); + decreaseIndentIf(indentAfterQuestion); - if (indent1 || indent2) { - decreaseIndent(); - } - - var indent3 = indentIfOnDifferentLines(node, node.whenTrue, node.colonToken); - if (!indent3) { - write(" "); - } - + var indentBeforeColon = indentIfOnDifferentLines(node, node.whenTrue, node.colonToken, " "); write(":"); - if (!indent3) { - var indent4 = indentIfOnDifferentLines(node, node.colonToken, node.whenFalse); - } - - if (!indent4) { - write(" "); - } - + var indentAfterColon = indentIfOnDifferentLines(node, node.colonToken, node.whenFalse, " "); emit(node.whenFalse); - if (indent3 || indent4) { + decreaseIndentIf(indentBeforeColon); + decreaseIndentIf(indentAfterColon); + } + + function decreaseIndentIf(value: boolean) { + if (value) { decreaseIndent(); } } From 35b56aa69b18de3a023c68734372cbd84ca1f341 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Mon, 9 Mar 2015 01:07:02 -0700 Subject: [PATCH 2/3] Further simplification. --- src/compiler/emitter.ts | 48 +++++++++++++++++------------------------ 1 file changed, 20 insertions(+), 28 deletions(-) diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 3b3c4e27eaf..6be76908131 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -3033,7 +3033,7 @@ module ts { return false; } - function indentIfOnDifferentLines(parent: Node, node1: Node, node2: Node, insertIfNoIndentValue?: string) { + function indentIfOnDifferentLines(parent: Node, node1: Node, node2: Node, valueToWriteWhenNotIndenting?: string) { // Use a newline for existin code if the original had one, and we're preserving formatting. var realNodesAreOnDifferentLines = preserveNewLines && !nodeIsSynthesized(parent) && !nodeEndIsOnSameLineAsNodeStart(node1, node2); @@ -3046,8 +3046,8 @@ module ts { return true; } else { - if (insertIfNoIndentValue) { - write(insertIfNoIndentValue); + if (valueToWriteWhenNotIndenting) { + write(valueToWriteWhenNotIndenting); } return false; } @@ -3059,15 +3059,11 @@ module ts { } emit(node.expression); - - var indentBeforeDot = indentIfOnDifferentLines(node, node.expression, node.dotToken); + var indentedBeforeDot = indentIfOnDifferentLines(node, node.expression, node.dotToken); write("."); - - var indentAfterDot = indentIfOnDifferentLines(node, node.dotToken, node.name); + var indentedAfterDot = indentIfOnDifferentLines(node, node.dotToken, node.name); emit(node.name); - - decreaseIndentIf(indentBeforeDot); - decreaseIndentIf(indentAfterDot); + decreaseIndentIf(indentedBeforeDot, indentedAfterDot); } function emitQualifiedName(node: QualifiedName) { @@ -3300,15 +3296,11 @@ module ts { } else { emit(node.left); - - var indentBeforeOperator = indentIfOnDifferentLines(node, node.left, node.operatorToken, node.operatorToken.kind !== SyntaxKind.CommaToken ? " " : undefined); + var indentedBeforeOperator = indentIfOnDifferentLines(node, node.left, node.operatorToken, node.operatorToken.kind !== SyntaxKind.CommaToken ? " " : undefined); write(tokenToString(node.operatorToken.kind)); - - var indentAfterOperator = indentIfOnDifferentLines(node, node.operatorToken, node.right, " "); + var indentedAfterOperator = indentIfOnDifferentLines(node, node.operatorToken, node.right, " "); emit(node.right); - - decreaseIndentIf(indentBeforeOperator); - decreaseIndentIf(indentAfterOperator); + decreaseIndentIf(indentedBeforeOperator, indentedAfterOperator); } } @@ -3318,23 +3310,23 @@ module ts { function emitConditionalExpression(node: ConditionalExpression) { emit(node.condition); - var indentBeforeQuestion = indentIfOnDifferentLines(node, node.condition, node.questionToken, " "); + var indentedBeforeQuestion = indentIfOnDifferentLines(node, node.condition, node.questionToken, " "); write("?"); - var indentAfterQuestion = indentIfOnDifferentLines(node, node.questionToken, node.whenTrue, " "); + var indentedAfterQuestion = indentIfOnDifferentLines(node, node.questionToken, node.whenTrue, " "); emit(node.whenTrue); - decreaseIndentIf(indentBeforeQuestion); - decreaseIndentIf(indentAfterQuestion); - - var indentBeforeColon = indentIfOnDifferentLines(node, node.whenTrue, node.colonToken, " "); + decreaseIndentIf(indentedBeforeQuestion, indentedAfterQuestion); + var indentedBeforeColon = indentIfOnDifferentLines(node, node.whenTrue, node.colonToken, " "); write(":"); - var indentAfterColon = indentIfOnDifferentLines(node, node.colonToken, node.whenFalse, " "); + var indentedAfterColon = indentIfOnDifferentLines(node, node.colonToken, node.whenFalse, " "); emit(node.whenFalse); - decreaseIndentIf(indentBeforeColon); - decreaseIndentIf(indentAfterColon); + decreaseIndentIf(indentedBeforeColon, indentedAfterColon); } - function decreaseIndentIf(value: boolean) { - if (value) { + function decreaseIndentIf(value1: boolean, value2?: boolean) { + if (value1) { + decreaseIndent(); + } + if (value2) { decreaseIndent(); } } From aa96475f73bcc619f63dea84e0c391ce0b6ceb43 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Mon, 9 Mar 2015 15:50:40 -0700 Subject: [PATCH 3/3] CR feedback. --- src/compiler/emitter.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index df6a68bae02..2b5eb62bef9 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -3033,6 +3033,9 @@ module ts { return false; } + // Returns 'true' if the code was actually indented, false otherwise. + // If the code is not indented, an optional valueToWriteWhenNotIndenting will be + // emitted instead. function indentIfOnDifferentLines(parent: Node, node1: Node, node2: Node, valueToWriteWhenNotIndenting?: string) { var realNodesAreOnDifferentLines = preserveNewLines && !nodeIsSynthesized(parent) && !nodeEndIsOnSameLineAsNodeStart(node1, node2); @@ -3321,6 +3324,10 @@ module ts { decreaseIndentIf(indentedBeforeColon, indentedAfterColon); } + // Helper function to decrease the indent if we previously indented. Allows multiple + // previous indent values to be considered at a time. This also allows caller to just + // call this once, passing in all their appropriate indent values, instead of needing + // to call this helper function multiple times. function decreaseIndentIf(value1: boolean, value2?: boolean) { if (value1) { decreaseIndent();