From 4887d81929b7b598abf2e04b77c95586b5230b35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Sun, 4 Feb 2018 13:37:44 +0100 Subject: [PATCH] Remove bindings of removed paths from scope --- .../src/index.js | 4 ++ .../test/fixtures/regression/gh-7304/input.js | 3 ++ .../fixtures/regression/gh-7304/options.json | 14 +++++++ .../fixtures/regression/gh-7304/output.js | 15 +++++++ .../test/fixtures/regression/gh-6923/input.js | 5 +++ .../fixtures/regression/gh-6923/options.json | 12 ++++++ .../fixtures/regression/gh-6923/output.js | 42 +++++++++++++++++++ packages/babel-traverse/src/path/removal.js | 6 +++ 8 files changed, 101 insertions(+) create mode 100644 packages/babel-plugin-proposal-object-rest-spread/test/fixtures/regression/gh-7304/input.js create mode 100644 packages/babel-plugin-proposal-object-rest-spread/test/fixtures/regression/gh-7304/options.json create mode 100644 packages/babel-plugin-proposal-object-rest-spread/test/fixtures/regression/gh-7304/output.js create mode 100644 packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/gh-6923/input.js create mode 100644 packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/gh-6923/options.json create mode 100644 packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/gh-6923/output.js diff --git a/packages/babel-plugin-proposal-object-rest-spread/src/index.js b/packages/babel-plugin-proposal-object-rest-spread/src/index.js index d5efc04dff..7b9d854555 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/src/index.js +++ b/packages/babel-plugin-proposal-object-rest-spread/src/index.js @@ -189,11 +189,13 @@ export default function(api, opts) { let ref = this.originalPath.node.init; const refPropertyPath = []; + let kind; path.findParent(path => { if (path.isObjectProperty()) { refPropertyPath.unshift(path.node.key.name); } else if (path.isVariableDeclarator()) { + kind = path.parentPath.node.kind; return true; } }); @@ -223,6 +225,8 @@ export default function(api, opts) { insertionPath = insertionPath.getSibling(insertionPath.key + 1); + path.scope.registerBinding(kind, insertionPath); + if (objectPatternPath.node.properties.length === 0) { objectPatternPath .findParent( diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/regression/gh-7304/input.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/regression/gh-7304/input.js new file mode 100644 index 0000000000..e39bd2601e --- /dev/null +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/regression/gh-7304/input.js @@ -0,0 +1,3 @@ +export default class { + method ({ ...object }) {} +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/regression/gh-7304/options.json b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/regression/gh-7304/options.json new file mode 100644 index 0000000000..e1a96432fa --- /dev/null +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/regression/gh-7304/options.json @@ -0,0 +1,14 @@ +{ + "presets": [ + ["env", { + "shippedProposals": true, + "targets": { + "node": 8 + }, + "useBuiltIns": "usage" + }] + ], + "plugins": [ + "external-helpers" + ] +} diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/regression/gh-7304/output.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/regression/gh-7304/output.js new file mode 100644 index 0000000000..b0abfb9a44 --- /dev/null +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/regression/gh-7304/output.js @@ -0,0 +1,15 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +class _default { + method(_ref) { + let object = babelHelpers.objectWithoutProperties(_ref, []); + } + +} + +exports.default = _default; diff --git a/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/gh-6923/input.js b/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/gh-6923/input.js new file mode 100644 index 0000000000..480618198c --- /dev/null +++ b/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/gh-6923/input.js @@ -0,0 +1,5 @@ +async function foo() { + (async function (number) { + const tmp = number + }) +} \ No newline at end of file diff --git a/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/gh-6923/options.json b/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/gh-6923/options.json new file mode 100644 index 0000000000..6f43f7581b --- /dev/null +++ b/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/gh-6923/options.json @@ -0,0 +1,12 @@ +{ + "presets": [ + ["env", { + "targets": { + "chrome": "62", + "edge": "15", + "firefox": "52", + "safari": "11" + } + }] + ] +} \ No newline at end of file diff --git a/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/gh-6923/output.js b/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/gh-6923/output.js new file mode 100644 index 0000000000..ac46ce86c6 --- /dev/null +++ b/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/gh-6923/output.js @@ -0,0 +1,42 @@ +function foo() { + return _foo.apply(this, arguments); +} + +function _foo() { + _foo = babelHelpers.asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee2() { + return regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) switch (_context2.prev = _context2.next) { + case 0: + /*#__PURE__*/ + (function () { + var _ref = babelHelpers.asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee(number) { + var tmp; + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + tmp = number; + + case 1: + case "end": + return _context.stop(); + } + }, _callee, this); + })); + + return function (_x) { + return _ref.apply(this, arguments); + }; + })(); + + case 1: + case "end": + return _context2.stop(); + } + }, _callee2, this); + })); + return _foo.apply(this, arguments); +} diff --git a/packages/babel-traverse/src/path/removal.js b/packages/babel-traverse/src/path/removal.js index 5b9352fa46..b4d1330b25 100644 --- a/packages/babel-traverse/src/path/removal.js +++ b/packages/babel-traverse/src/path/removal.js @@ -6,6 +6,7 @@ export function remove() { this._assertUnremoved(); this.resync(); + this._removeFromScope(); if (this._callRemovalHooks()) { this._markRemoved(); @@ -17,6 +18,11 @@ export function remove() { this._markRemoved(); } +export function _removeFromScope() { + const bindings = this.getBindingIdentifiers(); + Object.keys(bindings).forEach(name => this.scope.removeBinding(name)); +} + export function _callRemovalHooks() { for (const fn of (hooks: Array)) { if (fn(this, this.parentPath)) return true;