
    c                     T    d dl Zd dlmZmZmZmZ d dlmZm	Z	m
Z
  G d d          ZdS )    N)codeanalyzeevaluate
exceptionsworder)functionutilsoccurrencessourceutilsc                   6    e Zd ZdZd Zd Zd Zd Zd Zd Z	dS )	IntroduceParametera  Introduce parameter refactoring

    This refactoring adds a new parameter to a function and replaces
    references to an expression in it with the new parameter.

    The parameter finding part is different from finding similar
    pieces in extract refactorings.  In this refactoring parameters
    are found based on the object they reference to.  For instance
    in::

      class A(object):
          var = None

      class B(object):
          a = A()

      b = B()
      a = b.a

      def f(a):
          x = b.a.var + a.var

    using this refactoring on ``a.var`` with ``p`` as the new
    parameter name, will result in::

      def f(p=a.var):
          x = p + p

    c                    || _         || _        || _        | j                             | j                  | _        | j                                                            |          }|                                dk    rt          j	        d          |j
        | _        |                                 \  | _        | _        | j        t          j	        d| j        z            d S )NFunctionz8Introduce parameter should be performed inside functionsz"Cannot find the definition of <%s>)projectresourceoffsetget_pymodulepymodule	get_scopeget_inner_scope_for_offsetget_kindr   RefactoringErrorpyobject
pyfunction_get_name_and_pynamenamepyname)selfr   r   r   scopes        Alib/python3.11/site-packages/rope/refactor/introduce_parameter.py__init__zIntroduceParameter.__init__%   s     11$-@@''))DDVLL>>z) 	-J    .!%!:!:!<!<	4;; 	-4ty@  	 	    c                     t          j        | j                                                  }|                    | j                  S N)r   Worderr   readget_primary_atr   )r   word_finders     r   _get_primaryzIntroduceParameter._get_primary6   s5    mDM$6$6$8$899))$+666r    c                 ~    t          j        | j        | j                  t	          j        | j        | j                  fS r"   )r   get_name_atr   r   r   eval_locationr   )r   s    r   r   z'IntroduceParameter._get_name_and_pyname:   s4    t}dk::"4=$+>>
 	
r    c                    t           j                            | j                  }|j                            ||                                 f           t          j        | j	                                                  }| 
                                \  }}t          j        | j                  \  }}|                    |||                                           |                     ||||           t           j        j                            d|z            }t           j        j                            | j	        |                                          }	|                    |	           |S )NzIntroduce parameter <%s>)r   DefinitionInfor$   r   args_with_defaultsappendr'   r   ChangeCollectorr   _get_header_offsetsr	   get_body_region
add_change	to_string_change_function_occurrencesropebasechange	ChangeSetChangeContentsget_changed)
r   new_parameterdefinition_info	collectorheader_start
header_end
body_startbody_endchangesr7   s
             r   get_changeszIntroduceParameter.get_changes@   s3   '6;;DOLL*11=$BSBSBUBU2VWWW/0B0B0D0DEE	#'#;#;#=#= j*:4?KK
H\:7P7P7R7RSSS))z8]	
 	
 	
 )",,-G--WXX!00	@U@U@W@WXX6"""r    c                    | j         j        }| j                                                                        }| j         j                            |          d         }|                    |          }|                    |          }| j         j	        
                    d|          dz   }| j         j	                            d||          }||fS )N   def   :)r   linesr   r   	get_startlogical_lineslogical_line_inget_line_startget_line_endsource_codefindrfind)r   rI   
start_lineend_linestartends         r   r0   z&IntroduceParameter._get_header_offsetsO   s    #_..00::<<
=.>>zJJ1M$$Z00  **)..ue<<q@m'--c5#>>czr    c                    t          j        | j        | j        | j                  }|                    | j                  D ]@}|                                \  }}||cxk    r|k     rn )|                    |||           Ad S )N)r   )	r   create_finderr   r   r   find_occurrencesr   get_primary_ranger2   )	r   r=   function_startfunction_endnew_namefinder
occurrencerT   rU   s	            r   r4   z/IntroduceParameter._change_function_occurrencesY   s     *4<DKPP 114=1II 	; 	;J#5577JE3 ; ; ; ; ; ; ; ; ;$$UC:::	; 	;r    N)
__name__
__module____qualname____doc__r   r'   r   rC   r0   r4    r    r   r   r      sx         <  "7 7 7
 
 
    ; ; ; ; ;r    r   )rope.base.changer5   	rope.baser   r   r   r   rope.refactorr   r   r	   r   rc   r    r   <module>rg      s        ? ? ? ? ? ? ? ? ? ? ? ? A A A A A A A A A AZ; Z; Z; Z; Z; Z; Z; Z; Z; Z;r    