ó
’›V]c           @   sv   d  Z  d d l Z d d l m Z m Z d d l m Z d e f d „  ƒ  YZ d „  Z	 d „  Z
 d	 „  Z d
 „  Z d S(   s,  
THIS is not in active development, please check
https://github.com/davidhalter/jedi/issues/667 first before editing.

Introduce some basic refactoring functions to |jedi|. This module is still in a
very early development stage and needs much testing and improvement.

.. warning:: I won't do too much here, but if anyone wants to step in, please
             do. Refactoring is none of my priorities

It uses the |jedi| `API <api.html>`_ and supports currently the
following functions (sometimes bug-prone):

- rename
- extract variable
- inline variable
iÿÿÿÿN(   t   python_bytes_to_unicodet   split_lines(   t   helperst   Refactoringc           B   s,   e  Z d  „  Z d „  Z d „  Z d „  Z RS(   c         C   s   | |  _  d S(   sT   
        :param change_dct: dict(old_path=(new_path, old_lines, new_lines))
        N(   t
   change_dct(   t   selfR   (    (    s/   lib/python2.7/site-packages/jedi/refactoring.pyt   __init__   s    c         C   sF   i  } x9 |  j  j ƒ  D]( \ } \ } } } d j | ƒ | | <q W| S(   Ns   
(   R   t   itemst   join(   R   t   dctt   old_patht   new_patht   old_lt   new_l(    (    s/   lib/python2.7/site-packages/jedi/refactoring.pyt	   old_files   s    %c         C   sF   i  } x9 |  j  j ƒ  D]( \ } \ } } } d j | ƒ | | <q W| S(   Ns   
(   R   R   R   (   R   R	   R
   R   R   R   (    (    s/   lib/python2.7/site-packages/jedi/refactoring.pyt	   new_files%   s    %c         C   s…   g  } xo |  j  j ƒ  D]^ \ } \ } } } | rF t j | | ƒ } n t j | | | | ƒ } | j d j | ƒ ƒ q Wd j | ƒ S(   Ns   
(   R   R   t   difflibt   unified_difft   appendR   (   R   t   textsR
   R   R   R   t   udiff(    (    s/   lib/python2.7/site-packages/jedi/refactoring.pyt   diff+   s    %(   t   __name__t
   __module__R   R   R   R   (    (    (    s/   lib/python2.7/site-packages/jedi/refactoring.pyR      s   			c         C   s   t  t |  j ƒ  | ƒ ƒ S(   sÒ    The `args` / `kwargs` params are the same as in `api.Script`.
    :param new_name: The new name of the script.
    :param script: The source Script object.
    :return: list of changed lines/changed files
    (   R   t   _renamet   usages(   t   scriptt   new_name(    (    s/   lib/python2.7/site-packages/jedi/refactoring.pyt   rename6   s    c            s:  t  |  d d „  d t ƒ} ‡  f d †  } i  ‰  t ƒ  } d } } xà | D]Ø } | j ƒ  rb qJ n  | | j k rÖ | j } | | | | ƒ | d k	 rº t | ƒ  } | j ƒ  }	 Wd QXn  t t	 |	 ƒ ƒ } | } n  | j
 | j }
 } | |
 d } | |  | | | t | j ƒ | |
 d <qJ W| | | | ƒ ˆ  S(   s    For both rename and inline. t   keyc         S   s   |  j  |  j |  j f S(   N(   t   module_patht   linet   column(   t   x(    (    s/   lib/python2.7/site-packages/jedi/refactoring.pyt   <lambda>A   t    t   reversec            s&   | d  k	 r" |  | | f ˆ  |  <n  d  S(   N(   t   None(   t   patht	   old_linest	   new_lines(   R	   (    s/   lib/python2.7/site-packages/jedi/refactoring.pyt   processD   s    Ni   (   t   sortedt   Truet   objectR%   t   in_builtin_moduleR   t   opent   readR   R    R   R    t   lent   name(   t   namest   replace_strt   orderR)   t   current_pathR(   R'   R1   t   ft   sourcet   nrt   indentR   (    (   R	   s/   lib/python2.7/site-packages/jedi/refactoring.pyR   ?   s.    		
	
$c         C   sÚ  t  t |  j ƒ ƒ } | } |  j j ƒ  } i  } | r·|  j } | d d } t j | | ƒ \ } }	 | d k	 r·| |	 j	 }
 | |	 j
 } | d |
 d k rª | d n d } | |
 d d } | |
 d | !} x7 t |
 d | d d ƒ D] } | d t | ƒ 7} qï W| d k rD| | d d } | d | | d  7} n  | j ƒ  } |
 d t | ƒ t | ƒ } | j ƒ  } t | ƒ t | ƒ } | d k rÉ| | d | | | d d <t | ƒ } n
 | | } | |  | | | } | | |
 d d <g  | |
 d | d d +d d d g } d d d	 g } d | k r}| d | k ol| d
 | | j | d ƒ k r}d | } n  | j	 d } d d | | | f } | j | | ƒ q·n  |  j | | f | |  j <t | ƒ S(   sß    The `args` / `kwargs` params are the same as in `api.Script`.
    :param operation: The refactoring operation to execute.
    :type operation: str
    :type source: str
    :return: list of changed lines/changed files
    i    i   s   
t   (t   [t   {t   )t   ]t   }iÿÿÿÿs   (%s)s	   %s%s = %st    N(   R   R    R7   t   _parsert	   user_stmtt   _posR   t   array_for_posR%   t	   start_post   end_post   ranget   strt   lstripR0   t   rstript   indext   insertR&   R   (   R   R   R(   R'   RB   R	   t   post
   line_indext   arrRK   RE   RF   t   et
   start_linet   textt   lt   end_linet   tt	   del_startt   del_endt   open_bracketst   close_bracketsR9   t   new(    (    s/   lib/python2.7/site-packages/jedi/refactoring.pyt   extractb   sP    	$"
#c         C   s  t  t |  j ƒ ƒ } i  } |  j ƒ  } t | ƒ d k s? t ‚ | d j } |  j ƒ  } g  | D]: } | j | j	 | j
 f k oŽ | j k n s_ | ^ q_ } t | d d „  d t ƒ} | j ƒ  } | j d | j d k sæ t ‚ | j d d }	 | |	 }
 |
 | d j d | j d d !} | j ƒ  } | rˆt | d t j ƒ rˆ| d } | d d k rˆt | ƒ d k rˆd	 | } qˆn  t | j ƒ  ƒ d k rÃ|
 | j d  |
 | j d }
 n  t | | ƒ } | |  j d
 } |
 j ƒ  rü|
 | |	 <n | j |	 ƒ t | ƒ S(   s"   
    :type script: api.Script
    i   i    R   c         S   s   |  j  |  j |  j f S(   N(   R   R   R    (   R!   (    (    s/   lib/python2.7/site-packages/jedi/refactoring.pyR"   ¯   R#   R$   R:   R;   R<   s   (%s)i   (   R:   R;   R<   (   R   R    R7   t   goto_assignmentsR0   t   AssertionErrort   _definitionR   RE   R   R    RF   R*   R+   t   expression_listt   stript
   isinstancet   prt   Arrayt   get_defined_namesR   R&   t   popR   (   R   R(   R	   t   definitionst   stmtR   t   rt   inlinesR_   RK   R   R3   RO   (    (    s/   lib/python2.7/site-packages/jedi/refactoring.pyt   inline¡   s8    :	 
#
"#(   t   __doc__R   t   parsoR    R   t   jedi.evaluateR   R,   R   R   R   R[   Rj   (    (    (    s/   lib/python2.7/site-packages/jedi/refactoring.pyt   <module>   s   			#	?