(node: AstNode)
| 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>, |
no test coverage detected