
    Æex4                     &   d dl Z d dlZd dlmZmZmZmZmZm	Z	 d dl
mZmZ d dlmZmZ  G d d      Z G d d      Z G d	 d
      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d d      Z G d d      Zy)    N)codeanalyzeevaluate	pyobjects
taskhandleutilsworder)ChangeContents	ChangeSet)functionutilsoccurrencesc                      e Zd Zd Zd Zddej                  fdZd Zd Z	 e
j                  d      d        Zd	 Z e
j                         d
        Z e
j                         d        Z e
j                         dd       Z e
j                         d        Z e
j                         d        Zddej                  fdZy)ChangeSignaturec                 P   || _         || _        || _        | j                          | j                  L| j                  j                         2t        | j                  j                         t        j                        s)t        j                  j                  j                  d      y )Nz8Change method signature should be performed on functions)projectresourceoffset_set_name_and_pynamepyname
get_object
isinstancer   
PyFunctionropebase
exceptionsRefactoringError)selfr   r   r   s       @/usr/lib/python3/dist-packages/rope/refactor/change_signature.py__init__zChangeSignature.__init__
   s     !!#KK{{%%'/dkk446	8L8LM))&&77J  N    c                    t        j                  | j                  | j                        | _        | j
                  j                  | j                        }t        j                  || j                        \  | _	        | _
        | j                  y | j                  j                         }t        |t        j                        rd|v r|d   | _
        d| _        | j                  j                         }d | _        | j                  dk(  rt        |t        j                         rdt        |j"                  t        j                        r?|j"                  }|j%                         |j"                  |j%                            f| _        y y y y )Nr   )r   get_name_atr   r   namer   get_pymoduler   eval_location2primaryr   r   r   r   PyClassothersr   parentget_name)r   this_pymodulepyobjectpyclasss       r   r   z$ChangeSignature._set_name_and_pyname   s&   &&t}}dkkB	11$--@$,$;$;M4;;$W!dk;;;;))+h	 1 12zX7M":.DK"DI;;))+II#8Y%9%9:8??I,=,=>ooG"++-w~~g>N>N>P/QRDK ? ; $r   Nc                    || j                   j                         }t        d| j                  z        }|j	                  dt        |            }t        j                  | j                   | j                  | j                  | j                  |xr | j                               }| j                  r?| j                  \  }}	t        j                  | j                   ||	d      }
t        ||
g      }|D ]r  }|j                  |j                         t        | j                   |||      }|j!                         }||j#                  t%        ||             |j'                          t |S )NzChanging signature of <%s>zCollecting Changes)instancein_hierarchyT)
only_calls)r   get_python_filesr
   r"   create_jobsetlenr   create_finderr   r%   	is_methodr'   _MultipleFindersstarted_jobpath_ChangeCallsInModuleget_changed_module
add_changer	   finished_job)r   call_changerr/   	resourceshandlechangesjob_setfinderr"   r   constructor_finderfilechange_callschanged_files                 r   _change_callszChangeSignature._change_calls,   s>    557I8499DE&&';S^L**LLIIKK\\%:$..*:
 ;;;;LD&!,!:!:dFt" &v/A&BCF 	#D		*/fdLL (::<L'"">$#EF  "	# r   c                 6    | j                         j                  S )zGet function arguments.

        Return a list of ``(name, default)`` tuples for all but star
        and double star arguments.  For arguments that don't have a
        default, `None` will be used.
        )_definfoargs_with_defaultsr   s    r   get_argszChangeSignature.get_argsO   s     }}111r   c                 ~    | j                   j                         }t        |j                  t        j
                        S N)r   r   r   r(   r   r&   )r   
