Skip to content

Commit

Permalink
Don't hoist template literal keys in object-rest-spread (babel#13483)
Browse files Browse the repository at this point in the history
* remove hoisting when using template strings in proposal-object-rest-spread

* remove const from test
  • Loading branch information
lala7573 authored and nicolo-ribaudo committed Jul 30, 2021
1 parent d6c656b commit f30df33
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 3 deletions.
Expand Up @@ -95,13 +95,15 @@ export default declare((api, opts) => {
const props = path.node.properties;
const keys = [];
let allLiteral = true;
let hasTemplateLiteral = false;

for (const prop of props) {
if (t.isIdentifier(prop.key) && !prop.computed) {
// since a key {a: 3} is equivalent to {"a": 3}, use the latter
keys.push(t.stringLiteral(prop.key.name));
} else if (t.isTemplateLiteral(prop.key)) {
keys.push(t.cloneNode(prop.key));
hasTemplateLiteral = true;
} else if (t.isLiteral(prop.key)) {
keys.push(t.stringLiteral(String(prop.key.value)));
} else {
Expand All @@ -110,7 +112,7 @@ export default declare((api, opts) => {
}
}

return { keys, allLiteral };
return { keys, allLiteral, hasTemplateLiteral };
}

// replaces impure computed keys with new identifiers
Expand Down Expand Up @@ -156,7 +158,8 @@ export default declare((api, opts) => {
path.get("properties"),
path.scope,
);
const { keys, allLiteral } = extractNormalizedKeys(path);
const { keys, allLiteral, hasTemplateLiteral } =
extractNormalizedKeys(path);

if (keys.length === 0) {
return [
Expand All @@ -179,7 +182,7 @@ export default declare((api, opts) => {
} else {
keyExpression = t.arrayExpression(keys);

if (!t.isProgram(path.scope.block)) {
if (!hasTemplateLiteral && !t.isProgram(path.scope.block)) {
// Hoist definition of excluded keys, so that it's not created each time.
const program = path.findParent(path => path.isProgram());
const id = path.scope.generateUidIdentifier("excluded");
Expand Down
@@ -0,0 +1,9 @@
const example = () => {
const input = {};
const foo = 'foo';

({
[`${foo}_bar`]: country,
...rest
} = input);
}
@@ -0,0 +1,10 @@
const example = () => {
const input = {};
const foo = 'foo';
var _input = input;
({
[`${foo}_bar`]: country
} = _input);
rest = babelHelpers.objectWithoutProperties(_input, [`${foo}_bar`]);
_input;
};

0 comments on commit f30df33

Please sign in to comment.