a
    ]9úaæ7  ã                   @   sþ   d dl Zd dlmZ d dlmZmZmZmZmZm	Z	 d dl
mZmZmZmZ ddd„Zd dd„Zd!d	d
„ZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZdd„ Zdd„ ZG dd„ deƒZG dd„ deƒZdS )"é    N)Úlibutils)ÚchangeÚ	pyobjectsÚ
exceptionsÚpynamesÚworderÚcodeanalyze)ÚsourceutilsÚimportutilsÚfunctionutilsÚsuitesc                 C   s    t d|  ¡  ƒ}|||||dS )z~A factory for creating `Generate` objects

    `kind` can be 'variable', 'function', 'class', 'module' or
    'package'.

    ZGenerate)Úgoal_resource)ÚevalÚtitle)ÚkindÚprojectÚresourceÚoffsetr   Zgenerate© r   ú4lib/python3.9/site-packages/rope/contrib/generate.pyÚcreate_generate   s    r   c                 C   sJ   |du r| j }| d¡}|}|dd… D ]}| |¡}q(| |d d ¡S )z9Creates a module and returns a `rope.base.resources.File`NÚ.éÿÿÿÿz.py)ÚrootÚsplitÚ	get_childÚcreate_file)r   ÚnameÚsourcefolderÚpackagesÚparentÚpackager   r   r   Úcreate_module   s    
r"   c                 C   sT   |du r| j }| d¡}|}|dd… D ]}| |¡}q(| |d ¡}| d¡ |S )z<Creates a package and returns a `rope.base.resources.Folder`Nr   r   ú__init__.py)r   r   r   Zcreate_folderr   )r   r   r   r   r    r!   Zmade_packagesr   r   r   Úcreate_package   s    

r$   c                   @   sF   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dS )Ú	_GenerateNc                 C   s:   || _ || _|| _|  |||¡| _| j ¡ | _|  ¡  d S ©N)r   r   r   Ú_generate_infoÚinfoÚget_namer   Ú_check_exceptional_conditions)Úselfr   r   r   r   r   r   r   Ú__init__+   s    z_Generate.__init__c                 C   s   t |j||| jƒS r&   )Ú_GenerationInfoÚpycorer   ©r+   r   r   r   r   r   r   r'   3   s    z_Generate._generate_infoc                 C   s8   | j  ¡ rt d| j ¡‚| j  ¡ s4t d| j ¡‚d S )NzElement <%s> already exists.z5Cannot determine the scope <%s> should be defined in.)r(   Úelement_already_existsr   ÚRefactoringErrorr   Úprimary_is_found©r+   r   r   r   r*   6   s    
ÿ
ÿz'_Generate._check_exceptional_conditionsc                 C   sÌ   t  d|  ¡ | jf ¡}| j ¡ }| j ¡ }t |  	¡ |¡}d|d  | d|d   }| j 
¡ }| j ¡ \}}t | ¡ ¡}	|	 |||¡ | t  ||	 ¡ ¡¡ | jrÈt| j| j| j| jƒ}
| |
¡ |S )NzGenerate %s <%s>Ú
r   é   )r   Ú	ChangeSetÚ_get_element_kindr   r(   Úget_scope_indentsÚget_blank_linesr	   Zfix_indentationÚ_get_elementÚget_insertion_resourceÚget_insertion_offsetsr   ZChangeCollectorÚreadÚ
add_changeÚChangeContentsZget_changedr   Ú_add_relative_import_to_moduler   r   )r+   ÚchangesÚindentsZblanksZbase_definitionÚ
definitionr   ÚstartÚendZ	collectorZrelative_importr   r   r   Úget_changes@   s$    ÿ


ÿ
z_Generate.get_changesc                 C   s   | j  ¡ | j  ¡ fS r&   )r(   r;   Úget_insertion_linenor3   r   r   r   Úget_locationV   s    z_Generate.get_locationc                 C   s
   t ƒ ‚d S r&   ©ÚNotImplementedErrorr3   r   r   r   r7   Y   s    z_Generate._get_element_kindc                 C   s
   t ƒ ‚d S r&   rI   r3   r   r   r   r:   \   s    z_Generate._get_element)N)
Ú__name__Ú
__module__Ú__qualname__r,   r'   r*   rF   rH   r7   r:   r   r   r   r   r%   *   s   

