B
    ÀÅV$c  ã               @   s  d dl Z d dlZd dl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 d dlmZmZmZmZmZmZ dd„ Z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dd„ ZG dd„ deƒZG dd„ deƒZ d%dd„Z!dd„ Z"dd„ Z#dd „ Z$d!d"„ Z%d#d$„ Z&dS )&é    N)ÚpynamesÚ	pyobjectsÚcodeanalyzeÚ
taskhandleÚevaluateÚworderÚutilsÚlibutils)Ú	ChangeSetÚChangeContents)ÚoccurrencesÚrenameÚsourceutilsÚimportutilsÚmoveÚchange_signaturec              c   s(   d} xdt | ƒ d V  | d7 } qW d S )Nr   Ú__é   )Ústr)Ún© r   ú3lib/python3.7/site-packages/rope/refactor/inline.pyÚunique_prefix   s    r   c             C   s˜   t | ||ƒ}d}|dkr&tjj |¡‚t|tjƒr:| ¡ }t|tj	ƒrRt
| ||ƒS t|tjƒrjt| ||ƒS t| ¡ tjƒr†t| ||ƒS tjj |¡‚dS )z©Create a refactoring object for inlining

    Based on `resource` and `offset` it returns an instance of
    `InlineMethod`, `InlineVariable` or `InlineParameter`.

    zPInline refactoring should be performed on a method, local variable or parameter.N)Ú_get_pynameÚropeÚbaseÚ
exceptionsÚRefactoringErrorÚ
isinstancer   ÚImportedNameÚ_get_imported_pynameZAssignedNameÚInlineVariableZParameterNameÚInlineParameterÚ
get_objectr   Z
PyFunctionÚInlineMethod)ÚprojectÚresourceÚoffsetÚpynameÚmessager   r   r   Úcreate_inline%   s    r*   c               @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )Ú_Inlinerc             C   sL   || _ t|||ƒ| _t | ¡ d¡}| |¡| _| |¡| _	|| _
|| _d S )NT)r%   r   r(   r   ÚWorderÚreadÚget_primary_rangeÚregionZget_word_atÚnamer'   Úoriginal)Úselfr%   r&   r'   Zrange_finderr   r   r   Ú__init__?   s    z_Inliner.__init__c             O   s   d S )Nr   )r2   ÚargsÚkwdsr   r   r   Úget_changesH   s    z_Inliner.get_changesc             C   s   dS )z1Return either 'variable', 'method' or 'parameter'Nr   )r2   r   r   r   Úget_kindK   s    z_Inliner.get_kindN)Ú__name__Ú
__module__Ú__qualname__r3   r6   r7   r   r   r   r   r+   =   s   	r+   c                   sj   e Zd Z‡ fdd„Zdd„ Zdd„ Zddd	e ¡ fd
d„Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Z‡  ZS )r$   c                sl   t t| ƒj||Ž | j ¡ | _| j ¡ | _| j ¡  ¡ | _	t
 | j| j| j¡| _t| j| jƒ| _|  ¡  d S )N)Úsuperr$   r3   r(   r#   Ú
pyfunctionÚ
get_moduleÚpymoduleÚget_resourcer&   r   Úcreate_finderr%   r0   Úoccurrence_finderÚ_DefinitionGeneratorÚnormal_generatorÚ_init_imports)r2   r4   r5   )Ú	__class__r   r   r3   Q   s    
zInlineMethod.__init__c             C   s@   t  | j¡}t | j| j|¡\}}|| _t| j| j|d| _	d S )N)Úbody)
r   Úget_bodyr<   r   Úmoving_code_with_importsr%   r&   ÚimportsrB   Úothers_generator)r2   rF   rI   r   r   r   rD   \   s    zInlineMethod._init_importsc             C   sr   | j  ¡ }| jj}| ¡ }| j jrB| j j}t|d dƒrB|d j}| |¡}t	| 
|j¡d t| jjƒƒ}||fS )Nr   Úlinenor   )r<   Ú	get_scoper>   ÚlinesÚ	get_startÚ
decoratorsÚhasattrrK   Úget_line_startÚminÚget_line_endÚendÚlenÚsource_code)r2   ÚscoperM   Ú
start_linerO   Ústart_offsetÚ
end_offsetr   r   r   Ú_get_scope_ranged   s    


