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