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[];
}
}