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);
}
}