mirror of https://github.com/sveltejs/svelte
chore: remove visitor merging logic (#12671)
parent
21da63ddb6
commit
ccccac394b
@ -1,74 +0,0 @@
|
||||
/** @import { Visitors, Context } from 'zimmerframe' */
|
||||
const overrides = {
|
||||
visit() {
|
||||
throw new Error('Cannot call visit() during analysis');
|
||||
},
|
||||
stop() {
|
||||
throw new Error('Cannot call stop() during analysis');
|
||||
}
|
||||
};
|
||||
|
||||
// TODO get rid of this
|
||||
/**
|
||||
* @template {{ type: string }} T
|
||||
* @template U
|
||||
* @param {...Visitors<T, U>} tasks
|
||||
* @returns
|
||||
*/
|
||||
export function merge(...tasks) {
|
||||
/** @type {Record<string, any[]>} */
|
||||
const visitors = {};
|
||||
|
||||
for (const task of tasks) {
|
||||
for (const key in task) {
|
||||
if (!visitors[key]) visitors[key] = [];
|
||||
visitors[key].push(task[key]);
|
||||
}
|
||||
}
|
||||
|
||||
/** @type {Visitors<T, U>} */
|
||||
// @ts-expect-error
|
||||
const combined = {};
|
||||
|
||||
for (const key in visitors) {
|
||||
const fns = visitors[key];
|
||||
|
||||
/**
|
||||
* @param {T} node
|
||||
* @param {Context<T, U>} context
|
||||
*/
|
||||
function visitor(node, context) {
|
||||
/**
|
||||
* @param {number} i
|
||||
* @param {U} state
|
||||
*/
|
||||
function go(i, state) {
|
||||
const fn = fns[i];
|
||||
if (!fn) return context.next(state);
|
||||
|
||||
let called_next = false;
|
||||
|
||||
fn(node, {
|
||||
...context,
|
||||
...overrides,
|
||||
state,
|
||||
next(next_state = state) {
|
||||
called_next = true;
|
||||
go(i + 1, next_state);
|
||||
}
|
||||
});
|
||||
|
||||
if (!called_next) {
|
||||
go(i + 1, state);
|
||||
}
|
||||
}
|
||||
|
||||
go(0, context.state);
|
||||
}
|
||||
|
||||
// @ts-expect-error
|
||||
combined[key] = visitor;
|
||||
}
|
||||
|
||||
return combined;
|
||||
}
|
Loading…
Reference in new issue