B
    dSp                 @   s$   d Z ddlmZ G dd deZdS )a  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.
    )changec               @   s6   e Zd ZdddZdd Zdd Zdd	 Zd
d ZdS )ChangeStackmerged changesc             C   s   || _ || _g | _d S )N)projectdescriptionstack)selfr   r    r	   7lib/python3.7/site-packages/rope/contrib/changestack.py__init__   s    zChangeStack.__init__c             C   s   | j | | j| d S )N)r   appendr   Zdo)r   changesr	   r	   r
   push   s    zChangeStack.pushc             C   s,   x&t t| jD ]}| jjjdd qW d S )NT)Zdrop)rangelenr   r   historyZundo)r   ir	   r	   r
   pop_all#   s    zChangeStack.pop_allc             C   s>   t | j}x,| jD ]"}x| |D ]}|| q$W qW |S )N)r   	ChangeSetr   r   _basic_changesZ
add_change)r   resultr   cr	   r	   r
   merged'   s
    zChangeStack.mergedc             c   sB   t |tjr8x0|jD ]}x| |D ]
}|V  q$W qW n|V  d S )N)
isinstancer   r   r   r   )r   r   ZchildZatomr	   r	   r
   r   .   s
    zChangeStack._basic_changesN)r   )__name__
__module____qualname__r   r   r   r   r   r	   r	   r	   r
   r      s
   
r   N)__doc__Z	rope.baser   objectr   r	   r	   r	   r
   <module>   s   