509318396
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
sÝ¨\jÿ  ã               @   sä  d Z ddlmZ ddlmZ ddlmZ ddlm	Z	 ddl
mZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZmZmZ ddlmZmZmZmZmZmZmZ ddl m!Z!m"Z"m#Z#m$Z$m%Z% dddddddddœZ&e'e(dƒrêdZ)ndZ)dgZ*ye+dƒ e*j,dƒ W n e-k
�r    Y nX ye+dƒ W n e-k
�rH   dZ.Y nX dZ.dd „ Z/d6d"d#„Z0d$d%„ Z1d&d'„ Z2G d(d)„ d)e3ƒZ4G d*d+„ d+e3ƒZ5G d,d-„ d-e6ƒZ7G d.d/„ d/eƒZ8G d0d1„ d1eƒZ9G d2d3„ d3e:ƒZ;G d4d5„ d5eƒZ<d!S )7z­
    jinja2.compiler
    ~~~~~~~~~~~~~~~

    Compiles nodes into python code.

    :copyright: (c) 2017 by the Jinja Team.
    :license: BSD, see LICENSE for more details.
é    )Úchain)Údeepcopy)Ú	iskeyword)Úupdate_wrapper)Únodes)ÚEvalContext)ÚNodeVisitor)Ú	Optimizer)ÚTemplateAssertionError)ÚMarkupÚconcatÚescape)Ú
range_typeÚ	text_typeÚstring_typesÚ	iteritemsÚNativeStringIOÚimapÚizip)ÚSymbolsÚVAR_LOAD_PARAMETERÚVAR_LOAD_RESOLVEÚVAR_LOAD_ALIASÚVAR_LOAD_UNDEFINEDz==z!=ú>z>=ú<z<=Úinznot in)ÚeqÚneÚgtZgteqÚltZlteqr   Znotinr   ÚitemsZdivisionz%from __future__ import generator_stopZgenerator_stopzdef f(): yield from x()FTc                s   ‡ fdd„}t |ˆ ƒS )Nc                sD   | j r4|jj r4| jj||jƒ}||kr4| j||ƒS ˆ | ||f|ŽS )N)Ú	optimizedÚeval_ctxÚvolatileÚ	optimizerÚvisit)ÚselfÚnodeÚframeÚkwargsZnew_node)Úf© ú/usr/lib/python3.6/compiler.pyÚnew_func@   s
    zoptimizeconst.<locals>.new_func)r   )r+   r.   r,   )r+   r-   Úoptimizeconst?   s    r/   Nc             C   sH   t | tjƒstdƒ‚|j||||||ƒ}|j| ƒ |dkrD|jjƒ S dS )z+Generate the python source for a node tree.z Can't compile non template nodesN)Ú
isinstancer   ZTemplateÚ	TypeErrorZcode_generator_classr&   ÚstreamÚgetvalue)r(   ÚenvironmentÚnameÚfilenamer2   Ú
defer_initr"   Ú	generatorr,   r,   r-   ÚgenerateJ   s    

r9   c             C   s°   | dks| t ks| tkrdS t| ƒttttttft	 kr<dS t| ƒt
tttfkrnx| D ]}t|ƒsVdS qVW dS t| ƒtkr¬x,t| ƒD ] \}} t|ƒs˜dS t| ƒs„dS q„W dS dS )z)Does the node have a safe representation?NTF)ÚNotImplementedÚEllipsisÚtypeÚboolÚintÚfloatÚcomplexr   r   r   ÚtupleÚlistÚsetÚ	frozensetÚhas_safe_reprÚdictr   )ÚvalueÚitemÚkeyr,   r,   r-   rE   W   s"    
rE   c             C   s@   t |ƒ}yx| D ]}|j|ƒ qW W n tk
r8   Y nX |jS )z”Check if the names passed are accessed undeclared.  The return value
    is a set of all the undeclared names from the sequence of names found.
    )ÚUndeclaredNameVisitorr&   ÚVisitorExitÚ
undeclared)r   ÚnamesÚvisitorr(   r,   r,   r-   Úfind_undeclaredl   s    
rO   c               @   s   e Zd Zdd„ ZdS )ÚMacroRefc             C   s   || _ d| _d| _d| _d S )NF)r(   Úaccesses_callerÚaccesses_kwargsÚaccesses_varargs)r'   r(   r,   r,   r-   Ú__init__{   s    zMacroRef.__init__N)Ú__name__Ú
__module__Ú__qualname__rT   r,   r,   r,   r-   rP   y   s   rP   c               @   s8   e Zd ZdZddd„Zdd„ Zddd	„Zd
d„ ZeZdS )ÚFramez&Holds compile time information for us.Nc             C   sf   || _ t|r|jpd |d�| _d| _d| _|o2|j| _d | _|rF|jpHd | _|| _|d k	rb|j| _d S )N)ÚlevelF)	r#   r   ÚsymbolsÚtoplevelÚ	rootlevelÚrequire_output_checkÚbufferÚblockÚparent)r'   r#   r`   rY   r,   r,   r-   rT   …   s    
zFrame.__init__c             C   s*   t j| jƒ}|jj| jƒ | jjƒ |_|S )z!Create a copy of the current one.)ÚobjectÚ__new__Ú	__class__Ú__dict__ÚupdaterZ   Úcopy)r'   Úrvr,   r,   r-   rf   ¥   s    z
Frame.copyFc             C   s&   |rt | j| jjd d�S t | j| ƒS )zReturn an inner frame.é   )rY   )rX   r#   rZ   rY   )r'   Úisolatedr,   r,   r-   Úinner¬   s    zFrame.innerc             C   s   | j ƒ }d|_|S )a  Return a soft frame.  A soft frame may not be modified as
        standalone thing as it shares the resources with the frame it
        was created of, but it's not a rootlevel frame any longer.

        This is only used to implement if-statements.
        F)rf   r\   )r'   rg   r,   r,   r-   Úsoft²   s    z
Frame.soft)NN)F)	rU   rV   rW   Ú__doc__rT   rf   rj   rk   Ú__copy__r,   r,   r,   r-   rX   ‚   s   
 
rX   c               @   s   e Zd ZdZdS )rK   z?Exception used by the `UndeclaredNameVisitor` to signal a stop.N)rU   rV   rW   rl   r,   r,   r,   r-   rK   À   s   rK   c               @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚDependencyFinderVisitorz.A visitor that collects filter and test calls.c             C   s   t ƒ | _t ƒ | _d S )N)rC   ÚfiltersÚtests)r'   r,   r,   r-   rT   Ç   s    z DependencyFinderVisitor.__init__c             C   s   | j |ƒ | jj|jƒ d S )N)Úgeneric_visitro   Úaddr5   )r'   r(   r,   r,   r-   Úvisit_FilterË   s    
z$DependencyFinderVisitor.visit_Filterc             C   s   | j |ƒ | jj|jƒ d S )N)rq   rp   rr   r5   )r'   r(   r,   r,   r-   Ú
visit_TestÏ   s    
z"DependencyFinderVisitor.visit_Testc             C   s   dS )zStop visiting at blocks.Nr,   )r'   r(   r,   r,   r-   Úvisit_BlockÓ   s    z#DependencyFinderVisitor.visit_BlockN)rU   rV   rW   rl   rT   rs   rt   ru   r,   r,   r,   r-   rn   Ä   s
   rn   c               @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	rJ   z¡A visitor that checks if a name is accessed without being
    declared.  This is different from the frame visitor as it will
    not stop at closure frames.
    c             C   s   t |ƒ| _t ƒ | _d S )N)rC   rM   rL   )r'   rM   r,   r,   r-   rT   Ý   s    
