import {
DeclarationId,
InstructionId,
Place,
ReactiveFunction,
ReactiveInstruction,
} from '../HIR/HIR';
import {ReactiveFunctionVisitor, visitReactiveFunction} from './visitors';
export function pruneUnusedLValues(fn: ReactiveFunction): void {
const lvalues = new Map<DeclarationId, ReactiveInstruction>();
visitReactiveFunction(fn, new Visitor(), lvalues);
for (const [, instr] of lvalues) {
instr.lvalue = null;
}
}
type LValues = Map<DeclarationId, ReactiveInstruction>;
class Visitor extends ReactiveFunctionVisitor<LValues> {
override visitPlace(id: InstructionId, place: Place, state: LValues): void {
state.delete(place.identifier.declarationId);
}
override visitInstruction(
instruction: ReactiveInstruction,
state: LValues,
): void {
this.traverseInstruction(instruction, state);
if (
instruction.lvalue !== null &&
instruction.lvalue.identifier.name === null
) {
state.set(instruction.lvalue.identifier.declarationId, instruction);
}
}
}