
    c9                       d dl mZ d dlmZ d dlmZmZmZmZm	Z	m
Z
mZmZ d dlmZmZmZmZ erd dlmZmZ d dlmZ d dlmZ ed         Z	 d)d*dZd)dZd)dZ G d d          Z G d de          Z G d de          Z G d de          Z G d d e          Z  G d! d"e          Z!d# Z"d$ Z# G d% d&          Z$ G d' d(e$          Z%d	S )+    )annotations)TYPE_CHECKING)changecodeanalyzeevaluate
exceptionslibutilspynames	pyobjectsworder)functionutilsimportutilssourceutilssuites)LiteralOptional)Project)Resource)variablefunctionclassmodulepackageNkindGenerateKindprojectr   resourcer   offsetintgoal_resourceOptional[Resource]c                r    t           t          t          t          t          d}||          } |||||          S )z{A factory for creating `Generate` objects

    Used in https://github.com/python-rope/ropemode but not in Rope itself.
    )r   r   r   r   r   )r    )GenerateClassGenerateFunctionGenerateModuleGeneratePackageGenerateVariable)r   r   r   r   r    dgenerates          5lib/python3.11/site-packages/rope/contrib/generate.pycreate_generater+       sC     $ "$	 	A wH8GXv]KKKK    c                    || j         }|                    d          }|}|dd         D ]}|                    |          }|                    |d         dz             S )z9Creates a module and returns a `rope.base.resources.File`N..py)rootsplit	get_childcreate_file)r   namesourcefolderpackagesparentr   s         r*   create_moduler9   7   sn     $|zz#HFCRC= + +!!'**hrlU2333r,   c                    || j         }|                    d          }|}|dd         D ]}|                    |          }|                    |d                   }|                    d           |S )z<Creates a package and returns a `rope.base.resources.Folder`Nr.   r/   __init__.py)r1   r2   r3   create_folderr4   )r   r5   r6   r7   r8   r   made_packagess          r*   create_packager>   B   s     $|zz#HFCRC= + +!!'**(("66Mm,,,r,   c                  :    e Zd Zd	dZd Zd Zd Zd Zd Zd Z	dS )
	_GenerateNc                    || _         || _        || _        |                     |||          | _        | j                                        | _        |                                  d S N)r   r   r    _generate_infoinfoget_namer5   _check_exceptional_conditions)selfr   r   r   r    s        r*   __init__z_Generate.__init__P   s^     *''6BB	I&&((	**,,,,,r,   c                :    t          |j        ||| j                  S rB   )_GenerationInfopycorer    rG   r   r   r   s       r*   rC   z_Generate._generate_infoX   s    w~xASTTTr,   c                    | j                                         rt          j        d| j        z            | j                                         st          j        d| j        z            d S )NzElement <%s> already exists.z5Cannot determine the scope <%s> should be defined in.)rD   element_already_existsr   RefactoringErrorr5   primary_is_foundrG   s    r*   rF   z'_Generate._check_exceptional_conditions[   sx    9++-- 	-.:   y))++ 	-G$)S  	 	r,   c                ,   t          j        d|                                  d| j         d          }| j                                        }| j                                        }t          j        | 	                                |          }d|d         z  |z   d|d         z  z   }| j        
                                }| j                                        \  }}t          j        |                                          }	|	                    |||           |                    t          j        ||	                                                     | j        r;t'          | j        | j        | j        | j                  }
|                    |
           |S )Nz	Generate z <>
