Fix 5768 (#5811)
* 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:
parent
64eafad472
commit
3cf4cee40a
@ -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) {
|
||||
|
||||
@ -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;
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user