UNPKG

tolkfmt-test-dev

Version:

Code formatter for the Tolk programming language

628 lines 31.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.printSourceFile = printSourceFile; exports.printVersionValue = printVersionValue; exports.printTypeAlias = printTypeAlias; exports.printFunction = printFunction; exports.printParameterList = printParameterList; exports.printParameterDeclaration = printParameterDeclaration; exports.printBuiltinSpecifier = printBuiltinSpecifier; exports.printConstantDeclaration = printConstantDeclaration; exports.printMethodDeclaration = printMethodDeclaration; exports.printGetMethodDeclaration = printGetMethodDeclaration; exports.printTolkRequiredVersion = printTolkRequiredVersion; exports.printImportDirective = printImportDirective; exports.printGlobalVarDeclaration = printGlobalVarDeclaration; exports.printStructDeclaration = printStructDeclaration; exports.printStructBody = printStructBody; exports.printStructFieldDeclaration = printStructFieldDeclaration; exports.printTypeParameters = printTypeParameters; exports.printTypeParameter = printTypeParameter; exports.printAsmBody = printAsmBody; exports.printAsmBodyRearrange = printAsmBodyRearrange; exports.printMethodReceiver = printMethodReceiver; exports.printAnnotationList = printAnnotationList; exports.printAnnotation = printAnnotation; exports.printAnnotationArguments = printAnnotationArguments; exports.printEnumDeclaration = printEnumDeclaration; exports.printEnumBody = printEnumBody; exports.printEnumMemberDeclaration = printEnumMemberDeclaration; const doc_1 = require("../doc"); const doc_2 = require("../doc"); const comments_1 = require("../comments"); const node_1 = require("./node"); const imports_1 = require("./imports"); function printSourceFile(node, ctx) { const decls = node.children.filter(it => it !== null).filter(it => it.type !== "comment"); if (ctx.sortImports) { const imports = []; const nonImports = []; for (const decl of decls) { if (decl.type === "import_directive") { imports.push(decl); } else { nonImports.push(decl); } } const importInfos = []; for (const importNode of imports) { const path = (0, imports_1.extractImportPath)(importNode); const category = (0, imports_1.categorizeImport)(path); const subcategory = (0, imports_1.getImportSubcategory)(path, category); importInfos.push({ node: importNode, path, category, subcategory, }); } const sortedImports = (0, imports_1.sortImports)(importInfos); const sortedImportNodes = sortedImports.map(info => info.node); return (0, doc_2.concat)([ printImports(sortedImportNodes, nonImports, ctx), printDeclarations(nonImports, ctx), ]); } return printDeclarations(decls, ctx); } function printImports(imports, nonImports, ctx) { const docs = []; for (const importDecl of imports) { const leading = (0, comments_1.getLeading)(importDecl, ctx.comments); if ((0, node_1.hasFmtIgnoreDirective)(leading)) { docs.push((0, node_1.printOriginalNodeText)(importDecl, ctx)); } else { const doc = (0, doc_2.concat)([(0, node_1.printNode)(importDecl, ctx) ?? (0, doc_2.empty)()]); docs.push(doc); } docs.push((0, doc_2.hardLine)()); } if (imports.length > 0 && nonImports.length > 0) { docs.push((0, doc_2.hardLine)()); } return (0, doc_2.concat)(docs); } function printDeclarations(decls, ctx) { const docs = []; for (let i = 0; i < decls.length; i++) { const decl = decls[i]; const leading = (0, comments_1.getLeading)(decl, ctx.comments); if ((0, node_1.hasFmtIgnoreDirective)(leading)) { docs.push((0, node_1.printOriginalNodeText)(decl, ctx)); } else { const doc = (0, doc_2.concat)([(0, node_1.printNode)(decl, ctx) ?? (0, doc_2.empty)()]); docs.push(doc); } if (i < decls.length - 1) { docs.push((0, doc_2.blank)((0, doc_2.blankLinesBetween)(decl, decls[i + 1], ctx.comments))); } if (i === decls.length - 1) { docs.push((0, doc_2.hardLine)()); } } return (0, doc_2.concat)(docs); } function printVersionValue(node, ctx) { const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_2.concat)([(0, doc_2.text)(" "), (0, doc_2.text)(c.text)])); return (0, doc_2.concat)([(0, doc_2.text)(node.text), ...trailing]); } function printTypeAlias(node, ctx) { const annotationsN = node.childForFieldName("annotations"); const nameN = node.childForFieldName("name"); const typeN = node.childForFieldName("underlying_type"); const typeParametersN = node.childForFieldName("type_parameters"); if (!nameN || !typeN) return undefined; const leading = (0, comments_1.takeLeading)(node, ctx.comments).map(c => (0, doc_2.concat)([(0, doc_2.text)(c.text), (0, doc_2.hardLine)()])); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_2.concat)([(0, doc_2.text)(" "), (0, doc_2.text)(c.text)])); const annotations = annotationsN ? ((0, node_1.printNode)(annotationsN, ctx) ?? (0, doc_2.empty)()) : (0, doc_2.empty)(); const name = (0, doc_2.text)(nameN.text); const typeParameters = typeParametersN ? ((0, node_1.printNode)(typeParametersN, ctx) ?? (0, doc_2.empty)()) : (0, doc_2.empty)(); const type = (0, node_1.printNode)(typeN, ctx) ?? (0, doc_2.empty)(); return (0, doc_2.concat)([ ...leading, annotations, (0, doc_2.text)("type"), (0, doc_2.text)(" "), name, typeParameters, (0, doc_2.group)([ (0, doc_2.text)(" ="), typeN.type === "union_type" ? (0, doc_2.ifBreak)(undefined, (0, doc_2.text)(" ")) : (0, doc_2.text)(" "), type, ]), ...trailing, ]); } function printFunction(node, ctx) { const annotationsN = node.childForFieldName("annotations"); const nameN = node.childForFieldName("name"); const typeParametersN = node.childForFieldName("type_parameters"); const parametersN = node.childForFieldName("parameters"); const returnTypeN = node.childForFieldName("return_type"); const specialBodyN = node.childForFieldName("asm_body") ?? node.childForFieldName("builtin_specifier"); const bodyN = node.childForFieldName("body") ?? specialBodyN; if (!nameN || !parametersN || !bodyN) return undefined; const leading = (0, comments_1.takeLeading)(node, ctx.comments).map(c => (0, doc_2.concat)([(0, doc_2.text)(c.text), (0, doc_2.hardLine)()])); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_2.concat)([(0, doc_2.text)(" "), (0, doc_2.text)(c.text)])); const annotations = annotationsN ? ((0, node_1.printNode)(annotationsN, ctx) ?? (0, doc_2.empty)()) : (0, doc_2.empty)(); const name = (0, doc_2.text)(nameN.text); const typeParameters = typeParametersN ? ((0, node_1.printNode)(typeParametersN, ctx) ?? (0, doc_2.empty)()) : (0, doc_2.empty)(); const parameters = (0, node_1.printNode)(parametersN, ctx) ?? (0, doc_2.empty)(); const body = (0, node_1.printNode)(bodyN, ctx) ?? (0, doc_2.empty)(); let returnTypePart = (0, doc_2.empty)(); if (returnTypeN) { const returnType = (0, node_1.printNode)(returnTypeN, ctx) ?? (0, doc_2.empty)(); returnTypePart = (0, doc_2.concat)([(0, doc_2.text)(": "), returnType]); } const isSpecialBody = specialBodyN !== null; return (0, doc_2.concat)([ ...leading, annotations, (0, doc_2.text)("fun "), name, typeParameters, parameters, returnTypePart, ...(isSpecialBody ? [(0, doc_2.indent)((0, doc_2.concat)([(0, doc_2.hardLine)(), body]))] : [(0, doc_2.text)(" "), body]), ...trailing, ]); } function printParameterList(node, ctx) { const params = node.namedChildren .filter(child => child?.type === "parameter_declaration") .filter(child => child !== null); if (params.length === 0) { return (0, doc_2.text)("()"); } const parts = params.map(param => (0, node_1.printNode)(param, ctx) ?? (0, doc_2.empty)()); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_2.concat)([(0, doc_2.text)(" "), (0, doc_2.text)(c.text)])); if (parts.length === 1) { return (0, doc_2.concat)([(0, doc_2.text)("("), parts[0], (0, doc_2.text)(")"), ...trailing]); } const [first, ...rest] = parts; const tailDocs = rest.map(part => (0, doc_2.concat)([(0, doc_2.text)(","), (0, doc_2.line)(), part])); return (0, doc_2.group)([ (0, doc_2.text)("("), (0, doc_2.indent)((0, doc_2.concat)([(0, doc_2.softLine)(), first, ...tailDocs])), (0, doc_2.ifBreak)((0, doc_2.text)(","), undefined), // trailing comma (0, doc_2.softLine)(), (0, doc_2.text)(")"), ...trailing, ]); } function printParameterDeclaration(node, ctx) { const mutateN = node.childForFieldName("mutate"); const nameN = node.childForFieldName("name"); const typeN = node.childForFieldName("type"); const defaultN = node.childForFieldName("default"); if (!nameN) return undefined; const name = (0, node_1.printNode)(nameN, ctx) ?? (0, doc_2.empty)(); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_2.concat)([(0, doc_2.text)(" "), (0, doc_2.text)(c.text)])); let result = [name]; if (mutateN) { result = [(0, doc_2.text)("mutate "), ...result]; } if (typeN) { const type = (0, node_1.printNode)(typeN, ctx) ?? (0, doc_2.empty)(); result = [...result, (0, doc_2.text)(": "), type]; } if (defaultN) { const defaultVal = (0, node_1.printNode)(defaultN, ctx) ?? (0, doc_2.empty)(); result = [...result, (0, doc_2.text)(" = "), defaultVal]; } return (0, doc_2.concat)([...result, ...trailing]); } function printBuiltinSpecifier(node, ctx) { const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_2.concat)([(0, doc_2.text)(" "), (0, doc_2.text)(c.text)])); return (0, doc_2.concat)([(0, doc_2.text)("builtin"), ...trailing]); } function printConstantDeclaration(node, ctx) { const annotationsN = node.childForFieldName("annotations"); const nameN = node.childForFieldName("name"); const valueN = node.childForFieldName("value"); const typeN = node.childForFieldName("type"); if (!nameN || !valueN) return undefined; const leading = (0, comments_1.takeLeading)(node, ctx.comments).map(c => (0, doc_2.concat)([(0, doc_2.text)(c.text), (0, doc_2.hardLine)()])); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_2.concat)([(0, doc_2.text)(" "), (0, doc_2.text)(c.text)])); const annotations = annotationsN ? ((0, node_1.printNode)(annotationsN, ctx) ?? (0, doc_2.empty)()) : (0, doc_2.empty)(); const name = (0, doc_2.text)(nameN.text); const value = (0, node_1.printNode)(valueN, ctx) ?? (0, doc_2.empty)(); const type = typeN ? (0, doc_2.concat)([(0, doc_2.text)(": "), (0, node_1.printNode)(typeN, ctx) ?? (0, doc_2.empty)(), (0, doc_2.text)(" ")]) : (0, doc_2.empty)(); return (0, doc_2.concat)([ ...leading, annotations, (0, doc_2.text)("const "), name, (0, doc_2.text)(" "), type, (0, doc_2.text)("= "), value, ...trailing, ]); } function printMethodDeclaration(node, ctx) { const annotationsN = node.childForFieldName("annotations"); const receiverN = node.childForFieldName("receiver"); const nameN = node.childForFieldName("name"); const typeParametersN = node.childForFieldName("type_parameters"); const parametersN = node.childForFieldName("parameters"); const returnTypeN = node.childForFieldName("return_type"); const specialBodyN = node.childForFieldName("asm_body") ?? node.childForFieldName("builtin_specifier"); const bodyN = node.childForFieldName("body") ?? specialBodyN; if (!receiverN || !nameN || !parametersN || !bodyN) return undefined; const leading = (0, comments_1.takeLeading)(node, ctx.comments).map(c => (0, doc_2.concat)([(0, doc_2.text)(c.text), (0, doc_2.hardLine)()])); const annotations = annotationsN ? ((0, node_1.printNode)(annotationsN, ctx) ?? (0, doc_2.empty)()) : (0, doc_2.empty)(); const receiver = (0, node_1.printNode)(receiverN, ctx) ?? (0, doc_2.empty)(); const name = (0, doc_2.text)(nameN.text); const typeParameters = typeParametersN ? ((0, node_1.printNode)(typeParametersN, ctx) ?? (0, doc_2.empty)()) : (0, doc_2.empty)(); const parameters = (0, node_1.printNode)(parametersN, ctx) ?? (0, doc_2.empty)(); const body = (0, node_1.printNode)(bodyN, ctx) ?? (0, doc_2.empty)(); let returnTypePart = (0, doc_2.empty)(); if (returnTypeN) { const returnType = (0, node_1.printNode)(returnTypeN, ctx) ?? (0, doc_2.empty)(); returnTypePart = (0, doc_2.concat)([(0, doc_2.text)(": "), returnType]); } const isSpecialBody = specialBodyN !== null; return (0, doc_2.concat)([ ...leading, annotations, (0, doc_2.text)("fun "), receiver, name, typeParameters, parameters, returnTypePart, ...(isSpecialBody ? [(0, doc_2.indent)((0, doc_2.concat)([(0, doc_2.hardLine)(), body]))] : [(0, doc_2.text)(" "), body]), ]); } function printGetMethodDeclaration(node, ctx) { const annotationsN = node.childForFieldName("annotations"); const nameN = node.childForFieldName("name"); const parametersN = node.childForFieldName("parameters"); const returnTypeN = node.childForFieldName("return_type"); const specialBodyN = node.childForFieldName("asm_body") ?? node.childForFieldName("builtin_specifier"); const bodyN = node.childForFieldName("body"); if (!nameN || !parametersN || !bodyN) return undefined; const leading = (0, comments_1.takeLeading)(node, ctx.comments).map(c => (0, doc_2.concat)([(0, doc_2.text)(c.text), (0, doc_2.hardLine)()])); const annotations = annotationsN ? ((0, node_1.printNode)(annotationsN, ctx) ?? (0, doc_2.empty)()) : (0, doc_2.empty)(); const name = (0, doc_2.text)(nameN.text); const parameters = (0, node_1.printNode)(parametersN, ctx) ?? (0, doc_2.empty)(); const body = (0, node_1.printNode)(bodyN, ctx) ?? (0, doc_2.empty)(); let returnTypePart = (0, doc_2.empty)(); if (returnTypeN) { const returnType = (0, node_1.printNode)(returnTypeN, ctx) ?? (0, doc_2.empty)(); returnTypePart = (0, doc_2.concat)([(0, doc_2.text)(": "), returnType]); } const isSpecialBody = specialBodyN !== null; return (0, doc_2.concat)([ ...leading, annotations, (0, doc_2.text)("get fun "), name, parameters, returnTypePart, ...(isSpecialBody ? [(0, doc_2.indent)((0, doc_2.concat)([(0, doc_2.hardLine)(), body]))] : [(0, doc_2.text)(" "), body]), ]); } function printTolkRequiredVersion(node, ctx) { const valueN = node.childForFieldName("value"); if (!valueN) return undefined; const value = (0, node_1.printNode)(valueN, ctx) ?? (0, doc_2.empty)(); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_2.concat)([(0, doc_2.text)(" "), (0, doc_2.text)(c.text)])); return (0, doc_2.concat)([(0, doc_2.text)("tolk "), value, ...trailing]); } function printImportDirective(node, ctx) { const pathN = node.childForFieldName("path"); if (!pathN) return undefined; const leading = (0, comments_1.takeLeading)(node, ctx.comments).map(c => (0, doc_2.concat)([(0, doc_2.text)(c.text), (0, doc_2.hardLine)()])); const path = (0, node_1.printNode)(pathN, ctx) ?? (0, doc_2.empty)(); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_2.concat)([(0, doc_2.text)(" "), (0, doc_2.text)(c.text)])); return (0, doc_2.concat)([...leading, (0, doc_2.text)("import "), path, ...trailing]); } function printGlobalVarDeclaration(node, ctx) { const annotationsN = node.childForFieldName("annotations"); const nameN = node.childForFieldName("name"); const typeN = node.childForFieldName("type"); if (!nameN || !typeN) return undefined; const leading = (0, comments_1.takeLeading)(node, ctx.comments).map(c => (0, doc_2.concat)([(0, doc_2.text)(c.text), (0, doc_2.hardLine)()])); const annotations = annotationsN ? ((0, node_1.printNode)(annotationsN, ctx) ?? (0, doc_2.empty)()) : (0, doc_2.empty)(); const name = (0, node_1.printNode)(nameN, ctx) ?? (0, doc_2.empty)(); const type = (0, node_1.printNode)(typeN, ctx) ?? (0, doc_2.empty)(); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_2.concat)([(0, doc_2.text)(" "), (0, doc_2.text)(c.text)])); return (0, doc_2.concat)([...leading, annotations, (0, doc_2.text)("global "), name, (0, doc_2.text)(": "), type, ...trailing]); } function printStructDeclaration(node, ctx) { const annotationsN = node.childForFieldName("annotations"); const nameN = node.childForFieldName("name"); const bodyN = node.childForFieldName("body"); const typeParametersN = node.childForFieldName("type_parameters"); const packPrefixN = node.childForFieldName("pack_prefix"); if (!nameN) return undefined; const leading = (0, comments_1.takeLeading)(node, ctx.comments).map(c => (0, doc_2.concat)([(0, doc_2.text)(c.text), (0, doc_2.hardLine)()])); const annotations = annotationsN ? ((0, node_1.printNode)(annotationsN, ctx) ?? (0, doc_2.empty)()) : (0, doc_2.empty)(); const name = (0, node_1.printNode)(nameN, ctx) ?? (0, doc_2.empty)(); const body = bodyN ? ((0, node_1.printNode)(bodyN, ctx) ?? (0, doc_2.empty)()) : (0, doc_2.empty)(); const typeParameters = typeParametersN ? ((0, node_1.printNode)(typeParametersN, ctx) ?? (0, doc_2.empty)()) : (0, doc_2.empty)(); const packPrefix = packPrefixN ? (0, doc_2.concat)([(0, doc_2.text)("("), (0, node_1.printNode)(packPrefixN, ctx) ?? (0, doc_2.empty)(), (0, doc_2.text)(") ")]) : (0, doc_2.empty)(); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_2.concat)([(0, doc_2.text)(" "), (0, doc_2.text)(c.text)])); return (0, doc_2.concat)([ ...leading, annotations, (0, doc_2.text)("struct "), packPrefix, name, typeParameters, (0, doc_2.text)(" "), body, ...trailing, ]); } function printStructBody(node, ctx) { const fields = node.namedChildren .filter(child => child?.type === "struct_field_declaration") .filter(child => child !== null); if (fields.length === 0) { return (0, doc_2.text)("{}"); } const parts = fields.map(field => (0, node_1.printNode)(field, ctx) ?? (0, doc_2.empty)()); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_2.concat)([(0, doc_2.text)(" "), (0, doc_2.text)(c.text)])); const [first, ...rest] = parts; const tailDocs = rest.map(part => (0, doc_2.concat)([(0, doc_2.hardLine)(), part])); return (0, doc_2.concat)([ (0, doc_2.text)("{"), (0, doc_2.indent)((0, doc_2.concat)([(0, doc_2.hardLine)(), first, ...tailDocs])), (0, doc_2.hardLine)(), (0, doc_2.text)("}"), ...trailing, ]); } function printModifiers(modifiers) { if (!modifiers) return undefined; const modifiersList = modifiers.children .map(it => it?.text ?? "") .filter(it => it === "readonly" || it === "private"); if (modifiersList.length === 0) return undefined; let result = ""; if (modifiersList.includes("private")) { result += "private "; } if (modifiersList.includes("readonly")) { result += "readonly "; } return (0, doc_2.text)(result); } function printStructFieldDeclaration(node, ctx) { const modifiersN = node.childForFieldName("modifiers"); const nameN = node.childForFieldName("name"); const typeN = node.childForFieldName("type"); const defaultN = node.childForFieldName("default"); if (!nameN || !typeN) return undefined; const modifiers = printModifiers(modifiersN) ?? (0, doc_2.empty)(); const name = (0, node_1.printNode)(nameN, ctx) ?? (0, doc_2.empty)(); const type = (0, node_1.printNode)(typeN, ctx) ?? (0, doc_2.empty)(); const defaultVal = defaultN ? ((0, node_1.printNode)(defaultN, ctx) ?? (0, doc_2.empty)()) : (0, doc_2.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_2.concat)([(0, doc_2.text)(" "), (0, doc_2.text)(c.text)])); let result = [modifiers, name, (0, doc_2.text)(": "), type]; if (defaultVal.$ !== "Empty") { result = [...result, (0, doc_2.text)(" = "), defaultVal]; } return (0, doc_2.concat)([...leadingDoc, ...result, ...trailing]); } function printTypeParameters(node, ctx) { const params = node.namedChildren .filter(child => child?.type === "type_parameter") .filter(child => child !== null); if (params.length === 0) { return (0, doc_2.text)("<>"); } const parts = params.map(param => (0, node_1.printNode)(param, ctx) ?? (0, doc_2.empty)()); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_2.concat)([(0, doc_2.text)(" "), (0, doc_2.text)(c.text)])); if (parts.length === 1) { return (0, doc_2.concat)([(0, doc_2.text)("<"), parts[0], (0, doc_2.text)(">"), ...trailing]); } const [first, ...rest] = parts; const tailDocs = rest.map(part => (0, doc_2.concat)([(0, doc_2.text)(", "), part])); return (0, doc_2.concat)([(0, doc_2.text)("<"), first, ...tailDocs, (0, doc_2.text)(">"), ...trailing]); } function printTypeParameter(node, ctx) { const nameN = node.childForFieldName("name"); const defaultN = node.childForFieldName("default"); if (!nameN) return undefined; const name = (0, node_1.printNode)(nameN, ctx) ?? (0, doc_2.empty)(); const defaultVal = defaultN ? ((0, node_1.printNode)(defaultN, ctx) ?? (0, doc_2.empty)()) : (0, doc_2.empty)(); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_2.concat)([(0, doc_2.text)(" "), (0, doc_2.text)(c.text)])); let result = [name]; if (defaultVal.$ !== "Empty") { result = [...result, (0, doc_2.text)(" = "), defaultVal]; } return (0, doc_2.concat)([...result, ...trailing]); } function printAsmBody(node, ctx) { const leading = (0, comments_1.takeLeading)(node, ctx.comments).map(c => (0, doc_2.concat)([(0, doc_2.text)(c.text), (0, doc_2.hardLine)()])); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_2.concat)([(0, doc_2.text)(" "), (0, doc_2.text)(c.text)])); const rearrange = node.childForFieldName("rearrange"); const rearrangeDoc = rearrange ? (printAsmBodyRearrange(rearrange, ctx) ?? (0, doc_2.empty)()) : (0, doc_2.empty)(); const strings = node.namedChildren .filter(child => child?.type === "string_literal") .filter(child => child !== null); const stringParts = strings.flatMap(str => { const strTrailing = (0, comments_1.takeTrailing)(str, ctx.comments).map(c => (0, doc_2.concat)([(0, doc_2.text)(" "), (0, doc_2.text)(c.text), (0, doc_1.breakParent)()])); return [(0, doc_2.line)(), (0, node_1.printNode)(str, ctx) ?? (0, doc_2.empty)(), ...strTrailing]; }); return (0, doc_2.concat)([...leading, (0, doc_2.text)("asm"), rearrangeDoc, (0, doc_2.group)([...stringParts, ...trailing])]); } function printAsmBodyRearrange(node, _ctx) { const params = node.childForFieldName("params"); const returnTypes = node.childForFieldName("return"); const parts = [(0, doc_2.text)("(")]; if (params) { const paramNodes = params.namedChildren .filter(child => child?.type === "identifier") .filter(child => child !== null); const paramParts = paramNodes.map((param, index) => index > 0 ? (0, doc_2.concat)([(0, doc_2.text)(" "), (0, doc_2.text)(param.text)]) : (0, doc_2.text)(param.text)); parts.push(...paramParts); } if (returnTypes) { parts.push((0, doc_2.text)(" -> ")); const returnNodes = returnTypes.namedChildren .filter(child => child?.type === "number_literal") .filter(child => child !== null); const returnParts = returnNodes.map((ret, index) => index > 0 ? (0, doc_2.concat)([(0, doc_2.text)(" "), (0, doc_2.text)(ret.text)]) : (0, doc_2.text)(ret.text)); parts.push(...returnParts); } parts.push((0, doc_2.text)(")")); return (0, doc_2.concat)(parts); } function printMethodReceiver(node, ctx) { const receiverTypeN = node.childForFieldName("receiver_type"); if (!receiverTypeN) return undefined; const receiverType = (0, node_1.printNode)(receiverTypeN, ctx) ?? (0, doc_2.empty)(); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_2.concat)([(0, doc_2.text)(" "), (0, doc_2.text)(c.text)])); return (0, doc_2.concat)([receiverType, (0, doc_2.text)("."), ...trailing]); } function printAnnotationList(node, ctx) { const annotations = node.namedChildren .filter(child => child?.type === "annotation") .filter(child => child !== null); if (annotations.length === 0) { return (0, doc_2.empty)(); } const parts = annotations.map(annotation => (0, node_1.printNode)(annotation, ctx) ?? (0, doc_2.empty)()); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_2.concat)([(0, doc_2.text)(" "), (0, doc_2.text)(c.text)])); if (trailing.length > 0 && parts.length === 1) { // @foo // comment // fun foo() {} return (0, doc_2.concat)([parts[0], ...trailing, (0, doc_2.hardLine)()]); } const docs = []; for (const [index, part] of parts.entries()) { docs.push(part); if (index === parts.length - 1) { docs.push(...trailing, (0, doc_2.hardLine)()); } else { docs.push((0, doc_2.hardLine)()); } } return (0, doc_2.concat)(docs); } function printAnnotation(node, ctx) { const nameN = node.childForFieldName("name"); const argumentsN = node.childForFieldName("arguments"); const name = nameN ? ((0, node_1.printNode)(nameN, ctx) ?? (0, doc_2.empty)()) : (0, doc_2.empty)(); const args = argumentsN ? ((0, node_1.printNode)(argumentsN, ctx) ?? (0, doc_2.empty)()) : (0, doc_2.empty)(); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).flatMap(c => [(0, doc_2.text)(" "), (0, doc_2.text)(c.text)]); return (0, doc_2.concat)([(0, doc_2.text)("@"), name, args, ...trailing]); } function printAnnotationArguments(node, ctx) { const exprs = node.namedChildren .filter(child => child?.type !== "," && child?.type !== "(" && child?.type !== ")") .filter(child => child !== null); if (exprs.length === 0) { return (0, doc_2.text)("()"); } const parts = exprs.map(expr => (0, node_1.printNode)(expr, ctx) ?? (0, doc_2.empty)()); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_2.concat)([(0, doc_2.text)(" "), (0, doc_2.text)(c.text)])); if (parts.length === 1) { return (0, doc_2.concat)([(0, doc_2.text)("("), parts[0], (0, doc_2.text)(")"), ...trailing]); } const [first, ...rest] = parts; const tailDocs = rest.map(part => (0, doc_2.concat)([(0, doc_2.text)(", "), part])); return (0, doc_2.group)([ (0, doc_2.text)("("), (0, doc_2.indent)((0, doc_2.concat)([(0, doc_2.softLine)(), first, ...tailDocs])), (0, doc_2.softLine)(), (0, doc_2.text)(")"), ...trailing, ]); } function printEnumDeclaration(node, ctx) { const annotationsN = node.childForFieldName("annotations"); const nameN = node.childForFieldName("name"); const backedTypeN = node.childForFieldName("backed_type"); const bodyN = node.childForFieldName("body"); if (!nameN) return undefined; const leading = (0, comments_1.takeLeading)(node, ctx.comments).map(c => (0, doc_2.concat)([(0, doc_2.text)(c.text), (0, doc_2.hardLine)()])); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_2.concat)([(0, doc_2.text)(" "), (0, doc_2.text)(c.text)])); const annotations = annotationsN ? ((0, node_1.printNode)(annotationsN, ctx) ?? (0, doc_2.empty)()) : (0, doc_2.empty)(); const name = (0, doc_2.text)(nameN.text); const body = bodyN ? ((0, node_1.printNode)(bodyN, ctx) ?? (0, doc_2.empty)()) : (0, doc_2.empty)(); let backedTypePart = (0, doc_2.empty)(); if (backedTypeN) { const backedType = (0, node_1.printNode)(backedTypeN, ctx) ?? (0, doc_2.empty)(); backedTypePart = (0, doc_2.concat)([(0, doc_2.text)(": "), backedType]); } const hasBody = bodyN !== null; return (0, doc_2.concat)([ ...leading, annotations, (0, doc_2.text)("enum "), name, backedTypePart, ...(hasBody ? [(0, doc_2.text)(" "), body] : []), ...trailing, ]); } function printEnumBody(node, ctx) { const members = node.namedChildren .filter(child => child?.type === "enum_member_declaration") .filter(child => child !== null); if (members.length === 0) { return (0, doc_2.text)("{}"); } const parts = members.map(member => (0, node_1.printNode)(member, ctx) ?? (0, doc_2.empty)()); const trailing = (0, comments_1.takeTrailing)(node, ctx.comments).map(c => (0, doc_2.concat)([(0, doc_2.text)(" "), (0, doc_2.text)(c.text)])); if (parts.length === 1) { return (0, doc_2.concat)([(0, doc_2.text)("{"), parts[0], (0, doc_2.text)("}"), ...trailing]); } const [first, ...rest] = parts; const tailDocs = rest.map(part => (0, doc_2.concat)([(0, doc_2.text)(","), (0, doc_2.hardLine)(), part])); return (0, doc_2.concat)([ (0, doc_2.text)("{"), (0, doc_2.indent)((0, doc_2.concat)([(0, doc_2.hardLine)(), first, ...tailDocs])), (0, doc_2.text)(","), // trailing comma (0, doc_2.hardLine)(), (0, doc_2.text)("}"), ...trailing, ]); } function printEnumMemberDeclaration(node, ctx) { const nameN = node.childForFieldName("name"); const defaultN = node.childForFieldName("default"); if (!nameN) return undefined; const name = (0, doc_2.text)(nameN.text); const defaultVal = defaultN ? ((0, node_1.printNode)(defaultN, ctx) ?? (0, doc_2.empty)()) : (0, doc_2.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_2.concat)([(0, doc_2.text)(" "), (0, doc_2.text)(c.text)])); let result = [name]; if (defaultVal.$ !== "Empty") { result = [...result, (0, doc_2.text)(" = "), defaultVal]; } return (0, doc_2.concat)([...leadingDoc, ...result, ...trailing]); } //# sourceMappingURL=decls.js.map