Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
marvel
GitHub Repository: marvel/qnf
Path: blob/master/elisp/emacs-for-python/rope-dist/rope/refactor/suites.py
1428 views
1
from rope.base import ast
2
3
4
def find_visible(node, lines):
5
"""Return the line which is visible from all `lines`"""
6
root = ast_suite_tree(node)
7
return find_visible_for_suite(root, lines)
8
9
10
def find_visible_for_suite(root, lines):
11
if len(lines) == 1:
12
return lines[0]
13
line1 = lines[0]
14
line2 = find_visible_for_suite(root, lines[1:])
15
suite1 = root.find_suite(line1)
16
suite2 = root.find_suite(line2)
17
def valid(suite):
18
return suite is not None and not suite.ignored
19
if valid(suite1) and not valid(suite2):
20
return line1
21
if not valid(suite1) and valid(suite2):
22
return line2
23
if not valid(suite1) and not valid(suite2):
24
return None
25
while suite1 != suite2 and suite1.parent != suite2.parent:
26
if suite1._get_level() < suite2._get_level():
27
line2 = suite2.get_start()
28
suite2 = suite2.parent
29
elif suite1._get_level() > suite2._get_level():
30
line1 = suite1.get_start()
31
suite1 = suite1.parent
32
else:
33
line1 = suite1.get_start()
34
line2 = suite2.get_start()
35
suite1 = suite1.parent
36
suite2 = suite2.parent
37
if suite1 == suite2:
38
return min(line1, line2)
39
return min(suite1.get_start(), suite2.get_start())
40
41
42
def ast_suite_tree(node):
43
if hasattr(node, 'lineno'):
44
lineno = node.lineno
45
else:
46
lineno = 1
47
return Suite(node.body, lineno)
48
49
50
class Suite(object):
51
52
def __init__(self, child_nodes, lineno, parent=None, ignored=False):
53
self.parent = parent
54
self.lineno = lineno
55
self.child_nodes = child_nodes
56
self._children = None
57
self.ignored = ignored
58
59
def get_start(self):
60
if self.parent is None:
61
if self.child_nodes:
62
return self.local_start()
63
else:
64
return 1
65
return self.lineno
66
67
def get_children(self):
68
if self._children is None:
69
walker = _SuiteWalker(self)
70
for child in self.child_nodes:
71
ast.walk(child, walker)
72
self._children = walker.suites
73
return self._children
74
75
def local_start(self):
76
return self.child_nodes[0].lineno
77
78
def local_end(self):
79
end = self.child_nodes[-1].lineno
80
if self.get_children():
81
end = max(end, self.get_children()[-1].local_end())
82
return end
83
84
def find_suite(self, line):
85
if line is None:
86
return None
87
for child in self.get_children():
88
if child.local_start() <= line <= child.local_end():
89
return child.find_suite(line)
90
return self
91
92
def _get_level(self):
93
if self.parent is None:
94
return 0
95
return self.parent._get_level() + 1
96
97
98
class _SuiteWalker(object):
99
100
def __init__(self, suite):
101
self.suite = suite
102
self.suites = []
103
104
def _If(self, node):
105
self._add_if_like_node(node)
106
107
def _For(self, node):
108
self._add_if_like_node(node)
109
110
def _While(self, node):
111
self._add_if_like_node(node)
112
113
def _With(self, node):
114
self.suites.append(Suite(node.body, node.lineno, self.suite))
115
116
def _TryFinally(self, node):
117
if len(node.finalbody) == 1 and \
118
isinstance(node.body[0], ast.TryExcept):
119
self._TryExcept(node.body[0])
120
else:
121
self.suites.append(Suite(node.body, node.lineno, self.suite))
122
self.suites.append(Suite(node.finalbody, node.lineno, self.suite))
123
124
def _TryExcept(self, node):
125
self.suites.append(Suite(node.body, node.lineno, self.suite))
126
for handler in node.handlers:
127
self.suites.append(Suite(handler.body, node.lineno, self.suite))
128
if node.orelse:
129
self.suites.append(Suite(node.orelse, node.lineno, self.suite))
130
131
def _add_if_like_node(self, node):
132
self.suites.append(Suite(node.body, node.lineno, self.suite))
133
if node.orelse:
134
self.suites.append(Suite(node.orelse, node.lineno, self.suite))
135
136
def _FunctionDef(self, node):
137
self.suites.append(Suite(node.body, node.lineno,
138
self.suite, ignored=True))
139
140
def _ClassDef(self, node):
141
self.suites.append(Suite(node.body, node.lineno,
142
self.suite, ignored=True))
143
144