
    1Vh!                         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j                  dd      Z	 G d d	ej                        Z G d
 de      Z G d de      Z G d de      Zd Zy)z/Perform static analysis on python syntax trees.    )absolute_import)division)print_functionNExternalReferencenamenodename_refc                   ^     e Zd Z fdZ fdZd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Z xZS )ScopeVisitorc                 f    t         t        |           d | _        t	        d       x| _        | _        y N)superr   __init___parent	RootScope
root_scopescope)self	__class__s    @/home/dcms/DCMS/lib/python3.12/site-packages/pasta/base/scope.pyr   zScopeVisitor.__init__'   s)    	,&(DL#,T?2DOdj    c                     |y | j                   j                  || j                   _        | j                   j                  || j                         | j                  }|| _        t        t
        |   |       || _        y r   )r   r	   
set_parentr   r   r   visit)r   r	   tmpr   s      r   r   zScopeVisitor.visit,   se    |#!dooOOtT\\2
,,CDL	,#D)DLr   c                     |D ]g  }t        ||d       }|t        |t              r|D ]  }| j                  |        <t        |t        j
                        sW| j                  |       i y r   )getattr
isinstancelistr   astAST)r   r	   attrsattrvalitems         r   visit_in_orderzScopeVisitor.visit_in_order7   se     D$%c		C	 	D
**T
	c377#

3r   c           	         |j                   D ]X  }|j                  j                  d      }|j                  s| j                  j                  |d   |      }| j                  j                  |d   ||       |d   }|dd  D ]J  }|d|z   z  }|j                  |      }|j                  |       | j                  j                  |||       L | j                  j                  |j                  |      }t        dt        |            D ]0  }| j                  j                  dj                  |d |       |       2 | j                  j                  |j                  ||       [ | j                  |       y )N.r   r
      )namesr   splitasnamer   define_namer   add_external_referencelookup_namedefinerangelenjoingeneric_visit)	r   r	   alias
name_partscur_namepartial_namepartr   is	            r   visit_ImportzScopeVisitor.visit_ImportB   sg    Q::##C(j\\::))*Q-?..z!}e8@ 	/ 	B "!}qrN 	DD
#*
$,))$/(
//%
 
//
0
0u:B 1 D		D zz%%ellE: q#j/* 	8A
//
0
0*Ra.1I168	8 	..uzz54.P5Q8 	tr   c                 4   |j                   rf|j                   j                  d      }t        dt        |      dz         D ]0  }| j                  j                  dj                  |d |       |       2 |j                  D ]  }| j                  j                  |j                  xs |j                  |      }|j                   sD| j                  j                  dj                  |j                   |j                  f      ||        | j                  |       y )Nr)   r+   r*   )moduler-   r3   r4   r   r0   r5   r,   r   r/   r.   r   r6   )r   r	   r8   r<   r7   r   s         r   visit_ImportFromzScopeVisitor.visit_ImportFroma   s    {{;;$$S)jQJ!+, O!..sxx
2A/GNO GZZ##ELL$>EJJFd	..HHdkk5::./ 	/ 	GG 	tr   c                 
   t        |j                  t        j                  t        j                  f      r'| j
                  j                  |j                  |       nt        |j                  t        j                        rs| j
                  j                  |j                        j                  |       | j                  j                  || j
                  j                  |j                               | j                  |       y r   )r   ctxr!   StoreParamr   r/   idLoadr1   add_referencer   set_name_for_noder6   r   r	   s     r   
visit_NamezScopeVisitor.visit_Namen   s    $((SYY		23
jjTWWd+	DHHchh	'
jjTWW%33D9
oo''djj.D.DTWW.MNtr   c                    | j                  |d       t        | j                  j                  |      t        j
                        rn&| j                  j                  |j                  |       	 | j                  j                  |      | _        | j                  |ddd       | j                  j                  | _        y # | j                  j                  | _        w xY w)Ndecorator_listargsreturnsbody)r'   r   r   parentr!   ClassDefr   r/   r   create_scopeparent_scoperI   s     r   visit_FunctionDefzScopeVisitor.visit_FunctionDefv   s    ./$//((.=

jjTYY-+::**40dj
$	6:::**dj4::**djs   .4B> >Cc                     | j                  |dd       t        j                  r4dD ].  }t        ||d       }|| j                  j                  ||       0 y | j                  |dd       y )NdefaultsrM   )varargkwargrW   rX   )r'   sixPY2r   r   r/   )r   r	   arg_attr_namearg_names       r   visit_argumentszScopeVisitor.visit_arguments   sh    j&1
ww / 1-45
**
 
 4
01 $'2r   c                 r    | j                   j                  |j                  |       | j                  |       y r   )r   r/   argr6   rI   s     r   	visit_argzScopeVisitor.visit_arg   s(    JJ488T*tr   c                 R   | j                  |dd       | j                  j                  |j                  |       	 | j                  j	                  |      | _        | j                  |d       | j                  j
                  | _        y # | j                  j
                  | _        w xY w)NrL   basesrO   )r'   r   r/   r   rR   rS   rI   s     r   visit_ClassDefzScopeVisitor.visit_ClassDef   s{    .8JJ499d++::**40dj
