U
    muf)                     @   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|}| D ]}|| q|S N)parent)r   FrameSymbolVisitorvisit)r   r	   symvisitornode r   5/tmp/pip-unpacked-wheel-okysjx7c/jinja2/idtracking.pyfind_symbols   s
    
r   )r   r	   r
   c                 C   s   t |d}||  |S 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|S d S r    )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|S d S r    )r   r   find_refr   r"   r   r   r   r)   D   s
    


zSymbols.find_refc                 C   s&   |  |}|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   sB   t | j}|j| j | j |_| j |_| j |_|S r    )	object__new__	__class____dict__updater   copyr   r   )r   r-   r   r   r   r4   V   s    zSymbols.copyc                 C   s`   | j | || jkr\| jd k	rJ| 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|td fdS r5   )r   r6   r&   VAR_LOAD_PARAMETERr*   r   r   r   declare_parameterp   s    zSymbols.declare_parameterc                 C   s$   |  |d kr | j|t|fd d S r5   )r)   r&   VAR_LOAD_RESOLVEr*   r   r   r   r#   t   s    zSymbols.load)branch_symbolsr
   c           	      C   s   i }|D ]0}|j D ]$}|| j kr"q||dd ||< qq|D ].}| j|j | j|j | j |j  q>| D ]l\}}|t|krqv| |}|d k	std| j	d k	r| j	|}|d k	rt
|f| j|< qvt|f| j|< qvd S )Nr   r   zshould not happen)r   getr   r3   r   itemslenr)   r,   r   r7   r<   )	r   r=   r   branchr'   r   r"   Zbranch_countZouter_targetr   r   r   branch_updatex   s*    



zSymbols.branch_updatec                 C   sB   i }| }|d k	r>t |jD ]}||kr| |||< q|j}q|S r    )sortedr   r)   r   )r   r-   r   r"   r   r   r   dump_stores   s    zSymbols.dump_storesc                 C   sH   t  }| }|d k	rD| j D ]\}\}}|tkr|| q|j}q
|S r    )r   r   r?   r:   r6   r   )r   r-   r   r'   instrr$   r   r   r   dump_param_targets   s    zSymbols.dump_param_targets)NN)N)__name__
__module____qualname__tOptionalintr   r   NodeAnyr   strTupler&   r(   r)   r.   r4   r9   r;   r#   SequencerB   DictrD   SetrF   r   r   r   r   r      s0         				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 r    )r   sym_visitorr   rU   r   r   r   r      s    zRootVisitor.__init__r   c                 K   s   |  D ]}| j| qd S r    Ziter_child_nodesrV   r   r   r   r   childr   r   r   _simple_visit   s    zRootVisitor._simple_visitc                 K   s   |j D ]}| j| qd S r    bodyrV   r   rY   r   r   r   visit_AssignBlock   s    
zRootVisitor.visit_AssignBlockc                 K   s"   |j ddD ]}| j| qd S )N)call)excluderX   rY   r   r   r   visit_CallBlock   s    zRootVisitor.visit_CallBlockc                 K   s   |j D ]}| j| qd S r    r\   rY   r   r   r   visit_OverlayScope   s    
zRootVisitor.visit_OverlayScoper]   )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 d S td|r|D ]}| j | qxd S )Nr]   T)store_as_paramelsetestzUnknown for branch)rV   r   r'   r]   else_rf   RuntimeError)r   r   rc   r   rA   itemr   r   r   	visit_For   s    
zRootVisitor.visit_Forc                 K   s4   |j D ]}| j| q|jD ]}| j| qd S r    )targetsrV   r   r]   )r   r   r   r'   rZ   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typerG   )r   r   rm   r   r   r   r   generic_visit   s    zRootVisitor.generic_visit)r]   )rG   rH   rI   r   r   rM   rJ   rN   r[   Zvisit_Templatevisit_Blockvisit_Macrovisit_FilterBlockvisit_Scopevisit_IfZvisit_ScopedEvalContextModifierAssignBlockr^   	CallBlockra   OverlayScoperb   ForrO   rj   Withrl   rp   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   NrT   c                 C   s
   || _ d S r    )rU   rW   r   r   r   r      s    zFrameSymbolVisitor.__init__F)r   rd   r   r
   c                 K   sT   |s|j dkr| j|j n2|j dkr8| j|j n|j dkrP| j|j dS )z2All assignments to names go through this function.r   r9   r#   N)ctxrU   r;   r"   r9   r#   )r   r   rd   r   r   r   r   
visit_Name   s    

zFrameSymbolVisitor.visit_Namer   c                 K   s   | j |j d S r    )rU   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	pTd}j
|||g d S )Nr   )r   r
   c                    s0      _}| D ]}j|f  q_|S r    )r4   rU   r   )r   r-   Zsubnoder   Zoriginal_symbolsr   r   r   inner_visit   s
    z0FrameSymbolVisitor.visit_If.<locals>.inner_visitr   )r   rf   rU   rJ   Iterabler   rM   r]   Zelif_rg   rB   )r   r   r   r   Zbody_symbolsZelif_symbolsZelse_symbolsr   r   r   ru      s     	

zFrameSymbolVisitor.visit_Ifc                 K   s   | j |j d S r    )rU   r9   r"   r}   r   r   r   rr     s    zFrameSymbolVisitor.visit_Macroc                 K   s    | j |f| | j|j d S r    )rp   rU   r9   r'   r}   r   r   r   visit_Import  s    zFrameSymbolVisitor.visit_Importc                 K   sF   | j |f| |jD ],}t|tr4| j|d  q| j| qd S )Nr   )rp   names
isinstancetuplerU   r9   )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   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   iterr}   r   r   r   rj   #  s    zFrameSymbolVisitor.visit_Forc                 K   s   | j |jf| d S r    )r   r_   r}   r   r   r   ra   )  s    z"FrameSymbolVisitor.visit_CallBlockc                 K   s   | j |jf| d S r    )r   filterr}   r   r   r   rs   ,  s    z$FrameSymbolVisitor.visit_FilterBlockc                 K   s   |j D ]}| | qd S r    )valuesr   )r   r   r   r'   r   r   r   rl   /  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^   3  s    z$FrameSymbolVisitor.visit_AssignBlockc                 K   s   dS )zStop visiting at scopes.Nr   r}   r   r   r   rt   7  s    zFrameSymbolVisitor.visit_Scopec                 K   s   dS )zStop visiting at blocks.Nr   r}   r   r   r   rq   :  s    zFrameSymbolVisitor.visit_Blockc                 K   s   dS )z!Do not visit into overlay scopes.Nr   r}   r   r   r   rb   =  s    z%FrameSymbolVisitor.visit_OverlayScope)F)'rG   rH   rI   __doc__r   r   NameboolrJ   rN   r|   ZNSRefr~   ZIfru   ZMacrorr   ZImportr   Z
FromImportr   ZAssignr   ry   rj   rw   ra   ZFilterBlockrs   rz   rl   rv   r^   ZScopert   ZBlockrq   rx   rb   r   r   r   r   r      s.      	r   )N)N)typingrJ    r   r   r   r:   r<   r7   r8   r   rM   rK   r   r   r   r!   r   r   r   r   r   <module>   s,    
    :