
    c                    v   d Z ddlmZ ddlZddlmZ ddlmZmZmZm	Z	m
Z
mZmZmZ ddlmZmZmZ ddlmZmZmZmZmZ ddlmZ ej        rdd	lmZmZ dd
Z G d d          Z G d d          Z G d d          Z  G d d          Z! G d d          Z"d Z#d Z$ G d d          Z% G d d          Z&dS )zA module containing classes for move refactoring

`create_move()` is a factory for creating move refactoring objects
based on inputs.

    )annotationsN)Union)codeanalyzeevaluate
exceptionslibutilspynames	pyobjects
taskhandleworder)ChangeContents	ChangeSetMoveResource)functionutilsimportutilsoccurrencesrenamesourceutils)*get_first_decorator_or_function_start_line)project	resourcesc                   |t          | |          S  | j        |          }t          j        ||          }||                                }t          |t          j                  st          |t          j                  r"t          | |	                                          S t          |t          j
                  r0t          |j        t          j                  rt          | ||          S t          |t          j                  rt          |j        t          j                  st          |t          j                  rt#          | ||          S t%          j        d          )zA factory for creating Move objects

    Based on `resource` and `offset`, return one of `MoveModule`,
    `MoveGlobal` or `MoveMethod` for performing move refactoring.

    NzKMove only works on global classes/functions/variables, modules and methods.)
MoveModuleget_pymoduler   eval_location
get_object
isinstancer
   PyModule	PyPackageget_resource
PyFunctionparentPyClass
MoveMethodPyDefinedObjectr	   AssignedName
MoveGlobalr   RefactoringError)r   resourceoffsetthis_pymodulepynamepyobjects         2lib/python3.11/site-packages/rope/refactor/move.pycreate_mover/       sZ     -'8,,,(G(22M#M6::F 9$$&&h	 233 	@zi)8
 8
 	@ gx'<'<'>'>???h	 455 	9*OY.;
 ;
 	9 gx888x!:;;	98?I,>??	9 &'"677	9
 gx888

%U      c                  z    e Zd ZdZd Zddej        fdZd Zd Z	d Z
d Zd	 Zd
 Zd ZddZd Zd Zd Zd ZdS )r$   zFor moving methods

    It makes a new method in the destination class and changes
    the body of the old method to call the new method.  You can
    inline the old method to change all of its occurrences.

    c                :   || _         | j                             |          }t          j        ||          }t	          j        ||          | _        |                                | _        | j        	                                dk    rt          j        d          d S )Nmethodz!Only normal methods can be moved.)r   r   r   r   r   get_name_atmethod_namer   
pyfunctionget_kindr   r(   )selfr   r)   r*   r+   r,   s         r.   __init__zMoveMethod.__init__I   s    11(;;'v>>!-h?? ++--?##%%1 	S-.QRRR	S 	Sr0   Nc                   t          d| j        z            }|| j                                        }||                                 }|                     ||          \  }}}}	t          j        |                                          }
|
	                    |||	           | 
                    ||          \  }}}}||k    r|
	                    |||           nt          j        |                                          }|	                    |||           |                                }t          j        | j                  }|                     |          }|r,t          j        | j        ||          }t#          |||          }||v r#|	                    t%          ||                     ||v r5|	                    t%          ||
                                                     |S )a  Return the changes needed for this refactoring

        Parameters:

        - `dest_attr`: the name of the destination attribute
        - `new_name`: the name of the new method; if `None` uses
          the old name
        - `resources` can be a list of `rope.base.resources.File` to
          apply this refactoring on.  If `None`, the restructuring
          will be applied to all python files.

        zMoving method <%s>)r   r5   r   get_python_filesget_method_name_get_changes_made_by_old_classr   ChangeCollectorread
add_change_get_changes_made_by_new_classget_changedr   ImportTools_get_used_importsr   get_string_module_add_imports_to_moduler   )r8   	dest_attrnew_namer   task_handlechanges	resource1start1end1new_content1
collector1	resource2start2end2new_content2
collector2resultimport_toolsnew_importsgoal_pymodules                       r.   get_changeszMoveMethod.get_changesR   s   & 043CCDD 	85577I 	.++--H040S0Sx1
 1
-	64 !01A1ABB
fdL999040S0Sx1
 1
