MCPcopy Create free account
hub / github.com/zenstackhq/zenstack / format

Method format

packages/language/src/zmodel-formatter.ts:17–64  ·  view source on GitHub ↗
(node: AstNode)

Source from the content-addressed store, hash-verified

15 }
16
17 protected format(node: AstNode): void {
18 const formatter = this.getNodeFormatter(node);
19
20 if (ast.isDataField(node)) {
21 if (ast.isDataModel(node.$container) || ast.isTypeDef(node.$container)) {
22 const dataModel = node.$container;
23
24 const compareFn = (a: number, b: number) => b - a;
25 const maxNameLength = dataModel.fields.map((x) => x.name.length).sort(compareFn)[0] ?? 0;
26 const maxTypeLength = dataModel.fields.map(this.getFieldTypeLength).sort(compareFn)[0] ?? 0;
27
28 formatter.property('type').prepend(Formatting.spaces(maxNameLength - node.name.length + 1));
29 if (node.attributes.length > 0) {
30 formatter
31 .node(node.attributes[0]!)
32 .prepend(Formatting.spaces(maxTypeLength - this.getFieldTypeLength(node) + 1));
33
34 formatter.nodes(...node.attributes.slice(1)).prepend(Formatting.oneSpace());
35 }
36 } else {
37 formatter.property('type').prepend(Formatting.oneSpace());
38 if (node.attributes.length > 0) {
39 formatter.properties('attributes').prepend(Formatting.oneSpace());
40 }
41 }
42 } else if (ast.isDataFieldAttribute(node)) {
43 formatter.keyword('(').surround(Formatting.noSpace());
44 formatter.keyword(')').prepend(Formatting.noSpace());
45 formatter.keyword(',').append(Formatting.oneSpace());
46 if (node.args.length > 1) {
47 formatter.nodes(...node.args.slice(1)).prepend(Formatting.oneSpace());
48 }
49 } else if (ast.isAttributeArg(node)) {
50 formatter.keyword(':').prepend(Formatting.noSpace());
51 formatter.keyword(':').append(Formatting.oneSpace());
52 } else if (ast.isAbstractDeclaration(node)) {
53 const bracesOpen = formatter.keyword('{');
54 const bracesClose = formatter.keyword('}');
55 // allow extra blank lines between declarations
56 formatter.interior(bracesOpen, bracesClose).prepend(Formatting.indent({ allowMore: true }));
57 bracesOpen.prepend(Formatting.oneSpace());
58 bracesClose.prepend(Formatting.newLine());
59 } else if (ast.isModel(node)) {
60 const model = node as ast.Model;
61 const nodes = formatter.nodes(...model.declarations);
62 nodes.prepend(Formatting.noIndent());
63 }
64 }
65
66 override formatDocument(
67 document: LangiumDocument<AstNode>,

Callers 1

formatActionFunction · 0.80

Calls 2

getFieldTypeLengthMethod · 0.95
indentMethod · 0.80

Tested by

no test coverage detected