OLD | NEW |
(Empty) | |
| 1 from rope.base import ast |
| 2 |
| 3 |
| 4 def get_name_levels(node): |
| 5 """Return a list of ``(name, level)`` tuples for assigned names |
| 6 |
| 7 The `level` is `None` for simple assignments and is a list of |
| 8 numbers for tuple assignments for example in:: |
| 9 |
| 10 a, (b, c) = x |
| 11 |
| 12 The levels for for `a` is ``[0]``, for `b` is ``[1, 0]`` and for |
| 13 `c` is ``[1, 1]``. |
| 14 |
| 15 """ |
| 16 visitor = _NodeNameCollector() |
| 17 ast.walk(node, visitor) |
| 18 return visitor.names |
| 19 |
| 20 |
| 21 class _NodeNameCollector(object): |
| 22 |
| 23 def __init__(self, levels=None): |
| 24 self.names = [] |
| 25 self.levels = levels |
| 26 self.index = 0 |
| 27 |
| 28 def _add_node(self, node): |
| 29 new_levels = [] |
| 30 if self.levels is not None: |
| 31 new_levels = list(self.levels) |
| 32 new_levels.append(self.index) |
| 33 self.index += 1 |
| 34 self._added(node, new_levels) |
| 35 |
| 36 def _added(self, node, levels): |
| 37 if hasattr(node, 'id'): |
| 38 self.names.append((node.id, levels)) |
| 39 |
| 40 def _Name(self, node): |
| 41 self._add_node(node) |
| 42 |
| 43 def _Tuple(self, node): |
| 44 new_levels = [] |
| 45 if self.levels is not None: |
| 46 new_levels = list(self.levels) |
| 47 new_levels.append(self.index) |
| 48 self.index += 1 |
| 49 visitor = _NodeNameCollector(new_levels) |
| 50 for child in ast.get_child_nodes(node): |
| 51 ast.walk(child, visitor) |
| 52 self.names.extend(visitor.names) |
| 53 |
| 54 def _Subscript(self, node): |
| 55 self._add_node(node) |
| 56 |
| 57 def _Attribute(self, node): |
| 58 self._add_node(node) |
| 59 |
| 60 def _Slice(self, node): |
| 61 self._add_node(node) |
OLD | NEW |