³ò
C3IHc           @   sî   d  Z  d d k l Z d d k l Z l Z l Z l Z l Z d d k	 l
 Z
 d d k Z d d k Z d Z d d d „  ƒ  YZ d	 e f d
 „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d d d „  ƒ  YZ d S(   s   Module symbol-table generatoriÿÿÿÿ(   t   ast(   t   SC_LOCALt	   SC_GLOBALt   SC_FREEt   SC_CELLt
   SC_UNKNOWN(   t   mangleNi   t   Scopec           B   s¤   e  Z d d  „ Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d „  Z d	 „  Z d
 „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   c         C   sÁ   | |  _  | |  _ h  |  _ h  |  _ h  |  _ h  |  _ h  |  _ h  |  _ g  |  _ d  |  _
 d  |  _ d  |  _ | d  j	 oD xA t t | ƒ ƒ D]) } | | d j o | | |  _ PqŒ qŒ Wn d  S(   Nt   _(   t   namet   modulet   defst   usest   globalst   paramst   freest   cellst   childrent   Nonet   nestedt	   generatort   klasst   ranget   len(   t   selfR	   R
   R   t   i(    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyt   __init__   s$    												 c         C   s   d |  i  i |  i f S(   Ns   <%s: %s>(   t	   __class__t   __name__R	   (   R   (    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyt   __repr__,   s    c         C   s(   |  i  d  j o | Sn t | |  i  ƒ S(   N(   R   R   R   (   R   R	   (    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyR   /   s    c         C   s   | |  i  |  i | ƒ <d  S(   N(   R   R   (   R   R	   t   node(    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyt   add_def4   s    c         C   s/   |  i  | ƒ } |  i i | | ƒ |  i | <d  S(   N(   R   R   t   get(   R   R	   R   (    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyt   add_use7   s    c         C   sŠ   |  i  | ƒ } |  i i | ƒ p |  i i | ƒ o n |  i i | ƒ o t d | |  i f ‚ n d  |  i | <|  i	 i
 | | ƒ d  S(   Ns    %s in %s is global and parameter(   R   R   t   has_keyR   R   t   SyntaxErrorR	   R   R   R
   R   (   R   R	   R   (    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyt
   add_global;   s    &c         C   s-   |  i  | ƒ } | |  i | <| |  i | <d  S(   N(   R   R   R   (   R   R	   R   (    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyt	   add_paramE   s    c         C   s@   h  } | i  |  i ƒ | i  |  i ƒ | i  |  i ƒ | i ƒ  S(   N(   t   updateR   R   R   t   keys(   R   t   d(    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyt	   get_namesJ   s
    c         C   s   |  i  i | ƒ d  S(   N(   R   t   append(   R   t   child(    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyt	   add_childQ   s    c         C   s   |  i  S(   N(   R   (   R   (    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyt   get_childrenT   s    c         C   s™   t  i |  i I|  i o d p d IJt  i d I|  i IJt  i d I|  i IJt  i d I|  i IJt  i d I|  i IJt  i d I|  i IJd  S(   NR   t    s
   	globals: s   	cells: s   	defs: s   	uses: s   	frees:(	   t   syst   stderrR	   R   R   R   R   R   R   (   R   (    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyt   DEBUGW   s    'c         C   s£   |  i  i | ƒ o t Sn |  i i | ƒ o t Sn |  i i | ƒ o t Sn |  i o. |  i i | ƒ p |  i	 i | ƒ o t
 Sn |  i o t Sn t Sd S(   sb   Return scope of name.

        The scope of a name could be LOCAL, GLOBAL, FREE, or CELL.
        N(   R   R"   R   R   R   R   R   R   R   R   R   R   (   R   R	   (    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyt
   check_name_   s    
c         C   s   |  i  p h  Sn h  } | i |  i ƒ xR |  i i ƒ  D]A } |  i i | ƒ p |  i i | ƒ p |  i | | | <q8 q8 W| S(   N(   R   R&   R   R   R'   R   R"   R   (   R   t   freeR	   (    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyt   get_free_varsr   s    
 c         C   s`   xY |  i  D]N } | i ƒ  } |  i | ƒ } x* | i ƒ  D] \ } } | i | | ƒ q8 Wq
 Wd  S(   N(   R   R4   t	   add_freest   itemst   force_global(   R   R+   R   R   R	   R   (    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyt   handle_children}   s    
  c         C   sp   | |  i  | <|  i i | ƒ o |  i | =n x; |  i D]0 } | i | ƒ t j o | i | | ƒ q8 q8 Wd S(   sÞ  Force name to be global in scope.

        Some child of the current node had a free reference to name.
        When the child was processed, it was labelled a free
        variable.  Now that all its enclosing scope have been
        processed, the name is known to be a global or builtin.  So
        walk back down the child chain and set the name to be global
        rather than free.

        Be careful to stop if a child does not think the name is
        free.
        N(   R   R   R"   R   R2   R   R7   (   R   R	   R   R+   (    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyR7   „   s    
 c         C   s  h  } x| i  ƒ  D]\ } } |  i | ƒ } |  i o£ | t j p | t j p t |  t ƒ o | |  i | <q| t j o | | | <qt |  t	 ƒ o | t
 j o | |  i | <q| t j o | | | <qq | t
 j o | |  i | <q | t j o | | | <q q W| S(   sþ   Process list of free vars from nested scope.

        Returns a list of names that are either 1) declared global in the
        parent or 2) undefined in a top-level parent.  In either case,
        the nested scope should treat them as globals.
        (   R6   R2   R   R   R   t
   isinstancet
   ClassScopeR   R   t   FunctionScopeR   R   R   (   R   t   namest   child_globalsR	   R   t   sc(    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyR5   ˜   s&     
c         C   s   |  i  i ƒ  S(   N(   R   R'   (   R   (    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyt   get_cell_vars³   s    N(   R   t
   __module__R   R   R   R   R   R!   R$   R%   R)   R,   R-   R1   R2   R4   R8   R7   R5   R?   (    (    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyR      s"   					
										t   ModuleScopec           B   s   e  Z e i Z d  „  Z RS(   c         C   s   |  i  d |  ƒ d  S(   Nt   global(   t   _ModuleScope__super_init(   R   (    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyR   ¹   s    (   R   R@   R   R   RC   (    (    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyRA   ¶   s   	R;   c           B   s   e  Z RS(    (   R   R@   (    (    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyR;   ¼   s   t   LambdaScopec           B   s#   e  Z e i Z d  Z d d „ Z RS(   i   c         C   s3   |  i  } |  i  d 7_  |  i d | | | ƒ d  S(   Ni   s	   lambda.%d(   t   _LambdaScope__countert   _LambdaScope__super_init(   R   R
   R   R   (    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyR   Ä   s    	N(   R   R@   R;   R   RF   RE   R   (    (    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyRD   ¿   s   	R:   c           B   s   e  Z e i Z d  „  Z RS(   c         C   s   |  i  | | | ƒ d  S(   N(   t   _ClassScope__super_init(   R   R	   R
   (    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyR   Ì   s    (   R   R@   R   R   RG   (    (    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyR:   É   s   	t   SymbolVisitorc           B   sò   e  Z d  „  Z d „  Z d „  Z e Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d d	 „ Z d
 „  Z d „  Z d „  Z d „  Z d „  Z d d „ Z d d „ Z d d „ Z d d „ Z d „  Z e i e i e i f Z d „  Z d „  Z RS(   c         C   s   h  |  _  d  |  _ d  S(   N(   t   scopesR   R   (   R   (    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyR   Ð   s    	c         G   s   d S(   s   overwritten by compiler.walkN(    (   R   t   unused_nodet   args(    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyt   visitÕ   s    c         C   s2   t  ƒ  } |  _ |  i | <|  i | i | ƒ d  S(   N(   RA   R
   RI   RL   R   (   R   R   t   scope(    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyt   visitModuleÙ   s    c         C   sÃ   | i  | i | ƒ x! | i D] } |  i | | ƒ q Wt | i |  i |  i ƒ } | i p t | t ƒ o d | _ n | |  i	 | <|  i
 | | i | ƒ |  i | i | ƒ |  i | | ƒ d  S(   Ni   (   R   R	   t   defaultsRL   R;   R
   R   R   R9   RI   t   _do_argst   argnamest   codet   handle_free_vars(   R   R   t   parentt   nRM   (    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyt   visitFunctionß   s    
 c         C   sª   x! | i  D] } |  i | | ƒ q
 Wt |  i |  i ƒ } | i p t | t ƒ o d | _ n | |  i | <|  i	 | | i
 | ƒ |  i | i | ƒ |  i | | ƒ d  S(   Ni   (   RO   RL   RD   R
   R   R   R9   R;   RI   RP   RQ   RR   RS   (   R   R   RT   RU   RM   (    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyt   visitLambdaë   s    
 c         C   sR   xK | D]C } t  | ƒ t i j o |  i | | | ƒ q | i | | ƒ q Wd  S(   N(   t   typet   typest	   TupleTypeRP   R%   (   R   RM   RK   R   R	   (    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyRP   ö   s
     c         C   s   | i  | ƒ | i ƒ  d  S(   N(   R,   R8   (   R   RM   RT   (    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyRS   ý   s    c         C   sÅ   | i  | i | ƒ x! | i D] } |  i | | ƒ q Wt | i |  i ƒ } | i p t | t ƒ o d | _ n | |  i	 | <|  i
 } | i |  _
 |  i | i | ƒ | |  _
 |  i | | ƒ d  S(   Ni   (   R   R	   t   basesRL   R:   R
   R   R9   R;   RI   R   RR   RS   (   R   R   RT   RU   RM   t   prev(    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyt
   visitClass  s    
 		i    c         C   s5   | o | i  | i | ƒ n | i | i | ƒ d  S(   N(   R   R	   R!   (   R   R   RM   t   assign(    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyt	   visitName  s    c         C   sa   |  i  | i | d ƒ |  i  | i | ƒ |  i  | i | ƒ | i o |  i  | i | ƒ n d  S(   Ni   (   RL   R^   t   listt   bodyt   else_(   R   R   RM   (    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyt   visitFor  s
    
c         C   sI   xB | i  D]7 \ } } | d j o q
 n | i | p | | ƒ q
 Wd  S(   Nt   *(   R<   R   (   R   R   RM   R	   t   asname(    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyt	   visitFrom$  s
    
 c         C   s_   xX | i  D]M \ } } | i d ƒ } | d j o | |  } n | i | p | | ƒ q
 Wd  S(   Nt   .iÿÿÿÿ(   R<   t   findR   (   R   R   RM   R	   Re   R   (    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyt   visitImport*  s    
 c         C   s(   x! | i  D] } | i | | ƒ q
 Wd  S(   N(   R<   R$   (   R   R   RM   R	   (    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyt   visitGlobal1  s    
 c         C   s>   x$ | i  D] } |  i | | d ƒ q
 W|  i | i | ƒ d S(   s.  Propagate assignment flag down to child nodes.

        The Assign node doesn't itself contains the variables being
        assigned to.  Instead, the children in node.nodes are visited
        with the assign flag set to true.  When the names occur in
        those nodes, they are marked as defs.

        Some names that occur in an assignment target are not bound by
        the assignment, e.g. a name occurring inside a slice.  The
        visitor handles these nodes specially; they do not propagate
        the assign flag to their children.
        i   N(   t   nodesRL   t   expr(   R   R   RM   RU   (    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyt   visitAssign5  s    
 i   c         C   s   | i  | i | ƒ d  S(   N(   R   R	   (   R   R   RM   t   unused_assign(    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyt   visitAssNameF  s    c         C   s   |  i  | i | d ƒ d  S(   Ni    (   RL   Rl   (   R   R   RM   Rn   (    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyt   visitAssAttrI  s    c         C   sA   |  i  | i | d ƒ x$ | i D] } |  i  | | d ƒ q  Wd  S(   Ni    (   RL   Rl   t   subs(   R   R   RM   Rn   RU   (    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyt   visitSubscriptL  s    
 c         C   sb   |  i  | i | d ƒ | i o |  i  | i | d ƒ n | i o |  i  | i | d ƒ n d  S(   Ni    (   RL   Rl   t   lowert   upper(   R   R   RM   Rn   (    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyt
   visitSliceQ  s
    

c         C   sZ   |  i  | i | ƒ t | i t i ƒ o |  i  | i | d ƒ n |  i  | i | ƒ d  S(   Ni   (   RL   R   R9   R    t   NameRl   (   R   R   RM   (    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyt   visitAugAssignX  s    c         C   s¤   x| | i  D]q \ } } t | t i ƒ o2 t | i ƒ |  i j o | i p q
 qW q[ n |  i | | ƒ |  i | | ƒ q
 W| i o |  i | i | ƒ n d  S(   N(	   t   testsR9   R    t   ConstRX   t   valuet   _const_typesRL   Rb   (   R   R   RM   t   testRa   (    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyt   visitIfd  s    
 

c         C   s    d | _  |  i | i | ƒ d  S(   Ni   (   R   RL   Rz   (   R   R   RM   (    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyt
   visitYieldq  s    	(   R   R@   R   RL   RN   t   visitExpressionRV   RW   RP   RS   R]   R_   Rc   Rf   Ri   Rj   Rm   Ro   Rp   Rr   Ru   Rw   RY   t
   StringTypet   IntTypet	   FloatTypeR{   R}   R~   (    (    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pyRH   Ï   s.   														
	(    (    (   t   __doc__t   compilerR    t   compiler.constsR   R   R   R   R   t   compiler.miscR   RY   R/   t
   MANGLE_LENR   RA   R;   RD   R:   RH   (    (    (    s(   C:\py\_spe\plugins\pychecker2\symbols.pys   <module>
   s   (¡
