Path: blob/master/elisp/emacs-for-python/rope-dist/rope/base/astutils.py
1415 views
from rope.base import ast123def get_name_levels(node):4"""Return a list of ``(name, level)`` tuples for assigned names56The `level` is `None` for simple assignments and is a list of7numbers for tuple assignments for example in::89a, (b, c) = x1011The levels for for `a` is ``[0]``, for `b` is ``[1, 0]`` and for12`c` is ``[1, 1]``.1314"""15visitor = _NodeNameCollector()16ast.walk(node, visitor)17return visitor.names181920class _NodeNameCollector(object):2122def __init__(self, levels=None):23self.names = []24self.levels = levels25self.index = 02627def _add_node(self, node):28new_levels = []29if self.levels is not None:30new_levels = list(self.levels)31new_levels.append(self.index)32self.index += 133self._added(node, new_levels)3435def _added(self, node, levels):36if hasattr(node, 'id'):37self.names.append((node.id, levels))3839def _Name(self, node):40self._add_node(node)4142def _Tuple(self, node):43new_levels = []44if self.levels is not None:45new_levels = list(self.levels)46new_levels.append(self.index)47self.index += 148visitor = _NodeNameCollector(new_levels)49for child in ast.get_child_nodes(node):50ast.walk(child, visitor)51self.names.extend(visitor.names)5253def _Subscript(self, node):54self._add_node(node)5556def _Attribute(self, node):57self._add_node(node)5859def _Slice(self, node):60self._add_node(node)616263