/**
  * Creates a new scope (e.g. when entering a function).
  *
  * @param quietly Don't fire an enterScope callback.
  */
 private void pushScope(Scope s, boolean quietly) {
   Preconditions.checkState(curNode != null);
   compiler.setScope(s.getRootNode());
   scopes.push(s);
   if (NodeUtil.isValidCfgRoot(s.getRootNode())) {
     cfgs.push(null);
   }
   if (!quietly && scopeCallback != null) {
     scopeCallback.enterScope(this);
   }
 }
 /** Creates a new scope (e.g. when entering a function). */
 private void pushScope(Node node) {
   Preconditions.checkState(curNode != null);
   compiler.setScope(node);
   scopeRoots.push(node);
   if (NodeUtil.isValidCfgRoot(node)) {
     cfgRoots.push(node);
     cfgs.push(null);
   }
   if (scopeCallback != null) {
     scopeCallback.enterScope(this);
   }
 }
 /**
  * Pops back to the previous scope (e.g. when leaving a function).
  *
  * @param quietly Don't fire the exitScope callback.
  */
 private void popScope(boolean quietly) {
   if (!quietly && scopeCallback != null) {
     scopeCallback.exitScope(this);
   }
   Node scopeRoot;
   if (scopeRoots.isEmpty()) {
     scopeRoot = scopes.pop().getRootNode();
   } else {
     scopeRoot = scopeRoots.pop();
   }
   if (NodeUtil.isValidCfgRoot(scopeRoot)) {
     cfgs.pop();
     if (!cfgRoots.isEmpty()) {
       Preconditions.checkState(cfgRoots.pop() == scopeRoot);
     }
   }
   if (hasScope()) {
     compiler.setScope(getScopeRoot());
   }
 }