-	64 	! 	F!!&$====$4Y^^5E5EFFJ!!&$===++--F&24<@@L00>>K  ( :L&)! ! 0 -  I% F"">)V#D#DEEE	! 	T~i9O9O9Q9QRRSSSr0   c                    | j         S N)r5   r8   s    r.   r<   zMoveMethod.get_method_name   s    r0   c                @    t          j        | j        | j                  S r[   )r   get_importsr   r6   )r8   rV   s     r.   rD   zMoveMethod._get_used_imports   s    &t|T_EEEr0   c                Z   | j                                         }|                     | j                   }d                    |||                                           }t          j        | j                   }|                                |d         |d         t          j        ||          fS )Nzreturn self.{}.{}({})
r      )	r6   
get_module_get_scope_indentsformat_get_passed_arguments_stringr   get_body_regionr    fix_indentation)r8   rG   rH   pymoduleindentsbodyregions          r.   r=   z)MoveMethod._get_changes_made_by_old_class   s    ?--//))$/::(//--//
 

 ,T_==!!##1I1I'g66	
 	
r0   c                    |                                 }t          j        |j        |                                                                          t          j        | j                  z   S r[   )ra   r   get_indentslines	get_scope	get_start
get_indentr   )r8   r-   rg   s      r.   rb   zMoveMethod._get_scope_indents   s\    &&((&NH..00::<<
 
"4<001 	1r0   c                   | j         j        }||vrt          j        d|z            ||                                                                         }t          |t          j                  st          j        d|z            |	                                }|	                                
                                }t          j        |          \  }}d}	|j        ||                                         dk    rd}	|}|                     |          }
|	t          j        |                     |          |
          z   }||||fS )Nz$Destination attribute <%s> not foundz%Unknown class type for attribute <%s>
pass

)r6   r"   r   r(   r   get_typer   r
   r#   ra   r    r   re   source_codestriprb   rf   get_new_method)r8   rG   rH   old_pyclasspyclassrg   r)   startend
pre_blanksrh   ri   s               r.   rA   z)MoveMethod._get_changes_made_by_new_class   sT   o,K' 	-6B   i(3355>>@@'9#455 	-7)C   %%''%%''4466 099
s
c	*0022f< 	JE))'22K7))7
 
 
 T))r0   c           	         d                     |                     |          t          j        |                                 t          j        | j                                      S )Nz{}
{})rc   _get_new_headerr   rf   	_get_bodyrp   r   )r8   names     r.   rx   zMoveMethod.get_new_method   sU      &&'  +"8"F"F 
 
 	
r0   c                4    t          j        | j                  S r[   )r   get_bodyr6   r\   s    r.   _get_unchanged_bodyzMoveMethod._get_unchanged_body   s    #DO444r0   hostc                J   |                                  }|dz   |                                 z   }t          j        | j        |          }t          j        | j        |||                   }t          j        |||          }||}||	                    d          dz   d          S )Nz = None
)rg   rr   r`   )
_get_self_namer   r   rE   r   r   create_finderr   rename_in_moduleindex)r8   r   	self_nameri   rg   finderrU   s          r.   r   zMoveMethod._get_body   s    ''))	;&)A)A)C)CC-dlDAA*4<HYDWXX(III 	Ffll4((1,..//r0   c                @    | j                                         d         S Nr   )r6   get_param_namesr\   s    r.   r   zMoveMethod._get_self_name   s    ..0033r0   c                    d|z  }|                                  r|dz  }t          j                            | j                  }|                    d          }|r|d|z   z  }|dz   S )Nzdef %s(selfz, hostr`   , z):_is_host_usedr   DefinitionInfor?   r6   arguments_to_string)r8   r   headerdefinition_infootherss        r.   r   zMoveMethod._get_new_header   su    % 	hF'6;;DOLL 44Q77 	$dVm#F}r0   c                    d}|                                  rd}t          j                            | j                  }|                    d          }|r|r|dz  }||z  }|S )N r8   r`   r   r   )r8   rU   r   r   s       r.   rd   z'MoveMethod._get_passed_arguments_string   ss     	F'6;;DOLL 44Q77 	 $fFr0   c                X    |                      d          |                                 k    S )N
__old_self)r   r   r\   s    r.   r   zMoveMethod._is_host_used   s%    ~~l++t/G/G/I/IIIr0   )r   )__name__
__module____qualname____doc__r9   r   DEFAULT_TASK_HANDLErY   r<   rD   r=   rb   rA   rx   r   r   r   r   rd   r    r0   r.   r$   r$   @   s        S S S 25 5 5 5n     F F F
 
 
 1 1 1* * *0
 
 
