NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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