Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(220)

Unified Diff: tools/telemetry/third_party/rope/rope/base/astutils.py

Issue 1132103009: Example of refactoring using rope library. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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)
« no previous file with comments | « tools/telemetry/third_party/rope/rope/base/ast.py ('k') | tools/telemetry/third_party/rope/rope/base/builtins.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698