zInlineMethod._get_scope_rangeTFNc             C   s  t d| j ƒ}|dkr | j ¡ }|r<| jg}|r<| | j¡ | dt|ƒ¡}xÂ|D ]º}| 	|j
¡ || jkr„| | j|||d¡ n€d}|rœ| j|krœ| j}t| j|| j|ƒ}	t | j||	¡ ¡ }
|
dk	rt| j|
|| jƒ}
|rôt| j| j|
|ƒ}
| t||
ƒ¡ | ¡  qRW |S )zÓGet the changes this refactoring makes

        If `remove` is `False` the definition will not be removed.  If
        `only_current` is `True`, the the current occurrence will be
        inlined, only.
        zInline method <%s>NzCollecting Changes)ÚremoveÚonly_current)r
   r0   r%   Úget_python_filesr1   Úappendr&   Úcreate_jobsetrU   Ústarted_jobÚpathÚ
add_changeÚ_defining_file_changesr'   Ú#_InlineFunctionCallsForModuleHandlerJ   r   ÚModuleSkipRenamerrA   Úget_changed_moduleÚ_add_importsrI   Ú_remove_fromr(   r   Úfinished_job)r2   r\   r]   Ú	resourcesÚtask_handleÚchangesZjob_setÚfileÚaimÚhandleÚresultr   r   r   r6   q   s<    






zInlineMethod.get_changesc             C   s€   | j  ¡ }| jj}|  ¡ \}}| ¡ }x4t|d | ¡ ƒD ]}| |¡ 	¡ dkrV|}q:P q:W t
| |¡d t| jjƒƒ}||fS )Nr   Ú )r<   rL   r>   rM   r[   Zget_endÚrangeÚlengthÚget_lineÚstriprR   rS   rU   rV   )r2   rW   rM   ÚstartrT   Úend_lineÚir   r   r   Ú_get_removed_range™   s    
zInlineMethod._get_removed_rangec       
      C   sˆ   |   ¡ \}}d }|r:| j| jkr(| j}nt| j ¡ ƒd }t| j| j| j|d}d }|r`|  	¡ }t
 | j| j||||¡ ¡ }	t| j|	ƒS )Néd   )Ú
aim_offset)rz   r&   r1   r'   rU   r-   re   r%   rC   Ú_get_method_replacementr   rf   rA   rg   r   )
r2   rm   r\   r]   rY   rZ   ro   rp   Zreplacementrq   r   r   r   rd   §   s     z#InlineMethod._defining_file_changesc             C   s2   |   ¡ r.t | jj| j ¡  ¡ ¡}d| d S dS )Nú zpass
rr   )Ú_is_the_last_method_of_a_classr   Úget_indentsr>   rM   r<   rL   rN   )r2   Úindentsr   r   r   r}   »   s
    z$InlineMethod._get_method_replacementc             C   sj   | j j}t|tjƒsdS t |¡\}}| jj}|  	¡ \}}|||…  
¡ dkrf|||…  
¡ dkrfdS dS )NFrr   T)r<   Úparentr   r   ZPyClassr   Zget_body_regionr>   rV   r[   rv   )r2   ZpyclassZclass_startZ	class_endÚsourceZ
func_startZfunc_endr   r   r   r   Â   s    z+InlineMethod._is_the_last_method_of_a_classc             C   s   dS )NÚmethodr   )r2   r   r   r   r7   Î   s    zInlineMethod.get_kind)r8   r9   r:   r3   rD   r[   r   ÚNullTaskHandler6   rz   rd   r}   r   r7   Ú__classcell__r   r   )rE   r   r$   O   s   'r$   c                   s\   e Zd Z‡ fdd„Zdd„ Zdddde ¡ fdd	„Zd
d„ Zdd„ Z	dd„ Z
dd„ Z‡  ZS )r!   c                sB   t t| ƒj||Ž | j ¡ d | _| j ¡ | _|  ¡  |  	¡  d S )Nr   )
r;   r!   r3   r(   Úget_definition_locationr>   r?   r&   Ú_check_exceptional_conditionsrD   )r2   r4   r5   )rE   r   r   r3   Ô   s
    zInlineVariable.__init__c             C   s"   t | jjƒdkrtjj d¡‚d S )Nr   z4Local variable should be assigned once for inlining.)rU   r(   Úassignmentsr   r   r   r   )r2   r   r   r   rˆ   Û   s    z,InlineVariable._check_exceptional_conditionsTFNc             C   sø   |d kr(t  | j¡r| jg}n
| j ¡ }|rP| jg}|rP| j| jkrP| | j¡ td| j	 ƒ}| 
dt|ƒ¡}x„|D ]|}| |j¡ || jkr°|  |||¡}	| t| j|	ƒ¡ n8|  |||¡}
|
d k	rèt| j|
|| jƒ}
| t||
ƒ¡ | ¡  qtW |S )NzInline variable <%s>zCalculating changes)r   Z	_is_localr(   r&   r%   r^   r1   r_   r
   r0   r`   rU   ra   rb   Ú_change_main_modulerc   r   Ú_change_modulerh   rI   rj   )r2   r\   r]   rk   Údocsrl   rm   Zjobsetr&   rƒ   rq   r   r   r   r6   à   s.    





