* Fix destructured exports

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

* use export assignment template
This commit is contained in:
Josh Johnston 2017-06-28 07:31:47 +10:00 committed by Henry Zhu
parent 64eafad472
commit 3cf4cee40a
3 changed files with 82 additions and 11 deletions

View File

@ -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) {

View File

@ -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]
}

View File

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