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 isLocalReference = function (node, scope) {
var left = node.left;
var name = left.name;
return t.isIdentifier(left) && localExports[name] && localExports[name] === scope.get(name, true);
var name = node.name;
return t.isIdentifier(node) && localExports[name] && localExports[name] === scope.get(name, true);
};
traverse(this.file.ast, {
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);
}
}

View File

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

View File

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