diff --git a/packages/babel-core/test/fixtures/transformation/misc/regression-2892/output.js b/packages/babel-core/test/fixtures/transformation/misc/regression-2892/output.js index 8d386e1069bc..b440ec1ed540 100644 --- a/packages/babel-core/test/fixtures/transformation/misc/regression-2892/output.js +++ b/packages/babel-core/test/fixtures/transformation/misc/regression-2892/output.js @@ -64,7 +64,7 @@ function _foo() { while (1) { switch (_context3.prev = _context3.next) { case 0: - _bar2 = function _ref2() { + _bar2 = function _bar4() { _bar2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() { var baz; return regeneratorRuntime.wrap(function _callee2$(_context2) { @@ -83,7 +83,7 @@ function _foo() { return _bar2.apply(this, arguments); }; - bar = function _ref() { + bar = function _bar3() { return _bar2.apply(this, arguments); }; diff --git a/packages/babel-plugin-proposal-decorators/test/fixtures/transformation/extends-await/output.js b/packages/babel-plugin-proposal-decorators/test/fixtures/transformation/extends-await/output.js index 707d6439237a..8745c2d63feb 100644 --- a/packages/babel-plugin-proposal-decorators/test/fixtures/transformation/extends-await/output.js +++ b/packages/babel-plugin-proposal-decorators/test/fixtures/transformation/extends-await/output.js @@ -1,8 +1,8 @@ async function g() { - let A = babelHelpers.decorate([dec], function (_initialize, _super) { + let A = babelHelpers.decorate([dec], function (_initialize, _await$B) { "use strict"; - class A extends _super { + class A extends _await$B { constructor(...args) { super(...args); diff --git a/packages/babel-plugin-proposal-decorators/test/fixtures/transformation/extends-yield/output.js b/packages/babel-plugin-proposal-decorators/test/fixtures/transformation/extends-yield/output.js index 2ccc1e94acea..9edec11c4f62 100644 --- a/packages/babel-plugin-proposal-decorators/test/fixtures/transformation/extends-yield/output.js +++ b/packages/babel-plugin-proposal-decorators/test/fixtures/transformation/extends-yield/output.js @@ -1,8 +1,8 @@ function* g() { - let A = babelHelpers.decorate([dec], function (_initialize, _super) { + let A = babelHelpers.decorate([dec], function (_initialize, _yield$B) { "use strict"; - class A extends _super { + class A extends _yield$B { constructor(...args) { super(...args); diff --git a/packages/babel-plugin-proposal-logical-assignment-operators/test/fixtures/logical-assignment/general-semantics/output.js b/packages/babel-plugin-proposal-logical-assignment-operators/test/fixtures/logical-assignment/general-semantics/output.js index 04557ad5d8bd..989eb1cd8e46 100644 --- a/packages/babel-plugin-proposal-logical-assignment-operators/test/fixtures/logical-assignment/general-semantics/output.js +++ b/packages/babel-plugin-proposal-logical-assignment-operators/test/fixtures/logical-assignment/general-semantics/output.js @@ -1,4 +1,4 @@ -var _deep$obj, _deep$obj2, _deep$obj3, _deep$obj4, _ref, _ref2, _ref3, _ref4, _deep$obj5, _ref5, _deep$obj6, _ref6, _deep$obj7, _ref7, _deep$obj8, _ref8; +var _deep$obj, _deep$obj2, _deep$obj3, _deep$obj4, _key, _key2, _key3, _key4, _deep$obj5, _key5, _deep$obj6, _key6, _deep$obj7, _key7, _deep$obj8, _key8; var x = 0; var sets = 0; @@ -38,30 +38,30 @@ expect(gets).toBe(3); expect((_deep$obj4 = deep.obj).x && (_deep$obj4.x = 3)).toBe(0); expect(gets).toBe(4); var key = 0; -expect(obj[_ref = ++key] || (obj[_ref] = 1)).toBe(1); +expect(obj[_key = ++key] || (obj[_key] = 1)).toBe(1); expect(key).toBe(1); key = 0; -expect(obj[_ref2 = ++key] || (obj[_ref2] = 2)).toBe(1); +expect(obj[_key2 = ++key] || (obj[_key2] = 2)).toBe(1); expect(key).toBe(1); key = 0; -expect(obj[_ref3 = ++key] && (obj[_ref3] = 0)).toBe(0); +expect(obj[_key3 = ++key] && (obj[_key3] = 0)).toBe(0); expect(key).toBe(1); key = 0; -expect(obj[_ref4 = ++key] && (obj[_ref4] = 3)).toBe(0); +expect(obj[_key4 = ++key] && (obj[_key4] = 3)).toBe(0); expect(key).toBe(1); key = 0; -expect((_deep$obj5 = deep.obj)[_ref5 = ++key] || (_deep$obj5[_ref5] = 1)).toBe(1); +expect((_deep$obj5 = deep.obj)[_key5 = ++key] || (_deep$obj5[_key5] = 1)).toBe(1); expect(gets).toBe(5); expect(key).toBe(1); key = 0; -expect((_deep$obj6 = deep.obj)[_ref6 = ++key] || (_deep$obj6[_ref6] = 2)).toBe(1); +expect((_deep$obj6 = deep.obj)[_key6 = ++key] || (_deep$obj6[_key6] = 2)).toBe(1); expect(gets).toBe(6); expect(key).toBe(1); key = 0; -expect((_deep$obj7 = deep.obj)[_ref7 = ++key] && (_deep$obj7[_ref7] = 0)).toBe(0); +expect((_deep$obj7 = deep.obj)[_key7 = ++key] && (_deep$obj7[_key7] = 0)).toBe(0); expect(gets).toBe(7); expect(key).toBe(1); key = 0; -expect((_deep$obj8 = deep.obj)[_ref8 = ++key] && (_deep$obj8[_ref8] = 3)).toBe(0); +expect((_deep$obj8 = deep.obj)[_key8 = ++key] && (_deep$obj8[_key8] = 3)).toBe(0); expect(gets).toBe(8); expect(key).toBe(1); diff --git a/packages/babel-plugin-proposal-logical-assignment-operators/test/fixtures/logical-assignment/null-coalescing/output.js b/packages/babel-plugin-proposal-logical-assignment-operators/test/fixtures/logical-assignment/null-coalescing/output.js index 35cd7fa05c2b..d34101b49629 100644 --- a/packages/babel-plugin-proposal-logical-assignment-operators/test/fixtures/logical-assignment/null-coalescing/output.js +++ b/packages/babel-plugin-proposal-logical-assignment-operators/test/fixtures/logical-assignment/null-coalescing/output.js @@ -1,4 +1,4 @@ -var _obj$x, _obj$x2, _deep$obj, _x, _deep$obj2, _x2, _ref, _obj, _ref2, _obj2, _deep$obj3, _ref3, _ref4, _deep$obj4, _ref5, _ref6; +var _obj$x, _obj$x2, _deep$obj, _deep$obj$x, _deep$obj2, _deep$obj2$x, _key, _obj$_key, _key2, _obj$_key2, _deep$obj3, _key3, _deep$obj3$_key, _deep$obj4, _key4, _deep$obj4$_key; var x = undefined; var sets = 0; @@ -26,23 +26,23 @@ var deep = { }; obj.x = undefined; -expect((_x = (_deep$obj = deep.obj).x) !== null && _x !== void 0 ? _x : _deep$obj.x = 1).toBe(1); +expect((_deep$obj$x = (_deep$obj = deep.obj).x) !== null && _deep$obj$x !== void 0 ? _deep$obj$x : _deep$obj.x = 1).toBe(1); expect(gets, 1); -expect((_x2 = (_deep$obj2 = deep.obj).x) !== null && _x2 !== void 0 ? _x2 : _deep$obj2.x = 2).toBe(1); +expect((_deep$obj2$x = (_deep$obj2 = deep.obj).x) !== null && _deep$obj2$x !== void 0 ? _deep$obj2$x : _deep$obj2.x = 2).toBe(1); expect(gets, 2); var key = 0; obj.x = undefined; -expect((_obj = obj[_ref = ++key]) !== null && _obj !== void 0 ? _obj : obj[_ref] = 1).toBe(1); +expect((_obj$_key = obj[_key = ++key]) !== null && _obj$_key !== void 0 ? _obj$_key : obj[_key] = 1).toBe(1); expect(key, 1); key = 0; -expect((_obj2 = obj[_ref2 = ++key]) !== null && _obj2 !== void 0 ? _obj2 : obj[_ref2] = 2).toBe(1); +expect((_obj$_key2 = obj[_key2 = ++key]) !== null && _obj$_key2 !== void 0 ? _obj$_key2 : obj[_key2] = 2).toBe(1); expect(key, 1); obj.x = undefined; key = 0; -expect((_ref4 = (_deep$obj3 = deep.obj)[_ref3 = ++key]) !== null && _ref4 !== void 0 ? _ref4 : _deep$obj3[_ref3] = 1).toBe(1); +expect((_deep$obj3$_key = (_deep$obj3 = deep.obj)[_key3 = ++key]) !== null && _deep$obj3$_key !== void 0 ? _deep$obj3$_key : _deep$obj3[_key3] = 1).toBe(1); expect(gets, 3); expect(key, 1); key = 0; -expect((_ref6 = (_deep$obj4 = deep.obj)[_ref5 = ++key]) !== null && _ref6 !== void 0 ? _ref6 : _deep$obj4[_ref5] = 2).toBe(1); +expect((_deep$obj4$_key = (_deep$obj4 = deep.obj)[_key4 = ++key]) !== null && _deep$obj4$_key !== void 0 ? _deep$obj4$_key : _deep$obj4[_key4] = 2).toBe(1); expect(gets, 4); expect(key, 1); diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/impure-computed/output.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/impure-computed/output.js index ae9c4e2e2505..c8fe1ed6e8a6 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/impure-computed/output.js +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/impure-computed/output.js @@ -6,11 +6,11 @@ var _$a = { 1: 1, a: 1 }, - _ref = key++, + _key = key++, { - [_ref]: y + [_key]: y } = _$a, - x = babelHelpers.objectWithoutProperties(_$a, [_ref].map(babelHelpers.toPropertyKey)); + x = babelHelpers.objectWithoutProperties(_$a, [_key].map(babelHelpers.toPropertyKey)); expect(x).toEqual({ a: 1 @@ -24,13 +24,13 @@ var _$ = { 2: 2, 3: 3 }, - _ref2 = ++key, - _ref3 = ++key, + _key2 = ++key, + _key3 = ++key, { - [_ref2]: y, - [_ref3]: z + [_key2]: y, + [_key3]: z } = _$, - rest = babelHelpers.objectWithoutProperties(_$, [_ref2, _ref3].map(babelHelpers.toPropertyKey)); + rest = babelHelpers.objectWithoutProperties(_$, [_key2, _key3].map(babelHelpers.toPropertyKey)); expect(y).toBe(2); expect(z).toBe(3); // pure, computed property should remain as-is diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/object-ref-computed/output.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/object-ref-computed/output.js index 319a0fe18c55..c038f07d1c26 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/object-ref-computed/output.js +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/object-ref-computed/output.js @@ -2,9 +2,9 @@ var key, x, y, z; // impure key = 1; -var _ref = key++, +var _key = key++, { - [_ref]: { + [_key]: { y } } = { @@ -18,7 +18,7 @@ var _ref = key++, a: 1, y: 1 } -}[_ref], ["y"]); +}[_key], ["y"]); expect(x).toEqual({ a: 1 @@ -38,18 +38,18 @@ var _$ = { z: 3 } }, - _ref2 = ++key, - _ref3 = ++key, + _key2 = ++key, + _key3 = ++key, { - [_ref3]: { + [_key3]: { y }, - [_ref2]: { + [_key2]: { z } } = _$, - rest_y = babelHelpers.objectWithoutProperties(_$[_ref3], ["y"]), - rest_z = babelHelpers.objectWithoutProperties(_$[_ref2], ["z"]); + rest_y = babelHelpers.objectWithoutProperties(_$[_key3], ["y"]), + rest_z = babelHelpers.objectWithoutProperties(_$[_key2], ["z"]); expect(y).toBe(2); expect(rest_y).toEqual({ diff --git a/packages/babel-plugin-proposal-partial-application/test/fixtures/general/with-spread/output.js b/packages/babel-plugin-proposal-partial-application/test/fixtures/general/with-spread/output.js index 9f4f7ab6f99b..ac3bbb32ab4e 100644 --- a/packages/babel-plugin-proposal-partial-application/test/fixtures/general/with-spread/output.js +++ b/packages/babel-plugin-proposal-partial-application/test/fixtures/general/with-spread/output.js @@ -1,13 +1,13 @@ "use strict"; -var _a, _param, _foo, _x, _param2, _bar, _param3, _obj$baz, _obj; +var _a, _b, _foo, _x, _y, _bar, _d, _obj$baz, _obj; -const q = (_foo = foo, _a = a, _param = [...b], function foo(_argPlaceholder) { - return _foo(_a, ..._param, _argPlaceholder); +const q = (_foo = foo, _a = a, _b = [...b], function foo(_argPlaceholder) { + return _foo(_a, ..._b, _argPlaceholder); }); -const w = (_bar = bar, _x = x, _param2 = [...y], function bar(_argPlaceholder2, _argPlaceholder3) { - return _bar(1, _x, _argPlaceholder2, ..._param2, _argPlaceholder3, 2); +const w = (_bar = bar, _x = x, _y = [...y], function bar(_argPlaceholder2, _argPlaceholder3) { + return _bar(1, _x, _argPlaceholder2, ..._y, _argPlaceholder3, 2); }); -const z = (_obj = obj, _obj$baz = _obj.baz, _param3 = [...d], function baz(_argPlaceholder4) { - return _obj$baz.call(_obj, _argPlaceholder4, ..._param3); +const z = (_obj = obj, _obj$baz = _obj.baz, _d = [...d], function baz(_argPlaceholder4) { + return _obj$baz.call(_obj, _argPlaceholder4, ..._d); }); diff --git a/packages/babel-plugin-proposal-pipeline-operator/test/fixtures/smart/bare-function/output.js b/packages/babel-plugin-proposal-pipeline-operator/test/fixtures/smart/bare-function/output.js index 24663cdab26a..d89c931323d0 100644 --- a/packages/babel-plugin-proposal-pipeline-operator/test/fixtures/smart/bare-function/output.js +++ b/packages/babel-plugin-proposal-pipeline-operator/test/fixtures/smart/bare-function/output.js @@ -1,4 +1,4 @@ -var _ref, _ref2; +var _ref, _; const abs = Math.abs; -const value = (_ref = (_ref2 = -5.9, abs(_ref2)), Math.floor(_ref)); +const value = (_ref = (_ = -5.9, abs(_)), Math.floor(_ref)); diff --git a/packages/babel-plugin-proposal-pipeline-operator/test/fixtures/smart/object-literal/output.js b/packages/babel-plugin-proposal-pipeline-operator/test/fixtures/smart/object-literal/output.js index c8c1d0f95f04..f558d2a62a01 100644 --- a/packages/babel-plugin-proposal-pipeline-operator/test/fixtures/smart/object-literal/output.js +++ b/packages/babel-plugin-proposal-pipeline-operator/test/fixtures/smart/object-literal/output.js @@ -1,10 +1,10 @@ -var _ref, _ref2, _ref3; +var _ref, _ref2, _; function area(rect) { return rect.width * rect.height; } -const result = (_ref = (_ref2 = (_ref3 = -5, Math.abs(_ref3)), { +const result = (_ref = (_ref2 = (_ = -5, Math.abs(_)), { width: _ref2, height: _ref2 + 3 }), area(_ref)); diff --git a/packages/babel-plugin-proposal-pipeline-operator/test/fixtures/smart/topic-inside-arrow-function/output.js b/packages/babel-plugin-proposal-pipeline-operator/test/fixtures/smart/topic-inside-arrow-function/output.js index 5517a532410f..35aee7ed2a42 100644 --- a/packages/babel-plugin-proposal-pipeline-operator/test/fixtures/smart/topic-inside-arrow-function/output.js +++ b/packages/babel-plugin-proposal-pipeline-operator/test/fixtures/smart/topic-inside-arrow-function/output.js @@ -1,7 +1,7 @@ -var _ref, _ref2, _ref3, _ref4; +var _ref, _ref2, _ref3, _; -const result = (_ref = (_ref2 = (_ref3 = (_ref4 = -2.2 // -2.2 -, Math.floor(_ref4) // -3 +const result = (_ref = (_ref2 = (_ref3 = (_ = -2.2 // -2.2 +, Math.floor(_) // -3 ), () => Math.pow(_ref3, 5) // () => -243 ), _ref2() // -243 ), Math.sign(_ref)); // -1 diff --git a/packages/babel-plugin-transform-parameters/test/fixtures/parameters/regression-4348/output.js b/packages/babel-plugin-transform-parameters/test/fixtures/parameters/regression-4348/output.js index e6e8f4c01a8d..08bc2b52ab19 100644 --- a/packages/babel-plugin-transform-parameters/test/fixtures/parameters/regression-4348/output.js +++ b/packages/babel-plugin-transform-parameters/test/fixtures/parameters/regression-4348/output.js @@ -1,6 +1,6 @@ function first() { - var _ref; + var _index; var index = 0; - return _ref = index++, _ref < 0 || arguments.length <= _ref ? undefined : arguments[_ref]; + return _index = index++, _index < 0 || arguments.length <= _index ? undefined : arguments[_index]; } diff --git a/packages/babel-traverse/src/scope/index.js b/packages/babel-traverse/src/scope/index.js index 7ba6793be3c7..df8f81f3560d 100644 --- a/packages/babel-traverse/src/scope/index.js +++ b/packages/babel-traverse/src/scope/index.js @@ -11,37 +11,141 @@ import { scope as scopeCache } from "../cache"; // Recursively gathers the identifying names of a node. function gatherNodeParts(node: Object, parts: Array) { - if (t.isModuleDeclaration(node)) { - if (node.source) { - gatherNodeParts(node.source, parts); - } else if (node.specifiers && node.specifiers.length) { - for (const specifier of (node.specifiers: Array)) { - gatherNodeParts(specifier, parts); + switch (node?.type) { + default: + if (t.isModuleDeclaration(node)) { + if (node.source) { + gatherNodeParts(node.source, parts); + } else if (node.specifiers && node.specifiers.length) { + for (const e of node.specifiers) gatherNodeParts(e, parts); + } else if (node.declaration) { + gatherNodeParts(node.declaration, parts); + } + } else if (t.isModuleSpecifier(node)) { + gatherNodeParts(node.local, parts); + } else if (t.isLiteral(node)) { + parts.push(node.value); + } + break; + + case "MemberExpression": + case "OptionalMemberExpression": + case "JSXMemberExpression": + gatherNodeParts(node.object, parts); + gatherNodeParts(node.property, parts); + break; + + case "Identifier": + case "JSXIdentifier": + parts.push(node.name); + break; + + case "CallExpression": + case "OptionalCallExpression": + case "NewExpression": + gatherNodeParts(node.callee, parts); + break; + + case "ObjectExpression": + case "ObjectPattern": + for (const e of node.properties) { + gatherNodeParts(e, parts); } - } else if (node.declaration) { - gatherNodeParts(node.declaration, parts); - } - } else if (t.isModuleSpecifier(node)) { - gatherNodeParts(node.local, parts); - } else if (t.isMemberExpression(node)) { - gatherNodeParts(node.object, parts); - gatherNodeParts(node.property, parts); - } else if (t.isIdentifier(node)) { - parts.push(node.name); - } else if (t.isLiteral(node)) { - parts.push(node.value); - } else if (t.isCallExpression(node)) { - gatherNodeParts(node.callee, parts); - } else if (t.isObjectExpression(node) || t.isObjectPattern(node)) { - for (const prop of (node.properties: Array)) { - gatherNodeParts(prop.key || prop.argument, parts); - } - } else if (t.isPrivateName(node)) { - gatherNodeParts(node.id, parts); - } else if (t.isThisExpression(node)) { - parts.push("this"); - } else if (t.isSuper(node)) { - parts.push("super"); + break; + + case "SpreadElement": + case "RestElement": + gatherNodeParts(node.argument, parts); + break; + + case "ObjectProperty": + case "ObjectMethod": + case "ClassProperty": + case "ClassMethod": + case "ClassPrivateProperty": + case "ClassPrivateMethod": + gatherNodeParts(node.key, parts); + break; + + case "ThisExpression": + parts.push("this"); + break; + + case "Super": + parts.push("super"); + break; + + case "Import": + parts.push("import"); + break; + + case "DoExpression": + parts.push("do"); + break; + + case "YieldExpression": + parts.push("yield"); + gatherNodeParts(node.argument, parts); + break; + + case "AwaitExpression": + parts.push("await"); + gatherNodeParts(node.argument, parts); + break; + + case "AssignmentExpression": + gatherNodeParts(node.left, parts); + break; + + case "VariableDeclarator": + gatherNodeParts(node.id, parts); + break; + + case "FunctionExpression": + case "FunctionDeclaration": + case "ClassExpression": + case "ClassDeclaration": + gatherNodeParts(node.id, parts); + break; + + case "PrivateName": + gatherNodeParts(node.id, parts); + break; + + case "ParenthesizedExpression": + gatherNodeParts(node.expression, parts); + break; + + case "UnaryExpression": + case "UpdateExpression": + gatherNodeParts(node.argument, parts); + break; + + case "MetaProperty": + gatherNodeParts(node.meta, parts); + gatherNodeParts(node.property, parts); + break; + + case "JSXElement": + gatherNodeParts(node.openingElement, parts); + break; + + case "JSXOpeningElement": + parts.push(node.name); + break; + + case "JSXFragment": + gatherNodeParts(node.openingFragment, parts); + break; + + case "JSXOpeningFragment": + parts.push("Fragment"); + break; + + case "JSXNamespacedName": + gatherNodeParts(node.namespace, parts); + gatherNodeParts(node.name, parts); + break; } } @@ -267,17 +371,7 @@ export default class Scope { return `_${id}`; } - generateUidBasedOnNode(parent: Object, defaultName?: String) { - let node = parent; - - if (t.isAssignmentExpression(parent)) { - node = parent.left; - } else if (t.isVariableDeclarator(parent)) { - node = parent.id; - } else if (t.isObjectProperty(node) || t.isObjectMethod(node)) { - node = node.key; - } - + generateUidBasedOnNode(node: Object, defaultName?: String) { const parts = []; gatherNodeParts(node, parts); @@ -291,11 +385,8 @@ export default class Scope { * Generate a unique identifier based on a node. */ - generateUidIdentifierBasedOnNode( - parent: Object, - defaultName?: String, - ): Object { - return t.identifier(this.generateUidBasedOnNode(parent, defaultName)); + generateUidIdentifierBasedOnNode(node: Object, defaultName?: String): Object { + return t.identifier(this.generateUidBasedOnNode(node, defaultName)); } /**