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
 |