o
    %JAf)                     @   s   d dl ZddlmZ ddlmZ dZdZdZdZ		dd	ej
ej d
ejd ddfddZ	ddejd
ejd ddf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	undefinedr   parent_symbolsSymbolsreturnc                 C   s*   t |d}t|}| D ]}|| q|S N)parent)r	   FrameSymbolVisitorvisit)r   r   symvisitornode r   N/usr/lib/python3.10/site-packages/Jinja2-3.1.2-py3.10.egg/jinja2/idtracking.pyfind_symbols   s
   
r   r   c                 C   s   t |d}||  |S r   )r	   analyze_node)r   r   r   r   r   r   symbols_for_node   s   

r   c                	   @   sD  e Zd Z	d%dejd  deje ddfddZdejdej	ddfd	d
Z
	d&dedejejeeje f  defddZdedejej	 fddZdedeje fddZdedefddZd'ddZdeddfddZdedefddZdeddfddZdejd  ddfdd Zdejeef fd!d"Zdeje fd#d$ZdS )(r	   Nr   levelr
   c                 C   sD   |d u r|d u 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   kwargsc                 K   s   t | }|j|fi | d S N)RootVisitorr   )r   r   r   r   r   r   r   r   .   s   zSymbols.analyze_nodenameloadc                 C   s2   d| j  d| }|| j|< |d ur|| j|< |S )NZl__)r   r   r   )r   r!   r"   identr   r   r   _define_ref2   s
   

zSymbols._define_reftargetc                 C   .   || j v r
| j | S | jd ur| j|S d S r   )r   r   	find_load)r   r&   r   r   r   r(   ;   
   


zSymbols.find_loadc                 C   r'   r   )r   r   find_refr   r!   r   r   r   r*   D   r)   zSymbols.find_refc                 C   s&   |  |}|d u 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.refc                 C   sB   t | j}|j| j | j |_| j |_| j |_|S r   )	object__new__	__class____dict__updater   copyr   r   )r   r.   r   r   r   r5   V   s   zSymbols.copyc                 C   sd   | j | || jvr0| jd ur%| j|}|d ur%| j|t|fd d S | j|td fd d S 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 r6   )r   r7   r%   VAR_LOAD_PARAMETERr+   r   r   r   declare_parameterp   s   zSymbols.declare_parameterc                 C   s(   |  |d u r| j|t|fd d S d S r6   )r*   r%   VAR_LOAD_RESOLVEr+   r   r   r   r"   t   s   zSymbols.loadbranch_symbolsc           	      C   s   i }|D ]}|j D ]}|| j v rq	||dd ||< q	q|D ]}| j|j | j|j | j |j  q| D ]6\}}|t|krFq;| |}|d usSJ d| jd urj| j|}|d urjt	|f| j|< q;t
|f| j|< q;d S )Nr   r   zshould not happen)r   getr   r4   r   itemslenr*   r   r8   r=   )	r   r>   r   branchr&   r   r!   Zbranch_countZouter_targetr   r   r   branch_updatex   s.   



zSymbols.branch_updatec                 C   sH   i }| }|d ur"t |jD ]}||vr| |||< q|j}|d us|S r   )sortedr   r*   r   )r   r.   r   r!   r   r   r   dump_stores   s   zSymbols.dump_storesc                 C   sN   t  }| }|d ur%| j D ]\}\}}|tkr|| q|j}|d us	|S r   )r   r   r@   r;   r7   r   )r   r.   r   r&   instrr#   r   r   r   dump_param_targets   s   
zSymbols.dump_param_targets)NNr   )r
   r	   )__name__
__module____qualname__tOptionalintr   r   NodeAnyr   strTupler%   r(   r*   r/   r5   r:   r<   r"   SequencerC   DictrE   SetrG   r   r   r   r   r	      s8    

			
	c                	   @   s   e Zd ZdddZdejdejddfd	d
ZeZ	eZ
eZeZeZeZeZdejdejddfddZdejdejddfddZdejdejddfddZ	ddejdedejddfddZdejdejddfddZdejdejdejddfddZdS )r    symbolsr	   r
   Nc                 C   s   t || _d S r   )r   sym_visitorr   rU   r   r   r   r      s   zRootVisitor.__init__r   r   c                 K   s   |  D ]}| j| qd S r   iter_child_nodesrV   r   r   r   r   childr   r   r   _simple_visit   s   zRootVisitor._simple_visitc                 K      |j D ]}| j| qd S r   bodyrV   r   rZ   r   r   r   visit_AssignBlock      