r      )r   	ChangeSet_get_element_kindr5   rD   get_scope_indentsget_blank_linesr   fix_indentation_get_elementget_insertion_resourceget_insertion_offsetsr   ChangeCollectorread
add_changeChangeContentsget_changedr    _add_relative_import_to_moduler   r   )rG   changesindentsblanksbase_definition
definitionr   startend	collectorrelative_imports              r*   get_changesz_Generate.get_changese   sg   "#Wt/E/E/G/G#W#W49#W#W#WXX)--//**,,%5d6G6G6I6I7SSF1I%7$:JJ
93355Y4466
s/@@	UC444609;P;P;R;RSSTTT 	0<dmT-? O ///r,   c                f    | j                                         | j                                         fS rB   )rD   r\   get_insertion_linenorQ   s    r*   get_locationz_Generate.get_locationy   s)    	0022DI4R4R4T4TUUr,   c                    t                      rB   NotImplementedErrorrQ   s    r*   rW   z_Generate._get_element_kind|       !###r,   c                    t                      rB   rr   rQ   s    r*   r[   z_Generate._get_element   rt   r,   rB   )
__name__
__module____qualname__rH   rC   rF   rm   rp   rW   r[    r,   r*   r@   r@   O   s        - - - -U U U    (V V V$ $ $$ $ $ $ $r,   r@   c                       e Zd Zd Zd Zd ZdS )r$   c                .    t          |j        ||          S rB   )_FunctionGenerationInforK   rL   s       r*   rC   zGenerateFunction._generate_info   s    &w~xHHHr,   c                   d}g }| j                                         rd}| j                                         s2| j                                         s| j                                         r|                    d           |                    | j                                                    d                    || j	        d
                    |                    }|S )N z@staticmethod
rG   z{}def {}({}):
    pass
z, )rD   is_static_method	is_methodis_constructoris_instanceappendextendget_passed_argsformatr5   join)rG   	decoratorargsrh   s       r*   r[   zGenerateFunction._get_element   s    	9%%'' 	*)II!!	 y''))	  y$$&&	 
 KKDI--//000077IIIdOO
 


 r,   c                    dS )NFunctionry   rQ   s    r*   rW   z"GenerateFunction._get_element_kind       zr,   N)rv   rw   rx   rC   r[   rW   ry   r,   r*   r$   r$      sD        I I I  &    r,   r$   c                      e Zd Zd Zd ZdS )r'   c                    d| j         z  S )Nz
%s = None
r5   rQ   s    r*   r[   zGenerateVariable._get_element   s    ty((r,   c                    dS )NVariablery   rQ   s    r*   rW   z"GenerateVariable._get_element_kind   r   r,   Nrv   rw   rx   r[   rW   ry   r,   r*   r'   r'      s2        ) ) )    r,   r'   c                      e Zd Zd Zd ZdS )r#   c                    d| j         z  S )Nzclass %s(object):
    pass
r   rQ   s    r*   r[   zGenerateClass._get_element   s    .::r,   c                    dS )NClassry   rQ   s    r*   rW   zGenerateClass._get_element_kind   s    wr,   Nr   ry   r,   r*   r#   r#      s2        ; ; ;    r,   r#   c                      e Zd Zd Zd ZdS )r%   c                   | j                                         }t          j        d| j        z            }| j                            |j         d| j         d          }|                                rt          j
        d|j        z            |                    t          j        |                     |                    t          | j        | j        |                     |S )NzGenerate Module <%s>/r0   zModule <%s> already exists)rD   get_packager   rV   r5   r   get_filepathexistsr   rO   r`   CreateResource_add_import_to_moduler   )rG   r   rd   new_resources       r*   rm   zGenerateModule.get_changes   s    )''))"#9DI#EFF|,,-M-Mty-M-M-MNN   	-,|/@@   	60>>???!$,|LL	
 	
 	
 r,   c                r    | j                                         }|                    d| j        z            dfS )Nz%s.pyrU   rD   r   r3   r5   )rG   r   s     r*   rp   zGenerateModule.get_location   s5    )''))!!'DI"566::r,   Nrv   rw   rx   rm   rp   ry   r,   r*   r%   r%      s2          ; ; ; ; ;r,   r%   c                      e Zd Zd Zd ZdS )r&   c                p   | j                                         }t          j        d| j        z            }| j                            |j         d| j                   }|                                rt          j
        d|j        z            |                    t          j        |                     |                    t          | j        | j        |                     | j                            |j        dz   | j        z             }|                    t          j        |d                     |S )NzGenerate Package <%s>r   zPackage <%s> already existsr;   )rD   r   r   rV   r5   r   
get_folderr   r   r   rO   r`   r   r   r   
CreateFile)rG   r   rd   r   childs        r*   rm   zGeneratePackage.get_changes   s   )''))"#:TY#FGG|..',/L/L/L/LMM   	--0AA   	60>>???!$,|LL	
 	
 	
 ''s(:TY(FGG6,UMBBCCCr,   c                    | j                                         }|                    | j                  }|                    d          dfS )Nr;   rU   r   )rG   r   r   s      r*   rp   zGeneratePackage.get_location   sA    )''))!!$),,..22r,   Nr   ry   r,   r*   r&   r&      s2           3 3 3 3 3r,   r&   c                L   |                      |          }t          j        |           }|                    |          }t	          j        |          }t          j        |d ff          }|                    |           t          j	        ||
                                          S rB   )get_pymoduler   ImportToolsmodule_importsr	   modnameNormalImport
