3
e)                 @   s   d dl ZddlmZ ddlmZ dZdZdZdZ	dej
ej ejd	 d	d
ddZdejejd	 d	dddZG dd	 d	ZG dd deZG dd deZdS )    N   )nodes)NodeVisitorparamresolvealiasZ	undefinedSymbols)r   parent_symbolsreturnc             C   s.   t |d}t|}x| D ]}|j| qW |S )N)parent)r   FrameSymbolVisitorvisit)r   r	   symvisitornode r   3/tmp/pip-build-3irwxpxt/Jinja2/jinja2/idtracking.pyfind_symbols   s
    

r   )r   r	   r
   c             C   s   t |d}|j|  |S )N)r   )r   analyze_node)r   r	   r   r   r   r   symbols_for_node   s    

r   c               @   s*  e Zd Zd#ejd  eje ddddZejej	ddddZ
d$eejejeeje f  edd	d
Zeejej	 dddZeeje dddZeedddZd dddZeddddZeedddZeddddZejd  ddddZejeef ddd Zeje dd!d"ZdS )%r   N)r   levelr
   c             C   sD   |d kr |d krd}n
|j d }|| _ || _i | _i | _t | _d S )Nr   r   )r   r   refsloadssetstores)selfr   r   r   r   r   __init__   s    
zSymbols.__init__)r   kwargsr
   c             K   s   t | }|j|f| d S )N)RootVisitorr   )r   r   r   r   r   r   r   r   .   s    zSymbols.analyze_node)nameloadr
   c             C   s2   d| j  d| }|| j|< |d k	r.|| j|< |S )NZl__)r   r   r   )r   r   r    identr   r   r   _define_ref2   s
    

zSymbols._define_ref)targetr
   c             C   s.   || j kr| j | S | jd k	r*| jj|S d S )N)r   r   	find_load)r   r$   r   r   r   r%   ;   s
    


zSymbols.find_load)r   r
   c             C   s.   || j kr| j | S | jd k	r*| jj|S d S )N)r   r   find_ref)r   r   r   r   r   r&   D   s
    


zSymbols.find_refc             C   s&   | j |}|d kr"td|d|S )NzFTried to resolve a name to a reference that was unknown to the frame ())r&   AssertionError)r   r   rvr   r   r   refM   s
    
zSymbols.ref)r
   c             C   sJ   t jttj| j}|jj| j | jj	 |_| j
