A visitor for `Frame.inspect`.
| 201 | |
| 202 | |
| 203 | class FrameSymbolVisitor(NodeVisitor): |
| 204 | """A visitor for `Frame.inspect`.""" |
| 205 | |
| 206 | def __init__(self, symbols): |
| 207 | self.symbols = symbols |
| 208 | |
| 209 | def visit_Name(self, node, store_as_param=False, **kwargs): |
| 210 | """All assignments to names go through this function.""" |
| 211 | if store_as_param or node.ctx == 'param': |
| 212 | self.symbols.declare_parameter(node.name) |
| 213 | elif node.ctx == 'store': |
| 214 | self.symbols.store(node.name) |
| 215 | elif node.ctx == 'load': |
| 216 | self.symbols.load(node.name) |
| 217 | |
| 218 | def visit_NSRef(self, node, **kwargs): |
| 219 | self.symbols.load(node.name) |
| 220 | |
| 221 | def visit_If(self, node, **kwargs): |
| 222 | self.visit(node.test, **kwargs) |
| 223 | |
| 224 | original_symbols = self.symbols |
| 225 | |
| 226 | def inner_visit(nodes): |
| 227 | self.symbols = rv = original_symbols.copy() |
| 228 | for subnode in nodes: |
| 229 | self.visit(subnode, **kwargs) |
| 230 | self.symbols = original_symbols |
| 231 | return rv |
| 232 | |
| 233 | body_symbols = inner_visit(node.body) |
| 234 | elif_symbols = inner_visit(node.elif_) |
| 235 | else_symbols = inner_visit(node.else_ or ()) |
| 236 | |
| 237 | self.symbols.branch_update([body_symbols, elif_symbols, else_symbols]) |
| 238 | |
| 239 | def visit_Macro(self, node, **kwargs): |
| 240 | self.symbols.store(node.name) |
| 241 | |
| 242 | def visit_Import(self, node, **kwargs): |
| 243 | self.generic_visit(node, **kwargs) |
| 244 | self.symbols.store(node.target) |
| 245 | |
| 246 | def visit_FromImport(self, node, **kwargs): |
| 247 | self.generic_visit(node, **kwargs) |
| 248 | for name in node.names: |
| 249 | if isinstance(name, tuple): |
| 250 | self.symbols.store(name[1]) |
| 251 | else: |
| 252 | self.symbols.store(name) |
| 253 | |
| 254 | def visit_Assign(self, node, **kwargs): |
| 255 | """Visit assignments in the correct order.""" |
| 256 | self.visit(node.node, **kwargs) |
| 257 | self.visit(node.target, **kwargs) |
| 258 | |
| 259 | def visit_For(self, node, **kwargs): |
| 260 | """Visiting stops at for blocks. However the block sequence |
no outgoing calls
no test coverage detected