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.
46 lines
1.3 KiB
46 lines
1.3 KiB
/** |
|
* @author Toru Nagashima <https://github.com/mysticatea> |
|
* See LICENSE file in root directory for full license. |
|
*/ |
|
"use strict" |
|
|
|
/** |
|
* Merge two visitors. |
|
* This function modifies `visitor1` directly to merge. |
|
* @param {Visitor} visitor1 The visitor which is assigned. |
|
* @param {Visitor} visitor2 The visitor which is assigning. |
|
* @returns {Visitor} `visitor1`. |
|
*/ |
|
module.exports = function mergeVisitorsInPlace(visitor1, visitor2) { |
|
for (const key of Object.keys(visitor2)) { |
|
const handler1 = visitor1[key] |
|
const handler2 = visitor2[key] |
|
|
|
if (typeof handler1 === "function") { |
|
if (handler1._handlers) { |
|
handler1._handlers.push(handler2) |
|
} else { |
|
const handlers = [handler1, handler2] |
|
visitor1[key] = Object.assign(dispatch.bind(null, handlers), { |
|
_handlers: handlers, |
|
}) |
|
} |
|
} else { |
|
visitor1[key] = handler2 |
|
} |
|
} |
|
|
|
return visitor1 |
|
} |
|
|
|
/** |
|
* Dispatch all given functions with a node. |
|
* @param {function[]} handlers The function list to call. |
|
* @param {Node} node The AST node to be handled. |
|
* @returns {void} |
|
*/ |
|
function dispatch(handlers, node) { |
|
for (const h of handlers) { |
|
h(node) |
|
} |
|
}
|
|
|