idl_visitor.py revision f2477e01787aa58f445919b809d89e252beef54f
10e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org# Copyright (c) 2012 The Chromium Authors. All rights reserved.
20e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org# Use of this source code is governed by a BSD-style license that can be
30e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org# found in the LICENSE file.
40e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
50e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org""" Visitor Object for traversing AST """
60e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
70e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#
80e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org# IDLVisitor
90e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#
100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org# The IDLVisitor class will traverse an AST truncating portions of the tree
110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org# when 'VisitFilter' returns false.  After the filter returns true, for each
120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org# node, the visitor will call the 'Arrive' member passing in the node and
130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org# and generic data object from the parent call.  The returned value is then
140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org# passed to all children who's results are aggregated into a list.  The child
150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org# results along with the original Arrive result are passed to the Depart
160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org# function which returns the final result of the Visit.  By default this is
170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org# the exact value that was return from the original arrive.
180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#
190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass IDLVisitor(object):
210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  def __init__(self):
220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    pass
230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  # Return TRUE if the node should be visited
250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  def VisitFilter(self, node, data):
260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return True
270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  def Visit(self, node, data):
290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if not self.VisitFilter(node, data): return None
300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    childdata = []
320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    newdata = self.Arrive(node, data)
330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    for child in node.GetChildren():
340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      ret = self.Visit(child, newdata)
350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      if ret is not None:
360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        childdata.append(ret)
370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return self.Depart(node, newdata, childdata)
380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  def Arrive(self, node, data):
400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    __pychecker__ = 'unusednames=node'
410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return data
420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  def Depart(self, node, data, childdata):
440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    __pychecker__ = 'unusednames=node,childdata'
450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return data
460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org