visitor.py (1797B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\lib\jinja2\visitor.py 2 from jinja2.nodes import Node 3 4 class NodeVisitor(object): 5 6 def get_visitor(self, node): 7 method = 'visit_' + node.__class__.__name__ 8 return getattr(self, method, None) 9 10 def visit(self, node, *args, **kwargs): 11 f = self.get_visitor(node) 12 if f is not None: 13 return f(node, *args, **kwargs) 14 return self.generic_visit(node, *args, **kwargs) 15 16 def generic_visit(self, node, *args, **kwargs): 17 for node in node.iter_child_nodes(): 18 self.visit(node, *args, **kwargs) 19 20 21 class NodeTransformer(NodeVisitor): 22 23 def generic_visit(self, node, *args, **kwargs): 24 for field, old_value in node.iter_fields(): 25 if isinstance(old_value, list): 26 new_values = [] 27 for value in old_value: 28 if isinstance(value, Node): 29 value = self.visit(value, *args, **kwargs) 30 if value is None: 31 continue 32 elif not isinstance(value, Node): 33 new_values.extend(value) 34 continue 35 new_values.append(value) 36 37 old_value[:] = new_values 38 elif isinstance(old_value, Node): 39 new_node = self.visit(old_value, *args, **kwargs) 40 if new_node is None: 41 delattr(node, field) 42 else: 43 setattr(node, field, new_node) 44 45 return node 46 47 def visit_list(self, node, *args, **kwargs): 48 rv = self.visit(node, *args, **kwargs) 49 if not isinstance(rv, list): 50 rv = [rv] 51 return rv