B
    Ÿ©ÙZ8  ã               @   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„ 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|  ¡  ƒ}||||ƒS )z~A factory for creating `Generate` objects

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

    ZGenerate)ÚevalÚtitle)ZkindÚprojectÚresourceÚoffsetZgenerate© r   ú4lib/python3.7/site-packages/rope/contrib/generate.pyÚcreate_generate   s    r   c             C   sN   |dkr| j }| d¡}|}x|dd… D ]}| |¡}q*W | |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   sX   |dkr| j }| d¡}|}x|dd… D ]}| |¡}q*W | |d ¡}| d¡ |S )z<Creates a package and returns a `rope.base.resources.Folder`Nr   r   z__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   Úgoal_resourceÚ_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 )N)Ú_GenerationInfoÚpycorer#   )r(   r   r   r   r   r   r   r$   5   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'   8   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_changesA   s"    




z_Generate.get_changesc             C   s   | j  ¡ | j  ¡ fS )N)r%   r6   Úget_insertion_lineno)r(   r   r   r   Úget_locationV   s    z_Generate.get_locationc             C   s
   t ƒ ‚d S )N)ÚNotImplementedError)r(   r   r   r   r2   Z   s    z_Generate._get_element_kindc             C   s
   t ƒ ‚d S )N)rD   )r(   r   r   r   r5   ]   s    z_Generate._get_element)N)
Ú__name__Ú
__module__Ú__qualname__r)   r$   r'   rA   rC   r2   r5   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 )N)Ú_FunctionGenerationInfor+   )r(   r   r   r   r   r   r   r$   c   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(   Z	decoratorÚargsr>   r   r   r   r5   f   s    


zGenerateFunction._get_elementc             C   s   dS )NÚFunctionr   )r(   r   r   r   r2   s   s    z"GenerateFunction._get_element_kindN)rE   rF   rG   r$   r5   r2   r   r   r   r   rH   a   s   rH   c               @   s   e Zd Zdd„ Zdd„ ZdS )ÚGenerateVariablec             C   s
   d| j  S )Nz
%s = None
)r   )r(   r   r   r   r5   y   s    zGenerateVariable._get_elementc             C   s   dS )NZVariabler   )r(   r   r   r   r2   |   s    z"GenerateVariable._get_element_kindN)rE   rF   rG   r5   r2   r   r   r   r   rU   w   s   rU   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   )r(   r   r   r   r5   ‚   s    zGenerateClass._get_elementc             C   s   dS )NÚClassr   )r(   r   r   r   r2   …   s    zGenerateClass._get_element_kindN)rE   rF   rG   r5   r2   r   r   r   r   rV   €   s   rV   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   r1   r   r   Zget_fileÚpathÚexistsr   r-   r9   ÚCreateResourceÚ_add_import_to_moduler   )r(   r   r<   Únew_resourcer   r   r   rA   ‹   s    
zGenerateModule.get_changesc             C   s   | j  ¡ }| d| j ¡dfS )Nz%s.pyr0   )r%   rY   r   r   )r(   r   r   r   r   rC   ˜   s    
zGenerateModule.get_locationN)rE   rF   rG   rA   rC   r   r   r   r   rX   ‰   s   rX   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ú/z__init__.py)r%   rY   r   r1   r   r   Z
get_folderrZ   r[   r   r-   r9   r\   r]   r   Z
CreateFile)r(   r   r<   r^   Úchildr   r   r   rA   Ÿ   s    
zGeneratePackage.get_changesc             C   s$   | j  ¡ }| | j¡}| d¡dfS )Nz__init__.pyr0   )r%   rY   r   r   )r(   r   ra   r   r   r   rC   ®   s    
zGeneratePackage.get_locationN)rE   rF   rG   rA   rC   r   r   r   r   r_      s   r_   c             C   sR   |   |¡}t | ¡}| |¡}t |¡}t |d ff¡}| |¡ t 	|| 
¡ ¡S )N)Úget_pymoduler
   ÚImportToolsÚmodule_importsr   ÚmodnameZNormalImportÚ
