astutils.py 1.5 KB

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