Path: blob/master/elisp/emacs-for-python/rope-dist/rope/refactor/suites.py
1428 views
from rope.base import ast123def find_visible(node, lines):4"""Return the line which is visible from all `lines`"""5root = ast_suite_tree(node)6return find_visible_for_suite(root, lines)789def find_visible_for_suite(root, lines):10if len(lines) == 1:11return lines[0]12line1 = lines[0]13line2 = find_visible_for_suite(root, lines[1:])14suite1 = root.find_suite(line1)15suite2 = root.find_suite(line2)16def valid(suite):17return suite is not None and not suite.ignored18if valid(suite1) and not valid(suite2):19return line120if not valid(suite1) and valid(suite2):21return line222if not valid(suite1) and not valid(suite2):23return None24while suite1 != suite2 and suite1.parent != suite2.parent:25if suite1._get_level() < suite2._get_level():26line2 = suite2.get_start()27suite2 = suite2.parent28elif suite1._get_level() > suite2._get_level():29line1 = suite1.get_start()30suite1 = suite1.parent31else:32line1 = suite1.get_start()33line2 = suite2.get_start()34suite1 = suite1.parent35suite2 = suite2.parent36if suite1 == suite2:37return min(line1, line2)38return min(suite1.get_start(), suite2.get_start())394041def ast_suite_tree(node):42if hasattr(node, 'lineno'):43lineno = node.lineno44else:45lineno = 146return Suite(node.body, lineno)474849class Suite(object):5051def __init__(self, child_nodes, lineno, parent=None, ignored=False):52self.parent = parent53self.lineno = lineno54self.child_nodes = child_nodes55self._children = None56self.ignored = ignored5758def get_start(self):59if self.parent is None:60if self.child_nodes:61return self.local_start()62else:63return 164return self.lineno6566def get_children(self):67if self._children is None:68walker = _SuiteWalker(self)69for child in self.child_nodes:70ast.walk(child, walker)71self._children = walker.suites72return self._children7374def local_start(self):75return self.child_nodes[0].lineno7677def local_end(self):78end = self.child_nodes[-1].lineno79if self.get_children():80end = max(end, self.get_children()[-1].local_end())81return end8283def find_suite(self, line):84if line is None:85return None86for child in self.get_children():87if child.local_start() <= line <= child.local_end():88return child.find_suite(line)89return self9091def _get_level(self):92if self.parent is None:93return 094return self.parent._get_level() + 1959697class _SuiteWalker(object):9899def __init__(self, suite):100self.suite = suite101self.suites = []102103def _If(self, node):104self._add_if_like_node(node)105106def _For(self, node):107self._add_if_like_node(node)108109def _While(self, node):110self._add_if_like_node(node)111112def _With(self, node):113self.suites.append(Suite(node.body, node.lineno, self.suite))114115def _TryFinally(self, node):116if len(node.finalbody) == 1 and \117isinstance(node.body[0], ast.TryExcept):118self._TryExcept(node.body[0])119else:120self.suites.append(Suite(node.body, node.lineno, self.suite))121self.suites.append(Suite(node.finalbody, node.lineno, self.suite))122123def _TryExcept(self, node):124self.suites.append(Suite(node.body, node.lineno, self.suite))125for handler in node.handlers:126self.suites.append(Suite(handler.body, node.lineno, self.suite))127if node.orelse:128self.suites.append(Suite(node.orelse, node.lineno, self.suite))129130def _add_if_like_node(self, node):131self.suites.append(Suite(node.body, node.lineno, self.suite))132if node.orelse:133self.suites.append(Suite(node.orelse, node.lineno, self.suite))134135def _FunctionDef(self, node):136self.suites.append(Suite(node.body, node.lineno,137self.suite, ignored=True))138139def _ClassDef(self, node):140self.suites.append(Suite(node.body, node.lineno,141self.suite, ignored=True))142143144