3
[ð]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   Únotinr   ÚitemsÚdivisionz%from __future__ import generator_stopÚ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ÚkwargsÚnew_node)Úf© ú1/tmp/pip-build-w1as9q70/Jinja2/jinja2/compiler.pyÚnew_func@   s
    zoptimizeconst.<locals>.new_func)r   )r/   r2   r0   )r/   r1   Úoptimizeconst?   s    r3   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   ÚTemplateÚ	TypeErrorZcode_generator_classr)   ÚstreamÚgetvalue)r+   ÚenvironmentÚnameÚfilenamer7   Ú
defer_initr%   Ú	generatorr0   r0   r1   ÚgenerateJ   s    

r>   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Úkeyr0   r0   r1   rJ   W   s"    
rJ   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+   r0   r0   r1   Úfind_undeclaredl   s    
rT   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+   r0   r0   r1   Ú__init__{   s    zMacroRef.__init__N)Ú__name__Ú
__module__Ú__qualname__rY   r0   r0   r0   r1   rU   y   s   rU   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&   re   r^   r0   r0   r1   rY   …   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__Úupdater_   Úcopy)r*   Úrvr0   r0   r1   rk   ¥   s    z
Frame.copyFc             C   s&   |rt | j| jjd d�S t | j| ƒS )zReturn an inner frame.é   )r^   )r]   r&   r_   r^   )r*   Úisolatedr0   r0   r1   Ú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)rk   ra   )r*   rl   r0   r0   r1   Úsoft²   s    z
Frame.soft)NN)F)	rZ   r[   r\   Ú__doc__rY   rk   ro   rp   Ú__copy__r0   r0   r0   r1   r]   ‚   s   
 
r]   c               @   s   e Zd ZdZdS )rP   z?Exception used by the `UndeclaredNameVisitor` to signal a stop.N)rZ   r[   r\   rq   r0   r0   r0   r1   rP   À   s   rP   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)rH   ÚfiltersÚtests)r*   r0   r0   r1   rY   Ç   s    z DependencyFinderVisitor.__init__c             C   s   | j |ƒ | jj|jƒ d S )N)Úgeneric_visitrt   Úaddr:   )r*   r+   r0   r0   r1   Úvisit_FilterË   s    
z$DependencyFinderVisitor.visit_Filterc             C   s   | j |ƒ | jj|jƒ d S )N)rv   ru   rw   r:   )r*   r+   r0   r0   r1   Ú
visit_TestÏ   s    
z"DependencyFinderVisitor.visit_Testc             C   s   dS )zStop visiting at blocks.Nr0   )r*   r+   r0   r0   r1   Úvisit_BlockÓ   s    z#DependencyFinderVisitor.visit_BlockN)rZ   r[   r\   rq   rY   rx   ry   rz   r0   r0   r0   r1   rs   Ä   s
   rs   c               @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	rO   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)rH   rR   rQ   )r*   rR   r0   r0   r1   rY   Ý   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)Úctxr:   rR   rQ   rw   rP   Údiscard)r*   r+   r0   r0   r1   Ú
visit_Nameá   s
    z UndeclaredNameVisitor.visit_Namec             C   s   dS )zStop visiting a blocks.Nr0   )r*   r+   r0   r0   r1   rz   é   s    z!UndeclaredNameVisitor.visit_BlockN)rZ   r[   r\   rq   rY   r~   rz   r0   r0   r0   r1   rO   ×   s   rO   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)rZ   r[   r\   rq   r0   r0   r0   r1   r   í   s   r   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   rm   TÚcontext)r   r9   r:   r;   r7   Zcreated_block_contextr<   r%   r	   r(   Úimport_aliasesÚblocksÚextends_so_farÚhas_known_extendsÚcode_linenoru   rt   Ú
debug_infoÚ_write_debug_infoÚ
_new_linesÚ
_last_lineÚ_first_writeÚ_last_identifierÚ_indentationÚ_assign_stackÚ_param_def_blockÚ_context_reference_stack)r*   r9   r:   r;   r7   r<   r%   r0   r0   r1   rY   ö   s8    
zCodeGenerator.__init__c             C   s   t ||| j| jƒ‚dS )z*Fail with a :exc:`TemplateAssertionError`.N)r
   r:   r;   )r*   ÚmsgÚlinenor0   r0   r1   Úfail9  s    zCodeGenerator.failc             C   s   |  j d7  _ d| j  S )zGet a new unique identifier.rm   zt_%d)rŒ   )r*   r0   r0   r1   Ú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”   rc   Ú	writeline)r*   r,   r0   r0   r1   rc   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•   Úindentrc   ÚoutdentÚ
