Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
marvel
GitHub Repository: marvel/qnf
Path: blob/master/elisp/emacs-for-python/rope-dist/rope/contrib/changestack.py
1494 views
1
"""For performing many refactorings as a single command
2
3
`changestack` module can be used to perform many refactorings on top
4
of each other as one bigger command. It can be used like::
5
6
stack = ChangeStack(project, 'my big command')
7
8
#..
9
stack.push(refactoring1.get_changes())
10
#..
11
stack.push(refactoring2.get_changes())
12
#..
13
stack.push(refactoringX.get_changes())
14
15
stack.pop_all()
16
changes = stack.merged()
17
18
Now `changes` can be previewed or performed as before.
19
"""
20
21
from rope.base import change
22
23
24
class ChangeStack(object):
25
26
def __init__(self, project, description='merged changes'):
27
self.project = project
28
self.description = description
29
self.stack = []
30
31
def push(self, changes):
32
self.stack.append(changes)
33
self.project.do(changes)
34
35
def pop_all(self):
36
for i in range(len(self.stack)):
37
self.project.history.undo(drop=True)
38
39
def merged(self):
40
result = change.ChangeSet(self.description)
41
for changes in self.stack:
42
for c in self._basic_changes(changes):
43
result.add_change(c)
44
return result
45
46
def _basic_changes(self, changes):
47
if isinstance(changes, change.ChangeSet):
48
for child in changes.changes:
49
for atom in self._basic_changes(child):
50
yield atom
51
else:
52
yield changes
53
54