zUndeclaredNameVisitor.__init__c             C   sJ   |j dkr8|j| jkr8| jj|jƒ | j| jkrFtƒ ‚n| jj|jƒ d S )NÚload)Úctxr5   rM   rL   rr   rK   Údiscard)r'   r(   r,   r,   r-   Ú
visit_Nameá   s
    z UndeclaredNameVisitor.visit_Namec             C   s   dS )zStop visiting a blocks.Nr,   )r'   r(   r,   r,   r-   ru   é   s    z!UndeclaredNameVisitor.visit_BlockN)rU   rV   rW   rl   rT   ry   ru   r,   r,   r,   r-   rJ   ×   s   rJ   c               @   s   e Zd ZdZdS )ÚCompilerExitz¼Raised if the compiler encountered a situation where it just
    doesn't make sense to further process the code.  Any block that
    raises such an exception is not further processed.
    N)rU   rV   rW   rl   r,   r,   r,   r-   rz   í   s   rz   c               @   sV  e Zd Zd¹dd„Zdd„ Zdd	„ Zd
d„ Zdºdd„Zdd„ Zd»dd„Z	d¼dd„Z
dd„ Zd½dd„Zdd„ Zdd„ Zd¾dd„Zd¿d d!„ZdÀd"d#„Zd$d%„ Zd&d'„ ZdÁd(d)„Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ Zd<d=„ Zd>d?„ Zd@dA„ Z dBdC„ Z!dDdE„ Z"dFdG„ Z#dHdI„ Z$dJdK„ Z%dÂdLdM„Z&dNdO„ Z'dPdQ„ Z(dRdS„ Z)dTdU„ Z*dVdW„ Z+dXdY„ Z,dZd[„ Z-d\d]„ Z.d^d_„ Z/d`da„ Z0dbdc„ Z1ddde„ Z2dfdg„ Z3dhdi„ Z4djdk„ Z5dldm„ Z6dndo„ Z7dpdq„ Z8drds„ Z9dtdu„ Z:dvdw„ Z;dxdy„ Z<dÃdzd{„Z=dÄd|d}„Z>e=d~ƒZ?e=dƒZ@e=d€ƒZAe=d�ƒZBe=d‚ƒZCe=dƒƒZDe=d„ƒZEe=d…dd†�ZFe=d‡dd†�ZGe>d~ƒZHe>dƒZIe>dˆdd†�ZJ[=[>eKd‰dŠ„ ƒZLeKd‹dŒ„ ƒZMd�dŽ„ ZNeKd�d�„ ƒZOeKd‘d’„ ƒZPd“d”„ ZQeKd•d–„ ƒZReKd—d˜„ ƒZSeKd™dš„ ƒZTeKdÅd›dœ„ƒZUd�dž„ ZVdŸd „ ZWd¡d¢„ ZXd£d¤„ ZYd¥d¦„ ZZd§d¨„ Z[d©dª„ Z\d«d¬„ Z]d­d®„ Z^d¯d°„ Z_d±d²„ Z`d³d´„ Zadµd¶„ Zbd·d¸„ ZcdS )ÆÚCodeGeneratorNFTc             C   s²   |d krt ƒ }|| _|| _|| _|| _d| _|| _|| _|rFt|ƒ| _	i | _
i | _d| _d| _d| _i | _i | _g | _d | _d| _d| _d| _d| _d| _g | _g | _dg| _d S )NFr   rh   TÚcontext)r   r4   r5   r6   r2   Zcreated_block_contextr7   r"   r	   r%   Úimport_aliasesÚblocksÚextends_so_farÚhas_known_extendsÚcode_linenorp   ro   Ú
debug_infoÚ_write_debug_infoÚ
_new_linesÚ
_last_lineÚ_first_writeÚ_last_identifierÚ_indentationÚ_assign_stackÚ_param_def_blockÚ_context_reference_stack)r'   r4   r5   r6   r2   r7   r"   r,   r,   r-   rT   ö   s8    
zCodeGenerator.__init__c             C   s   t ||| j| jƒ‚dS )z*Fail with a :exc:`TemplateAssertionError`.N)r
   r5   r6   )r'   ÚmsgÚlinenor,   r,   r-   Úfail9  s    zCodeGenerator.failc             C   s   |  j d7  _ d| j  S )zGet a new unique identifier.rh   zt_%d)r‡   )r'   r,   r,   r-   Útemporary_identifier=  s    z"CodeGenerator.temporary_identifierc             C   s   | j ƒ |_| jd|j ƒ dS )z7Enable buffering for the frame from that point onwards.z%s = []N)r�   r^   Ú	writeline)r'   r)   r,   r,   r-   r^   B  s    
zCodeGenerator.bufferc             C   s”   |s€|j jrd| jdƒ | jƒ  | jd|j ƒ | jƒ  | jdƒ | jƒ  | jd|j ƒ | jƒ  dS |j jr€| jd|j ƒ dS | jd|j ƒ dS )z(Return the buffer contents of the frame.zif context.eval_ctx.autoescape:zreturn Markup(concat(%s))zelse:zreturn concat(%s)N)r#   r$   r�   Úindentr^   ÚoutdentÚ
autoescape)r'   r)   Úforce_unescapedr,   r,   r-   Úreturn_buffer_contentsG  s    

z$CodeGenerator.return_buffer_contentsc             C   s   |  j d7  _ dS )zIndent by one.rh   N)rˆ   )r'   r,   r,   r-   r‘   Y  s    zCodeGenerator.indentrh   c             C   s   |  j |8  _ dS )zOutdent by step.N)rˆ   )r'   Ústepr,   r,   r-   r’   ]  s    zCodeGenerator.outdentc             C   s.   |j dkr| jd|ƒ n| jd|j  |ƒ dS )z%Yield or write into the frame buffer.Nzyield z
%s.append()r^   r�   )r'   r)   r(   r,   r,   r-   Ústart_writea  s    
zCodeGenerator.start_writec             C   s   |j dk	r| jdƒ dS )z1End the writing process started by `start_write`.Nú))r^   Úwrite)r'   r)   r,   r,   r-   Ú	end_writeh  s    
zCodeGenerator.end_writec             C   s$   | j ||ƒ | j|ƒ | j|ƒ dS )z4Simple shortcut for start_write + write + end_write.N)r—   r™   rš   )r'   Úsr)   r(   r,   r,   r-   Úsimple_writem  s    
zCodeGenerator.simple_writec             C   sB   y(| j dƒ x|D ]}| j||ƒ qW W n tk
r<   Y nX dS )z•Visit a list of nodes as block in a frame.  If the current frame
        is no buffer a dummy ``if 0: yield None`` is written automatically.
        ÚpassN)r�   r&   rz   )r'   r   r)   r(   r,   r,   r-   Ú
blockvisits  s    

zCodeGenerator.blockvisitc             C   s€   | j rp| jsR| jjd| j  ƒ |  j| j 7  _| jdk	rR| jj| j| jfƒ d| _d| _| jjd| j ƒ d| _ | jj|ƒ dS )z&Write a string into the output stream.Ú
NFz    r   )	r„   r†   r2   r™   r�   rƒ   r‚   Úappendrˆ   )r'   Úxr,   r,   r-   r™   ~  s    