autoescape)r*   r,   Úforce_unescapedr0   r0   r1   Úreturn_buffer_contentsG  s    

z$CodeGenerator.return_buffer_contentsc             C   s   |  j d7  _ dS )zIndent by one.rm   N)r�   )r*   r0   r0   r1   r–   Y  s    zCodeGenerator.indentrm   c             C   s   |  j |8  _ dS )zOutdent by step.N)r�   )r*   Ústepr0   r0   r1   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()rc   r•   )r*   r,   r+   r0   r0   r1   Ú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ú))rc   Úwrite)r*   r,   r0   r0   r1   Ú	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+   r0   r0   r1   Ú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)   r   )r*   r   r,   r+   r0   r0   r1   Ú
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‹   r7   rž   r†   rˆ   r‡   Úappendr�   )r*   Úxr0   r0   r1   rž   ~  s    


zCodeGenerator.writer   c             C   s   | j ||ƒ | j|ƒ dS )z!Combination of newline and write.N)Únewlinerž   )r*   r¦   r+   Úextrar0   r0   r1   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.rm   N)Úmaxr‰   r’   rŠ   rˆ   )r*   r+   r¨   r0   r0   r1   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)rN   )Ú.0r¦   r0   r0   r1   ú	<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_kwargsrN   rL   )	r*   r+   r,   Úextra_kwargsZkwarg_workaroundÚkwargÚargrN   rL   r0   r0   r1   Ú	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.rt   ru   z%s = environment.%s[%r]N)rt   ru   )rs   r)   Úgetattrr”   r•   )r*   r   rS   r+   Ú
dependencyÚmappingr:   r0   r0   r1   Ú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   r_   Úloadsr   r   r•   Úget_resolve_funcr   r   r¥   ÚNotImplementedErrorÚjoin)r*   r,   ÚundefsÚtargetÚactionÚparamr0   r0   r1   Ú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   r_   r·   r¥   r•   rº   )r*   r,   Úwith_python_scoper»   r¼   Ú_r0   r0   r1   Úleave_frameì  s    zCodeGenerator.leave_framec             C   s   | j jrd| S d| S )Nzasync def %szdef %s)r9   Úis_async)r*   r:   r0   r0   r1   Ú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):Ú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Æ   )%ro   r_   Úanalyze_noderU   rH   Ú	enumerater®   r:   rw   r¥   ÚrefrT   ÚbodyÚdefaultsÚlenÚ
IndexErrorr“   r’   Údeclare_parameterrV   rW   rX   rb   r•   rÄ   rº   r–   rc   r¿   Úpush_parameter_definitionsr)   Úmark_parameter_storedr—   Úpop_parameter_definitionsr£   rš   rÂ   )r*   r+   r,   Ú	macro_refZexplicit_callerZskip_special_paramsr®   Úidxr±   rQ   rÊ   Údefaultr0   r0   r1   Ú
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)Úreprr:   )rª   r¦   r0   r0   r1   r«   H  s    z*CodeGenerator.macro_def.<locals>.<genexpr>r:   Nrm   ú,zLMacro(environment, macro, %r, (%s), %r, %r, %r, context.eval_ctx.autoescape))	rº   r+   r®   r³   rÍ   rž   rW   rX   rV   )r*   rÓ   r,   Z	arg_tupler:   r0   r0   r1   Ú	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’   r:   r×   )r*   r+   rl   r0   r0   r1   Ú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: %sNr0   )rª   r:   r¼   r0   r0   r1   r«   Z  s    z3CodeGenerator.dump_local_context.<locals>.<genexpr>)rº   r   r_   Zdump_stores)r*   r,   r0   r0   r1   Ú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*   r0   r0   r1   Ú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¥   r_   Zdump_param_targets)r*   r,   r0   r0   r1   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*   r0   r0   r1   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.
        rm   Néÿÿÿÿ)r�   r}   )r*   r¼   r0   r0   r1   rÑ   s  s    z#CodeGenerator.mark_parameter_storedc             C   s   | j j|ƒ d S )N)r�   r¥   )r*   r¼   r0   r0   r1   Úpush_context_referencez  s    z$CodeGenerator.push_context_referencec             C   s   | j jƒ  d S )N)r�   rÝ   )r*   r0   r0   r1   Úpop_context_reference}  s    z#CodeGenerator.pop_context_referencec             C   s
   | j d S )Nrm   rÞ   )r�   )r*   r0   r0   r1   Úget_context_ref€  s    zCodeGenerator.get_context_refc             C   s   | j d }|dkrdS d| S )Nrm   r�   Úresolvez
