Merge pull request #3676 from loganfsmyth/non-circular-types

Remove the cycle from babel-types/babel-traverse.
This commit is contained in:
Logan Smyth 2016-08-31 10:20:41 -07:00 committed by GitHub
commit 288e956699
4 changed files with 60 additions and 54 deletions

View File

@ -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<Symbol> = 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;
};

View File

@ -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"

View File

@ -98,14 +98,7 @@ export function toSequenceExpression(nodes: Array<Object>, 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) {

View File

@ -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<Symbol> = Object.getOwnPropertySymbols(node);
for (let sym of syms) {
node[sym] = null;
}
}
export function removePropertiesDeep(tree: Node): Node {
traverseFast(tree, removeProperties);
return tree;
}
//
export {
getBindingIdentifiers,