zInlineVariable.get_changesc          	   C   s8   d }|r| j | jkr| j}t| j| j| j| j|||dS )N)r\   r/   rŒ   )r1   r&   r/   Ú_inline_variabler%   r>   r(   r0   )r2   r\   r]   rŒ   r/   r   r   r   rŠ   ý   s    z"InlineVariable._change_main_modulec             C   s,   t | j| jƒ}t | j| j|¡\| _| _d S )N)	Ú
_getvardefr>   r(   r   rH   r%   r&   ÚimportedrI   )r2   Zvardefr   r   r   rD     s    zInlineVariable._init_importsc                s€   t  ¡ t  ˆ j¡g}|r:|ˆ jkr:‡ fdd„}| d|¡ t jˆ jˆ j|d}t	j
|ˆ j|dd}|r||r|tˆ jˆ j||ƒ}|S )Nc                s(   |   ¡ \}}ˆ j|k s |ˆ jk r$dS d S )NF)r.   r'   )Ú
occurrencerw   rT   )r2   r   r   Ú	check_aim  s    z0InlineVariable._change_module.<locals>.check_aimr   )ÚfiltersT)r&   Úreplace_primary)r   ZNoImportsFilterZPyNameFilterr(   r1   ÚinsertÚFinderr%   r0   r   Úrename_in_moduler   ri   )r2   r&   r\   r]   r’   r‘   ÚfinderZchangedr   )r2   r   r‹   
  s    
zInlineVariable._change_modulec             C   s   dS )NZvariabler   )r2   r   r   r   r7     s    zInlineVariable.get_kind)r8   r9   r:   r3   rˆ   r   r…   r6   rŠ   rD   r‹   r7   r†   r   r   )rE   r   r!   Ò   s   r!   c                   s4   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Z‡  ZS )	r"   c                sJ   t t| ƒj||Ž |  ¡ \}}| jj}t |¡g| _t 	| j
||¡| _d S )N)r;   r"   r3   Ú_function_locationr(   Úindexr   ZArgumentDefaultInlinerÚchangersZChangeSignaturer%   Ú	signature)r2   r4   r5   r&   r'   r™   )rE   r   r   r3   !  s    zInlineParameter.__init__c             C   s@   | j  ¡ \}}| ¡ }|j |¡}t |j¡}| |¡}||fS )N)	r(   r‡   r?   rM   rQ   r   r,   rV   Zfind_function_offset)r2   r>   rK   r&   rw   Zword_finderr'   r   r   r   r˜   )  s    
z"InlineParameter._function_locationc             K   s   | j j| jf|ŽS )z–Get the changes needed by this refactoring

        See `rope.refactor.change_signature.ChangeSignature.get_changes()`
        for arguments.
        )r›   r6   rš   )r2   r5   r   r   r   r6   1  s    zInlineParameter.get_changesc             C   s   dS )NZ	parameterr   )r2   r   r   r   r7   9  s    zInlineParameter.get_kind)r8   r9   r:   r3   r˜   r6   r7   r†   r   r   )rE   r   r"     s   r"   c             C   sL   g }x8| D ]0}|  ¡ }| d¡r0|d d…   ¡ }| |¡ q
