51 lines
1.6 KiB
TypeScript
51 lines
1.6 KiB
TypeScript
import { AstCreator, Stmt } from "../ast.ts";
|
|
import { AstVisitor, VisitRes, visitStmt, visitStmts } from "../ast_visitor.ts";
|
|
|
|
export class CompoundAssignDesugarer implements AstVisitor {
|
|
public constructor(private astCreator: AstCreator) {}
|
|
|
|
public desugar(stmts: Stmt[]) {
|
|
visitStmts(stmts, this);
|
|
}
|
|
|
|
visitAssignStmt(stmt: Stmt): VisitRes {
|
|
if (stmt.kind.type !== "assign") {
|
|
throw new Error();
|
|
}
|
|
switch (stmt.kind.assignType) {
|
|
case "=":
|
|
return;
|
|
case "+=": {
|
|
stmt.kind = {
|
|
type: "assign",
|
|
assignType: "=",
|
|
subject: stmt.kind.subject,
|
|
value: this.astCreator.expr({
|
|
type: "binary",
|
|
binaryType: "+",
|
|
left: stmt.kind.subject,
|
|
right: stmt.kind.value,
|
|
}, stmt.kind.value.pos),
|
|
};
|
|
visitStmt(stmt, this);
|
|
return "stop";
|
|
}
|
|
case "-=": {
|
|
stmt.kind = {
|
|
type: "assign",
|
|
assignType: "=",
|
|
subject: stmt.kind.subject,
|
|
value: this.astCreator.expr({
|
|
type: "binary",
|
|
binaryType: "-",
|
|
left: stmt.kind.subject,
|
|
right: stmt.kind.value,
|
|
}, stmt.kind.value.pos),
|
|
};
|
|
visitStmt(stmt, this);
|
|
return "stop";
|
|
}
|
|
}
|
|
}
|
|
}
|