/** ^(A B C): emit create A, create B, add child, ... */
 protected void simulateTreeConstruction(Object t) {
   dbg.createNode(t);
   int n = adaptor.getChildCount(t);
   for (int i = 0; i < n; i++) {
     Object child = adaptor.getChild(t, i);
     simulateTreeConstruction(child);
     dbg.addChild(t, child);
   }
 }
 public Object errorNode(TokenStream input, Token start, Token stop, RecognitionException e) {
   Object node = adaptor.errorNode(input, start, stop, e);
   if (node != null) {
     dbg.errorNode(node);
   }
   return node;
 }
 public void addChild(Object t, Object child) {
   if (t == null || child == null) {
     return;
   }
   adaptor.addChild(t, child);
   dbg.addChild(t, child);
 }
 public Object dupTree(Object tree) {
   Object t = adaptor.dupTree(tree);
   // walk the tree and emit create and add child events
   // to simulate what dupTree has done. dupTree does not call this debug
   // adapter so I must simulate.
   simulateTreeConstruction(t);
   return t;
 }
 public Object create(Token payload) {
   if (payload.getTokenIndex() < 0) {
     // could be token conjured up during error recovery
     return create(payload.getType(), payload.getText());
   }
   Object node = adaptor.create(payload);
   dbg.createNode(node, payload);
   return node;
 }
 public int getChildCount(Object t) {
   return adaptor.getChildCount(t);
 }
 public void setChild(Object t, int i, Object child) {
   adaptor.setChild(t, i, child);
 }
 public Object rulePostProcessing(Object root) {
   return adaptor.rulePostProcessing(root);
 }
 public void setChildIndex(Object t, int index) {
   adaptor.setChildIndex(t, index);
 }
 public int getChildIndex(Object t) {
   return adaptor.getChildIndex(t);
 }
 public String getText(Object t) {
   return adaptor.getText(t);
 }
 public void setType(Object t, int type) {
   adaptor.setType(t, type);
 }
 public int getType(Object t) {
   return adaptor.getType(t);
 }
 public Object create(int tokenType, String text) {
   Object node = adaptor.create(tokenType, text);
   dbg.createNode(node);
   return node;
 }
 public Object create(int tokenType, Token fromToken) {
   Object node = adaptor.create(tokenType, fromToken);
   dbg.createNode(node);
   return node;
 }
 public Object becomeRoot(Token newRoot, Object oldRoot) {
   Object n = this.create(newRoot);
   adaptor.becomeRoot(n, oldRoot);
   dbg.becomeRoot(newRoot, oldRoot);
   return n;
 }
 public int getUniqueID(Object node) {
   return adaptor.getUniqueID(node);
 }
 public Object getParent(Object t) {
   return adaptor.getParent(t);
 }
 public void setText(Object t, String text) {
   adaptor.setText(t, text);
 }
 public void setParent(Object t, Object parent) {
   adaptor.setParent(t, parent);
 }
 public Token getToken(Object t) {
   return adaptor.getToken(t);
 }
 public void replaceChildren(Object parent, int startChildIndex, int stopChildIndex, Object t) {
   adaptor.replaceChildren(parent, startChildIndex, stopChildIndex, t);
 }
 public Object dupNode(Object treeNode) {
   Object d = adaptor.dupNode(treeNode);
   dbg.createNode(d);
   return d;
 }
 public void setTokenBoundaries(Object t, Token startToken, Token stopToken) {
   adaptor.setTokenBoundaries(t, startToken, stopToken);
   if (t != null && startToken != null && stopToken != null) {
     dbg.setTokenBoundaries(t, startToken.getTokenIndex(), stopToken.getTokenIndex());
   }
 }
 public Object becomeRoot(Object newRoot, Object oldRoot) {
   Object n = adaptor.becomeRoot(newRoot, oldRoot);
   dbg.becomeRoot(newRoot, oldRoot);
   return n;
 }
 public int getTokenStopIndex(Object t) {
   return adaptor.getTokenStopIndex(t);
 }
 public Object getChild(Object t, int i) {
   return adaptor.getChild(t, i);
 }
 public Object nil() {
   Object node = adaptor.nil();
   dbg.nilNode(node);
   return node;
 }
 public boolean isNil(Object tree) {
   return adaptor.isNil(tree);
 }