add_importr   r:   Úget_changed_source)r   r   ÚimportedÚpymoduleÚimport_toolsrd   Zmodule_nameÚ
new_importr   r   r   r]   ´   s    




r]   c             C   sD   |   |¡}t | ¡}| |¡}| ||¡}| |¡ t || ¡ ¡S )N)	rb   r
   rc   rd   Zget_from_importrf   r   r:   rg   )r   r   rh   r   ri   rj   rd   rk   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 )N)r+   r   r   r#   r   rb   Ú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 )N)Ú_get_source_scopeÚsource_scopeÚ_get_goal_scopeÚ
goal_scopeÚ_get_goal_moduleÚgoal_pymodule)r(   r   r   r   rq   Ó   s    

z_GenerationInfo._init_fieldsc             C   sj   | j d kr,| jr$| jj | j¡ ¡ S |  ¡ S | j  ¡ }t|t	j
ƒrJ| ¡ S t| ¡ t	jƒrf| ¡  ¡ S d S )N)ro   r#   r+   r   rb   Ú	get_scopers   Ú
get_objectÚ
isinstancer   ÚPyDefinedObjectÚget_typeÚPyClass)r(   Úpyobjectr   r   r   ru   Ø   s    

z_GenerationInfo._get_goal_scopec             C   s(   |d krd S x|j d k	r |j }qW |jS )N)r   r   )r(   Zscoper   r   r   rw   ä   s
    
z _GenerationInfo._get_goal_modulec             C   s$   | j  ¡ }| j j | j¡}| |¡S )N)rl   ry   ÚlinesÚget_line_numberr   Zget_inner_scope_for_line)r(   Zmodule_scopeÚlinenor   r   r   rs   ë   s    
z!_GenerationInfo._get_source_scopec             C   sª   | j j}| j| jkrŽ| j j}| | j¡}| |¡d }t 	| jj
 ¡ ¡}| |¡}t ||¡}x*|  ¡ |k rˆ| ¡ }t ||¡}|j}q`W |S t| j ¡ d | ¡ ƒS d S )Nr   r0   )rx   r€   rv   rt   Zlogical_linesr   r   Zlogical_line_inr   Zast_suite_treer   Zget_astZ
find_suiter	   Úget_indentsr3   Ú	get_startr   ÚminZget_endÚlength)r(   r€   Zline_finderr‚   r   Zsuiter=   r   r   r   rB   ð   s    

z$_GenerationInfo.get_insertion_linenoc             C   s
   | j  ¡ S )N)rx   Úget_resource)r(   r   r   r   r6     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 )NrW   Úpass)rv   Úget_kindr	   Zget_body_regionr   rx   Úsource_codeÚstripr€   Zget_line_startrB   )r(   r?   r@   r€   r   r   r   r7     s    z%_GenerationInfo.get_insertion_offsetsc             C   s,   | j  ¡ dkrdS t | jj| j  ¡ ¡d S )NÚModuler   é   )rv   r‰   r	   rƒ   rx   r€   r„   )r(   r   r   r   r3     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Œ   é   rJ   r   rW   r0   rT   )rv   r‰   rx   rŠ   r‹   rt   )r(   Zbase_blanksr   r   r   r4     s    z_GenerationInfo.get_blank_linesc             C   sJ   | j }| j d k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.)ro   r+   r   Zget_source_foldersr{   rz   r   Z	PyPackager‡   r   r-   )r(   ro   r   r   r   rY      s    
z_GenerationInfo.get_packagec             C   s
   | j d k	S )N)rv   )r(   r   r   r   r.   )  s    z _GenerationInfo.primary_is_foundc             C   s.   | j d kst| j tjƒrdS |  ¡ | j ¡ kS )NF)rp   r{   r   ÚUnboundNamer&   rv   Úget_defined_names)r(   r   r   r   r,   ,  s    z&_GenerationInfo.element_already_existsc             C   s   t  | j| j¡S )N)r   Úget_name_atr   r   )r(   r   r   r   r&   1  s    z_GenerationInfo.get_name)N)rE   rF   rG   r)   rq   ru   rw   rs   rB   r6   r7   r3   r4   rY   r.   r,   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 )rI   c             C   s€   |   ¡ r| j ¡  ¡ S |  ¡ r0| j ¡  ¡  ¡ S | jd krB|  ¡ S | j ¡ }t|t	j
ƒr`| ¡ S t| ¡ t	jƒr|| ¡  ¡ S d S )N)rM   rp   rz   ry   rN   r}   ro   rs   r{   r   r|   r~   )r(   r   r   r   r   ru   7  s    

z'_FunctionGenerationInfo._get_goal_scopec             C   s.   | j d kst| j tjƒrdS |  ¡ | j ¡ kS )NF)rp   r{   r   r   r&   rv   r   )r(   r   r   r   r,   D  s    z._FunctionGenerationInfo.element_already_existsc             C   s   | j d k	ot| j  ¡ tjƒS )N)ro   r{   rz   r   r~   )r(   r   r   r   rK   I  s    
z(_FunctionGenerationInfo.is_static_methodc             C   s    | j d k	ot| j  ¡  ¡ tjƒS )N)ro   r{   rz   r}   r   r~   )r(   r   r   r   rL   M  s    
z!_FunctionGenerationInfo.is_methodc             C   s   | j d k	ot| j  ¡ tjƒS )N)rp   r{   rz   r   r~   )r(   r   r   r   rM   Q  s    
z&_FunctionGenerationInfo.is_constructorc             C   s(   | j d krdS | j  ¡ }t| ¡ tjƒS )NF)rp   rz   r{   r}   r   r~   )r(   r   r   r   r   rN   U  s    

z#_FunctionGenerationInfo.is_instancec             C   s(   |   ¡ rdS |  ¡ rdS t | j| j¡S )Nr)   Ú__call__)rM   rN   r   r‘   r   r   )r(   r   r   r   r&   [  s
    z _FunctionGenerationInfo.get_namec             C   s¾   g }| j j}t |¡}| | j¡rº| | j¡\}}| |d ¡\}}|||… }t 	|d¡}	|	 
