
    Mhm6                     
   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   Zd
 Zd Zd Z	 ddZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$d Z%dS )    )dedent)split_lines)debug)RefactoringError)RefactoringEXPRESSION_PARTS)indent_block)function_is_classmethodfunction_is_staticmethodsuite
file_inputz_atom testlist_star_expr testlist test lambdef lambdef_nocond keyword name number string fstringc                    t          |||          }t          j        d|           t          |          \  }}|st	          |          |dz   t          |          z   }	|t          |||	|          i}
t          | |
          S )NzExtracting nodes: %s = )_find_nodesr   dbg_is_expression_with_errorr   _expression_nodes_to_string_replacer   )inference_statepathmodule_nodenamepos	until_posnodesis_expressionmessagegenerated_codefile_to_node_changess              \/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/jedi/api/refactoring/extract.pyextract_variabler"      s    S)44E	I$e,,,6u==M7 (w'''E\$?$F$FFN (5$"L"LM(<===    c                     t          d | D                       rdS | d         j        t          vrdd| d         j        z  fS dS )z8
    Returns a tuple (is_expression, error_string).
    c              3   T   K   | ]#}|j         d k    o|                                V  $dS )r   N)typeis_definition).0nodes     r!   	<genexpr>z,_is_expression_with_error.<locals>.<genexpr>#   s:      
J
JD4974#5#5#7#7
J
J
J
J
J
Jr#   )Fz,Cannot extract a name that defines somethingr   FzCannot extract a "%s")T )anyr&   _VARIABLE_EXCTRACTABLEr   s    r!   r   r      sX     
J
JE
J
J
JJJ EDDQx}222-a===8r#   c                 .   |                      |d          }||j        dk    r#|                                }||j        |k    r|}t	          |          r|j        }|j        j        dk    r|j        j        }|j        j        t          v r|j        }|j        j        t          v |g}n|j        |k    r|                                }||}t	          |          r|j        }|                      |d          }|j        |k    r%|                                }|t          d          |}|j        |j        k     r|j        }|j        |j        k     t          |||          }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)include_prefixesNoperatortrailerz!Cannot extract anything from that   )return_stmt
yield_exprr   )get_leaf_for_positionr&   get_next_leaf	start_pos_is_not_extractable_syntaxparentr   end_posget_previous_leafr   !_remove_unwanted_expression_nodeslenchildren)r   r   r   
start_node	next_leafr   end_leafparent_nodes           r!   r   r   +   s   
 2232NNJ?j(("0022I$)<)C)C&
%j11 	+#*J!Y..#*1J$(888#*J $(888  $$"0022I$&
 &j11 	+#*J 44YQU4VV	))1133H&'JKKK !H$444%,K !H$444 2+sINN
 5zzQ:?.KKKa!!$%%Lr#   Nc                    t          | d                   }||                                }| d                                         }t          |j        d          }||u r	|||d d<   t	          ||d                   dz   g|dd<   d                    |          }	i }
||u r|	|z   |
| d         <   n=||j        }n|t          | d                   z   }||z   |
| d         <   |	|j        z   |
|<   | dd          D ]}d|
|<   |
S )Nr   Tkeepends
r+   r3   )_get_parent_definitionget_first_leafr   prefixr	   join_get_indentationvalue)r   expression_replacement	extractedr   insert_before_leafremaining_prefix
definitionfirst_node_leaflinesextracted_prefixreplacement_dctpr)   s                r!   r   r   a   sK    (a11J!'6688Ah--//O*1DAAAE,,,')E#2#J E"I66=>E"R%Lwwu~~O,,,$47M$Ma!!#&AA #3E!H#=#==A$%(>$>a!.>ASAY.Y*+abb	 # # "r#   c                 Z    d                     d t          |           D                       S )Nr+   c              3   P   K   | ]!\  }}|                     |d k              V  "dS )r   include_prefixNget_code)r(   ins      r!   r*   z._expression_nodes_to_string.<locals>.<genexpr>   s8      RRA1::Q!V:44RRRRRRr#   )rL   	enumerater.   s    r!   r   r      s+    77RR5AQAQRRRRRRr#   c                     | d         }t          |                                |d         dz
            \  }}||                    d          z   d                    d | dd          D                       z   }||fS )Nr   r3   Fr[   r+   c              3   >   K   | ]}|                                 V  d S )Nr]   )r(   r`   s     r!   r*   z)_suite_nodes_to_string.<locals>.<genexpr>   s*      221!**,,222222r#   )_split_prefix_atrJ   r^   rL   )r   r   r`   rK   part_of_codecodes         r!   _suite_nodes_to_stringrg      s    aA+A,<,<,>,>A
KKFL!**E*:::
''22abb	222
2
23D4<r#   c                     | j         d         |z
  }t          | j        d          }d                    |d|                    d                    || d                   fS )zU
    Returns a tuple of the leaf's prefix, split at the until_line
    position.
    r   TrE   r+   N)r8   r   rK   rL   )leaf