zCodeGenerator.writer   c             C   s   | j ||ƒ | j|ƒ dS )z!Combination of newline and write.N)Únewliner™   )r'   r¡   r(   Úextrar,   r,   r-   r�   �  s    zCodeGenerator.writelinec             C   s:   t | jd| ƒ| _|dk	r6|j| jkr6|j| _|j| _dS )z/Add one or more newlines before the next write.rh   N)Úmaxr„   r�   r…   rƒ   )r'   r(   r£   r,   r,   r-   r¢   ’  s    zCodeGenerator.newlinec       	      C   sÌ  d}x0t dd„ |jD ƒ|pf ƒD ]}t|ƒr d}P q W x$|jD ]}| jdƒ | j||ƒ q>W |s¶x$|jD ]}| jdƒ | j||ƒ qhW |dk	r¶x&t|ƒD ]\}}| jd||f ƒ q˜W |jrÔ| jdƒ | j|j|ƒ |�r¤|jdk	rð| jd	ƒ n
| jd
ƒ x8|jD ].}| jd|j	 ƒ | j|j
|ƒ | jdƒ �qW |dk	�rhx(t|ƒD ]\}}| jd||f ƒ �qHW |jdk	�r˜| jdƒ | j|j|ƒ | jdƒ n
| jdƒ n$|jdk	�rÈ| jdƒ | j|j|ƒ dS )a,  Writes a function call to the stream for the current node.
        A leading comma is added automatically.  The extra keyword
        arguments may not include python keywords otherwise a syntax
        error could occour.  The extra keyword arguments should be given
        as python dict.
        Fc             s   s   | ]}|j V  qd S )N)rI   )Ú.0r¡   r,   r,   r-   ú	<genexpr>£  s    z*CodeGenerator.signature.<locals>.<genexpr>Tz, Nz, %s=%sz, *z
, **dict({z, **{z%r: z%r: %s, z}, **r˜   ú}z, **)r   r*   Úis_python_keywordÚargsr™   r&   r   Zdyn_argsZ
dyn_kwargsrI   rG   )	r'   r(   r)   Úextra_kwargsZkwarg_workaroundZkwargÚargrI   rG   r,   r,   r-   Ú	signature™  sJ    	 







zCodeGenerator.signaturec             C   sz   t ƒ }x|D ]}|j|ƒ qW xVdD ]N}t| |ƒ}x>t||ƒD ]0}||krV| jƒ ||< | jd|| ||f ƒ q>W q$W dS )zPull all the dependencies.ro   rp   z%s = environment.%s[%r]N)ro   rp   )rn   r&   Úgetattrr�   r�   )r'   r   rN   r(   Z
dependencyÚmappingr5   r,   r,   r-   Úpull_dependenciesÎ  s    


zCodeGenerator.pull_dependenciesc             C   s¢   g }x€t |jjƒD ]p\}\}}|tkr(q|tkrJ| jd|| jƒ |f ƒ q|tkrf| jd||f ƒ q|tkrz|j	|ƒ qt
dƒ‚qW |rž| jddj|ƒ ƒ d S )Nz%s = %s(%r)z%s = %szunknown load instructionz%s = missingz = )r   rZ   Úloadsr   r   r�   Úget_resolve_funcr   r   r    ÚNotImplementedErrorÚjoin)r'   r)   ÚundefsÚtargetÚactionZparamr,   r,   r-   Úenter_frameÛ  s    zCodeGenerator.enter_framec             C   sH   |sDg }x"t |jjƒD ]\}}|j|ƒ qW |rD| jddj|ƒ ƒ d S )Nz%s = missingz = )r   rZ   r°   r    r�   r³   )r'   r)   Úwith_python_scoper´   rµ   Ú_r,   r,   r-   Úleave_frameì  s    zCodeGenerator.leave_framec             C   s   | j jrd| S d| S )Nzasync def %szdef %s)r4   Úis_async)r'   r5   r,   r,   r-   Úfuncô  s    zCodeGenerator.funcc             C   s”  |j ƒ }|jj|ƒ t|ƒ}d}tƒ }g }xNt|jƒD ]@\}}|jdkrL|}|jdkrb|j|jƒ |j	|jj
|jƒƒ q6W t|jdƒ}	d|	krì|dk	rÔy|j|t|jƒ   W qæ tk
rÐ   | jd|jƒ Y qæX n|j	|jjdƒƒ d|_d|	k�rd|k�r|j	|jjdƒƒ d|_d|	k�rDd|k�rD|j	|jjdƒƒ d|_d|_|jj|ƒ | jd| jd	ƒd
j|ƒf |ƒ | jƒ  | j|ƒ | j|ƒ | j|ƒ x´t|jƒD ]¦\}}|jj
|jƒ}
| jd|
 ƒ | jƒ  y|j|t|jƒ  }W n2 tk
�r   | jd|
d|j |jf ƒ Y nX | jd|
 ƒ | j||ƒ | j|
ƒ | j ƒ  �q¨W | j!ƒ  | j"|j|ƒ | j#|dd� | j$|dd� | j ƒ  ||fS )z/Dump the function def of a macro or call block.NÚcallerr*   ÚvarargszhWhen defining macros or call blocks the special "caller" argument must be omitted or be given a default.TFz%s(%s):Zmacroz, zif %s is missing:z%s = undefined(%r, name=%r)zparameter %r was not providedz%s = )r”   )r¸   )r*   r¾   )r½   r*   r¾   )%rj   rZ   Úanalyze_noderP   rC   Ú	enumerater©   r5   rr   r    ÚrefrO   ÚbodyZdefaultsÚlenÚ
IndexErrorrŽ   r�   Údeclare_parameterrQ   rR   rS   r]   r�   r¼   r³   r‘   r^   r·   Úpush_parameter_definitionsr&   Úmark_parameter_storedr’   Úpop_parameter_definitionsrž   r•   rº   )r'   r(   r)   Ú	macro_refZexplicit_callerZskip_special_paramsr©   Úidxr«   rL   rÁ   Údefaultr,   r,   r-   Ú
macro_bodyù  sp    

 