5 5 50 0 0 04 4 4  
 
 
J J J J Jr0   r$   c                      e Zd ZU dZded<   d Zd Zd Zd Zd Z	d	 Z
d
ej        fddZd Zd Zd Zd Zd Zd Zd Zd Zd Zd
S )r'   z&For moving global function and classeszproject.Projectr   c                   || _         | j                             |          }t          j        ||          | _        | j        t          j        d          |                     | j                  rt          j	        ||          | _
        |}n[| j                                                                        | _
        | j                                                                        }|                                  |                                | _        t#          | j         | j        | j        | j
                  | _        | j        j        | _        d S )NzBMove refactoring should be performed on a class/function/variable.)r   r   r   r   
old_pynamer   r(   _is_variabler   r4   old_namer   get_namera   _check_exceptional_conditionsr    source
_MoveToolstoolsrV   )r8   r   r)   r*   r+   rg   s         r.   r9   zMoveGlobal.__init__   s&   11(;;"0GG? 	-T   T_-- 	A".x@@DM$HH O6688AACCDM1133>>@@H**,,,++--L$+t
 

 !J3r0   c                   t          j        | j                  t          |j        t
          j                  r%t          fd|j        j        D                       S t          |j        t
          j	                  rddv rP
                    dd          \  }|j        j        |k    r't          fd|j        j        D                       rdS |j        j        k    S dS )Nc              3  *   K   | ]\  }}|k    V  d S r[   r   ).0r   aliasmodule_names      r.   	<genexpr>z,MoveGlobal._import_filter.<locals>.<genexpr>  s@        D% t#     r0   .r`   c              3  *   K   | ]\  }}|k    V  d S r[   r   )r   r   r   basenames      r.   r   z,MoveGlobal._import_filter.<locals>.<genexpr>  sH       H H#e $H H H H H Hr0   TF)r   modnamer   r   import_infor   NormalImportanynames_and_aliases
FromImportrsplitr   )r8   stmtpackage_namer   r   s      @@r.   _import_filterzMoveGlobal._import_filter	  s#   &t{33d&(@AA 	?    #'#3#E      (+*@AA 		?k!  )4););C)C)C&h#/<?  C H H H H'+'7'IH H H E E    4#/;>>ur0   c                   |                      | j                  rx| j                                        d         }	 |                                                    | j                   d S # t          j        $ r |                                  Y d S w xY wt          | j        
                                t          j                  r,|                     | j        
                                          s|                                  d S d S r   )r   r   get_definition_locationrn   r   r   r   NameNotFoundError_raise_refactoring_errorr   r   r
   r%   
_is_global)r8   rg   s     r.   r   z(MoveGlobal._check_exceptional_conditions  s   T_-- 
	,>>@@CH0""$$--dm<<<<</ 0 0 0--//////0 t1133Y5NOO	, : : < <==	, ))+++++		, 	,s   ,A) )#BBc                *    t          j        d          )NzMMove refactoring should be performed on a global class, function or variable.)r   r(   r\   s    r.   r   z#MoveGlobal._raise_refactoring_error+  s    )
 
 	
r0   c                    |                                 j        |                                                                 k    S r[   )rn   r"   ra   )r8   r-   s     r.   r   zMoveGlobal._is_global1  s4    !!##*h.A.A.C.C.M.M.O.OOOr0   c                6    t          |t          j                  S r[   )r   r	   r&   )r8   r,   s     r.   r   zMoveGlobal._is_variable4  s    &'"6777r0   Ndest$Union[None, str, resources.Resource]c                "   t          |t                    r| j                            |          }|| j                                        }||                                st          j        d          |                                r*|	                    d          r|
                    d          }|                                rt          j        d          | j        |k    rt          j        d          |                     |||          S )aS  Return the changes needed for this refactoring

        Parameters:

        - `dest`: the Resource or dotted moddule name of the move destination
        - `resources` can be a list of `rope.base.resources.File` to
          apply this refactoring on.  If `None`, the restructuring
          will be applied to all python files.

        Nz Move destination does not exist.__init__.pyz7Move destination for non-modules should not be folders.z*Moving global elements to the same module.)r   strr   find_moduler;   existsr   r(   	is_folder	has_child	get_childr   _calculate_changesr8   r   r   rI   s       r.   rY   zMoveGlobal.get_changes7  s     dC   	2<++D11D 	85577I 	Rt{{}} 	R-.PQQQ>> 	1} = = 	1>>-00D>> 	-I   ;$ 	-<   &&tYDDDr0   c                h   t          d| j        z            }|                    dt          |                    }|D ]}|                    |j                   || j        k    r*|                    |                     |                     n||k    r*|                    | 	                    |                     n]| j
                            |          rA| j                            |          }d| j        z  }| j
                            ||          }	|	d u}
