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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   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