U
    åG‘\í#  ã                   @   sp   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	G dd„ de
ƒZG dd„ deƒZG dd„ deƒZdS )é    )ÚNodeVisitor)Ú	iteritemsÚparamZresolveÚaliasZ	undefinedNc                 C   s*   t |d�}t|ƒ}| D ]}| |¡ q|S ©N)Úparent)ÚSymbolsÚFrameSymbolVisitorÚvisit)ÚnodesÚparent_symbolsÚsymÚvisitorÚnode© r   ú3/usr/lib/python3/dist-packages/jinja2/idtracking.pyÚfind_symbols   s
    
r   c                 C   s   t |d�}| | ¡ |S r   )r   Úanalyze_node)r   r   r   r   r   r   Úsymbols_for_node   s    

r   c                   @   sx   e Zd Z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   sD   |d kr |d krd}n
|j d }|| _ || _i | _i | _tƒ | _d S )Nr   é   )Úlevelr   ÚrefsÚloadsÚsetÚstores)Úselfr   r   r   r   r   Ú__init__   s    
zSymbols.__init__c                 K   s   t | ƒ}|j|f|Ž d S ©N)ÚRootVisitorr
   )r   r   Úkwargsr   r   r   r   r   '   s    zSymbols.analyze_nodec                 C   s.   d| j |f }|| j|< |d k	r*|| j|< |S )Nzl_%d_%s)r   r   r   )r   ÚnameÚloadZidentr   r   r   Ú_define_ref+   s
    

zSymbols._define_refc                 C   s.   || j kr| j | S | jd k	r*| j |¡S d S r   )r   r   Ú	find_load)r   Útargetr   r   r   r#   2   s    


zSymbols.find_loadc                 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%   8   s    


zSymbols.find_refc                 C   s"   |   |¡}|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   sB   t  | j¡}|j | j¡ | j ¡ |_| j ¡ |_| j ¡ |_|S r   )	ÚobjectÚ__new__Ú	__class__Ú__dict__Úupdater   Úcopyr   r   )r   r(   r   r   r   r/   E   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   ÚstoreM   s    

zSymbols.storec                 C   s   | j  |¡ | j|td fd�S r0   )r   r1   r"   ÚVAR_LOAD_PARAMETERr&   r   r   r   Údeclare_parameter_   s    zSymbols.declare_parameterc                 C   s(   |   |¡}|d kr$| j|t|fd� d S r0   )r%   r"   ÚVAR_LOAD_RESOLVE)r   r    r$   r   r   r   r!   c   s    
zSymbols.loadc           	      C   sè   i }|D ]0}|j D ]$}|| j kr"q| |d¡d ||< qq|D ].}| j |j¡ | j |j¡ | j  |j ¡ q>t|ƒ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   r.   r   r   Úlenr%   r'   r   r2   r7   )	r   Zbranch_symbolsr   Úbranchr$   r   r    Zbranch_countZouter_targetr   r   r   Úbranch_updateh   s*    



zSymbols.branch_updatec                 C   s>   i }| }|d k	r:|j D ]}||kr|  |¡||< q|j}q|S r   )r   r%   r   )r   r(   r   r    r   r   r   Údump_stores‚   s    
zSymbols.dump_storesc                 C   sH   t ƒ }| }|d k	rDt| jƒD ]\}\}}|tkr| |¡ q|j}q
|S r   )r   r   r   r5   r1   r   )r   r(   r   r$   ZinstrÚ_r   r   r   Údump_param_targetsŒ   s    zSymbols.dump_param_targets)NN)N)Ú__name__Ú
__module__Ú__qualname__r   r   r"   r#   r%   r)   r/   r4   r6   r!   r;   r<   r>   r   r   r   r   r      s   


r   c                   @   sj   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 r   )r	   Úsym_visitor©r   Úsymbolsr   r   r   r   ™   s    zRootVisitor.__init__c                 K   s   |  ¡ D ]}| j |¡ qd S r   ©Ziter_child_nodesrB   r
   ©r   r   r   Úchildr   r   r   Ú_simple_visitœ   s    zRootVisitor._simple_visitc                 K   s   |j D ]}| j |¡ qd S r   ©ÚbodyrB   r
   rF   r   r   r   Úvisit_AssignBlock¤   s    
