From a03d491ac60d561d7539bbbb83e6daca818f56c8 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Mon, 15 Dec 2014 22:34:49 +1100 Subject: [PATCH] microoptimize module formatters, change method names to a new API, and add support for exporting multiple variable declarators - fixes #299 --- doc/modules.md | 4 +-- lib/6to5/transformation/modules/_default.js | 25 +++++++++++-------- lib/6to5/transformation/modules/amd.js | 6 ++--- lib/6to5/transformation/modules/common.js | 10 ++++---- lib/6to5/transformation/modules/ignore.js | 12 +++------ lib/6to5/transformation/modules/umd.js | 4 +-- .../exports-variable/actual.js | 1 + .../exports-variable/expected.js | 2 ++ .../exports-variable/actual.js | 1 + .../exports-variable/expected.js | 2 ++ .../exports-variable/actual.js | 1 + .../exports-variable/expected.js | 1 + .../exports-variable/actual.js | 1 + .../exports-variable/expected.js | 2 ++ 14 files changed, 40 insertions(+), 32 deletions(-) diff --git a/doc/modules.md b/doc/modules.md index 08dff4c8c4..f58c68416f 100644 --- a/doc/modules.md +++ b/doc/modules.md @@ -237,7 +237,7 @@ ModuleFormatter.prototype.transform = function (ast) { // feel free to modify this however }; -ModuleFormatter.prototype.import = function (node, nodes) { +ModuleFormatter.prototype.importDeclaration = function (node, nodes) { // node is an ImportDeclaration }; @@ -246,7 +246,7 @@ ModuleFormatter.prototype.importSpecifier = function (specifier, node, nodes) { // node is an ImportDeclaration }; -ModuleFormatter.prototype.export = function (node, nodes) { +ModuleFormatter.prototype.exportDeclaration = function (node, nodes) { // node is an ExportDeclaration }; diff --git a/lib/6to5/transformation/modules/_default.js b/lib/6to5/transformation/modules/_default.js index 7d3f06c345..2a2d3bbe02 100644 --- a/lib/6to5/transformation/modules/_default.js +++ b/lib/6to5/transformation/modules/_default.js @@ -3,15 +3,14 @@ module.exports = DefaultFormatter; var traverse = require("../../traverse"); var util = require("../../util"); var t = require("../../types"); -var _ = require("lodash"); function DefaultFormatter(file) { this.exports = []; this.file = file; var localExports = []; - _.each(file.ast.program.body, function (node) { - var declar = node.declaration; + traverse(file.ast, function (node) { + var declar = node && node.declaration; if (t.isExportDeclaration(node) && declar && t.isStatement(declar)) { localExports = localExports.concat(t.getIds(declar)); } @@ -29,7 +28,7 @@ DefaultFormatter.prototype.remapAssignments = function () { if (t.isAssignmentExpression(node)) { var left = node.left; - if (t.isIdentifier(left) && _.contains(localExports, left.name)) { + if (t.isIdentifier(left) && localExports.indexOf(left.name) >= 0) { return t.assignmentExpression( "=", left, @@ -119,7 +118,7 @@ DefaultFormatter.prototype._exportSpecifier = function (getRef, specifier, node, } }; -DefaultFormatter.prototype.export = function (node, nodes) { +DefaultFormatter.prototype.exportDeclaration = function (node, nodes) { var declar = node.declaration; if (node.default) { @@ -130,14 +129,18 @@ DefaultFormatter.prototype.export = function (node, nodes) { var assign; if (t.isVariableDeclaration(declar)) { - var decl = declar.declarations[0]; + for (var i in declar.declarations) { + var decl = declar.declarations[i]; - decl.init = util.template("exports-assign", { - VALUE: decl.init, - KEY: decl.id - }); + decl.init = util.template("exports-assign", { + VALUE: decl.init, + KEY: decl.id + }); - nodes.push(declar); + var newDeclar = t.variableDeclaration(declar.kind, [decl]); + if (i == 0) t.inherits(newDeclar, declar); + nodes.push(newDeclar); + } } else { assign = util.template("exports-assign", { VALUE: declar.id, diff --git a/lib/6to5/transformation/modules/amd.js b/lib/6to5/transformation/modules/amd.js index 60a18b4166..2aad3b9a12 100644 --- a/lib/6to5/transformation/modules/amd.js +++ b/lib/6to5/transformation/modules/amd.js @@ -23,9 +23,9 @@ AMDFormatter.prototype.transform = function (ast) { // build an array of module names var names = [t.literal("exports")]; - _.each(this.ids, function (id, name) { + for (var name in this.ids) { names.push(t.literal(name)); - }); + } names = t.arrayExpression(names); // build up define container @@ -68,7 +68,7 @@ AMDFormatter.prototype._push = function (node) { } }; -AMDFormatter.prototype.import = function (node) { +AMDFormatter.prototype.importDeclaration = function (node) { this._push(node); }; diff --git a/lib/6to5/transformation/modules/common.js b/lib/6to5/transformation/modules/common.js index 4b422d0794..2490c7df13 100644 --- a/lib/6to5/transformation/modules/common.js +++ b/lib/6to5/transformation/modules/common.js @@ -1,15 +1,15 @@ module.exports = CommonJSFormatter; var DefaultFormatter = require("./_default"); +var traverse = require("../../traverse"); var util = require("../../util"); var t = require("../../types"); -var _ = require("lodash"); function CommonJSFormatter(file) { DefaultFormatter.apply(this, arguments); var hasNonDefaultExports = false; - _.each(file.ast.program.body, function (node) { + traverse(file.ast, function (node) { if (t.isExportDeclaration(node) && !node.default) hasNonDefaultExports = true; }); this.hasNonDefaultExports = hasNonDefaultExports; @@ -48,7 +48,7 @@ CommonJSFormatter.prototype.importSpecifier = function (specifier, node, nodes) } }; -CommonJSFormatter.prototype.import = function (node, nodes) { +CommonJSFormatter.prototype.importDeclaration = function (node, nodes) { // import "foo"; nodes.push(util.template("require", { //inherits: node, @@ -57,7 +57,7 @@ CommonJSFormatter.prototype.import = function (node, nodes) { }, true)); }; -CommonJSFormatter.prototype.export = function (node, nodes) { +CommonJSFormatter.prototype.exportDeclaration = function (node, nodes) { if (node.default) { var declar = node.declaration; @@ -74,7 +74,7 @@ CommonJSFormatter.prototype.export = function (node, nodes) { // hoist to the top if this default is a function nodes.push(this._hoistExport(declar, assign)); } else { - DefaultFormatter.prototype.export.apply(this, arguments); + DefaultFormatter.prototype.exportDeclaration.apply(this, arguments); } }; diff --git a/lib/6to5/transformation/modules/ignore.js b/lib/6to5/transformation/modules/ignore.js index 28fbb4e026..3753440eed 100644 --- a/lib/6to5/transformation/modules/ignore.js +++ b/lib/6to5/transformation/modules/ignore.js @@ -6,19 +6,13 @@ function IgnoreFormatter() { } -IgnoreFormatter.prototype.import = function () { - -}; - -IgnoreFormatter.prototype.importSpecifier = function () { - -}; - -IgnoreFormatter.prototype.export = function (node, nodes) { +IgnoreFormatter.prototype.exportDeclaration = function (node, nodes) { var declar = t.toStatement(node.declaration, true); if (declar) nodes.push(t.inherits(declar, node)); }; +IgnoreFormatter.prototype.importDeclaration = +IgnoreFormatter.prototype.importSpecifier = IgnoreFormatter.prototype.exportSpecifier = function () { }; diff --git a/lib/6to5/transformation/modules/umd.js b/lib/6to5/transformation/modules/umd.js index 199de38024..e23c7c6fc2 100644 --- a/lib/6to5/transformation/modules/umd.js +++ b/lib/6to5/transformation/modules/umd.js @@ -18,9 +18,9 @@ UMDFormatter.prototype.transform = function (ast) { // build an array of module names var names = []; - _.each(this.ids, function (id, name) { + for (var name in this.ids) { names.push(t.literal(name)); - }); + } // factory diff --git a/test/fixtures/transformation/es6-modules-amd/exports-variable/actual.js b/test/fixtures/transformation/es6-modules-amd/exports-variable/actual.js index b4629cc731..c9cd5af09c 100644 --- a/test/fixtures/transformation/es6-modules-amd/exports-variable/actual.js +++ b/test/fixtures/transformation/es6-modules-amd/exports-variable/actual.js @@ -1,4 +1,5 @@ export var foo = 1; +export var foo = 1, bar = 2; export var foo2 = function () {}; export var foo3; export let foo4 = 2; diff --git a/test/fixtures/transformation/es6-modules-amd/exports-variable/expected.js b/test/fixtures/transformation/es6-modules-amd/exports-variable/expected.js index b959a86bd0..d01bae5920 100644 --- a/test/fixtures/transformation/es6-modules-amd/exports-variable/expected.js +++ b/test/fixtures/transformation/es6-modules-amd/exports-variable/expected.js @@ -3,6 +3,8 @@ define(["exports"], function (exports) { exports.foo7 = foo7; var foo = exports.foo = 1; + var foo = exports.foo = 1; + var bar = exports.bar = 2; var foo2 = exports.foo2 = function () {}; var foo3 = exports.foo3 = undefined; var foo4 = exports.foo4 = 2; diff --git a/test/fixtures/transformation/es6-modules-common/exports-variable/actual.js b/test/fixtures/transformation/es6-modules-common/exports-variable/actual.js index b4629cc731..c9cd5af09c 100644 --- a/test/fixtures/transformation/es6-modules-common/exports-variable/actual.js +++ b/test/fixtures/transformation/es6-modules-common/exports-variable/actual.js @@ -1,4 +1,5 @@ export var foo = 1; +export var foo = 1, bar = 2; export var foo2 = function () {}; export var foo3; export let foo4 = 2; diff --git a/test/fixtures/transformation/es6-modules-common/exports-variable/expected.js b/test/fixtures/transformation/es6-modules-common/exports-variable/expected.js index 42e6fdf913..2c13db0878 100644 --- a/test/fixtures/transformation/es6-modules-common/exports-variable/expected.js +++ b/test/fixtures/transformation/es6-modules-common/exports-variable/expected.js @@ -2,6 +2,8 @@ exports.foo7 = foo7; var foo = exports.foo = 1; +var foo = exports.foo = 1; +var bar = exports.bar = 2; var foo2 = exports.foo2 = function () {}; var foo3 = exports.foo3 = undefined; var foo4 = exports.foo4 = 2; diff --git a/test/fixtures/transformation/es6-modules-ignore/exports-variable/actual.js b/test/fixtures/transformation/es6-modules-ignore/exports-variable/actual.js index b4629cc731..c9cd5af09c 100644 --- a/test/fixtures/transformation/es6-modules-ignore/exports-variable/actual.js +++ b/test/fixtures/transformation/es6-modules-ignore/exports-variable/actual.js @@ -1,4 +1,5 @@ export var foo = 1; +export var foo = 1, bar = 2; export var foo2 = function () {}; export var foo3; export let foo4 = 2; diff --git a/test/fixtures/transformation/es6-modules-ignore/exports-variable/expected.js b/test/fixtures/transformation/es6-modules-ignore/exports-variable/expected.js index ecf4bd267a..854aad79f8 100644 --- a/test/fixtures/transformation/es6-modules-ignore/exports-variable/expected.js +++ b/test/fixtures/transformation/es6-modules-ignore/exports-variable/expected.js @@ -1,6 +1,7 @@ "use strict"; var foo = 1; +var foo = 1, bar = 2; var foo2 = function () {}; var foo3 = undefined; var foo4 = 2; diff --git a/test/fixtures/transformation/es6-modules-umd/exports-variable/actual.js b/test/fixtures/transformation/es6-modules-umd/exports-variable/actual.js index b4629cc731..c9cd5af09c 100644 --- a/test/fixtures/transformation/es6-modules-umd/exports-variable/actual.js +++ b/test/fixtures/transformation/es6-modules-umd/exports-variable/actual.js @@ -1,4 +1,5 @@ export var foo = 1; +export var foo = 1, bar = 2; export var foo2 = function () {}; export var foo3; export let foo4 = 2; diff --git a/test/fixtures/transformation/es6-modules-umd/exports-variable/expected.js b/test/fixtures/transformation/es6-modules-umd/exports-variable/expected.js index 989b8d476b..7cabcda1e3 100644 --- a/test/fixtures/transformation/es6-modules-umd/exports-variable/expected.js +++ b/test/fixtures/transformation/es6-modules-umd/exports-variable/expected.js @@ -9,6 +9,8 @@ exports.foo7 = foo7; var foo = exports.foo = 1; + var foo = exports.foo = 1; + var bar = exports.bar = 2; var foo2 = exports.foo2 = function () {}; var foo3 = exports.foo3 = undefined; var foo4 = exports.foo4 = 2;