Skip to content

Commit

Permalink
Fix 5768 (#5811)
Browse files Browse the repository at this point in the history
* Fix destructured exports

- adds a failing test based on description in #5768
- handles ObjectPattern and ArrayPattern

* use export assignment template
  • Loading branch information
joshwnj authored and hzoo committed Jun 27, 2017
1 parent 64eafad commit 3cf4cee
Show file tree
Hide file tree
Showing 3 changed files with 82 additions and 11 deletions.
Expand Up @@ -75,23 +75,53 @@ export default function () {
if (node[REASSIGN_REMAP_SKIP]) return;

const left = path.get("left");
if (!left.isIdentifier()) return;
if (left.isIdentifier()) {
const name = left.node.name;
const exports = this.exports[name];
if (!exports) return;

const name = left.node.name;
const exports = this.exports[name];
if (!exports) return;
// redeclared in this scope
if (this.scope.getBinding(name) !== path.scope.getBinding(name)) return;

// redeclared in this scope
if (this.scope.getBinding(name) !== path.scope.getBinding(name)) return;
node[REASSIGN_REMAP_SKIP] = true;

node[REASSIGN_REMAP_SKIP] = true;
for (const reid of exports) {
node = buildExportsAssignment(reid, node).expression;
}

for (const reid of exports) {
node = buildExportsAssignment(reid, node).expression;
path.replaceWith(node);
this.requeueInParent(path);
}
else if (left.isObjectPattern()) {
for (const property of left.node.properties) {
const name = property.value.name;

path.replaceWith(node);
this.requeueInParent(path);
const exports = this.exports[name];
if (!exports) continue;

// redeclared in this scope
if (this.scope.getBinding(name) !== path.scope.getBinding(name)) return;

node[REASSIGN_REMAP_SKIP] = true;

path.insertAfter(buildExportsAssignment(t.identifier(name), t.identifier(name)));
}
}
else if (left.isArrayPattern()) {
for (const element of left.node.elements) {
const name = element.name;

const exports = this.exports[name];
if (!exports) continue;

// redeclared in this scope
if (this.scope.getBinding(name) !== path.scope.getBinding(name)) return;

node[REASSIGN_REMAP_SKIP] = true;

path.insertAfter(buildExportsAssignment(t.identifier(name), t.identifier(name)));
}
}
},

UpdateExpression(path) {
Expand Down
@@ -0,0 +1,14 @@
export let x = 0;
export let y = 0;

export function f1 () {
({x} = { x: 1 });
}

export function f2 () {
({x, y} = { x: 2, y: 3 });
}

export function f3 () {
[x, y, z] = [3, 4, 5]
}
@@ -0,0 +1,27 @@
"use strict";

Object.defineProperty(exports, "__esModule", {
value: true
});
exports.f1 = f1;
exports.f2 = f2;
exports.f3 = f3;
let x = exports.x = 0;
let y = exports.y = 0;

function f1() {
({ x } = { x: 1 });
exports.x = x;
}

function f2() {
({ x, y } = { x: 2, y: 3 });
exports.y = y;
exports.x = x;
}

function f3() {
[x, y, z] = [3, 4, 5];
exports.y = y;
exports.x = x;
}

0 comments on commit 3cf4cee

Please sign in to comment.