zCodeGenerator.macro_bodyc             C   s`   dj dd„ |jjD ƒƒ}t|jddƒ}t|jjƒdkr>|d7 }| jd|||j|j|jf ƒ dS )	z<Dump the macro definition for the def created by macro_body.z, c             s   s   | ]}t |jƒV  qd S )N)Úreprr5   )r¥   r¡   r,   r,   r-   r¦   H  s    z*CodeGenerator.macro_def.<locals>.<genexpr>r5   Nrh   ú,zLMacro(environment, macro, %r, (%s), %r, %r, %r, context.eval_ctx.autoescape))	r³   r(   r©   r­   rÃ   r™   rR   rS   rQ   )r'   rÉ   r)   Z	arg_tupler5   r,   r,   r-   Ú	macro_defF  s    zCodeGenerator.macro_defc             C   s*   d|j  }| jdk	r&|dt| jƒ 7 }|S )z.Return a human readable position for the node.zline %dNz in )r�   r5   rÍ   )r'   r(   rg   r,   r,   r-   ÚpositionQ  s    

zCodeGenerator.positionc             C   s"   ddj dd„ t|jjƒ ƒD ƒƒ S )Nz{%s}z, c             s   s   | ]\}}d ||f V  qdS )z%r: %sNr,   )r¥   r5   rµ   r,   r,   r-   r¦   Z  s    z3CodeGenerator.dump_local_context.<locals>.<genexpr>)r³   r   rZ   Zdump_stores)r'   r)   r,   r,   r-   Údump_local_contextX  s    z CodeGenerator.dump_local_contextc             C   s"   | j dƒ | j dƒ | j dƒ dS )z·Writes a common preamble that is used by root and block functions.
        Primarily this sets up common local helpers and enforces a generator
        through a dead branch.
        z$resolve = context.resolve_or_missingz!undefined = environment.undefinedzif 0: yield NoneN)r�   )r'   r,   r,   r-   Úwrite_commons]  s    

zCodeGenerator.write_commonsc             C   s   | j j|jjƒ ƒ dS )aQ  Pushes all parameter targets from the given frame into a local
        stack that permits tracking of yet to be assigned parameters.  In
        particular this enables the optimization from `visit_Name` to skip
        undefined expressions for parameters in macros as macros can reference
        otherwise unbound parameters.
        N)rŠ   r    rZ   Zdump_param_targets)r'   r)   r,   r,   r-   rÆ   f  s    z(CodeGenerator.push_parameter_definitionsc             C   s   | j jƒ  dS )z+Pops the current parameter definitions set.N)rŠ   Úpop)r'   r,   r,   r-   rÈ   o  s    z'CodeGenerator.pop_parameter_definitionsc             C   s   | j r| j d j|ƒ dS )z€Marks a parameter in the current parameter definitions as stored.
        This will skip the enforced undefined checks.
        rh   Néÿÿÿÿ)rŠ   rx   )r'   rµ   r,   r,   r-   rÇ   s  s    z#CodeGenerator.mark_parameter_storedc             C   s   | j j|ƒ d S )N)r‹   r    )r'   rµ   r,   r,   r-   Úpush_context_referencez  s    z$CodeGenerator.push_context_referencec             C   s   | j jƒ  d S )N)r‹   rÓ   )r'   r,   r,   r-   Úpop_context_reference}  s    z#CodeGenerator.pop_context_referencec             C   s
   | j d S )Nrh   rÔ   )r‹   )r'   r,   r,   r-   Úget_context_ref€  s    zCodeGenerator.get_context_refc             C   s   | j d }|dkrdS d| S )Nrh   r|   Zresolvez
%s.resolverÔ   )r‹   )r'   rµ   r,   r,   r-   r±   ƒ  s    
zCodeGenerator.get_resolve_funcc             C   s   d| j ƒ | j|ƒf S )Nz%s.derived(%s))r×   rÑ   )r'   r)   r,   r,   r-   Úderive_context‰  s    zCodeGenerator.derive_contextc             C   s   | j s
dS || j d kS )z4Checks if a given target is an undeclared parameter.Frh   rÔ   )rŠ   )r'   rµ   r,   r,   r-   Úparameter_is_undeclared�  s    z%CodeGenerator.parameter_is_undeclaredc             C   s   | j jtƒ ƒ dS )z+Pushes a new layer for assignment tracking.N)r‰   r    rC   )r'   r,   r,   r-   Úpush_assign_tracking•  s    z"CodeGenerator.push_assign_trackingc             C   sú   | j jƒ }|j s| rdS dd„ |D ƒ}t|ƒdkrbtt|ƒƒ}|jj|ƒ}| jd||f ƒ nV| jdƒ x@t	|ƒD ]4\}}|rŒ| j
dƒ |jj|ƒ}| j
d||f ƒ qvW | j
d	ƒ |röt|ƒdkrÜ| jd
|d  ƒ n| jddjtt|ƒƒ ƒ dS )zoPops the topmost level for assignment tracking and updates the
        context variables if necessary.
        Nc             S   s    g | ]}|d d… dkr|‘qS )Nrh   r¹   r,   )r¥   r¡   r,   r,   r-   ú
<listcomp>   s    z5CodeGenerator.pop_assign_tracking.<locals>.<listcomp>rh   zcontext.vars[%r] = %szcontext.vars.update({z, z%r: %sz})zcontext.exported_vars.add(%r)r   z"context.exported_vars.update((%s)))r‰   rÓ   r[   rÃ   ÚnextÚiterrZ   rÁ   r�   rÀ   r™   r³   r   rÍ   )r'   r)   ÚvarsZpublic_namesr5   rÁ   rÊ   r,   r,   r-   Úpop_assign_tracking™  s*    



z!CodeGenerator.pop_assign_trackingc             C   sä  t | j| jƒ}ddlm} | jddjtƒ ƒ | jddj|ƒ ƒ | jjrT| jdƒ | j	 r`dpbd}|j
tjƒd k	}x@|jtjƒD ]0}|j| jkr¦| jd	|j |jƒ || j|j< q‚W xz|jtjƒD ]j}|j| jkrÄ|j}	| jƒ  | j|	< }
d
|	k�r|	jd
dƒ\}}| jd|||
f ƒ qÄ| jd|	|
f ƒ qÄW | jd| j ƒ | jd| jdƒ|f dd� | jƒ  | jƒ  t|ƒ}dt|jd%ƒk�r¢|jjdƒ}| jd| ƒ |jj|ƒ d |_ |_!|�oÆ| j" |_#|�rÚ| jdƒ | j$|ƒ | j%|jƒ | j&|j|ƒ | j'|dd� | j(ƒ  |�r¤| j"�s4| jƒ  | jdƒ | jƒ  t)�rZ| jj �rZ| jdƒ n8| jd| jj�rpd�prd ƒ | jƒ  | jdƒ | j(ƒ  | j(d| j"  ƒ xöt*| jƒD ]è\}}| jd| jd| ƒ|f |dƒ | jƒ  | jƒ  t|ƒ}t|jd&ƒ}d|k�r |jjdƒ}| jd| ƒ d|k�rJ|jjdƒ}| jd|||f ƒ |jj|ƒ ||_+| j$|ƒ | j%|jƒ | j&|j|ƒ | j'|dd� | j(ƒ  �q°W | jddjd d!„ | jD ƒƒ dd� | jd"d#jd$d!„ | j,D ƒƒ ƒ d S )'Nr   )Ú__all__zfrom __future__ import %sz, zfrom jinja2.runtime import zOfrom jinja2.asyncsupport import auto_await, auto_aiter, make_async_loop_contextz, environment=environmentÚ zblock %r defined twiceÚ.rh   zfrom %s import %s as %szimport %s as %sz	name = %rz%s(context, missing=missing%s):Úroot)r£   r'   z%s = TemplateReference(context)Tzparent_template = None)r¸   zif parent_template is not None:z4yield from parent_template.root_render_func(context)z9%sfor event in parent_template.root_render_func(context):zasync zyield eventZblock_Úsuperz %s = context.super(%r, block_%s)zblocks = {%s}c             s   s   | ]}d ||f V  qdS )z%r: block_%sNr,   )r¥   r¡   r,   r,   r-   r¦   #  s   z/CodeGenerator.visit_Template.<locals>.<genexpr>zdebug_info = %rú&c             s   s   | ]}d | V  qdS )z%s=%sNr,   )r¥   r¡   r,   r,   r-   r¦   (  s    )r'   )r'   rä   )-r   r4   r5   Zjinja2.runtimerà   r�   r³   Úcode_featuresr»   r7   Úfindr   ZExtendsÚfind_allZBlockr~   rŽ   r�   ZImportedNameÚ
importnamer}   r�   Úrsplitr¼   r‘   rÒ   rX   rO   rÂ   rZ   rÅ   r¿   r[   r\   r€   r]   r·   r¯   rž   rº   r’   Úsupports_yield_fromr   r_   r‚   )r'   r(   r)   r#   ZexportedZenvenvZhave_extendsr_   Úimport_ZimpÚaliasÚmoduleÚobjrÁ   r5   Úblock_framerL   r,   r,   r-   Úvisit_Template·  s     








zCodeGenerator.visit_Templatec             C   sÔ   d}|j r8| jrdS | jdkr8| jdƒ | jƒ  |d7 }|jrJ| j|ƒ}n| jƒ }tr‚| j	j
 r‚|jdkr‚| jd|j|f |ƒ nD| j	j
rŽdp�d}| jd||j|f |ƒ | jƒ  | jd	|ƒ | jƒ  | j|ƒ dS )
z.Call a block and register it for the template.r   Nzif parent_template is None:rh   z$yield from context.blocks[%r][0](%s)z	async forÚforz&%s event in context.blocks[%r][0](%s):Úevent)r[   r€   r   r�   r‘   ZscopedrØ   r×   rë   r4   r»   r^   r5   rœ   r’   )r'   r(   r)   rY   r|   Úloopr,   r,   r-   ru   +  s,    