W d |¡}|S )Nú\éÿÿÿÿr~   )rv   Úendswithr_   Újoin)rM   Zdefinition_linesZunchanged_lineÚlineZjoinedr   r   r   Ú_join_lines=  s    


r¡   c               @   sn   e Zd Zeƒ Zddd„Zdd„ Zdd„ Zdd	„ Zg d
fdd„Zdd„ Z	dd„ Z
dd„ Zdd„ Zedd„ ƒZdS )rB   Nc             C   s^   || _ || _| ¡ | _| j ¡ | _|  ¡ | _|  ¡ | _	i | _
|d k	rL|| _nt | j¡| _d S )N)r%   r<   r=   r>   r?   r&   Ú_get_definition_infoÚdefinition_infoÚ_get_definition_paramsÚdefinition_paramsZ_calculated_definitionsrF   r   rG   )r2   r%   r<   rF   r   r   r   r3   K  s    


z_DefinitionGenerator.__init__c             C   s   t jjj | j¡S )N)r   ÚrefactorÚfunctionutilsZDefinitionInfor-   r<   )r2   r   r   r   r¢   X  s    z)_DefinitionGenerator._get_definition_infoc             C   sh   | j }tdd„ |jD ƒƒ}|jd k	s.|jd k	r<tjj d¡‚| j	 
¡ dkrd| j	j ¡ ||jd d < |S )Nc             S   s   g | ]}|‘qS r   r   )Ú.0Zpairr   r   r   ú
<listcomp>]  s    z?_DefinitionGenerator._get_definition_params.<locals>.<listcomp>z9Cannot inline functions with list and keyword arguements.Úclassmethodr   )r£   ÚdictZargs_with_defaultsZargs_argZkeywords_argr   r   r   r   r<   r7   r‚   Úget_name)r2   r£   Ú	paramdictr   r   r   r¤   [  s    

z+_DefinitionGenerator._get_definition_paramsc             C   s
   | j  ¡ S )N)r<   r¬   )r2   r   r   r   Úget_function_nameg  s    z&_DefinitionGenerator.get_function_nameFc             C   s   |   |||||¡S )N)Ú_calculate_definition)r2   Úprimaryr(   ÚcallÚ	host_varsÚreturnsr   r   r   Úget_definitionj  s    
z#_DefinitionGenerator.get_definitionc             C   s¬   t jjj ||| j|¡}| j}t jj | j|¡}x|j 	¡ D ]\}}|||< q<W d}	g }
xJ| 	¡ D ]>\}}||krb|d k	rb|	|d | 
dd¡ d 7 }	|
 |¡ qbW |	|
fS )Nrr   z = Ú
r~   )r   r¦   r§   ZCallInfor-   r£   r¥   ZArgumentMappingZ
param_dictÚitemsÚreplacer_   )r2   r°   r(   r±   Z	call_infor­   ÚmappingZ
param_nameÚvalueÚheaderÚto_be_inlinedr0   r   r   r   Ú_calculate_headerp  s    

z&_DefinitionGenerator._calculate_headerc                s   |   |||¡\}}|| j }t | j|¡}	|	 ¡  ¡ ‰ ‡ fdd„ˆ D ƒ}
tt|
ƒ 	t|ƒ¡ƒdkrÜt
tjƒ‰t | j|| j¡}‡fdd„|D ƒ}xJ|
D ]B}|| }t | j||¡}tj|ˆ| |d}t | j|| j¡}q–W x6|D ].}t | j|| j¡}|| }t| j|||ƒ}qâW |  ||¡S )Nc                s$   g | ]}t ˆ | tjjjƒs|‘qS r   )r   r   r   ÚbuiltinsZBuiltinName)r¨   Úx)Ú	name_dictr   r   r©   ‰  s    z>_DefinitionGenerator._calculate_definition.<locals>.<listcomp>r   c                s   g | ]}ˆ | ‘qS r   r   )r¨   Úitem)Úprefixr   r   r©   •  s    )r>   )r¼   rF   r	   Úget_string_moduler%   rL   Ú	get_namesrU   ÚsetÚintersectionÚnextrB   r   r&   r   r@   r   r–   r   Ú_replace_returns_with)r2   r°   r(   r±   r²   r³   rº   r»   rƒ   ÚmodZ	all_namesZguestrÀ   rA   r0   r>   r   )r¿   rÁ   r   r¯   ‚  s0    




