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

Unified Diff: tools/telemetry/third_party/rope/rope/refactor/suites.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/refactor/suites.py
diff --git a/tools/telemetry/third_party/rope/rope/refactor/suites.py b/tools/telemetry/third_party/rope/rope/refactor/suites.py
new file mode 100644
index 0000000000000000000000000000000000000000..4f9a8c715c9986f1a3a296c2cf50dd721f246d40
--- /dev/null
+++ b/tools/telemetry/third_party/rope/rope/refactor/suites.py
@@ -0,0 +1,143 @@
+from rope.base import ast
+
+
+def find_visible(node, lines):
+ """Return the line which is visible from all `lines`"""
+ root = ast_suite_tree(node)
+ return find_visible_for_suite(root, lines)
+
+
+def find_visible_for_suite(root, lines):
+ if len(lines) == 1:
+ return lines[0]
+ line1 = lines[0]
+ line2 = find_visible_for_suite(root, lines[1:])
+ suite1 = root.find_suite(line1)
+ suite2 = root.find_suite(line2)
+
+ def valid(suite):
+ return suite is not None and not suite.ignored
+ if valid(suite1) and not valid(suite2):
+ return line1
+ if not valid(suite1) and valid(suite2):
+ return line2
+ if not valid(suite1) and not valid(suite2):
+ return None
+ while suite1 != suite2 and suite1.parent != suite2.parent:
+ if suite1._get_level() < suite2._get_level():
+ line2 = suite2.get_start()
+ suite2 = suite2.parent
+ elif suite1._get_level() > suite2._get_level():
+ line1 = suite1.get_start()
+ suite1 = suite1.parent
+ else:
+ line1 = suite1.get_start()
+ line2 = suite2.get_start()
+ suite1 = suite1.parent
+ suite2 = suite2.parent
+ if suite1 == suite2:
+ return min(line1, line2)
+ return min(suite1.get_start(), suite2.get_start())
+
+
+def ast_suite_tree(node):
+ if hasattr(node, 'lineno'):
+ lineno = node.lineno
+ else:
+ lineno = 1
+ return Suite(node.body, lineno)
+
+
+class Suite(object):
+
+ def __init__(self, child_nodes, lineno, parent=None, ignored=False):
+ self.parent = parent
+ self.lineno = lineno
+ self.child_nodes = child_nodes
+ self._children = None
+ self.ignored = ignored
+
+ def get_start(self):
+ if self.parent is None:
+ if self.child_nodes:
+ return self.local_start()
+ else:
+ return 1
+ return self.lineno
+
+ def get_children(self):
+ if self._children is None:
+ walker = _SuiteWalker(self)
+ for child in self.child_nodes:
+ ast.walk(child, walker)
+ self._children = walker.suites
+ return self._children
+
+ def local_start(self):
+ return self.child_nodes[0].lineno
+
+ def local_end(self):
+ end = self.child_nodes[-1].lineno
+ if self.get_children():
+ end = max(end, self.get_children()[-1].local_end())
+ return end
+
+ def find_suite(self, line):
+ if line is None:
+ return None
+ for child in self.get_children():
+ if child.local_start() <= line <= child.local_end():
+ return child.find_suite(line)
+ return self
+
+ def _get_level(self):
+ if self.parent is None:
+ return 0
+ return self.parent._get_level() + 1
+
+
+class _SuiteWalker(object):
+
+ def __init__(self, suite):
+ self.suite = suite
+ self.suites = []
+
+ def _If(self, node):
+ self._add_if_like_node(node)
+
+ def _For(self, node):
+ self._add_if_like_node(node)
+
+ def _While(self, node):
+ self._add_if_like_node(node)
+
+ def _With(self, node):
+ self.suites.append(Suite(node.body, node.lineno, self.suite))
+
+ def _TryFinally(self, node):
+ if len(node.finalbody) == 1 and \
+ isinstance(node.body[0], ast.TryExcept):
+ self._TryExcept(node.body[0])
+ else:
+ self.suites.append(Suite(node.body, node.lineno, self.suite))
+ self.suites.append(Suite(node.finalbody, node.lineno, self.suite))
+
+ def _TryExcept(self, node):
+ self.suites.append(Suite(node.body, node.lineno, self.suite))
+ for handler in node.handlers:
+ self.suites.append(Suite(handler.body, node.lineno, self.suite))
+ if node.orelse:
+ self.suites.append(Suite(node.orelse, node.lineno, self.suite))
+
+ def _add_if_like_node(self, node):
+ self.suites.append(Suite(node.body, node.lineno, self.suite))
+ if node.orelse:
+ self.suites.append(Suite(node.orelse, node.lineno, self.suite))
+
+ def _FunctionDef(self, node):
+ self.suites.append(Suite(node.body, node.lineno,
+ self.suite, ignored=True))
+
+ def _ClassDef(self, node):
+ self.suites.append(Suite(node.body, node.lineno,
+ self.suite, ignored=True))

Powered by Google App Engine
This is Rietveld 408576698