From 343bb5ac70b5d6639f0a173cf2a4c868b5a356e6 Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Tue, 3 Apr 2018 13:32:42 -0700 Subject: [PATCH] Actuallt preserve nonblock for of statements in forofs with object rest (#23122) --- src/compiler/transformers/esnext.ts | 5 +++++ ...ructuringDoesNotElideFollowingStatement.js | 21 +++++++++++++++++++ ...ringDoesNotElideFollowingStatement.symbols | 14 +++++++++++++ ...turingDoesNotElideFollowingStatement.types | 19 +++++++++++++++++ ...ructuringDoesNotElideFollowingStatement.ts | 3 +++ 5 files changed, 62 insertions(+) create mode 100644 tests/baselines/reference/forLoopWithDestructuringDoesNotElideFollowingStatement.js create mode 100644 tests/baselines/reference/forLoopWithDestructuringDoesNotElideFollowingStatement.symbols create mode 100644 tests/baselines/reference/forLoopWithDestructuringDoesNotElideFollowingStatement.types create mode 100644 tests/cases/compiler/forLoopWithDestructuringDoesNotElideFollowingStatement.ts diff --git a/src/compiler/transformers/esnext.ts b/src/compiler/transformers/esnext.ts index b9a73ea97c0..97fe93e508b 100644 --- a/src/compiler/transformers/esnext.ts +++ b/src/compiler/transformers/esnext.ts @@ -304,6 +304,11 @@ namespace ts { bodyLocation = node.statement; statementsLocation = node.statement.statements; } + else if (node.statement) { + append(statements, node.statement); + bodyLocation = node.statement; + statementsLocation = node.statement; + } return updateForOf( node, node.awaitModifier, diff --git a/tests/baselines/reference/forLoopWithDestructuringDoesNotElideFollowingStatement.js b/tests/baselines/reference/forLoopWithDestructuringDoesNotElideFollowingStatement.js new file mode 100644 index 00000000000..fb2316426ee --- /dev/null +++ b/tests/baselines/reference/forLoopWithDestructuringDoesNotElideFollowingStatement.js @@ -0,0 +1,21 @@ +//// [forLoopWithDestructuringDoesNotElideFollowingStatement.ts] +let array = [{a: 0, b: 1}] +for (let { a, ...rest } of array) + void a + +//// [forLoopWithDestructuringDoesNotElideFollowingStatement.js] +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0) + t[p[i]] = s[p[i]]; + return t; +}; +var array = [{ a: 0, b: 1 }]; +for (var _i = 0, array_1 = array; _i < array_1.length; _i++) { + var _a = array_1[_i]; + var a = _a.a, rest = __rest(_a, ["a"]); + void a; +} diff --git a/tests/baselines/reference/forLoopWithDestructuringDoesNotElideFollowingStatement.symbols b/tests/baselines/reference/forLoopWithDestructuringDoesNotElideFollowingStatement.symbols new file mode 100644 index 00000000000..75662dd4690 --- /dev/null +++ b/tests/baselines/reference/forLoopWithDestructuringDoesNotElideFollowingStatement.symbols @@ -0,0 +1,14 @@ +=== tests/cases/compiler/forLoopWithDestructuringDoesNotElideFollowingStatement.ts === +let array = [{a: 0, b: 1}] +>array : Symbol(array, Decl(forLoopWithDestructuringDoesNotElideFollowingStatement.ts, 0, 3)) +>a : Symbol(a, Decl(forLoopWithDestructuringDoesNotElideFollowingStatement.ts, 0, 14)) +>b : Symbol(b, Decl(forLoopWithDestructuringDoesNotElideFollowingStatement.ts, 0, 19)) + +for (let { a, ...rest } of array) +>a : Symbol(a, Decl(forLoopWithDestructuringDoesNotElideFollowingStatement.ts, 1, 10)) +>rest : Symbol(rest, Decl(forLoopWithDestructuringDoesNotElideFollowingStatement.ts, 1, 13)) +>array : Symbol(array, Decl(forLoopWithDestructuringDoesNotElideFollowingStatement.ts, 0, 3)) + + void a +>a : Symbol(a, Decl(forLoopWithDestructuringDoesNotElideFollowingStatement.ts, 1, 10)) + diff --git a/tests/baselines/reference/forLoopWithDestructuringDoesNotElideFollowingStatement.types b/tests/baselines/reference/forLoopWithDestructuringDoesNotElideFollowingStatement.types new file mode 100644 index 00000000000..246c6d2e7db --- /dev/null +++ b/tests/baselines/reference/forLoopWithDestructuringDoesNotElideFollowingStatement.types @@ -0,0 +1,19 @@ +=== tests/cases/compiler/forLoopWithDestructuringDoesNotElideFollowingStatement.ts === +let array = [{a: 0, b: 1}] +>array : { a: number; b: number; }[] +>[{a: 0, b: 1}] : { a: number; b: number; }[] +>{a: 0, b: 1} : { a: number; b: number; } +>a : number +>0 : 0 +>b : number +>1 : 1 + +for (let { a, ...rest } of array) +>a : number +>rest : { b: number; } +>array : { a: number; b: number; }[] + + void a +>void a : undefined +>a : number + diff --git a/tests/cases/compiler/forLoopWithDestructuringDoesNotElideFollowingStatement.ts b/tests/cases/compiler/forLoopWithDestructuringDoesNotElideFollowingStatement.ts new file mode 100644 index 00000000000..5b6f7b97f1f --- /dev/null +++ b/tests/cases/compiler/forLoopWithDestructuringDoesNotElideFollowingStatement.ts @@ -0,0 +1,3 @@ +let array = [{a: 0, b: 1}] +for (let { a, ...rest } of array) + void a \ No newline at end of file