zRootVisitor.visit_AssignBlockc                 K   s"   |j ddD ]}| j| qd S )N)call)excluderX   rZ   r   r   r   visit_CallBlock   s   zRootVisitor.visit_CallBlockc                 K   r]   r   r^   rZ   r   r   r   visit_OverlayScope   ra   zRootVisitor.visit_OverlayScoper_   
for_branchc                 K   s   |dkr| j j|jdd |j}n'|dkr|j}n|dkr4| j j|jdd |jd ur2| j |j d S td|rE|D ]
}| j | q<d S d S )Nr_   T)store_as_paramelsetestzUnknown for branch)rV   r   r&   r_   else_ri   RuntimeError)r   r   rf   r   rB   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&   r[   r   r   r   
visit_With   s
   

zRootVisitor.visit_Withargsc                 O   s   t dt|j)NzCannot find symbols for )NotImplementedErrortyperH   )r   r   rp   r   r   r   r   generic_visit   s   zRootVisitor.generic_visitrU   r	   r
   N)r_   )rH   rI   rJ   r   r   rN   rK   rO   r\   Zvisit_Templatevisit_Blockvisit_Macrovisit_FilterBlockvisit_Scopevisit_IfZvisit_ScopedEvalContextModifierAssignBlockr`   	CallBlockrd   OverlayScopere   ForrP   rm   Withro   rs   r   r   r   r   r       s2    

$r    c                	   @   s  e Zd ZdZd*ddZ	d+d	ejd
edej	ddfddZ
d	ejdej	ddfddZd	ejdej	ddfddZd	ejdej	ddfddZd	ejdej	ddfddZd	ejdej	ddfddZd	ejdej	ddfddZd	ejdej	ddfddZd	ejdej	ddfddZd	ejdej	ddfddZd	ejdej	ddfd d!Zd	ejdej	ddfd"d#Z d	ej!dej	ddfd$d%Z"d	ej#dej	ddfd&d'Z$d	ej%dej	ddfd(d)Z&dS ),r   zA visitor for `Frame.inspect`.rU   r	   r
   Nc                 C   s
   || _ d S r   )rU   rW   r   r   r   r      s   
zFrameSymbolVisitor.__init__Fr   rg   r   c                 K   s\   |s|j dkr| j|j dS |j dkr| j|j dS |j dkr,| j|j dS dS )z2All assignments to names go through this function.r   r:   r"   N)ctxrU   r<   r!   r:   r"   )r   r   rg   r   r   r   r   
visit_Name   s   

zFrameSymbolVisitor.visit_Namec                 K      | j |j d S r   )rU   r"   r!   r   r   r   r   r   r   visit_NSRef      zFrameSymbolVisitor.visit_NSRefc                    st   j |jfi   jdtjtj ddf fdd}||j}||j}||j	p-d}j
|||g d S )Nr   r
   r	   c                    s4      _}| D ]}j|fi   q	_|S r   )r5   rU   r   )r   r.   Zsubnoder   Zoriginal_symbolsr   r   r   inner_visit   s
   z0FrameSymbolVisitor.visit_If.<locals>.inner_visitr   )r   ri   rU   rK   Iterabler   rN   r_   Zelif_rj   rC   )r   r   r   r   Zbody_symbolsZelif_symbolsZelse_symbolsr   r   r   ry      s   "
	
zFrameSymbolVisitor.visit_Ifc                 K   r   r   )rU   r:   r!   r   r   r   r   rv     r   zFrameSymbolVisitor.visit_Macroc                 K   s$   | j |fi | | j|j d S r   )rs   rU   r:   r&   r   r   r   r   visit_Import  s   zFrameSymbolVisitor.visit_Importc                 K   sJ   | j |fi | |jD ]}t|tr| j|d  q| j| qd S )Nr   )rs   names
isinstancetuplerU   r:   )r   r   r   r!   r   r   r   visit_FromImport  s   

z#FrameSymbolVisitor.visit_FromImportc                 K   s,   | j |jfi | | j |jfi | 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      | j |jfi | 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   rm   #  s   zFrameSymbolVisitor.visit_Forc                 K      | j |jfi | d S r   )r   rb   r   r   r   r   rd   )     z"FrameSymbolVisitor.visit_CallBlockc                 K   r   r   )r   filterr   r   r   r   rw   ,  r   z$FrameSymbolVisitor.visit_FilterBlockc                 K   s   |j D ]}| | qd S r   )valuesr   )r   r   r   r&   r   r   r   ro   /  s   
zFrameSymbolVisitor.visit_Withc                 K   r   )zStop visiting at block assigns.N)r   r&   r   r   r   r   r`   3  s   z$FrameSymbolVisitor.visit_AssignBlockc                 K      dS )zStop visiting at scopes.Nr   r   r   r   r   rx   7      zFrameSymbolVisitor.visit_Scopec                 K   r   )zStop visiting at blocks.Nr   r   r   r   r   ru   :  r   zFrameSymbolVisitor.visit_Blockc                 K   r   )z!Do not visit into overlay scopes.Nr   r   r   r   r   re   =  r   z%FrameSymbolVisitor.visit_OverlayScopert   )F)'rH   rI   rJ   __doc__r   r   NameboolrK   rO   r   ZNSRefr   Ifry   ZMacrorv   Importr   Z
FromImportr   Assignr   r}   rm   r{   rd   ZFilterBlockrw   r~   ro   rz   r`   ZScoperx   ZBlockru   r|   re   r   r   r   r   r      s6    

	r   r   )typingrK    r   r   r   r;   r=   r8   r9   r   rN   rL   r   r   r	   r    r   r   r   r   r   <module>   s6    


 :