add_importr   ra   get_changed_source)r   r   importedpymoduleimport_toolsr   module_name
new_imports           r*   r   r      s    ##H--H*733L!00::N"8,,K)K+>*@AAJj))) >+L+L+N+NOOOr,   c                "   |                      |          }t          j        |           }|                    |          }|                    ||          }|                    |           t          j        ||                                          S rB   )	r   r   r   r   get_from_importr   r   ra   r   )r   r   r   r5   r   r   r   r   s           r*   rc   rc      s    ##H--H*733L!00::N--h==Jj))) >+L+L+N+NOOOr,   c                  d    e 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S )rJ   Nc                $   || _         || _        || _        || _        | j         j                            |          | _        t          j        | j                  }|	                    |          \  | _
        | _        |                                  d S rB   )rK   r   r   r    r   r   source_pymoduler   ScopeNameFinderget_primary_and_pyname_atprimarypyname_init_fields)rG   rK   r   r   r    finders         r*   rH   z_GenerationInfo.__init__   s     *#{2??II)$*>??$*$D$DV$L$L!dkr,   c                    |                                  | _        |                                 | _        |                     | j                  | _        d S rB   )_get_source_scopesource_scope_get_goal_scope
goal_scope_get_goal_modulegoal_pymodulerQ   s    r*   r   z_GenerationInfo._init_fields   sG     2244..00!224?CCr,   c                   | j         Q| j        r6| j        j                            | j                                                  S |                                 S | j                                         }t          |t          j
                  r|                                S t          |                                t          j                  r&|                                                                S d S rB   )r   r    rK   r   r   	get_scoper   
get_object
isinstancer   PyDefinedObjectget_typePyClassrG   pyobjects     r*   r   z_GenerationInfo._get_goal_scope   s    < 	0! 0{*778JKKUUWWW--///<**,,h	 9:: 	3%%'''))++Y->?? 	3$$&&00222	3 	3r,   c                B    |d S |j         |j         }|j         |j        S rB   )r8   r   )rG   scopes     r*   r   z _GenerationInfo._get_goal_module  s4     	Fl 	!LE l 	!~r,   c                    | j                                         }| j         j                            | j                  }|                    |          S rB   )r   r   linesget_line_numberr   get_inner_scope_for_line)rG   module_scopelinenos      r*   r   z!_GenerationInfo._get_source_scope  sE    +5577%+;;DKHH44V<<<r,   c                   | j         j        }| j        | j        k    r| j         j        }|                    | j                  }|                    |          d         }t          j	        | j        j
                                                  }|                    |          }t          j        ||          }|                                 |k     rH|                                }t          j        ||          }|j        }|                                 |k     H|S t%          | j                                        dz   |                                          S )Nr   rU   )r   r   r   r   logical_linesr   r   logical_line_inr   ast_suite_treer   get_ast
