U
    Á½„bÐ)  ã                   @   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-p3mw61s5/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rŒqv|  |¡}|d k	s¦tdƒ‚| j	d k	rÔ| j	 |¡}|d k	rÔt
|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,    ÿ
 þ ÿ þ :