From c3e871501034fdb679adab83bc7ff6f715067a58 Mon Sep 17 00:00:00 2001 From: Moti Zilberman Date: Sun, 19 Mar 2017 10:06:53 +0000 Subject: [PATCH 1/6] Mask existing "local" bindings when registering new binding Fixes #5491. --- packages/babel-traverse/src/scope/index.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/babel-traverse/src/scope/index.js b/packages/babel-traverse/src/scope/index.js index b2cdc4238e..773cda8058 100644 --- a/packages/babel-traverse/src/scope/index.js +++ b/packages/babel-traverse/src/scope/index.js @@ -532,6 +532,8 @@ export default class Scope { // in `warnOnFlowBinding`. if (local && local.path.isFlow()) local = null; + if (local && local.kind === "local") local = null; + parent.references[name] = true; this.bindings[name] = new Binding({ From 1ef58713006ba166261d0661a247cd308ddd4b14 Mon Sep 17 00:00:00 2001 From: Moti Zilberman Date: Sun, 19 Mar 2017 10:09:41 +0000 Subject: [PATCH 2/6] Add tests for #5491 and related cases The two function expression tests would fail before 6705de7. The function declaration test was not a failing case but is added here for completeness. --- .../fixtures/general/shadowing-function-declaration/actual.js | 3 +++ .../general/shadowing-function-declaration/expected.js | 3 +++ .../general/shadowing-function-expression-2/actual.js | 4 ++++ .../general/shadowing-function-expression-2/options.json | 3 +++ .../fixtures/general/shadowing-function-expression/actual.js | 3 +++ .../general/shadowing-function-expression/expected.js | 3 +++ 6 files changed, 19 insertions(+) create mode 100644 packages/babel-plugin-check-es2015-constants/test/fixtures/general/shadowing-function-declaration/actual.js create mode 100644 packages/babel-plugin-check-es2015-constants/test/fixtures/general/shadowing-function-declaration/expected.js create mode 100644 packages/babel-plugin-check-es2015-constants/test/fixtures/general/shadowing-function-expression-2/actual.js create mode 100644 packages/babel-plugin-check-es2015-constants/test/fixtures/general/shadowing-function-expression-2/options.json create mode 100644 packages/babel-plugin-check-es2015-constants/test/fixtures/general/shadowing-function-expression/actual.js create mode 100644 packages/babel-plugin-check-es2015-constants/test/fixtures/general/shadowing-function-expression/expected.js diff --git a/packages/babel-plugin-check-es2015-constants/test/fixtures/general/shadowing-function-declaration/actual.js b/packages/babel-plugin-check-es2015-constants/test/fixtures/general/shadowing-function-declaration/actual.js new file mode 100644 index 0000000000..3820c79860 --- /dev/null +++ b/packages/babel-plugin-check-es2015-constants/test/fixtures/general/shadowing-function-declaration/actual.js @@ -0,0 +1,3 @@ +function B() { + const B = 1; +} diff --git a/packages/babel-plugin-check-es2015-constants/test/fixtures/general/shadowing-function-declaration/expected.js b/packages/babel-plugin-check-es2015-constants/test/fixtures/general/shadowing-function-declaration/expected.js new file mode 100644 index 0000000000..cda38be6e6 --- /dev/null +++ b/packages/babel-plugin-check-es2015-constants/test/fixtures/general/shadowing-function-declaration/expected.js @@ -0,0 +1,3 @@ +function B() { + var B = 1; +} diff --git a/packages/babel-plugin-check-es2015-constants/test/fixtures/general/shadowing-function-expression-2/actual.js b/packages/babel-plugin-check-es2015-constants/test/fixtures/general/shadowing-function-expression-2/actual.js new file mode 100644 index 0000000000..3ac8572ee9 --- /dev/null +++ b/packages/babel-plugin-check-es2015-constants/test/fixtures/general/shadowing-function-expression-2/actual.js @@ -0,0 +1,4 @@ +(function B() { + const B = 1; + B = 2; +}); diff --git a/packages/babel-plugin-check-es2015-constants/test/fixtures/general/shadowing-function-expression-2/options.json b/packages/babel-plugin-check-es2015-constants/test/fixtures/general/shadowing-function-expression-2/options.json new file mode 100644 index 0000000000..e852c14a3c --- /dev/null +++ b/packages/babel-plugin-check-es2015-constants/test/fixtures/general/shadowing-function-expression-2/options.json @@ -0,0 +1,3 @@ +{ + "throws": "\"B\" is read-only" +} diff --git a/packages/babel-plugin-check-es2015-constants/test/fixtures/general/shadowing-function-expression/actual.js b/packages/babel-plugin-check-es2015-constants/test/fixtures/general/shadowing-function-expression/actual.js new file mode 100644 index 0000000000..584ee53cce --- /dev/null +++ b/packages/babel-plugin-check-es2015-constants/test/fixtures/general/shadowing-function-expression/actual.js @@ -0,0 +1,3 @@ +(function B() { + const B = 1; +}); diff --git a/packages/babel-plugin-check-es2015-constants/test/fixtures/general/shadowing-function-expression/expected.js b/packages/babel-plugin-check-es2015-constants/test/fixtures/general/shadowing-function-expression/expected.js new file mode 100644 index 0000000000..36d2997a5f --- /dev/null +++ b/packages/babel-plugin-check-es2015-constants/test/fixtures/general/shadowing-function-expression/expected.js @@ -0,0 +1,3 @@ +(function B() { + var B = 1; +}); From 68786c4f0f5007c4be1ed204f2021a10a8c8832b Mon Sep 17 00:00:00 2001 From: Moti Zilberman Date: Sun, 19 Mar 2017 11:03:42 +0000 Subject: [PATCH 3/6] Add test for issue #4946 --- .../test/fixtures/general/issue-4946/actual.js | 3 +++ .../test/fixtures/general/issue-4946/expected.js | 3 +++ 2 files changed, 6 insertions(+) create mode 100644 packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/issue-4946/actual.js create mode 100644 packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/issue-4946/expected.js diff --git a/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/issue-4946/actual.js b/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/issue-4946/actual.js new file mode 100644 index 0000000000..b2f5b4fc4e --- /dev/null +++ b/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/issue-4946/actual.js @@ -0,0 +1,3 @@ +(function foo() { + let foo = true; +}); diff --git a/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/issue-4946/expected.js b/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/issue-4946/expected.js new file mode 100644 index 0000000000..2ad4b5a08d --- /dev/null +++ b/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/issue-4946/expected.js @@ -0,0 +1,3 @@ +(function foo() { + var foo = true; +}); From 48c114169fff2ef795365ab6f2f0d0a70b11091e Mon Sep 17 00:00:00 2001 From: Moti Zilberman Date: Sun, 19 Mar 2017 11:05:55 +0000 Subject: [PATCH 4/6] Move up check for binding kind "local" This puts the check before the call to `checkBlockScopedCollisions`. Fixes #4946. --- packages/babel-traverse/src/scope/index.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/babel-traverse/src/scope/index.js b/packages/babel-traverse/src/scope/index.js index 773cda8058..f9c1ab22e2 100644 --- a/packages/babel-traverse/src/scope/index.js +++ b/packages/babel-traverse/src/scope/index.js @@ -519,6 +519,11 @@ export default class Scope { for (const name in ids) { for (const id of (ids[name]: Array)) { let local = this.getOwnBinding(name); + + // Ignore existing binding if it's the name of the current function or class + // expression + if (local && local.kind === "local") local = null; + if (local) { // same identifier so continue safely as we're likely trying to register it // multiple times @@ -532,8 +537,6 @@ export default class Scope { // in `warnOnFlowBinding`. if (local && local.path.isFlow()) local = null; - if (local && local.kind === "local") local = null; - parent.references[name] = true; this.bindings[name] = new Binding({ From 4b297907d1f4d308aeceaca7809ff0aecb9235cf Mon Sep 17 00:00:00 2001 From: Justin Ridgewell Date: Fri, 25 Aug 2017 19:23:11 -0400 Subject: [PATCH 5/6] Move fix into #checkBlockScopedCollisions --- packages/babel-traverse/src/scope/index.js | 8 ++++---- .../regression/constant-shadows-function-name/actual.js | 8 ++++++++ .../regression/constant-shadows-function-name/expected.js | 7 +++++++ 3 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 packages/babel-traverse/test/fixtures/regression/constant-shadows-function-name/actual.js create mode 100644 packages/babel-traverse/test/fixtures/regression/constant-shadows-function-name/expected.js diff --git a/packages/babel-traverse/src/scope/index.js b/packages/babel-traverse/src/scope/index.js index f9c1ab22e2..8e5950bf28 100644 --- a/packages/babel-traverse/src/scope/index.js +++ b/packages/babel-traverse/src/scope/index.js @@ -346,6 +346,10 @@ export default class Scope { // ignore parameters if (kind === "param") return; + // Ignore existing binding if it's the name of the current function or + // class expression + if (local.kind === "local") return; + // ignore hoisted functions if there's also a local let if (kind === "hoisted" && local.kind === "let") return; @@ -520,10 +524,6 @@ export default class Scope { for (const id of (ids[name]: Array)) { let local = this.getOwnBinding(name); - // Ignore existing binding if it's the name of the current function or class - // expression - if (local && local.kind === "local") local = null; - if (local) { // same identifier so continue safely as we're likely trying to register it // multiple times diff --git a/packages/babel-traverse/test/fixtures/regression/constant-shadows-function-name/actual.js b/packages/babel-traverse/test/fixtures/regression/constant-shadows-function-name/actual.js new file mode 100644 index 0000000000..f56e906e25 --- /dev/null +++ b/packages/babel-traverse/test/fixtures/regression/constant-shadows-function-name/actual.js @@ -0,0 +1,8 @@ +let obj = { + foo: function foo() { + let foo = true; + console.log('foo ran'); + } +}; + +obj.foo(); diff --git a/packages/babel-traverse/test/fixtures/regression/constant-shadows-function-name/expected.js b/packages/babel-traverse/test/fixtures/regression/constant-shadows-function-name/expected.js new file mode 100644 index 0000000000..1a47048c09 --- /dev/null +++ b/packages/babel-traverse/test/fixtures/regression/constant-shadows-function-name/expected.js @@ -0,0 +1,7 @@ +let obj = { + foo: function foo() { + let foo = true; + console.log('foo ran'); + } +}; +obj.foo(); From a70cda812ce7fb01d5fb32c4419852696df24989 Mon Sep 17 00:00:00 2001 From: Justin Ridgewell Date: Fri, 25 Aug 2017 19:52:15 -0400 Subject: [PATCH 6/6] Remove old test --- .../general/shadowing-function-expression-2/actual.js | 4 ---- .../general/shadowing-function-expression-2/options.json | 3 --- 2 files changed, 7 deletions(-) delete mode 100644 packages/babel-plugin-check-es2015-constants/test/fixtures/general/shadowing-function-expression-2/actual.js delete mode 100644 packages/babel-plugin-check-es2015-constants/test/fixtures/general/shadowing-function-expression-2/options.json diff --git a/packages/babel-plugin-check-es2015-constants/test/fixtures/general/shadowing-function-expression-2/actual.js b/packages/babel-plugin-check-es2015-constants/test/fixtures/general/shadowing-function-expression-2/actual.js deleted file mode 100644 index 3ac8572ee9..0000000000 --- a/packages/babel-plugin-check-es2015-constants/test/fixtures/general/shadowing-function-expression-2/actual.js +++ /dev/null @@ -1,4 +0,0 @@ -(function B() { - const B = 1; - B = 2; -}); diff --git a/packages/babel-plugin-check-es2015-constants/test/fixtures/general/shadowing-function-expression-2/options.json b/packages/babel-plugin-check-es2015-constants/test/fixtures/general/shadowing-function-expression-2/options.json deleted file mode 100644 index e852c14a3c..0000000000 --- a/packages/babel-plugin-check-es2015-constants/test/fixtures/general/shadowing-function-expression-2/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "throws": "\"B\" is read-only" -}