private static typeReference()

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