zCodeGenerator.visit_Blockc             C   sÊ   |j s| jd|jƒ | jdkrZ| js6| jdƒ | jƒ  | jdd ƒ | jrRtƒ ‚n| jƒ  | jd|ƒ | j	|j
|ƒ | jd| j ƒ | jdt ƒ | jƒ  | jd	ƒ | jƒ  |jr¸d
| _|  jd7  _dS )zCalls the extender.z,cannot use extend from a non top-level scoper   zif parent_template is not None:zraise TemplateRuntimeError(%r)zextended multiple timesz+parent_template = environment.get_template(z, %r)z6for name, parent_block in parent_template.blocks.%s():z8context.blocks.setdefault(name, []).append(parent_block)Trh   N)r[   rŽ   r�   r   r€   r�   r‘   rz   r’   r&   Útemplater™   r5   Údict_item_iterr\   )r'   r(   r)   r,   r,   r-   Úvisit_ExtendsK  s.    


zCodeGenerator.visit_Extendsc             C   s‚  |j r| jdƒ | jƒ  d}t|jtjƒrVt|jjtƒr>d}qnt|jjt	t
fƒrnd}nt|jtjtjfƒrnd}| jd| |ƒ | j|j|ƒ | jd| j ƒ |j rà| jƒ  | jdƒ | jƒ  | jdƒ | jƒ  | jd	ƒ | jƒ  d
}|j�r| jjrødpúd}| jd|| j|ƒf ƒ n6| jj�r,| jdƒ n t�rB| jdƒ d}n
| jdƒ |�sn| jƒ  | jd|ƒ | jƒ  |j �r~| jƒ  dS )zHandles includes.ztry:Zget_or_select_templateZget_templateZselect_templateztemplate = environment.%s(z, %r)zexcept TemplateNotFound:r�   zelse:Fz	async forrò   zY%s event in template.root_render_func(template.new_context(context.get_all(), True, %s)):zGfor event in (await template._get_default_module_async())._body_stream:z6yield from template._get_default_module()._body_streamTz9for event in template._get_default_module()._body_stream:ró   N)Zignore_missingr�   r‘   r0   rõ   r   ZConstrG   r   rA   rB   ZTupleZListr&   r™   r5   r’   Úwith_contextr4   r»   rÑ   rë   rœ   )r'   r(   r)   Ú	func_nameZskip_event_yieldrô   r,   r,   r-   Úvisit_Includez  sN    






zCodeGenerator.visit_Includec             C   sÜ   | j d|jj|jƒ |ƒ |jr0| jd|j ƒ | jjrB| jdƒ | jdƒ | j|j	|ƒ | jd| j
 ƒ |jr–| jd| jjr‚dp„d| j|ƒf ƒ n| jjrª| jd	ƒ n
| jd
ƒ |jrØ|jjdƒ rØ| j d|j ƒ dS )zVisit regular imports.z%s = zcontext.vars[%r] = zawait zenvironment.get_template(z, %r).z*make_module%s(context.get_all(), True, %s)Ú_asyncrá   z_get_default_module_async()z_get_default_module()r¹   z!context.exported_vars.discard(%r)N)r�   rZ   rÁ   rµ   r[   r™   r4   r»   r&   rõ   r5   rø   rÑ   Ú
startswith)r'   r(   r)   r,   r,   r-   Úvisit_Import°  s"    


zCodeGenerator.visit_Importc                sî  | j |ƒ | jd| jjrdpd ƒ | j|jˆ ƒ | jd| j ƒ |jrn| jd| jjrZdp\d| jˆ ƒf ƒ n| jjr‚| jdƒ n
| jdƒ g }g }x¸|j	D ]®}t
|tƒr´|\}}n|}| jd	ˆ jj|ƒ|f ƒ | jd
ˆ jj|ƒ ƒ | jƒ  | jdˆ jj|ƒd| j|ƒt|ƒf |f ƒ | jƒ  ˆ jrœ|j|ƒ |jdƒsœ|j|ƒ qœW |�r¨t|ƒdk�r†|d }| jd|ˆ jj|ƒf ƒ n"| jddj‡ fdd„|D ƒƒ ƒ |�rêt|ƒdk�rÐ| jd|d  ƒ n| jddjtt|ƒƒ ƒ dS )zVisit named imports.z/included_template = %senvironment.get_template(zawait rá   z, %r).z*make_module%s(context.get_all(), True, %s)rû   z_get_default_module_async()z_get_default_module()z,%s = getattr(included_template, %r, missing)zif %s is missing:z9%s = undefined(%r %% included_template.__name__, name=%r)zGthe template %%r (imported on %s) does not export the requested name %sr¹   rh   r   zcontext.vars[%r] = %szcontext.vars.update({%s})z, c             3   s"   | ]}d |ˆ j j|ƒf V  qdS )z%r: %sN)rZ   rÁ   )r¥   r5   )r)   r,   r-   r¦   ö  s    z1CodeGenerator.visit_FromImport.<locals>.<genexpr>z!context.exported_vars.discard(%r)z-context.exported_vars.difference_update((%s))N)r¢   r™   r4   r»   r&   rõ   r5   rø   rÑ   rM   r0   rA   r�   rZ   rÁ   r‘   rÐ   rÍ   r’   r[   r    rü   rÃ   r³   r   )r'   r(   r)   Z	var_namesZdiscarded_namesr5   rí   r,   )r)   r-   Úvisit_FromImportÅ  s\    









zCodeGenerator.visit_FromImportc             C   sV  |j ƒ }|j ƒ }|j ƒ }|jp2dt|jd%d�d&ƒk}d }|rH|jjdƒ}|jj|dd� |jrn|jj|dd� |j�rl| j	ƒ }|jj|dd� | j
d| j|ƒ |jƒ | jƒ  | j|ƒ | j
| jjrÈdpÊd	ƒ | j|j|ƒ | jd
ƒ | j| jjrödpødƒ | jdƒ | jƒ  | j
d|jƒ | j|j|ƒ | jdƒ | jƒ  | j
dƒ | j|j|ƒ | jdƒ | j|dd� |j�r¤| j
d| jdƒ |ƒ | jƒ  | j|ƒ |j|_|�r¸| j
d| ƒ x<|jtjƒD ],}	|	jdk�rÆ|	jdk�rÆ| jd|	jƒ �qÆW |j�r| j	ƒ }
| j
d|
 ƒ | j
| jj�r(d�p*d	|ƒ | j|j|ƒ |�rn| jj�r^| jd| ƒ n| jd| ƒ n
| jd
ƒ |j�rŽ| jd| ƒ |j�r¢| jdƒ nF| jj�r¾| �r¾| jdƒ | j|j|ƒ | jj�rè| �rè| jdƒ |j�rú| jdƒ |j�r| jdƒ n| j|�rd�p dƒ | jƒ  | j|ƒ | j|j|ƒ |j�rZ| j
d |
 ƒ | jƒ  | j||j�ov|j d� |j�rÄ| j
d!|
 ƒ | jƒ  | j|ƒ | j|j|ƒ | j|ƒ | jƒ  |j�rR| j |ƒ | jƒ  | j!||ƒ | jj�rþ| jd"ƒ | jd#ƒ | jj�r| jdƒ | j|j|ƒ | jj�r>| jdƒ | jd$ƒ | j"|ƒ d S )'Nrô   rÂ   )Zonly)Z
for_branchÚelseÚtestz
%s(fiter):z
async for zfor z in zauto_aiter(fiter)Zfiterú:zif zyield é   T)r¸   z'%s(reciter, loop_render_func, depth=0):z%s = missingÚstorez8Can't assign to special loop variable in for-loop targetz%s = 1z&, %s in await make_async_loop_context(z, %s in LoopContext(z%s(Zreciterzauto_aiter(r˜   z&, undefined, loop_render_func, depth):z, undefined):z%s = 0zif %s:zawait zloop(z, loop))rÂ   )rô   )#rj   Ú	recursiverO   Ziter_child_nodesrZ   rÅ   r¿   Úelse_r   r�   r�   r¼   r‘   r·   r4   r»   r&   rµ   r™   r’   rº   r^   rè   r   ÚNamerw   r5   rŽ   r�   rÝ   rž   rÂ   r•   r—   rš   )r'   r(   r)   Z
loop_frameZ
test_frameZ
else_frameZextended_loopZloop_refZloop_filter_funcr5   Ziteration_indicatorr,   r,   r-   Ú	visit_For   sÂ    























