o
    ï›hm6  ã                   @   s  d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	m
Z
 d dlmZ d dlmZmZ dZe
d	 ¡  Zd
d„ Zdd„ Zdd„ Z	d1dd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Z d'd(„ Z!d)d*„ Z"d+d,„ Z#d-d.„ Z$d/d0„ Z%dS )2é    )Údedent)Úsplit_lines)Údebug)ÚRefactoringError)ÚRefactoringÚEXPRESSION_PARTS)Úindent_block)Úfunction_is_classmethodÚfunction_is_staticmethod©ZsuiteÚ
file_inputz_atom testlist_star_expr testlist test lambdef lambdef_nocond keyword name number string fstringc                 C   s\   t |||ƒ}t d|¡ t|ƒ\}}|st|ƒ‚|d t|ƒ }	|t|||	|ƒi}
t| |
ƒS )NzExtracting nodes: %sú = )Ú_find_nodesr   ZdbgÚ_is_expression_with_errorr   Ú_expression_nodes_to_stringÚ_replacer   )Úinference_stateÚpathÚmodule_nodeÚnameÚposÚ	until_posÚnodesÚis_expressionÚmessageZgenerated_codeÚfile_to_node_changes© r   úRc:\Users\shubh\Videos\agent\nova\Lib\site-packages\jedi/api/refactoring/extract.pyÚextract_variable   s   
r   c                 C   s:   t dd„ | D ƒƒrdS | d jtvrdd| d j fS dS )z8
    Returns a tuple (is_expression, error_string).
    c                 s   s"   � | ]}|j d ko| ¡ V  qdS )r   N)ÚtypeÚis_definition)Ú.0Únoder   r   r   Ú	<genexpr>#   s   €  z,_is_expression_with_error.<locals>.<genexpr>)Fz,Cannot extract a name that defines somethingr   FzCannot extract a "%s")TÚ )Úanyr   Ú_VARIABLE_EXCTRACTABLE©r   r   r   r   r      s
   r   c                 C   s:  | j |dd�}|du rC|jdkr| ¡ }|dur|j|kr|}t|ƒr&|j}|jjdkr0|jj}|jjtv r?|j}|jjtv s6|g}nE|j|krR| ¡ }|durR|}t|ƒrY|j}| j |dd�}|j|krq| ¡ }|du rqt	dƒ‚|}|j|jk r‚|j}|j|jk syt
|||ƒ}t|ƒdkr›|jdv r›|d	 jd gS |S )
zd
    Looks up a module and tries to find the appropriate amount of nodes that
    are in there.
    T)Zinclude_prefixesNÚoperatorÚtrailerz!Cannot extract anything from thaté   )Úreturn_stmtZ
yield_exprr   )Zget_leaf_for_positionr   Úget_next_leafÚ	start_posÚ_is_not_extractable_syntaxÚparentr   Úend_posZget_previous_leafr   Ú!_remove_unwanted_expression_nodesÚlenÚchildren)r   r   r   Z
start_nodeZ	next_leafr   Zend_leafÚparent_noder   r   r   r   +   sB   
ÿ

ÿr   Nc                 C   sò   t | d ƒ}|d u r| ¡ }| d  ¡ }t|jdd�}||u r)|d ur)||d d…< t||d ƒd g|dd…< d |¡}	i }
||u rK|	| |
| d < n|d u rS|j}n|t| d ƒ }|| |
| d < |	|j |
|< | dd … D ]}d|
|< qp|
S )Nr   T©ÚkeependséÿÿÿÿÚ
r$   r*   )Ú_get_parent_definitionÚget_first_leafr   Úprefixr   ÚjoinÚ_get_indentationÚvalue)r   Zexpression_replacementZ	extractedr   Úinsert_before_leafÚremaining_prefixZ
definitionZfirst_node_leafÚlinesZextracted_prefixÚreplacement_dctÚpr"   r   r   r   r   a   s*   