find_suiter   get_indentsrX   	get_startr8   minget_endlength)rG   r   line_finderr   r1   suitere   s          r*   ro   z$_GenerationInfo.get_insertion_lineno  s*   "(?d// 	F,:K**4;77F 0088;F()A)I)I)K)KLLDOOF++E!-eV<<G((**W4 %**%1%@@ ((**W4 % Mt..0014ellnnEEEr,   c                4    | j                                         S rB   )r   get_resourcerQ   s    r*   r\   z&_GenerationInfo.get_insertion_resource%  s    !..000r,   c                H   | j                                         dk    rOt          j        | j         j                  \  }}| j        j        ||                                         dk    r||fS | j        j        }|	                    | 
                                          }||fS )Nr   pass)r   get_kindr   get_body_regionr   r   source_codestripr   get_line_startro   )rG   ri   rj   r   s       r*   r]   z%_GenerationInfo.get_insertion_offsets(  s    ?##%%0 	"$4T_5MNNJE3!-eCi8>>@@FJ "cz!"($$T%>%>%@%@AAu~r,   c                    | j                                         dk    rdS t          j        | j        j        | j                                                   dz   S )NModuler      )r   r   r   r   r   r   r   rQ   s    r*   rX   z!_GenerationInfo.get_scope_indents1  sZ    ?##%%1 	1#"($/*C*C*E*E  	
r,   c                4   | j                                         dk    r&d}| j        j                                        dk    rd}| j                                         dk    rd}| j                                         dk    rd}| j         | j        k    rd|fS |dfS )Nr      r~   r   r   rU   r   )r   r   r   r   r   r   )rG   base_blankss     r*   rY   z_GenerationInfo.get_blank_lines;  s    ?##%%1 	 K!-3355;  ?##%%0 	K?##%%3 	K?d// 	${##Qr,   c                2   | j         }| j         $| j        j                                        d         S t	          |                                t          j                  r&|                                                                S t          j
        d          )Nr   z2A module/package can be only created in a package.)r   rK   r   get_source_foldersr   r   r   	PyPackager   r   rO   )rG   r   s     r*   r   z_GenerationInfo.get_packageH  s    ,< 	?;&99;;A>>g((**I,?@@ 	7%%''44666)@
 
 	
r,   c                    | j         d uS rB   )r   rQ   s    r*   rP   z _GenerationInfo.primary_is_foundR  s    d**r,   c                    | j         t          | j         t          j                  rdS |                                 | j                                        v S NFr   r   r
   UnboundNamerE   r   get_defined_namesrQ   s    r*   rN   z&_GenerationInfo.element_already_existsU  H    ; 	*T[':M"N"N 	5}}$/"C"C"E"EEEr,   c                @    t          j        | j        | j                  S rB   )r   get_name_atr   r   rQ   s    r*   rE   z_GenerationInfo.get_nameZ  s    !$-===r,   rB   )rv   rw   rx   rH   r   r   r   r   ro   r\   r]   rX   rY   r   rP   rN   rE   ry   r,   r*   rJ   rJ      s           D D D

3 
3 
3  = = =
F F F"1 1 1  
 
 
     
 
 
+ + +F F F
> > > > >r,   rJ   c                  D    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
S )r|   c                   |                                  r+| j                                                                        S |                                 r=| j                                                                                                        S | j        |                                 S | j                                        }t          |t          j
                  r|                                S t          |                                t          j                  r&|                                                                S d S rB   )r   r   r   r   r   r   r   r   r   r   r   r   r   s     r*   r   z'_FunctionGenerationInfo._get_goal_scope_  s      	8;))++55777 	C;))++4466@@BBB< 	,))+++<**,,h	 9:: 	3%%'''))++Y->?? 	3$$&&00222	3 	3r,   c                    | j         t          | j         t          j                  rdS |                                 | j                                        v S r   r   rQ   s    r*   rN   z._FunctionGenerationInfo.element_already_existsl  r   r,   c                v    | j         d uo0t          | j                                         t          j                  S rB   )r   r   r   r   r   rQ   s    r*   r   z(_FunctionGenerationInfo.is_static_methodq  s8    |4' 
JL##%%y'8-
 -
 	
r,   c                    | j         d uoBt          | j                                                                         t          j                  S rB   )r   r   r   r   r   r   rQ   s    r*   r   z!_FunctionGenerationInfo.is_methodv  sD    |4' 
JL##%%..00)2C-
 -
 	