| j
                            ||	          }| j                            |d| j                  }	|
rh| j
                            ||	          }t'          j        | j        ||                     |          | j                  \  }	}|	                    ||          }	| j
                            ||	          }	|	|                                k    r#|                    t3          ||	                     |                                 |S )NzMoving global <%s>zCollecting Changesr)   z__rope_renaming_%s_F)sortimport_filter)r   r   create_jobsetlenstarted_jobpathr   r@   _source_module_changes_dest_module_changesr   occurs_in_moduler   r   r   new_pymodulerV   organize_importsr   r   
add_import_new_modnamereplace
new_sourcer?   r   finished_job)r8   r   r   rI   rJ   job_setfile_rg   placeholderr   should_importimporteds               r.   r   zMoveGlobal._calculate_changesY  s,   04=@AA++,@#i..QQ 	# 	#E
+++# F""4#>#>t#D#DEEEE$ F""4#<#<T#B#BCCCC,,e,<< F<44U;;3dmC44[54QQ &d 2:228VDD*;;58K <   ! C#z66xHHH'2'=h0A0A$0G0G( ($FH $^^KBBF..x@@UZZ\\) F&&~eV'D'DEEE  """"r0   c                   d| j         z  }t          |          }t          j        | j        | j         | j                  }|                                 \  }}t          || j        |||          }|	                                }t          j        | j        || j                  }	| j                            |	d          }|j        rmt          j        | j        || j                  }	t          j        | j        |	|                     |          | j                   \  }}
|                    ||
          }t'          | j        |          S )Nz__rope_moving_%s_F)r   )r   _ChangeMoveOccurrencesHandler   r   r   r   _get_moving_regionModuleSkipRenamerr   get_changed_moduler   rE   rV   r   occurredr   r   r   r   r   )r8   r   r   handleoccurrence_finderr{   r|   renamerr   rg   r   s              r.   r   z!MoveGlobal._source_module_changesz  s*   )DM9-k::'5L$-
 
 ,,..
s#$5t{FESVWW++---dlFDKPP"33H53II? 	;1$,TTH*5h(9(9$(?(?   FH ^^K::Fdk6222r0   c                *    t          j        |          S r[   )r   r   r8   r   s     r.   r   zMoveGlobal._new_modname  s    %%%r0   c                   | j                             |          }| j                            | j        |          }| j                            ||          }|                                 \  }}|                     ||          \  }}| j        	                    |          }|j
        }d}|j        r|j        d         j        dz
  }n||j                                        k     r|j                            |dz                                                                 d          rd|dz  }||j                                        k     rB|j                            |dz                                                                 d          d|dk    r9|j                            |          dz   }	|d |	         dz   |z   ||	d          z   }
n||z   }
|
}t'          j        | j         ||          }| j                            |dd          }t'          j        | j         ||          }| j                            |ddd| j        	          }t/          ||          S )
Nr   r`   #rt   F)r   unusedT)r   selfsr   r   )r   r   r   r   r   r    _get_moving_element_with_imports_add_imports2rV   module_importsrv   importsend_linerm   lengthget_linelstrip
startswithget_line_endr   rE   r   r   r   )r8   r   rg   r   movingr   has_changedmodule_with_importslinenocutrU   s              r.   r   zMoveGlobal._dest_module_changes  sN   <,,T22,,T]HEE:**8V<<??AA $ 2 28W E E+"/>>xHH%& 	(04=AFF8>00222 x~7N7N
8 8fhhzz# ! 8>00222 x~7N7N
8 8fhhzz# A: 	%.--f559CDSD\F*V3fSTTlBFFf_F -dlFDII"33H5QV3WW-dlFDII"33- 4 
 
 dF+++r0   c                \    t          | j        | j        |                                           S r[   )moving_code_with_importsr   r   _get_moving_elementr\   s    r.   r   z+MoveGlobal._get_moving_element_with_imports  s+    'L$+t'?'?'A'A
 
 	
r0   c                l    t          j        | j        ||          }| j                            |          S r[   )r   rE   r   rV   r   )r8   rv   r)   rg   s       r.   _get_module_with_importsz#MoveGlobal._get_module_with_imports  s/    -dlKRR //999r0   c                    |                                  \  }}| j                                        ||         }|                                dz   S )Nrr   )r   r   r?   rstrip)r8   r{   r|   r  s       r.   r  zMoveGlobal._get_moving_element  sF    ,,..
s!!##E#I.}}%%r0   c                   | j                             | j                  }|j        }|                     | j                  rp|j        }|                    | j                                        d                   d         }|	                    |          }|                    |          d         }n}| j        
                                j        }|	                    t          |                    }| j        
                                                                                                }|                    |          }|dk    ra|                    |dz
                                d          r6|dz  }|dk    r+|                    |dz
                                d          6|	                    |          }||                                k     ry|                    |dz                                             dk    rK|dz  }||                                k     r.|                    |dz                                             dk    Kt)          |                    |          dz   t-          |j                            }	||	fS )Nr`   r   r   r   )r   r   r   rm   r   r   logical_lineslogical_line_inr   get_line_startr   ast_noder   rn   get_endget_line_numberr  r  r   rw   minr  r   rv   )
