_traverse(node, parent) {
		if (!isNode(node)) {
			return;
		}

		this._current = node;
		this._skipped = false;
		this._enter(node, parent);

		if (!this._skipped && !this._broken) {
			const keys = getVisitorKeys(this._visitorKeys, node);

			if (keys.length >= 1) {
				this._parents.push(node);
				for (let i = 0; i < keys.length && !this._broken; ++i) {
					const child = node[keys[i]];

					if (Array.isArray(child)) {
						for (
							let j = 0;
							j < child.length && !this._broken;
							++j
						) {
							this._traverse(child[j], node);
						}
					} else {
						this._traverse(child, node);
					}
				}
				this._parents.pop();
			}
		}

		if (!this._broken) {
			this._leave(node, parent);
		}

		this._current = parent;
	}
Traverse the given AST tree recursively.
@param {ASTNode} node The current node.
@param {ASTNode|null} parent The parent node.
@returns {void}
@private