
    ^hm6                        S SK Jr  S SKJr  S SKJr  S SKJr  S SKJ	r	J
r
  S SKJr  S SKJrJr  Sr\
S	R#                  5       -   rS
 rS rS r SS jrS rS rS rS rS rS rS rS rS rS r S r!S r"S r#S r$S r%g)    )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                     [        X$U5      n[        R                  " SU5        [        U5      u  pxU(       d  [	        U5      eUS-   [        U5      -   n	U[        XcX5      0n
[        X
5      $ )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              V/home/james-whalen/.local/lib/python3.13/site-packages/jedi/api/refactoring/extract.pyextract_variabler"      si    )4E	II$e,6u=Mw''E\$?$FFN (5"LM==    c                     [        S U  5       5      (       a  gU S   R                  [        ;  a  SSU S   R                  -  4$ g)z0
Returns a tuple (is_expression, error_string).
c              3   l   #    U  H*  oR                   S :H  =(       a    UR                  5       v   M,     g7f)r   N)typeis_definition).0nodes     r!   	<genexpr>,_is_expression_with_error.<locals>.<genexpr>#   s(     
JED9974#5#5#77Es   24)Fz,Cannot extract a name that defines somethingr   FzCannot extract a "%s")T )anyr&   _VARIABLE_EXCTRACTABLEr   s    r!   r   r      sE     
JE
JJJDQx}}22-a===r#   c                    U R                  USS9nUc  UR                  S:X  a%  UR                  5       nUb  UR                  U:X  a  Un[	        U5      (       a  UR
                  nUR
                  R                  S:X  a  UR
                  R
                  nUR
                  R                  [        ;   a,  UR
                  nUR
                  R                  [        ;   a  M,  U/nOUR                  U:X  a  UR                  5       nUb  Un[	        U5      (       a  UR
                  nU R                  USS9nUR                  U:  a  UR                  5       nUc  [        S5      eUnUR                  UR                  :  a(  UR
                  nUR                  UR                  :  a  M(  [        XqU5      n[        U5      S:X  a#  UR                  S;   a  US   R                  S   /$ U$ )	zX
Looks up a module and tries to find the appropriate amount of nodes that
are in there.
T)include_prefixes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NJ??j("002I$)<)<)C&
%j11#**J!!Y.#**11J$$(88#**J $$(88  $"002I$&
 &j11#**J 44YQU4V	)113H&'JKK !!H$4$44%,,K !!H$4$44 2+IN
 5zQ:??.KKa!!!$%%Lr#   Nc                    [        U S   5      nUc  UR                  5       nU S   R                  5       n[        UR                  SS9nXtL a  Ub  XXS S& [	        X(S   5      S-   /USS& SR                  U5      n	0 n
XtL a
  X-   XS   '   O:Uc  UR                  nOU[        U S   5      -   nX-   XS   '   XR                  -   X'   U SS   H  nSX'   M	     U
$ )Nr   Tkeepends
r,   r4   )_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   s    (a1J!'668Ah--/O*11DAE,')#2J "I6=>E"RLwwu~O,$4$Ma!#&&A #3E!H#==A$%$>a!.>AYAY.Y+ab	 " r#   c                 D    SR                  S [        U 5       5       5      $ )Nr,   c              3   J   #    U  H  u  pUR                  US :g  S9v   M     g7f)r   include_prefixNget_code)r(   ins      r!   r*   ._expression_nodes_to_string.<locals>.<genexpr>   s#     RAQ1::Q!V:4AQs   !#)rM   	enumerater/   s    r!   r   r      s    77R5AQRRRr#   c                     U S   n[        UR                  5       US   S-
  5      u  p4XBR                  SS9-   SR                  S U SS   5       5      -   nX54$ )Nr   r4   Fr\   r,   c              3   @   #    U  H  oR                  5       v   M     g 7f)Nr^   )r(   ra   s     r!   r*   )_suite_nodes_to_string.<locals>.<genexpr>   s     2	1**,,	s   )_split_prefix_atrK   r_   rM   )r   r   ra   rL   part_of_codecodes         r!   _suite_nodes_to_stringrj      sc    aA+A,<,<,>A
KF**E*::
''2ab	2
23D<r#   c                     U R                   S   U-
  n[        U R                  SS9nSR                  USU*  5      SR                  X2* S 5      4$ )zI
Returns a tuple of the leaf's prefix, split at the until_line
position.
r   TrF   r,   N)r9   r   rL   rM   )leaf
until_linesecond_line_countrV   s       r!   rg   rg      sZ     q)J6d3E775,,,-.>P>Q8R0SSSr#   c                 N    [        U R                  5       R                  5      S   $ )NrH   )r   rK   rL   r)   s    r!   rN   rN      s!    t**,334R88r#   c                     U b1  U R                   R                  [        ;   a  U $ U R                   n U b  M1  [        S5      e)z0
Returns the statement where a node is defined.
zWe should never even get here)r;   r&   _DEFINITION_SCOPESNotImplementedErrorrp   s    r!   rJ   rJ      sA     
;;11K{{ 
 =
>>r#   c                 *   U R                   nUS;   nU[        ;   d  U(       a  U R                  n[        U5       H.  u  pgUR                  U:  d  M  UnUR                   S:X  a  US-  n  O   [        [        [        U5      5      5       HP  u  pgUR                  U:  d  M  Un	UR                   S:X  a  U	S-  n	XVS  H  n
[        U
5      (       a  U	S-  n	M    O     O   UWW	S-    nU(       d$  [        US   X5      USS& [        US   X5      USS& U$ U /$ )zr
This function makes it so for `1 * 2 + 3` you can extract `2 + 3`, even
though it is not part of the expression.
r   r2   r4   Nr   rH   )
r&   r   r@   rc   r<   reversedlistr9   r:   r>   )rD   r   r   typis_suite_partr   r`   ra   start_index	end_indexn2s              r!   r>   r>      s'   
 

C22M
-$$e$DAyy366Z'1$K % T)E"234DA{{Y&	66Z'NI  )B1"55!Q		 $
  5 k)a-0:58STE!AJ:59cUE"#J=r#   c                 x    U R                   S:H  =(       d%    U R                   S:H  =(       a    U R                  S;  $ )Nr2   keyword)NoneTrueFalse)r&   rO   rp   s    r!   r:   r:      s5    99
" R99	!Qdjj8Q&QRr#   c           	         [        UR                  XE5      n[        U5      (       d   e[        U5      u  pxUR	                  US   5      n	U	R                  5       n
[        [        X)U5      5      u  pU	R                  5       (       a  S nO&[        U	R                  U
5      nUR                  5       nU(       a  S[        U5      -   S-   nS nSnO[        US   5      nU(       dG  U(       a>  [        [        U	US   R                  US   R                  U5      5      =(       d    US   /O/ n[!        Xd5      u  nnUS   R#                  5       n[%        UUS   5      u  nnUU-  n['        U5      nU(       d  SR)                  U5      nUSU-   S-   -  n[+        U(       a  US S OU5        SnS nU
(       a  [-        U	R                  5      (       dW  U	R/                  5       R1                  5       n[        U5      (       a)  US   R2                  nU Vs/ s H  nUU:w  d  M  UPM     nn[5        U	R                  5      (       a  SnOUS-  nU< S	U< S
SR)                  Uc  UOU/U-   5      < S[7        U5      < 3nUc  SOUS-   U-   < S
SR)                  U5      < S3nU(       a  UnOU(       a	  SU-   S-   nOWS-   U-   S-   n[9        UUUUUU5      nU(       d  WWR:                  -   UU'   UU0n[=        U U5      $ s  snf )Nr   zreturn rI   FrH   z, r,   z@classmethod
zdef (z):
.)r   )r   	tree_noder?   r   create_contextis_bound_methodrv   _find_inputs_and_outputs	is_module_get_code_insertion_noderK   r   _is_node_ending_return_stmt_find_needed_output_variablesr;   r<   rj   r8   rg   r   rM   _check_for_non_extractablesr   	get_valueget_param_namesstring_namer
   r	   r   rO   r   )r   r   module_contextr   r   r   r   r   _contextr   paramsreturn_variablesrR   r)   
code_blockrS   has_ending_return_stmt
after_leaffirstsecondoutput_var_str	decorator
self_paramfunction_param_namesrY   function_codefunction_callreplacementrX   r    s                                  r!   extract_functionr      s   00#AEu:::07M++E!H5G--/O#$<^V[$\]F !'(9(9?K!002!<U!CCdJ
!&!<U2Y!G% -=  $$Aab	!! 	%    )
 $B'("  (>e'I$*2Y,,.
(Yq\Bve
J'
%!YY'78N)n4t;;J  .Dcr
%PIJ'(9(9::#*#4#4#6#F#F#H '((1!4@@
%+?VqJ!V?"7#4#455(Id
 			J.&ZL64IJZ 	M !zC'74?		&M #!#m3d:K(50=@4GKuk=#13CEO&,z/?/?&?
# /2(<==? @s   
K7K7c                     U  H  n UR                   n[        U5        M     g ! [         a:    UR                  S:X  a  [	        S5      eUR                  S:X  a  [	        S5      e Mc  f = f)Nreturnz:Can only extract return statements if they are at the end.yieldz Cannot extract yield statements.)r@   r   AttributeErrorrO   r   )r   ra   r@   s      r!   r   r   (  sr    		2zzH (1   	Kww("&PR Rww'!&'IJJ "		Ks   #A A'&A'c                     U Hr  nUR                   S:X  d!  UR                  R                  5       (       a  M4  UR                  5       U La    gUR                  b  X$R                  s=::  a
  U:  a  Mn     g    g   g)NparamTF)api_typeparent_contextr   get_root_contextr9   )r   namesr   lastr   s        r!   _is_name_inputr   6  si    ==G#4+>+>+H+H+J+J$$&n<~~%e~~.L.L /M  r#   c                    US   R                   nUS   R                  n/ n/ n[        U5       H  nUR                  5       (       a$  Xv;  a  UR	                  UR
                  5        M:  M<  UR
                  U;  d  MN  UR                  XwR                   5      nU(       a  [        XX45      (       d  M  UR	                  UR
                  5        M     XV4$ )Nr   rH   )r9   r<   _find_non_global_namesr'   appendrO   gotor   )	r   r   r   r   r   inputsoutputsr   name_definitionss	            r!   r   r   @  s    !HE9DFG&u-"tzz* # zz'#*<<nn#E ').EXXMM$**- . ?r#   c              #      #    U  HH  n UR                   nUR                  S:X  a  UR                   S   S:X  a  M5  [        U5       S h  vN   MJ     g  N	! [         a    UR                  S:X  a  Uv    Mp   Ms  f = f7f)Nr3   r   r   r   )r@   r&   r   r   )r   r)   r@   s      r!   r   r   U  sw     
	8}}H yyI%$--*:c*A-h777  8  	yyF"
 #	s3   A<A3A<A	
A<A92A<8A99A<c                 <   U(       a  [        U 5      (       aB  U R                  R                  S:w  a(  U R                  n U R                  R                  S:w  a  M(  U R                  R                  S;   a(  U R                  n U R                  R                  S;   a  M(  U $ )Nr   )async_funcdef	decorated
async_stmt)r   r;   r&   )r)   r   s     r!   r   r   d  sw    6t<<kk,.;;D kk,. ++

J
J{{ ++

J
JKr#   c              #   6  #    UR                    H  nUR                  U:  a  M  [        U5      n[        U/5       HU  nUR	                  5       (       a  M  UR
                  U;   d  M,  UR                  UR
                  5        UR
                  v   MW     M     g7f)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@   r9   setr   r'   rO   remove)r   search_nodeat_least_posr   r)   r   s         r!   r   r   n  sz     
 $$>>L(/0*D62D%%''DJJ:J,J ''

3jj  3 %s   ABB'2Bc                 `    U R                   nUS:X  a  [        U R                  S   5      $ US:H  $ )Nsimple_stmtr   r5   )r&   r   r@   )r)   ts     r!   r   r   ~  s2    		AM*4==+;<<r#   )NN)&textwrapr   parsor   jedir   jedi.api.exceptionsr   jedi.api.refactoringr   r   jedi.commonr	   jedi.parser_utilsr
   r   rr   splitr.   r"   r   r   r   r   rj   rg   rN   rJ   r>   r:   r   r   r   r   r   r   r   r    r#   r!   <module>r      s       0 > $ O - )*+0573 

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