private visitClassLikeHelper()

in lib/declaration.ts [903:941]


  private visitClassLikeHelper(
      keyword: string, decl: base.ClassLike|ts.TypeLiteralNode, name: ts.Identifier,
      typeParameters: ts.NodeArray<ts.TypeParameterDeclaration>,
      heritageClauses: ts.NodeArray<ts.HeritageClause>) {
    this.emit(keyword);
    this.visitClassLikeName(name, typeParameters, heritageClauses, false);
    this.emit('{');

    this.maybeEmitFakeConstructors(decl);

    // Synthesize explicit properties for ctor with 'property parameters'
    let synthesizePropertyParam = (param: ts.ParameterDeclaration) => {
      if (this.hasModifierFlag(param, ts.ModifierFlags.Public) ||
          this.hasModifierFlag(param, ts.ModifierFlags.Private) ||
          this.hasModifierFlag(param, ts.ModifierFlags.Protected)) {
        // TODO: we should enforce the underscore prefix on privates
        this.visitProperty(param, true);
      }
    };
    (decl.members as ts.NodeArray<ts.Declaration>)
        .filter(base.isConstructor)
        .forEach(
            (ctor) =>
                (<ts.ConstructorDeclaration>ctor).parameters.forEach(synthesizePropertyParam));

    this.visitClassBody(decl, name);
    this.emit('}\n');
    if (this.promiseMembers.length) {
      const visitName = () => {
        this.visitClassLikeName(name, typeParameters, ts.createNodeArray(), false);
      };
      const visitNameOfExtensions = () => {
        this.visitClassLikeName(name, typeParameters, ts.createNodeArray(), true);
      };
      this.emitMembersAsExtensions(decl, visitName, visitNameOfExtensions, this.promiseMembers);
      this.promiseMembers = [];
    }
    this.emit('\n');
  }