r%   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚGenerateFunctionc                 C   s   t |j||ƒS r&   )Ú_FunctionGenerationInfor.   r/   r   r   r   r'   a   s    zGenerateFunction._generate_infoc                 C   sh   d}g }| j  ¡ rd}| j  ¡ s4| j  ¡ s4| j  ¡ r>| d¡ | | j  ¡ ¡ d|| jd 	|¡f }|S )NÚ z@staticmethod
r+   z%sdef %s(%s):
    pass
z, )
r(   Úis_static_methodÚ	is_methodÚis_constructorÚis_instanceÚappendÚextendÚget_passed_argsr   Újoin)r+   Ú	decoratorÚargsrC   r   r   r   r:   d   s$    
ÿþý
ýzGenerateFunction._get_elementc                 C   s   dS )NÚFunctionr   r3   r   r   r   r7   w   s    z"GenerateFunction._get_element_kindN)rK   rL   rM   r'   r:   r7   r   r   r   r   rN   `   s   rN   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚGenerateVariablec                 C   s
   d| j  S )Nz
%s = None
©r   r3   r   r   r   r:   |   s    zGenerateVariable._get_elementc                 C   s   dS )NZVariabler   r3   r   r   r   r7      s    z"GenerateVariable._get_element_kindN©rK   rL   rM   r:   r7   r   r   r   r   r\   {   s   r\   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚGenerateClassc                 C   s
   d| j  S )Nzclass %s(object):
    pass
r]   r3   r   r   r   r:   „   s    zGenerateClass._get_elementc                 C   s   dS )NÚClassr   r3   r   r   r   r7   ‡   s    zGenerateClass._get_element_kindNr^   r   r   r   r   r_   ƒ   s   r_   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚGenerateModulec                 C   st   | j  ¡ }t d| j ¡}| j d|j| jf ¡}| ¡ rJt	 
d|j ¡‚| t |¡¡ | t| j| j|ƒ¡ |S )NzGenerate Module <%s>z%s/%s.pyzModule <%s> already exists)r(   Úget_packager   r6   r   r   Zget_fileÚpathÚexistsr   r1   r>   ÚCreateResourceÚ_add_import_to_moduler   )r+   r!   rA   Únew_resourcer   r   r   rF   Œ   s    
ÿÿzGenerateModule.get_changesc                 C   s   | j  ¡ }| d| j ¡dfS )Nz%s.pyr5   ©r(   rb   r   r   )r+   r!   r   r   r   rH   š   s    
zGenerateModule.get_locationN©rK   rL   rM   rF   rH   r   r   r   r   ra   ‹   s   ra   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚGeneratePackagec                 C   sž   | j  ¡ }t d| j ¡}| j d|j| jf ¡}| ¡ rJt	 
d|j ¡‚| t |¡¡ | t| j| j|ƒ¡ | j |jd | j ¡}| t |d¡¡ |S )NzGenerate Package <%s>z%s/%szPackage <%s> already existsú/r#   )r(   rb   r   r6   r   r   Z
get_folderrc   rd   r   r1   r>   re   rf   r   Z
CreateFile)r+   r!   rA   rg   Úchildr   r   r   rF       s    
ÿÿzGeneratePackage.get_changesc                 C   s$   | j  ¡ }| | j¡}| d¡dfS )Nr#   r5   rh   )r+   r!   rl   r   r   r   rH   °   s    
zGeneratePackage.get_locationNri   r   r   r   r   rj   Ÿ   s   rj   c                 C   sR   |   |¡}t | ¡}| |¡}t |¡}t |d ff¡}| |¡ t 	|| 
¡ ¡S r&   )Úget_pymoduler
   ÚImportToolsÚmodule_importsr   ÚmodnameZNormalImportÚ
add_importr   r?   Úget_changed_source)r   r   ÚimportedÚpymoduleÚimport_toolsro   Zmodule_nameÚ
new_importr   r   r   rf   ¶   s    




rf   c                 C   sD   |   |¡}t | ¡}| |¡}| ||¡}| |¡ t || ¡ ¡S r&   )	rm   r
   rn   ro   Zget_from_importrq   r   r?   rr   )r   r   rs   r   rt   ru   ro   rv   r   r   r   r@   À   s    



