in src/transforms/deprecated-remover.ts [539:600]
private static typeReference(
type: ts.ClassDeclaration | ts.InterfaceDeclaration | string,
context: ts.ClassDeclaration | ts.InterfaceDeclaration,
typeChecker: ts.TypeChecker,
): {
typeExpression: ts.ExpressionWithTypeArguments;
syntheticImport?: ts.ImportDeclaration;
} {
context = ts.getOriginalNode(context) as any;
const [, contextSource] = /^"([^"]+)"\..*$/.exec(
typeChecker.getFullyQualifiedName(typeChecker.getSymbolAtLocation(ts.getNameOfDeclaration(context)!)!),
)!;
let expression: ts.Expression;
let syntheticImport: ts.ImportDeclaration | undefined;
if (typeof type === 'string') {
const [root, ...tail] = type.split('.');
const syntheticImportName = ts.factory.createUniqueName(root);
syntheticImport = ts.factory.createImportDeclaration(
undefined /* decorators */,
ts.factory.createImportClause(false, undefined, ts.factory.createNamespaceImport(syntheticImportName)),
ts.factory.createStringLiteral(root),
);
expression = tail.reduce(
(curr, elt) => ts.factory.createPropertyAccessExpression(curr, elt),
syntheticImportName as ts.Expression,
);
} else {
const [, typeSource, qualifiedName] = /^"([^"]+)"\.(.*)$/.exec(
typeChecker.getFullyQualifiedName(typeChecker.getSymbolAtLocation(ts.getNameOfDeclaration(type)!)!),
)!;
if (typeSource === contextSource) {
const [root, ...tail] = qualifiedName.split('.');
expression = tail.reduce(
(curr, elt) => ts.factory.createPropertyAccessExpression(curr, elt),
ts.factory.createIdentifier(root) as ts.Expression,
);
} else {
const syntheticImportName = ts.factory.createUniqueName(basename(typeSource));
syntheticImport = ts.factory.createImportDeclaration(
undefined /* modifiers */,
ts.factory.createImportClause(false, undefined, ts.factory.createNamespaceImport(syntheticImportName)),
ts.factory.createStringLiteral(`./${relative(dirname(contextSource), typeSource)}`),
undefined,
);
expression = qualifiedName
.split('.')
.reduce(
(curr, elt) => ts.factory.createPropertyAccessExpression(curr, elt),
syntheticImportName as ts.Expression,
);
}
}
return {
typeExpression: ts.factory.createExpressionWithTypeArguments(expression, undefined),
syntheticImport,
};
}