diff --git a/lib/6to5/modules/amd.js b/lib/6to5/modules/amd.js index 073cd596a6..5cc573f7ca 100644 --- a/lib/6to5/modules/amd.js +++ b/lib/6to5/modules/amd.js @@ -2,6 +2,7 @@ module.exports = AMDFormatter; var CommonJSFormatter = require("./common"); var util = require("../util"); +var t = require("../types"); var b = require("../builders"); var _ = require("lodash"); @@ -51,7 +52,7 @@ AMDFormatter.prototype.import = function (node) { }; AMDFormatter.prototype.importSpecifier = function (specifier, node, nodes) { - var key = util.getSpecifierName(specifier); + var key = t.getSpecifierName(specifier); var id = specifier.id; // import foo from "foo"; diff --git a/lib/6to5/modules/common.js b/lib/6to5/modules/common.js index 8cd1013c65..0fbb851c7c 100644 --- a/lib/6to5/modules/common.js +++ b/lib/6to5/modules/common.js @@ -1,6 +1,7 @@ module.exports = CommonJSFormatter; var util = require("../util"); +var t = require("../types"); var b = require("../builders"); function CommonJSFormatter(file) { @@ -15,7 +16,7 @@ CommonJSFormatter.prototype.import = function (node, nodes) { }; CommonJSFormatter.prototype.importSpecifier = function (specifier, node, nodes) { - var variableName = util.getSpecifierName(specifier); + var variableName = t.getSpecifierName(specifier); // import foo from "foo"; if (specifier.default) { @@ -38,7 +39,7 @@ CommonJSFormatter.prototype.export = function (node, nodes) { var declar = node.declaration; if (node.default) { - util.ensureExpressionType(declar); + t.ensureExpressionType(declar); nodes.push(util.template("exports-default", { VALUE: declar @@ -65,7 +66,7 @@ CommonJSFormatter.prototype.export = function (node, nodes) { }; CommonJSFormatter.prototype._exportSpecifier = function (getRef, specifier, node, nodes) { - var variableName = util.getSpecifierName(specifier); + var variableName = t.getSpecifierName(specifier); if (node.source) { if (specifier.type === "ExportBatchSpecifier") { diff --git a/lib/6to5/transformer.js b/lib/6to5/transformer.js index 77123b64be..3455588d07 100644 --- a/lib/6to5/transformer.js +++ b/lib/6to5/transformer.js @@ -1,6 +1,7 @@ module.exports = Transformer; var traverse = require("./traverse"); +var t = require("./types"); var _ = require("lodash"); function Transformer(key, transformer) { @@ -34,7 +35,7 @@ Transformer.prototype.transform = function (file) { var build = function (exit) { return function (node, parent) { // add any node type aliases that exist - var types = [node.type].concat(traverse.aliases[node.type] || []); + var types = [node.type].concat(t.aliases[node.type] || []); var fns = transformer.all; diff --git a/lib/6to5/transformers/_alias-functions.js b/lib/6to5/transformers/_alias-functions.js index 77928084ce..36e787dec2 100644 --- a/lib/6to5/transformers/_alias-functions.js +++ b/lib/6to5/transformers/_alias-functions.js @@ -1,5 +1,5 @@ var traverse = require("../traverse"); -var util = require("../util"); +var t = require("../types"); var b = require("../builders"); var go = function (getBody, node, file) { @@ -19,7 +19,7 @@ var go = function (getBody, node, file) { traverse(node, function (node) { var _aliasFunction = node._aliasFunction; if (!_aliasFunction) { - if (traverse.isFunction(node)) { + if (t.isFunction(node)) { // stop traversal of this node as it'll be hit again by this transformer return false; } else { @@ -30,7 +30,7 @@ var go = function (getBody, node, file) { // traverse all child nodes of this function and find arguments and this traverse(node, function (node, parent) { if (_aliasFunction === "arrows") { - if (traverse.isFunction(node) && node._aliasFunction !== "arrows") { + if (t.isFunction(node) && node._aliasFunction !== "arrows") { return false; } } @@ -45,7 +45,7 @@ var go = function (getBody, node, file) { return; } - if (util.isReferenced(node, parent)) return getId(); + if (t.isReferenced(node, parent)) return getId(); }); return false; @@ -78,7 +78,7 @@ exports.Program = function (node, parent, file) { exports.FunctionDeclaration = exports.FunctionExpression = function (node, parent, file) { go(function () { - util.ensureBlock(node); + t.ensureBlock(node); return node.body.body; }, node, file); }; diff --git a/lib/6to5/transformers/_comments.js b/lib/6to5/transformers/_comments.js index 14ea290d23..3a008f1108 100644 --- a/lib/6to5/transformers/_comments.js +++ b/lib/6to5/transformers/_comments.js @@ -1,6 +1,3 @@ -var traverse = require("../traverse"); -var _ = require("lodash"); - -module.exports = function (ast) { +module.exports = function () { }; diff --git a/lib/6to5/transformers/arrow-functions.js b/lib/6to5/transformers/arrow-functions.js index feebb5213e..d63bbad2d9 100644 --- a/lib/6to5/transformers/arrow-functions.js +++ b/lib/6to5/transformers/arrow-functions.js @@ -1,7 +1,7 @@ -var util = require("../util"); +var t = require("../types"); exports.ArrowFunctionExpression = function (node) { - util.ensureBlock(node); + t.ensureBlock(node); node._aliasFunction = "arrows"; node.expression = false; diff --git a/lib/6to5/transformers/default-parameters.js b/lib/6to5/transformers/default-parameters.js index 591a16a4df..a3696ceb87 100644 --- a/lib/6to5/transformers/default-parameters.js +++ b/lib/6to5/transformers/default-parameters.js @@ -1,9 +1,10 @@ var util = require("../util"); +var t = require("../types"); var _ = require("lodash"); exports.Function = function (node) { if (!node.defaults.length) return; - util.ensureBlock(node); + t.ensureBlock(node); _.each(node.defaults, function (def, i) { if (!def) return; diff --git a/lib/6to5/transformers/destructuring.js b/lib/6to5/transformers/destructuring.js index 84d2335a8e..62f4ed757f 100644 --- a/lib/6to5/transformers/destructuring.js +++ b/lib/6to5/transformers/destructuring.js @@ -1,7 +1,6 @@ -var traverse = require("../traverse"); -var util = require("../util"); -var b = require("../builders"); -var _ = require("lodash"); +var b = require("../builders"); +var t = require("../types"); +var _ = require("lodash"); var buildVariableAssign = function (kind, id, init) { if (kind === false) { @@ -30,7 +29,7 @@ var pushObjectPattern = function (kind, nodes, pattern, parentId) { var pattern2 = prop.value; var patternId2 = b.memberExpression(parentId, prop.key, false); - if (traverse.isPattern(pattern2)) { + if (t.isPattern(pattern2)) { push(kind, nodes, pattern2, patternId2); } else { nodes.push(buildVariableAssign(kind, pattern2, patternId2)); @@ -67,7 +66,7 @@ exports.ForOfStatement = function (node, parent, file) { if (declar.type !== "VariableDeclaration") return; var pattern = declar.declarations[0].id; - if (!traverse.isPattern(pattern)) return; + if (!t.isPattern(pattern)) return; var key = b.identifier(file.generateUid("ref")); node.left = b.variableDeclaration(declar.kind, [ @@ -78,7 +77,7 @@ exports.ForOfStatement = function (node, parent, file) { push(declar.kind, nodes, pattern, key); - util.ensureBlock(node); + t.ensureBlock(node); var block = node.body; block.body = nodes.concat(block.body); @@ -90,7 +89,7 @@ exports.Function = function (node, parent, file) { var hasDestructuring = false; node.params = node.params.map(function (pattern) { - if (!traverse.isPattern(pattern)) return pattern; + if (!t.isPattern(pattern)) return pattern; hasDestructuring = true; var parentId = b.identifier(file.generateUid("ref")); @@ -100,7 +99,7 @@ exports.Function = function (node, parent, file) { if (!hasDestructuring) return; - util.ensureBlock(node); + t.ensureBlock(node); var block = node.body; block.body = nodes.concat(block.body); @@ -110,7 +109,7 @@ exports.ExpressionStatement = function (node, parent, file) { var expr = node.expression; if (expr.type !== "AssignmentExpression") return; - if (!traverse.isPattern(expr.left)) return; + if (!t.isPattern(expr.left)) return; var nodes = []; @@ -131,7 +130,7 @@ exports.VariableDeclaration = function (node, parent, file) { var hasPattern = false; _.each(node.declarations, function (declar) { - if (traverse.isPattern(declar.id)) { + if (t.isPattern(declar.id)) { hasPattern = true; return false; } @@ -141,7 +140,7 @@ exports.VariableDeclaration = function (node, parent, file) { _.each(node.declarations, function (declar) { var patternId = declar.init; var pattern = declar.id; - if (traverse.isPattern(pattern) && patternId) { + if (t.isPattern(pattern) && patternId) { pushPattern(node.kind, nodes, pattern, patternId, file); } else { nodes.push(buildVariableAssign(node.kind, declar.id, declar.init)); diff --git a/lib/6to5/transformers/for-of.js b/lib/6to5/transformers/for-of.js index 14ee860db2..f535347eff 100644 --- a/lib/6to5/transformers/for-of.js +++ b/lib/6to5/transformers/for-of.js @@ -1,4 +1,5 @@ var util = require("../util"); +var t = require("../types"); var b = require("../builders"); exports.ForOfStatement = function (node, parent, file) { @@ -24,7 +25,7 @@ exports.ForOfStatement = function (node, parent, file) { OBJECT: node.right }); - util.ensureBlock(node); + t.ensureBlock(node); var block = node2.body; block.body.push(declar); diff --git a/lib/6to5/transformers/let-scoping.js b/lib/6to5/transformers/let-scoping.js index 6bf477509a..439bde7bcd 100644 --- a/lib/6to5/transformers/let-scoping.js +++ b/lib/6to5/transformers/let-scoping.js @@ -1,5 +1,6 @@ var traverse = require("../traverse"); var util = require("../util"); +var t = require("../types"); var b = require("../builders"); var _ = require("lodash"); @@ -23,13 +24,13 @@ exports.VariableDeclaration = function (node, parent, file) { var id = ids[node.name]; if (!id) return; - if (util.isReferenced(node, parent)) return id; + if (t.isReferenced(node, parent)) return id; }; var isProgram = parent.type === "Program"; var replace = function (node, parent) { - if (!isProgram && _.contains(traverse.FUNCTION_TYPES, node.type)) { + if (!isProgram && _.contains(t.FUNCTION_TYPES, node.type)) { var letReferences = []; traverse(node, function (node, parent) { diff --git a/lib/6to5/transformers/rest-parameters.js b/lib/6to5/transformers/rest-parameters.js index 04b68fb6d6..1090f4fde3 100644 --- a/lib/6to5/transformers/rest-parameters.js +++ b/lib/6to5/transformers/rest-parameters.js @@ -1,4 +1,5 @@ var util = require("../util"); +var t = require("../types"); var b = require("../builders"); exports.Function = function (node, parent, file) { @@ -10,7 +11,7 @@ exports.Function = function (node, parent, file) { var templateName = "arguments-slice-assign"; if (node.params.length) templateName += "-arg"; - util.ensureBlock(node); + t.ensureBlock(node); node.body.body.unshift(util.template(templateName, { SLICE_KEY: file.addDeclaration("slice"), VARIABLE_NAME: rest, diff --git a/lib/6to5/transformers/unicode-regex.js b/lib/6to5/transformers/unicode-regex.js index b1d5e4e0a1..14c9c2143c 100644 --- a/lib/6to5/transformers/unicode-regex.js +++ b/lib/6to5/transformers/unicode-regex.js @@ -1,5 +1,4 @@ var rewritePattern = require("regexpu/rewrite-pattern"); -var b = require("../builders"); var _ = require("lodash"); exports.Literal = function (node) { diff --git a/lib/6to5/traverse/index.js b/lib/6to5/traverse/index.js index 6c95565b04..8e558cbdd5 100644 --- a/lib/6to5/traverse/index.js +++ b/lib/6to5/traverse/index.js @@ -72,20 +72,17 @@ var traverse = module.exports = function (parent, callbacks, blacklistTypes) { }); }; -traverse.FUNCTION_TYPES = ["ArrowFunctionExpression", "FunctionDeclaration", "FunctionExpression"]; +traverse.removeProperties = function (tree) { + var clear = function (node) { + delete node.tokens; + delete node.range; + delete node.loc; + }; -traverse.aliases = { - ArrowFunctionExpression: ["Function"], - FunctionDeclaration: ["Function"], - FunctionExpression: ["Function"] -}; + clear(tree); + traverse(tree, clear); -traverse.isFunction = function (node) { - return _.contains(traverse.FUNCTION_TYPES, node.type); -}; - -traverse.isPattern = function (node) { - return node.type === "ArrayPattern" || node.type === "ObjectPattern"; + return tree; }; traverse.hasType = function (tree, type, blacklistTypes) { diff --git a/lib/6to5/types.js b/lib/6to5/types.js new file mode 100644 index 0000000000..ae8bc0013b --- /dev/null +++ b/lib/6to5/types.js @@ -0,0 +1,61 @@ +var b = require("./builders"); +var n = require("acorn-ast-types").namedTypes; +var _ = require("lodash"); + +exports.FUNCTION_TYPES = ["ArrowFunctionExpression", "FunctionDeclaration", "FunctionExpression"]; + +exports.aliases = { + ArrowFunctionExpression: ["Function"], + FunctionDeclaration: ["Function"], + FunctionExpression: ["Function"] +}; + +exports.isFunction = function (node) { + return _.contains(exports.FUNCTION_TYPES, node.type); +}; + +exports.isPattern = function (node) { + return node.type === "ArrayPattern" || node.type === "ObjectPattern"; +}; + +exports.isReferenced = function (node, parent) { + // we're a property key so we aren't referenced + if (parent.type === "Property" && parent.key === node) return false; + + var isMemberExpression = parent.type === "MemberExpression"; + + // we're in a member expression and we're the computed property so we're referenced + var isComputedProperty = isMemberExpression && parent.property === node && parent.computed; + + // we're in a member expression and we're the object so we're referenced + var isObject = isMemberExpression && parent.object === node; + + // we are referenced + if (!isMemberExpression || isComputedProperty || isObject) return true; + + return false; +}; + +exports.ensureBlock = function (node) { + var block = node.body; + if (block.type === "BlockStatement") return; + + if (!_.isArray(block)) { + if (!n.Statement.check(block)) block = b.returnStatement(block); + block = [block]; + } + + node.body = b.blockStatement(block); +}; + +exports.getSpecifierName = function (specifier) { + return specifier.name || specifier.id; +}; + +exports.ensureExpressionType = function (node) { + node.type = { + FunctionDeclaration: "FunctionExpression", + ClassDeclaration: "ClassExpression" + }[node.type] || node.type; + return node; +}; diff --git a/lib/6to5/util.js b/lib/6to5/util.js index a0726f0188..313f58d5b2 100644 --- a/lib/6to5/util.js +++ b/lib/6to5/util.js @@ -1,28 +1,13 @@ var traverse = require("./traverse"); -var astTypes = require("acorn-ast-types"); var acorn = require("acorn-jsx"); var path = require("path"); var util = require("util"); var fs = require("fs"); +var b = require("./builders"); var _ = require("lodash"); -var n = astTypes.namedTypes; -var b = astTypes.builders; - exports.inherits = util.inherits; -exports.ensureBlock = function (node) { - var block = node.body; - if (block.type === "BlockStatement") return; - - if (!_.isArray(block)) { - if (!n.Statement.check(block)) block = b.returnStatement(block); - block = [block]; - } - - node.body = b.blockStatement(block); -}; - exports.resolve = function (loc) { try { return require.resolve(loc); @@ -35,18 +20,6 @@ exports.list = function (val) { return val ? val.split(",") : []; }; -exports.getSpecifierName = function (specifier) { - return specifier.name || specifier.id; -}; - -exports.ensureExpressionType = function (node) { - node.type = { - FunctionDeclaration: "FunctionExpression", - ClassDeclaration: "ClassExpression" - }[node.type] || node.type; - return node; -}; - exports.getUid = function (parent, file) { var node; @@ -72,19 +45,6 @@ exports.isAbsolute = function (loc) { return false; }; -exports.removeProperties = function (tree) { - var clear = function (node) { - delete node.tokens; - delete node.range; - delete node.loc; - }; - - clear(tree); - traverse(tree, clear); - - return tree; -}; - exports.getIds = function (node) { var search = [node]; var ids = []; @@ -198,24 +158,6 @@ exports.template = function (name, nodes, keepExpression) { } }; -exports.isReferenced = function (node, parent) { - // we're a property key - if (parent.type === "Property" && parent.key === node) return false; - - var isMemberExpression = parent.type === "MemberExpression"; - - // we're in a member expression and we're the computed property so we're referenced - var isComputedProperty = isMemberExpression && parent.property === node && parent.computed; - - // we're in a member expression and we're the object so we're referenced - var isObject = isMemberExpression && parent.object === node; - - // we are referenced - if (!isMemberExpression || isComputedProperty || isObject) return true; - - return false; -}; - exports.codeFrame = function (lines, lineNumber, colNumber) { colNumber = Math.max(colNumber, 0); @@ -280,8 +222,8 @@ exports.parse = function (opts, code, callback) { program: ast }; - ast.tokens = tokens; ast.comments = comments; + ast.tokens = tokens; if (callback) { return callback(ast); @@ -308,7 +250,7 @@ exports.parse = function (opts, code, callback) { exports.parseNoProperties = function (loc, code) { var ast = exports.parse({ filename: loc }, code).program; - return exports.removeProperties(ast); + return traverse.removeProperties(ast); }; try {