UNPKG

eslint

Version:

An AST-based pattern checker for JavaScript.

82 lines (70 loc) 2.15 kB
/** * @fileoverview SourceCodeVisitor class * @author Nicholas C. Zakas */ "use strict"; //----------------------------------------------------------------------------- // Helpers //----------------------------------------------------------------------------- const emptyArray = Object.freeze([]); //------------------------------------------------------------------------------ // Exports //------------------------------------------------------------------------------ /** * A structure to hold a list of functions to call for a given name. * This is used to allow multiple rules to register functions for a given name * without having to know about each other. */ class SourceCodeVisitor { /** * The functions to call for a given name. * @type {Map<string, Function[]>} */ #functions = new Map(); /** * Adds a function to the list of functions to call for a given name. * @param {string} name The name of the function to call. * @param {Function} func The function to call. * @returns {void} */ add(name, func) { if (this.#functions.has(name)) { this.#functions.get(name).push(func); } else { this.#functions.set(name, [func]); } } /** * Gets the list of functions to call for a given name. * @param {string} name The name of the function to call. * @returns {Function[]} The list of functions to call. */ get(name) { if (this.#functions.has(name)) { return this.#functions.get(name); } return emptyArray; } /** * Iterates over all names and calls the callback with the name. * @param {(name:string) => void} callback The callback to call for each name. * @returns {void} */ forEachName(callback) { this.#functions.forEach((funcs, name) => { callback(name); }); } /** * Calls the functions for a given name with the given arguments. * @param {string} name The name of the function to call. * @param {any[]} args The arguments to pass to the function. * @returns {void} */ callSync(name, ...args) { if (this.#functions.has(name)) { this.#functions.get(name).forEach(func => func(...args)); } } } module.exports = { SourceCodeVisitor };