more internal rearchitecturing

This commit is contained in:
Sebastian McKenzie
2015-02-05 14:05:15 +11:00
parent 2b75c67448
commit f365cc1248
29 changed files with 139 additions and 135 deletions

View File

@@ -1,8 +1,8 @@
"use strict";
var transform = module.exports = require("./transformation");
var transform = module.exports = require("../transformation");
transform.version = require("../../package").version;
transform.version = require("../../../package").version;
transform.transform = transform;

View File

@@ -1,24 +1,24 @@
"use strict";
var transform = require("./transformation");
var util = require("./util");
var fs = require("fs");
var isFunction = require("lodash/lang/isFunction");
var transform = require("../transformation");
var util = require("../util");
var fs = require("fs");
exports.version = require("../../package").version;
exports.version = require("../../../package").version;
exports.runtime = require("./build-runtime");
exports.runtime = require("../build-runtime");
exports.types = require("./types");
exports.types = require("../types");
exports.register = function (opts) {
var register = require("./register");
var register = require("./register/node");
if (opts != null) register(opts);
return register;
};
exports.polyfill = function () {
require("./polyfill");
require("../polyfill");
};
exports.canCompile = util.canCompile;

View File

@@ -4,4 +4,4 @@
module.exports = function () {};
require("./polyfill");
require("../../polyfill");

View File