z*_DefinitionGenerator._calculate_definitionc          	   C   s  g }d }d}xìt  ¡  |¡D ]Ú}xÔ| ¡  ¡ D ]Ä\}}|r.|dkr.| ||| d¡… ¡ |rœ|  || d¡¡ | d¡}	t	||	t
|ƒ…  ¡ ƒ}t
|ƒ}q.| d¡}
x$|
t
|ƒk rÊ||
 dkrÊ|
d7 }
q¨W |
}|
t
|ƒksè||
 dkr.| d¡ q.W qW | ||d … ¡ d |¡|fS )Nr   Úreturnz 	r   rµ   Úpassrr   )rB   Ú_get_return_patternÚfinditerÚ	groupdictr¶   r_   rw   Ú_check_nothing_after_returnrT   r¡   rU   Ú
splitlinesrŸ   )r2   rƒ   r³   rq   ÚreturnedZlast_changedÚmatchÚkeyr¹   Zbeg_idxZcurrentr   r   r   rÇ   ¨  s0    




z*_DefinitionGenerator._replace_returns_withc             C   s\   t  |¡}| |¡}t  |¡}| |¡d }|| |¡t|ƒ…  ¡ dkrXtj	j
 d¡‚d S )Nr   rr   z?Cannot inline functions with statements after return statement.)r   ÚSourceLinesAdapterÚget_line_numberZLogicalLineFinderÚlogical_line_inrS   rU   rv   r   r   r   r   )r2   rƒ   r'   rM   rK   Úlogical_linesr   r   r   rÎ   Ã  s    


z0_DefinitionGenerator._check_nothing_after_returnc             C   sT   t | dƒsNdd„ }|ddgƒ}|dt ¡ gƒ}d}t |d | d | ¡| _| jS )	NÚ_return_patternc             S   s   d|  d  |¡ d S )Nz(?P<%s>ú|ú))rŸ   )r0   Zlist_r   r   r   Únamed_patternÐ  s    z?_DefinitionGenerator._get_return_pattern.<locals>.named_patternÚcommentz#[^\n]*Ústringz\b(?P<return>return)\brØ   )rP   r   Zget_string_patternÚreÚcompiler×   )ÚclsrÚ   Zcomment_patternZstring_patternZreturn_patternr   r   r   rË   Í  s    

z(_DefinitionGenerator._get_return_pattern)N)r8   r9   r:   r   r3   r¢   r¤   r®   r´   r¼   r¯   rÇ   rÎ   rª   rË   r   r   r   r   rB   H  s   
&
rB   c               @   sd   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zeej	d
d„ ƒƒZ
eej	dd„ ƒƒZeej	dd„ ƒƒZdS )re   Nc             C   s   || _ || _|| _|| _dS )z‡Inlines occurrences

        If `aim` is not `None` only the occurrences that intersect
        `aim` offset will be inlined.

        N)r%   Ú	generatorr&   ro   )r2   r%   r&   Zdefinition_generatorr|   r   r   r   r3   Þ  s    z,_InlineFunctionCallsForModuleHandle.__init__c             C   s   |  ¡ stjj d¡‚d S )Nz1Cannot inline functions that reference themselves)Z
