o
    Zhm6                     @   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   S/var/www/html/lang_env/lib/python3.10/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   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|}|sd|}|d| d 7 }t|r|d d n| d}d  |
rt|	js|	  }t|r|d j  fdd	|D }t|	jrd
}n|d7 }d||d d u r|n g| t|f }d d u rd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   rY   r   extract_function   s   	 





rm   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   rb   )r   rH   r3   r   r   r   rb   (  s   



rb   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-   )rd   namesri   lastr   r   r   r   _is_name_input6  s   rt   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gotort   )	rd   rf   r   ri   rs   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   r[   )r3   rp   r   ru   )r   r"   r3   r   r   r   ru   U  s   

ru   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-   setru   r    r>   remove)rf   Zsearch_nodeZat_least_posrh   r"   r   r   r   r   ra   n  s   

ra   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.   rm   rb   rt   r]   ru   r_   ra   r`   r   r   r   r   <module>   s@    7
!$W

