remap UpdateExpression in module exports - closes #334

This commit is contained in:
Sebastian McKenzie 2014-12-28 01:00:53 +11:00
parent e6ac5eccd0
commit 601bbb86cd
15 changed files with 80 additions and 23 deletions

View File

@ -44,16 +44,42 @@ DefaultFormatter.prototype.remapAssignments = function () {
var self = this; var self = this;
var isLocalReference = function (node, scope) { var isLocalReference = function (node, scope) {
var left = node.left; var name = node.name;
var name = left.name; return t.isIdentifier(node) && localExports[name] && localExports[name] === scope.get(name, true);
return t.isIdentifier(left) && localExports[name] && localExports[name] === scope.get(name, true);
}; };
traverse(this.file.ast, { traverse(this.file.ast, {
enter: function (node, parent, scope) { enter: function (node, parent, scope) {
if (t.isExportDeclaration(node)) return false; if (t.isUpdateExpression(node) && isLocalReference(node.argument, scope)) {
this.stop();
if (t.isAssignmentExpression(node) && isLocalReference(node, scope)) { // expand to long file assignment expression
var assign = t.assignmentExpression(node.operator[0] + "=", node.argument, t.literal(1));
// remap this assignment expression
var remapped = self.remapExportAssignment(assign);
// we don't need to change the result
if (t.isExpressionStatement(parent) || node.prefix) {
return remapped;
}
var nodes = [];
nodes.push(remapped);
var operator;
if (node.operator === "--") {
operator = "+";
} else { // "++"
operator = "-";
}
nodes.push(t.binaryExpression(operator, node.argument, t.literal(1)));
return t.sequenceExpression(nodes);
}
if (t.isAssignmentExpression(node) && isLocalReference(node.left, scope)) {
this.stop();
return self.remapExportAssignment(node); return self.remapExportAssignment(node);
} }
} }

View File

@ -6,7 +6,7 @@ var t = require("../../types");
var _ = require("lodash"); var _ = require("lodash");
function AMDFormatter(file) { function AMDFormatter(file) {
this.file = file; DefaultFormatter.apply(this, arguments);
this.ids = {}; this.ids = {};
} }

View File

@ -7,10 +7,11 @@ var t = require("../../types");
var _ = require("lodash"); var _ = require("lodash");
function SystemFormatter(file) { function SystemFormatter(file) {
this.exportIdentifier = file.generateUidIdentifier("export");
AMDFormatter.apply(this, arguments); AMDFormatter.apply(this, arguments);
this.moduleNameLiteral = t.literal(this.getModuleName()); this.moduleNameLiteral = t.literal(this.getModuleName());
this.exportIdentifier = file.generateUidIdentifier("export");
} }
util.inherits(SystemFormatter, AMDFormatter); util.inherits(SystemFormatter, AMDFormatter);

View File

@ -50,17 +50,25 @@ function traverse(parent, opts, scope) {
} }
}; };
var stop = false;
var context = {
stop: function () {
stop = true;
}
};
// //
var ourScope = scope; var ourScope = scope;
if (t.isScope(node)) ourScope = new Scope(node, scope); if (t.isScope(node)) ourScope = new Scope(node, scope);
// enter // enter
if (opts.enter) { if (opts.enter) {
var result = opts.enter(node, parent, ourScope); var result = opts.enter.call(context, node, parent, ourScope);
maybeReplace(result); maybeReplace(result);
// stop iteration // stop iteration
if (result === false) return; if (stop || result === false) return;
} }
// traverse node // traverse node
@ -68,7 +76,7 @@ function traverse(parent, opts, scope) {
// exit // exit
if (opts.exit) { if (opts.exit) {
maybeReplace(opts.exit(node, parent, ourScope)); maybeReplace(opts.exit.call(context, node, parent, ourScope));
} }
}; };
@ -89,7 +97,6 @@ traverse.removeProperties = function (tree) {
delete node._declarations; delete node._declarations;
delete node.extendedRange; delete node.extendedRange;
delete node._scopeInfo; delete node._scopeInfo;
delete node._scope;
delete node.tokens; delete node.tokens;
delete node.range; delete node.range;
delete node.start; delete node.start;

View File

@ -240,14 +240,17 @@ t.getIds = function (node, map, ignoreTypes) {
if (_.contains(ignoreTypes, id.type)) continue; if (_.contains(ignoreTypes, id.type)) continue;
var nodeKey = t.getIds.nodes[id.type]; var nodeKey = t.getIds.nodes[id.type];
var arrKey = t.getIds.arrays[id.type]; var arrKeys = t.getIds.arrays[id.type];
if (t.isIdentifier(id)) { if (t.isIdentifier(id)) {
ids[id.name] = id; ids[id.name] = id;
} else if (nodeKey) { } else if (nodeKey) {
if (id[nodeKey]) search.push(id[nodeKey]); if (id[nodeKey]) search.push(id[nodeKey]);
} else if (arrKey) { } else if (arrKeys) {
search = search.concat(id[arrKey] || []); for (var i in arrKeys) {
var key = arrKeys[i];
search = search.concat(id[key] || []);
}
} }
} }
@ -268,11 +271,11 @@ t.getIds.nodes = {
}; };
t.getIds.arrays = { t.getIds.arrays = {
ExportDeclaration: "specifiers", ExportDeclaration: ["specifiers", "declaration"],
ImportDeclaration: "specifiers", ImportDeclaration: ["specifiers"],
VariableDeclaration: "declarations", VariableDeclaration: ["declarations"],
ArrayPattern: "elements", ArrayPattern: ["elements"],
ObjectPattern: "properties" ObjectPattern: ["properties"]
}; };
t.isLet = function (node) { t.isLet = function (node) {

View File

@ -1,7 +1,9 @@
export var test = 2; export var test = 2;
test = 5; test = 5;
test++;
(function () { (function () {
var test = 2; var test = 2;
test = 3; test = 3;
test++;
})(); })();

View File

@ -2,10 +2,12 @@ define(["exports"], function (exports) {
"use strict"; "use strict";
var test = exports.test = 2; var test = exports.test = 2;
test = 5; test = exports.test = 5;
test = exports.test += 1;
(function () { (function () {
var test = 2; var test = 2;
test = 3; test = 3;
test++;
})(); })();
}); });

