a
    ,=ic!                     @   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__ a/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/pasta/base/scope.pyr   '   s    zScopeVisitor.__init__c                    sV   |d u rd S | j jd u 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 u 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   sp   |  |d t| j|tjr"n| j|j| z,| j	|| _|  |ddd W | jj
| _n| jj
| _0 d S )Ndecorator_listargsreturnsbody)r$   r   r   parentr   ClassDefr   r+   r   create_scopeparent_scoperA   r   r   r   visit_FunctionDefv   s    zScopeVisitor.visit_FunctionDefc                 C   sT   |  |dd tjrBdD ]&}t||d }|d ur| j|| qn|  |dd d S )NdefaultsrD   )varargkwargrM   rN   )r$   sixPY2r   r   r+   )r   r   Zarg_attr_name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   sX   |  |dd | j|j| z(| j|| _|  |d W | jj| _n| jj| _0 d S )NrC   basesrF   )r$   r   r+   r   rI   rJ   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   rK   rR   rT   rV   rY   __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   )rJ   r(   r   )r   rJ   r   r   r   r   r      s    zScope.__init__c                 C   sB   z| j | }W n$ ty2   t| }| j |< Y n0 || |S r   )r(   KeyErrorNamer.   )r   r   r   name_objr   r   r   r+      s    
zScope.define_namec                 C   sL   z| j | W S  ty   Y n0 | jd u r@t| }| j |< |S | j|S r   )r(   r_   rJ   r`   r-   r   r   ra   r   r   r   r-      s    
zScope.lookup_namec                 C   s
   | j  S r   )rJ   get_root_scoper   r   r   r   rc      s    zScope.get_root_scopec                 C   s   |   |S r   )rc   lookup_scoperA   r   r   r   rd      s    zScope.lookup_scopec                 C   s   t | |}|  || |S r   )r^   rc   _set_scope_for_node)r   r   Zsubscoper   r   r   rI      s    
zScope.create_scopeN)	rZ   r[   r\   r   r+   r-   rc   rd   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v r*| j| | n|g| j|< d S )Nr   )r   rf   append)r   r   r   r	   refr   r   r   r,      s    
z RootScope.add_external_referencec                 C   s   | S r   r   r   r   r   r   rc      s    zRootScope.get_root_scopec                 C   s   | j |d S r   )rg   getrA   r   r   r   rG      s    zRootScope.parentc                 C   s    || j |< |d u r| | j|< d S r   )rg   ri   )r   r   rG   r   r   r   r      s    
zRootScope.set_parentc                 C   s   | j |d S r   )rh   rl   rA   r   r   r   rW      s    zRootScope.get_name_for_nodec                 C   s   || j |< d S r   )rh   )r   r   r   r   r   r   r@      s    zRootScope.set_name_for_nodec                 C   s4   |r0z| j | W S  ty,   | |}Y q 0 q d S r   )ri   r_   rG   rA   r   r   r   rd      s    zRootScope.lookup_scopec                 C   s   || j |< d S r   )ri   )r   r   Z
node_scoper   r   r   re      s    zRootScope._set_scope_for_node)N)rZ   r[   r\   r   r,   rc   rG   r   rW   r@   rd   re   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   )rn   rj   rA   r   r   r   r?     s    zName.add_referencec                 C   s   | j r| j| n|| _ d S r   )rm   rn   rj   rA   r   r   r   r.     s    zName.definec                 C   sF   z| j | W S  ty@   td| j|f }| j |< | Y S 0 d S )Nr%   )r    r_   r`   r1   r=   rb   r   r   r   r-   
  s
    zName.lookup_nameN)rZ   r[   r\   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    
rq   )__doc__
__future__r   r   r   r   collectionsrO   
namedtupler   NodeVisitorr
   objectr^   r   r`   rq   r   r   r   r   <module>   s   
 %.