
_#                 @   s   d  d l  m Z d  d l m Z d Z d Z d Z d Z d d d	  Z d d
 d  Z	 Gd d   d e
  Z Gd d   d e  Z Gd d   d e  Z d S)   )	iteritems)NodeVisitorparamresolvealiasZ	undefinedNc             C   s=   t  d |  } t |  } x |  D] } | j |  q" W| S)Nparent)SymbolsFrameSymbolVisitorvisit)nodesparent_symbolssymvisitornode r   3/tmp/pip-build-5gj8f0j9/Jinja2/jinja2/idtracking.pyfind_symbols
   s
    r   c             C   s    t  d |  } | j |   | S)Nr   )r   analyze_node)r   r   r   r   r   r   symbols_for_node   s    r   c               @   s   e  Z d  Z d d d d  Z 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 d d   Z d d   Z d d   Z d S)r   Nc             C   sb   | d  k r. | d  k r! d } n | j  d } | |  _  | |  _ i  |  _ i  |  _ t   |  _ d  S)N    r   )levelr   refsloadssetstores)selfr   r   r   r   r   __init__   s    					zSymbols.__init__c             K   s    t  |   } | j | |  d  S)N)RootVisitorr
   )r   r   kwargsr   r   r   r   r   %   s    zSymbols.analyze_nodec             C   s=   d |  j  | f } | |  j | <| d  k	 r9 | |  j | <| S)Nzl_%d_%s)r   r   r   )r   nameloadidentr   r   r   _define_ref)   s
    zSymbols._define_refc             C   s=   | |  j  k r |  j  | S|  j d  k	 r9 |  j j |  Sd  S)N)r   r   	find_load)r   targetr   r   r   r#   0   s    zSymbols.find_loadc             C   s=   | |  j  k r |  j  | S|  j d  k	 r9 |  j j |  Sd  S)N)r   r   find_ref)r   r   r   r   r   r%   6   s    zSymbols.find_refc             C   s/   |  j  |  } | d  k r+ t d |   | S)NzITried to resolve a name to a reference that was unknown to the frame (%r))r%   AssertionError)r   r   rvr   r   r   ref<   s    
zSymbols.refc             C   s_   t  j |  j  } | j j |  j  |  j j   | _ |  j j   | _ |  j j   | _ | S)N)	object__new__	__class____dict__updater   copyr   r   )r   r'   r   r   r   r.   E   s    zSymbols.copyc             C   s   |  j  j |  | |  j k r |  j d  k	 ri |  j j |  } | d  k	 ri |  j | d t | f d  S|  j | d t d  f d  S)Nr    )r   addr   r   r%   r"   VAR_LOAD_ALIASVAR_LOAD_UNDEFINED)r   r   Z	outer_refr   r   r   storeM   s    zSymbols.storec             C   s)   |  j  j |  |  j | d t d  f S)Nr    )r   r/   r"   VAR_LOAD_PARAMETER)r   r   r   r   r   declare_parameter_   s    zSymbols.declare_parameterc             C   s8   |  j  |  } | d  k r4 |  j | d t | f d  S)Nr    )r%   r"   VAR_LOAD_RESOLVE)r   r   r$   r   r   r   r    c   s    zSymbols.loadc       	      C   sT  i  } xN | D]F } x= | j  D]2 } | |  j  k r5 q | j | d  d | | <q Wq WxG | D]? } |  j j | j  |  j j | j  |  j  j | j   q^ Wx t |  D] \ } } | t |  k r q |  j |  } | d  k	 s t d   |  j	 d  k	 r9|  j	 j |  } | d  k	 r9t
 | f |  j | <q t | f |  j | <q Wd  S)Nr   r   zshould not happen)r   getr   r-   r   r   lenr%   r&   r   r0   r5   )	r   Zbranch_symbolsr   branchr$   r   r   Zbranch_countZouter_targetr   r   r   branch_updateh   s*    "zSymbols.branch_updatec             C   s_   i  } |  } xL | d  k	 rZ x0 | j  D]% } | | k r% |  j |  | | <q% W| j } q W| S)N)r   r%   r   )r   r'   r   r   r   r   r   dump_stores   s    zSymbols.dump_storesc             C   sn   t    } |  } xX | d  k	 ri x< t |  j  D]+ \ } \ } } | t k r. | j |  q. W| j } q W| S)N)r   r   r   r3   r/   r   )r   r'   r   r$   Zinstr_r   r   r   dump_param_targets   s    	"zSymbols.dump_param_targets)__name__
__module____qualname__r   r   r"   r#   r%   r(   r.   r2   r4   r    r9   r:   r<   r   r   r   r   r      s   	
r   c               @   s   e  Z d  Z d d   Z d d   Z e Z Z Z Z Z	 Z
 Z d d   Z d d   Z d	 d
   Z d d d  Z d d   Z d d   Z d S)r   c             C   s   t  |  |  _ d  S)N)r	   sym_visitor)r   symbolsr   r   r   r      s    zRootVisitor.__init__c             K   s+   x$ | j    D] } |  j j |  q Wd  S)N)iter_child_nodesr@   r
   )r   r   r   childr   r   r   _simple_visit   s    zRootVisitor._simple_visitc             K   s(   x! | j  D] } |  j j |  q
 Wd  S)N)bodyr@   r
   )r   r   r   rC   r   r   r   visit_AssignBlock   s    zRootVisitor.visit_AssignBlockc             K   s1   x* | j  d d  D] } |  j j |  q Wd  S)Nexcludecall)rH   )rB   r@   r
   )r   r   r   rC   r   r   r   visit_CallBlock   s    zRootVisitor.visit_CallBlockc             K   s(   x! | j  D] } |  j j |  q
 Wd  S)N)rE   r@   r
   )r   r   r   rC   r   r   r   visit_OverlayScope   s    zRootVisitor.visit_OverlayScoperE   c             K   s   | d k r1 |  j  j | j d d | j } no | d k rI | j } nW | d k r |  j  j | j d d | j d  k	 r |  j  j | j  d  St d   x$ | p f  D] } |  j  j |  q Wd  S)NrE   store_as_paramTelsetestzUnknown for branch)r@   r
   r$   rE   else_rM   RuntimeError)r   r   Z
