public static addInterface()

in src/transforms/deprecated-remover.ts [358:414]


  public static addInterface(
    typeChecker: ts.TypeChecker,
    node: ts.ClassDeclaration | ts.InterfaceDeclaration,
    iface: ts.InterfaceDeclaration | string,
  ) {
    return new Transformation(typeChecker, node, (declaration) => {
      if (!ts.isClassDeclaration(declaration) && !ts.isInterfaceDeclaration(declaration)) {
        throw new JsiiError(
          `Expected a ClassDeclaration or InterfaceDeclaration, found a ${ts.SyntaxKind[declaration.kind]}`,
        );
      }

      const { typeExpression: newInterface, syntheticImport } = Transformation.typeReference(
        iface,
        declaration,
        typeChecker,
      );
      if (ts.isClassDeclaration(declaration)) {
        return {
          node: ts.factory.updateClassDeclaration(
            declaration,
            declaration.modifiers,
            declaration.name,
            declaration.typeParameters,
            addInterfaceTo(ts.SyntaxKind.ImplementsKeyword, declaration.heritageClauses),
            declaration.members,
          ),
          syntheticImport,
        };
      }
      return {
        node: ts.factory.updateInterfaceDeclaration(
          declaration,
          declaration.modifiers,
          declaration.name,
          declaration.typeParameters,
          addInterfaceTo(ts.SyntaxKind.ExtendsKeyword, declaration.heritageClauses),
          declaration.members,
        ),
        syntheticImport,
      };

      function addInterfaceTo(
        token: ts.HeritageClause['token'],
        clauses: readonly ts.HeritageClause[] = [],
      ): ts.HeritageClause[] {
        const existingClause = clauses.find((clause) => clause.token === token);
        if (existingClause == null) {
          return [...clauses, ts.factory.createHeritageClause(token, [newInterface])];
        }
        return [
          ...clauses.filter((clause) => clause !== existingClause),
          ts.factory.updateHeritageClause(existingClause, [...existingClause.types, newInterface]),
        ];
      }
    });
  }