pyfunctions     r   r5   zChangeSignature.is_methodX   s-    [[++-
*++Y->->??r   z(Use `ChangeSignature.get_args()` insteadc                 "    | j                         S rN   )rI   rK   s    r   get_definition_infoz#ChangeSignature.get_definition_info\   s    }}r   c                 p    t         j                  j                  | j                  j	                               S rN   )r   DefinitionInforeadr   r   rK   s    r   rI   zChangeSignature._definfo`   s&    ++001G1G1IJJr   c                     t        | j                  j                         | j                         t	               g      }| j                  |      S rN   )_FunctionChangersr   r   rQ   ArgumentNormalizerrG   )r   changers     r   	normalizezChangeSignature.normalizec   sC    #KK""$d&>&>&@CUCWBX
 !!'**r   c                     t        | j                  j                         | j                         t	        |      g      }| j                  |      S rN   )rV   r   r   rQ   ArgumentRemoverrG   r   indexrX   s      r   removezChangeSignature.removej   sF    #KK""$$$&U#$

 !!'**r   c           
          t        | j                  j                         | j                         t	        ||||      g      }| j                  |      S rN   )rV   r   r   rQ   ArgumentAdderrG   )r   r]   r"   defaultvaluerX   s         r   addzChangeSignature.adds   sL    #KK""$$$&5$78

 !!'**r   c                     t        | j                  j                         | j                         t	        |      g      }| j                  |      S rN   )rV   r   r   rQ   ArgumentDefaultInlinerrG   r\   s      r   inline_defaultzChangeSignature.inline_default|   sF    #KK""$$$&#E*+

 !!'**r   c                     t        | j                  j                         | j                         t	        |      g      }| j                  |      S rN   )rV   r   r   rQ   ArgumentReordererrG   )r   new_orderingrX   s      r   reorderzChangeSignature.reorder   sF    #KK""$$$&|,-

 !!'**r   Fc                     t        | j                  j                         | j                         |      }| j	                  ||||      S )a  Get changes caused by this refactoring

        `changers` is a list of `_ArgumentChanger`.  If `in_hierarchy`
        is `True` the changers are applied to all matching methods in
        the class hierarchy.
        `resources` can be a list of `rope.base.resource.File` that
        should be searched for occurrences; if `None` all python files
        in the project are searched.

        )rV   r   r   rI   rG   )r   changersr/   r>   task_handlefunction_changers         r   get_changeszChangeSignature.get_changes   sG    " -KK""$dmmox
 !!lI{
 	
r   NN)__name__
__module____qualname__r   r   r   DEFAULT_TASK_HANDLErG   rL   r5   r   
deprecatedrQ   rI   rY   r^   rc   rf   rj   ro    r   r   r   r   	   s	   S. --!F2@ U@A BK U+ + U+ + U+ + U+ + U+ + 22
r   r   c                   &    e Zd ZddZd Zd Zd Zy)rV   Nc                 X    || _         || _        || _        | j                         | _        y rN   )rO   definition_inforl   _get_changed_definition_infoschanged_definition_infos)r   rO   ry   rl   s       r   r   z_FunctionChangers.__init__   s)    $. (,(J(J(L%r   c                     | j                   }|g}| j                  D ]9  }t        j                  |      }|j	                  |       |j                  |       ; |S rN   )ry   rl   copydeepcopychange_definition_infoappend)r   ry   resultrX   s       r   rz   z/_FunctionChangers._get_changed_definition_infos   sW    ..!"}} 	+G"mmO<O**?;MM/*	+ r   c                 <    | j                   d   j                         S N)r{   	to_string)r   calls     r   change_definitionz#_FunctionChangers.change_definition   s    ,,R0::<<r   c                 f   t         j                  j                  ||| j                  |      }t        j                  | j                  |      }t        | j                  | j                        D ]  \  }}|j                  ||        |j                  | j                  d         j                         S r   )r   CallInforT   ry   ArgumentMappingzipr{   rl   change_argument_mappingto_call_infor   )r   r%   r   r   	call_infomappingry   rX   s           r   change_callz_FunctionChangers.change_call   s    !**//VT114
	  //0D0DiP(+))4==)
 	F$OW ++OWE	F
 ##D$A$A"$EFPPRRr   rN   )rq   rr   rs   r   rz   r   r   rv   r   r   rV   rV      s    M=Sr   rV   c                       e Zd Zd Zd Zy)_ArgumentChangerc                      y rN   rv   r   ry   s     r   r   z'_ArgumentChanger.change_definition_info       r   c                      y rN   rv   )r   ry   argument_mappings      r   r   z(_ArgumentChanger.change_argument_mapping   r   r   N)rq   rr   rs   r   r   rv   r   r   r   r      s    r   r   c                       e Zd Zy)rW   N)rq   rr   rs   rv   r   r   rW   rW      s    r   rW   c                       e Zd Zd Zd Zd Zy)r[   c                     || _         y rN   )r]   r   r]   s     r   r   zArgumentRemover.__init__   s	    