%s.resolverÞ   )r�   )r*   r¼   r0   r0   r1   r¸   ƒ  s    
zCodeGenerator.get_resolve_funcc             C   s   d| j ƒ | j|ƒf S )Nz%s.derived(%s))rá   rÛ   )r*   r,   r0   r0   r1   Ú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.Frm   rÞ   )r�   )r*   r¼   r0   r0   r1   Ú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¥   rH   )r*   r0   r0   r1   Ú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 )Nrm   rÁ   r0   )rª   r¦   r0   r0   r1   ú
<listcomp>   s    z5CodeGenerator.pop_assign_tracking.<locals>.<listcomp>rm   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Úiterr_   rÊ   r•   rÉ   rž   rº   r   r×   )r*   r,   ÚvarsZpublic_namesr:   rÊ   rÔ   r0   r0   r1   Úpop_assign_tracking™  s*    



z!CodeGenerator.pop_assign_trackingc             C   sô  |d kst dƒ‚t| j| jƒ}ddlm} | jddjtƒ ƒ | jddj|ƒ ƒ | jj	rd| jdƒ | j
 rpdprd	}|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#�sD| jƒ  | jdƒ | jƒ  t*�rj| jj	 �rj| jdƒ n8| jd| jj	�r€d�p‚d	 ƒ | 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�r0|jjdƒ}| jd| ƒ d|k�rZ|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 )(Nzno root frame allowedr   )Ú__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Ú.rm   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_%sNr0   )rª   r¦   r0   r0   r1   r«   #  s   z/CodeGenerator.visit_Template.<locals>.<genexpr>zdebug_info = %rú&c             s   s   | ]}d | V  qdS )z%s=%sNr0   )rª   r¦   r0   r0   r1   r«   (  s    )r*   )r*   rï   ).ÚAssertionErrorr   r9   r:   Zjinja2.runtimerë   r•   rº   Úcode_featuresrÃ   r<   Úfindr   ZExtendsÚfind_allZBlockrƒ   r“   r’   ZImportedNameÚ
