tolkfmt-test-dev
Version:
Code formatter for the Tolk programming language
513 lines • 26.1 kB
JavaScript
"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.printMethodReceiver = printMethodReceiver;
exports.printAnnotationList = printAnnotationList;
exports.printAnnotation = printAnnotation;
exports.printAnnotationArguments = printAnnotationArguments;
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 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]);
}
return (0, doc_2.concat)([
...leading,
annotations,
(0, doc_2.text)("get fun "),
name,
parameters,
returnTypePart,
(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 printStructFieldDeclaration(node, ctx) {
const nameN = node.childForFieldName("name");
const typeN = node.childForFieldName("type");
const defaultN = node.childForFieldName("default");
if (!nameN || !typeN)
return undefined;
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 = [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 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"), (0, doc_2.group)([...stringParts, ...trailing])]);
}
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,
]);
}
//# sourceMappingURL=decls.js.map