import {CompilerError} from '..';
import {BlockId, ReactiveFunction, ReactiveTerminalStatement} from '../HIR';
import {ReactiveFunctionVisitor, visitReactiveFunction} from './visitors';
export function assertWellFormedBreakTargets(fn: ReactiveFunction): void {
visitReactiveFunction(fn, new Visitor(), new Set());
}
class Visitor extends ReactiveFunctionVisitor<Set<BlockId>> {
override visitTerminal(
stmt: ReactiveTerminalStatement,
seenLabels: Set<BlockId>,
): void {
if (stmt.label != null) {
seenLabels.add(stmt.label.id);
}
const terminal = stmt.terminal;
if (terminal.kind === 'break' || terminal.kind === 'continue') {
CompilerError.invariant(seenLabels.has(terminal.target), {
reason: 'Unexpected break to invalid label',
loc: stmt.terminal.loc,
});
}
}
}