Skip to content

Commit

Permalink
Assign another temp var when parsing assignment patterns in destructu…
Browse files Browse the repository at this point in the history
…ring (babel#7333)
  • Loading branch information
existentialism authored and nicolo-ribaudo committed Mar 9, 2018
1 parent 4da3f3b commit 4f4dd3d
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 24 deletions.
45 changes: 21 additions & 24 deletions packages/babel-plugin-transform-destructuring/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;

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(tempValueDefault);
this.push(left, t.identifier(tempValueRef));
this.nodes.push(node);
this.push(left, patternId);
} else {
this.nodes.push(this.buildVariableAssignment(left, tempConditional));
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
const getState = () => ({});

const { data: { courses: oldCourses = [] } = {} } = getState();

assert.deepEqual(oldCourses, []);
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
const { data: { courses: oldCourses = [] } = {} } = getState();
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"plugins": ["transform-destructuring"]
}
Original file line number Diff line number Diff line change
@@ -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;

0 comments on commit 4f4dd3d

Please sign in to comment.