r8   rg   rm   r  r  r{   r   node
start_liner|   s
             r.   r   zMoveGlobal._get_moving_region  sY   <,,T[99T_-- 	J$2M"227799!< F ((00E$44V<<Q?HH?--//8D((:4@@ E 1133==??GGIIH **511
1n 	
Q!?!?!J!J3!O!O 	!OJ 1n 	
Q!?!?!J!J3!O!O 	$$Z00' 	ENN8a<,H,H,N,N,P,PTV,V 	MH ' 	ENN8a<,H,H,N,N,P,PTV,V 	%$$X..2C8L4M4MNNczr0   c                    | j                             ||          }||dfS |                                }t          j        | j        ||          }|dfS )NFT)r   add_importsr    r   rE   r   )r8   rg   rW   r   r)   s        r.   r   zMoveGlobal._add_imports2  s\    ''+>> 	"U?",,..H1$,QQHT>!r0   )r   r   )r   r   r   r   __annotations__r9   r   r   r   r   r   r   r   rY   r   r   r   r   r   r  r  r   r   r   r0   r.   r'   r'      s8        004 4 4*  *, , ,
 
 
P P P8 8 8 2	 E  E  E  E  ED  B3 3 3(& & &&, &, &,P
 
 

: : :& & &
  8" " " " "r0   r'   c                  Z    e Zd ZdZd Zdej        fdZd Zd Z	d Z
d Zdd	Zd
 Zd ZdS )r   zFor moving modules and packagesc                   || _         |                                s|j        dk    r|j        }|                                r)|                    d          st          j        d          t          j        | j         d          }t          j
        ||          | _        | j                                                                        | _        | j                                        r| j        j        | _        n| j        j        d d         | _        t!          | j         | j        | j        | j                  | _        | j        j        | _        d S )Nr   zCannot move non-package folder.r   r   )r   r   r   r"   r   r   r(   r   rE   r	   ImportedModuler   r   r    r   r   r   r   rV   )r8   r   r)   dummy_pymodules       r.   r9   zMoveModule.__init__  s+   !!## 	'(F 	'H 	Q(:(:=(I(I 	Q-.OPPP!3DL"EE!0(SSSo0022??AA;  "" 	2 K,DMM K,SbS1DML$+t
 

 !J3r0   Nc                    || j                                         }||                                st          j        d          |                     |||          S )Nz0Move destination for modules should be packages.)r   r;   r   r   r(   r   r   s       r.   rY   zMoveModule.get_changes  sj      	85577I 	t~~// 	-B   &&tYDDDr0   c                    t          d| j        z            }|                    dt          |                    }|D ]}|                    |j                   || j        k    r|                     ||           n<|                     ||          }|#|	                    t          ||                     |                                 | j        | j        j        k    r-|	                    t          | j        |j                             |S )NzMoving module <%s>zCollecting changesr   )r   r   r   r   r   r   r   _change_moving_module_change_occurrences_in_moduler@   r   r   r   r   )r8   r   r   rI   rJ   r   moduler   s           r.   r   zMoveModule._calculate_changes  s   04=@AA++,@#i..QQ 	# 	#F,,,$ G**7D9999;;D6;RR G&&~ff'E'EFFF  """"<4;.. 	E|DKCCDDDr0   c                V    t          j        |          }|r|dz   | j        z   S | j        S )Nr   )r   r   r   )r8   r   destnames      r.   r   zMoveModule._new_modname  s3    #D)) 	2c>DM11}r0   c                V    t          j        |                     |          d fg          S r[   )r   r   r   r   s     r.   _new_importzMoveModule._new_import#  s)    '$*;*;D*A*A4)H(IJJJr0   c                   | j                                         s| j                            | j                   }| j                            |          }| j                            ||          }|                     ||          }| j        	                    ||          }|| j         
                                k    r,|                    t          | j         |                     d S d S d S r[   )r   r   r   r   rV   relatives_to_absolutesr   r   r&  r   r?   r@   r   )r8   rJ   r   rg   r   s        r.   r%  z MoveModule._change_moving_module&  s    {$$&& 	H|00==H&==hGGFz..x@@H77hGGFZ**8V<<F))+++ H"">$+v#F#FGGGGG	H 	HH Hr0   c                   | j                             ||          sd S || j                            |          }|                     |          }t          j        | j        |          }d}d }t          j        |          rc| 	                    |||          }|rJ|
                                }| j                             ||          }| j                             ||          }|                     |          }| j                             |d||s|nd           }| j                             ||d          }	| j                             ||          }| j                             |          }|	r7| j                             ||          }| j                             ||g          }| j                             ||          }|||j                                        k    r|S d S )Nrg   r)   FT)r   rg   r)   )rg   r)   r   )r   r   r   r   r   r   get_module_importsr   r   _change_import_statementsget_changed_sourcer   r   r+  r   remove_old_importsr  r)   r?   )
