From 2a990a8685b85ac068a3c4541df5e804fa2388e9 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Sat, 7 Mar 2015 13:50:26 -0800 Subject: [PATCH] Preserve newlines for conditional expressions --- src/compiler/emitter.ts | 51 ++++++++++-- .../reference/APISample_transform.js | 3 +- .../conditionalExpressionNewLine1.errors.txt | 13 +++ .../conditionalExpressionNewLine1.js | 5 ++ .../conditionalExpressionNewLine10.errors.txt | 31 +++++++ .../conditionalExpressionNewLine10.js | 17 ++++ .../conditionalExpressionNewLine2.errors.txt | 14 ++++ .../conditionalExpressionNewLine2.js | 7 ++ .../conditionalExpressionNewLine3.errors.txt | 14 ++++ .../conditionalExpressionNewLine3.js | 7 ++ .../conditionalExpressionNewLine4.errors.txt | 14 ++++ .../conditionalExpressionNewLine4.js | 7 ++ .../conditionalExpressionNewLine5.errors.txt | 14 ++++ .../conditionalExpressionNewLine5.js | 7 ++ .../conditionalExpressionNewLine6.errors.txt | 15 ++++ .../conditionalExpressionNewLine6.js | 9 +++ .../conditionalExpressionNewLine7.errors.txt | 15 ++++ .../conditionalExpressionNewLine7.js | 9 +++ .../conditionalExpressionNewLine8.errors.txt | 27 +++++++ .../conditionalExpressionNewLine8.js | 9 +++ .../conditionalExpressionNewLine9.errors.txt | 29 +++++++ .../conditionalExpressionNewLine9.js | 13 +++ ...constructorWithIncompleteTypeAnnotation.js | 3 +- ...ericRecursiveImplicitConstructorErrors3.js | 5 +- .../overloadResolutionOverNonCTLambdas.js | 4 +- tests/baselines/reference/scannertest1.js | 6 +- .../typeGuardsInConditionalExpression.js | 81 +++++++++++-------- .../typeGuardsInFunctionAndModuleBlock.js | 62 ++++++++------ .../reference/typeGuardsInIfStatement.js | 26 +++--- ...ypeGuardsInRightOperandOfAndAndOperator.js | 14 ++-- .../typeGuardsInRightOperandOfOrOrOperator.js | 14 ++-- .../compiler/conditionalExpressionNewLine1.ts | 1 + .../conditionalExpressionNewLine10.ts | 7 ++ .../compiler/conditionalExpressionNewLine2.ts | 2 + .../compiler/conditionalExpressionNewLine3.ts | 2 + .../compiler/conditionalExpressionNewLine4.ts | 2 + .../compiler/conditionalExpressionNewLine5.ts | 2 + .../compiler/conditionalExpressionNewLine6.ts | 3 + .../compiler/conditionalExpressionNewLine7.ts | 3 + .../compiler/conditionalExpressionNewLine8.ts | 3 + .../compiler/conditionalExpressionNewLine9.ts | 5 ++ 41 files changed, 485 insertions(+), 90 deletions(-) create mode 100644 tests/baselines/reference/conditionalExpressionNewLine1.errors.txt create mode 100644 tests/baselines/reference/conditionalExpressionNewLine1.js create mode 100644 tests/baselines/reference/conditionalExpressionNewLine10.errors.txt create mode 100644 tests/baselines/reference/conditionalExpressionNewLine10.js create mode 100644 tests/baselines/reference/conditionalExpressionNewLine2.errors.txt create mode 100644 tests/baselines/reference/conditionalExpressionNewLine2.js create mode 100644 tests/baselines/reference/conditionalExpressionNewLine3.errors.txt create mode 100644 tests/baselines/reference/conditionalExpressionNewLine3.js create mode 100644 tests/baselines/reference/conditionalExpressionNewLine4.errors.txt create mode 100644 tests/baselines/reference/conditionalExpressionNewLine4.js create mode 100644 tests/baselines/reference/conditionalExpressionNewLine5.errors.txt create mode 100644 tests/baselines/reference/conditionalExpressionNewLine5.js create mode 100644 tests/baselines/reference/conditionalExpressionNewLine6.errors.txt create mode 100644 tests/baselines/reference/conditionalExpressionNewLine6.js create mode 100644 tests/baselines/reference/conditionalExpressionNewLine7.errors.txt create mode 100644 tests/baselines/reference/conditionalExpressionNewLine7.js create mode 100644 tests/baselines/reference/conditionalExpressionNewLine8.errors.txt create mode 100644 tests/baselines/reference/conditionalExpressionNewLine8.js create mode 100644 tests/baselines/reference/conditionalExpressionNewLine9.errors.txt create mode 100644 tests/baselines/reference/conditionalExpressionNewLine9.js create mode 100644 tests/cases/compiler/conditionalExpressionNewLine1.ts create mode 100644 tests/cases/compiler/conditionalExpressionNewLine10.ts create mode 100644 tests/cases/compiler/conditionalExpressionNewLine2.ts create mode 100644 tests/cases/compiler/conditionalExpressionNewLine3.ts create mode 100644 tests/cases/compiler/conditionalExpressionNewLine4.ts create mode 100644 tests/cases/compiler/conditionalExpressionNewLine5.ts create mode 100644 tests/cases/compiler/conditionalExpressionNewLine6.ts create mode 100644 tests/cases/compiler/conditionalExpressionNewLine7.ts create mode 100644 tests/cases/compiler/conditionalExpressionNewLine8.ts create mode 100644 tests/cases/compiler/conditionalExpressionNewLine9.ts diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 154b0874548..4d8ed28602f 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -3330,10 +3330,45 @@ module ts { function emitConditionalExpression(node: ConditionalExpression) { emit(node.condition); - write(" ? "); + var indent1 = indentIfOnDifferentLines(node, node.condition, node.questionToken); + if (!indent1) { + write(" "); + } + + write("?"); + + if (!indent1) { + var indent2 = indentIfOnDifferentLines(node, node.questionToken, node.whenTrue); + } + + if (!indent2) { + write(" "); + } + emit(node.whenTrue); - write(" : "); + + if (indent1 || indent2) { + decreaseIndent(); + } + + var indent3 = indentIfOnDifferentLines(node, node.whenTrue, node.colonToken); + if (!indent3) { + write(" "); + } + + write(":"); + if (!indent3) { + var indent4 = indentIfOnDifferentLines(node, node.colonToken, node.whenFalse); + } + + if (!indent4) { + write(" "); + } + emit(node.whenFalse); + if (indent3 || indent4) { + decreaseIndent(); + } } function isSingleLineEmptyBlock(node: Node) { @@ -3706,10 +3741,16 @@ module ts { equals.left = value; equals.operatorToken = createSynthesizedNode(SyntaxKind.EqualsEqualsEqualsToken); equals.right = createVoidZero(); + return createConditionalExpression(equals, defaultValue, value); + } + + function createConditionalExpression(condition: Expression, whenTrue: Expression, whenFalse: Expression) { var cond = createSynthesizedNode(SyntaxKind.ConditionalExpression); - cond.condition = equals; - cond.whenTrue = defaultValue; - cond.whenFalse = value; + cond.condition = condition; + cond.questionToken = createSynthesizedNode(SyntaxKind.QuestionToken); + cond.whenTrue = whenTrue; + cond.colonToken = createSynthesizedNode(SyntaxKind.ColonToken); + cond.whenFalse = whenFalse; return cond; } diff --git a/tests/baselines/reference/APISample_transform.js b/tests/baselines/reference/APISample_transform.js index 9c0777413a0..290421426c3 100644 --- a/tests/baselines/reference/APISample_transform.js +++ b/tests/baselines/reference/APISample_transform.js @@ -2034,7 +2034,8 @@ function transform(contents, compilerOptions) { // Create a compilerHost object to allow the compiler to read and write files var compilerHost = { getSourceFile: function (fileName, target) { - return files[fileName] !== undefined ? ts.createSourceFile(fileName, files[fileName], target) : undefined; + return files[fileName] !== undefined ? + ts.createSourceFile(fileName, files[fileName], target) : undefined; }, writeFile: function (name, text, writeByteOrderMark) { outputs.push({ name: name, text: text, writeByteOrderMark: writeByteOrderMark }); diff --git a/tests/baselines/reference/conditionalExpressionNewLine1.errors.txt b/tests/baselines/reference/conditionalExpressionNewLine1.errors.txt new file mode 100644 index 00000000000..504d66fe3a7 --- /dev/null +++ b/tests/baselines/reference/conditionalExpressionNewLine1.errors.txt @@ -0,0 +1,13 @@ +tests/cases/compiler/conditionalExpressionNewLine1.ts(1,9): error TS2304: Cannot find name 'a'. +tests/cases/compiler/conditionalExpressionNewLine1.ts(1,13): error TS2304: Cannot find name 'b'. +tests/cases/compiler/conditionalExpressionNewLine1.ts(1,17): error TS2304: Cannot find name 'c'. + + +==== tests/cases/compiler/conditionalExpressionNewLine1.ts (3 errors) ==== + var v = a ? b : c; + ~ +!!! error TS2304: Cannot find name 'a'. + ~ +!!! error TS2304: Cannot find name 'b'. + ~ +!!! error TS2304: Cannot find name 'c'. \ No newline at end of file diff --git a/tests/baselines/reference/conditionalExpressionNewLine1.js b/tests/baselines/reference/conditionalExpressionNewLine1.js new file mode 100644 index 00000000000..02055e3e479 --- /dev/null +++ b/tests/baselines/reference/conditionalExpressionNewLine1.js @@ -0,0 +1,5 @@ +//// [conditionalExpressionNewLine1.ts] +var v = a ? b : c; + +//// [conditionalExpressionNewLine1.js] +var v = a ? b : c; diff --git a/tests/baselines/reference/conditionalExpressionNewLine10.errors.txt b/tests/baselines/reference/conditionalExpressionNewLine10.errors.txt new file mode 100644 index 00000000000..a5c902361e6 --- /dev/null +++ b/tests/baselines/reference/conditionalExpressionNewLine10.errors.txt @@ -0,0 +1,31 @@ +tests/cases/compiler/conditionalExpressionNewLine10.ts(1,9): error TS2304: Cannot find name 'a'. +tests/cases/compiler/conditionalExpressionNewLine10.ts(2,5): error TS2304: Cannot find name 'b'. +tests/cases/compiler/conditionalExpressionNewLine10.ts(3,7): error TS2304: Cannot find name 'd'. +tests/cases/compiler/conditionalExpressionNewLine10.ts(4,7): error TS2304: Cannot find name 'e'. +tests/cases/compiler/conditionalExpressionNewLine10.ts(5,5): error TS2304: Cannot find name 'c'. +tests/cases/compiler/conditionalExpressionNewLine10.ts(6,7): error TS2304: Cannot find name 'f'. +tests/cases/compiler/conditionalExpressionNewLine10.ts(7,7): error TS2304: Cannot find name 'g'. + + +==== tests/cases/compiler/conditionalExpressionNewLine10.ts (7 errors) ==== + var v = a + ~ +!!! error TS2304: Cannot find name 'a'. + ? b + ~ +!!! error TS2304: Cannot find name 'b'. + ? d + ~ +!!! error TS2304: Cannot find name 'd'. + : e + ~ +!!! error TS2304: Cannot find name 'e'. + : c + ~ +!!! error TS2304: Cannot find name 'c'. + ? f + ~ +!!! error TS2304: Cannot find name 'f'. + : g; + ~ +!!! error TS2304: Cannot find name 'g'. \ No newline at end of file diff --git a/tests/baselines/reference/conditionalExpressionNewLine10.js b/tests/baselines/reference/conditionalExpressionNewLine10.js new file mode 100644 index 00000000000..bb2f3bec231 --- /dev/null +++ b/tests/baselines/reference/conditionalExpressionNewLine10.js @@ -0,0 +1,17 @@ +//// [conditionalExpressionNewLine10.ts] +var v = a + ? b + ? d + : e + : c + ? f + : g; + +//// [conditionalExpressionNewLine10.js] +var v = a + ? b + ? d + : e + : c + ? f + : g; diff --git a/tests/baselines/reference/conditionalExpressionNewLine2.errors.txt b/tests/baselines/reference/conditionalExpressionNewLine2.errors.txt new file mode 100644 index 00000000000..5036b247304 --- /dev/null +++ b/tests/baselines/reference/conditionalExpressionNewLine2.errors.txt @@ -0,0 +1,14 @@ +tests/cases/compiler/conditionalExpressionNewLine2.ts(1,9): error TS2304: Cannot find name 'a'. +tests/cases/compiler/conditionalExpressionNewLine2.ts(2,5): error TS2304: Cannot find name 'b'. +tests/cases/compiler/conditionalExpressionNewLine2.ts(2,9): error TS2304: Cannot find name 'c'. + + +==== tests/cases/compiler/conditionalExpressionNewLine2.ts (3 errors) ==== + var v = a + ~ +!!! error TS2304: Cannot find name 'a'. + ? b : c; + ~ +!!! error TS2304: Cannot find name 'b'. + ~ +!!! error TS2304: Cannot find name 'c'. \ No newline at end of file diff --git a/tests/baselines/reference/conditionalExpressionNewLine2.js b/tests/baselines/reference/conditionalExpressionNewLine2.js new file mode 100644 index 00000000000..e69f2004ebc --- /dev/null +++ b/tests/baselines/reference/conditionalExpressionNewLine2.js @@ -0,0 +1,7 @@ +//// [conditionalExpressionNewLine2.ts] +var v = a + ? b : c; + +//// [conditionalExpressionNewLine2.js] +var v = a + ? b : c; diff --git a/tests/baselines/reference/conditionalExpressionNewLine3.errors.txt b/tests/baselines/reference/conditionalExpressionNewLine3.errors.txt new file mode 100644 index 00000000000..34ea3d419d8 --- /dev/null +++ b/tests/baselines/reference/conditionalExpressionNewLine3.errors.txt @@ -0,0 +1,14 @@ +tests/cases/compiler/conditionalExpressionNewLine3.ts(1,9): error TS2304: Cannot find name 'a'. +tests/cases/compiler/conditionalExpressionNewLine3.ts(2,3): error TS2304: Cannot find name 'b'. +tests/cases/compiler/conditionalExpressionNewLine3.ts(2,7): error TS2304: Cannot find name 'c'. + + +==== tests/cases/compiler/conditionalExpressionNewLine3.ts (3 errors) ==== + var v = a ? + ~ +!!! error TS2304: Cannot find name 'a'. + b : c; + ~ +!!! error TS2304: Cannot find name 'b'. + ~ +!!! error TS2304: Cannot find name 'c'. \ No newline at end of file diff --git a/tests/baselines/reference/conditionalExpressionNewLine3.js b/tests/baselines/reference/conditionalExpressionNewLine3.js new file mode 100644 index 00000000000..4d11f45368f --- /dev/null +++ b/tests/baselines/reference/conditionalExpressionNewLine3.js @@ -0,0 +1,7 @@ +//// [conditionalExpressionNewLine3.ts] +var v = a ? + b : c; + +//// [conditionalExpressionNewLine3.js] +var v = a ? + b : c; diff --git a/tests/baselines/reference/conditionalExpressionNewLine4.errors.txt b/tests/baselines/reference/conditionalExpressionNewLine4.errors.txt new file mode 100644 index 00000000000..74c39406c6c --- /dev/null +++ b/tests/baselines/reference/conditionalExpressionNewLine4.errors.txt @@ -0,0 +1,14 @@ +tests/cases/compiler/conditionalExpressionNewLine4.ts(1,9): error TS2304: Cannot find name 'a'. +tests/cases/compiler/conditionalExpressionNewLine4.ts(1,13): error TS2304: Cannot find name 'b'. +tests/cases/compiler/conditionalExpressionNewLine4.ts(2,3): error TS2304: Cannot find name 'c'. + + +==== tests/cases/compiler/conditionalExpressionNewLine4.ts (3 errors) ==== + var v = a ? b : + ~ +!!! error TS2304: Cannot find name 'a'. + ~ +!!! error TS2304: Cannot find name 'b'. + c; + ~ +!!! error TS2304: Cannot find name 'c'. \ No newline at end of file diff --git a/tests/baselines/reference/conditionalExpressionNewLine4.js b/tests/baselines/reference/conditionalExpressionNewLine4.js new file mode 100644 index 00000000000..d6532ecb15b --- /dev/null +++ b/tests/baselines/reference/conditionalExpressionNewLine4.js @@ -0,0 +1,7 @@ +//// [conditionalExpressionNewLine4.ts] +var v = a ? b : + c; + +//// [conditionalExpressionNewLine4.js] +var v = a ? b : + c; diff --git a/tests/baselines/reference/conditionalExpressionNewLine5.errors.txt b/tests/baselines/reference/conditionalExpressionNewLine5.errors.txt new file mode 100644 index 00000000000..86c8890e218 --- /dev/null +++ b/tests/baselines/reference/conditionalExpressionNewLine5.errors.txt @@ -0,0 +1,14 @@ +tests/cases/compiler/conditionalExpressionNewLine5.ts(1,9): error TS2304: Cannot find name 'a'. +tests/cases/compiler/conditionalExpressionNewLine5.ts(1,13): error TS2304: Cannot find name 'b'. +tests/cases/compiler/conditionalExpressionNewLine5.ts(2,5): error TS2304: Cannot find name 'c'. + + +==== tests/cases/compiler/conditionalExpressionNewLine5.ts (3 errors) ==== + var v = a ? b + ~ +!!! error TS2304: Cannot find name 'a'. + ~ +!!! error TS2304: Cannot find name 'b'. + : c; + ~ +!!! error TS2304: Cannot find name 'c'. \ No newline at end of file diff --git a/tests/baselines/reference/conditionalExpressionNewLine5.js b/tests/baselines/reference/conditionalExpressionNewLine5.js new file mode 100644 index 00000000000..6fdd0735bcd --- /dev/null +++ b/tests/baselines/reference/conditionalExpressionNewLine5.js @@ -0,0 +1,7 @@ +//// [conditionalExpressionNewLine5.ts] +var v = a ? b + : c; + +//// [conditionalExpressionNewLine5.js] +var v = a ? b + : c; diff --git a/tests/baselines/reference/conditionalExpressionNewLine6.errors.txt b/tests/baselines/reference/conditionalExpressionNewLine6.errors.txt new file mode 100644 index 00000000000..c59ea73b845 --- /dev/null +++ b/tests/baselines/reference/conditionalExpressionNewLine6.errors.txt @@ -0,0 +1,15 @@ +tests/cases/compiler/conditionalExpressionNewLine6.ts(1,9): error TS2304: Cannot find name 'a'. +tests/cases/compiler/conditionalExpressionNewLine6.ts(2,5): error TS2304: Cannot find name 'b'. +tests/cases/compiler/conditionalExpressionNewLine6.ts(3,5): error TS2304: Cannot find name 'c'. + + +==== tests/cases/compiler/conditionalExpressionNewLine6.ts (3 errors) ==== + var v = a + ~ +!!! error TS2304: Cannot find name 'a'. + ? b + ~ +!!! error TS2304: Cannot find name 'b'. + : c; + ~ +!!! error TS2304: Cannot find name 'c'. \ No newline at end of file diff --git a/tests/baselines/reference/conditionalExpressionNewLine6.js b/tests/baselines/reference/conditionalExpressionNewLine6.js new file mode 100644 index 00000000000..94539ab891e --- /dev/null +++ b/tests/baselines/reference/conditionalExpressionNewLine6.js @@ -0,0 +1,9 @@ +//// [conditionalExpressionNewLine6.ts] +var v = a + ? b + : c; + +//// [conditionalExpressionNewLine6.js] +var v = a + ? b + : c; diff --git a/tests/baselines/reference/conditionalExpressionNewLine7.errors.txt b/tests/baselines/reference/conditionalExpressionNewLine7.errors.txt new file mode 100644 index 00000000000..ff71c42ddae --- /dev/null +++ b/tests/baselines/reference/conditionalExpressionNewLine7.errors.txt @@ -0,0 +1,15 @@ +tests/cases/compiler/conditionalExpressionNewLine7.ts(1,9): error TS2304: Cannot find name 'a'. +tests/cases/compiler/conditionalExpressionNewLine7.ts(2,3): error TS2304: Cannot find name 'b'. +tests/cases/compiler/conditionalExpressionNewLine7.ts(3,3): error TS2304: Cannot find name 'c'. + + +==== tests/cases/compiler/conditionalExpressionNewLine7.ts (3 errors) ==== + var v = a ? + ~ +!!! error TS2304: Cannot find name 'a'. + b : + ~ +!!! error TS2304: Cannot find name 'b'. + c; + ~ +!!! error TS2304: Cannot find name 'c'. \ No newline at end of file diff --git a/tests/baselines/reference/conditionalExpressionNewLine7.js b/tests/baselines/reference/conditionalExpressionNewLine7.js new file mode 100644 index 00000000000..5c781f7d85a --- /dev/null +++ b/tests/baselines/reference/conditionalExpressionNewLine7.js @@ -0,0 +1,9 @@ +//// [conditionalExpressionNewLine7.ts] +var v = a ? + b : + c; + +//// [conditionalExpressionNewLine7.js] +var v = a ? + b : + c; diff --git a/tests/baselines/reference/conditionalExpressionNewLine8.errors.txt b/tests/baselines/reference/conditionalExpressionNewLine8.errors.txt new file mode 100644 index 00000000000..1c6a039089c --- /dev/null +++ b/tests/baselines/reference/conditionalExpressionNewLine8.errors.txt @@ -0,0 +1,27 @@ +tests/cases/compiler/conditionalExpressionNewLine8.ts(1,9): error TS2304: Cannot find name 'a'. +tests/cases/compiler/conditionalExpressionNewLine8.ts(2,5): error TS2304: Cannot find name 'b'. +tests/cases/compiler/conditionalExpressionNewLine8.ts(2,9): error TS2304: Cannot find name 'd'. +tests/cases/compiler/conditionalExpressionNewLine8.ts(2,13): error TS2304: Cannot find name 'e'. +tests/cases/compiler/conditionalExpressionNewLine8.ts(3,5): error TS2304: Cannot find name 'c'. +tests/cases/compiler/conditionalExpressionNewLine8.ts(3,9): error TS2304: Cannot find name 'f'. +tests/cases/compiler/conditionalExpressionNewLine8.ts(3,13): error TS2304: Cannot find name 'g'. + + +==== tests/cases/compiler/conditionalExpressionNewLine8.ts (7 errors) ==== + var v = a + ~ +!!! error TS2304: Cannot find name 'a'. + ? b ? d : e + ~ +!!! error TS2304: Cannot find name 'b'. + ~ +!!! error TS2304: Cannot find name 'd'. + ~ +!!! error TS2304: Cannot find name 'e'. + : c ? f : g; + ~ +!!! error TS2304: Cannot find name 'c'. + ~ +!!! error TS2304: Cannot find name 'f'. + ~ +!!! error TS2304: Cannot find name 'g'. \ No newline at end of file diff --git a/tests/baselines/reference/conditionalExpressionNewLine8.js b/tests/baselines/reference/conditionalExpressionNewLine8.js new file mode 100644 index 00000000000..61372eeadbc --- /dev/null +++ b/tests/baselines/reference/conditionalExpressionNewLine8.js @@ -0,0 +1,9 @@ +//// [conditionalExpressionNewLine8.ts] +var v = a + ? b ? d : e + : c ? f : g; + +//// [conditionalExpressionNewLine8.js] +var v = a + ? b ? d : e + : c ? f : g; diff --git a/tests/baselines/reference/conditionalExpressionNewLine9.errors.txt b/tests/baselines/reference/conditionalExpressionNewLine9.errors.txt new file mode 100644 index 00000000000..821e3ac67f4 --- /dev/null +++ b/tests/baselines/reference/conditionalExpressionNewLine9.errors.txt @@ -0,0 +1,29 @@ +tests/cases/compiler/conditionalExpressionNewLine9.ts(1,9): error TS2304: Cannot find name 'a'. +tests/cases/compiler/conditionalExpressionNewLine9.ts(2,5): error TS2304: Cannot find name 'b'. +tests/cases/compiler/conditionalExpressionNewLine9.ts(3,7): error TS2304: Cannot find name 'd'. +tests/cases/compiler/conditionalExpressionNewLine9.ts(3,11): error TS2304: Cannot find name 'e'. +tests/cases/compiler/conditionalExpressionNewLine9.ts(4,5): error TS2304: Cannot find name 'c'. +tests/cases/compiler/conditionalExpressionNewLine9.ts(5,7): error TS2304: Cannot find name 'f'. +tests/cases/compiler/conditionalExpressionNewLine9.ts(5,11): error TS2304: Cannot find name 'g'. + + +==== tests/cases/compiler/conditionalExpressionNewLine9.ts (7 errors) ==== + var v = a + ~ +!!! error TS2304: Cannot find name 'a'. + ? b + ~ +!!! error TS2304: Cannot find name 'b'. + ? d : e + ~ +!!! error TS2304: Cannot find name 'd'. + ~ +!!! error TS2304: Cannot find name 'e'. + : c + ~ +!!! error TS2304: Cannot find name 'c'. + ? f : g; + ~ +!!! error TS2304: Cannot find name 'f'. + ~ +!!! error TS2304: Cannot find name 'g'. \ No newline at end of file diff --git a/tests/baselines/reference/conditionalExpressionNewLine9.js b/tests/baselines/reference/conditionalExpressionNewLine9.js new file mode 100644 index 00000000000..79f4606754e --- /dev/null +++ b/tests/baselines/reference/conditionalExpressionNewLine9.js @@ -0,0 +1,13 @@ +//// [conditionalExpressionNewLine9.ts] +var v = a + ? b + ? d : e + : c + ? f : g; + +//// [conditionalExpressionNewLine9.js] +var v = a + ? b + ? d : e + : c + ? f : g; diff --git a/tests/baselines/reference/constructorWithIncompleteTypeAnnotation.js b/tests/baselines/reference/constructorWithIncompleteTypeAnnotation.js index 6adbaddb117..16e936620d0 100644 --- a/tests/baselines/reference/constructorWithIncompleteTypeAnnotation.js +++ b/tests/baselines/reference/constructorWithIncompleteTypeAnnotation.js @@ -499,7 +499,8 @@ var CLASS = (function () { CLASS.prototype.Foo = function () { var myEvent = function () { return 1; }; if (myEvent() == 1) - return true ? : ; + return true ? + : ; else return false; }; diff --git a/tests/baselines/reference/genericRecursiveImplicitConstructorErrors3.js b/tests/baselines/reference/genericRecursiveImplicitConstructorErrors3.js index 11113b778d3..e01c9045345 100644 --- a/tests/baselines/reference/genericRecursiveImplicitConstructorErrors3.js +++ b/tests/baselines/reference/genericRecursiveImplicitConstructorErrors3.js @@ -69,7 +69,10 @@ var TypeScript; }; PullTypeSymbol.prototype.getScopedNameEx = function (scopeSymbol, useConstraintInName, getPrettyTypeName, getTypeParamMarkerInfo) { if (this.isArray()) { - var elementMemberName = this._elementType ? (this._elementType.isArray() || this._elementType.isNamedTypeSymbol() ? this._elementType.getScopedNameEx(scopeSymbol, false, getPrettyTypeName, getTypeParamMarkerInfo) : this._elementType.getMemberTypeNameEx(false, scopeSymbol, getPrettyTypeName)) : 1; + var elementMemberName = this._elementType ? + (this._elementType.isArray() || this._elementType.isNamedTypeSymbol() ? + this._elementType.getScopedNameEx(scopeSymbol, false, getPrettyTypeName, getTypeParamMarkerInfo) : + this._elementType.getMemberTypeNameEx(false, scopeSymbol, getPrettyTypeName)) : 1; return TypeScript.MemberName.create(elementMemberName, "", "[]"); } }; diff --git a/tests/baselines/reference/overloadResolutionOverNonCTLambdas.js b/tests/baselines/reference/overloadResolutionOverNonCTLambdas.js index e77e8d3371f..170f2dd2137 100644 --- a/tests/baselines/reference/overloadResolutionOverNonCTLambdas.js +++ b/tests/baselines/reference/overloadResolutionOverNonCTLambdas.js @@ -43,7 +43,9 @@ var Bugs; rest[_i - 1] = arguments[_i]; } var index = rest[0]; - return typeof args[index] !== 'undefined' ? args[index] : match; + return typeof args[index] !== 'undefined' + ? args[index] + : match; }); return result; } diff --git a/tests/baselines/reference/scannertest1.js b/tests/baselines/reference/scannertest1.js index 8c9d805c5f2..b96c965a79e 100644 --- a/tests/baselines/reference/scannertest1.js +++ b/tests/baselines/reference/scannertest1.js @@ -39,7 +39,11 @@ var CharacterInfo = (function () { }; CharacterInfo.hexValue = function (c) { Debug.assert(isHexDigit(c)); - return isDecimalDigit(c) ? (c - CharacterCodes._0) : (c >= CharacterCodes.A && c <= CharacterCodes.F) ? c - CharacterCodes.A + 10 : c - CharacterCodes.a + 10; + return isDecimalDigit(c) + ? (c - CharacterCodes._0) + : (c >= CharacterCodes.A && c <= CharacterCodes.F) + ? c - CharacterCodes.A + 10 + : c - CharacterCodes.a + 10; }; return CharacterInfo; })(); diff --git a/tests/baselines/reference/typeGuardsInConditionalExpression.js b/tests/baselines/reference/typeGuardsInConditionalExpression.js index a1a546a193e..118ebbc02c0 100644 --- a/tests/baselines/reference/typeGuardsInConditionalExpression.js +++ b/tests/baselines/reference/typeGuardsInConditionalExpression.js @@ -105,77 +105,92 @@ function foo12(x: number | string | boolean) { // the type of a variable or parameter is narrowed by any type guard in the condition when false, // provided the false expression contains no assignments to the variable or parameter. function foo(x) { - return typeof x === "string" ? x.length // string - : x++; // number + return typeof x === "string" + ? x.length // string + : x++; // number } function foo2(x) { // x is assigned in the if true branch, the type is not narrowed - return typeof x === "string" ? (x = 10 && x) // string | number - : x; // string | number + return typeof x === "string" + ? (x = 10 && x) // string | number + : x; // string | number } function foo3(x) { // x is assigned in the if false branch, the type is not narrowed // even though assigned using same type as narrowed expression - return typeof x === "string" ? (x = "Hello" && x) // string | number - : x; // string | number + return typeof x === "string" + ? (x = "Hello" && x) // string | number + : x; // string | number } function foo4(x) { // false branch updates the variable - so here it is not number // even though assigned using same type as narrowed expression - return typeof x === "string" ? x // string | number - : (x = 10 && x); // string | number + return typeof x === "string" + ? x // string | number + : (x = 10 && x); // string | number } function foo5(x) { // false branch updates the variable - so here it is not number - return typeof x === "string" ? x // string | number - : (x = "hello" && x); // string | number + return typeof x === "string" + ? x // string | number + : (x = "hello" && x); // string | number } function foo6(x) { // Modify in both branches - return typeof x === "string" ? (x = 10 && x) // string | number - : (x = "hello" && x); // string | number + return typeof x === "string" + ? (x = 10 && x) // string | number + : (x = "hello" && x); // string | number } function foo7(x) { - return typeof x === "string" ? x === "hello" // string - : typeof x === "boolean" ? x // boolean - : x == 10; // number + return typeof x === "string" + ? x === "hello" // string + : typeof x === "boolean" + ? x // boolean + : x == 10; // number } function foo8(x) { var b; - return typeof x === "string" ? x === "hello" : ((b = x) && - (typeof x === "boolean" ? x // boolean - : x == 10)); // number + return typeof x === "string" + ? x === "hello" + : ((b = x) && + (typeof x === "boolean" + ? x // boolean + : x == 10)); // number } function foo9(x) { var y = 10; // usage of x or assignment to separate variable shouldn't cause narrowing of type to stop - return typeof x === "string" ? ((y = x.length) && x === "hello") // string - : x === 10; // number + return typeof x === "string" + ? ((y = x.length) && x === "hello") // string + : x === 10; // number } function foo10(x) { // Mixing typeguards var b; - return typeof x === "string" ? x // string - : ((b = x) // x is number | boolean - && typeof x === "number" - && x.toString()); // x is number + return typeof x === "string" + ? x // string + : ((b = x) // x is number | boolean + && typeof x === "number" + && x.toString()); // x is number } function foo11(x) { // Mixing typeguards // Assigning value to x deep inside another guard stops narrowing of type too var b; - return typeof x === "string" ? x // number | boolean | string - changed in the false branch - : ((b = x) // x is number | boolean | string - because the assignment changed it - && typeof x === "number" - && (x = 10) // assignment to x - && x); // x is number | boolean | string + return typeof x === "string" + ? x // number | boolean | string - changed in the false branch + : ((b = x) // x is number | boolean | string - because the assignment changed it + && typeof x === "number" + && (x = 10) // assignment to x + && x); // x is number | boolean | string } function foo12(x) { // Mixing typeguards // Assigning value to x in outer guard shouldn't stop narrowing in the inner expression var b; - return typeof x === "string" ? (x = 10 && x.toString().length) // number | boolean | string - changed here - : ((b = x) // x is number | boolean | string - changed in true branch - && typeof x === "number" - && x); // x is number + return typeof x === "string" + ? (x = 10 && x.toString().length) // number | boolean | string - changed here + : ((b = x) // x is number | boolean | string - changed in true branch + && typeof x === "number" + && x); // x is number } diff --git a/tests/baselines/reference/typeGuardsInFunctionAndModuleBlock.js b/tests/baselines/reference/typeGuardsInFunctionAndModuleBlock.js index 239eeb4bfe7..7cf19dac0ad 100644 --- a/tests/baselines/reference/typeGuardsInFunctionAndModuleBlock.js +++ b/tests/baselines/reference/typeGuardsInFunctionAndModuleBlock.js @@ -82,32 +82,44 @@ module m1 { //// [typeGuardsInFunctionAndModuleBlock.js] // typeguards are scoped in function/module block function foo(x) { - return typeof x === "string" ? x : function f() { - var b = x; // number | boolean - return typeof x === "boolean" ? x.toString() // boolean - : x.toString(); // number - }(); + return typeof x === "string" + ? x + : function f() { + var b = x; // number | boolean + return typeof x === "boolean" + ? x.toString() // boolean + : x.toString(); // number + }(); } function foo2(x) { - return typeof x === "string" ? x : function f(a) { - var b = x; // new scope - number | boolean - return typeof x === "boolean" ? x.toString() // boolean - : x.toString(); // number - }(x); // x here is narrowed to number | boolean + return typeof x === "string" + ? x + : function f(a) { + var b = x; // new scope - number | boolean + return typeof x === "boolean" + ? x.toString() // boolean + : x.toString(); // number + }(x); // x here is narrowed to number | boolean } function foo3(x) { - return typeof x === "string" ? x : (function () { - var b = x; // new scope - number | boolean - return typeof x === "boolean" ? x.toString() // boolean - : x.toString(); // number - })(); + return typeof x === "string" + ? x + : (function () { + var b = x; // new scope - number | boolean + return typeof x === "boolean" + ? x.toString() // boolean + : x.toString(); // number + })(); } function foo4(x) { - return typeof x === "string" ? x : (function (a) { - var b = x; // new scope - number | boolean - return typeof x === "boolean" ? x.toString() // boolean - : x.toString(); // number - })(x); // x here is narrowed to number | boolean + return typeof x === "string" + ? x + : (function (a) { + var b = x; // new scope - number | boolean + return typeof x === "boolean" + ? x.toString() // boolean + : x.toString(); // number + })(x); // x here is narrowed to number | boolean } // Type guards affect nested function expressions, but not nested function declarations function foo5(x) { @@ -129,8 +141,9 @@ var m; y = x; // string; } else { - y = typeof x === "boolean" ? x.toString() // boolean - : x.toString(); // number + y = typeof x === "boolean" + ? x.toString() // boolean + : x.toString(); // number } })(m2 || (m2 = {})); })(m || (m = {})); @@ -147,8 +160,9 @@ var m1; y = x; // string; } else { - y = typeof x === "boolean" ? x.toString() // boolean - : x.toString(); // number + y = typeof x === "boolean" + ? x.toString() // boolean + : x.toString(); // number } })(m3 = m2.m3 || (m2.m3 = {})); })(m2 || (m2 = {})); diff --git a/tests/baselines/reference/typeGuardsInIfStatement.js b/tests/baselines/reference/typeGuardsInIfStatement.js index c228c038579..820d205bc65 100644 --- a/tests/baselines/reference/typeGuardsInIfStatement.js +++ b/tests/baselines/reference/typeGuardsInIfStatement.js @@ -258,8 +258,9 @@ function foo10(x) { else { var y; var b = x; // number | boolean - return typeof x === "number" ? x === 10 // number - : x; // x should be boolean + return typeof x === "number" + ? x === 10 // number + : x; // x should be boolean } } function foo11(x) { @@ -271,13 +272,15 @@ function foo11(x) { else { var y; var b = x; // number | boolean | string - because below we are changing value of x in if statement - return typeof x === "number" ? ( - // change value of x - x = 10 && x.toString() // number | boolean | string - ) : ( - // do not change value - y = x && x.toString() // number | boolean | string - ); + return typeof x === "number" + ? ( + // change value of x + x = 10 && x.toString() // number | boolean | string + ) + : ( + // do not change value + y = x && x.toString() // number | boolean | string + ); } } function foo12(x) { @@ -289,7 +292,8 @@ function foo12(x) { else { x = 10; var b = x; // number | boolean | string - return typeof x === "number" ? x.toString() // number - : x.toString(); // boolean | string + return typeof x === "number" + ? x.toString() // number + : x.toString(); // boolean | string } } diff --git a/tests/baselines/reference/typeGuardsInRightOperandOfAndAndOperator.js b/tests/baselines/reference/typeGuardsInRightOperandOfAndAndOperator.js index 23ee7b29f51..e3f1a8c72c2 100644 --- a/tests/baselines/reference/typeGuardsInRightOperandOfAndAndOperator.js +++ b/tests/baselines/reference/typeGuardsInRightOperandOfAndAndOperator.js @@ -86,8 +86,8 @@ function foo6(x) { // Mixing typeguard narrowing in if statement with conditional expression typeguard return typeof x !== "string" // string | number | boolean && (typeof x !== "number" // number | boolean - ? x // boolean - : x === 10); // number + ? x // boolean + : x === 10); // number } function foo7(x) { var y; @@ -96,14 +96,16 @@ function foo7(x) { // Assigning value to x deep inside another guard stops narrowing of type too return typeof x !== "string" && ((z = x) // string | number | boolean - x changed deeper in conditional expression - && (typeof x === "number" ? (x = 10 && x.toString()) // number | boolean | string - : (y = x && x.toString()))); // number | boolean | string + && (typeof x === "number" + ? (x = 10 && x.toString()) // number | boolean | string + : (y = x && x.toString()))); // number | boolean | string } function foo8(x) { // Mixing typeguard // Assigning value to x in outer guard shouldn't stop narrowing in the inner expression return typeof x !== "string" && (x = 10) // change x - number| string - && (typeof x === "number" ? x // number - : x.length); // string + && (typeof x === "number" + ? x // number + : x.length); // string } diff --git a/tests/baselines/reference/typeGuardsInRightOperandOfOrOrOperator.js b/tests/baselines/reference/typeGuardsInRightOperandOfOrOrOperator.js index 13bb090ab8c..188d226da13 100644 --- a/tests/baselines/reference/typeGuardsInRightOperandOfOrOrOperator.js +++ b/tests/baselines/reference/typeGuardsInRightOperandOfOrOrOperator.js @@ -86,8 +86,8 @@ function foo6(x) { // Mixing typeguard return typeof x === "string" // string | number | boolean || (typeof x !== "number" // number | boolean - ? x // boolean - : x === 10); // number + ? x // boolean + : x === 10); // number } function foo7(x) { var y; @@ -96,14 +96,16 @@ function foo7(x) { // Assigning value to x deep inside another guard stops narrowing of type too return typeof x === "string" || ((z = x) // string | number | boolean - x changed deeper in conditional expression - || (typeof x === "number" ? (x = 10 && x.toString()) // number | boolean | string - : (y = x && x.toString()))); // number | boolean | string + || (typeof x === "number" + ? (x = 10 && x.toString()) // number | boolean | string + : (y = x && x.toString()))); // number | boolean | string } function foo8(x) { // Mixing typeguard // Assigning value to x in outer guard shouldn't stop narrowing in the inner expression return typeof x === "string" || (x = 10) // change x - number| string - || (typeof x === "number" ? x // number - : x.length); // string + || (typeof x === "number" + ? x // number + : x.length); // string } diff --git a/tests/cases/compiler/conditionalExpressionNewLine1.ts b/tests/cases/compiler/conditionalExpressionNewLine1.ts new file mode 100644 index 00000000000..a21af7d1b0e --- /dev/null +++ b/tests/cases/compiler/conditionalExpressionNewLine1.ts @@ -0,0 +1 @@ +var v = a ? b : c; \ No newline at end of file diff --git a/tests/cases/compiler/conditionalExpressionNewLine10.ts b/tests/cases/compiler/conditionalExpressionNewLine10.ts new file mode 100644 index 00000000000..c1da921a4d6 --- /dev/null +++ b/tests/cases/compiler/conditionalExpressionNewLine10.ts @@ -0,0 +1,7 @@ +var v = a + ? b + ? d + : e + : c + ? f + : g; \ No newline at end of file diff --git a/tests/cases/compiler/conditionalExpressionNewLine2.ts b/tests/cases/compiler/conditionalExpressionNewLine2.ts new file mode 100644 index 00000000000..30c0c37beb6 --- /dev/null +++ b/tests/cases/compiler/conditionalExpressionNewLine2.ts @@ -0,0 +1,2 @@ +var v = a + ? b : c; \ No newline at end of file diff --git a/tests/cases/compiler/conditionalExpressionNewLine3.ts b/tests/cases/compiler/conditionalExpressionNewLine3.ts new file mode 100644 index 00000000000..ab31c226625 --- /dev/null +++ b/tests/cases/compiler/conditionalExpressionNewLine3.ts @@ -0,0 +1,2 @@ +var v = a ? + b : c; \ No newline at end of file diff --git a/tests/cases/compiler/conditionalExpressionNewLine4.ts b/tests/cases/compiler/conditionalExpressionNewLine4.ts new file mode 100644 index 00000000000..f17370ff046 --- /dev/null +++ b/tests/cases/compiler/conditionalExpressionNewLine4.ts @@ -0,0 +1,2 @@ +var v = a ? b : + c; \ No newline at end of file diff --git a/tests/cases/compiler/conditionalExpressionNewLine5.ts b/tests/cases/compiler/conditionalExpressionNewLine5.ts new file mode 100644 index 00000000000..695ce0a1005 --- /dev/null +++ b/tests/cases/compiler/conditionalExpressionNewLine5.ts @@ -0,0 +1,2 @@ +var v = a ? b + : c; \ No newline at end of file diff --git a/tests/cases/compiler/conditionalExpressionNewLine6.ts b/tests/cases/compiler/conditionalExpressionNewLine6.ts new file mode 100644 index 00000000000..189a3d67aa8 --- /dev/null +++ b/tests/cases/compiler/conditionalExpressionNewLine6.ts @@ -0,0 +1,3 @@ +var v = a + ? b + : c; \ No newline at end of file diff --git a/tests/cases/compiler/conditionalExpressionNewLine7.ts b/tests/cases/compiler/conditionalExpressionNewLine7.ts new file mode 100644 index 00000000000..5c5120c8022 --- /dev/null +++ b/tests/cases/compiler/conditionalExpressionNewLine7.ts @@ -0,0 +1,3 @@ +var v = a ? + b : + c; \ No newline at end of file diff --git a/tests/cases/compiler/conditionalExpressionNewLine8.ts b/tests/cases/compiler/conditionalExpressionNewLine8.ts new file mode 100644 index 00000000000..ef8fcf2ed95 --- /dev/null +++ b/tests/cases/compiler/conditionalExpressionNewLine8.ts @@ -0,0 +1,3 @@ +var v = a + ? b ? d : e + : c ? f : g; \ No newline at end of file diff --git a/tests/cases/compiler/conditionalExpressionNewLine9.ts b/tests/cases/compiler/conditionalExpressionNewLine9.ts new file mode 100644 index 00000000000..a59440f485c --- /dev/null +++ b/tests/cases/compiler/conditionalExpressionNewLine9.ts @@ -0,0 +1,5 @@ +var v = a + ? b + ? d : e + : c + ? f : g; \ No newline at end of file