import {
collapseIfTrue,
invertEmptyIfElse,
removeEmptyIf,
rewriteElseIfChains,
} from "./postprocess-branches.js";
import {
collapseTempIntoStore,
eliminateBareTempUses,
eliminateIdentityTemps,
stripStackComments,
} from "./postprocess-cleanup.js";
import {
rewriteCompoundAssignments,
rewriteIndexingSyntax,
} from "./postprocess-expressions.js";
import { inlineSingleUseTemps } from "./postprocess-inline.js";
import {
eliminateFallthroughGotos,
removeOrphanedLabels,
rewriteGotoDoWhile,
rewriteIfGotoToWhile,
rewriteLabelGotoToLoop,
} from "./postprocess-labels.js";
import {
inlineConditionTemps,
inlineForIncrementTemps,
rewriteForLoops,
} from "./postprocess-loops.js";
import { collapseOverflowChecks } from "./postprocess-overflow.js";
import {
rewriteSwitchBreakGotos,
rewriteSwitchStatements,
} from "./postprocess-switch.js";
export function postprocess(statements, options = {}) {
rewriteElseIfChains(statements);
collapseOverflowChecks(statements);
rewriteGotoDoWhile(statements);
rewriteIfGotoToWhile(statements);
eliminateFallthroughGotos(statements);
rewriteLabelGotoToLoop(statements);
removeOrphanedLabels(statements);
rewriteForLoops(statements);
inlineConditionTemps(statements);
inlineForIncrementTemps(statements);
if (options.inlineSingleUseTemps) {
inlineSingleUseTemps(statements);
eliminateFallthroughGotos(statements);
removeOrphanedLabels(statements);
}
rewriteCompoundAssignments(statements);
rewriteIndexingSyntax(statements);
collapseIfTrue(statements);
invertEmptyIfElse(statements);
removeEmptyIf(statements);
stripStackComments(statements);
eliminateIdentityTemps(statements);
collapseTempIntoStore(statements);
eliminateBareTempUses(statements);
rewriteSwitchStatements(statements);
rewriteSwitchBreakGotos(statements);
retainNonBlank(statements);
}
function retainNonBlank(statements) {
let write = 0;
for (let read = 0; read < statements.length; read++) {
if (statements[read].trim() !== "") {
statements[write++] = statements[read];
}
}
statements.length = write;
}