View File

@ -1,7 +1,9 @@
export var test = 2; export var test = 2;
test = 5; test = 5;
test++;
(function () { (function () {
var test = 2; var test = 2;
test = 3; test = 3;
test++;
})(); })();

View File

@ -2,8 +2,10 @@
var test = exports.test = 2; var test = exports.test = 2;
test = exports.test = 5; test = exports.test = 5;
test = exports.test += 1;
(function () { (function () {
var test = 2; var test = 2;
test = 3; test = 3;
test++;
})(); })();

View File

@ -1,7 +1,9 @@
export var test = 2; export var test = 2;
test = 5; test = 5;
test++;
(function () { (function () {
var test = 2; var test = 2;
test = 3; test = 3;
test++;
})(); })();

View File

@ -2,8 +2,10 @@
var test = 2; var test = 2;
test = 5; test = 5;
test++;
(function () { (function () {
var test = 2; var test = 2;
test = 3; test = 3;
test++;
})(); })();

View File

@ -1,7 +1,9 @@
export var test = 2; export var test = 2;
test = 5; test = 5;
test++;
(function () { (function () {
var test = 2; var test = 2;
test = 3; test = 3;
test++;
})(); })();

View File

@ -5,12 +5,14 @@ System.register("es6-modules-system/remap/expected", [], function (_export) {
"use strict"; "use strict";
var test = _export("test", 2); var test = _export("test", 2);
test = 5; _export("test", test = 5);
_export("test", test += 1);
(function () { (function () {
var test = 2; var test = 2;
test = 3; test = 3;
test++;
})(); })();
} }
}; };
}); });

View File

@ -1,7 +1,9 @@
export var test = 2; export var test = 2;
test = 5; test = 5;
test++;
(function () { (function () {
var test = 2; var test = 2;
test = 3; test = 3;
test++;
})(); })();

View File

@ -8,10 +8,12 @@
"use strict"; "use strict";
var test = exports.test = 2; var test = exports.test = 2;
test = 5; test = exports.test = 5;
test = exports.test += 1;
(function () { (function () {
var test = 2; var test = 2;
test = 3; test = 3;
test++;
})(); })();
}); });