for_branchr   r8   itemr   r   r   	visit_For   s    zRootVisitor.visit_Forc             K   sL   x! | j  D] } |  j j |  q
 Wx! | j D] } |  j j |  q. Wd  S)N)targetsr@   r
   rE   )r   r   r   r$   rC   r   r   r   
visit_With   s    zRootVisitor.visit_Withc             O   s   t  d | j j   d  S)NzCannot find symbols for %r)NotImplementedErrorr+   r=   )r   r   argsr   r   r   r   generic_visit   s    zRootVisitor.generic_visitN)r=   r>   r?   r   rD   Zvisit_Templatevisit_Blockvisit_Macrovisit_FilterBlockvisit_Scopevisit_IfZvisit_ScopedEvalContextModifierrF   rI   rJ   rQ   rS   rV   r   r   r   r   r      s   
r   c               @   s   e  Z d  Z d Z 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 d d   Z d d   Z d d   Z d d   Z d d   Z d d    Z d! d"   Z d# S)$r	   zA visitor for `Frame.inspect`.c             C   s   | |  _  d  S)N)rA   )r   rA   r   r   r   r      s    zFrameSymbolVisitor.__init__Fc             K   sv   | s | j  d k r+ |  j j | j  nG | j  d k rP |  j j | j  n" | j  d k rr |  j j | j  d S)z2All assignments to names go through this function.r   r2   r    N)ctxrA   r4   r   r2   r    )r   r   rK   r   r   r   r   
visit_Name   s    zFrameSymbolVisitor.visit_Namec             K   s   |  j  j | j  d  S)N)rA   r    r   )r   r   r   r   r   r   visit_NSRef   s    zFrameSymbolVisitor.visit_NSRefc                s    j  | j     j      f d d   } | | j  } | | j  } | | j pa f   }  j j | | | g  d  S)Nc                sA    j     _ } x |  D] }  j |    q W  _ | S)N)r.   rA   r
   )r   r'   Zsubnode)r   original_symbolsr   r   r   inner_visit   s
    	z0FrameSymbolVisitor.visit_If.<locals>.inner_visit)r
   rM   rA   rE   Zelif_rN   r9   )r   r   r   r`   Zbody_symbolsZelif_symbolsZelse_symbolsr   )r   r_   r   r   r[      s    	zFrameSymbolVisitor.visit_Ifc             K   s   |  j  j | j  d  S)N)rA   r2   r   )r   r   r   r   r   r   rX      s    zFrameSymbolVisitor.visit_Macroc             K   s'   |  j  | |  |  j j | j  d  S)N)rV   rA   r2   r$   )r   r   r   r   r   r   visit_Import   s    zFrameSymbolVisitor.visit_Importc             K   s^   |  j  | |  xG | j D]< } t | t  rF |  j j | d  q |  j j |  q Wd  S)Nr   )rV   names
isinstancetuplerA   r2   )r   r   r   r   r   r   r   visit_FromImport   s
    z#FrameSymbolVisitor.visit_FromImportc             K   s*   |  j  | j |  |  j  | j |  d S)z'Visit assignments in the correct order.N)r
   r   r$   )r   r   r   r   r   r   visit_Assign  s    zFrameSymbolVisitor.visit_Assignc             K   s   |  j  | j |  d S)zqVisiting stops at for blocks.  However the block sequence
        is visited as part of the outer scope.
        N)r
   iter)r   r   r   r   r   r   rQ     s    zFrameSymbolVisitor.visit_Forc             K   s   |  j  | j |  d  S)N)r
   rH   )r   r   r   r   r   r   rI     s    z"FrameSymbolVisitor.visit_CallBlockc             K   s   |  j  | j |  d  S)N)r
   filter)r   r   r   r   r   r   rY     s    z$FrameSymbolVisitor.visit_FilterBlockc             K   s%   x | j  D] } |  j |  q
 Wd  S)N)valuesr
   )r   r   r   r$   r   r   r   rS     s    zFrameSymbolVisitor.visit_Withc             K   s   |  j  | j |  d S)zStop visiting at block assigns.N)r
   r$   )r   r   r   r   r   r   rF     s    z$FrameSymbolVisitor.visit_AssignBlockc             K   s   d S)zStop visiting at scopes.Nr   )r   r   r   r   r   r   rZ     s    zFrameSymbolVisitor.visit_Scopec             K   s   d S)zStop visiting at blocks.Nr   )r   r   r   r   r   r   rW     s    zFrameSymbolVisitor.visit_Blockc             K   s   d S)z!Do not visit into overlay scopes.Nr   )r   r   r   r   r   r   rJ   !  s    z%FrameSymbolVisitor.visit_OverlayScopeN)r=   r>   r?   __doc__r   r]   r^   r[   rX   ra   re   rf   rQ   rI   rY   rS   rF   rZ   rW   rJ   r   r   r   r   r	      s"   	r	   )_compatr   r   r   r3   r5   r0   r1   r   r   r)   r   r   r	   r   r   r   r   <module>   s   8