| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- """For performing many refactorings as a single command
- `changestack` module can be used to perform many refactorings on top
- of each other as one bigger command. It can be used like::
- stack = ChangeStack(project, 'my big command')
- #..
- stack.push(refactoring1.get_changes())
- #..
- stack.push(refactoring2.get_changes())
- #..
- stack.push(refactoringX.get_changes())
- stack.pop_all()
- changes = stack.merged()
- Now `changes` can be previewed or performed as before.
- """
- from rope.base import change
- class ChangeStack(object):
- def __init__(self, project, description='merged changes'):
- self.project = project
- self.description = description
- self.stack = []
- def push(self, changes):
- self.stack.append(changes)
- self.project.do(changes)
- def pop_all(self):
- for i in range(len(self.stack)):
- self.project.history.undo(drop=True)
- def merged(self):
- result = change.ChangeSet(self.description)
- for changes in self.stack:
- for c in self._basic_changes(changes):
- result.add_change(c)
- return result
- def _basic_changes(self, changes):
- if isinstance(changes, change.ChangeSet):
- for child in changes.changes:
- for atom in self._basic_changes(child):
- yield atom
- else:
- yield changes
|