in src/transforms/deprecated-remover.ts [416:450]
public static replaceBaseClass(
typeChecker: ts.TypeChecker,
node: ts.ClassDeclaration,
baseClass: ts.ClassDeclaration | string,
) {
return new Transformation(typeChecker, node, (declaration) => {
if (!ts.isClassDeclaration(declaration)) {
throw new JsiiError(`Expected a ClassDeclaration, found a ${ts.SyntaxKind[declaration.kind]}`);
}
const { typeExpression: newBaseClass, syntheticImport } = Transformation.typeReference(
baseClass,
declaration,
typeChecker,
);
const existingClause = declaration.heritageClauses?.find(
(clause) => clause.token === ts.SyntaxKind.ExtendsKeyword,
);
return {
node: ts.factory.updateClassDeclaration(
declaration,
declaration.modifiers,
declaration.name,
declaration.typeParameters,
[
...(declaration.heritageClauses ?? []).filter((clause) => clause !== existingClause),
existingClause
? ts.factory.updateHeritageClause(existingClause, [newBaseClass])
: ts.factory.createHeritageClause(ts.SyntaxKind.ExtendsKeyword, [newBaseClass]),
],
declaration.members,
),
syntheticImports: syntheticImport && [syntheticImport],
};
});
}