r8   r   rg   r)   rH   r   changedr   
new_importr   s
             r.   r&  z(MoveModule._change_occurrences_in_module0  s   z**Hx*PP 	F 	;|00::H$$T**$7hOOD!! 	E44T8^TTG E'::<<..x@@:228VDD%%d++
,,%,6XX$	 - 
 
 
33% 4 
 
 :**8V<<..x88 	Dz..x@@HZ++HzlCCF&&x88 	&H,=,B,B,D,D"D 	Mtr0   c                d     j         }|j        }d}|j        D ]}t           fd|j        j        D                       s&t           fd|j        j        D                       sNt          |j        t          j                  rn 	                    ||||          p|}t          j
                             j        d           }|j                                        sO|j                            |          |k    r1t          j        ||j        j        |j        j                  |_        d}|S )NFc              3  :   K   | ]}|d          j         k    V  dS r   N)r   r   name_and_aliasr8   s     r.   r   z7MoveModule._change_import_statements.<locals>.<genexpr>Z  sC        " q!T]2     r0   c              3  ^   K   | ]'}|d          t          j        j                  k    V  (dS r8  )r   r   r   r9  s     r.   r   z7MoveModule._change_import_statements.<locals>.<genexpr>]  sN        " q!X%5dk%B%BB     r0   T)r   r"   r   r   r   r   r   r   r   "_handle_moving_in_from_import_stmt
