nicer local exports remapping in default module formatter

This commit is contained in:
Sebastian McKenzie
2014-12-27 16:59:57 +11:00
parent 9c92679053
commit 198a9c6ead

View File

@@ -3,41 +3,52 @@ 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 = [];
traverse(file.ast, function (node) {
var declar = node && node.declaration;
if (t.isExportDeclaration(node) && declar && t.isStatement(declar)) {
localExports = localExports.concat(t.getIds(declar));
}
});
this.localExports = localExports;
this.localExports = this.getLocalExports();
this.remapAssignments();
}
DefaultFormatter.prototype.getLocalExports = function () {
var localExports = {};
traverse(this.file.ast, {
enter: function (node) {
var declar = node && node.declaration;
if (t.isExportDeclaration(node) && declar && t.isStatement(declar)) {
_.extend(localExports, t.getIds(declar, true));
}
}
});
return localExports;
};
DefaultFormatter.prototype.remapAssignments = function () {
var localExports = this.localExports;
traverse(this.file.ast, function (node) {
if (t.isExportDeclaration(node)) return false;
traverse(this.file.ast, {
enter: function (node, parent, scope) {
if (t.isExportDeclaration(node)) return false;
if (t.isAssignmentExpression(node)) {
var left = node.left;
if (t.isIdentifier(left) && localExports.indexOf(left.name) >= 0) {
return t.assignmentExpression(
"=",
left,
t.assignmentExpression(
node.operator,
t.memberExpression(t.identifier("exports"), left),
node.right
)
);
if (t.isAssignmentExpression(node)) {
var left = node.left;
var name = left.name;
if (t.isIdentifier(left) && localExports[name] && localExports[name] === scope.get(name, true)) {
return t.assignmentExpression(
"=",
left,
t.assignmentExpression(
node.operator,
t.memberExpression(t.identifier("exports"), left),
node.right
)
);
}
}
}
});