tolkfmt-test-dev
Version:
Code formatter for the Tolk programming language
466 lines • 23.1 kB
JavaScript
"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.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.softLine)(),
(0, doc_3.text)(" ? "),
consequence,
(0, doc_3.softLine)(),
(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 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