/** | |
* @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]; | |
} | |
} | |
} | |
} | |