@@ -1,14 +1,14 @@
"use strict";
require("./polyfill");
require("../../polyfill");
var sourceMapSupport = require("source-map-support");
var registerCache = require("./register-cache");
var util = require("./util");
var to5 = require("./index");
var fs = require("fs");
var registerCache = require("./cache");
var extend = require("lodash/object/extend");
var each = require("lodash/collection/each");
var util = require("../../util");
var to5 = require("../node");
var fs = require("fs");
sourceMapSupport.install({
retrieveSourceMap: function (source) {

View File

@@ -1,4 +1,4 @@
var File = require("./file");
var File = require("./transformation/file");
var util = require("./util");
var each = require("lodash/collection/each");
var t = require("./types");

View File

@@ -1,7 +1,7 @@
module.exports = detect;
var SYNTAX_KEYS = require("./syntax-keys");
var traverse = require("../traverse");
var traverse = require("../traversal");
var visitors = traverse.explode(require("./visitors"));
function detect(ast) {

View File

@@ -0,0 +1,9 @@
var t = require("../types");
module.exports = function (ast, comments, tokens) {
if (ast && ast.type === "Program") {
return t.file(ast, comments || [], tokens || []);
} else {
throw new Error("Not a valid ast?");
}
};

49
lib/6to5/helpers/parse.js Normal file
View File

@@ -0,0 +1,49 @@
var normalizeAst = require("./normalize-ast");
var estraverse = require("estraverse");
var codeFrame = require("./code-frame");
var acorn = require("acorn-6to5");
module.exports = function (opts, code, callback) {
try {
var comments = [];
var tokens = [];
var ast = acorn.parse(code, {
allowImportExportEverywhere: opts.allowImportExportEverywhere,
allowReturnOutsideFunction: !opts._anal,
ecmaVersion: opts.experimental ? 7 : 6,
playground: opts.playground,
strictMode: opts.strictMode,
onComment: comments,
locations: true,
onToken: tokens,
ranges: true
});
estraverse.attachComments(ast, comments, tokens);
ast = normalizeAst(ast, comments, tokens);
if (callback) {
return callback(ast);
} else {
return ast;
}
} catch (err) {
if (!err._6to5) {
err._6to5 = true;
var message = opts.filename + ": " + err.message;
var loc = err.loc;
if (loc) {
var frame = codeFrame(code, loc.line, loc.column + 1);
message += frame;
}
if (err.stack) err.stack = err.stack.replace(err.message, message);
err.message = message;
}
throw err;
}
};

View File

@@ -1,7 +1,7 @@
"use strict";
var t = require("./types");
var extend = require("lodash/object/extend");
var t = require("./types");
require("./types/node");

View File

@@ -5,16 +5,17 @@ module.exports = File;
var SHEBANG_REGEX = /^\#\!.*/;
var isFunction = require("lodash/lang/isFunction");
var transform = require("./transformation");
var generate = require("./generation");
var transform = require("./index");
var generate = require("../generation");
var defaults = require("lodash/object/defaults");
var contains = require("lodash/collection/contains");
var clone = require("./helpers/clone");
var Scope = require("./traverse/scope");
var util = require("./util");
var clone = require("../helpers/clone");
var parse = require("../helpers/parse");
var Scope = require("../traversal/scope");
var util = require("../util");
var path = require("path");
var each = require("lodash/collection/each");
var t = require("./types");
var t = require("../types");
function File(opts) {
this.dynamicImportIds = {};
@@ -334,7 +335,7 @@ File.prototype.parse = function (code) {
opts.allowImportExportEverywhere = this.isLoose("es6.modules");
//opts.strictMode = this.transformers.useStrict.canRun();
return util.parse(opts, code, function (tree) {
return parse(opts, code, function (tree) {
self.transform(tree);
return self.generate();
});
@@ -373,25 +374,25 @@ File.prototype.transform = function (ast) {
var checkTransformerVisitor = {
enter: function (node, parent, scope, context, state) {
state.check(node, scope);
checkNode(state.stack, node, scope);
}
};
var checkNode = function (stack, node, scope) {
each(stack, function (pass) {
if (pass.shouldRun) return;
pass.checkNode(node, scope);
});
};
File.prototype.checkNode = function (node, scope) {
var self = this;
var stack = this.transformerStack;
scope = scope || this.scope;
var check = function (node, scope) {
each(self.transformerStack, function (pass) {
if (pass.shouldRun) return;
pass.checkNode(node, scope);
});
};
check(node, scope);
checkNode(stack, node, scope);
scope.traverse(node, checkTransformerVisitor, {
check: check
stack: stack
});
};

View File

@@ -1,5 +1,5 @@
var cloneDeep = require("lodash/lang/cloneDeep");
var traverse = require("../../traverse");
var traverse = require("../../traversal");
var clone = require("lodash/lang/clone");
var each = require("lodash/collection/each");
var has = require("lodash/object/has");

View File

@@ -2,11 +2,12 @@
module.exports = transform;
var Transformer = require("./transformer");
var object = require("../helpers/object");
var File = require("../file");
var util = require("../util");
var each = require("lodash/collection/each");
var normalizeAst = require("../helpers/normalize-ast");
var Transformer = require("./transformer");
var object = require("../helpers/object");
var File = require("./file");
var util = require("../util");
var each = require("lodash/collection/each");
function transform(code, opts) {
var file = new File(opts);
@@ -14,7 +15,7 @@ function transform(code, opts) {
}
transform.fromAst = function (ast, code, opts) {
ast = util.normalizeAst(ast);
ast = normalizeAst(ast);
var file = new File(opts);
file.addCode(code);

View File

@@ -4,7 +4,7 @@ module.exports = Transformer;
var TransformerPass = require("./transformer-pass");
var isFunction = require("lodash/lang/isFunction");
var traverse = require("../traverse");
var traverse = require("../traversal");
var isObject = require("lodash/lang/isObject");
var each = require("lodash/collection/each");

View File

@@ -1,6 +1,6 @@
"use strict";
var traverse = require("../../../traverse");
var traverse = require("../../../traversal");
var object = require("../../../helpers/object");
var util = require("../../../util");
var t = require("../../../types");

View File

@@ -1,7 +1,7 @@
"use strict";
var buildComprehension = require("../../helpers/build-comprehension");
var traverse = require("../../../traverse");
var traverse = require("../../../traversal");
var util = require("../../../util");
var t = require("../../../types");

View File

@@ -25,7 +25,7 @@ exports.IfStatement = {
var alternate = node.alternate;
var test = node.test;
// we can check if a test will be truthy 100% and if so we can inline
// we can check if a test will be truthy 100% and if so then we can inline
// the consequent and completely ignore the alternate
//
// if (true) { foo; } -> { foo; }
@@ -36,8 +36,8 @@ exports.IfStatement = {
return alternate;
}
// we can check if a test will be falsy 100% and if so we can inline
// the alternate if there is one and completely remove the consequent
// we can check if a test will be falsy 100% and if so we can inline the
// alternate if there is one and completely remove the consequent
//
// if ("") { bar; } else { foo; } -> { foo; }
// if ("") { bar; } ->
@@ -60,11 +60,10 @@ exports.IfStatement = {
alternate = node.alternate = null;
}
// turn alternate blocks into a consequent and flip the test if the
// consequent block is empty
// if the consequent block is empty turn alternate blocks into a consequent
// and flip the test
//
// if (foo) {} else { bar; }
// if (!foo) { bar; }
// if (foo) {} else { bar; } -> if (!foo) { bar; }
//
if (t.blockStatement(consequent) && !consequent.body.length &&

View File

@@ -6,7 +6,7 @@ exports.playground = true;
var visitor = {
enter: function (node, parent, scope, context, state) {
if (t.isFunction(node)) return;
if (t.isFunction(node)) return context.skip();
if (t.isReturnStatement(node) && node.argument) {
node.argument = t.memberExpression(t.callExpression(state.file.addHelper("define-property"), [
@@ -22,7 +22,6 @@ exports.Property =
exports.MethodDefinition = function (node, parent, scope, context, file) {
if (node.kind !== "memo") return;
node.kind = "get";
file.checkNode(node, scope);
var value = node.value;
t.ensureBlock(value);
@@ -39,4 +38,6 @@ exports.MethodDefinition = function (node, parent, scope, context, file) {
};
scope.traverse(value, visitor, state);
return node;
};

View File

@@ -341,8 +341,6 @@ Scope.prototype.crawl = function () {
if (t.isFunctionExpression(block) && block.id) {
if (!t.isProperty(this.parentBlock, { method: true })) {
// SpiderMonkey AST doesn't use MethodDefinition here when it probably
// should since they should be semantically the same?
this.register(block.id);
}
}

View File

@@ -2,23 +2,22 @@
require("./patch");
var estraverse = require("estraverse");
var cloneDeep = require("lodash/lang/cloneDeep");
var codeFrame = require("./helpers/code-frame");
var traverse = require("./traverse");
var debug = require("debug/node");
var acorn = require("acorn-6to5");
var path = require("path");
var util = require("util");
var fs = require("fs");
var t = require("./types");
var each = require("lodash/collection/each");
var contains = require("lodash/collection/contains");
var traverse = require("./traversal");
var isNumber = require("lodash/lang/isNumber");
var isString = require("lodash/lang/isString");
var isRegExp = require("lodash/lang/isRegExp");
var isEmpty = require("lodash/lang/isEmpty");
var cloneDeep = require("lodash/lang/cloneDeep");
var parse = require("./helpers/parse");
var debug = require("debug/node");
var path = require("path");
var util = require("util");
var each = require("lodash/collection/each");
var has = require("lodash/object/has");
var contains = require("lodash/collection/contains");
var fs = require("fs");
var t = require("./types");
exports.inherits = util.inherits;
@@ -123,61 +122,8 @@ exports.repeat = function (width, cha) {
return result;
};
exports.normalizeAst = function (ast, comments, tokens) {
if (ast && ast.type === "Program") {
return t.file(ast, comments || [], tokens || []);
} else {
throw new Error("Not a valid ast?");
}
};
exports.parse = function (opts, code, callback) {
try {
var comments = [];
var tokens = [];
var ast = acorn.parse(code, {
allowImportExportEverywhere: opts.allowImportExportEverywhere,
allowReturnOutsideFunction: !opts._anal,
ecmaVersion: opts.experimental ? 7 : 6,
playground: opts.playground,
strictMode: opts.strictMode,
onComment: comments,
locations: true,
onToken: tokens,
ranges: true
});
estraverse.attachComments(ast, comments, tokens);
ast = exports.normalizeAst(ast, comments, tokens);
if (callback) {
return callback(ast);
} else {
return ast;
}
} catch (err) {
if (!err._6to5) {
err._6to5 = true;
var message = opts.filename + ": " + err.message;
var loc = err.loc;
if (loc) {
var frame = codeFrame(code, loc.line, loc.column + 1);
message += frame;
}
if (err.stack) err.stack = err.stack.replace(err.message, message);
err.message = message;
}
throw err;
}
};
exports.parseTemplate = function (loc, code) {
var ast = exports.parse({ filename: loc }, code).program;
var ast = parse({ filename: loc }, code).program;
return traverse.removeProperties(ast);
};