Assign another temp var when parsing assignment patterns in destructuring (#7333)
This commit is contained in:
parent
4da3f3bc64
commit
4f4dd3d4a6
@ -111,43 +111,40 @@ export default declare((api, options) => {
|
||||
}
|
||||
}
|
||||
|
||||
pushAssignmentPattern(pattern, valueRef) {
|
||||
pushAssignmentPattern({ left, right }, valueRef) {
|
||||
// we need to assign the current value of the assignment to avoid evaluating
|
||||
// it more than once
|
||||
const tempId = this.scope.generateUidIdentifierBasedOnNode(valueRef);
|
||||
|
||||
const tempValueRef = this.scope.generateUidBasedOnNode(valueRef);
|
||||
|
||||
const declar = t.variableDeclaration("var", [
|
||||
t.variableDeclarator(t.identifier(tempValueRef), valueRef),
|
||||
]);
|
||||
declar._blockHoist = this.blockHoist;
|
||||
this.nodes.push(declar);
|
||||
|
||||
//
|
||||
this.nodes.push(this.buildVariableDeclaration(tempId, valueRef));
|
||||
|
||||
const tempConditional = t.conditionalExpression(
|
||||
t.binaryExpression(
|
||||
"===",
|
||||
t.identifier(tempValueRef),
|
||||
t.cloneNode(tempId),
|
||||
this.scope.buildUndefinedNode(),
|
||||
),
|
||||
pattern.right,
|
||||
t.identifier(tempValueRef),
|
||||
right,
|
||||
t.cloneNode(tempId),
|
||||
);
|
||||
|
||||
const left = pattern.left;
|
||||
if (t.isPattern(left)) {
|
||||
const tempValueDefault = t.expressionStatement(
|
||||
t.assignmentExpression(
|
||||
"=",
|
||||
t.identifier(tempValueRef),
|
||||
tempConditional,
|
||||
),
|
||||
);
|
||||
tempValueDefault._blockHoist = this.blockHoist;
|
||||
let patternId;
|
||||
let node;
|
||||
|
||||
this.nodes.push(tempValueDefault);
|
||||
this.push(left, t.identifier(tempValueRef));
|
||||
if (this.kind === "const") {
|
||||
patternId = this.scope.generateUidIdentifier(tempId.name);
|
||||
node = this.buildVariableDeclaration(patternId, tempConditional);
|
||||
} else {
|
||||
patternId = tempId;
|
||||
|
||||
node = t.expressionStatement(
|
||||
t.assignmentExpression("=", t.cloneNode(tempId), tempConditional),
|
||||
);
|
||||
}
|
||||
|
||||
this.nodes.push(node);
|
||||
this.push(left, patternId);
|
||||
} else {
|
||||
this.nodes.push(this.buildVariableAssignment(left, tempConditional));
|
||||
}
|
||||
|
||||
5
packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/const/exec.js
vendored
Normal file
5
packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/const/exec.js
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
const getState = () => ({});
|
||||
|
||||
const { data: { courses: oldCourses = [] } = {} } = getState();
|
||||
|
||||
assert.deepEqual(oldCourses, []);
|
||||
1
packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/const/input.js
vendored
Normal file
1
packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/const/input.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
const { data: { courses: oldCourses = [] } = {} } = getState();
|
||||
3
packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/const/options.json
vendored
Normal file
3
packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/const/options.json
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"plugins": ["transform-destructuring"]
|
||||
}
|
||||
5
packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/const/output.js
vendored
Normal file
5
packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/const/output.js
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
const _getState = getState(),
|
||||
_getState$data = _getState.data,
|
||||
_getState$data2 = _getState$data === void 0 ? {} : _getState$data,
|
||||
_getState$data2$cours = _getState$data2.courses,
|
||||
oldCourses = _getState$data2$cours === void 0 ? [] : _getState$data2$cours;
|
||||
Loading…
x
Reference in New Issue
Block a user