importinfoImportContextr   is_emptyget_imported_resourcer   level)	r8   r   rH   r   moving_moduleparent_moduler4  import_stmtcontexts	   `        r.   r1  z$MoveModule._change_import_statementsT  s   %,)1 "	 "	K    &1&=&O          &1&=&O      +1;3KLL  77+~}   	  ",::4<NNG+4466
+AA'JJ !

 +6*@+1+=+ +'
 r0   c                ,   d}t           j                            | j        d           }|j                            |          |k    r|j        j        }g }|D ]o\  }	}
|	| j        k    rHd}t          j        t          j
        |          d| j        |
fg          }|                    |           X|                    |	|
f           p||k    rHd}|r0t          j        |j        j        |j        j        |          |_        n|                                 |S )NFTr   )r   r=  r>  r   r   r@  r   r   r   r   r   r   appendr   rA  empty_import)r8   r   rD  r   rC  r4  rE  r   rW   r   r   r5  s               r.   r<  z-MoveModule._handle_moving_in_from_import_stmt  s<    (66t|TJJ"88AA]R 	/!-?GK& 	6 	6e4=( 6"G!,!7 (..T]E4J3K" "J #--j9999&&e}5555 g% 	/ /.9.D#/;#/5#/ /K++  ,,...r0   )NN)r   r   r   r   r9   r   r   rY   r   r   r+  r%  r&  r1  r<  r   r0   r.   r   r     s        ))4 4 4& #
0N	E 	E 	E 	E     K K KH H H" " " "H) ) )V    r0   r   c                       e Zd Zd Zd Zd ZdS )r   c                "    || _         d| _        d S )NF)rH   r   )r8   rH   s     r.   r9   z%_ChangeMoveOccurrencesHandle.__init__  s     r0   c                    d S r[   r   r8   change_collector
occurrences      r.   occurred_inside_skipz1_ChangeMoveOccurrencesHandle.occurred_inside_skip      r0   c                z    |                                 \  }}|                    ||| j                   d| _        d S )NT)get_primary_ranger@   rH   r   )r8   rM  rN  r{   r|   s        r.   occurred_outside_skipz2_ChangeMoveOccurrencesHandle.occurred_outside_skip  s<    1133
s##E3>>>r0   N)r   r   r   r9   rO  rS  r   r0   r.   r   r     sA                r0   r   c                  B    e Zd Zd Zd ZddZddZd Zd	 Zd
 Z	d Z
dS )r   c                z    || _         || _        || _        || _        t	          j        | j                   | _        d S r[   )r   r   r   r   r   rC   rV   )r8   r   r   r,   r   s        r.   r9   z_MoveTools.__init__  s9      '3DLAAr0   c                     j         } j                                      } G  fdd          } |            }|                    |           |                                }||k    r|S d S )Nc                  :    e Zd ZdZj        Zj        Z fdZdS )0_MoveTools.remove_old_imports.<locals>.CanSelectFc                    	 || j         k    r>|                                         | j                                        k    r	d| _        dS n# t          j        $ r Y nw xY wdS )NTF)r   r   r   r4  r   AttributeNotFoundError)r8   r   rg   s     r.   __call__z9_MoveTools.remove_old_imports.<locals>.CanSelect.__call__  sy    -%$TN55774?;U;U;W;WW% (,$u!8   Dts   AA AAN)r   r   r   r4  r   r   r[  )rg   r8   s   r.   	CanSelectrX    sA        G}HJ
 
 
 
 
 
 
r0   r\  )rv   rV   r   filter_namesr2  )r8   rg   
old_sourcer  r\  
can_selectr   s   ``     r.   r3  z_MoveTools.remove_old_imports  s    )
"/>>xHH	 	 	 	 	 	 	 	 	 	 	" Y[[
((444(;;==
# 		 	r0   NFc                b    |                      |          }t          j        ||d||          }|S )NT)replace_primaryrg   r)   )_create_finderr   r   )r8   rH   rg   r   r)   r   r   s          r.   r   z_MoveTools.rename_in_module  sC     //88( 
 
 
 r0   Tc                    |                      |          }|                    ||          }t                      }t          ||          |uS )Nr/  )rb  find_occurrencesobjectnext)r8   rg   r)   r   r   r   sentinels          r.   r   z_MoveTools.occurs_in_module  sK    $$W----x(-SS88K**(::r0   c                R    t          j        | j        | j        | j        |d          S )NF)r   keywords)r   r   r   r   r   )r8   r   s     r.   rb  z_MoveTools._create_finder  s1    (LMO
 
 
 	
r0   c                d    |-t          j        | j        ||                                          S |S r[   )r   rE   r   r    r8   rg   r   s      r.   r   z_MoveTools.new_pymodule  s;     	-fh&;&;&=&=   r0   c                    ||j         S |S r[   )rv   rk  s      r.   r   z_MoveTools.new_source  s     	(''r0   c                .    t          | j        ||          S r[   )rF   rV   )r8   rg   rW   s      r.   r  z_MoveTools.add_imports  s    %d&7;OOOr0   )NFN)NNT)r   r   r   r9   r3  r   r   rb  r   r   r  r   r0   r.   r   r     s        B B B  6	 	 	 	; ; ; ;
 
 
    
P P P P Pr0   r   c                    |                      |          }|D ]}|                    |           |                                S r[   )r   r   r2  )rV   rg   rW   r  r5  s        r.   rF   rF     sN    &55h??! 3 3
&&z222211333r0   c                   t          j        |           }t          j        | ||          t	          j        |          }d}||                                k     rm|                    |                              d          rE|dz  }||                                k     r(|                    |                              d          E|d |	                    |                   }t          j        | ||	                    |          d          |           | j
        |          }d |                    |          j        D             }fd|D             }	|                    |                    ||	                     t          ||          }t          j        | ||          |                              }t          j        | ||          |                    d          }t          j        | ||          |                              }
d |
j        D             }d}|
j        r|
j        d         j        }t	          j        |          }||                                k     rk|                    |                                          sD|dz  }||                                k     r'|                    |                                          D|||	                    |          d          z   }||fS )	Nr`   r   c                    g | ]	}|j         
S r   r   )r   r   s     r.   
<listcomp>z,moving_code_with_imports.<locals>.<listcomp>  s    XXXDtXXXr0   c                    g | ]}|v|	S r   r   )r   r   rg   s     r.   rr  z,moving_code_with_imports.<locals>.<listcomp>  s#    BBB4T-AB$BBBr0   F)r   c                    g | ]	}|j         
S r   rq  )r   rD  s     r.   rr  z,moving_code_with_imports.<locals>.<listcomp>"  s    QQQ;{&QQQr0   r   )r   rC   r   rE   r   SourceLinesAdapterr   r  r  r  r   r   r   rG  get_from_importrF   r-  r   r   rw   )r   r)   r   rV   rm   r{   moving_prefixoriginr   
back_namesr   r  rg   s               @r.   r  r    s   *733L)'68DDH *622EE
%,,..
  U^^E%:%:%E%Ec%J%J 
 %,,..
  U^^E%:%:%E%Ec%J%J 8U11%8889M),,U33556 H "W!(++FXXL,G,G,O,O,WXXXGBBBB6BBBJNN<//*EEFFF#L(GDDF)'68DDH00::F)'68DDH**85*AAF)'68DDH "00::NQQ.:PQQQGE 4&r*3*622E