r,   c                v    | j         d uo0t          | j                                         t          j                  S rB   )r   r   r   r   r   rQ   s    r*   r   z&_FunctionGenerationInfo.is_constructor{  s8    {$& 
:K""$$i&7,
 ,
 	
r,   c                    | j         dS | j                                         }t          |                                t          j                  S r   )r   r   r   r   r   r   r   s     r*   r   z#_FunctionGenerationInfo.is_instance  sC    ; 	5;))++(++--y/@AAAr,   c                    |                                  rdS |                                 rdS t          j        | j        | j                  S )NrH   __call__)r   r   r   r  r   r   rQ   s    r*   rE   z _FunctionGenerationInfo.get_name  sK       	: 	:!$-===r,   c                >   g }| j         j        }t          j        |          }|                    | j                  r|                    | j                  \  }}|                    |dz
            \  }}|||         }t          j	        |d          }	|	
                                \  }
}|
D ]R}|                     |          r|                    |           -|                    dt          |          z             S|D ]\  }}|                    |           |S )NrU   Fzarg%d)r   r   r   Worderis_a_function_being_calledr   get_primary_rangeget_word_parens_ranger   _FunctionParserget_parameters_is_idr   len)rG   resultsourcer   ri   rj   parens_start
parens_endcallparserr   keywordsargr5   values                  r*   r   z'_FunctionGenerationInfo.get_passed_args  s)   %1v&&,,T[99 	$11$+>>JE3'-'C'CC!G'L'L$L*%
*+D"24??F#2244ND( 9 9;;s## 9MM#&&&&MM'CKK"78888' $ $ed####r,   c                x    d }|D ]$} ||          s|                                 s dS % ||d                   S )Nc                6    |                                  p| dk    S )N_)isalpha)cs    r*   id_or_underlinez7_FunctionGenerationInfo._is_id.<locals>.id_or_underline  s    99;;*!s(*r,   Fr   )isdigit)rG   r  r"  r!  s       r*   r  z_FunctionGenerationInfo._is_id  s_    	+ 	+ 	+  	 	A"?1%% aiikk uus1v&&&r,   N)rv   rw   rx   r   rN   r   r   r   r   rE   r   r  ry   r,   r*   r|   r|   ^  s        3 3 3F F F

 
 


 
 


 
 

B B B> > >  &' ' ' ' 'r,   r|   rB   )
r   r   r   r   r   r   r   r   r    r!   )&
__future__r   typingr   	rope.baser   r   r   r   r	   r
   r   r   rope.refactorr   r   r   r   r   r   rope.base.projectr   rope.base.resourcesr   r   r+   r9   r>   r@   r$   r'   r#   r%   r&   r   rc   rJ   r|   ry   r,   r*   <module>r*     s   " " " " " "            	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 J I I I I I I I I I I I (((((((()))))),,,,,,	L )-L L L L L.4 4 4 4
 
 
 
1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$h    y   6    y       I   ; ; ; ; ;Y ; ; ;(3 3 3 3 3i 3 3 3.P P PP P Po> o> o> o> o> o> o> o>dI' I' I' I' I'o I' I' I' I' I'r,   