import {
Identifier,
InstructionId,
Place,
ReactiveFunction,
ReactiveInstruction,
} from "../HIR/HIR";
import { ReactiveFunctionVisitor, visitReactiveFunction } from "./visitors";
export function pruneTemporaryLValues(fn: ReactiveFunction): void {
const lvalues = new Map<Identifier, ReactiveInstruction>();
visitReactiveFunction(fn, new Visitor(), lvalues);
for (const [, instr] of lvalues) {
instr.lvalue = null;
}
}
type LValues = Map<Identifier, ReactiveInstruction>;
class Visitor extends ReactiveFunctionVisitor<LValues> {
override visitPlace(id: InstructionId, place: Place, state: LValues): void {
state.delete(place.identifier);
}
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, instruction);
}
}
}