@Override
  public void process(Node externs, Node root) {
    NodeTraversal.traverseRoots(compiler, new CollectUndeclaredNames(), externs, root);
    NodeTraversal.traverseRoots(compiler, this, externs, root);
    NodeTraversal.traverseRoots(compiler, new RenameReferences(), externs, root);

    LoopClosureTransformer transformer = new LoopClosureTransformer();
    NodeTraversal.traverseRoots(compiler, transformer, externs, root);
    transformer.transformLoopClosure();
    varify();
    NodeTraversal.traverseRoots(
        compiler, new RewriteBlockScopedFunctionDeclaration(), externs, root);
  }
 /** Convenience method for running this pass over a tree with this class as a callback. */
 @Override
 public void process(Node externs, Node root) {
   NodeTraversal.traverseRoots(compiler, this, externs, root);
 }
 @Override
 public void process(Node externs, Node root) {
   NodeTraversal.traverseRoots(compiler, this, externs, root);
   NodeTraversal.traverseEs6(compiler, root, new NonExternChecks());
 }
 static void traverseRootsTyped(AbstractCompiler compiler, Callback cb, Node externs, Node root) {
   NodeTraversal t = new NodeTraversal(compiler, cb, SyntacticScopeCreator.makeTyped(compiler));
   t.traverseRoots(externs, root);
 }
 public static void traverseRoots(
     AbstractCompiler compiler, Callback cb, Node externs, Node root) {
   NodeTraversal t = new NodeTraversal(compiler, cb);
   t.traverseRoots(externs, root);
 }
 /**
  * Convenience method for running this pass over a tree with this
  * class as a callback.
  */
 @Override
 public void process(Node externs, Node root) {
   NodeTraversal.traverseRoots(
       compiler, Lists.newArrayList(externs, root), this);
 }