@flowscripter/mpeg-sdl-parser
Version:
ISO/IEC 14496-34 Syntactic Description Language (MPEG SDL) parser implemented in TypeScript
65 lines (54 loc) • 1.9 kB
text/typescript
import { AstPath, type Doc, doc } from "prettier";
import type { AbstractNode } from "../ast/node/AbstractNode";
import type { IfStatement } from "../ast/node/IfStatement";
import { getDocWithTrivia } from "./print_utils";
import { StatementKind } from "../ast/node/enum/statement_kind";
const { hardline, indent, join } = doc.builders;
export function printIfStatement(
path: AstPath<IfStatement>,
print: (_path: AstPath<AbstractNode>) => Doc,
): Doc {
const ifStatement = path.node;
const elements = [];
elements.push(getDocWithTrivia(ifStatement.ifKeyword));
const subElements = [];
subElements.push(
getDocWithTrivia(ifStatement.openParenthesisPunctuator),
path.call(print, "condition"),
getDocWithTrivia(ifStatement.closeParenthesisPunctuator),
);
elements.push(subElements);
const ifSubStatement = ifStatement.ifStatement;
if (ifSubStatement.statementKind !== StatementKind.COMPOUND) {
elements.push(indent([hardline, path.call(print, "ifStatement")]));
} else {
elements.push(path.call(print, "ifStatement"));
}
if (ifStatement.elseKeyword !== undefined) {
elements.push([hardline, getDocWithTrivia(ifStatement.elseKeyword)]);
const elseSubStatement = ifStatement.elseStatement!;
if (elseSubStatement.statementKind === StatementKind.IF) {
elements.push(
path.call(
print,
"elseStatement" as keyof IfStatement["elseStatement"],
),
);
} else if (elseSubStatement.statementKind !== StatementKind.COMPOUND) {
elements.push(indent(
[
hardline,
path.call(
print,
"elseStatement" as keyof IfStatement["elseStatement"],
),
],
));
} else {
elements.push(
path.call(print, "elseStatement" as keyof IfStatement["elseStatement"]),
);
}
}
return join(" ", elements);
}