3
¥Yðiá)  ã               @   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|ƒ}x| D ]}|j|ƒ qW |S )N)Úparent)r   ÚFrameSymbolVisitorÚvisit)r   r	   ÚsymÚvisitorÚnode© r   ú3/tmp/pip-build-8om4l6ph/Jinja2/jinja2/idtracking.pyÚfind_symbols   s
    

r   )r   r	   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               @   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j|ƒS d S )N)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j|ƒS d S )N)r   r   Úfind_ref)r   r   r   r   r   r&   D   s
    


zSymbols.find_refc             C   s&   | j |ƒ}|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   sJ   t jttj| jƒƒ}|jj| jƒ | jj	ƒ |_| j
j	ƒ |_
| jj	ƒ |_|S )N)ÚtÚcastr   ÚobjectÚ__new__Ú	__class__Ú__dict__Úupdater   Úcopyr   r   )r   r)   r   r   r   r2   V   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   Ústore^   s    

zSymbols.storec             C   s   | j j|ƒ | j|td fd�S )N)r    )r   r3   r#   ÚVAR_LOAD_PARAMETER)r   r   r   r   r   Údeclare_parameterp   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    t   s    zSymbols.load)Úbranch_symbolsr
   c       	      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 xx|jƒ D ]l\}}|t|ƒkršq„| j|ƒ}|d k	s´tdƒ‚| j	d k	râ| j	j|ƒ}|d k	rât
|f| j|< q„t|f| j|< q„W d S )Nr   r   zshould not happen)r   Úgetr   r1   r   ÚitemsÚlenr&   r(   r   r4   r9   )	r   r:   r   Úbranchr$   r   r   Zbranch_countZouter_targetr   r   r   Úbranch_updatex   s*    




zSymbols.branch_updatec             C   sJ   i }| }x<|d k	rDx(t |jƒD ]}||kr| j|ƒ||< qW |j}q
W |S )N)Úsortedr   r&   r   )r   r)   r   r   r   r   r   Údump_stores“   s    

zSymbols.dump_storesc             C   sP   t ƒ }| }x@|d k	rJx,| jjƒ D ]\}\}}|tkr |j|ƒ q W |j}qW |S )N)r   r   r<   r7   r3   r   )r   r)   r   r$   Úinstrr!   r   r   r   Údump_param_targets    s    

zSymbols.dump_param_targets)NN)N)Ú__name__Ú
__module__Ú__qualname__r+   ÚOptionalÚintr   r   ÚNodeÚAnyr   ÚstrÚTupler#   r%   r&   r*   r2   r6   r8   r    ÚSequencer?   ÚDictrA   ÚSetrC   r   r   r   r   r      s   			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 )N)r   Úsym_visitor)r   rP   r   r   r   r   ¯   s    zRootVisitor.__init__)r   r   r
   c             K   s"   x|j ƒ D ]}| jj|ƒ q
W d S )N)Úiter_child_nodesrQ   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)ÚbodyrQ   r   )r   r   r   rS   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)rW   )rR   rQ   r   )r   r   r   rS   r   r   r   Úvisit_CallBlockÂ   s    zRootVisitor.visit_CallBlockc             K   s    x|j D ]}| jj|ƒ qW d S )N)rU   rQ   r   )r   r   r   rS   r   r   r   Úvisit_OverlayScopeÆ   s    zRootVisitor.visit_OverlayScoperU   )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|jƒ d S tdƒ‚|rŽx|D ]}| j j|ƒ qzW d S )NrU   T)Ústore_as_paramÚelseÚtestzUnknown for branch)rQ   r   r$   rU   Úelse_r^   ÚRuntimeError)r   r   r[   r   r>   Ú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)ÚtargetsrQ   r   rU   )r   r   r   r$   rS   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ÚtyperD   )r   r   re   r   r   r   r   Úgeneric_visitä   s    zRootVisitor.generic_visit)rU   )rD   rE   rF   r   r   rI   r+   rJ   rT   Zvisit_TemplateÚvisit_BlockÚvisit_MacroÚvisit_FilterBlockÚvisit_ScopeÚvisit_IfZvisit_ScopedEvalContextModifierÚAssignBlockrV   Ú	CallBlockrY   ÚOverlayScoperZ   ÚForrK   rb   ÚWithrd   rh   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   N)rP   r
   c             C   s
   || _ d S )N)rP   )r   rP   r   r   r   r   ë   s    zFrameSymbolVisitor.__init__F)r   r\   r   r
   c             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   r6   r    N)ÚctxrP   r8   r   r6   r    )r   r   r\   r   r   r   r   Ú
visit_Nameî   s    

zFrameSymbolVisitor.visit_Name)r   r   r
   c             K   s   | j j|jƒ d S )N)rP   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	pTf ƒ}ˆjj
|||gƒ d S )Nr   )r   r
   c                s4   ˆj ƒ  ˆ_}x| D ]}ˆj|fˆ Ž qW ˆˆ_|S )N)r2   rP   r   )r   r)   Zsubnode)r   Úoriginal_symbolsr   r   r   Úinner_visit   s
    
z0FrameSymbolVisitor.visit_If.<locals>.inner_visit)r   r^   rP   r+   ÚIterabler   rI   rU   Zelif_r_   r?   )r   r   r   rw   Zbody_symbolsZelif_symbolsZelse_symbolsr   )r   rv   r   r   rm   ü   s     	

zFrameSymbolVisitor.visit_Ifc             K   s   | j j|jƒ d S )N)rP   r6   r   )r   r   r   r   r   r   rj     s    zFrameSymbolVisitor.visit_Macroc             K   s    | j |f|Ž | jj|jƒ d S )N)rh   rP   r6   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   )rh   ÚnamesÚ
isinstanceÚtuplerP   r6   )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   rb   #  s    zFrameSymbolVisitor.visit_Forc             K   s   | j |jf|Ž d S )N)r   rW   )r   r   r   r   r   r   rY   )  s    z"FrameSymbolVisitor.visit_CallBlockc             K   s   | j |jf|Ž d S )N)r   Úfilter)r   r   r   r   r   r   rk   ,  s    z$FrameSymbolVisitor.visit_FilterBlockc             K   s   x|j D ]}| j|ƒ qW d S )N)Úvaluesr   )r   r   r   r$   r   r   r   rd   /  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   rV   3  s    z$FrameSymbolVisitor.visit_AssignBlockc             K   s   dS )zStop visiting at scopes.Nr   )r   r   r   r   r   r   rl   7  s    zFrameSymbolVisitor.visit_Scopec             K   s   dS )zStop visiting at blocks.Nr   )r   r   r   r   r   r   ri   :  s    zFrameSymbolVisitor.visit_Blockc             K   s   dS )z!Do not visit into overlay scopes.Nr   )r   r   r   r   r   r   rZ   =  s    z%FrameSymbolVisitor.visit_OverlayScope)F)'rD   rE   rF   Ú__doc__r   r   ÚNameÚboolr+   rJ   rt   ZNSRefru   ÚIfrm   ZMacrorj   ÚImportry   Z
FromImportr}   ÚAssignr~   rq   rb   ro   rY   ZFilterBlockrk   rr   rd   rn   rV   ZScoperl   ZBlockri   rp   rZ   r   r   r   r   r   è   s$   		r   )N)N)Útypingr+   Ú r   r   r   r7   r9   r4   r5   rx   rI   rG   r   r   r   r   r   r   r   r   r   Ú<module>   s   	 :