in src/languages/go.ts [658:688]
public override classDeclaration(node: ts.ClassDeclaration, renderer: AstRenderer<GoLanguageContext>): OTree {
const className = node.name
? renderer.updateContext({ isExported: isExported(node) }).convert(node.name)
: 'anonymous';
const extendsClause = node.heritageClauses?.find((clause) => clause.token === ts.SyntaxKind.ExtendsKeyword);
const base = extendsClause && this.renderTypeNode(extendsClause.types[0], false, renderer);
const properties = node.members
.filter(ts.isPropertyDeclaration)
.map((prop) => renderer.updateContext({ isStruct: true, isPtr: true }).convert(prop));
const struct = new OTree(['type ', className, ' struct {'], [...(base ? ['\n', base] : []), ...properties], {
canBreakLine: true,
suffix: properties.length > 0 ? renderer.mirrorNewlineBefore(node.members[0], '}') : '\n}',
indent: 1,
});
const methods = [
node.members.length > 0
? // Ensure there is a blank line between thre struct and the first member, but don't put two if there's already
// one as part of the first member's leading trivia.
new OTree(['\n\n'], [], { renderOnce: `ws-${node.members[0].getFullStart()}` })
: '',
...renderer.convertAll(
node.members.filter((member) => !ts.isPropertyDeclaration(member) || (isExported(node) && !isPrivate(member))),
),
];
return new OTree([struct], methods, { canBreakLine: true });
}