r   c                    | j                   t        |j                        k  r|j                  | j                   = y | j                   t        |j                        k(  r|j                  d |_        y | j                   t        |j                        k(  r|j                  |j                  =| j                   t        |j                        dz   k(  r"|j                  |j                  d |_        y y y y N   )r]   r3   rJ   args_argkeywords_arg)r   r   s     r   r   z&ArgumentRemover.change_definition_info   s    ::I8899,,TZZ8JJ#i::;;"".!%IJJ#i::;;""*&&2JJ#i::;a??"".&&2%)I" 3 / @r   c                     | j                   t        |j                        k  r,|j                  d   }||j                  v r|j                  |= y y y Nr   )r]   r3   rJ   
param_dict)r   ry   r   r"   s       r   r   z'ArgumentRemover.change_argument_mapping   sP    ::O>>??"55a8Dw)))&&t, * @r   Nrq   rr   rs   r   r   r   rv   r   r   r[   r[      s    *&-r   r[   c                        e Zd ZddZd Zd Zy)r`   Nc                 <    || _         || _        || _        || _        y rN   )r]   r"   ra   rb   )r   r]   r"   ra   rb   s        r   r   zArgumentAdder.__init__   s    
	
r   c                 .   |j                   D ]J  }|d   | j                  k(  st        j                  j                  j                  d| j                  z         |j                   j                  | j                  | j                  | j                  f       y )Nr   z!Adding duplicate parameter: <%s>.)	rJ   r"   r   r   r   r   insertr]   ra   )r   ry   pairs      r   r   z$ArgumentAdder.change_definition_info   sy    #66 	DAw$))#ii**;;7$))C 	
 	**11$**tyy$,,>WXr   c                 d    | j                   $| j                   |j                  | j                  <   y y rN   )rb   r   r"   )r   ry   r   s      r   r   z%ArgumentAdder.change_argument_mapping  s)    ::!,0JJGtyy) "r   rp   r   rv   r   r   r`   r`      s    Y7r   r`   c                       e Zd Zd Zd Zd Zy)re   c                      || _         d| _        y )NF)r]   r^   r   s     r   r   zArgumentDefaultInliner.__init__  s    
r   c                     | j                   r6|j                  | j                     d   d f|j                  | j                  <   y y r   )r^   rJ   r]   r   s     r   r   z-ArgumentDefaultInliner.change_definition_info  s>    ;;224::>qA>O..tzz: r   c                     |j                   | j                     d   }|j                   | j                     d   }|||j                  vr||j                  |<   y y y )Nr   r   )rJ   r]   r   )r   ry   r   ra   r"   s        r   r   z.ArgumentDefaultInliner.change_argument_mapping  s`    !44TZZ@C11$**=a@4w/A/A#A'.Gt$ $Br   Nr   rv   r   r   re   re     s    /r   re   c                       e Zd ZddZd Zy)rh   Nc                      || _         || _        y)a  Construct an `ArgumentReorderer`

        Note that the `new_order` is a list containing the new
        position of parameters; not the position each parameter
        is going to be moved to. (changed in ``0.5m4``)

        For example changing ``f(a, b, c)`` to ``f(c, a, b)``
        requires passing ``[2, 0, 1]`` and *not* ``[1, 2, 0]``.

        The `autodef` (automatic default) argument, forces rope to use
        it as a default if a default is needed after the change.  That
        happens when an argument without default is moved after
        another that has a default value.  Note that `autodef` should
        be a string or `None`; the latter disables adding automatic
        default.

        N)	new_orderautodef)r   r   r   s      r   r   zArgumentReorderer.__init__  s    $ #r   c                 ,   t        |j                        }t        | j                        D ]  \  }}|j                  |   ||<    d}t        t        |            D ]0  \  }\  }}|d}|s|| j                   || j                  f||<   2 ||_        y )NFT)listrJ   	enumerater   r   )r   ry   new_args	new_indexr]   seen_defaultargra   s           r   r   z(ArgumentReorderer.change_definition_info/  s    ::; )$.. 9 	LIu"1"D"DU"KHY	L%.tH~%> 	6!E>C"#DLL4L#&"5		6
 .6*r   rN   )rq   rr   rs   r   r   rv   r   r   rh   rh     s    *