r@   c                   @   s~   e Zd Zd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S )r-   Nc                 C   sV   || _ || _|| _|| _| j j |¡| _tjj	 
| j¡}| |¡\| _| _|  ¡  d S r&   )r.   r   r   r   r   rm   Úsource_pymoduleÚropeÚbaseZevaluateZScopeNameFinderZget_primary_and_pyname_atÚprimaryÚpynameÚ_init_fields)r+   r.   r   r   r   Úfinderr   r   r   r,   Ê   s    z_GenerationInfo.__init__c                 C   s&   |   ¡ | _|  ¡ | _|  | j¡| _d S r&   )Ú_get_source_scopeÚsource_scopeÚ_get_goal_scopeÚ
goal_scopeÚ_get_goal_moduleÚgoal_pymoduler3   r   r   r   r|   Ô   s    

z_GenerationInfo._init_fieldsc                 C   sj   | j d u r,| jr$| jj | j¡ ¡ S |  ¡ S | j  ¡ }t|t	j
ƒrJ| ¡ S t| ¡ t	jƒrf| ¡  ¡ S d S r&   )rz   r   r.   r   rm   Ú	get_scoper~   Ú
get_objectÚ
isinstancer   ÚPyDefinedObjectÚget_typeÚPyClass©r+   Úpyobjectr   r   r   r€   Ù   s    

z_GenerationInfo._get_goal_scopec                 C   s$   |d u rd S |j d ur|j }q|jS r&   )r    r‹   )r+   Zscoper   r   r   r‚   å   s
    
z _GenerationInfo._get_goal_modulec                 C   s$   | j  ¡ }| j j | j¡}| |¡S r&   )rw   r„   ÚlinesÚget_line_numberr   Zget_inner_scope_for_line)r+   Zmodule_scopeÚlinenor   r   r   r~   ì   s    
z!_GenerationInfo._get_source_scopec                 C   s¦   | j j}| j| jkrŠ| j j}| | j¡}| |¡d }t 	| jj
 ¡ ¡}| |¡}t ||¡}|  ¡ |k r†| ¡ }t ||¡}|j}q^|S t| j ¡ d | ¡ ƒS d S )Nr   r5   )rƒ   rŒ   r   r   Zlogical_linesr   r   Zlogical_line_inr   Zast_suite_treer‹   Zget_astZ
find_suiter	   Úget_indentsr8   Ú	get_startr    ÚminZget_endÚlength)r+   rŒ   Zline_finderrŽ   r   ZsuiterB   r   r   r   rG   ñ   s    
z$_GenerationInfo.get_insertion_linenoc                 C   s
   | j  ¡ S r&   )rƒ   Úget_resourcer3   r   r   r   r;     s    z&_GenerationInfo.get_insertion_resourcec                 C   s^   | j  ¡ dkr@t | j j¡\}}| jj||…  ¡ dkr@||fS | jj}| 	|  
¡ ¡}||fS )Nr`   Úpass)r   Úget_kindr	   Zget_body_regionr‹   rƒ   Úsource_codeÚstriprŒ   Zget_line_startrG   )r+   rD   rE   rŒ   r   r   r   r<     s    z%_GenerationInfo.get_insertion_offsetsc                 C   s,   | j  ¡ dkrdS t | jj| j  ¡ ¡d S )NÚModuler   é   )r   r•   r	   r   rƒ   rŒ   r   r3   r   r   r   r8     s    ÿýÿz!_GenerationInfo.get_scope_indentsc                 C   sf   | j  ¡ dkr&d}| jj ¡ dkr&d}| j  ¡ dkr8d}| j  ¡ dkrJd}| j | jkr^d|fS |dfS )Nr˜   é   rP   r   r`   r5   r[   )r   r•   rƒ   r–   r—   r   )r+   Zbase_blanksr   r   r   r9     s    z_GenerationInfo.get_blank_linesc                 C   sJ   | j }| j d u r | jj ¡ d S t| ¡ tjƒr<| ¡  ¡ S t	 
d¡‚d S )Nr   z2A module/package can be only created in a package.)rz   r.   r   Zget_source_foldersr†   r…   r   Z	PyPackager“   r   r1   )r+   rz   r   r   r   rb   %  s    
ÿz_GenerationInfo.get_packagec                 C   s
   | j d uS r&   )r   r3   r   r   r   r2   /  s    z _GenerationInfo.primary_is_foundc                 C   s.   | j d u st| j tjƒrdS |  ¡ | j ¡ v S ©NF©r{   r†   r   ZUnboundNamer)   r   Zget_defined_namesr3   r   r   r   r0   2  s    z&_GenerationInfo.element_already_existsc                 C   s   t  | j| j¡S r&   )r   Úget_name_atr   r   r3   r   r   r   r)   7  s    z_GenerationInfo.get_name)N)rK   rL   rM   r,   r|   r€   r‚   r~   rG   r;   r<   r8   r9   rb   r2   r0   r)   r   r   r   r   r-   É   s   

	

