| 149 | |
| 150 | |
| 151 | class RootVisitor(NodeVisitor): |
| 152 | |
| 153 | def __init__(self, symbols): |
| 154 | self.sym_visitor = FrameSymbolVisitor(symbols) |
| 155 | |
| 156 | def _simple_visit(self, node, **kwargs): |
| 157 | for child in node.iter_child_nodes(): |
| 158 | self.sym_visitor.visit(child) |
| 159 | |
| 160 | visit_Template = visit_Block = visit_Macro = visit_FilterBlock = \ |
| 161 | visit_Scope = visit_If = visit_ScopedEvalContextModifier = \ |
| 162 | _simple_visit |
| 163 | |
| 164 | def visit_AssignBlock(self, node, **kwargs): |
| 165 | for child in node.body: |
| 166 | self.sym_visitor.visit(child) |
| 167 | |
| 168 | def visit_CallBlock(self, node, **kwargs): |
| 169 | for child in node.iter_child_nodes(exclude=('call',)): |
| 170 | self.sym_visitor.visit(child) |
| 171 | |
| 172 | def visit_OverlayScope(self, node, **kwargs): |
| 173 | for child in node.body: |
| 174 | self.sym_visitor.visit(child) |
| 175 | |
| 176 | def visit_For(self, node, for_branch='body', **kwargs): |
| 177 | if for_branch == 'body': |
| 178 | self.sym_visitor.visit(node.target, store_as_param=True) |
| 179 | branch = node.body |
| 180 | elif for_branch == 'else': |
| 181 | branch = node.else_ |
| 182 | elif for_branch == 'test': |
| 183 | self.sym_visitor.visit(node.target, store_as_param=True) |
| 184 | if node.test is not None: |
| 185 | self.sym_visitor.visit(node.test) |
| 186 | return |
| 187 | else: |
| 188 | raise RuntimeError('Unknown for branch') |
| 189 | for item in branch or (): |
| 190 | self.sym_visitor.visit(item) |
| 191 | |
| 192 | def visit_With(self, node, **kwargs): |
| 193 | for target in node.targets: |
| 194 | self.sym_visitor.visit(target) |
| 195 | for child in node.body: |
| 196 | self.sym_visitor.visit(child) |
| 197 | |
| 198 | def generic_visit(self, node, *args, **kwargs): |
| 199 | raise NotImplementedError('Cannot find symbols for %r' % |
| 200 | node.__class__.__name__) |
| 201 | |
| 202 | |
| 203 | class FrameSymbolVisitor(NodeVisitor): |