constructor(idGenerator, reporter, tree,
              scopeBuilder = undefined, latestScope = undefined) {
    super();
    this.idGenerator_ = idGenerator;
    this.reporter_ = reporter;
    if (!scopeBuilder) {
      scopeBuilder = new ScopeChainBuilderWithReferences(reporter);
      scopeBuilder.visitAny(tree);
    }
    this.scopeBuilder_ = scopeBuilder;

    this.labelledLoops_ = new Map(); // of {loopTree: labelName}
    this.prependStatement_ = [];
    this.prependBlockStatement_ = [];
    this.blockRenames_ = [];
    this.rootTree_ = tree;
    if (latestScope) {
      this.scope_ = latestScope;
    } else {
      this.pushScope(tree);
    }
    this.usedVars_ = this.scope_.getAllBindingNames();
    this.maybeRename_ = false;
    this.inObjectPattern_ = false;
    this.currentLoopTree_ = null;
  }
BlockBindingTransformer class takes care of transforming the block bindings
of a function Scope to ES5. It creates a new instance of itself for every
new function/script it encounters.