From 7a7704fea02d7e839fe412459730735bb64f1503 Mon Sep 17 00:00:00 2001 From: Moti Zilberman Date: Wed, 5 Oct 2016 22:47:21 +0300 Subject: [PATCH] Fix block scoping transform for declarations in labeled statements (#4669) * Fix block scoping transform for declarations in labeled statements (#4122) * DRY block-scoping --- .../src/index.js | 32 ++++++++++--------- .../test/fixtures/general/label/actual.js | 9 ++++++ .../test/fixtures/general/label/expected.js | 11 +++++++ 3 files changed, 37 insertions(+), 15 deletions(-) create mode 100644 packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/label/actual.js create mode 100644 packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/label/expected.js diff --git a/packages/babel-plugin-transform-es2015-block-scoping/src/index.js b/packages/babel-plugin-transform-es2015-block-scoping/src/index.js index 6c4c4c4e50..6f21235196 100644 --- a/packages/babel-plugin-transform-es2015-block-scoping/src/index.js +++ b/packages/babel-plugin-transform-es2015-block-scoping/src/index.js @@ -488,17 +488,24 @@ class BlockScoping { } } + const addDeclarationsFromChild = (path, node) => { + node = node || path.node; + if (t.isClassDeclaration(node) || t.isFunctionDeclaration(node) || isBlockScoped(node)) { + if (isBlockScoped(node)) { + convertBlockScopedToVar(path, node, block, this.scope); + } + declarators = declarators.concat(node.declarations || node); + } + if (t.isLabeledStatement(node)) { + addDeclarationsFromChild(path.get("body"), node.body); + } + }; + // if (block.body) { for (let i = 0; i < block.body.length; i++) { - let declar = block.body[i]; - if (t.isClassDeclaration(declar) || t.isFunctionDeclaration(declar) || isBlockScoped(declar)) { - let declarPath = this.blockPath.get("body")[i]; - if (isBlockScoped(declar)) { - convertBlockScopedToVar(declarPath, null, block, this.scope); - } - declarators = declarators.concat(declar.declarations || declar); - } + let declarPath = this.blockPath.get("body")[i]; + addDeclarationsFromChild(declarPath); } } @@ -507,14 +514,9 @@ class BlockScoping { let consequents = block.cases[i].consequent; for (let j = 0; j < consequents.length; j++) { + let declarPath = this.blockPath.get("cases")[i]; let declar = consequents[j]; - if (t.isClassDeclaration(declar) || t.isFunctionDeclaration(declar) || isBlockScoped(declar)) { - let declarPath = this.blockPath.get("cases")[i]; - if (isBlockScoped(declar)) { - convertBlockScopedToVar(declarPath, declar, block, this.scope); - } - declarators = declarators.concat(declar.declarations || declar); - } + addDeclarationsFromChild(declarPath, declar); } } } diff --git a/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/label/actual.js b/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/label/actual.js new file mode 100644 index 0000000000..8d657e984d --- /dev/null +++ b/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/label/actual.js @@ -0,0 +1,9 @@ +let x, y; +{ + a: let x; + let y; +} + +switch (0) { + case 0: a: let x=0; +} diff --git a/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/label/expected.js b/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/label/expected.js new file mode 100644 index 0000000000..a89cb68476 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/label/expected.js @@ -0,0 +1,11 @@ +var x = void 0, + y = void 0; +{ + a: var _x = void 0; + var _y = void 0; +} + +switch (0) { + case 0: + a: var _x2 = 0; +}