| Index: tools/telemetry/third_party/rope/rope/base/astutils.py
|
| diff --git a/tools/telemetry/third_party/rope/rope/base/astutils.py b/tools/telemetry/third_party/rope/rope/base/astutils.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..8ace1a925feb1c928deae8411a0d6840062bb016
|
| --- /dev/null
|
| +++ b/tools/telemetry/third_party/rope/rope/base/astutils.py
|
| @@ -0,0 +1,61 @@
|
| +from rope.base import ast
|
| +
|
| +
|
| +def get_name_levels(node):
|
| + """Return a list of ``(name, level)`` tuples for assigned names
|
| +
|
| + The `level` is `None` for simple assignments and is a list of
|
| + numbers for tuple assignments for example in::
|
| +
|
| + a, (b, c) = x
|
| +
|
| + The levels for for `a` is ``[0]``, for `b` is ``[1, 0]`` and for
|
| + `c` is ``[1, 1]``.
|
| +
|
| + """
|
| + visitor = _NodeNameCollector()
|
| + ast.walk(node, visitor)
|
| + return visitor.names
|
| +
|
| +
|
| +class _NodeNameCollector(object):
|
| +
|
| + def __init__(self, levels=None):
|
| + self.names = []
|
| + self.levels = levels
|
| + self.index = 0
|
| +
|
| + def _add_node(self, node):
|
| + new_levels = []
|
| + if self.levels is not None:
|
| + new_levels = list(self.levels)
|
| + new_levels.append(self.index)
|
| + self.index += 1
|
| + self._added(node, new_levels)
|
| +
|
| + def _added(self, node, levels):
|
| + if hasattr(node, 'id'):
|
| + self.names.append((node.id, levels))
|
| +
|
| + def _Name(self, node):
|
| + self._add_node(node)
|
| +
|
| + def _Tuple(self, node):
|
| + new_levels = []
|
| + if self.levels is not None:
|
| + new_levels = list(self.levels)
|
| + new_levels.append(self.index)
|
| + self.index += 1
|
| + visitor = _NodeNameCollector(new_levels)
|
| + for child in ast.get_child_nodes(node):
|
| + ast.walk(child, visitor)
|
| + self.names.extend(visitor.names)
|
| +
|
| + def _Subscript(self, node):
|
| + self._add_node(node)
|
| +
|
| + def _Attribute(self, node):
|
| + self._add_node(node)
|
| +
|
| + def _Slice(self, node):
|
| + self._add_node(node)
|
|
|