Assign another temp var when parsing assignment patterns in destructuring (#7333)

This commit is contained in:
Brian Ng 2018-03-09 02:39:25 -06:00 committed by Nicolò Ribaudo
parent 4da3f3bc64
commit 4f4dd3d4a6
5 changed files with 35 additions and 24 deletions

View File

@ -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));
}

View File

@ -0,0 +1,5 @@
const getState = () => ({});
const { data: { courses: oldCourses = [] } = {} } = getState();
assert.deepEqual(oldCourses, []);

View File

@ -0,0 +1 @@
const { data: { courses: oldCourses = [] } = {} } = getState();

View File

@ -0,0 +1,3 @@
{
"plugins": ["transform-destructuring"]
}

View 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;