public override classDeclaration()

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 });
  }