public override classDeclaration()

in src/languages/python.ts [568:605]


  public override classDeclaration(node: ts.ClassDeclaration, context: PythonVisitorContext): OTree {
    const allHeritageClauses = Array.from(node.heritageClauses ?? []).flatMap((h) => Array.from(h.types));

    // List of booleans matching `allHeritage` array
    const isJsii = allHeritageClauses.map(
      (e) =>
        fmap(context.typeOfExpression(e.expression), (type) => isJsiiProtocolType(context.typeChecker, type)) ?? false,
    );

    const jsiiImplements = allHeritageClauses.filter((_, i) => isJsii[i]);

    const inlineHeritage = allHeritageClauses.filter((_, i) => !isJsii[i]);
    const hasHeritage = inlineHeritage.length > 0;

    const members = context.updateContext({ inClass: true }).convertAll(node.members);
    if (members.length === 0) {
      members.push(new OTree(['\npass'], []));
    }

    const ret = new OTree(
      [
        ...jsiiImplements.flatMap((i) => ['@jsii.implements(', context.convert(i.expression), ')\n']),
        'class ',
        node.name ? context.textOf(node.name) : '???',
        hasHeritage ? '(' : '',
        ...inlineHeritage.map((t) => context.convert(t.expression)),
        hasHeritage ? ')' : '',
        ': ',
      ],
      members,
      {
        indent: 4,
        canBreakLine: true,
      },
    );

    return ret;
  }