3
\f[                   @   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paramresolvealias	undefinedNc             C   s.   t |d}t|}x| D ]}|j| qW |S )N)parent)SymbolsFrameSymbolVisitorvisit)nodesparent_symbolssymvisitornode r   CC:\prj\env\wsgidav_build_3.6\lib\site-packages\jinja2\idtracking.pyfind_symbols   s
    

r   c             C   s   t |d}|j|  |S )N)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loadidentr   r   r   _define_ref+   s
    

zSymbols._define_refc             C   s.   || j kr| j | S | jd k	r*| jj|S d S )N)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j|S d S )N)r   r   find_ref)r   r    r   r   r   r&   8   s    


zSymbols.find_refc             C   s"   | j |}|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j |_| jj |_| jj |_|S )N)	object__new__	__class____dict__updater   copyr   r   )r   r(   r   r   r   r/   E   s    zSymbols.copyc             C   s`   | j j| || jkr\| jd k	rJ| j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| | j|td fdS )N)r!   )r   r0   r#   VAR_LOAD_PARAMETER)r   r    r   r   r   declare_parameter_   s    zSymbols.declare_parameterc             C   s(   | j |}|d kr$| j|t|fd d S )N)r!   )r&   r#   VAR_LOAD_RESOLVE)r   r    r%   r   r   r   r!   c   s    
zSymbols.loadc       	      C   s   i }x<|D ]4}x.|j D ]$}|| j kr&q|j|dd ||< qW q
W x6|D ].}| jj|j | jj|j | j j|j  qHW xxt|D ]l\}}|t|krq| j|}|d k	std| j	d k	r| j	j|}|d k	rt
|f| j|< qt|f| j|< qW d S )Nr   r   zshould not happen)r   getr   r.   r   r   lenr&   r'   r   r1   r6   )	r   Zbranch_symbolsr   branchr%   r   r    Zbranch_countZouter_targetr   r   r   branch_updateh   s*    




zSymbols.branch_updatec             C   sF   i }| }x8|d k	r@x$|j D ]}||kr| j|||< qW |j}q
W |S )N)r   r&   r   )r   r(   r   r    r   r   r   dump_stores   s    

zSymbols.dump_storesc             C   sP   t  }| }x@|d k	rJx,t| jD ]\}\}}|tkr |j| q W |j}qW |S )N)r   r   r   r4   r0   r   )r   r(   r   r%   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/   r3   r5   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 )N)r
   sym_visitor)r   symbolsr   r   r   r      s    zRootVisitor.__init__c             K   s"   x|j  D ]}| jj| q
W d S )N)iter_child_nodesrB   r   )r   r   r   childr   r   r   _simple_visit   s    zRootVisitor._simple_visitc             K   s    x|j D ]}| jj| qW d S )N)bodyrB   r   )r   r   r   rE   r   r   r   visit_AssignBlock   s    zRootVisitor.visit_AssignBlockc             K   s&   x |j ddD ]}| jj| qW d S )Ncall)exclude)rI   )rD   rB   r   )r   r   r   rE   r   r   r   visit_CallBlock   s    zRootVisitor.visit_CallBlockc             K   s    x|j D ]}| jj| qW d S )N)rG   rB   r   )r   r   r   rE   r   r   r   visit_OverlayScope   s    zRootVisitor.visit_OverlayScoperG   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|j d S tdx|pxf D ]}| j j| qzW d S )NrG   T)store_as_paramelsetestzUnknown for branch)rB   r   r%   rG   else_rO   RuntimeError)r   r   
for_branchr   r9   itemr   r   r   	visit_For   s    
zRootVisitor.visit_Forc             K   s<   x|j D ]}| jj| qW x|jD ]}| jj| q$W d S )N)targetsrB   r   rG   )r   r   r   r%   rE   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)rG   )r?   r@   rA   r   rF   visit_Templatevisit_Blockvisit_Macrovisit_FilterBlockvisit_Scopevisit_Ifvisit_ScopedEvalContextModifierrH   rK   rL   rT   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 )N)rC   )r   rC   r   r   r   r      s    zFrameSymbolVisitor.__init__Fc             K   sT   |s|j dkr| jj|j n2|j dkr8| jj|j n|j dkrP| jj|j dS )z2All assignments to names go through this function.r   r3   r!   N)ctxrC   r5   r    r3   r!   )r   r   rM   r   r   r   r   
visit_Name   s    

zFrameSymbolVisitor.visit_Namec             K   s   | j j|j d S )N)rC   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pDf }jj|||g d S )Nc                s4   j   _}x| D ]}j|f  qW _|S )N)r/   rC   r   )r   r(   subnode)r   original_symbolsr   r   r   inner_visit   s
    
z0FrameSymbolVisitor.visit_If.<locals>.inner_visit)r   rO   rC   rG   elif_rP   r:   )r   r   r   rf   Zbody_symbolsZelif_symbolsZelse_symbolsr   )r   re   r   r   r_      s    

zFrameSymbolVisitor.visit_Ifc             K   s   | j j|j d S )N)rC   r3   r    )r   r   r   r   r   r   r\      s    zFrameSymbolVisitor.visit_Macroc             K   s    | j |f| | jj|j d S )N)rY   rC   r3   r%   )r   r   r   r   r   r   visit_Import   s    zFrameSymbolVisitor.visit_Importc             K   sJ   | j |f| x6|jD ],}t|tr6| jj|d  q| jj| qW d S )Nr   )rY   names
isinstancetuplerC   r3   )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   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   iter)r   r   r   r   r   r   rT     s    zFrameSymbolVisitor.visit_Forc             K   s   | j |jf| d S )N)r   rI   )r   r   r   r   r   r   rK   	  s    z"FrameSymbolVisitor.visit_CallBlockc             K   s   | j |jf| d S )N)r   filter)r   r   r   r   r   r   r]     s    z$FrameSymbolVisitor.visit_FilterBlockc             K   s   x|j D ]}| j| qW d S )N)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   r   r   rH     s    z$FrameSymbolVisitor.visit_AssignBlockc             K   s   dS )zStop visiting at scopes.Nr   )r   r   r   r   r   r   r^     s    zFrameSymbolVisitor.visit_Scopec             K   s   dS )zStop visiting at blocks.Nr   )r   r   r   r   r   r   r[     s    zFrameSymbolVisitor.visit_Blockc             K   s   dS )z!Do not visit into overlay scopes.Nr   )r   r   r   r   r   r   rL     s    z%FrameSymbolVisitor.visit_OverlayScopeN)F)r?   r@   rA   __doc__r   rb   rc   r_   r\   rh   rl   rm   rT   rK   r]   rV   rH   r^   r[   rL   r   r   r   r   r
      s"   
	r
   )N)N)jinja2.visitorr   jinja2._compatr   r4   r6   r1   r2   r   r   r*   r	   r   r
   r   r   r   r   <module>   s   

~4