until_linesecond_line_countrU   s       r!   rd   rd      sk     q)J6d333E775,,,,-..?P>P>Q>Q8R0S0SSSr#   c                 Z    t          |                                 j                  d         S )NrG   )r   rJ   rK   r)   s    r!   rM   rM      s$    t**,,344R88r#   c                 `    | | j         j        t          v r| S | j         } | t          d          )z8
    Returns the statement where a node is defined.
    NzWe should never even get here)r:   r&   _DEFINITION_SCOPESNotImplementedErrorrm   s    r!   rI   rI      s@     
;111K{ 
 =
>
>>r#   c                    | j         }|dv }|t          v s|r| j        }t          |          D ]$\  }}|j        |k    r|}|j         dk    r|dz  } n%t          t          t          |                              D ]F\  }}|j        |k     r6|}	|j         dk    r|	dz  }	||d         D ]}
t          |
          r|	dz  }	  nG|||	dz            }|s8t          |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   r1   r3   Nr   rG   )
r&   r   r?   ra   r;   reversedlistr8   r9   r=   )rC   r   r   typis_suite_partr   r_   r`   start_index	end_indexn2s              r!   r=   r=      sw   
 
C22M
-$e$$ 	 	DAqy36Z''1$K	 
 T)E"2"23344 	 	DAq{Y&&	6Z''NI  )  B1"55 !Q		 ' k)a-/0 	V:58S)TTE!A#J:59c9UUE"##J=r#   c                 @    | j         dk    p| j         dk    o| j        dvS )Nr1   keyword)NoneTrueFalse)r&   rN   rm   s    r!   r9   r9      s/    9
" R9	!Qdj8Q&QRr#   c           	         t          |j        ||          }t          |          sJ t          |          \  }}|                    |d                   }	|	                                }
t          t          ||	|                    \  }}|	                                rd }n)t          |	j        |
          }|
                                }|rdt          |          z   dz   }d }d}nt          |d                   }|sB|r>t          t          |	|d         j        |d         j        |                    p|d         gng }t!          ||          \  }}|d                                         }t%          ||d                   \  }}||z  }t'          |          }|s d                    |          }|d|z   dz   z  }t+          |r
|d d         n|           d}d |
r{t-          |	j                  sP|	                                                                }t          |          r|d         j        fd|D             }t5          |	j                  rd	}n|dz  }|d
|dd                    |ng|z             dt7          |          }dndz   |z   dd                    |          d}|r|}n|r	d|z   dz   }n|dz   |z   dz   }t9          ||||||          }|s||j        z   ||<   ||i}t=          | |          S )Nr   zreturn rH   FrG   z, r+   c                      g | ]
}|k    |S  r   )r(   rX   
self_params     r!   
<listcomp>z$extract_function.<locals>.<listcomp>  s    ???qJ!r#   z@classmethod
zdef (z):
.)r   )r   	tree_noder>   r   create_contextis_bound_methodrs   _find_inputs_and_outputs	is_module_get_code_insertion_noderJ   r   _is_node_ending_return_stmt_find_needed_output_variablesr:   r;   rg   r7   rd   r   rL   _check_for_non_extractablesr   	get_valueget_param_namesstring_namer
   r	   r   rN   r   )r   r   module_contextr   r   r   r   r   _contextr   paramsreturn_variablesrQ   r)   
code_blockrR   has_ending_return_stmt
after_leaffirstsecondoutput_var_str	decoratorfunction_param_namesfunction_codefunction_callreplacementrW   r    r   s                                @r!   extract_functionr      s   0#yAAEu::077M1++E!H55G--//O#$<^WV[$\$\]]F  3!'(9?KK!0022 <!<U!C!CCdJ
!&!<U2Y!G!G% 		E -= Et$Aab	! 	% %      )
 $B'("  (>eS'I'I$*2Y,,..
(Yq\BBve
J''
% 	<!YY'788N)n4t;;J  .D Ocrc

%PPPIJ 
'(9:: 	@#*#4#4#6#6#F#F#H#H '(( @1!4@
????V???"7#455 	)(Id
 					J.&&ZL64IJJJJZ   	M !zC'74???		&M  H#! 	H#m3d:KK(50=@4GKuk=#13CE EO @&,z/?&?
# /2(<===r#   c                     | D ]]}	 |j         }t          |           # t          $ r7 |j        dk    rt	          d          |j        dk    rt	          d          Y Zw xY wd S )Nreturnz:Can only extract return statements if they are at the end.yieldz Cannot extract yield statements.)r?   r   AttributeErrorrN   r   )r   r`   r?   s      r!   r   r   (  s     
2 
2		2zH (1111  	K 	K 	Kw(""&PR R Rw'!!&'IJJJ "!		K
2 
2s   >AAc                     |D ]]}|j         dk    s|j                                        s7|                                | ur dS |j        ||j        cxk    r|k     sn  dS ^dS )NparamTF)api_typeparent_contextr   get_root_contextr8   )r   namesr   lastr   s        r!   _is_name_inputr   6  s      =G##4+>+H+H+J+J#$$&&n<<tt~%et~.L.L.L.L.L.L.L.Ltt5r#   c                 t   |d         j         }|d         j        }g }g }t          |          D ]}|                                r||vr|                    |j                   5|j        |vrI|                    ||j                   }|rt          | |||          r|                    |j                   ||fS )Nr   rG   )r8   r;   _find_non_global_namesr'   appendrN   gotor   )	r   r   r   r   r   inputsoutputsr   name_definitionss	            r!   r   r   @  s    !HE9DFG&u-- 	. 	. 	.7""tz***z''#*<<dn#E#E ' .).:JESWXX.MM$*--- 7?r#   c              #      K   | D ][}	 |j         }|j        dk    r|j         d         dk    r't          |          E d {V  =# t          $ r |j        dk    r|V  Y Xw xY wd S )Nr2   r   r   r   )r?   r&   r   r   )r   r)   r?   s      r!   r   r   U  s       8 8
	8}H yI%%$-*:c*A*A-h7777777777  	 	 	yF""


	8 8s   AAAc                     |rt          |           r'| j        j        dk    r| j        } | j        j        dk    | j        j        dv r| j        } | j        j        dv | S )Nr   )async_funcdef	decorated
