B
    9ˆZµ1  ã               @   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
 d dlmZ ejZdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ ZG dd„ deƒZG dd„ deƒZdd„ ZdS )é    N)ÚastÚastutilsÚ
exceptionsÚ	pyobjectsÚ	argumentsÚworder)Úpycompatc             C   s   t | |ƒd S )zFind the pyname at the offseté   )Úeval_location2)ÚpymoduleÚoffset© r   ú1lib/python3.7/site-packages/rope/base/evaluate.pyÚeval_location   s    r   c             C   s   t | ƒ}| |¡S )z%Find the primary and pyname at offset)ÚScopeNameFinderÚget_primary_and_pyname_at)r   r   Zpyname_finderr   r   r   r
      s    r
   c             C   s   t | |ƒd S )zlEvaluate a `ast.AST` node and return a PyName

    Return `None` if the expression cannot be evaluated.
    r	   )Ú
eval_node2)ÚscopeÚnoder   r   r   Ú	eval_node   s    r   c             C   s    t | ƒ}t ||¡ |j|jfS )N)ÚStatementEvaluatorr   ÚwalkÚ
old_resultÚresult)r   r   Z	evaluatorr   r   r   r      s    r   c             C   s   t | |ƒd S )Nr	   )Ú	eval_str2)Úholding_scopeÚnamer   r   r   Úeval_str$   s    r   c             C   s:   yt  d| ¡}W n tk
r.   tdƒ‚Y nX t| |ƒS )Nz(%s)z,Not a resolvable python identifier selected.)r   ÚparseÚSyntaxErrorÚBadIdentifierErrorr   )r   r   r   r   r   r   r   (   s    r   c               @   sD   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S )r   c             C   s&   |  ¡ | _|j| _t |jd¡| _d S )NT)Z	get_scopeÚmodule_scopeÚlinesr   ZWorderZsource_code)Úselfr   r   r   r   Ú__init__4   s    
zScopeNameFinder.__init__c             C   s`   ||  ¡ kr4|jd k	r4|j ¡ dkr4| j |¡r4dS ||  ¡ kr\| ¡ dkr\| j |¡r\dS dS )NZClassTF)Ú	get_startÚparentÚget_kindr   Ú%is_a_class_or_function_name_in_headerZis_name_assigned_in_class_body)r#   r   r   Úlinenor   r   r   Ú_is_defined_in_class_body9   s    
z)ScopeNameFinder._is_defined_in_class_bodyc             C   s@   |  ¡ |  kr| ¡ kr<n n| ¡ dkr<| j |¡r<dS dS )NZFunctionTF)r%   Zget_body_startr'   r   r(   )r#   r   r   r)   r   r   r   Ú$_is_function_name_in_function_headerE   s
     z4ScopeNameFinder._is_function_name_in_function_headerc             C   s   |   |¡d S )Nr	   )r   )r#   r   r   r   r   Úget_pyname_atL   s    zScopeNameFinder.get_pyname_atc       
      C   sP  | j  |¡}| j |¡}| j |¡rZ| j |¡}|  |¡}t|t	j
ƒrZd | ¡  |d ¡fS |  |||¡r¸|}|| ¡ kr~|j}| j |¡ ¡ }yd |j| fS  tjjjk
r¶   dS X |  |||¡rä| j |¡ ¡ }d |j| fS | j |¡s | j |¡r| j |¡}|  |¡}	d |	fS | j |¡r:| j |¡}n| j |¡}t||ƒS )N)NN)r"   Zget_line_numberr!   Zget_inner_scope_for_liner   Zis_function_keyword_parameterZget_word_atÚget_enclosing_functionÚ
isinstancer   Z
PyFunctionZget_parametersÚgetr*   r%   r&   Zget_primary_atÚstripÚpyobjectÚropeÚbaser   ÚAttributeNotFoundErrorr+   Zis_from_statement_moduleZ"is_import_statement_aliased_moduleÚ_find_moduleZis_from_aliasedZget_from_aliasedr   )
r#   r   r)   r   Zkeyword_namer1   Zclass_scoper   ÚmoduleZmodule_pynamer   r   r   r   O   s<    

z)ScopeNameFinder.get_primary_and_pyname_atc             C   s   | j  |¡}y|  |d ¡}W n tk
r6   d }Y nX |d k	rŒ| ¡ }t|tjƒrX|S t|tjƒrxd|krx|d  ¡ S d|krŒ|d  ¡ S d S )Nr	   r$   Ú__call__)	r   Zfind_parens_start_from_insider,   r    Ú
get_objectr.   r   ÚAbstractFunctionÚAbstractClass)r#   r   Zfunction_parensZfunction_pynamer1   r   r   r   r-   t   s    
z&ScopeNameFinder.get_enclosing_functionc             C   s<   d}x|| dkr|d7 }qW t jj | jj||d … |¡S )Nr   Ú.r	   )r2   r3   ÚpynamesZImportedModuler!   r1   )r#   Zmodule_nameZdotsr   r   r   r5   …   s
    zScopeNameFinder._find_moduleN)
Ú__name__Ú
__module__Ú__qualname__r$   r*   r+   r,   r   r-   r5   r   r   r   r   r   2   s   %r   c               @   sÖ   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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d4d0d1„Zd2d3„ Zd/S )5r   c             C   s   || _ d | _d | _d S )N)r   r   r   )r#   r   r   r   r   r$      s    zStatementEvaluator.__init__c             C   s   | j  |j¡| _d S )N)r   ÚlookupÚidr   )r#   r   r   r   r   Ú_Name”   s    zStatementEvaluator._Namec             C   sr   t | j|jƒ}|d kr"tjj ¡ }|| _| ¡ tjj	 
¡ krny| ¡ |j | _W n tjk
rl   d | _Y nX d S )N)r   r   Úvaluer2   r3   r<   ÚUnboundNamer   r8   r   Úget_unknownÚattrr   r   r4   )r#   r   Úpynamer   r   r   Ú
_Attribute—   s    zStatementEvaluator._Attributec                sè   ˆ  ˆ j¡\‰}|d krd S ‡ ‡‡fdd„}t|tjjjƒr˜d }d|kr\|d  ¡ }||ƒ}|d kst|tjj ¡ kr‚tjj 	|¡}tjj
j|dˆ_d S d }t|tjjjƒr²|}nd|krÆ|d  ¡ }|d k	rätjj
j||ƒdˆ_d S )Nc                s   t  ˆ| ˆ ˆj¡}|  |¡S )N)r   Zcreate_argumentsr   Úget_returned_object)r1   Úargs)r   Úprimaryr#   r   r   Ú_get_returned§   s    
z/StatementEvaluator._Call.<locals>._get_returnedÚ__new__)r1   r7   )Ú _get_primary_and_object_for_nodeÚfuncr.   r2   r3   r   r:   r8   rE   ÚPyObjectr<   rD   r   r9   )r#   r   r1   rL   r   Znew_functionZ
pyfunctionr   )r   rK   r#   r   Ú_Call¢   s,    zStatementEvaluator._Callc             C   s   t jjjt jj ¡ d| _d S )N)r1   )r2   r3   r<   rD   ÚbuiltinsZget_strr   )r#   r   r   r   r   Ú_Str¿   s    zStatementEvaluator._Strc             C   s   t |jƒj}|  |¡| _d S )N)ÚtypeÚnr=   Ú_get_builtin_namer   )r#   r   Ú	type_namer   r   r   Ú_NumÃ   s    zStatementEvaluator._Numc             C   s*   t jjj|  ¡ }t jj t jj |¡¡S )N)r2   r3   rR   r8   r<   rD   r   rP   )r#   rW   Zpytyper   r   r   rV   Ç   s    z$StatementEvaluator._get_builtin_namec             C   s   t jj |  |j¡¡| _d S )N)r2   r3   r<   rD   Ú_get_object_for_nodeÚleftr   )r#   r   r   r   r   Ú_BinOpÌ   s    zStatementEvaluator._BinOpc             C   s<   |   |jd ¡}|d kr(|   |jd ¡}tjj |¡| _d S )Nr   r	   )rY   Úvaluesr2   r3   r<   rD   r   )r#   r   r1   r   r   r   Ú_BoolOpÐ   s    zStatementEvaluator._BoolOpc             C   s   |   d¡| _d S )NÚstr)rV   r   )r#   r   r   r   r   Ú_ReprÖ   s    zStatementEvaluator._Reprc             C   s   t jj |  |j¡¡| _d S )N)r2   r3   r<   rD   rY   Zoperandr   )r#   r   r   r   r   Ú_UnaryOpÙ   s    zStatementEvaluator._UnaryOpc             C   s   |   d¡| _d S )NÚbool)rV   r   )r#   r   r   r   r   Ú_CompareÝ   s    zStatementEvaluator._Comparec             C   sP   d }d }|j r.|  |j d ¡}|  |jd ¡}tjjjtjj ||¡d| _	d S )Nr   )r1   )
ÚkeysrY   r\   r2   r3   r<   rD   rR   Zget_dictr   )r#   r   rc   r\   r   r   r   Ú_Dictà   s    zStatementEvaluator._Dictc             C   s:   d }|j r|  |j d ¡}tjjjtjj |¡d| _d S )Nr   )r1   )	ÚeltsrY   r2   r3   r<   rD   rR   Úget_listr   )r#   r   Zholdingr   r   r   Ú_Listé   s
    zStatementEvaluator._Listc             C   s*   |   |¡}tjjjtjj |¡d| _d S )N)r1   )Ú_what_does_comprehension_holdr2   r3   r<   rD   rR   rf   r   )r#   r   r1   r   r   r   Ú	_ListCompð   s    
zStatementEvaluator._ListCompc             C   s*   |   |¡}tjjjtjj |¡d| _d S )N)r1   )rh   r2   r3   r<   rD   rR   Zget_iteratorr   )r#   r   r1   r   r   r   Ú_GeneratorExpõ   s    
z StatementEvaluator._GeneratorExpc             C   s*   |   |¡}t||jƒ}|d k	r&| ¡ S d S )N)Ú_make_comprehension_scoper   Zeltr8   )r#   r   r   rG   r   r   r   rh   ú   s    
z0StatementEvaluator._what_does_comprehension_holdc             C   sX   | j }|j ¡ }i }x.|jD ]$}t|j|j|d|jƒ}| |¡ qW t	j
j |j||¡S )Nz.__iter__().next())r   r1   Z
get_moduleZ
generatorsÚ_get_evaluated_namesÚtargetÚiterr)   Úupdater2   r3   ZpyscopesZTemporaryScopeZpycore)r#   r   r   r6   ÚnamesÚcompZ	new_namesr   r   r   rk   ÿ   s    

z,StatementEvaluator._make_comprehension_scopec             C   sn   g }t |jƒdk r8x:|jD ]}|  |¡}| |¡ qW n| |  |jd ¡¡ tjjjtjjj	|Ž d| _
d S )Né   r   )r1   )Úlenre   rY   Úappendr2   r3   r<   rD   rR   Z	get_tupler   )r#   r   ZobjectsÚstmtr1   r   r   r   Ú_Tuple	  s    
zStatementEvaluator._Tuplec             C   s$   t | j|ƒ}d }|d k	r | ¡ }|S )N)r   r   r8   )r#   ru   rG   r1   r   r   r   rY     s
    z'StatementEvaluator._get_object_for_nodec             C   s,   t | j|ƒ\}}d }|d k	r$| ¡ }||fS )N)r   r   r8   )r#   ru   rK   rG   r1   r   r   r   rN     s
    z3StatementEvaluator._get_primary_and_object_for_nodec             C   sL   t |jtjƒr&|  |jd|jjg¡ n"t |jtjƒrH|  |jd|jg¡ d S )NÚ__getitem__)r.   Úslicer   ZIndexÚ_call_functionrC   ZSlice)r#   r   r   r   r   Ú
_Subscript"  s    

zStatementEvaluator._Subscriptc             C   s   |   d¡| _d S )Nrx   )rV   r   )r#   r   r   r   r   Ú_Slice*  s    zStatementEvaluator._SliceNc       	      C   s†   t | j|ƒ}|d k	r| ¡ }nd S ||kr‚||  ¡ }|rFt|tjƒsJd S |g}|r\||7 }t || j¡}tj	j
j| |¡d| _d S )N)r1   )r   r   r8   r.   r   r9   r   Z	Argumentsr2   r3   r<   rD   rI   r   )	r#   r   Zfunction_nameZ
other_argsrG   r1   ZcalledrJ   Z
arguments_r   r   r   ry   -  s    
z!StatementEvaluator._call_functionc             C   s$   t jjjt jj || j¡d| _d S )N)r1   )r2   r3   r<   rD   rR   ZLambdar   r   )r#   r   r   r   r   Ú_Lambda?  s    zStatementEvaluator._Lambda)N)r=   r>   r?   r$   rB   rH   rQ   rS   rX   rV   r[   r]   r_   r`   rb   rd   rg   ri   rj   rh   rk   rv   rY   rN   rz   r{   ry   r|   r   r   r   r   r      s2   	

r   c       
      C   sV   i }xLt  | ¡D ]>\}}tjj |||¡}tjj ||¡}	|	j 	|¡ |	||< qW |S )N)
r   Zget_name_levelsr2   r3   r<   ZAssignmentValueZ
pynamesdefZAssignedNameZassignmentsrt   )
ZtargetsÚassignedr6   Z
evaluationr)   r   r   ZlevelsZ
assignmentrG   r   r   r   rl   D  s    rl   )Zrope.base.builtinsr2   Zrope.base.pynamesZrope.base.pyobjectsZ	rope.baser   r   r   r   r   r   Zrope.base.utilsr   r    r   r
   r   r   r   r   Úobjectr   r   rl   r   r   r   r   Ú<module>   s    
[ 8