139 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			139 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
"use strict";
 | 
						|
 | 
						|
Object.defineProperty(exports, "__esModule", {
 | 
						|
  value: true
 | 
						|
});
 | 
						|
exports.traverseNode = traverseNode;
 | 
						|
var _context = require("./context.js");
 | 
						|
var _index = require("./path/index.js");
 | 
						|
var _t = require("@babel/types");
 | 
						|
var _context2 = require("./path/context.js");
 | 
						|
const {
 | 
						|
  VISITOR_KEYS
 | 
						|
} = _t;
 | 
						|
function _visitPaths(ctx, paths) {
 | 
						|
  ctx.queue = paths;
 | 
						|
  ctx.priorityQueue = [];
 | 
						|
  const visited = new Set();
 | 
						|
  let stop = false;
 | 
						|
  let visitIndex = 0;
 | 
						|
  for (; visitIndex < paths.length;) {
 | 
						|
    const path = paths[visitIndex];
 | 
						|
    visitIndex++;
 | 
						|
    _context2.resync.call(path);
 | 
						|
    if (path.contexts.length === 0 || path.contexts[path.contexts.length - 1] !== ctx) {
 | 
						|
      _context2.pushContext.call(path, ctx);
 | 
						|
    }
 | 
						|
    if (path.key === null) continue;
 | 
						|
    const {
 | 
						|
      node
 | 
						|
    } = path;
 | 
						|
    if (visited.has(node)) continue;
 | 
						|
    if (node) visited.add(node);
 | 
						|
    if (_visit(ctx, path)) {
 | 
						|
      stop = true;
 | 
						|
      break;
 | 
						|
    }
 | 
						|
    if (ctx.priorityQueue.length) {
 | 
						|
      stop = _visitPaths(ctx, ctx.priorityQueue);
 | 
						|
      ctx.priorityQueue = [];
 | 
						|
      ctx.queue = paths;
 | 
						|
      if (stop) break;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  for (let i = 0; i < visitIndex; i++) {
 | 
						|
    _context2.popContext.call(paths[i]);
 | 
						|
  }
 | 
						|
  ctx.queue = null;
 | 
						|
  return stop;
 | 
						|
}
 | 
						|
function _visit(ctx, path) {
 | 
						|
  var _opts$denylist;
 | 
						|
  const node = path.node;
 | 
						|
  if (!node) {
 | 
						|
    return false;
 | 
						|
  }
 | 
						|
  const opts = ctx.opts;
 | 
						|
  const denylist = (_opts$denylist = opts.denylist) != null ? _opts$denylist : opts.blacklist;
 | 
						|
  if (denylist != null && denylist.includes(node.type)) {
 | 
						|
    return false;
 | 
						|
  }
 | 
						|
  if (opts.shouldSkip != null && opts.shouldSkip(path)) {
 | 
						|
    return false;
 | 
						|
  }
 | 
						|
  if (path.shouldSkip) return path.shouldStop;
 | 
						|
  if (_context2._call.call(path, opts.enter)) return path.shouldStop;
 | 
						|
  if (path.node) {
 | 
						|
    var _opts$node$type;
 | 
						|
    if (_context2._call.call(path, (_opts$node$type = opts[node.type]) == null ? void 0 : _opts$node$type.enter)) return path.shouldStop;
 | 
						|
  }
 | 
						|
  path.shouldStop = _traverse(path.node, opts, path.scope, ctx.state, path, path.skipKeys);
 | 
						|
  if (path.node) {
 | 
						|
    if (_context2._call.call(path, opts.exit)) return true;
 | 
						|
  }
 | 
						|
  if (path.node) {
 | 
						|
    var _opts$node$type2;
 | 
						|
    _context2._call.call(path, (_opts$node$type2 = opts[node.type]) == null ? void 0 : _opts$node$type2.exit);
 | 
						|
  }
 | 
						|
  return path.shouldStop;
 | 
						|
}
 | 
						|
function _traverse(node, opts, scope, state, path, skipKeys, visitSelf) {
 | 
						|
  const keys = VISITOR_KEYS[node.type];
 | 
						|
  if (!(keys != null && keys.length)) return false;
 | 
						|
  const ctx = new _context.default(scope, opts, state, path);
 | 
						|
  if (visitSelf) {
 | 
						|
    if (skipKeys != null && skipKeys[path.parentKey]) return false;
 | 
						|
    return _visitPaths(ctx, [path]);
 | 
						|
  }
 | 
						|
  for (const key of keys) {
 | 
						|
    if (skipKeys != null && skipKeys[key]) continue;
 | 
						|
    const prop = node[key];
 | 
						|
    if (!prop) continue;
 | 
						|
    if (Array.isArray(prop)) {
 | 
						|
      if (!prop.length) continue;
 | 
						|
      const paths = [];
 | 
						|
      for (let i = 0; i < prop.length; i++) {
 | 
						|
        const childPath = _index.default.get({
 | 
						|
          parentPath: path,
 | 
						|
          parent: node,
 | 
						|
          container: prop,
 | 
						|
          key: i,
 | 
						|
          listKey: key
 | 
						|
        });
 | 
						|
        paths.push(childPath);
 | 
						|
      }
 | 
						|
      if (_visitPaths(ctx, paths)) return true;
 | 
						|
    } else {
 | 
						|
      if (_visitPaths(ctx, [_index.default.get({
 | 
						|
        parentPath: path,
 | 
						|
        parent: node,
 | 
						|
        container: node,
 | 
						|
        key,
 | 
						|
        listKey: null
 | 
						|
      })])) {
 | 
						|
        return true;
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
  return false;
 | 
						|
}
 | 
						|
function traverseNode(node, opts, scope, state, path, skipKeys, visitSelf) {
 | 
						|
  ;
 | 
						|
  const keys = VISITOR_KEYS[node.type];
 | 
						|
  if (!keys) return false;
 | 
						|
  const context = new _context.default(scope, opts, state, path);
 | 
						|
  if (visitSelf) {
 | 
						|
    if (skipKeys != null && skipKeys[path.parentKey]) return false;
 | 
						|
    return context.visitQueue([path]);
 | 
						|
  }
 | 
						|
  for (const key of keys) {
 | 
						|
    if (skipKeys != null && skipKeys[key]) continue;
 | 
						|
    if (context.visit(node, key)) {
 | 
						|
      return true;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  return false;
 | 
						|
}
 | 
						|
 | 
						|
//# sourceMappingURL=traverse-node.js.map
 |