zRootVisitor.visit_AssignBlockc                 K   s"   |j dd�D ]}| j |¡ qd S )N)Úcall)ZexcluderE   rF   r   r   r   Úvisit_CallBlock¨   s    zRootVisitor.visit_CallBlockc                 K   s   |j D ]}| j |¡ qd S r   rI   rF   r   r   r   Úvisit_OverlayScope¬   s    
zRootVisitor.visit_OverlayScoperJ   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ƒ‚|pvdD ]}| j  |¡ qxd S )NrJ   T)Ústore_as_paramÚelseÚtestzUnknown for branchr   )rB   r
   r$   rJ   Úelse_rQ   ÚRuntimeError)r   r   Z
for_branchr   r:   Úitemr   r   r   Ú	visit_For°   s    
zRootVisitor.visit_Forc                 K   s4   |j D ]}| j |¡ q|jD ]}| j |¡ qd S r   )ZtargetsrB   r
   rJ   )r   r   r   r$   rG   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)rJ   )r?   r@   rA   r   rH   Zvisit_TemplateÚvisit_BlockÚvisit_MacroÚvisit_FilterBlockÚvisit_ScopeÚvisit_IfZvisit_ScopedEvalContextModifierrK   rM   rN   rU   rV   rY   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 r   )rD   rC   r   r   r   r   Î   s    zFrameSymbolVisitor.__init__Fc                 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   r4   r!   N)ZctxrD   r6   r    r4   r!   )r   r   rO   r   r   r   r   Ú
visit_NameÑ   s    

zFrameSymbolVisitor.visit_Namec                 K   s   | j  |j¡ d S r   )rD   r!   r    ©r   r   r   r   r   r   Úvisit_NSRefÚ   s    zFrameSymbolVisitor.visit_NSRefc                    s^   ˆj |jfˆ Ž ˆj‰‡ ‡‡fdd„}||jƒ}||jƒ}||jpDdƒ}ˆj |||g¡ d S )Nc                    s0   ˆ  ¡  ˆ_}| D ]}ˆj|fˆ Ž qˆˆ_|S r   )r/   rD   r
   )r   r(   Zsubnode©r   Zoriginal_symbolsr   r   r   Úinner_visitâ   s
    z0FrameSymbolVisitor.visit_If.<locals>.inner_visitr   )r
   rQ   rD   rJ   Zelif_rR   r;   )r   r   r   rc   Zbody_symbolsZelif_symbolsZelse_symbolsr   rb   r   r^   Ý   s    

zFrameSymbolVisitor.visit_Ifc                 K   s   | j  |j¡ d S r   )rD   r4   r    r`   r   r   r   r[   ï   s    zFrameSymbolVisitor.visit_Macroc                 K   s    | j |f|Ž | j |j¡ d S r   )rY   rD   r4   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   )rY   ÚnamesÚ
isinstanceÚtuplerD   r4   )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   rU     s    zFrameSymbolVisitor.visit_Forc                 K   s   | j |jf|Ž d S r   )r
   rL   r`   r   r   r   rM   	  s    z"FrameSymbolVisitor.visit_CallBlockc                 K   s   | j |jf|Ž d S r   )r
   Úfilterr`   r   r   r   r\     s    z$FrameSymbolVisitor.visit_FilterBlockc                 K   s   |j D ]}|  |¡ qd S r   )Úvaluesr
   )r   r   r   r$   r   r   r   rV     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   rK     s    z$FrameSymbolVisitor.visit_AssignBlockc                 K   s   dS )zStop visiting at scopes.Nr   r`   r   r   r   r]     s    zFrameSymbolVisitor.visit_Scopec                 K   s   dS )zStop visiting at blocks.Nr   r`   r   r   r   rZ     s    zFrameSymbolVisitor.visit_Blockc                 K   s   dS )z!Do not visit into overlay scopes.Nr   r`   r   r   r   rN     s    z%FrameSymbolVisitor.visit_OverlayScopeN)F)r?   r@   rA   Ú__doc__r   r_   ra   r^   r[   rd   rh   ri   rU   rM   r\   rV   rK   r]   rZ   rN   r   r   r   r   r	   Ë   s"   
	r	   )N)N)Zjinja2.visitorr   Zjinja2._compatr   r5   r7   r2   r3   r   r   r*   r   r   r	   r   r   r   r   Ú<module>   s   

~4