zCodeGenerator.visit_Forc             C   sÎ   |j ƒ }| jd|ƒ | j|j|ƒ | jdƒ | jƒ  | j|j|ƒ | jƒ  xP|j	D ]F}| jd|ƒ | j|j|ƒ | jdƒ | jƒ  | j|j|ƒ | jƒ  qRW |j
rÊ| jdƒ | jƒ  | j|j
|ƒ | jƒ  d S )Nzif r  zelif zelse:)rk   r�   r&   r   r™   r‘   rž   rÂ   r’   Úelif_r  )r'   r(   r)   Zif_framer  r,   r,   r-   Úvisit_If‚  s&    


zCodeGenerator.visit_Ifc             C   s€   | j ||ƒ\}}| jƒ  |jrX|jjdƒs:| jd|j ƒ |jj|jƒ}| jd|j ƒ | jd|jj|jƒ ƒ | j	||ƒ d S )Nr¹   zcontext.exported_vars.add(%r)zcontext.vars[%r] = z%s = )
rÌ   r¢   r[   r5   rü   r™   rZ   rÁ   r�   rÏ   )r'   r(   r)   Zmacro_framerÉ   rÁ   r,   r,   r-   Úvisit_Macro—  s    zCodeGenerator.visit_Macroc             C   sR   | j ||ƒ\}}| jdƒ | j||ƒ | j||ƒ | j|j|dd� | j|ƒ d S )Nz	caller = T)Úforward_caller)rÌ   r�   rÏ   r—   Ú
visit_CallZcallrš   )r'   r(   r)   Z
call_framerÉ   r,   r,   r-   Úvisit_CallBlock¢  s    
zCodeGenerator.visit_CallBlockc             C   sh   |j ƒ }|jj|ƒ | j|ƒ | j|ƒ | j|j|ƒ | j||ƒ | j|j	|ƒ | j
|ƒ | j|ƒ d S )N)rj   rZ   r¿   r·   r^   rž   rÂ   r—   rs   Úfilterrš   rº   )r'   r(   r)   Zfilter_framer,   r,   r-   Úvisit_FilterBlockª  s    


zCodeGenerator.visit_FilterBlockc             C   sˆ   |j ƒ }|jj|ƒ | j|ƒ xLtt|j|jƒƒD ]6\}\}}| jƒ  | j	||ƒ | j
dƒ | j	||ƒ q2W | j|j|ƒ | j|ƒ d S )Nz = )rj   rZ   r¿   r·   rÀ   r   ZtargetsÚvaluesr¢   r&   r™   rž   rÂ   rº   )r'   r(   r)   Z
with_framerÊ   rµ   Úexprr,   r,   r-   Ú
visit_Withµ  s    
 
zCodeGenerator.visit_Withc             C   s   | j |ƒ | j|j|ƒ d S )N)r¢   r&   r(   )r'   r(   r)   r,   r,   r-   Úvisit_ExprStmtÁ  s    
zCodeGenerator.visit_ExprStmtc                s¬  ˆ j r|jrd S d}ˆ jjrjˆ jj}t|ddƒs<t|ddƒrBd}qnt|ddƒr\‡ fdd„}qn‡ fdd„}nt}d}|jrŽˆ jd	ƒ ˆ jƒ  d}g }xØ|jD ]Î}y|s¬tj	ƒ ‚|j
|jƒ}	W n" tj	k
rÜ   |j|ƒ wšY nX y4|jj�rt|	d
ƒ�r |	jƒ }	nt|	ƒ}	||	ƒ}	W n" tk
�r4   |j|ƒ wšY nX |�r\t|d  tƒ�r\|d! j|	ƒ qš|j|	gƒ qšW t|ƒdk �s†|jd k	�r"|jd k	�rÊt|ƒdk�r²ˆ jd|j ƒ nˆ jd|j ƒ ˆ jƒ  �x|D �]}
t|
tƒ�rtt|
ƒƒ}|jd k�rˆ jd| ƒ nˆ j|d ƒ nÊ|jd k�r6ˆ jd|
ƒ n
ˆ j|
ƒ d}|jj�rZˆ jdƒ n |jj�rpˆ jdƒ n
ˆ jdƒ ˆ jjd k	�r¶ˆ jdƒ tˆ jjddƒ�r®ˆ jdƒ |d7 }ˆ j|
|ƒ ˆ jd| ƒ |jd k	�rÒˆ jdƒ �qÒW |jd k	�ršˆ jƒ  ˆ jt|ƒdk�rd�pdƒ �nxg }g }xF|D ]>}
t|
tƒ�rX|jt|
ƒjddƒƒ n|jdƒ |j|
ƒ �q0W ˆ jdƒ ˆ jtt|ƒƒd ƒ ˆ jƒ  xì|D ]ä}ˆ j|ƒ d}|jj�rÐˆ jdƒ |d7 }n|jj�rìˆ jdƒ |d7 }ˆ jjd k	�rdˆ jdƒ tˆ jjddƒ�r"ˆ jdƒ n:tˆ jjddƒ�r@ˆ jdƒ ntˆ jjddƒ�r\ˆ jdƒ |d7 }ˆ j||ƒ ˆ jd| d ƒ �q W ˆ jƒ  ˆ jdƒ |�r¨ˆ jƒ  d S )"NTZcontextfunctionFZevalcontextfunctionZenvironmentfunctionc                s   t ˆ jjˆ j| ƒƒS )N)r   r4   Úfinalize)r¡   )r'   r,   r-   Ú<lambda>Ò  s   z,CodeGenerator.visit_Output.<locals>.<lambda>c                s   t ˆ jj| ƒƒS )N)r   r4   r  )r¡   )r'   r,   r-   r  Õ  s    zif parent_template is None:Ú__html__rh   r  z
%s.append(z%s.extend((zyield rÎ   z7(escape if context.eval_ctx.autoescape else to_string)(zescape(z
to_string(zenvironment.finalize(z	context, r˜   z))ú%z%%z%sz % (r   zcontext.eval_ctx, zenvironment, z, rÔ   rÔ   )r€   r]   r4   r  r­   r   r�   r‘   r   Ú
ImpossibleÚas_constr#   r    r“   Úhasattrr  r   Ú	Exceptionr0   rB   rÃ   r^   rÍ   r   r¢   r$   r™   r&   r’   Úreplace)r'   r(   r)   Zallow_constant_finalizer¼   r  Zoutdent_laterrÂ   ÚchildÚconstrH   ÚvalÚcloseÚformatZ	argumentsZargumentr,   )r'   r-   Úvisit_OutputÅ  sÚ    











"















zCodeGenerator.visit_Outputc             C   sF   | j ƒ  | j|ƒ | j|j|ƒ | jdƒ | j|j|ƒ | j|ƒ d S )Nz = )rÚ   r¢   r&   rµ   r™   r(   rß   )r'   r(   r)   r,   r,   r-   Úvisit_AssignV  s    

zCodeGenerator.visit_Assignc             C   s²   | j ƒ  |jƒ }d|_|jj|ƒ | j|ƒ | j|ƒ | j|j|ƒ | j	|ƒ | j
|j|ƒ | jdƒ |jd k	r€| j|j|ƒ n| jd|j ƒ | jdƒ | j|ƒ | j|ƒ d S )NFz9 = (Markup if context.eval_ctx.autoescape else identity)(z
concat(%s)r˜   )rÚ   rj   r]   rZ   r¿   r·   r^   rž   rÂ   r¢   r&   rµ   r™   r  rs   rß   rº   )r'   r(   r)   rð   r,   r,   r-   Úvisit_AssignBlock^  s     






