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