B
    ­»ˆdª!  ã               @   sš   d Z ddlmZ ddlmZ ddlmZ ddlZddlZddlZe dd¡Z	G dd	„ d	ej
ƒZG d
d„ deƒZG dd„ deƒZG dd„ deƒZdd„ ZdS )z/Perform static analysis on python syntax trees.é    )Úabsolute_import)Údivision)Úprint_functionNÚExternalReference)ÚnameÚnodeÚname_refc                   sp   e Zd Z‡ fdd„Z‡ f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‡  ZS )ÚScopeVisitorc                s(   t t| ƒ ¡  d | _td ƒ | _| _d S )N)Úsuperr	   Ú__init__Ú_parentÚ	RootScopeÚ
root_scopeÚscope)Úself)Ú	__class__© úB/var/www/html/venv/lib/python3.7/site-packages/pasta/base/scope.pyr   '   s    zScopeVisitor.__init__c                sV   |d krd S | j jd kr || j _| j  || j¡ | j}|| _tt| ƒ |¡ || _d S )N)r   r   Ú
set_parentr   r
   r	   Úvisit)r   r   Útmp)r   r   r   r   ,   s    zScopeVisitor.visitc             G   sb   x\|D ]T}t ||d ƒ}|d kr qt|tƒrDx.|D ]}|  |¡ q0W qt|tjƒr|  |¡ qW d S )N)ÚgetattrÚ
isinstanceÚlistr   ÚastÚAST)r   r   ÚattrsÚattrÚvalÚitemr   r   r   Úvisit_in_order7   s    


zScopeVisitor.visit_in_orderc       	   	   C   s  xò|j D ]è}|j d¡}|js˜| j |d |¡}| jj|d ||d |d }x |dd … D ]6}|d| 7 }| |¡}| 	|¡ | jj|||d q\W q| j |j|¡}x2t
dt|ƒƒD ] }| j d |d |… ¡|¡ q¸W | jj|j||d qW |  |¡ d S )NÚ.r   )r   é   )Únamesr   ÚsplitÚasnamer   Údefine_namer   Úadd_external_referenceÚlookup_nameÚdefineÚrangeÚlenÚjoinÚgeneric_visit)	r   r   ÚaliasÚ
name_partsZcur_nameZpartial_nameÚpartr   Úir   r   r   Úvisit_ImportB   s&    



zScopeVisitor.visit_Importc             C   s¤   |j rJ|j  d¡}x6tdt|ƒd ƒD ] }| j d |d |… ¡|¡ q&W xJ|jD ]@}| j 	|j
pf|j|¡}|j rR| jjd |j |jf¡||d qRW |  |¡ d S )Nr!   r"   )r   )Úmoduler$   r*   r+   r   r'   r,   r#   r   r&   r%   r   r-   )r   r   r/   r1   r.   r   r   r   r   Úvisit_ImportFroma   s     zScopeVisitor.visit_ImportFromc             C   sn   t |jtjtjfƒr&| j |j|¡ n:t |jtjƒr`| j 	|j¡ 
|¡ | j || j 	|j¡¡ |  |¡ d S )N)r   Úctxr   ÚStoreÚParamr   r&   ÚidÚLoadr(   Úadd_referencer   Úset_name_for_noder-   )r   r   r   r   r   Ú
visit_Namen   s    zScopeVisitor.visit_Namec             C   sf   |   |d¡ t| j |¡tjƒr"n| j |j|¡ z"| j 	|¡| _|   |ddd¡ W d | jj
| _X d S )NÚdecorator_listÚargsZreturnsÚbody)r    r   r   Úparentr   ÚClassDefr   r&   r   Úcreate_scopeÚparent_scope)r   r   r   r   r   Úvisit_FunctionDefv   s    zScopeVisitor.visit_FunctionDefc             C   sX   |   |dd¡ tjrFx>dD ]&}t||d ƒ}|d k	r| j ||¡ qW n|   |dd¡ d S )NÚdefaultsr>   )ÚvarargÚkwargrF   rG   )r    ÚsixÚPY2r   r   r&   )r   r   Zarg_attr_nameZarg_namer   r   r   Úvisit_argumentsƒ   s    
zScopeVisitor.visit_argumentsc             C   s   | j  |j|¡ |  |¡ d S )N)r   r&   Úargr-   )r   r   r   r   r   Ú	visit_arg   s    zScopeVisitor.visit_argc             C   sN   |   |dd¡ | j |j|¡ z| j |¡| _|   |d¡ W d | jj| _X d S )Nr=   Úbasesr?   )r    r   r&   r   rB   rC   )r   r   r   r   r   Úvisit_ClassDef”   s    zScopeVisitor.visit_ClassDefc             C   sD   |   |¡ | j |j¡}|r@| |j¡}| j ||¡ | |¡ d S )N)r-   r   Úget_name_for_nodeÚvaluer(   r   r;   r:   )r   r   Znode_value_nameZ	node_namer   r   r   Úvisit_Attribute   s    
zScopeVisitor.visit_Attribute)Ú__name__Ú
__module__Ú__qualname__r   r   r    r2   r4   r<   rD   rJ   rL   rN   rQ   Ú__classcell__r   r   )r   r   r	   %   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S )ÚScopec             C   s   || _ i | _|| _d S )N)rC   r#   r   )r   rC   r   r   r   r   r   ¨   s    zScope.__init__c             C   sD   y| j | }W n& tk
r4   t|ƒ }| j |< Y nX | |¡ |S )N)r#   ÚKeyErrorÚNamer)   )r   r   r   Úname_objr   r   r   r&   ­   s    
zScope.define_namec             C   sL   y
| j | S  tk
r   Y nX | jd kr@t|ƒ }| j |< |S | j |¡S )N)r#   rW   rC   rX   r(   )r   r   rY   r   r   r   r(   µ   s    

