diff --git a/packages/babel-traverse/src/index.js b/packages/babel-traverse/src/index.js index 28f46d13c3..5f33119fbc 100644 --- a/packages/babel-traverse/src/index.js +++ b/packages/babel-traverse/src/index.js @@ -42,24 +42,7 @@ traverse.Scope = require("./scope"); traverse.Hub = require("./hub"); traverse.cheap = function (node, enter) { - if (!node) return; - - let keys = t.VISITOR_KEYS[node.type]; - if (!keys) return; - - enter(node); - - for (let key of keys) { - let subNode = node[key]; - - if (Array.isArray(subNode)) { - for (let node of subNode) { - traverse.cheap(node, enter); - } - } else { - traverse.cheap(subNode, enter); - } - } + return t.traverseFast(node, enter); }; traverse.node = function (node: Object, opts: Object, scope: Object, state: Object, parentPath: Object, skipKeys?) { @@ -73,31 +56,14 @@ traverse.node = function (node: Object, opts: Object, scope: Object, state: Obje } }; -const CLEAR_KEYS: Array = t.COMMENT_KEYS.concat([ - "tokens", "comments", - "start", "end", "loc", - "raw", "rawValue" -]); - traverse.clearNode = function (node) { - for (let key of CLEAR_KEYS) { - if (node[key] != null) node[key] = undefined; - } - - for (let key in node) { - if (key[0] === "_" && node[key] != null) node[key] = undefined; - } + t.removeProperties(node); cache.path.delete(node); - - let syms: Array = Object.getOwnPropertySymbols(node); - for (let sym of syms) { - node[sym] = null; - } }; traverse.removeProperties = function (tree) { - traverse.cheap(tree, traverse.clearNode); + t.traverseFast(tree, traverse.clearNode); return tree; }; diff --git a/packages/babel-types/package.json b/packages/babel-types/package.json index e148988b5e..830059f0d0 100644 --- a/packages/babel-types/package.json +++ b/packages/babel-types/package.json @@ -9,7 +9,6 @@ "main": "lib/index.js", "dependencies": { "babel-runtime": "^6.9.1", - "babel-traverse": "^6.14.0", "esutils": "^2.0.2", "lodash": "^4.2.0", "to-fast-properties": "^1.0.1" diff --git a/packages/babel-types/src/converters.js b/packages/babel-types/src/converters.js index 852c183ee3..f3ce679d84 100644 --- a/packages/babel-types/src/converters.js +++ b/packages/babel-types/src/converters.js @@ -98,14 +98,7 @@ export function toSequenceExpression(nodes: Array, scope: Scope): ?Objec } } -// Can't use import because of cyclic dependency between babel-traverse -// and this module (babel-types). This require needs to appear after -// we export the TYPES constant, so we lazy-initialize it before use. -let traverse; - export function toKeyAlias(node: Object, key: Object = node.key): string { - if (!traverse) traverse = require("babel-traverse").default; - let alias; if (node.kind === "method") { @@ -115,7 +108,7 @@ export function toKeyAlias(node: Object, key: Object = node.key): string { } else if (t.isStringLiteral(key)) { alias = JSON.stringify(key.value); } else { - alias = JSON.stringify(traverse.removeProperties(t.cloneDeep(key))); + alias = JSON.stringify(t.removePropertiesDeep(t.cloneDeep(key))); } if (node.computed) { diff --git a/packages/babel-types/src/index.js b/packages/babel-types/src/index.js index 945d288a22..b2739d1c93 100644 --- a/packages/babel-types/src/index.js +++ b/packages/babel-types/src/index.js @@ -399,18 +399,11 @@ function _inheritComments(key, child, parent) { } } -// Can't use import because of cyclic dependency between babel-traverse -// and this module (babel-types). This require needs to appear after -// we export the TYPES constant, so we lazy-initialize it before use. -let traverse; - /** * Inherit all contextual properties from `parent` node to `child` node. */ export function inherits(child: Object, parent: Object): Object { - if (!traverse) traverse = require("babel-traverse").default; - if (!child || !parent) return child; // optionally inherit specific properties if not null @@ -431,7 +424,6 @@ export function inherits(child: Object, parent: Object): Object { } t.inheritsComments(child, parent); - traverse.copyCache(parent, child); return child; } @@ -459,6 +451,62 @@ export function isNode(node?): boolean { toFastProperties(t); toFastProperties(t.VISITOR_KEYS); +/** + * A prefix AST traversal implementation implementation. + */ + +export function traverseFast(node: Node, enter: (node: Node) => void) { + if (!node) return; + + let keys = t.VISITOR_KEYS[node.type]; + if (!keys) return; + + enter(node); + + for (let key of keys) { + let subNode = node[key]; + + if (Array.isArray(subNode)) { + for (let node of subNode) { + traverseFast(node, enter); + } + } else { + traverseFast(subNode, enter); + } + } +} + +const CLEAR_KEYS: Array = t.COMMENT_KEYS.concat([ + "tokens", "comments", + "start", "end", "loc", + "raw", "rawValue" +]); + +/** + * Remove all of the _* properties from a node along with the additional metadata + * properties like location data and raw token data. + */ + +export function removeProperties(node: Node): void { + for (let key of CLEAR_KEYS) { + if (node[key] != null) node[key] = undefined; + } + + for (let key in node) { + if (key[0] === "_" && node[key] != null) node[key] = undefined; + } + + let syms: Array = Object.getOwnPropertySymbols(node); + for (let sym of syms) { + node[sym] = null; + } +} + +export function removePropertiesDeep(tree: Node): Node { + traverseFast(tree, removeProperties); + return tree; +} + // export { getBindingIdentifiers,