From c2d30e714fe439ca7847b197bf42e02ca7e45709 Mon Sep 17 00:00:00 2001 From: Klaus Meinhardt Date: Sun, 13 Oct 2019 21:21:06 +0200 Subject: [PATCH] factory: parenthesize for-of expression when necessary Fixes: #33856 --- src/compiler/factory.ts | 2 +- .../reference/nullishCoalescingOperator12.js | 10 ++++++++++ .../nullishCoalescingOperator12.symbols | 12 ++++++++++++ .../reference/nullishCoalescingOperator12.types | 16 ++++++++++++++++ .../nullishCoalescingOperator12.ts | 5 +++++ 5 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/nullishCoalescingOperator12.js create mode 100644 tests/baselines/reference/nullishCoalescingOperator12.symbols create mode 100644 tests/baselines/reference/nullishCoalescingOperator12.types create mode 100644 tests/cases/conformance/expressions/nullishCoalescingOperator/nullishCoalescingOperator12.ts diff --git a/src/compiler/factory.ts b/src/compiler/factory.ts index e7314eaafa5fc..27bc356946aad 100644 --- a/src/compiler/factory.ts +++ b/src/compiler/factory.ts @@ -1811,7 +1811,7 @@ namespace ts { const node = createSynthesizedNode(SyntaxKind.ForOfStatement); node.awaitModifier = awaitModifier; node.initializer = initializer; - node.expression = expression; + node.expression = isCommaSequence(expression) ? createParen(expression) : expression; node.statement = asEmbeddedStatement(statement); return node; } diff --git a/tests/baselines/reference/nullishCoalescingOperator12.js b/tests/baselines/reference/nullishCoalescingOperator12.js new file mode 100644 index 0000000000000..f648af8e0b76b --- /dev/null +++ b/tests/baselines/reference/nullishCoalescingOperator12.js @@ -0,0 +1,10 @@ +//// [nullishCoalescingOperator12.ts] +const obj: { arr: any[] } = { arr: [] }; +for (const i of obj?.arr ?? []) { } + + +//// [nullishCoalescingOperator12.js] +"use strict"; +var _a, _b; +const obj = { arr: [] }; +for (const i of (_b = (_a = obj) === null || _a === void 0 ? void 0 : _a.arr, (_b !== null && _b !== void 0 ? _b : []))) { } diff --git a/tests/baselines/reference/nullishCoalescingOperator12.symbols b/tests/baselines/reference/nullishCoalescingOperator12.symbols new file mode 100644 index 0000000000000..6be9ed5c5e49f --- /dev/null +++ b/tests/baselines/reference/nullishCoalescingOperator12.symbols @@ -0,0 +1,12 @@ +=== tests/cases/conformance/expressions/nullishCoalescingOperator/nullishCoalescingOperator12.ts === +const obj: { arr: any[] } = { arr: [] }; +>obj : Symbol(obj, Decl(nullishCoalescingOperator12.ts, 0, 5)) +>arr : Symbol(arr, Decl(nullishCoalescingOperator12.ts, 0, 12)) +>arr : Symbol(arr, Decl(nullishCoalescingOperator12.ts, 0, 29)) + +for (const i of obj?.arr ?? []) { } +>i : Symbol(i, Decl(nullishCoalescingOperator12.ts, 1, 10)) +>obj?.arr : Symbol(arr, Decl(nullishCoalescingOperator12.ts, 0, 12)) +>obj : Symbol(obj, Decl(nullishCoalescingOperator12.ts, 0, 5)) +>arr : Symbol(arr, Decl(nullishCoalescingOperator12.ts, 0, 12)) + diff --git a/tests/baselines/reference/nullishCoalescingOperator12.types b/tests/baselines/reference/nullishCoalescingOperator12.types new file mode 100644 index 0000000000000..d0b52b7afbfa2 --- /dev/null +++ b/tests/baselines/reference/nullishCoalescingOperator12.types @@ -0,0 +1,16 @@ +=== tests/cases/conformance/expressions/nullishCoalescingOperator/nullishCoalescingOperator12.ts === +const obj: { arr: any[] } = { arr: [] }; +>obj : { arr: any[]; } +>arr : any[] +>{ arr: [] } : { arr: never[]; } +>arr : never[] +>[] : never[] + +for (const i of obj?.arr ?? []) { } +>i : any +>obj?.arr ?? [] : any[] +>obj?.arr : any[] +>obj : { arr: any[]; } +>arr : any[] +>[] : never[] + diff --git a/tests/cases/conformance/expressions/nullishCoalescingOperator/nullishCoalescingOperator12.ts b/tests/cases/conformance/expressions/nullishCoalescingOperator/nullishCoalescingOperator12.ts new file mode 100644 index 0000000000000..500340380b8e5 --- /dev/null +++ b/tests/cases/conformance/expressions/nullishCoalescingOperator/nullishCoalescingOperator12.ts @@ -0,0 +1,5 @@ +// @strict: true +// @target: ES2015 + +const obj: { arr: any[] } = { arr: [] }; +for (const i of obj?.arr ?? []) { }