$'::**dj4::**djs   2B	 	B&c                    | j                  |       | j                  j                  |j                        }|rI|j	                  |j
                        }| j                  j                  ||       |j                  |       y y r   )r6   r   get_name_for_nodevaluer1   r$   rH   rG   )r   r	   node_value_name	node_names       r   visit_AttributezScopeVisitor.visit_Attribute   sf    too77

CO!--dii8i
oo''i8d# r   )__name__
__module____qualname__r   r   r'   r=   r@   rJ   rT   r]   r`   rc   ri   __classcell__r   s   @r   r   r   %   s:    3
		>+3+$r   r   c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)Scopec                 .    || _         i | _        || _        y r   )rS   r,   r	   )r   rS   r	   s      r   r   zScope.__init__   s    $DDJDIr   c                     	 | j                   |   }|j                  |       |S # t        $ r t        |      x}| j                   |<   Y 8w xY wr   )r,   KeyErrorNamer2   )r   r   r	   name_objs       r   r/   zScope.define_name   sP    /D!h OODO  /$(J.hD!/s   $ #A
	A
c                     	 | j                   |   S # t        $ r Y nw xY w| j                  t        |      x}| j                   |<   |S | j                  j	                  |      S r   )r,   rs   rS   rt   r1   r   r   ru   s      r   r1   zScope.lookup_name   sg    ZZ 
 $(J.hD!o((..s    	c                 6    | j                   j                         S r   )rS   get_root_scoper   s    r   ry   zScope.get_root_scope   s    ++--r   c                 @    | j                         j                  |      S r   )ry   lookup_scoperI   s     r   r|   zScope.lookup_scope   s     --d33r   c                 ^    t        | |      }| j                         j                  ||       |S r   )rp   ry   _set_scope_for_node)r   r	   subscopes      r   rR   zScope.create_scope   s,    T4 H--dH=Or   N)	rj   rk   rl   r   r/   r1   ry   r|   rR    r   r   rp   rp      s     
/.4r   rp   c                   P     e Zd Z fdZd
dZd Zd Zd Zd Zd Z	d Z
d	 Z xZS )r   c                 f    t         t        |   d |       i | _        i | _        i | _        i | _        y r   )r   r   r   external_references_parents_nodes_to_names_node_scopes)r   r	   r   s     r   r   zRootScope.__init__   s3    	)T#D$/!DDMDDr   c                     t        |||      }|| j                  v r| j                  |   j                  |       y |g| j                  |<   y )Nr   )r   r   append)r   r   r	   r
   refs        r   r0   z RootScope.add_external_reference   sI    
D8
DCt'''
t$++C0(+udt$r   c                     | S r   r   rz   s    r   ry   zRootScope.get_root_scope   s    Kr   c                 :    | j                   j                  |d       S r   )r   getrI   s     r   rP   zRootScope.parent   s    ==T4((r   c                 F    || j                   |<   || | j                  |<   y y r   )r   r   )r   r	   rP   s      r   r   zRootScope.set_parent   s*     DMM$~ $d r   c                 :    | j                   j                  |d       S r   )r   r   rI   s     r   re   zRootScope.get_name_for_node   s    ##D$//r   c                 "    || j                   |<   y r   )r   )r   r	   r   s      r   rH   zRootScope.set_name_for_node   s    !%Dr   c                 p    |r	 | j                   |   S y # t        $ r | j                  |      }Y nw xY w|r4%r   )r   rs   rP   rI   s     r   r|   zRootScope.lookup_scope   sE    
!  &&   !{{4 ! s    11c                 "    || j                   |<   y r   )r   )r   r	   
node_scopes      r   r~   zRootScope._set_scope_for_node   s    (Ddr   r   )rj   rk   rl   r   r0   ry   rP   r   re   rH   r|   r~   rm   rn   s   @r   r   r      s0    -)%
0&)r   r   c                   $    e Zd Zd Zd Zd Zd Zy)rt   c                 <    || _         d | _        g | _        i | _        y r   )rE   
definitionreadsr#   )r   rE   s     r   r   zName.__init__   s    DGDODJDJr   c                 :    | j                   j                  |       y r   )r   r   rI   s     r   rG   zName.add_reference  s    JJdr   c                 b    | j                   r| j                  j                  |       y || _         y r   )r   r   r   rI   s     r   r2   zName.define  s"    
jjdor   c                     	 | j                   |   S # t        $ r: t        dj                  | j                  |f            x}| j                   |<   |cY S w xY w)Nr)   )r#   rs   rt   r5   rE   rw   s      r   r1   zName.lookup_name
  sS    ZZ $(477D/)B$CChD!os    A AAN)rj   rk   rl   r   rG   r2   r1   r   r   r   rt   rt      s    r   rt   c                 P    t               }|j                  |        |j                  S r   )r   r   r   )treevs     r   analyzer     s    n!''$-	
.r   )__doc__
__future__r   r   r   r!   collectionsrY   
namedtupler   NodeVisitorr   objectrp   r   rt   r   r   r   r   <module>r      sv    5 '  % 
  
 +K**+>+GI ~$3?? ~$B"F "J*) *)\6 2r   