zCodeGenerator.visit_AssignBlockc             C   s”   |j dkr(|jr(| jr(| jd j|jƒ |jj|jƒ}|j dkr†|jj|ƒ}|d k	oj|d tkoj| j	|ƒ s†| j
d|j||f ƒ d S | j
|ƒ d S )Nr  rh   rv   r   z-(undefined(name=%r) if %s is missing else %s)rÔ   )rw   r[   r‰   rr   r5   rZ   rÁ   Z	find_loadr   rÙ   r™   )r'   r(   r)   rÁ   rv   r,   r,   r-   ry   w  s    
zCodeGenerator.visit_Namec             C   sR   |j j|jƒ}| jd| ƒ | jƒ  | jdd ƒ | jƒ  | jd||jf ƒ d S )Nz!if not isinstance(%s, Namespace):zraise TemplateRuntimeError(%r)z/cannot assign attribute on non-namespace objectz%s[%r])rZ   rÁ   r5   r�   r‘   r’   Úattr)r'   r(   r)   rÁ   r,   r,   r-   Úvisit_NSRefŠ  s    zCodeGenerator.visit_NSRefc             C   s8   |j |jƒ}t|tƒr&| jt|ƒƒ n| jt|ƒƒ d S )N)r  r#   r0   r?   r™   ÚstrrÍ   )r'   r(   r)   r  r,   r,   r-   Úvisit_Const–  s    
zCodeGenerator.visit_Constc             C   sF   y| j t|j|jƒƒƒ W n& tjk
r@   | j d|j ƒ Y nX d S )Nz9(Markup if context.eval_ctx.autoescape else identity)(%r))r™   rÍ   r  r#   r   r  Údata)r'   r(   r)   r,   r,   r-   Úvisit_TemplateData�  s
    z CodeGenerator.visit_TemplateDatac             C   sZ   | j dƒ d}x0t|jƒD ]"\}}|r0| j dƒ | j||ƒ qW | j |dkrPdpRdƒ d S )Nú(rh   z, r   z,)r˜   rÔ   )r™   rÀ   r!   r&   )r'   r(   r)   rÊ   rH   r,   r,   r-   Úvisit_Tuple¤  s    

zCodeGenerator.visit_Tuplec             C   sJ   | j dƒ x0t|jƒD ]"\}}|r,| j dƒ | j||ƒ qW | j dƒ d S )Nú[z, ú])r™   rÀ   r!   r&   )r'   r(   r)   rÊ   rH   r,   r,   r-   Ú
visit_List­  s    

zCodeGenerator.visit_Listc             C   sd   | j dƒ xJt|jƒD ]<\}}|r,| j dƒ | j|j|ƒ | j dƒ | j|j|ƒ qW | j dƒ d S )Nú{z, z: r§   )r™   rÀ   r!   r&   rI   rG   )r'   r(   r)   rÊ   rH   r,   r,   r-   Ú
visit_Dictµ  s    


zCodeGenerator.visit_Dictc                s   t ‡ fdd„ƒ}|S )Nc                sŒ   | j jrJˆ | j jkrJ| jdˆ  ƒ | j|j|ƒ | jdƒ | j|j|ƒ n4| jdƒ | j|j|ƒ | jdˆ  ƒ | j|j|ƒ | jdƒ d S )Nz$environment.call_binop(context, %r, z, r+  z %s r˜   )r4   Ú	sandboxedZintercepted_binopsr™   r&   ÚleftÚright)r'   r(   r)   )Úoperatorr,   r-   rN   À  s    

z$CodeGenerator.binop.<locals>.visitor)r/   )r5  ÚinterceptablerN   r,   )r5  r-   Úbinop¿  s    zCodeGenerator.binopc                s   t ‡ fdd„ƒ}|S )Nc                s\   | j jr2ˆ | j jkr2| jdˆ  ƒ | j|j|ƒ n| jdˆ  ƒ | j|j|ƒ | jdƒ d S )Nz#environment.call_unop(context, %r, r+  r˜   )r4   r2  Zintercepted_unopsr™   r&   r(   )r'   r(   r)   )r5  r,   r-   rN   Ñ  s    z#CodeGenerator.uaop.<locals>.visitor)r/   )r5  r6  rN   r,   )r5  r-   ÚuaopÐ  s    
zCodeGenerator.uaopú+ú-Ú*ú/z//z**r  Úand)r6  Úorznot c             C   sb   |j jrd}n|j jrd}nd}| jd| ƒ x$|jD ]}| j||ƒ | jdƒ q6W | jdƒ d S )Nz;(context.eval_ctx.volatile and markup_join or unicode_join)Zmarkup_joinZunicode_joinz%s((z, z)))r#   r$   r“   r™   r   r&   )r'   r(   r)   rù   r«   r,   r,   r-   Úvisit_Concatë  s    zCodeGenerator.visit_Concatc             C   s.   | j |j|ƒ x|jD ]}| j ||ƒ qW d S )N)r&   r  Zops)r'   r(   r)   Úopr,   r,   r-   Úvisit_Compareú  s    zCodeGenerator.visit_Comparec             C   s&   | j dt|j  ƒ | j|j|ƒ d S )Nz %s )r™   Ú	operatorsr@  r&   r  )r'   r(   r)   r,   r,   r-   Úvisit_Operand   s    zCodeGenerator.visit_Operandc             C   s,   | j dƒ | j|j|ƒ | j d|j ƒ d S )Nzenvironment.getattr(z, %r))r™   r&   r(   r%  )r'   r(   r)   r,   r,   r-   Úvisit_Getattr  s    
zCodeGenerator.visit_Getattrc             C   s~   t |jtjƒr@| j|j|ƒ | jdƒ | j|j|ƒ | jdƒ n:| jdƒ | j|j|ƒ | jdƒ | j|j|ƒ | jdƒ d S )Nr-  r.  zenvironment.getitem(z, r˜   )r0   r«   r   ZSlicer&   r(   r™   )r'   r(   r)   r,   r,   r-   Úvisit_Getitem
  s    


zCodeGenerator.visit_Getitemc             C   s`   |j d k	r| j|j |ƒ | jdƒ |jd k	r:| j|j|ƒ |jd k	r\| jdƒ | j|j|ƒ d S )Nr  )Ústartr&   r™   Ústopr–   )r'   r(   r)   r,   r,   r-   Úvisit_Slice  s    




zCodeGenerator.visit_Slicec             C   s,  | j jr| jdƒ | j| j|j d ƒ | j jj|jƒ}|d krT| jd|j |jƒ t|ddƒrl| jdƒ n.t|ddƒr„| jdƒ nt|d	dƒrš| jd
ƒ |j	d k	r´| j
|j	|ƒ nJ|jjrÔ| jd|j|jf ƒ n*|jjrî| jd|j ƒ n| jd|j ƒ | j||ƒ | jdƒ | j j�r(| jdƒ d S )Nzawait auto_await(r+  zno filter named %rZcontextfilterFz	context, Zevalcontextfilterzcontext.eval_ctx, Zenvironmentfilterzenvironment, zB(context.eval_ctx.autoescape and Markup(concat(%s)) or concat(%s))zMarkup(concat(%s))z
concat(%s)r˜   )r4   r»   r™   ro   r5   ÚgetrŽ   r�   r­   r(   r&   r#   r$   r^   r“   r¬   )r'   r(   r)   r¼   r,   r,   r-   rs   #  s0    




zCodeGenerator.visit_Filterc             C   s`   | j | j|j d ƒ |j| jjkr8| jd|j |jƒ | j|j|ƒ | j||ƒ | j dƒ d S )Nr+  zno test named %rr˜   )	r™   rp   r5   r4   rŽ   r�   r&   r(   r¬   )r'   r(   r)   r,   r,   r-   rt   C  s    zCodeGenerator.visit_Testc                s^   ‡ ‡‡fdd„}ˆj dƒ ˆjˆjˆ ƒ ˆj dƒ ˆjˆjˆ ƒ ˆj dƒ |ƒ  ˆj dƒ d S )Nc                  s4   ˆj d k	rˆjˆj ˆ ƒS ˆjddˆjˆƒ  ƒ d S )Nzundefined(%r)zRthe inline if-expression on %s evaluated to false and no else section was defined.)Zexpr2r&   r™   rÐ   r,   )r)   r(   r'   r,   r-   Úwrite_expr2N  s    
z1CodeGenerator.visit_CondExpr.<locals>.write_expr2r+  z if z else r˜   )r™   r&   Zexpr1r   )r'   r(   r)   rJ  r,   )r)   r(   r'   r-   Úvisit_CondExprL  s    