importnamer‚   r”   ÚrsplitrÄ   r–   rÜ   r]   rT   rË   r_   rÏ   rÈ   r`   ra   r…   rb   r¿   r¶   r£   rÂ   r—   Úsupports_yield_fromr   rd   r‡   )r*   r+   r,   r&   ZexportedZenvenvZhave_extendsrd   Úimport_ÚimpÚaliasÚmoduleÚobjrÊ   r:   Úblock_framerQ   r0   r0   r1   Ú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:rm   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–   Úscopedrã   rá   r÷   r9   rÃ   rc   r:   r¡   r—   )r*   r+   r,   r^   r�   Úloopr0   r0   r1   rz   +  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)Trm   N)r`   r“   r’   r„   r…   r•   r–   r   r—   r)   Útemplaterž   r:   Údict_item_iterra   )r*   r+   r,   r0   r0   r1   Ú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–   r4   r  r   ZConstrL   r   rF   rG   ÚTupleÚListr)   rž   r:   r—   Úwith_contextr9   rÃ   rÛ   r÷   r¡   )r*   r+   r,   Ú	func_nameZskip_event_yieldr  r0   r0   r1   Ú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•   r_   rÊ   r¼   r`   rž   r9   rÃ   r)   r  r:   r  rÛ   Ú
startswith)r*   r+   r,   r0   r0   r1   Ú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Á   rm   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)r_   rÊ   )rª   r:   )r,   r0   r1   r«   ö  s    z1CodeGenerator.visit_FromImport.<locals>.<genexpr>z!context.exported_vars.discard(%r)z-context.exported_vars.difference_update((%s))N)r§   rž   r9   rÃ   r)   r  r:   r  rÛ   rR   r4   rF   r•   r_   rÊ   r–   rÚ   r×   r—   r`   r¥   r  rÍ   rº   r   )r*   r+   r,   Z	var_namesZdiscarded_namesr:   rú   r0   )r,   r1   Ú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Ë   )Ú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  )#ro   Ú	recursiverT   Úiter_child_nodesr_   rÏ   rÈ   Úelse_r  r”   r•   rÄ   r–   r¿   r9   rÃ   r)   r¼   rž   r—   rÂ   rc   rô   r   ÚNamer|   r:   r“   r’   rè   r£   rË   rš   rœ   rŸ   )r*   r+   r,   Z
loop_frameZ
test_frameZ
else_frameZextended_loopZloop_refZloop_filter_funcr:   Ziteration_indicatorr0   r0   r1   Ú	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:)rp   r•   r)   r  rž   r–   r£   rË   r—   Úelif_r  )r*   r+   r,   Zif_framer  r0   r0   r1   Ú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`   r:   r  rž   r_   rÊ   r•   rÙ   )r*   r+   r,   Zmacro_framerÓ   rÊ   r0   r0   r1   Ú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_CallÚcallrŸ   )r*   r+   r,   Z
call_framerÓ   r0   r0   r1   Úvisit_CallBlock¢  s    
zCodeGenerator.visit_CallBlockc             C   sh   |j ƒ }|jj|ƒ | j|ƒ | j|ƒ | j|j|ƒ | j||ƒ | j|j	|ƒ | j
|ƒ | j|ƒ d S )N)ro   r_   rÈ   r¿   rc   r£   rË   rœ   rx   ÚfilterrŸ   rÂ   )r*   r+   r,   Zfilter_framer0   r0   r1   Ú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 = )ro   r_   rÈ   r¿   rÉ   r   ÚtargetsÚvaluesr§   r)   rž   r£   rË   rÂ   )r*   r+   r,   Z
with_framerÔ   r¼   Úexprr0   r0   r1   Ú
visit_Withµ  s    
 
zCodeGenerator.visit_Withc             C   s   | j |ƒ | j|j|ƒ d S )N)r§   r)   r+   )r*   r+   r,   r0   r0   r1   Ú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   r9   Úfinalize)r¦   )r*   r0   r1   Ú<lambda>Ò  s   z,CodeGenerator.visit_Output.<locals>.<lambda>c                s   t ˆ jj| ƒƒS )N)r   r9   r(  )r¦   )r*   r0   r1   r)  Õ  s    zif parent_template is None:Ú__html__rm   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…   rb   r9   r(  r³   r   r•   r–   r   Ú
ImpossibleÚas_constr&   r¥   r˜   Úhasattrr*  r   Ú	Exceptionr4   rG   rÍ   rc   r×   r   r§   r'   rž   r)   r—   Úreplace)r*   r+   r,   Zallow_constant_finalizerÄ   r(  Zoutdent_laterrË   ÚchildÚconstrM   ÚvalÚcloseÚformatÚ	argumentsÚargumentr0   )r*   r1   Ú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,   r0   r0   r1   Ú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å   ro   rb   r_   rÈ   r¿   rc   r£   rË   r§   r)   r¼   rž   r!  rx   rê   rÂ   )r*   r+   r,   rý   r0   r0   r1   Ú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  rm   r{   r   z-(undefined(name=%r) if %s is missing else %s)rÞ   )r|   r`   rŽ   rw   r:   r_   rÊ   Z	find_loadr   rä   rž   )r*   r+   r,   rÊ   r{   r0   r0   r1   r~   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])r_   rÊ   r:   r•   r–   r—   Úattr)r*   r+   r,   rÊ   r0   r0   r1   Úvisit_NSRefŠ  s    zCodeGenerator.visit_NSRefc             C   s8   |j |jƒ}t|tƒr&| jt|ƒƒ n| jt|ƒƒ d S )N)r-  r&   r4   rD   rž   Ústrr×   )r*   r+   r,   r3  r0   r0   r1   Ú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,   r0   r0   r1   Ú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ú(rm   z, r   z,)r�   rÞ   )rž   rÉ   r"   r)   )r*   r+   r,   rÔ   rM   r0   r0   r1   Ú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Ô   rM   r0   r0   r1   Ú
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)   rN   rL   )r*   r+   r,   rÔ   rM   r0   r0   r1   Ú
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, rA  z %s r�   )r9   Ú	sandboxedZintercepted_binopsrž   r)   ÚleftÚright)r*   r+   r,   )Úoperatorr0   r1   rS   À  s    