async_stmt)r   r:   r&   )r)   r   s     r!   r   r   d  su     6t<< k,..;D k,.. +
J
J
J{ +
J
J
JKr#   c              #      K   |j         D ]p}|j        |k     rt          |          }t          |g          D ]B}|                                s,|j        |v r#|                    |j                   |j        V  Cqd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)r?   r8   setr   r'   rN   remove)r   search_nodeat_least_posr   r)   r   s         r!   r   r   n  s      
 $ ! !>L((/00*D622 	! 	!D%%'' !DJ:J,J,J ''
333j   	!! !r#   c                 \    | j         }|dk    rt          | j        d                   S |dk    S )Nsimple_stmtr   r4   )r&   r   r?   )r)   ts     r!   r   r   ~  s4    	AM*4=+;<<<r#   )NN)&textwrapr   parsor   jedir   jedi.api.exceptionsr   jedi.api.refactoringr   r   jedi.commonr	   jedi.parser_utilsr
   r   ro   splitr-   r"   r   r   r   r   rg   rd   rM   rI   r=   r9   r   r   r   r   r   r   r   r   r   r#   r!   <module>r      s                     0 0 0 0 0 0 > > > > > > > > $ $ $ $ $ $ O O O O O O O O - )*+05773 

> 
> 
>	 	 	3 3 3n 8<   BS S S  T T T9 9 9? ? ?! ! !HR R R
T> T> T>n2 2 2    *8 8 8  ! ! !     r#   