From 198a9c6eadeb221a7276e323568a053091cab010 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Sat, 27 Dec 2014 16:59:57 +1100 Subject: [PATCH] nicer local exports remapping in default module formatter --- lib/6to5/transformation/modules/_default.js | 57 ++++++++++++--------- 1 file changed, 34 insertions(+), 23 deletions(-) diff --git a/lib/6to5/transformation/modules/_default.js b/lib/6to5/transformation/modules/_default.js index 924ab1cb15..927a03cd7b 100644 --- a/lib/6to5/transformation/modules/_default.js +++ b/lib/6to5/transformation/modules/_default.js @@ -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 + ) + ); + } } } });