r   c                 C   s   d  dd„ t| ƒD ƒ¡S )Nr$   c                 s   s$   � | ]\}}|j |d kd�V  qdS )r   ©Zinclude_prefixN©Úget_code)r!   ÚiÚnr   r   r   r#   ƒ   s   €" z._expression_nodes_to_string.<locals>.<genexpr>)r<   Ú	enumerater'   r   r   r   r   ‚   s   r   c                 C   sV   | d }t | ¡ |d d ƒ\}}||jdd� d dd„ | dd … D ƒ¡ }||fS )Nr   r*   FrD   r$   c                 s   s   � | ]}|  ¡ V  qd S )NrE   )r!   rH   r   r   r   r#   Š   s   € z)_suite_nodes_to_string.<locals>.<genexpr>)Ú_split_prefix_atr:   rF   r<   )r   r   rH   r;   Zpart_of_codeÚcoder   r   r   Ú_suite_nodes_to_string†   s   ÿrL   c                 C   sD   | j d | }t| jdd�}d |d| … ¡d || d… ¡fS )zU
    Returns a tuple of the leaf's prefix, split at the until_line
    position.
    r   Tr5   r$   N)r-   r   r;   r<   )ÚleafZ
until_lineZsecond_line_countrA   r   r   r   rJ   Ž   s   (rJ   c                 C   s   t |  ¡ jƒd S )Nr7   )r   r:   r;   ©r"   r   r   r   r=   ™   s   r=   c                 C   s.   | dur| j jtv r| S | j } | dustdƒ‚)z8
    Returns the statement where a node is defined.
    NzWe should never even get here)r/   r   Ú_DEFINITION_SCOPESÚNotImplementedErrorrN   r   r   r   r9   �   s   ýr9   c                 C   s  | j }|dv }|tv s|r€| j}t|ƒD ]\}}|j|kr*|}|j dkr(|d8 } nqttt|ƒƒƒD ](\}}|j|k r[|}	|j dkrG|	d7 }	||d… D ]}
t|
ƒrX|	d7 }	qM  nq3|||	d … }|s~t	|d ||ƒ|dd…< t	|d ||ƒ|dd…< |S | gS )z~
    This function makes it so for `1 * 2 + 3` you can extract `2 + 3`, even
    though it is not part of the expression.
    r   r(   r*   Nr   r7   )
r   r   r3   rI   r0   ÚreversedÚlistr-   r.   r1   )r4   r   r   ÚtypZis_suite_partr   rG   rH   Zstart_indexZ	end_indexZn2r   r   r   r1   ¨   s8   

ü


õr1   c                 C   s   | j dkp| j dko| jdvS )Nr(   Úkeyword)ÚNoneÚTrueÚFalse)r   r>   rN   r   r   r   r.   Ì   s   
ÿr.   c                    sX  t |j||ƒ}t|ƒsJ ‚t|ƒ\}}| |d ¡}	|	 ¡ }
tt||	|ƒƒ\}}|	 ¡ r/d }n
t	|	j|
ƒ}| 
¡ }|rHdt|ƒ d }d }d}nMt|d ƒ}|sh|rftt|	|d j|d j|ƒƒpe|d gng }t||ƒ\}}|d  ¡ }t||d ƒ\}}||7 }t|ƒ}|s•d |¡}|d| d 7 }t|rž|d d… n|ƒ d}d ‰ |
rÌt|	jƒsÄ|	 ¡  ¡ }t|ƒrÄ|d j‰ ‡ fdd	„|D ƒ}t|	jƒrËd
}n|d7 }d||d ˆ d u rÛ|nˆ g| ¡t|ƒf }dˆ d u rídnˆ d | d |¡f }|rþ|}n|�rd| d }n|d | d }t||||||ƒ}|�s#||j ||< ||i}t| |ƒS )Nr   zreturn r8   Fr7   z, r$   c                    s   g | ]}|ˆ kr|‘qS r   r   )r!   rC   ©Z
self_paramr   r   Ú
<listcomp>  s    z$extract_function.<locals>.<listcomp>z@classmethod
z%sdef %s(%s):
%sz%s(%s)Ú.r   )r   Z	tree_noder2   r   Zcreate_contextÚis_bound_methodrR   Ú_find_inputs_and_outputsÚ	is_moduleÚ_get_code_insertion_noder:   r   Ú_is_node_ending_return_stmtÚ_find_needed_output_variablesr/   r0   rL   r,   rJ   r   r<   Ú_check_for_non_extractablesr
   Ú	get_valueZget_param_namesZstring_namer	   r   r   r>   r   )r   r   Úmodule_contextr   r   r   r   r   Ú_Úcontextr[   ÚparamsÚreturn_variablesr?   r"   Z
code_blockr@   Zhas_ending_return_stmtZ
after_leafÚfirstÚsecondZoutput_var_strÚ	decoratorZfunction_param_namesZfunction_codeZfunction_callÚreplacementrB   r   r   rX   r   Úextract_functionÑ   sŒ   	ûü€ û



€üþ
ÿ
rl   c              	   C   sX   | D ]'}z|j }W n ty$   |jdkrtdƒ‚|jdkr"tdƒ‚Y qw t|ƒ qd S )NÚreturnz:Can only extract return statements if they are at the end.Úyieldz Cannot extract yield statements.)r3   ÚAttributeErrorr>   r   ra   )r   rH   r3   r   r   r   ra   (  s   