z$CodeGenerator.binop.<locals>.visitor)r3   )rK  ÚinterceptablerS   r0   )rK  r1   Ú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, rA  r�   )r9   rH  Zintercepted_unopsrž   r)   r+   )r*   r+   r,   )rK  r0   r1   rS   Ñ  s    z#CodeGenerator.uaop.<locals>.visitor)r3   )rK  rL  rS   r0   )rK  r1   ÚuaopÐ  s    
zCodeGenerator.uaopú+ú-Ú*ú/z//z**r+  Úand)rL  Ú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±   r0   r0   r1   Úvisit_Concatë  s    zCodeGenerator.visit_Concatc             C   s.   | j |j|ƒ x|jD ]}| j ||ƒ qW d S )N)r)   r%  Úops)r*   r+   r,   Úopr0   r0   r1   Úvisit_Compareú  s    zCodeGenerator.visit_Comparec             C   s&   | j dt|j  ƒ | j|j|ƒ d S )Nz %s )rž   Ú	operatorsrW  r)   r%  )r*   r+   r,   r0   r0   r1   Ú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,   r0   r0   r1   Ú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 )NrC  rD  zenvironment.getitem(z, r�   )r4   r±   r   ÚSlicer)   r+   rž   )r*   r+   r,   r0   r0   r1   Ú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,   r0   r0   r1   Ú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(rA  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�   )r9   rÃ   rž   rt   r:   Úgetr“   r’   r³   r+   r)   r&   r'   rc   r˜   r²   )r*   r+   r,   rÄ   r0   r0   r1   rx   #  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 )NrA  zno test named %rr�   )	rž   ru   r:   r9   r“   r’   r)   r+   r²   )r*   r+   r,   r0   r0   r1   ry   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Ú   r0   )r,   r+   r*   r0   r1   Úwrite_expr2N  s    
z1CodeGenerator.visit_CondExpr.<locals>.write_expr2rA  z if z else r�   )rž   r)   Zexpr1r  )r*   r+   r,   rb  r0   )r,   r+   r*   r1   Ú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�   )r9   rÃ   rž   rH  r)   r+   r²   )r*   r+   r,   r  r¯   r0   r0   r1   r  ]  s    


