private emitMembersAsExtensions()

in lib/declaration.ts [1052:1109]


  private emitMembersAsExtensions(
      classDecl: ts.ObjectTypeDeclaration, visitClassName: () => void,
      visitNameOfExtensions: () => void, methods: ts.SignatureDeclaration[]) {
    this.visitPromises = true;
    this.fc.emitPromisesAsFutures = false;
    // Emit private class containing external methods
    this.maybeEmitJsAnnotation(classDecl, {suppressUnneededPaths: false});
    this.emit(`abstract class _`);
    visitClassName();
    this.emit('{');
    const mergedMembers = this.visitMergingOverloads(ts.createNodeArray(Array.from(methods)));
    this.emit('}\n');
    this.fc.emitPromisesAsFutures = true;

    // Emit extensions on public class to expose methods
    this.emit('extension');
    visitNameOfExtensions();
    this.emit('on');
    visitClassName();
    this.emit('{');
    for (const merged of mergedMembers) {
      const declaration = merged.mergedDeclaration;
      if (ts.isPropertyDeclaration(declaration) || ts.isPropertySignature(declaration)) {
        this.emitProperty({
          mode: emitPropertyMode.getter,
          declaration,
          emitJsAnnotation: false,
          isExternal: false,
          emitBody: () => {
            this.emitCastThisToPrivateClass(visitClassName);
            this.emitExtensionGetterBody(declaration);
          }
        });
        if (!base.isReadonly(declaration)) {
          this.emitProperty({
            mode: emitPropertyMode.setter,
            declaration,
            emitJsAnnotation: false,
            isExternal: false,
            emitBody: () => {
              this.emitCastThisToPrivateClass(visitClassName);
              this.emitExtensionSetterBody(declaration);
            }
          });
        }
      } else if (ts.isMethodDeclaration(declaration) || ts.isMethodSignature(declaration)) {
        this.visit(declaration.type);
        this.visitName(declaration.name);
        this.visitParameters(declaration.parameters, {namesOnly: false});
        this.emit('{');
        this.emitCastThisToPrivateClass(visitClassName);
        this.emitExtensionMethodBody(merged);
        this.emit('}\n');
      }
    }
    this.emit('}\n');
    this.visitPromises = false;
  }