U
    f!                     @   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__ 7/tmp/pip-target-lpfmz8o1/lib/python/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 r   )r   r   
set_parentr   r   r
   visit)r   r   tmpr   r   r   r   ,   s    zScopeVisitor.visitc                 G   sZ   |D ]P}t ||d }|d krqt|tr>|D ]}| | q,qt|tjr| | qd S r   )getattr
isinstancelistr   astAST)r   r   attrsattrvalitemr   r   r   visit_in_order7   s    
zScopeVisitor.visit_in_orderc           	   	   C   s   |j D ]}|jd}|js| j|d |}| jj|d ||d |d }|dd  D ]6}|d| 7 }||}|	| | jj|||d qXq| j|j|}t
dt|D ] }| jd|d | | q| jj|j||d q| | 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 rF|j d}tdt|d D ] }| jd|d | | q$|jD ]@}| j	|j
p`|j|}|j rL| jjd|j |jf||d qL| | d S )Nr%   r'   r&   )moduler)   r/   r0   r   r,   r1   r(   r   r+   r*   r   r2   )r   r   r4   r6   r3   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 r   )r   ctxr   StoreParamr   r+   idLoadr-   add_referencer   set_name_for_noder2   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 5 | jj	| _X d S )Ndecorator_listargsZreturnsbody)r$   r   r   parentr   ClassDefr   r+   r   parent_scopecreate_scoperA   r   r   r   visit_FunctionDefv   s    zScopeVisitor.visit_FunctionDefc                 C   sT   |  |dd tjrBdD ]&}t||d }|d k	r| j|| qn|  |dd d S )NdefaultsrD   )varargkwargrL   rM   )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 r   )r   r+   argr2   rA   r   r   r   	visit_arg   s    zScopeVisitor.visit_argc                 C   sN   |  |dd | j|j| z| j|| _|  |d W 5 | jj| _X d S )NrC   basesrE   )r$   r   r+   r   rH   rI   rA   r   r   r   visit_ClassDef   s    zScopeVisitor.visit_ClassDefc                 C   sD   |  | | j|j}|r@||j}| j|| || d S r   )r2   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$   r7   r9   rB   rJ   rP   rR   rT   rW   __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 r   )rH   r(   r   )r   rH   r   r   r   r   r      s    zScope.__init__c                 C   sD   z| j | }W n& tk
r4   t| }| j |< Y nX || |S r   )r(   KeyErrorNamer.   )r   r   r   name_objr   r   r   r+      s    
zScope.define_namec                 C   sN   z| j | W S  tk
r    Y nX | jd krBt| }| j |< |S | j|S r   )r(   r]   rH   r^   r-   r   r   r_   r   r   r   r-      s    
zScope.lookup_namec                 C   s
   | j  S r   )rH   get_root_scoper   r   r   r   ra      s    zScope.get_root_scopec                 C   s   |   |S r   )ra   lookup_scoperA   r   r   r   rb      s    zScope.lookup_scopec                 C   s   t | |}|  || |S r   )r\   ra   _set_scope_for_node)r   r   Zsubscoper   r   r   rI      s    
zScope.create_scopeN)	rX   rY   rZ   r   r+   r-   ra   rb   rI   r   r   r   r   r\      s   
r\   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 r   )r   r   r   external_references_parents_nodes_to_names_node_scopesrA   r   r   r   r      s
    zRootScope.__init__Nc                 C   s:   t |||d}|| jkr*| j| | n|g| j|< d S )Nr   )r   rd   append)r   r   r   r	   refr   r   r   r,      s    
z RootScope.add_external_referencec                 C   s   | S r   r   r   r   r   r   ra      s    zRootScope.get_root_scopec                 C   s   | j |d S r   )re   getrA   r   r   r   rF      s    zRootScope.parentc                 C   s    || j |< |d kr| | j|< d S r   )re   rg   )r   r   rF   r   r   r   r      s    
zRootScope.set_parentc                 C   s   | j |d S r   )rf   rj   rA   r   r   r   rU      s    zRootScope.get_name_for_nodec                 C   s   || j |< d S r   )rf   )r   r   r   r   r   r   r@      s    zRootScope.set_name_for_nodec                 C   s6   |r2z| j | W S  tk
r.   | |}Y q X q d S r   )rg   r]   rF   rA   r   r   r   rb      s    zRootScope.lookup_scopec                 C   s   || j |< d S r   )rg   )r   r   Z
node_scoper   r   r   rc      s    zRootScope._set_scope_for_node)N)rX   rY   rZ   r   r,   ra   rF   r   rU   r@   rb   rc   r[   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 )
r^   c                 C   s   || _ d | _g | _i | _d S r   )r=   
definitionreadsr    )r   r=   r   r   r   r      s    zName.__init__c                 C   s   | j | d S r   )rl   rh   rA   r   r   r   r?     s    zName.add_referencec                 C   s   | j r| j| n|| _ d S r   )rk   rl   rh   rA   r   r   r   r.     s    zName.definec                 C   sH   z| j | W S  tk
rB   td| j|f }| j |< | Y S X d S )Nr%   )r    r]   r^   r1   r=   r`   r   r   r   r-   
  s
    zName.lookup_nameN)rX   rY   rZ   r   r?   r.   r-   r   r   r   r   r^      s   r^   c                 C   s   t  }||  |jS r   )r
   r   r   )treevr   r   r   analyze  s    
ro   )__doc__
__future__r   r   r   r   collectionsrN   
namedtupler   NodeVisitorr
   objectr\   r   r^   ro   r   r   r   r   <module>   s   
 %.