zCodeGenerator.visit_Callc             C   s"   | j |jd ƒ | j|j|ƒ d S )Nú=)rž   rN   r)   rL   )r*   r+   r,   r0   r0   r1   Ú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,   r0   r0   r1   Ú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,   r0   r0   r1   Úvisit_MarkSafeIfAutoescapew  s    
z(CodeGenerator.visit_MarkSafeIfAutoescapec             C   s   | j d|j ƒ d S )Nzenvironment.)rž   r:   )r*   r+   r,   r0   r0   r1   Úvisit_EnvironmentAttribute|  s    z(CodeGenerator.visit_EnvironmentAttributec             C   s   | j d|j|jf ƒ d S )Nzenvironment.extensions[%r].%s)rž   Ú
identifierr:   )r*   r+   r,   r0   r0   r1   Úvisit_ExtensionAttribute  s    z&CodeGenerator.visit_ExtensionAttributec             C   s   | j | j|j ƒ d S )N)rž   r‚   rõ   )r*   r+   r,   r0   r0   r1   Úvisit_ImportedName‚  s    z CodeGenerator.visit_ImportedNamec             C   s   | j |jƒ d S )N)rž   r:   )r*   r+   r,   r0   r0   r1   Úvisit_InternalName…  s    z CodeGenerator.visit_InternalNamec             C   s   | j dƒ d S )Nr�   )rž   )r*   r+   r,   r0   r0   r1   Úvisit_ContextReferenceˆ  s    z$CodeGenerator.visit_ContextReferencec             C   s   | j d|ƒ d S )NÚcontinue)r•   )r*   r+   r,   r0   r0   r1   Úvisit_Continue‹  s    zCodeGenerator.visit_Continuec             C   s   | j d|ƒ d S )NÚbreak)r•   )r*   r+   r,   r0   r0   r1   Úvisit_BreakŽ  s    zCodeGenerator.visit_Breakc             C   s:   |j ƒ }|jj|ƒ | j|ƒ | j|j|ƒ | j|ƒ d S )N)ro   r_   rÈ   r¿   r£   rË   rÂ   )r*   r+   r,   Úscope_framer0   r0   r1   Ú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)rn   )r”   r•   rã   r)   r�   rß   ro   r_   rÈ   r¿   r£   rË   rÂ   rà   )r*   r+   r,   r|   rr  r0   r0   r1   Ú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)Úoptionsr•   rN   r)   rL   r-  r&   r   r,  r'   Úsetattr)r*   r+   r,   Úkeywordr3  r0   r0   r1   Ú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&   Úsaver•   rx  rË   r)   Úrevert)r*   r+   r,   Zold_ctx_nameZ	saved_ctxr1  r0   r0   r1   Úvisit_ScopedEvalContextModifier±  s    
z-CodeGenerator.visit_ScopedEvalContextModifier)NFT)F)rm   )N)N)Nr   )Nr   )N)F)N)T)T)F)drZ   r[   r\   rY   r“   r”   rc   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þ   rz   r  r
  r  r  r  r  r  r   r"  r&  r'  r8  r9  r:  r~   r<  r>  r@  rB  rE  rG  rM  rN  Z	visit_AddZ	visit_SubZ	visit_MulZ	visit_DivZvisit_FloorDivZ	visit_PowZ	visit_ModZ	visit_AndZvisit_OrZ	visit_PosZ	visit_NegZ	visit_Notr3   rU  rX  rZ  r[  r]  r`  rx   ry   rc  r  re  rf  rg  rh  rj  rk  rl  rm  ro  rq  rs  rt  rx  r{  r0   r0   r0   r1   r€   ô   sÊ    
B






5
M		
t /6;  	



 	r€   )NFT)=rq   Ú	itertoolsr   rk   r   rw  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   rY  r.  rK   r  rò   Úexecr¥   ÚSyntaxErrorr÷   r3   r>   rJ   rT   rf   rU   r]   ÚRuntimeErrorrP   rs   rO   r/  r   r€   r0   r0   r0   r1   Ú<module>
   s\   $

 
	>