¡ \}
}x4|
D ],}|  |¡rˆ| |¡ qn| dt|ƒ ¡ qnW x|D ]\}}| |¡ q¤W |S )Nr0   Fzarg%d)rl   rŠ   r   ZWorderZis_a_function_being_calledr   Zget_primary_rangeZget_word_parens_ranger   Z_FunctionParserZget_parametersÚ_is_idrO   Úlen)r(   ÚresultÚsourcerr   r?   r@   Zparens_startZ
parens_endZcallÚparserrS   ÚkeywordsÚargr   Úvaluer   r   r   rQ   b  s     


z'_FunctionGenerationInfo.get_passed_argsc             C   s6   dd„ }x |D ]}||ƒs|  ¡ sdS qW ||d ƒS )Nc             S   s   |   ¡ p| dkS )NÚ_)Úisalpha)Úcr   r   r   Úid_or_underlinev  s    z7_FunctionGenerationInfo._is_id.<locals>.id_or_underlineFr   )Úisdigit)r(   r™   rž   r   r   r   r   r“   u  s
    
z_FunctionGenerationInfo._is_idN)rE   rF   rG   ru   r,   rK   rL   rM   rN   r&   rQ   r“   r   r   r   r   rI   5  s   rI   )N)N)Zrope.base.evaluaterm   Z	rope.baser   r   r   r   r   r   r   Zrope.refactorr	   r
   r   r   r   r    r!   Úobjectr"   rH   rU   rV   rX   r_   r]   r;   r*   rI   r   r   r   r   Ú<module>   s     

6		
	n