From 01a2aa7dd188f9a6701cbe743c87a36043f1c2a9 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Thu, 2 Apr 2015 20:25:05 +1100 Subject: [PATCH] support multiple export specifier remapping --- src/babel/transformation/modules/_default.js | 44 ++++++++++--------- src/babel/transformation/modules/system.js | 8 +++- .../es6.modules-amd/remap/actual.js | 4 ++ .../es6.modules-amd/remap/expected.js | 16 ++++--- .../es6.modules-common/remap/actual.js | 4 ++ .../es6.modules-common/remap/expected.js | 14 ++++-- .../es6.modules-system/remap/actual.js | 4 ++ .../es6.modules-system/remap/expected.js | 12 ++++- .../es6.modules-umd/remap/actual.js | 4 ++ .../es6.modules-umd/remap/expected.js | 16 ++++--- 10 files changed, 89 insertions(+), 37 deletions(-) diff --git a/src/babel/transformation/modules/_default.js b/src/babel/transformation/modules/_default.js index 129b83689e..592890887c 100644 --- a/src/babel/transformation/modules/_default.js +++ b/src/babel/transformation/modules/_default.js @@ -15,7 +15,7 @@ var remapVisitor = { } if (t.isUpdateExpression(node)) { - var exported = formatter.getLocalReference(node.argument, scope); + var exported = formatter.getExport(node.argument, scope); if (exported) { this.skip(); @@ -47,7 +47,7 @@ var remapVisitor = { } if (t.isAssignmentExpression(node)) { - var exported = formatter.getLocalReference(node.left, scope); + var exported = formatter.getExport(node.left, scope); if (exported) { this.skip(); return formatter.remapExportAssignment(node, exported); @@ -76,10 +76,7 @@ var exportsVisitor = traverse.explode({ var bindings = declar.getBindingIdentifiers() for (var name in bindings) { var binding = bindings[name]; - formatter.localExports[name] = { - binding: binding, - exported: binding - }; + formatter._addExport(name, binding); } } @@ -89,10 +86,7 @@ var exportsVisitor = traverse.explode({ var local = specifier.local; if (!local) continue; - formatter.localExports[local.name] = { - binding: scope.getBindingIdentifier(local.name), - exported: specifier.exported - }; + formatter._addExport(local.name, specifier.exported); } } @@ -164,18 +158,28 @@ export default class DefaultFormatter { } remapExportAssignment(node, exported) { - return t.assignmentExpression( - "=", - node.left, - t.assignmentExpression( - node.operator, - t.memberExpression(t.identifier("exports"), exported), - node.right - ) - ); + var assign = node; + + for (var i = 0; i < exported.length; i++) { + assign = t.assignmentExpression( + "=", + t.memberExpression(t.identifier("exports"), exported[i]), + assign + ); + } + + return assign; } - getLocalReference(node, scope) { + _addExport(name, exported) { + var info = this.localExports[name] ||= { + binding: this.scope.getBindingIdentifier(name), + exported: [] + }; + info.exported.push(exported); + } + + getExport(node, scope) { if (!t.isIdentifier(node)) return; var local = this.localExports[node.name]; diff --git a/src/babel/transformation/modules/system.js b/src/babel/transformation/modules/system.js index e131179829..40f9183059 100644 --- a/src/babel/transformation/modules/system.js +++ b/src/babel/transformation/modules/system.js @@ -126,7 +126,13 @@ export default class SystemFormatter extends AMDFormatter { } remapExportAssignment(node, exported) { - return this.buildExportCall(t.literal(exported.name), node); + var assign = node; + + for (var i = 0; i < exported.length; i++) { + assign = this.buildExportCall(t.literal(exported[i].name), assign); + } + + return assign; } buildExportCall(id, init, isStatement) { diff --git a/test/core/fixtures/transformation/es6.modules-amd/remap/actual.js b/test/core/fixtures/transformation/es6.modules-amd/remap/actual.js index 74b17b7a7e..f5cf475bec 100644 --- a/test/core/fixtures/transformation/es6.modules-amd/remap/actual.js +++ b/test/core/fixtures/transformation/es6.modules-amd/remap/actual.js @@ -15,3 +15,7 @@ a = 3; var b = 2; export { b as c }; b = 3; + +var d = 3; +export { d as e, d as f }; +d = 4; diff --git a/test/core/fixtures/transformation/es6.modules-amd/remap/expected.js b/test/core/fixtures/transformation/es6.modules-amd/remap/expected.js index 96bbf0c7b1..db82ca4b88 100644 --- a/test/core/fixtures/transformation/es6.modules-amd/remap/expected.js +++ b/test/core/fixtures/transformation/es6.modules-amd/remap/expected.js @@ -6,8 +6,8 @@ define(["exports"], function (exports) { }); var test = 2; exports.test = test; - test = exports.test = 5; - test = exports.test += 1; + exports.test = test = 5; + exports.test = test += 1; (function () { var test = 2; @@ -18,10 +18,16 @@ define(["exports"], function (exports) { var a = 2; exports.a = a; - a = exports.a = 3; + exports.a = a = 3; var b = 2; exports.c = b; - b = exports.c = 3; -}); \ No newline at end of file + exports.c = b = 3; + + var d = 3; + exports.e = d; + exports.f = d; + + exports.f = exports.e = d = 4; +}); diff --git a/test/core/fixtures/transformation/es6.modules-common/remap/actual.js b/test/core/fixtures/transformation/es6.modules-common/remap/actual.js index 74b17b7a7e..f5cf475bec 100644 --- a/test/core/fixtures/transformation/es6.modules-common/remap/actual.js +++ b/test/core/fixtures/transformation/es6.modules-common/remap/actual.js @@ -15,3 +15,7 @@ a = 3; var b = 2; export { b as c }; b = 3; + +var d = 3; +export { d as e, d as f }; +d = 4; diff --git a/test/core/fixtures/transformation/es6.modules-common/remap/expected.js b/test/core/fixtures/transformation/es6.modules-common/remap/expected.js index b5951b9748..ca1e4a1d2d 100644 --- a/test/core/fixtures/transformation/es6.modules-common/remap/expected.js +++ b/test/core/fixtures/transformation/es6.modules-common/remap/expected.js @@ -5,8 +5,8 @@ Object.defineProperty(exports, "__esModule", { }); var test = 2; exports.test = test; -test = exports.test = 5; -test = exports.test += 1; +exports.test = test = 5; +exports.test = test += 1; (function () { var test = 2; @@ -17,9 +17,15 @@ test = exports.test += 1; var a = 2; exports.a = a; -a = exports.a = 3; +exports.a = a = 3; var b = 2; exports.c = b; -b = exports.c = 3; +exports.c = b = 3; + +var d = 3; +exports.e = d; +exports.f = d; + +exports.f = exports.e = d = 4; diff --git a/test/core/fixtures/transformation/es6.modules-system/remap/actual.js b/test/core/fixtures/transformation/es6.modules-system/remap/actual.js index 74b17b7a7e..f5cf475bec 100644 --- a/test/core/fixtures/transformation/es6.modules-system/remap/actual.js +++ b/test/core/fixtures/transformation/es6.modules-system/remap/actual.js @@ -15,3 +15,7 @@ a = 3; var b = 2; export { b as c }; b = 3; + +var d = 3; +export { d as e, d as f }; +d = 4; diff --git a/test/core/fixtures/transformation/es6.modules-system/remap/expected.js b/test/core/fixtures/transformation/es6.modules-system/remap/expected.js index aeffdeb9e6..88cea183e8 100644 --- a/test/core/fixtures/transformation/es6.modules-system/remap/expected.js +++ b/test/core/fixtures/transformation/es6.modules-system/remap/expected.js @@ -1,5 +1,5 @@ System.register([], function (_export) { - var test, a, b; + var test, a, b, d; return { setters: [], execute: function () { @@ -29,6 +29,14 @@ System.register([], function (_export) { _export("c", b); _export("c", b = 3); + + d = 3; + + _export("e", d); + + _export("f", d); + + _export("f", _export("e", d = 4)); } }; -}); \ No newline at end of file +}); diff --git a/test/core/fixtures/transformation/es6.modules-umd/remap/actual.js b/test/core/fixtures/transformation/es6.modules-umd/remap/actual.js index 74b17b7a7e..f5cf475bec 100644 --- a/test/core/fixtures/transformation/es6.modules-umd/remap/actual.js +++ b/test/core/fixtures/transformation/es6.modules-umd/remap/actual.js @@ -15,3 +15,7 @@ a = 3; var b = 2; export { b as c }; b = 3; + +var d = 3; +export { d as e, d as f }; +d = 4; diff --git a/test/core/fixtures/transformation/es6.modules-umd/remap/expected.js b/test/core/fixtures/transformation/es6.modules-umd/remap/expected.js index 62072d9d04..6fcb566b85 100644 --- a/test/core/fixtures/transformation/es6.modules-umd/remap/expected.js +++ b/test/core/fixtures/transformation/es6.modules-umd/remap/expected.js @@ -18,8 +18,8 @@ }); var test = 2; exports.test = test; - test = exports.test = 5; - test = exports.test += 1; + exports.test = test = 5; + exports.test = test += 1; (function () { var test = 2; @@ -30,10 +30,16 @@ var a = 2; exports.a = a; - a = exports.a = 3; + exports.a = a = 3; var b = 2; exports.c = b; - b = exports.c = 3; -}); \ No newline at end of file + exports.c = b = 3; + + var d = 3; + exports.e = d; + exports.f = d; + + exports.f = exports.e = d = 4; +});