UNPKG

@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
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); }