docs: private void traverse(GroovySourceAST t,List l,Iterator itr) {
           while (t != null) {
               // first visit of node
               if (l != null) {
                   l.add(new LineColumn(t.getLine(),t.getColumn()));
               }
  
               // second visit of node
               if (itr != null && itr.hasNext()) {
                   LineColumn lc = (LineColumn)itr.next();
                   if (t.getLineLast() == 0) {
                       int nextLine = lc.getLine();
                       int nextColumn = lc.getColumn();
                       if (nextLine < t.getLine() || (nextLine == t.getLine() && nextColumn < t.getColumn())) {
                           nextLine = t.getLine();
                           nextColumn = t.getColumn();
                       }
                       t.setLineLast(nextLine);
                       t.setColumnLast(nextColumn);
                       // This is a good point to call t.setSnippet(),
                       // but it bulks up the AST too much for production code.
                   }
               }
  
               GroovySourceAST child = (GroovySourceAST)t.getFirstChild();
               if (child != null) {
                   traverse(child,l,itr);
               }
  
               t = (GroovySourceAST)t.getNextSibling();
           }
      }