%,,..
  )>)>)D)D)F)F 
 %,,..
  )>)>)D)D)F)F  VE$8$8$?$?$A$ABBF7?r0   c                      e Zd Zd Zd ZdS )ModuleSkipRenamerHandlec                    d S r[   r   rL  s      r.   rS  z-ModuleSkipRenamerHandle.occurred_outside_skip0  rP  r0   c                    d S r[   r   rL  s      r.   rO  z,ModuleSkipRenamerHandle.occurred_inside_skip3  rP  r0   N)r   r   r   rS  rO  r   r0   r.   r{  r{  /  s2              r0   r{  c                  (    e Zd ZdZ	 	 	 	 ddZd ZdS )r   zRename occurrences in a module

    This class can be used when you want to treat a region in a file
    separately from other parts when renaming.

    Nr   r   c                    || _         || _        || _        || _        || _        || _        | j        t                      | _        dS dS )zConstructor

        if replacement is `None` the region is not changed.  Otherwise
        it is replaced with `replacement`.

        N)r   r)   
skip_startskip_endreplacementr   r{  )r8   r   r)   r   r  r  r  s          r.   r9   zModuleSkipRenamer.__init__?  sU     "3 $ &; 	4133DKKK	4 	4r0   c                   | j                                         }t          j        |          }| j        &|                    | j        | j        | j                   | j        	                    | j                   D ]j}|
                                \  }}| j        |cxk    r| j        k     rn n| j                            ||           O| j                            ||           k|                                }|||k    r|S d S d S r[   )r)   r?   r   r>   r  r@   r  r  r   rd  rR  r   rO  rS  rB   )r8   r   rM  rN  r{   r|   rU   s          r.   r   z$ModuleSkipRenamer.get_changed_moduleW  sI   ##%%&6v>> 	''0@   0AA$-PP 	P 	PJ#5577JE3% P P P P$- P P P P P001A:NNNN112BJOOOO!--// 	&F"2 	M	 	 	 	r0   )Nr   r   r   )r   r   r   r   r9   r   r   r0   r.   r   r   7  sO          4 4 4 40    r0   r   r[   )'r   
__future__r   typingr   	rope.baser   r   r   r   r	   r
   r   r   rope.base.changer   r   r   rope.refactorr   r   r   r   r   (rope.refactor.importutils.module_importsr   TYPE_CHECKINGr   r   r/   r$   r'   r   r   r   rF   r  r{  r   r   r0   r.   <module>r     s    # " " " " "       	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 E D D D D D D D D D V V V V V V V V V V V V V V      
 -,,,,,,,,   @lJ lJ lJ lJ lJ lJ lJ lJ^{" {" {" {" {" {" {" {"|p p p p p p p pf       JP JP JP JP JP JP JP JPZ4 4 4* * *Z       / / / / / / / / / /r0   