tolkfmt-test-dev
Version:
Code formatter for the Tolk programming language
100 lines • 4.93 kB
JavaScript
;
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