You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					128 lines
				
				2.8 KiB
			
		
		
			
		
	
	
					128 lines
				
				2.8 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								"use strict";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Object.defineProperty(exports, "__esModule", {
							 | 
						||
| 
								 | 
							
								  value: true
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								exports.default = void 0;
							 | 
						||
| 
								 | 
							
								var _path = require("./path");
							 | 
						||
| 
								 | 
							
								var _t = require("@babel/types");
							 | 
						||
| 
								 | 
							
								const {
							 | 
						||
| 
								 | 
							
								  VISITOR_KEYS
							 | 
						||
| 
								 | 
							
								} = _t;
							 | 
						||
| 
								 | 
							
								class TraversalContext {
							 | 
						||
| 
								 | 
							
								  constructor(scope, opts, state, parentPath) {
							 | 
						||
| 
								 | 
							
								    this.queue = null;
							 | 
						||
| 
								 | 
							
								    this.priorityQueue = null;
							 | 
						||
| 
								 | 
							
								    this.parentPath = parentPath;
							 | 
						||
| 
								 | 
							
								    this.scope = scope;
							 | 
						||
| 
								 | 
							
								    this.state = state;
							 | 
						||
| 
								 | 
							
								    this.opts = opts;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  shouldVisit(node) {
							 | 
						||
| 
								 | 
							
								    const opts = this.opts;
							 | 
						||
| 
								 | 
							
								    if (opts.enter || opts.exit) return true;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (opts[node.type]) return true;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    const keys = VISITOR_KEYS[node.type];
							 | 
						||
| 
								 | 
							
								    if (!(keys != null && keys.length)) return false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    for (const key of keys) {
							 | 
						||
| 
								 | 
							
								      if (
							 | 
						||
| 
								 | 
							
								      node[key]) {
							 | 
						||
| 
								 | 
							
								        return true;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return false;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  create(node, container, key, listKey) {
							 | 
						||
| 
								 | 
							
								    return _path.default.get({
							 | 
						||
| 
								 | 
							
								      parentPath: this.parentPath,
							 | 
						||
| 
								 | 
							
								      parent: node,
							 | 
						||
| 
								 | 
							
								      container,
							 | 
						||
| 
								 | 
							
								      key: key,
							 | 
						||
| 
								 | 
							
								      listKey
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  maybeQueue(path, notPriority) {
							 | 
						||
| 
								 | 
							
								    if (this.queue) {
							 | 
						||
| 
								 | 
							
								      if (notPriority) {
							 | 
						||
| 
								 | 
							
								        this.queue.push(path);
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        this.priorityQueue.push(path);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  visitMultiple(container, parent, listKey) {
							 | 
						||
| 
								 | 
							
								    if (container.length === 0) return false;
							 | 
						||
| 
								 | 
							
								    const queue = [];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    for (let key = 0; key < container.length; key++) {
							 | 
						||
| 
								 | 
							
								      const node = container[key];
							 | 
						||
| 
								 | 
							
								      if (node && this.shouldVisit(node)) {
							 | 
						||
| 
								 | 
							
								        queue.push(this.create(parent, container, key, listKey));
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return this.visitQueue(queue);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  visitSingle(node, key) {
							 | 
						||
| 
								 | 
							
								    if (this.shouldVisit(
							 | 
						||
| 
								 | 
							
								    node[key])) {
							 | 
						||
| 
								 | 
							
								      return this.visitQueue([this.create(node, node, key)]);
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      return false;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  visitQueue(queue) {
							 | 
						||
| 
								 | 
							
								    this.queue = queue;
							 | 
						||
| 
								 | 
							
								    this.priorityQueue = [];
							 | 
						||
| 
								 | 
							
								    const visited = new WeakSet();
							 | 
						||
| 
								 | 
							
								    let stop = false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    for (const path of queue) {
							 | 
						||
| 
								 | 
							
								      path.resync();
							 | 
						||
| 
								 | 
							
								      if (path.contexts.length === 0 || path.contexts[path.contexts.length - 1] !== this) {
							 | 
						||
| 
								 | 
							
								        path.pushContext(this);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if (path.key === null) continue;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      const {
							 | 
						||
| 
								 | 
							
								        node
							 | 
						||
| 
								 | 
							
								      } = path;
							 | 
						||
| 
								 | 
							
								      if (visited.has(node)) continue;
							 | 
						||
| 
								 | 
							
								      if (node) visited.add(node);
							 | 
						||
| 
								 | 
							
								      if (path.visit()) {
							 | 
						||
| 
								 | 
							
								        stop = true;
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      if (this.priorityQueue.length) {
							 | 
						||
| 
								 | 
							
								        stop = this.visitQueue(this.priorityQueue);
							 | 
						||
| 
								 | 
							
								        this.priorityQueue = [];
							 | 
						||
| 
								 | 
							
								        this.queue = queue;
							 | 
						||
| 
								 | 
							
								        if (stop) break;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    for (const path of queue) {
							 | 
						||
| 
								 | 
							
								      path.popContext();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    this.queue = null;
							 | 
						||
| 
								 | 
							
								    return stop;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  visit(node, key) {
							 | 
						||
| 
								 | 
							
								    const nodes = node[key];
							 | 
						||
| 
								 | 
							
								    if (!nodes) return false;
							 | 
						||
| 
								 | 
							
								    if (Array.isArray(nodes)) {
							 | 
						||
| 
								 | 
							
								      return this.visitMultiple(nodes, node, key);
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      return this.visitSingle(node, key);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								exports.default = TraversalContext;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//# sourceMappingURL=context.js.map
							 |