add default live bindings to common module formatter

This commit is contained in:
Sebastian McKenzie
2015-04-04 01:56:58 +11:00
parent 5f91ee8a1a
commit b7a08100a6
13 changed files with 102 additions and 80 deletions

View File

@@ -61,7 +61,6 @@ var importsVisitor = {
enter(node, parent, scope, formatter) {
formatter.hasLocalImports = true;
extend(formatter.localImports, this.getBindingIdentifiers());
formatter.bumpImportOccurences(node);
}
}
};
@@ -69,7 +68,7 @@ var importsVisitor = {
var exportsVisitor = traverse.explode({
ExportDeclaration: {
enter(node, parent, scope, formatter) {
formatter.hasLocalImports = true;
formatter.hasLocalExports = true;
var declar = this.get("declaration");
if (declar.isStatement()) {
@@ -96,10 +95,6 @@ var exportsVisitor = traverse.explode({
formatter.hasNonDefaultExports = true;
}
}
if (node.source) {
formatter.bumpImportOccurences(node);
}
}
}
});
@@ -117,7 +112,6 @@ export default class DefaultFormatter {
this.hasLocalExports = false;
this.hasLocalImports = false;
this.localImportOccurences = object();
this.localExports = object();
this.localImports = object();
@@ -133,15 +127,6 @@ export default class DefaultFormatter {
return (t.isExportDefaultDeclaration(node) || t.isSpecifierDefault(node)) && !this.noInteropRequireExport && !this.hasNonDefaultExports;
}
bumpImportOccurences(node) {
var source = node.source.value;
var occurs = this.localImportOccurences;
occurs[source] ||= 0;
if (node.specifiers) {
occurs[source] += node.specifiers.length;
}
}
getLocalExports() {
this.file.path.traverse(exportsVisitor, this);
}
@@ -151,7 +136,7 @@ export default class DefaultFormatter {
}
remapAssignments() {
if (this.hasLocalImports) {
if (this.hasLocalExports || this.hasLocalImports) {
this.file.path.traverse(remapVisitor, this);
}
}

View File

@@ -6,7 +6,9 @@ import * as util from "../../util";
import * as t from "../../types";
export default class AMDFormatter extends DefaultFormatter {
init = CommonFormatter.prototype.init;
init() {
CommonFormatter.prototype._init.call(this, this.hasNonDefaultExports);
}
buildDependencyLiterals() {
var names = [];
@@ -100,15 +102,34 @@ export default class AMDFormatter extends DefaultFormatter {
this.internalRemap[specifier.local.name] = ref;
}
exportSpecifier() {
CommonFormatter.prototype.exportSpecifier.apply(this, arguments);
exportSpecifier(specifier, node, nodes) {
if (this.doDefaultExportInterop(specifier)) {
nodes.push(util.template("exports-default-assign", {
VALUE: specifier.local
}, true));
} else {
CommonFormatter.prototype.exportSpecifier.apply(this, arguments);
}
}
exportDeclaration(node) {
exportDeclaration(node, nodes) {
if (this.doDefaultExportInterop(node)) {
this.passModuleArg = true;
var declar = node.declaration;
var assign = util.template("exports-default-assign", {
VALUE: this._pushStatement(declar, nodes)
}, true);
if (t.isFunctionDeclaration(declar)) {
// we can hoist this assignment to the top of the file
assign._blockHoist = 3;
}
nodes.push(assign);
return;
}
CommonFormatter.prototype.exportDeclaration.apply(this, arguments);
DefaultFormatter.prototype.exportDeclaration.apply(this, arguments);
}
}

View File

@@ -5,13 +5,17 @@ import * as t from "../../types";
export default class CommonJSFormatter extends DefaultFormatter {
init() {
this._init(this.hasLocalExports);
}
_init(conditional) {
var file = this.file;
var scope = file.scope;
scope.rename("module");
scope.rename("exports");
if (!this.noInteropRequireImport && this.hasNonDefaultExports) {
if (!this.noInteropRequireImport && conditional) {
var templateName = "exports-module-declaration";
if (this.file.isLoose("es6.modules")) templateName += "-loose";
var declar = util.template(templateName, true);
@@ -20,6 +24,20 @@ export default class CommonJSFormatter extends DefaultFormatter {
}
}
transform(program) {
DefaultFormatter.prototype.transform.apply(this, arguments);
if (this.hasDefaultOnlyExport) {
program.body.push(
t.expressionStatement(t.assignmentExpression(
"=",
t.memberExpression(t.identifier("module"), t.identifier("exports")),
t.memberExpression(t.identifier("exports"), t.identifier("default"))
))
);
}
}
importSpecifier(specifier, node, nodes) {
var variableName = specifier.local;
@@ -31,11 +49,15 @@ export default class CommonJSFormatter extends DefaultFormatter {
this.internalRemap[variableName.name] = ref;
} else {
if (this.noInteropRequireImport) {
this.internalRemap[variableName.name] = t.memberExpression(ref, t.identifier("default"))
this.internalRemap[variableName.name] = t.memberExpression(ref, t.identifier("default"));
} else if (!includes(this.file.dynamicImported, node)) {
var uid = this.scope.generateUidBasedOnNode(node, "import");
nodes.push(t.variableDeclaration("var", [
t.variableDeclarator(variableName, t.callExpression(this.file.addHelper("interop-require"), [ref]))
t.variableDeclarator(uid, t.callExpression(this.file.addHelper("interop-require-wildcard"), [ref]))
]));
this.internalRemap[variableName.name] = t.memberExpression(uid, t.identifier("default"));
}
}
} else {
@@ -64,29 +86,15 @@ export default class CommonJSFormatter extends DefaultFormatter {
exportSpecifier(specifier, node, nodes) {
if (this.doDefaultExportInterop(specifier)) {
nodes.push(util.template("exports-default-assign", {
VALUE: specifier.local
}, true));
return;
} else {
DefaultFormatter.prototype.exportSpecifier.apply(this, arguments);
this.hasDefaultOnlyExport = true;
}
DefaultFormatter.prototype.exportSpecifier.apply(this, arguments);
}
exportDeclaration(node, nodes) {
if (this.doDefaultExportInterop(node)) {
var declar = node.declaration;
var assign = util.template("exports-default-assign", {
VALUE: this._pushStatement(declar, nodes)
}, true);
if (t.isFunctionDeclaration(declar)) {
// we can hoist this assignment to the top of the file
assign._blockHoist = 3;
}
nodes.push(assign);
return;
this.hasDefaultOnlyExport = true;
}
DefaultFormatter.prototype.exportDeclaration.apply(this, arguments);