is_definedr   r   r   r   )r2   Úchange_collectorr   r   r   r   Úoccurred_inside_skipë  s    z8_InlineFunctionCallsForModuleHandle.occurred_inside_skipc             C   s”  |  ¡ \}}| ¡ rd S | ¡ s:tjj d| jj|f ¡‚| j	d k	r\| j	|k sX| j	|kr\d S |  
| j|d ¡}| j |¡}| jj |¡\}}| j |¡}	| j |¡}
| j|	|…  ¡ dkpÎ| j||
…  ¡ dk}t | j|¡}| ¡ \}}| j}|j |¡}| jj||| j||… | ¡ |d\}}t|
d t| jƒƒ}| |	|t ||¡¡ |r|}|d krfd}| |
|| j|	|… | | j||…  ¡ d S )NzQReference to inlining function other than function call in <file: %s, offset: %d>r   rr   )r³   ÚNone) r.   Zis_in_import_statementZ	is_calledr   r   r   r   r&   rb   ro   Ú_find_end_parensrƒ   rM   rÔ   r>   rÖ   rÕ   rQ   rS   rv   r   r€   Zget_primary_and_pynamerW   Zget_inner_scope_for_linerà   r´   rÃ   rR   rU   rc   Zfix_indentation)r2   rá   r   rw   rT   Z
end_parensrK   rX   rx   Z
line_startZline_endr³   r   r°   r(   ZhostrW   Ú
definitionrÐ   r0   r   r   r   Úoccurred_outside_skipð  sD    

z9_InlineFunctionCallsForModuleHandle.occurred_outside_skipc             C   s   t  |¡}| |¡d S )Nr   )r   r,   Zget_word_parens_range)r2   rƒ   r'   r—   r   r   r   rä     s    
z4_InlineFunctionCallsForModuleHandle._find_end_parensc             C   s   | j  | j¡S )N)r%   Úget_pymoduler&   )r2   r   r   r   r>     s    z,_InlineFunctionCallsForModuleHandle.pymodulec             C   s    | j d k	r| j  ¡ S | jjS d S )N)r&   r-   r>   rV   )r2   r   r   r   rƒ   "  s    

z*_InlineFunctionCallsForModuleHandle.sourcec             C   s   | j jS )N)r>   rM   )r2   r   r   r   rM   *  s    z)_InlineFunctionCallsForModuleHandle.lines)N)r8   r9   r:   r3   râ   ræ   rä   Úpropertyr   Zsaveitr>   rƒ   rM   r   r   r   r   re   Ü  s   
)re   TFc             C   sŽ   t ||ƒ}t||ƒ\}}	tj| |||d}
tj|
||dd|d}|d krN|j}|r†t |¡}|d | 	|¡… || 
|	¡d d …  }n|}|S )N)rŒ   TF)r>   r“   Zwritesr/   r   )rŽ   Ú_assigned_linenor   r@   r   r–   rV   r   rÓ   rQ   rS   )r%   r>   r(   r0   r\   r/   rŒ   rå   rw   rT   rA   Zchanged_sourcerM   rƒ   r   r   r   r   0  s    


r   c                sp   |j d }| j‰ t| |ƒ\}}t‡ fdd„t||d ƒD ƒƒ}|jrRtjj 	d¡‚|| 
d¡d d …  ¡ }|S )Nr   c                s   g | ]}ˆ   |¡‘qS r   )ru   )r¨   r   )rM   r   r   r©   J  s    z_getvardef.<locals>.<listcomp>r   z Cannot inline tuple assignments.ú=)r‰   rM   ré   r¡   rs   Zlevelsr   r   r   r   r™   rv   )r>   r(   Z
assignmentrw   rT   Zdefinition_with_assignmentrå   r   )rM   r   rŽ   E  s    
rŽ   c             C   s   |j d jj}| j |¡S )Nr   )r‰   Zast_noderK   rÖ   rÕ   )r>   r(   Zdefinition_liner   r   r   ré   S  s    ré   c             C   sj   |s|S t  | ||¡}t | |¡}x|D ]}| |¡ q(W | ¡ }t  | ||¡}t | ¡}|j|dddS )NF)ZunusedÚsort)r	   rÂ   r   Úget_module_importsZ
add_importÚget_changed_sourceZImportToolsZorganize_imports)r%   rƒ   r&   rI   r>   Úmodule_importZimport_infoZimport_toolsr   r   r   rh   X  s    

rh   c             C   s.   |   |¡}t ||¡}t|tjƒr*| ¡ }|S )N)rç   r   Zeval_locationr   r   r   r    )r%   r&   r'   r>   r(   r   r   r   r   e  s
    
r   c             C   s,   t  | ||¡}t | |¡}| |¡ | ¡ S )N)r	   rÂ   r   rì   Zremove_pynamerí   )r%   r(   rƒ   r&   r>   rî   r   r   r   ri   m  s    
ri   )TNF)'rÝ   Zrope.base.exceptionsr   Zrope.refactor.functionutilsZ	rope.baser   r   r   r   r   r   r   r	   Zrope.base.changer
   r   Zrope.refactorr   r   r   r   r   r   r   r*   Úobjectr+   r$   r!   r"   r¡   rB   re   r   rŽ   ré   rh   r   ri   r   r   r   r   Ú<module>   s,   (  M U