j	 |_
| jj	 |_|S )N)tcastr   object__new__	__class____dict__updater   copyr   r   )r   r)   r   r   r   r2   V   s    zSymbols.copyc             C   s`   | j j| || jkr\| jd k	rJ| jj|}|d k	rJ| j|t|fd d S | j|td fd d S )N)r    )r   addr   r   r&   r#   VAR_LOAD_ALIASVAR_LOAD_UNDEFINED)r   r   Z	outer_refr   r   r   store^   s    

zSymbols.storec             C   s   | j j| | j|td fdS )N)r    )r   r3   r#   VAR_LOAD_PARAMETER)r   r   r   r   r   declare_parameterp   s    zSymbols.declare_parameterc             C   s$   | j |d kr | j|t|fd d S )N)r    )r&   r#   VAR_LOAD_RESOLVE)r   r   r   r   r   r    t   s    zSymbols.load)branch_symbolsr
   c       	      C   s   i }x<|D ]4}x.|j D ]$}|| j kr&q|j|dd ||< qW q
W x6|D ].}| jj|j | jj|j | j j|j  qHW xx|j D ]l\}}|t|krq| j|}|d k	std| j	d k	r| j	j|}|d k	rt
|f| j|< qt|f| j|< qW d S )Nr   r   zshould not happen)r   getr   r1   r   itemslenr&   r(   r   r4   r9   )	r   r:   r   branchr$   r   r   Zbranch_countZouter_targetr   r   r   branch_updatex   s*    




zSymbols.branch_updatec             C   sJ   i }| }x<|d k	rDx(t |jD ]}||kr| j|||< qW |j}q
W |S )N)sortedr   r&   r   )r   r)   r   r   r   r   r   dump_stores   s    

zSymbols.dump_storesc             C   sP   t  }| }x@|d k	rJx,| jj D ]\}\}}|tkr |j| q W |j}qW |S )N)r   r   r<   r7   r3   r   )r   r)   r   r$   instrr!   r   r   r   dump_param_targets   s    

zSymbols.dump_param_targets)NN)N)__name__
__module____qualname__r+   Optionalintr   r   NodeAnyr   strTupler#   r%   r&   r*   r2   r6   r8   r    Sequencer?   DictrA   SetrC   r   r   r   r   r      s   			c               @   s   e Zd ZdddddZejejddddZeZ	eZ
eZeZeZeZeZejejddd	d
ZejejddddZejejddddZdejeejddddZejejddddZejejejddddZdS )r   r   N)symbolsr
   c             C   s   t || _d S )N)r   sym_visitor)r   rP   r   r   r   r      s    zRootVisitor.__init__)r   r   r
   c             K   s"   x|j  D ]}| jj| q
W d S )N)iter_child_nodesrQ   r   )r   r   r   childr   r   r   _simple_visit   s    zRootVisitor._simple_visitc             K   s    x|j D ]}| jj| qW d S )N)bodyrQ   r   )r   r   r   rS   r   r   r   visit_AssignBlock   s    zRootVisitor.visit_AssignBlockc             K   s&   x |j ddD ]}| jj| qW d S )Ncall)exclude)rW   )rR   rQ   r   )r   r   r   rS   r   r   r   visit_CallBlock   s    zRootVisitor.visit_CallBlockc             K   s    x|j D ]}| jj| qW d S )N)rU   rQ   r   )r   r   r   rS   r   r   r   visit_OverlayScope   s    zRootVisitor.visit_OverlayScoperU   )r   
for_branchr   r
   c             K   s   |dkr"| j j|jdd |j}nN|dkr2|j}n>|dkrh| j j|jdd |jd k	rd| j j|j d S td|rx|D ]}| j j| qzW d S )NrU   T)store_as_paramelsetestzUnknown for branch)rQ   r   r$   rU   else_r^   RuntimeError)r   r   r[   r   r>   itemr   r   r   	visit_For   s    

zRootVisitor.visit_Forc             K   s<   x|j D ]}| jj| qW x|jD ]}| jj| q$W d S )N)targetsrQ   r   rU   )r   r   r   r$   rS   r   r   r   
visit_With   s    zRootVisitor.visit_With)r   argsr   r
   c             O   s   t dt|jd S )NzCannot find symbols for )NotImplementedErrortyperD   )r   r   re   r   r   r   r   generic_visit   s    zRootVisitor.generic_visit)rU   )rD   rE   rF   r   r   rI   r+   rJ   rT   Zvisit_Templatevisit_Blockvisit_Macrovisit_FilterBlockvisit_Scopevisit_IfZvisit_ScopedEvalContextModifierAssignBlockrV   	CallBlockrY   OverlayScoperZ   ForrK   rb   Withrd   rh   r   r   r   r   r      s    r   c               @   sn  e Zd ZdZdddddZd(ejeej	ddd	d
Z
ejej	ddddZejej	ddddZejej	ddddZejej	ddddZejej	ddddZejej	ddddZejej	ddddZejej	ddddZejej	ddddZejej	ddddZejej	ddd d!Z ej!ej	ddd"d#Z"ej#ej	ddd$d%Z$ej%ej	ddd&d'Z&dS ))r   zA visitor for `Frame.inspect`.r   N)rP   r
   c             C   s
   || _ d S )N)rP   )r   rP   r   r   r   r      s    zFrameSymbolVisitor.__init__F)r   r\   r   r
   c             K   sT   |s|j dkr| jj|j n2|j dkr8| jj|j n|j dkrP| jj|j dS )z2All assignments to names go through this function.r   r6   r    N)ctxrP   r8   r   r6   r    )r   r   r\   r   r   r   r   
visit_Name   s    

zFrameSymbolVisitor.visit_Name)r   r   r
   c             K   s   | j j|j d S )N)rP   r    r   )r   r   r   r   r   r   visit_NSRef   s    zFrameSymbolVisitor.visit_NSRefc                sn   j |jf  jtjtj dd fdd}||j}||j}||j	pTf }jj
|||g d S )Nr   )r   r
   c                s4   j   _}x| D ]}j|f  qW _|S )N)r2   rP   r   )r   r)   Zsubnode)r   original_symbolsr   r   r   inner_visit   s
    
z0FrameSymbolVisitor.visit_If.<locals>.inner_visit)r   r^   rP   r+   Iterabler   rI   rU   Zelif_r_   r?   )r   r   r   rw   Zbody_symbolsZelif_symbolsZelse_symbolsr   )r   rv   r   r   rm      s     	

zFrameSymbolVisitor.visit_Ifc             K   s   | j j|j d S )N)rP   r6   r   )r   r   r   r   r   r   rj     s    zFrameSymbolVisitor.visit_Macroc             K   s    | j |f| | jj|j d S )N)rh   rP   r6   r$   )r   r   r   r   r   r   visit_Import  s    zFrameSymbolVisitor.visit_Importc             K   sJ   | j |f| x6|jD ],}t|tr6| jj|d  q| jj| qW d S )Nr   )rh   names
isinstancetuplerP   r6   )r   r   r   r   r   r   r   visit_FromImport  s
    
z#FrameSymbolVisitor.visit_FromImportc             K   s$   | j |jf| | j |jf| 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f| 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   rb   #  s    zFrameSymbolVisitor.visit_Forc             K   s   | j |jf| d S )N)r   rW   )r   r   r   r   r   r   rY   )  s    z"FrameSymbolVisitor.visit_CallBlockc             K   s   | j |jf| d S )N)r   filter)r   r   r   r   r   r   rk   ,  s    z$FrameSymbolVisitor.visit_FilterBlockc             K   s   x|j D ]}| j| qW d S )N)valuesr   )r   r   r   r$   r   r   r   rd   /  s    zFrameSymbolVisitor.visit_Withc             K   s   | j |jf| dS )zStop visiting at block assigns.N)r   r$   )r   r   r   r   r   r   rV   3  s    z$FrameSymbolVisitor.visit_AssignBlockc             K   s   dS )zStop visiting at scopes.Nr   )r   r   r   r   r   r   rl   7  s    zFrameSymbolVisitor.visit_Scopec             K   s   dS )zStop visiting at blocks.Nr   )r   r   r   r   r   r   ri   :  s    zFrameSymbolVisitor.visit_Blockc             K   s   dS )z!Do not visit into overlay scopes.Nr   )r   r   r   r   r   r   rZ   =  s    z%FrameSymbolVisitor.visit_OverlayScope)F)'rD   rE   rF   __doc__r   r   Nameboolr+   rJ   rt   ZNSRefru   Ifrm   ZMacrorj   Importry   Z
FromImportr}   Assignr~   rq   rb   ro   rY   ZFilterBlockrk   rr   rd   rn   rV   ZScoperl   ZBlockri   rp   rZ   r   r   r   r   r      s$   		r   )N)N)typingr+    r   r   r   r7   r9   r4   r5   rx   rI   rG   r   r   r   r   r   r   r   r   r   <module>   s   	 :