r-   c                   @   sT   e Z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S )rO   c                 C   s€   |   ¡ r| j ¡  ¡ S |  ¡ r0| j ¡  ¡  ¡ S | jd u rB|  ¡ S | j ¡ }t|t	j
ƒr`| ¡ S t| ¡ t	jƒr|| ¡  ¡ S d S r&   )rS   r{   r…   r„   rT   rˆ   rz   r~   r†   r   r‡   r‰   rŠ   r   r   r   r€   <  s    

z'_FunctionGenerationInfo._get_goal_scopec                 C   s.   | j d u st| j tjƒrdS |  ¡ | j ¡ v S r›   rœ   r3   r   r   r   r0   I  s    z._FunctionGenerationInfo.element_already_existsc                 C   s   | j d uot| j  ¡ tjƒS r&   )rz   r†   r…   r   r‰   r3   r   r   r   rQ   N  s    ÿz(_FunctionGenerationInfo.is_static_methodc                 C   s    | j d uot| j  ¡  ¡ tjƒS r&   )rz   r†   r…   rˆ   r   r‰   r3   r   r   r   rR   S  s    ÿz!_FunctionGenerationInfo.is_methodc                 C   s   | j d uot| j  ¡ tjƒS r&   )r{   r†   r…   r   r‰   r3   r   r   r   rS   X  s    ÿz&_FunctionGenerationInfo.is_constructorc                 C   s(   | j d u rdS | j  ¡ }t| ¡ tjƒS r›   )r{   r…   r†   rˆ   r   r‰   rŠ   r   r   r   rT   ]  s    

z#_FunctionGenerationInfo.is_instancec                 C   s(   |   ¡ rdS |  ¡ rdS t | j| j¡S )Nr,   Ú__call__)rS   rT   r   r   r   r   r3   r   r   r   r)   c  s
    z _FunctionGenerationInfo.get_namec                 C   s¶   g }| j j}t |¡}| | j¡r²| | j¡\}}| |d ¡\}}|||… }t 	|d¡}	|	 
¡ \}
}|
D ],}|  |¡r†| |¡ ql| dt|ƒ ¡ ql|D ]\}}| |¡ qž|S )Nr5   Fzarg%d)rw   r–   r   ZWorderZis_a_function_being_calledr   Zget_primary_rangeZget_word_parens_ranger   Z_FunctionParserZget_parametersÚ_is_idrU   Úlen)r+   ÚresultÚsourcer}   rD   rE   Zparens_startZ
parens_endÚcallÚparserrZ   ÚkeywordsÚargr   Úvaluer   r   r   rW   j  s     

z'_FunctionGenerationInfo.get_passed_argsc                 C   s4   dd„ }|D ]}||ƒs|  ¡ s dS q||d ƒS )Nc                 S   s   |   ¡ p| dkS )NÚ_)Úisalpha)Úcr   r   r   Úid_or_underline~  s    z7_FunctionGenerationInfo._is_id.<locals>.id_or_underlineFr   )Úisdigit)r+   r¦   r«   rª   r   r   r   rŸ   }  s
    z_FunctionGenerationInfo._is_idN)rK   rL   rM   r€   r0   rQ   rR   rS   rT   r)   rW   rŸ   r   r   r   r   rO   ;  s   rO   )N)N)N)Zrope.base.evaluaterx   Z	rope.baser   r   r   r   r   r   r   Zrope.refactorr	   r
   r   r   r   r"   r$   Úobjectr%   rN   r\   r_   ra   rj   rf   r@   r-   rO   r   r   r   r   Ú<module>   s     


6
	r