UNPKG

tolkfmt-test-dev

Version:

Code formatter for the Tolk programming language

100 lines 4.93 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.printUnionType = printUnionType; exports.printNullableType = printNullableType; exports.printParenthesizedType = printParenthesizedType; exports.printTensorType = printTensorType; exports.printTupleType = printTupleType; exports.printFunCallableType = printFunCallableType; const comments_1 = require("../comments"); const doc_1 = require("../doc"); const node_1 = require("./node"); function printUnionType(node, ctx) { const parts = unionTypeParts(node).map(it => (0, node_1.printNode)(it, ctx) ?? (0, doc_1.empty)()); const [first, ...rest] = parts; const firstDoc = (0, doc_1.concat)([(0, doc_1.ifBreak)((0, doc_1.text)("| "), undefined), first]); const tailDocs = rest.map(v => (0, doc_1.concat)([(0, doc_1.line)(), (0, doc_1.text)("| "), v])); return (0, doc_1.group)([(0, doc_1.indent)((0, doc_1.concat)([(0, doc_1.softLine)(), firstDoc, ...tailDocs]))]); } const unionTypeParts = (node) => { const lhs = node.childForFieldName("lhs"); const rhs = node.childForFieldName("rhs"); if (!lhs || !rhs) return []; if (rhs.type === "union_type") { const rhsTypes = unionTypeParts(rhs); return [lhs, ...rhsTypes]; } return [lhs, rhs]; }; function printNullableType(node, ctx) { const innerN = node.childForFieldName("inner"); if (!innerN) return undefined; const inner = (0, node_1.printNode)(innerN, ctx) ?? (0, doc_1.empty)(); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_1.concat)([(0, doc_1.text)(" "), (0, doc_1.text)(c.text)])); return (0, doc_1.concat)([inner, (0, doc_1.text)("?"), ...trailing]); } function printParenthesizedType(node, ctx) { const innerN = node.childForFieldName("inner"); if (!innerN) return undefined; const inner = (0, node_1.printNode)(innerN, ctx) ?? (0, doc_1.empty)(); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_1.concat)([(0, doc_1.text)(" "), (0, doc_1.text)(c.text)])); return (0, doc_1.concat)([(0, doc_1.text)("("), inner, (0, doc_1.text)(")"), ...trailing]); } function printTensorType(node, ctx) { const types = node.namedChildren .filter(child => child?.type !== "," && child?.type !== "(" && child?.type !== ")") .filter(child => child !== null); if (types.length === 0) { return (0, doc_1.text)("()"); } const parts = types.map(type => (0, node_1.printNode)(type, ctx) ?? (0, doc_1.empty)()); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_1.concat)([(0, doc_1.text)(" "), (0, doc_1.text)(c.text)])); if (parts.length === 1) { return (0, doc_1.concat)([(0, doc_1.text)("("), parts[0], (0, doc_1.text)(")"), ...trailing]); } const [first, ...rest] = parts; const tailDocs = rest.map(part => (0, doc_1.concat)([(0, doc_1.text)(", "), part])); return (0, doc_1.group)([ (0, doc_1.text)("("), (0, doc_1.indent)((0, doc_1.concat)([(0, doc_1.softLine)(), first, ...tailDocs])), (0, doc_1.softLine)(), (0, doc_1.text)(")"), ...trailing, ]); } function printTupleType(node, ctx) { const types = node.namedChildren .filter(child => child?.type !== "," && child?.type !== "[" && child?.type !== "]") .filter(child => child !== null); if (types.length === 0) { return (0, doc_1.text)("[]"); } const parts = types.map(type => (0, node_1.printNode)(type, ctx) ?? (0, doc_1.empty)()); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_1.concat)([(0, doc_1.text)(" "), (0, doc_1.text)(c.text)])); if (parts.length === 1) { return (0, doc_1.concat)([(0, doc_1.text)("["), parts[0], (0, doc_1.text)("]"), ...trailing]); } const [first, ...rest] = parts; const tailDocs = rest.map(part => (0, doc_1.concat)([(0, doc_1.text)(", "), part])); return (0, doc_1.group)([ (0, doc_1.text)("["), (0, doc_1.indent)((0, doc_1.concat)([(0, doc_1.softLine)(), first, ...tailDocs])), (0, doc_1.softLine)(), (0, doc_1.text)("]"), ...trailing, ]); } function printFunCallableType(node, ctx) { const paramTypesN = node.childForFieldName("param_types"); const returnTypeN = node.childForFieldName("return_type"); if (!paramTypesN || !returnTypeN) return undefined; const paramTypes = (0, node_1.printNode)(paramTypesN, ctx) ?? (0, doc_1.empty)(); const returnType = (0, node_1.printNode)(returnTypeN, ctx) ?? (0, doc_1.empty)(); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_1.concat)([(0, doc_1.text)(" "), (0, doc_1.text)(c.text)])); return (0, doc_1.concat)([paramTypes, (0, doc_1.text)(" -> "), returnType, ...trailing]); } //# sourceMappingURL=types.js.map