New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Don't hoist template literal keys in object-rest-spread
#13483
Conversation
lala7573
commented
Jun 18, 2021
•
edited
edited
Q | A |
---|---|
Fixed Issues? | Fixes #13430 |
Patch: Bug Fix? | 👍 |
Major: Breaking Change? | |
Minor: New Feature? | |
Tests Added + Pass? | 👍 |
Documentation PR Link | |
Any Dependency Changes? | |
License | MIT |
Build successful! You can test your changes in the REPL here: https://babeljs.io/repl/build/46977/ |
This pull request is automatically built and testable in CodeSandbox. To see build info of the built libraries, click here or the icon next to each commit SHA. Latest deployment of this branch, based on commit bf1fbc7:
|
const { | ||
[`${foo}_bar`]: country, | ||
...rest | ||
} = input; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is an object destructure. We need to test an object rest, which is (confusingly) when there's no const
declaration:
const { | |
[`${foo}_bar`]: country, | |
...rest | |
} = input; | |
({ | |
[`${foo}_bar`]: country, | |
...rest | |
} = input); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is it? I tought both the desturcturing and object-rest-spread
plugins transformed both the syntaxes, it just depends on which plugin you enabled.
This test is currently broken on main
when targeting chrome 55
(which supports destructuring, but not object rest/spread):
https://babeljs.io/repl/build/main#?browsers=chrome%2055&build=&builtIns=false&corejs=3.6&spec=false&loose=false&code_lz=MYewdgzgLgBApgDwIYFsAOAbOMC8MAUAlLgHwwDeAUDDKJLAJZhoCuse5AvgNzW3jQYAMxAhcMAOQiQE3nzqCqNGgG0ABgBJy0zgH0ARkgBOagLoAufizBQjATwA0fGgDo3RuND6dxTVlF5OIA&presets=env
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I am so confused by the split between the two plugins…
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We should definitely consider merging them, relying on the targets
top-level option to decide how much to compile on the plugin.
|
||
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; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This flag is kinda redundant, you could just set allLiteral = false
(becase TemplateLiteral
is most often not literal). Or remove this branch, replace the following condition's isLiteral
with isImmutable
, and then TemplateLiteral
would fall through to the else
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No, because when allLiteral
is false
we need to inject the toPropertyKey
helper. We don't need it if we have template literals.
object-rest-spread
I edited the title so that it fits in a commit message header |
* remove hoisting when using template strings in proposal-object-rest-spread * remove const from test