zScope.lookup_namec             C   s
   | j  ¡ S )N)rC   Úget_root_scope)r   r   r   r   rZ   ¿   s    zScope.get_root_scopec             C   s   |   ¡  |¡S )N)rZ   Úlookup_scope)r   r   r   r   r   r[   Â   s    zScope.lookup_scopec             C   s   t | |ƒ}|  ¡  ||¡ |S )N)rV   rZ   Ú_set_scope_for_node)r   r   Zsubscoper   r   r   rB   Å   s    
zScope.create_scopeN)	rR   rS   rT   r   r&   r(   rZ   r[   rB   r   r   r   r   rV   ¦   s   
rV   c                   s^   e Zd Z‡ fd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‡  ZS )r   c                s.   t t| ƒ d |¡ i | _i | _i | _i | _d S )N)r
   r   r   Úexternal_referencesÚ_parentsÚ_nodes_to_namesÚ_node_scopes)r   r   )r   r   r   r   Í   s
    zRootScope.__init__Nc             C   s:   t |||d}|| jkr*| j|  |¡ n|g| j|< d S )N)r   r   r   )r   r]   Úappend)r   r   r   r   Úrefr   r   r   r'   Ô   s    
z RootScope.add_external_referencec             C   s   | S )Nr   )r   r   r   r   rZ   Û   s    zRootScope.get_root_scopec             C   s   | j  |d ¡S )N)r^   Úget)r   r   r   r   r   r@   Þ   s    zRootScope.parentc             C   s    || j |< |d kr| | j|< d S )N)r^   r`   )r   r   r@   r   r   r   r   á   s    
zRootScope.set_parentc             C   s   | j  |d ¡S )N)r_   rc   )r   r   r   r   r   rO   æ   s    zRootScope.get_name_for_nodec             C   s   || j |< d S )N)r_   )r   r   r   r   r   r   r;   é   s    zRootScope.set_name_for_nodec             C   s8   x2|r2y
| j | S  tk
r.   |  |¡}Y qX qW d S )N)r`   rW   r@   )r   r   r   r   r   r[   ì   s    
zRootScope.lookup_scopec             C   s   || j |< d S )N)r`   )r   r   Z
node_scoper   r   r   r\   ô   s    zRootScope._set_scope_for_node)N)rR   rS   rT   r   r'   rZ   r@   r   rO   r;   r[   r\   rU   r   r   )r   r   r   Ë   s   
r   c               @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
rX   c             C   s   || _ d | _g | _i | _d S )N)r8   Ú
definitionÚreadsr   )r   r8   r   r   r   r   û   s    zName.__init__c             C   s   | j  |¡ d S )N)re   ra   )r   r   r   r   r   r:     s    zName.add_referencec             C   s   | j r| j |¡ n|| _ d S )N)rd   re   ra   )r   r   r   r   r   r)     s    zName.definec             C   sB   y
| j | S  tk
r<   td | j|f¡ƒ }| j |< |S X d S )Nr!   )r   rW   rX   r,   r8   )r   r   rY   r   r   r   r(   
  s
    
zName.lookup_nameN)rR   rS   rT   r   r:   r)   r(   r   r   r   r   rX   ù   s   rX   c             C   s   t ƒ }| | ¡ |jS )N)r	   r   r   )ÚtreeÚvr   r   r   Úanalyze  s    
rh   )Ú__doc__Ú
__future__r   r   r   r   ÚcollectionsrH   Ú
namedtupler   ÚNodeVisitorr	   ÚobjectrV   r   rX   rh   r   r   r   r   Ú<module>   s   
 %.