Home | History | Annotate | Download | only in generators
      1 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 """ Visitor Object for traversing AST """
      6 
      7 #
      8 # IDLVisitor
      9 #
     10 # The IDLVisitor class will traverse an AST truncating portions of the tree
     11 # when 'VisitFilter' returns false.  After the filter returns true, for each
     12 # node, the visitor will call the 'Arrive' member passing in the node and
     13 # and generic data object from the parent call.  The returned value is then
     14 # passed to all children who's results are aggregated into a list.  The child
     15 # results along with the original Arrive result are passed to the Depart
     16 # function which returns the final result of the Visit.  By default this is
     17 # the exact value that was return from the original arrive.
     18 #
     19 
     20 class IDLVisitor(object):
     21   def __init__(self):
     22     pass
     23 
     24   # Return TRUE if the node should be visited
     25   def VisitFilter(self, node, data):
     26     return True
     27 
     28   def Visit(self, node, data):
     29     if not self.VisitFilter(node, data): return None
     30 
     31     childdata = []
     32     newdata = self.Arrive(node, data)
     33     for child in node.GetChildren():
     34       ret = self.Visit(child, newdata)
     35       if ret is not None:
     36         childdata.append(ret)
     37     return self.Depart(node, newdata, childdata)
     38 
     39   def Arrive(self, node, data):
     40     __pychecker__ = 'unusednames=node'
     41     return data
     42 
     43   def Depart(self, node, data, childdata):
     44     __pychecker__ = 'unusednames=node,childdata'
     45     return data
     46