o
    DDi(I                     @   s   d dl Z d dlmZmZmZmZmZmZ d dlZ	d dl
mZmZ d dlmZmZ d dlmZ d dlmZ dedee	je	jf f d	edee	je	jf f fd
dZG dd deZdS )    N)CallableOptionalSequenceSetTupleUnion)CodemodContextVisitorBasedCodemodCommand)AddImportsVisitorRemoveImportsVisitor)get_full_name_for_node)QualifiedNameProvidermethod.returnc              
      sF   dddt tjtjf dt tjtjf dt tjtjf f fdd}|S )NselfRenameCommandoriginal_nodeupdated_noder   c                    s"    | ||}||kr|  | |S N)record_asname)r   r   r   r    W/var/www/Datamplify/venv/lib/python3.10/site-packages/libcst/codemod/commands/rename.pywrapper   s   
z'leave_import_decorator.<locals>.wrapper)r   cstImport
ImportFrom)r   r   r   r   r   leave_import_decorator   s   
r   c                
       sd  e Zd ZU dZdZeed< efZe	de
jddfddZd	ed
ededdf fddZedeeeef  fddZejdeeeef  ddfddZedeeejeeee ee f f  fddZejdeeejeeee ee f f  ddfddZedefddZejdeddfddZdejddfddZedejdejdejfddZdejddfdd Z edejdejdejfd!d"Z!dej"dej"deej#ej"f fd#d$Z$dej#dej#deej"ej#f fd%d&Z%dej&dej&dej&fd'd(Z'd)edefd*d+Z(d,edefd-d.Z)d/edeej#ej"f fd0d1Z*deejejf ddfd2d3Z+  Z,S )4r   z=
    Rename all instances of a local or imported object.
    z3Rename all instances of a local or imported object.DESCRIPTION
arg_parserr   Nc                 C   s(   | j ddddd | j ddddd d S )	Nz
--old_nameold_nameTz7Full dotted name of object to rename. Eg: `foo.bar.baz`)destrequiredhelpz
--new_namenew_namea  Full dotted name of replacement object. You may provide a single-colon-delimited name to specify how you want the new import to be structured.
Eg: `foo:bar.baz` will be translated to `from foo import bar`.
If no ':' character is provided, the import statement will default to `from foo.bar import baz` for a `new_name` value of `foo.bar.baz` or simply replace the old import on the spot if the old import is an exact match.)add_argument)r   r   r   r   add_args,   s   
zRenameCommand.add_argscontextr    r$   c           
         s   t  | |d\}}}d|v rtdd|v rtd|r"|s*|d\}}}|ddd| _|ddd| _|| _| jsI|}d}	n|d\}}}	|| _	|| _
|	| _d S )N:z3Error: `new_name` should contain at most one colon.z0Error: `old_name` should not contain any colons.. )super__init__
rpartition
ValueErrorreplacestripr$   
new_modulenew_mod_or_objr    
old_moduleold_mod_or_obj)
r   r'   r    r$   r1   	has_colonr2   _r3   r4   	__class__r   r   r,   A   s$   
zRenameCommand.__init__c                 C   s$   d| j jvrd | j jd< | j jd S Nas_namer'   scratchr   r   r   r   r:   _   s   zRenameCommand.as_namevaluec                 C      || j jd< d S r9   r;   r   r>   r   r   r   r:   e      c                 C   s&   d| j jvrt | j jd< | j jd S )zA set of nodes that have been renamed to help with the cleanup of now potentially unused
        imports, during import cleanup in `leave_Module`. Can also contain tuples that can be passed
        directly to RemoveImportsVisitor.remove_unused_import().scheduled_removals)r'   r<   setr=   r   r   r   rB   i   s   z RenameCommand.scheduled_removalsc                 C   r?   )NrB   r;   r@   r   r   r   rB   t   s   c                 C   s$   d| j jvrd| j jd< | j jd S )zaA flag to indicate that an import has been renamed while inside an `Import` or `ImportFrom` node.bypass_importFr;   r=   r   r   r   rD   z   s   zRenameCommand.bypass_importc                 C   r?   )NrD   r;   r@   r   r   r   rD      rA   nodec                 C   sB   |j D ]}t|j}|d ur|| jks|| jd rd| _qd S Nr)   T)namesr   namer    
startswithrD   )r   rE   import_alias
alias_namer   r   r   visit_Import   s   

zRenameCommand.visit_Importr   r   c           	      C   s   g }|j D ]c}|| |j}t|}|d u rtd| j|d rG| |}|s+qd| _||krF| j	
| | |}|tj|d q|| jkrh|jd urhd| _| j	
|jd |jf ||jd d q|j|dS )Nz4Could not parse full name for ImportAlias.name node.r)   TrH   )asnamerG   )rG   appendrH   r   	Exceptionr    rI   gen_replacement_modulerD   rB   addgen_name_or_attr_noder   ImportAliasr$   rN   evaluated_nameevaluated_aliaswith_changes)	r   r   r   	new_namesrJ   import_alias_nameimport_alias_full_namereplacement_modulenew_name_noder   r   r   leave_Import   s<   