6r   rh   c                       e Zd Zd Zd Zeej                  d               Zeej                  d               Z	eej                  d               Z
y)r9   c                 <    || _         || _        || _        || _        y rN   )r   occurrence_finderr   r=   )r   r   r   r   r=   s        r   r   z_ChangeCallsInModule.__init__=  s     !2 (r   c                    t        j                  | j                        }t        j                  | j                        }| j
                  j                  | j                        D ]  }|j                         s|j                         s$|j                         \  }}|j                  |dz
        \  }}|j                         r>|j                         \  }}	| j                  j                  ||	| j                  ||       }
n(| j                  j                  | j                  ||       }
|
|j!                  |||
        |j#                         S r   )r   Wordersourcer   ChangeCollectorr   find_occurrencesr   	is_called
is_definedget_primary_rangeget_word_parens_rangeget_primary_and_pynamer=   r   r   r;   get_changed)r   word_finderchange_collector
occurrencestartendbegin_parens
end_parensr%   r   changed_calls              r   r:   z'_ChangeCallsInModule.get_changed_moduleC  s+   mmDKK0&66t{{C00AA$--P 	MJ'')*2G2G2I#557JE3'2'H'Hq'Q$L*##%","C"C"E#00<<VT[[z%B   $00BBKKj1  ' ++E:|L	M   ++--r   c                 L    | j                   j                  | j                        S rN   )r   r#   r   rK   s    r   pymodulez_ChangeCallsInModule.pymoduleX  s     ||((77r   c                 z    | j                   | j                   j                         S | j                  j                  S rN   )r   rT   r   source_coderK   s    r   r   z_ChangeCallsInModule.source]  s1     ==$==%%''==,,,r   c                 .    | j                   j                  S rN   )r   linesrK   s    r   r   z_ChangeCallsInModule.linese  s     }}"""r   N)rq   rr   rs   r   r:   propertyr   saveitr   r   r   rv   r   r   r9   r9   <  sl    ).* 
\\8  8 
\\-  - 
\\#  #r   r9   c                       e Zd Zd ZddZy)r6   c                     || _         y rN   )finders)r   r   s     r   r   z_MultipleFinders.__init__l  s	    r   Nc                     g }| j                   D ]#  }|j                  |j                  ||             % |j                  d        |S )Nc                 "    | j                         S rN   )r   )xs    r   <lambda>z3_MultipleFinders.find_occurrences.<locals>.<lambda>s  s    1+>+>+@ r   )key)r   extendr   sort)r   r   r   all_occurrencesrB   s        r   r   z!_MultipleFinders.find_occurrenceso  sO    ll 	PF""6#:#:8X#NO	P!@Ar   rp   )rq   rr   rs   r   r   rv   r   r   r6   r6   k  s    r   r6   )r}   rope.base.exceptionsr   	rope.baser   r   r   r   r   r   rope.base.changer	   r
   rope.refactorr   r   r   rV   r   rW   r[   r`   re   rh   r9   r6   rv   r   r   <module>r      s      Q Q 6 4[
 [
|S SB 	) 	-& -<7$ 7(/- /& 6(  6F,# ,#^	 	r   