
Á«‘_û#  ã               @   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