import {visitReactiveFunction} from '.';
import {InstructionId, Place, ReactiveFunction, ReactiveValue} from '../HIR';
import {ReactiveFunctionVisitor} from './visitors';
export function collectReferencedGlobals(fn: ReactiveFunction): Set<string> {
const identifiers = new Set<string>();
visitReactiveFunction(fn, new Visitor(), identifiers);
return identifiers;
}
class Visitor extends ReactiveFunctionVisitor<Set<string>> {
override visitValue(
id: InstructionId,
value: ReactiveValue,
state: Set<string>,
): void {
this.traverseValue(id, value, state);
if (value.kind === 'FunctionExpression' || value.kind === 'ObjectMethod') {
this.visitHirFunction(value.loweredFunc.func, state);
} else if (value.kind === 'LoadGlobal') {
state.add(value.binding.name);
}
}
override visitReactiveFunctionValue(
_id: InstructionId,
_dependencies: Array<Place>,
fn: ReactiveFunction,
state: Set<string>,
): void {
visitReactiveFunction(fn, this, state);
}
}