UNPKG

tolkfmt-test-dev

Version:

Code formatter for the Tolk programming language

475 lines 24 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.printNumberLiteral = void 0; exports.printDotAccess = printDotAccess; exports.printFunctionCall = printFunctionCall; exports.printBinaryExpression = printBinaryExpression; exports.printIdentifier = printIdentifier; exports.printStringLiteral = printStringLiteral; exports.printBooleanLiteral = printBooleanLiteral; exports.printNullLiteral = printNullLiteral; exports.printUnderscore = printUnderscore; exports.printUnaryOperator = printUnaryOperator; exports.printParenthesizedExpression = printParenthesizedExpression; exports.printTensorExpression = printTensorExpression; exports.printTypedTuple = printTypedTuple; exports.printCastAsOperator = printCastAsOperator; exports.printIsTypeOperator = printIsTypeOperator; exports.printNotNullOperator = printNotNullOperator; exports.printLazyExpression = printLazyExpression; exports.printTernaryOperator = printTernaryOperator; exports.printArgumentList = printArgumentList; exports.printCallArgument = printCallArgument; exports.printObjectLiteral = printObjectLiteral; exports.printObjectLiteralBody = printObjectLiteralBody; exports.printInstanceArgument = printInstanceArgument; exports.printTypeInstantiatedTs = printTypeInstantiatedTs; exports.printGenericInstantiation = printGenericInstantiation; exports.printInstantiationTList = printInstantiationTList; exports.printMatchExpression = printMatchExpression; exports.printMatchBody = printMatchBody; exports.printMatchArm = printMatchArm; exports.printLambdaExpression = printLambdaExpression; exports.printNumericIndex = printNumericIndex; const node_1 = require("./node"); const doc_1 = require("../doc"); const doc_2 = require("../doc"); const doc_3 = require("../doc"); const comments_1 = require("../comments"); function printDotAccess(node, ctx) { const qualifierN = node.childForFieldName("obj"); const fieldN = node.childForFieldName("field"); if (!qualifierN || !fieldN) return undefined; const qualifier = (0, node_1.printNode)(qualifierN, ctx) ?? (0, doc_3.empty)(); const field = (0, doc_3.text)(fieldN.text); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_3.concat)([(0, doc_3.text)(" "), (0, doc_3.text)(c.text), (0, doc_2.breakParent)()])); const leadingField = (0, comments_1.takeLeading)(fieldN, ctx.comments); const leadingFieldDoc = (0, node_1.formatLeading)(leadingField); if (qualifierN.type === "object_literal" && leadingFieldDoc.length === 0) { // don't add extra newline // Foo { // ... // }.toCell() // ^ here return (0, doc_3.group)([qualifier, (0, doc_3.text)("."), field, ...trailing]); } return (0, doc_3.group)([ qualifier, (0, doc_3.indent)((0, doc_3.concat)([(0, doc_3.softLine)(), ...leadingFieldDoc, (0, doc_3.text)("."), field, ...trailing])), ]); } function printFunctionCall(node, ctx) { const calleeN = node.childForFieldName("callee"); const argumentsN = node.childForFieldName("arguments"); if (!calleeN || !argumentsN) return undefined; const callee = (0, node_1.printNode)(calleeN, ctx) ?? (0, doc_3.empty)(); const args = (0, node_1.printNode)(argumentsN, ctx) ?? (0, doc_3.empty)(); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_3.concat)([(0, doc_3.text)(" "), (0, doc_3.text)(c.text), (0, doc_2.breakParent)()])); return (0, doc_3.concat)([callee, args, ...trailing]); } function printBinaryExpression(node, ctx) { const leftN = node.child(0); const operatorN = node.childForFieldName("operator_name"); const rightN = node.child(node.childCount - 1); if (!leftN || !operatorN || !rightN) return undefined; const left = (0, node_1.printNode)(leftN, ctx) ?? (0, doc_3.empty)(); const right = (0, node_1.printNode)(rightN, ctx) ?? (0, doc_3.empty)(); const operator = operatorN.text; const leading = (0, comments_1.takeLeading)(node, ctx.comments); const leadingDoc = (0, node_1.formatLeading)(leading); const trailingForLeft = (0, comments_1.takeTrailing)(leftN, ctx.comments).map(c => (0, doc_3.concat)([(0, doc_3.text)(" "), (0, doc_2.lineSuffix)((0, doc_3.text)(c.text)), (0, doc_2.breakParent)()])); const trailing = node.parent?.type === "binary_operator" ? [] : (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_3.concat)([(0, doc_3.text)(" "), (0, doc_2.lineSuffix)((0, doc_3.text)(c.text))])); return (0, doc_3.group)([ ...leadingDoc, left, (0, doc_3.text)(" " + operator), ...trailingForLeft, (0, doc_3.line)(), (0, doc_3.group)([right]), ...trailing, ]); } function printIdentifier(node, ctx) { return printTextCommon(node, ctx); } const printNumberLiteral = (node, ctx) => { return printTextCommon(node, ctx); }; exports.printNumberLiteral = printNumberLiteral; function printStringLiteral(node, ctx) { return printTextCommon(node, ctx); } function printBooleanLiteral(node, ctx) { return printTextCommon(node, ctx); } function printNullLiteral(node, ctx) { return printTextCommon(node, ctx); } function printUnderscore(node, ctx) { return printTextCommon(node, ctx); } function printTextCommon(node, ctx) { const leading = (0, comments_1.takeLeading)(node, ctx.comments); const leadingDoc = (0, node_1.formatLeading)(leading); return (0, doc_3.concat)([...leadingDoc, (0, doc_3.text)(node.text)]); } function printUnaryOperator(node, ctx) { const operatorN = node.childForFieldName("operator_name"); const argumentN = node.childForFieldName("argument"); if (!operatorN || !argumentN) return undefined; const operator = operatorN.text; const argument = (0, node_1.printNode)(argumentN, ctx) ?? (0, doc_3.empty)(); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_3.concat)([(0, doc_3.text)(" "), (0, doc_3.text)(c.text)])); return (0, doc_3.concat)([(0, doc_3.text)(operator), argument, ...trailing]); } function printParenthesizedExpression(node, ctx) { const innerN = node.childForFieldName("inner"); if (!innerN) return undefined; const inner = (0, node_1.printNode)(innerN, ctx) ?? (0, doc_3.empty)(); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_3.concat)([(0, doc_3.text)(" "), (0, doc_3.text)(c.text)])); return (0, doc_3.concat)([(0, doc_3.text)("("), inner, (0, doc_3.text)(")"), ...trailing]); } function printTensorExpression(node, ctx) { const expressions = node.namedChildren .filter(child => child?.type !== "," && child?.type !== "(" && child?.type !== ")") .filter(child => child !== null); if (expressions.length === 0) { return (0, doc_3.text)("()"); } const parts = expressions.map(expr => (0, node_1.printNode)(expr, ctx) ?? (0, doc_3.empty)()); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_3.concat)([(0, doc_3.text)(" "), (0, doc_3.text)(c.text)])); if (parts.length === 1) { return (0, doc_3.concat)([(0, doc_3.text)("("), parts[0], (0, doc_3.text)(")"), ...trailing]); } const [first, ...rest] = parts; const tailDocs = rest.map(part => (0, doc_3.concat)([(0, doc_3.text)(","), (0, doc_3.line)(), part])); return (0, doc_3.group)([ (0, doc_3.text)("("), (0, doc_3.indent)((0, doc_3.concat)([(0, doc_3.softLine)(), first, ...tailDocs])), (0, doc_3.softLine)(), (0, doc_3.text)(")"), ...trailing, ]); } function printTypedTuple(node, ctx) { const expressions = node.namedChildren .filter(child => child?.type !== "," && child?.type !== "[" && child?.type !== "]") .filter(child => child !== null); if (expressions.length === 0) { return (0, doc_3.text)("[]"); } const parts = expressions.map(expr => (0, node_1.printNode)(expr, ctx) ?? (0, doc_3.empty)()); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_3.concat)([(0, doc_3.text)(" "), (0, doc_3.text)(c.text)])); if (parts.length === 1) { return (0, doc_3.concat)([(0, doc_3.text)("["), parts[0], (0, doc_3.text)("]"), ...trailing]); } const [first, ...rest] = parts; const tailDocs = rest.map(part => (0, doc_3.concat)([(0, doc_3.text)(","), (0, doc_3.line)(), part])); return (0, doc_3.group)([ (0, doc_3.text)("["), (0, doc_3.indent)((0, doc_3.concat)([(0, doc_3.softLine)(), first, ...tailDocs])), (0, doc_3.softLine)(), (0, doc_3.text)("]"), ...trailing, ]); } function printCastAsOperator(node, ctx) { const exprN = node.childForFieldName("expr"); const castedToN = node.childForFieldName("casted_to"); if (!exprN || !castedToN) return undefined; const expr = (0, node_1.printNode)(exprN, ctx) ?? (0, doc_3.empty)(); const castedTo = (0, node_1.printNode)(castedToN, ctx) ?? (0, doc_3.empty)(); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_3.concat)([(0, doc_3.text)(" "), (0, doc_3.text)(c.text)])); return (0, doc_3.concat)([expr, (0, doc_3.text)(" as "), castedTo, ...trailing]); } function printIsTypeOperator(node, ctx) { const exprN = node.childForFieldName("expr"); const operatorN = node.childForFieldName("operator"); const rhsTypeN = node.childForFieldName("rhs_type"); if (!exprN || !operatorN || !rhsTypeN) return undefined; const expr = (0, node_1.printNode)(exprN, ctx) ?? (0, doc_3.empty)(); const operator = operatorN.text; const rhsType = (0, node_1.printNode)(rhsTypeN, ctx) ?? (0, doc_3.empty)(); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_3.concat)([(0, doc_3.text)(" "), (0, doc_3.text)(c.text)])); return (0, doc_3.concat)([expr, (0, doc_3.text)(" "), (0, doc_3.text)(operator), (0, doc_3.text)(" "), rhsType, ...trailing]); } function printNotNullOperator(node, ctx) { const innerN = node.childForFieldName("inner"); if (!innerN) return undefined; const inner = (0, node_1.printNode)(innerN, ctx) ?? (0, doc_3.empty)(); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_3.concat)([(0, doc_3.text)(" "), (0, doc_3.text)(c.text)])); return (0, doc_3.concat)([inner, (0, doc_3.text)("!"), ...trailing]); } function printLazyExpression(node, ctx) { const argumentN = node.childForFieldName("argument"); if (!argumentN) return undefined; const argument = (0, node_1.printNode)(argumentN, ctx) ?? (0, doc_3.empty)(); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_3.concat)([(0, doc_3.text)(" "), (0, doc_3.text)(c.text)])); return (0, doc_3.concat)([(0, doc_3.text)("lazy "), argument, ...trailing]); } function printTernaryOperator(node, ctx) { const conditionN = node.childForFieldName("condition"); const consequenceN = node.childForFieldName("consequence"); const alternativeN = node.childForFieldName("alternative"); if (!conditionN || !consequenceN || !alternativeN) return undefined; const condition = (0, node_1.printNode)(conditionN, ctx) ?? (0, doc_3.empty)(); const consequence = (0, node_1.printNode)(consequenceN, ctx) ?? (0, doc_3.empty)(); const alternative = (0, node_1.printNode)(alternativeN, ctx) ?? (0, doc_3.empty)(); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_3.concat)([(0, doc_3.text)(" "), (0, doc_3.text)(c.text)])); return (0, doc_3.group)([ condition, (0, doc_3.indent)((0, doc_3.concat)([(0, doc_3.line)(), (0, doc_3.text)("? "), consequence, (0, doc_3.line)(), (0, doc_3.text)(": "), alternative, ...trailing])), ]); } function printArgumentList(node, ctx) { const args = node.namedChildren .filter(child => child?.type === "call_argument") .filter(child => child !== null); if (args.length === 0) { return (0, doc_3.text)("()"); } const parts = args.map(arg => (0, node_1.printNode)(arg, ctx) ?? (0, doc_3.empty)()); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_3.concat)([(0, doc_3.text)(" "), (0, doc_3.text)(c.text)])); if (parts.length === 1) { return (0, doc_3.concat)([(0, doc_3.text)("("), parts[0], (0, doc_3.text)(")"), ...trailing]); } const [first, ...rest] = parts; const tailDocs = rest.map(part => (0, doc_3.concat)([(0, doc_3.text)(","), (0, doc_3.line)(), part])); return (0, doc_3.group)([ (0, doc_3.text)("("), (0, doc_3.indent)((0, doc_3.concat)([(0, doc_3.softLine)(), first, ...tailDocs])), (0, doc_3.softLine)(), (0, doc_3.text)(")"), ...trailing, ]); } function printCallArgument(node, ctx) { const exprN = node.childForFieldName("expr"); if (!exprN) return undefined; const expr = (0, node_1.printNode)(exprN, ctx) ?? (0, doc_3.empty)(); const leading = (0, comments_1.takeLeading)(node, ctx.comments); const leadingDoc = (0, node_1.formatLeading)(leading); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_3.concat)([(0, doc_3.text)(" "), (0, doc_3.text)(c.text)])); // Check if there's a "mutate" keyword const mutateNode = node.children.find(child => child?.text === "mutate"); if (mutateNode) { return (0, doc_3.concat)([(0, doc_3.text)("mutate "), expr, ...trailing]); } return (0, doc_3.concat)([...leadingDoc, expr, ...trailing]); } function printObjectLiteral(node, ctx) { const typeN = node.childForFieldName("type"); const argumentsN = node.childForFieldName("arguments"); if (!argumentsN) return undefined; const type = typeN ? (0, doc_3.concat)([(0, node_1.printNode)(typeN, ctx) ?? (0, doc_3.empty)(), (0, doc_3.text)(" ")]) : (0, doc_3.empty)(); const args = (0, node_1.printNode)(argumentsN, ctx) ?? (0, doc_3.empty)(); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_3.concat)([(0, doc_3.text)(" "), (0, doc_3.text)(c.text)])); return (0, doc_3.concat)([type, args, ...trailing]); } function printObjectLiteralBody(node, ctx) { const args = node.namedChildren .filter(child => child?.type === "instance_argument") .filter(child => child !== null); if (args.length === 1) { // Check if this is actually an empty object const [singleArg] = args; // If the argument is empty or just whitespace, treat as empty object if (singleArg.text.trim() === "") { return (0, doc_3.text)("{}"); } } if (args.length === 0) { return (0, doc_3.text)("{}"); } const parts = []; for (const [index, arg] of args.entries()) { parts.push(printInstanceArgument(arg, ctx, index === args.length - 1) ?? (0, doc_3.empty)()); } const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_3.concat)([(0, doc_3.text)(" "), (0, doc_3.text)(c.text), (0, doc_2.breakParent)()])); const [first, ...rest] = parts; if (parts.length <= 2) { const tailDocs = rest.flatMap(part => [(0, doc_3.line)(), part]); return (0, doc_3.group)([ (0, doc_3.text)("{"), (0, doc_3.indent)((0, doc_3.concat)([(0, doc_3.line)(), first, ...tailDocs])), (0, doc_3.line)(), (0, doc_3.text)("}"), ...trailing, ]); } const tailDocs = rest.map(part => (0, doc_3.concat)([(0, doc_3.hardLine)(), part])); return (0, doc_3.group)([ (0, doc_3.text)("{"), (0, doc_3.indent)((0, doc_3.concat)([(0, doc_3.hardLine)(), first, ...tailDocs])), (0, doc_3.hardLine)(), (0, doc_3.text)("}"), ...trailing, ]); } function printInstanceArgument(node, ctx, isLast = false) { const nameN = node.childForFieldName("name"); const valueN = node.childForFieldName("value"); if (!nameN) return undefined; const name = (0, node_1.printNode)(nameN, ctx) ?? (0, doc_3.empty)(); const leading = (0, comments_1.takeLeading)(node, ctx.comments); const leadingDoc = (0, node_1.formatLeading)(leading); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_3.concat)([(0, doc_3.text)(" "), (0, doc_3.text)(c.text), (0, doc_2.breakParent)()])); const comma = (0, doc_1.ifBreak)((0, doc_3.text)(","), isLast ? undefined : (0, doc_3.text)(",")); // Check if there's a colon in the node const hasColon = node.children.some(child => child?.text === ":"); if (hasColon) { if (valueN) { if (valueN.type === "identifier" && nameN.text === valueN.text) { // format `{ foo: foo }` as `{ foo }` return (0, doc_3.concat)([...leadingDoc, name, comma, ...trailing]); } const value = (0, node_1.printNode)(valueN, ctx) ?? (0, doc_3.empty)(); return (0, doc_3.concat)([...leadingDoc, name, (0, doc_3.text)(": "), value, comma, ...trailing]); } else { // case like {foo:} return (0, doc_3.concat)([...leadingDoc, name, (0, doc_3.text)(":"), comma, ...trailing]); } } else { // case like {foo} without colon return (0, doc_3.concat)([...leadingDoc, name, comma, ...trailing]); } } function printTypeInstantiatedTs(node, ctx) { const nameN = node.childForFieldName("name"); const argumentsN = node.childForFieldName("arguments"); if (!nameN || !argumentsN) return undefined; const name = (0, node_1.printNode)(nameN, ctx) ?? (0, doc_3.empty)(); const args = (0, node_1.printNode)(argumentsN, ctx) ?? (0, doc_3.empty)(); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_3.concat)([(0, doc_3.text)(" "), (0, doc_3.text)(c.text)])); return (0, doc_3.concat)([name, args, ...trailing]); } function printGenericInstantiation(node, ctx) { const exprN = node.childForFieldName("expr"); const instantiationTsN = node.childForFieldName("instantiationTs"); if (!exprN || !instantiationTsN) return undefined; const expr = (0, node_1.printNode)(exprN, ctx) ?? (0, doc_3.empty)(); const instantiationTs = (0, node_1.printNode)(instantiationTsN, ctx) ?? (0, doc_3.empty)(); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_3.concat)([(0, doc_3.text)(" "), (0, doc_3.text)(c.text)])); return (0, doc_3.concat)([expr, instantiationTs, ...trailing]); } function printInstantiationTList(node, ctx) { const typesN = node .childrenForFieldName("types") .filter(it => it !== null) .filter(child => child.type !== "," && child.type !== "<" && child.type !== ">"); const parts = typesN.map(type => (0, node_1.printNode)(type, ctx) ?? (0, doc_3.empty)()); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_3.concat)([(0, doc_3.text)(" "), (0, doc_3.text)(c.text)])); if (parts.length === 1) { return (0, doc_3.concat)([(0, doc_3.text)("<"), parts[0], (0, doc_3.text)(">"), ...trailing]); } const [first, ...rest] = parts; const tailDocs = rest.map(part => (0, doc_3.concat)([(0, doc_3.text)(", "), part])); return (0, doc_3.group)([(0, doc_3.text)("<"), first, ...tailDocs, (0, doc_3.text)(">"), ...trailing]); } function printMatchExpression(node, ctx) { const exprN = node.childForFieldName("expr"); const bodyN = node.childForFieldName("body"); if (!exprN) return undefined; const expr = (0, node_1.printNode)(exprN, ctx) ?? (0, doc_3.empty)(); const body = bodyN ? ((0, node_1.printNode)(bodyN, ctx) ?? (0, doc_3.empty)()) : (0, doc_3.text)("{}"); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_3.concat)([(0, doc_3.text)(" "), (0, doc_3.text)(c.text)])); return (0, doc_3.concat)([(0, doc_3.text)("match ("), expr, (0, doc_3.text)(") "), body, ...trailing]); } function printMatchBody(node, ctx) { const arms = node.namedChildren .filter(child => child?.type === "match_arm") .filter(child => child !== null); if (arms.length === 0) { return (0, doc_3.text)("{}"); } const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_3.concat)([(0, doc_3.text)(" "), (0, doc_3.text)(c.text)])); const tailDocs = []; for (let i = 0; i < arms.length; i++) { const arm = arms[i]; const leading = (0, comments_1.takeLeading)(arm, ctx.comments).map(c => (0, doc_3.concat)([(0, doc_3.text)(c.text), (0, doc_3.hardLine)()])); const doc = (0, doc_3.concat)([...leading, (0, node_1.printNode)(arm, ctx) ?? (0, doc_3.empty)()]); tailDocs.push(doc); if (i < arms.length - 1) { tailDocs.push((0, doc_3.blank)((0, doc_3.blankLinesBetween)(arm, arms[i + 1], ctx.comments))); } } return (0, doc_3.concat)([ (0, doc_3.text)("{"), (0, doc_3.indent)((0, doc_3.concat)([(0, doc_3.hardLine)(), ...tailDocs])), (0, doc_3.hardLine)(), (0, doc_3.text)("}"), ...trailing, ]); } function printMatchArm(node, ctx) { const patternTypeN = node.childForFieldName("pattern_type"); const patternExprN = node.childForFieldName("pattern_expr"); const patternElseN = node.childForFieldName("pattern_else"); const bodyBlockN = node.childForFieldName("block"); const bodyN = bodyBlockN ?? node.childForFieldName("return") ?? node.childForFieldName("throw") ?? node.childForFieldName("expr"); if (!bodyN) return undefined; const body = (0, node_1.printNode)(bodyN, ctx) ?? (0, doc_3.empty)(); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_3.concat)([(0, doc_3.text)(" "), (0, doc_3.text)(c.text)])); let pattern = (0, doc_3.empty)(); if (patternTypeN) { pattern = (0, node_1.printNode)(patternTypeN, ctx) ?? (0, doc_3.empty)(); } else if (patternExprN) { pattern = (0, node_1.printNode)(patternExprN, ctx) ?? (0, doc_3.empty)(); } else if (patternElseN) { pattern = (0, doc_3.text)("else"); } return (0, doc_3.concat)([ pattern, (0, doc_3.text)(" => "), body, bodyN.id === bodyBlockN?.id ? (0, doc_3.empty)() : (0, doc_3.text)(","), // add `,` after arm only for non-blocks ...trailing, ]); } function printLambdaExpression(node, ctx) { const parametersN = node.childForFieldName("parameters"); const returnTypeN = node.childForFieldName("return_type"); const bodyN = node.childForFieldName("body"); if (!parametersN || !bodyN) return undefined; const parameters = (0, node_1.printNode)(parametersN, ctx) ?? (0, doc_3.empty)(); const body = (0, node_1.printNode)(bodyN, ctx) ?? (0, doc_3.empty)(); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_3.concat)([(0, doc_3.text)(" "), (0, doc_3.text)(c.text)])); let returnTypePart = (0, doc_3.empty)(); if (returnTypeN) { const returnType = (0, node_1.printNode)(returnTypeN, ctx) ?? (0, doc_3.empty)(); returnTypePart = (0, doc_3.concat)([(0, doc_3.text)(": "), returnType]); } return (0, doc_3.concat)([(0, doc_3.text)("fun"), parameters, returnTypePart, (0, doc_3.text)(" "), body, ...trailing]); } function printNumericIndex(node, ctx) { const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_3.concat)([(0, doc_3.text)(" "), (0, doc_3.text)(c.text)])); return (0, doc_3.concat)([(0, doc_3.text)(node.text), ...trailing]); } //# sourceMappingURL=expr.js.map