| "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; |
| } |
|
|
| |
|
|