public static removeInterface()

in src/transforms/deprecated-remover.ts [470:528]


  public static removeInterface(
    typeChecker: ts.TypeChecker,
    node: ts.ClassDeclaration | ts.InterfaceDeclaration,
    iface: ts.InterfaceDeclaration,
  ) {
    const ifaceName = Transformation.fullyQualifiedName(typeChecker, iface)!;

    return new Transformation(typeChecker, node, (declaration) => {
      if (ts.isClassDeclaration(declaration)) {
        return {
          node: ts.factory.updateClassDeclaration(
            declaration,
            declaration.modifiers,
            declaration.name,
            declaration.typeParameters,
            removeInterfaceHeritage(declaration.heritageClauses),
            declaration.members,
          ),
        };
      } else if (ts.isInterfaceDeclaration(declaration)) {
        return {
          node: ts.factory.updateInterfaceDeclaration(
            declaration,
            declaration.modifiers,
            declaration.name,
            declaration.typeParameters,
            removeInterfaceHeritage(declaration.heritageClauses),
            declaration.members,
          ),
        };
      }
      throw new JsiiError(
        `Expected a ClassDeclaration or InterfaceDeclaration, found a ${ts.SyntaxKind[declaration.kind]}`,
      );
    });

    function removeInterfaceHeritage(
      clauses: readonly ts.HeritageClause[] | undefined,
    ): ts.HeritageClause[] | undefined {
      if (clauses == null) {
        return clauses;
      }
      return clauses
        .map((clause) => {
          const types = clause.types.filter(
            (type) => Transformation.fullyQualifiedName(typeChecker, type.expression) !== ifaceName,
          );
          if (types.length === clause.types.length) {
            // Means the interface was only transitively present...
            return clause;
          }
          if (types.length === 0) {
            return undefined;
          }
          return ts.factory.updateHeritageClause(clause, types);
        })
        .filter((clause) => clause != null) as ts.HeritageClause[];
    }
  }