diff options
Diffstat (limited to 'vanilla/node_modules/estree-walker/src/walker.js')
| -rw-r--r-- | vanilla/node_modules/estree-walker/src/walker.js | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/vanilla/node_modules/estree-walker/src/walker.js b/vanilla/node_modules/estree-walker/src/walker.js new file mode 100644 index 0000000..6dc6bd7 --- /dev/null +++ b/vanilla/node_modules/estree-walker/src/walker.js @@ -0,0 +1,61 @@ +/** + * @typedef { import('estree').Node} Node + * @typedef {{ + * skip: () => void; + * remove: () => void; + * replace: (node: Node) => void; + * }} WalkerContext + */ + +export class WalkerBase { + constructor() { + /** @type {boolean} */ + this.should_skip = false; + + /** @type {boolean} */ + this.should_remove = false; + + /** @type {Node | null} */ + this.replacement = null; + + /** @type {WalkerContext} */ + this.context = { + skip: () => (this.should_skip = true), + remove: () => (this.should_remove = true), + replace: (node) => (this.replacement = node) + }; + } + + /** + * @template {Node} Parent + * @param {Parent | null | undefined} parent + * @param {keyof Parent | null | undefined} prop + * @param {number | null | undefined} index + * @param {Node} node + */ + replace(parent, prop, index, node) { + if (parent && prop) { + if (index != null) { + /** @type {Array<Node>} */ (parent[prop])[index] = node; + } else { + /** @type {Node} */ (parent[prop]) = node; + } + } + } + + /** + * @template {Node} Parent + * @param {Parent | null | undefined} parent + * @param {keyof Parent | null | undefined} prop + * @param {number | null | undefined} index + */ + remove(parent, prop, index) { + if (parent && prop) { + if (index !== null && index !== undefined) { + /** @type {Array<Node>} */ (parent[prop]).splice(index, 1); + } else { + delete parent[prop]; + } + } + } +} |