zRenameCommand.leave_Importc                 C   sN   |j }|d u r	d S t|}|d u rd S || jks || jd r%d| _d S d S rF   )moduler   r    rI   rD   )r   rE   r_   imported_module_namer   r   r   visit_ImportFrom   s   
zRenameCommand.visit_ImportFromc                 C   sf  |j }|d u r	|S t|}|j}|d u st|ts|S g }|D ]s}t|j}|d ur| d| }	| j|	kr| |}
| |}|sN|	| | j
| q| |}t|dkrn|jt|
d}| j
| |	| q|
|kr~d| _|	tj|d q| j|	d r| j
| |	| qt|d jtjr|jd u r|d jtjjd|d< |j|dS )	Nr)      )r_   TrM   )commarO   )r_   r   rG   
isinstancer   rH   r    rR   gen_replacementrP   rB   rS   rT   lenrX   r   parse_expressionrD   rU   rI   rd   CommarparMaybeSentinelDEFAULT)r   r   r   r_   r`   rG   rY   rJ   rK   	qual_namer\   replacement_objnew_import_alias_namer   r   r   leave_ImportFrom   sX   






zRenameCommand.leave_ImportFromc                 C   sh   |j }| |}| t|t  }t| || js |r2|| jkr2|s%| j}|s-| j	| | 
|S |S r   )r>   rf   get_metadatar   rC   has_namer    r$   rB   rS   rT   )r   r   r   full_name_for_nodefull_replacement_nameinside_import_statementr   r   r   
leave_Name  s   


zRenameCommand.leave_Namec           	      C   s   t |}|d u rtd| |}| t|t  }t| || js)|re|| jkre| j	| j
}}|s9| j|j || jkr`t|}|rS|j|tj|dddS t|tjtjfs^J |S | |S |S )Nz-Could not parse full name for Attribute node.r)   )r>   )r>   attr)r   rQ   rf   rq   r   rC   rr   r    r$   r1   r2   rB   rS   r>   r   rh   rX   Namerstripre   	AttributerT   )	r   r   r   rs   rt   ru   	new_valuenew_attrr>   r   r   r   leave_Attribute  s:   




zRenameCommand.leave_Attributec                 C   s   | j D ]}t|trt| j|d |d |d  qt| j| q| jsG| j rG| jrG| jdkrG| j	r;| j	
dd nd }tj| j| j|d |S )Nr   rb      builtinsr)   )r_   obj)rB   re   tupler   remove_unused_importr'   remove_unused_import_by_noderD   r1   r2   splitr
   add_needed_import)r   r   r   removalnew_objr   r   r   leave_Module>  s   


zRenameCommand.leave_Moduleoriginal_namec                 C   s   | j }|d ur*||d kr|d }n||d d r*||d d |d d d}| jr5|| jkr5| jS || jkrF| jsC| jrC| jS | jS |	d| j rQ| jS | 
|S )Nr   rb   r)   )r:   rI   r/   r3   r4   r2   r    rD   r$   endswithrR   )r   r   module_as_namer   r   r   rf   T  s*   


zRenameCommand.gen_replacementoriginal_modulec                 C   s   || j kr| jS dS )Nr*   )r3   r1   )r   r   r   r   r   rR   k  s   z$RenameCommand.gen_replacement_moduledotted_expressionc                 C   s(   t |}t|t jt jfstd|S )NzC`parse_expression()` on dotted path returned non-Attribute-or-Name.)r   rh   re   rx   rz   rQ   )r   r   name_or_attr_noder   r   r   rT   n  s   
z#RenameCommand.gen_name_or_attr_nodec                 C   s   |j }t|ts
d S |D ]g}t|j}t|tjr6|j}|d u r# d S t|}|d u r. d S | d| }n|}|d urs|d urs|| jksM| j	|d rs|j
}|d urW|jnd }	|	d urst|	tjtjfrst|	}
|
d urs|
|f| _qd S )Nr)   )rG   re   r   r   rH   r   r   r_   r    rI   rN   rx   rz   r:   )r   r   rG   rJ   rK   r_   module_namerm   as_name_optionalas_name_nodefull_as_namer   r   r   r   x  s:   



zRenameCommand.record_asname)-__name__
__module____qualname____doc__r   str__annotations__r   METADATA_DEPENDENCIESstaticmethodargparseArgumentParserr&   r   r,   propertyr   r   r:   setterr   r   r   CSTNoderB   boolrD   r   rL   r   r^   r   ra   rp   rx   rz   rv   r}   Moduler   rf   rR   rT   r   __classcell__r   r   r7   r   r   #   s   
  "
",;

"

&
r   )r   typingr   r   r   r   r   r   libcstr   libcst.codemodr   r	   libcst.codemod.visitorsr
   r   libcst.helpersr   libcst.metadatar   r   r   r   r   r   r   r   r   <module>   s    