ÿ
ÿü
öra   c                 C   s`   |D ]+}|j dks|j ¡ s-| ¡ | ur dS |jd u s*||j  kr)|k s- dS   dS qdS )NÚparamTF)Zapi_typeZparent_contextr]   Zget_root_contextr-   )rc   Únamesrh   Úlastr   r   r   r   Ú_is_name_input6  s   ÿ€rs   c           	      C   s†   |d j }|d j}g }g }t|ƒD ],}| ¡ r#||vr"| |j¡ q|j|vr>| ||j ¡}|r8t| |||ƒr>| |j¡ q||fS )Nr   r7   )r-   r0   Ú_find_non_global_namesr    Úappendr>   Zgotors   )	rc   re   r   rh   rr   ZinputsZoutputsr   Zname_definitionsr   r   r   r\   @  s"   

€
ÿ€r\   c              	   c   sf   � | D ]-}z|j }W n ty   |jdkr|V  Y qw |jdkr)|j d dkr)qt|ƒE d H  qd S )Nr   r)   r   rZ   )r3   ro   r   rt   )r   r"   r3   r   r   r   rt   U  s   €

€þõrt   c                 C   sL   |rt | ƒr| jjdkr| j} | jjdks| jjdv r$| j} | jjdv s| S )Nr   )Zasync_funcdefZ	decoratedZ
async_stmt)r
   r/   r   )r"   r[   r   r   r   r^   d  s   ÿÿr^   c                 c   s\   � |j D ]'}|j|k rqt|ƒ}t|gƒD ]}| ¡ s*|j|v r*| |j¡ |jV  qqdS )z�
    Searches everything after at_least_pos in a node and checks if any of the
    return_variables are used in there and returns those.
    N)r3   r-   Úsetrt   r    r>   Úremove)re   Zsearch_nodeZat_least_posrg   r"   r   r   r   r   r`   n  s   €

€ýûr`   c                 C   s$   | j }|dkrt| jd ƒS |dkS )NZsimple_stmtr   r+   )r   r_   r3   )r"   Útr   r   r   r_   ~  s   r_   )NN)&Útextwrapr   Zparsor   Zjedir   Zjedi.api.exceptionsr   Zjedi.api.refactoringr   r   Zjedi.commonr   Zjedi.parser_utilsr	   r
   rO   Úsplitr&   r   r   r   r   r   rL   rJ   r=   r9   r1   r.   rl   ra   rs   r\   rt   r^   r`   r_   r   r   r   r   Ú<module>   s@    þ7
ÿ!$W