zCodeGenerator.visit_CondExprc             C   s|   | j jr| jdƒ | j jr&| jdƒ n
| jdƒ | j|j|ƒ |rJddipLd }| j|||ƒ | jdƒ | j jrx| jdƒ d S )Nzawait auto_await(zenvironment.call(context, zcontext.call(r½   r˜   )r4   r»   r™   r2  r&   r(   r¬   )r'   r(   r)   r  rª   r,   r,   r-   r  ]  s    


zCodeGenerator.visit_Callc             C   s"   | j |jd ƒ | j|j|ƒ d S )Nú=)r™   rI   r&   rG   )r'   r(   r)   r,   r,   r-   Úvisit_Keywordl  s    zCodeGenerator.visit_Keywordc             C   s&   | j dƒ | j|j|ƒ | j dƒ d S )NzMarkup(r˜   )r™   r&   r  )r'   r(   r)   r,   r,   r-   Úvisit_MarkSafer  s    
zCodeGenerator.visit_MarkSafec             C   s&   | j dƒ | j|j|ƒ | j dƒ d S )Nz5(context.eval_ctx.autoescape and Markup or identity)(r˜   )r™   r&   r  )r'   r(   r)   r,   r,   r-   Úvisit_MarkSafeIfAutoescapew  s    
z(CodeGenerator.visit_MarkSafeIfAutoescapec             C   s   | j d|j ƒ d S )Nzenvironment.)r™   r5   )r'   r(   r)   r,   r,   r-   Úvisit_EnvironmentAttribute|  s    z(CodeGenerator.visit_EnvironmentAttributec             C   s   | j d|j|jf ƒ d S )Nzenvironment.extensions[%r].%s)r™   Z
identifierr5   )r'   r(   r)   r,   r,   r-   Úvisit_ExtensionAttribute  s    z&CodeGenerator.visit_ExtensionAttributec             C   s   | j | j|j ƒ d S )N)r™   r}   ré   )r'   r(   r)   r,   r,   r-   Úvisit_ImportedName‚  s    z CodeGenerator.visit_ImportedNamec             C   s   | j |jƒ d S )N)r™   r5   )r'   r(   r)   r,   r,   r-   Úvisit_InternalName…  s    z CodeGenerator.visit_InternalNamec             C   s   | j dƒ d S )Nr|   )r™   )r'   r(   r)   r,   r,   r-   Úvisit_ContextReferenceˆ  s    z$CodeGenerator.visit_ContextReferencec             C   s   | j d|ƒ d S )NÚcontinue)r�   )r'   r(   r)   r,   r,   r-   Úvisit_Continue‹  s    zCodeGenerator.visit_Continuec             C   s   | j d|ƒ d S )NÚbreak)r�   )r'   r(   r)   r,   r,   r-   Úvisit_BreakŽ  s    zCodeGenerator.visit_Breakc             C   s:   |j ƒ }|jj|ƒ | j|ƒ | j|j|ƒ | j|ƒ d S )N)rj   rZ   r¿   r·   rž   rÂ   rº   )r'   r(   r)   Úscope_framer,   r,   r-   Úvisit_Scope‘  s
    
zCodeGenerator.visit_Scopec             C   sŒ   | j ƒ }| jd|| j|ƒf ƒ | jd| ƒ | j|j|ƒ | j|ƒ |jdd�}|jj|ƒ | j	|ƒ | j
|j|ƒ | j|ƒ | jƒ  d S )Nz%s = %sz
%s.vars = T)ri   )r�   r�   rØ   r&   r|   rÕ   rj   rZ   r¿   r·   rž   rÂ   rº   rÖ   )r'   r(   r)   rw   rY  r,   r,   r-   Úvisit_OverlayScope˜  s    


z CodeGenerator.visit_OverlayScopec             C   st   xn|j D ]d}| jd|j ƒ | j|j|ƒ y|jj|jƒ}W n tjk
rZ   d|j_	Y qX t
|j|j|ƒ qW d S )Nzcontext.eval_ctx.%s = T)Zoptionsr�   rI   r&   rG   r  r#   r   r  r$   Úsetattr)r'   r(   r)   Úkeywordr  r,   r,   r-   Úvisit_EvalContextModifier¦  s    z'CodeGenerator.visit_EvalContextModifierc             C   sf   | j ƒ }|jjƒ }| jd| ƒ | j||ƒ x|jD ]}| j||ƒ q4W |jj|ƒ | jd| ƒ d S )Nz%s = context.eval_ctx.save()zcontext.eval_ctx.revert(%s))r�   r#   Zsaver�   r^  rÂ   r&   Zrevert)r'   r(   r)   Zold_ctx_nameZ	saved_ctxr  r,   r,   r-   Úvisit_ScopedEvalContextModifier±  s    
z-CodeGenerator.visit_ScopedEvalContextModifier)NFT)F)rh   )N)N)Nr   )Nr   )N)F)N)T)T)F)drU   rV   rW   rT   rŽ   r�   r^   r•   r‘   r’   r—   rš   rœ   rž   r™   r�   r¢   r¬   r¯   r·   rº   r¼   rÌ   rÏ   rÐ   rÑ   rÒ   rÆ   rÈ   rÇ   rÕ   rÖ   r×   r±   rØ   rÙ   rÚ   rß   rñ   ru   r÷   rú   rý   rþ   r  r	  r
  r  r  r  r  r"  r#  r$  ry   r&  r(  r*  r,  r/  r1  r7  r8  Z	visit_AddZ	visit_SubZ	visit_MulZ	visit_DivZvisit_FloorDivZ	visit_PowZ	visit_ModZ	visit_AndZvisit_OrZ	visit_PosZ	visit_NegZ	visit_Notr/   r?  rA  rC  rD  rE  rH  rs   rt   rK  r  rM  rN  rO  rP  rQ  rR  rS  rT  rV  rX  rZ  r[  r^  r_  r,   r,   r,   r-   r{   ô   sÊ    
B






5
M		
t /6;  	



 	r{   )NFT)=rl   Ú	itertoolsr   rf   r   r]  r   r¨   Ú	functoolsr   Zjinja2r   Zjinja2.nodesr   Zjinja2.visitorr   Zjinja2.optimizerr	   Zjinja2.exceptionsr
   Zjinja2.utilsr   r   r   Zjinja2._compatr   r   r   r   r   r   r   Zjinja2.idtrackingr   r   r   r   r   rB  r  rF   rö   ræ   Úexecr    ÚSyntaxErrorrë   r/   r9   rE   rO   ra   rP   rX   ÚRuntimeErrorrK   rn   rJ   r  rz   r{   r,   r,   r,   r-   Ú<module>
   s\   $

 
	>