U
    ð»ÑgÓ  ã                	   @   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*ze+dƒ e* ,d¡ W n e-k
r    Y nX z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                    sB   | j r2|jjs2| j ||j¡}||kr2|  ||¡S ˆ | ||f|ŽS ©N)Ú	optimizedÚeval_ctxÚvolatileÚ	optimizerÚvisit)ÚselfÚnodeÚframeÚkwargsZnew_node©Úf© ú1/usr/lib/python3/dist-packages/jinja2/compiler.pyÚnew_func@   s
    zoptimizeconst.<locals>.new_funcr   )r.   r1   r/   r-   r0   Úoptimizeconst?   s    r2   Nc                 C   sH   t | tjƒstdƒ‚| ||||||¡}| | ¡ |dkrD|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Úfilenamer5   Ú
defer_initr$   Ú	generatorr/   r/   r0   Ú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rl| D ]}t|ƒsT dS qTdS t| ƒtkrªt| ƒD ]$\}} t|ƒs– dS t| ƒs€ dS q€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/   r0   rH   W   s"    rH   c                 C   s<   t |ƒ}z| D ]}| |¡ qW n tk
r4   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/   r0   Úfind_undeclaredl   s    rR   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/   r0   Ú__init__{   s    zMacroRef.__init__N)Ú__name__Ú
__module__Ú__qualname__rX   r/   r/   r/   r0   rS   y   s   rS   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^   r/   r/   r0   rX   …   s    ÿzFrame.__init__c                 C   s*   t  | j¡}|j | j¡ | j ¡ |_|S )z!Create a copy of the current one.)ÚobjectÚ__new__Ú	__class__Ú__dict__Úupdater_   Úcopy©r)   Úrvr/   r/   r0   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)   Úisolatedr/   r/   r0   Úinner¬   s    zFrame.innerc                 C   s   |   ¡ }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   rl   r/   r/   r0   Úsoft²   s    z
Frame.soft)NN)F)	rY   rZ   r[   Ú__doc__rX   rk   rp   rq   Ú__copy__r/   r/   r/   r0   r\   ‚   s   
 
r\   c                   @   s   e Zd ZdZdS )rN   z?Exception used by the `UndeclaredNameVisitor` to signal a stop.N©rY   rZ   r[   rr   r/   r/   r/   r0   rN   À   s   rN   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 r#   )rF   ÚfiltersÚtests©r)   r/   r/   r0   rX   Ç   s    z DependencyFinderVisitor.__init__c                 C   s   |   |¡ | j |j¡ d S r#   )Úgeneric_visitrv   Úaddr8   rW   r/   r/   r0   Úvisit_FilterË   s    
z$DependencyFinderVisitor.visit_Filterc                 C   s   |   |¡ | j |j¡ d S r#   )ry   rw   rz   r8   rW   r/   r/   r0   Ú
visit_TestÏ   s    
z"DependencyFinderVisitor.visit_Testc                 C   s   dS )zStop visiting at blocks.Nr/   rW   r/   r/   r0   Úvisit_BlockÓ   s    z#DependencyFinderVisitor.visit_BlockN)rY   rZ   r[   rr   rX   r{   r|   r}   r/   r/   r/   r0   ru   Ä   s
   ru   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	rM   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 r#   )rF   rP   rO   )r)   rP   r/   r/   r0   rX   Ý   s    
zUndeclaredNameVisitor.__init__c                 C   sJ   |j dkr8|j| jkr8| j |j¡ | j| jkrFtƒ ‚n| j |j¡ d S )NÚload)Úctxr8   rP   rO   rz   rN   ÚdiscardrW   r/   r/   r0   Ú
visit_Nameá   s
    z UndeclaredNameVisitor.visit_Namec                 C   s   dS )zStop visiting a blocks.Nr/   rW   r/   r/   r0   r}   é   s    z!UndeclaredNameVisitor.visit_BlockN)rY   rZ   r[   rr   rX   r   r}   r/   r/   r/   r0   rM   ×   s   rM   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.
    Nrt   r/   r/   r/   r0   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Œ„ ƒZMddŽ„ ZNeKdd„ ƒZOeKd‘d’„ ƒZPd“d”„ ZQeKd•d–„ ƒZReKd—d˜„ ƒZSeKd™dš„ ƒZTeKdÅd›dœ„ƒZUddž„ 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   rn   TÚcontext)r   r7   r8   r9   r5   Zcreated_block_contextr:   r$   r
   r'   Úimport_aliasesÚblocksÚextends_so_farÚhas_known_extendsÚcode_linenorw   rv   Ú
debug_infoÚ_write_debug_infoÚ
_new_linesÚ
_last_lineÚ_first_writeÚ_last_identifierÚ_indentationÚ_assign_stackÚ_param_def_blockÚ_context_reference_stack)r)   r7   r8   r9   r5   r:   r$   r/   r/   r0   rX   ö   s8    
zCodeGenerator.__init__c                 C   s   t ||| j| jƒ‚dS )z*Fail with a :exc:`TemplateAssertionError`.N)r   r8   r9   )r)   ÚmsgÚlinenor/   r/   r0   Úfail9  s    zCodeGenerator.failc                 C   s   |  j d7  _ d| j  S )zGet a new unique identifier.rn   zt_%d)r   rx   r/   r/   r0   Útemporary_identifier=  s    z"CodeGenerator.temporary_identifierc                 C   s   |   ¡ |_|  d|j ¡ dS )z7Enable buffering for the frame from that point onwards.z%s = []N)r—   rc   Ú	writeline©r)   r+   r/   r/   r0   rc   B  s    
zCodeGenerator.bufferc                 C   s”   |s€|j jrd|  d¡ |  ¡  |  d|j ¡ |  ¡  |  d¡ |  ¡  |  d|j ¡ |  ¡  dS |j jr€|  d|j ¡ dS |  d|j ¡ dS )z(Return the buffer contents of the frame.zif context.eval_ctx.autoescape:zreturn Markup(concat(%s))úelse:zreturn concat(%s)N)r%   r&   r˜   Úindentrc   ÚoutdentÚ
autoescape)r)   r+   Úforce_unescapedr/   r/   r0   Úreturn_buffer_contentsG  s    

z$CodeGenerator.return_buffer_contentsc                 C   s   |  j d7  _ dS )zIndent by one.rn   N©r   rx   r/   r/   r0   r›   Y  s    zCodeGenerator.indentrn   c                 C   s   |  j |8  _ dS )zOutdent by step.Nr    )r)   Ústepr/   r/   r0   rœ   ]  s    zCodeGenerator.outdentc                 C   s.   |j dkr|  d|¡ n|  d|j  |¡ dS )z%Yield or write into the frame buffer.Núyield ú
%s.append()rc   r˜   )r)   r+   r*   r/   r/   r0   Ústart_writea  s    
zCodeGenerator.start_writec                 C   s   |j dk	r|  d¡ dS )z1End the writing process started by `start_write`.Nú))rc   Úwriter™   r/   r/   r0   Ú	end_writeh  s    
zCodeGenerator.end_writec                 C   s$   |   ||¡ |  |¡ |  |¡ dS )z4Simple shortcut for start_write + write + end_write.N)r¤   r¦   r§   )r)   Úsr+   r*   r/   r/   r0   Úsimple_writem  s    
zCodeGenerator.simple_writec                 C   s>   z$|   d¡ |D ]}|  ||¡ qW n tk
r8   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*   r/   r/   r0   Ú
blockvisits  s    
zCodeGenerator.blockvisitc                 C   s€   | j rp| jsR| j d| j  ¡ |  j| j 7  _| jdk	rR| j | j| jf¡ d| _d| _| j d| j ¡ d| _ | j |¡ dS )z&Write a string into the output stream.Ú
NFz    r   )	rŒ   rŽ   r5   r¦   r‰   r‹   rŠ   Úappendr   )r)   Úxr/   r/   r0   r¦   ~  s    

ÿzCodeGenerator.writer   c                 C   s   |   ||¡ |  |¡ dS )z!Combination of newline and write.N)Únewliner¦   )r)   r®   r*   Úextrar/   r/   r0   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.rn   N)ÚmaxrŒ   r•   r   r‹   )r)   r*   r°   r/   r/   r0   r¯   ’  s    zCodeGenerator.newlinec           	      C   s´  d}t dd„ |jD ƒ|pdƒD ]}t|ƒrd} q4q|jD ]}|  d¡ |  ||¡ q:|s¨|jD ]}|  d¡ |  ||¡ q`|dk	r¨t|ƒD ]\}}|  d||f ¡ qŒ|jrÆ|  d	¡ |  |j|¡ |rŒ|jdk	râ|  d
¡ n
|  d¡ |jD ],}|  d|j	 ¡ |  |j
|¡ |  d¡ qò|dk	rPt|ƒD ]\}}|  d||f ¡ q2|jdk	r€|  d¡ |  |j|¡ |  d¡ n
|  d¡ n$|jdk	r°|  d¡ |  |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 r#   )rL   ©Ú.0r®   r/   r/   r0   Ú	<genexpr>£  s     z*CodeGenerator.signature.<locals>.<genexpr>r/   Tú, 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_kwargsrL   rJ   )	r)   r*   r+   Úextra_kwargsZkwarg_workaroundZkwargÚargrL   rJ   r/   r/   r0   Ú	signature™  sJ    	










zCodeGenerator.signaturec                 C   sn   t ƒ }|D ]}| |¡ q
dD ]J}t| |ƒ}t||ƒD ]0}||krN|  ¡ ||< |  d|| ||f ¡ q6qdS )zPull all the dependencies.)rv   rw   z%s = environment.%s[%r]N)ru   r(   Úgetattrr—   r˜   )r)   r   rQ   r*   Z
dependencyÚmappingr8   r/   r/   r0   Úpull_dependenciesÎ  s    
ÿzCodeGenerator.pull_dependenciesc                 C   sž   g }t |jjƒD ]p\}\}}|tkr&q|tkrH|  d||  ¡ |f ¡ q|tkrd|  d||f ¡ q|tkrx| 	|¡ qt
dƒ‚q|rš|  dd |¡ ¡ d S )Nz%s = %s(%r)ú%s = %szunknown load instructionú%s = missingú = )r   r_   Úloadsr   r   r˜   Úget_resolve_funcr   r   r­   ÚNotImplementedErrorÚjoin)r)   r+   ÚundefsÚtargetÚactionZparamr/   r/   r0   Úenter_frameÛ  s    ÿ
zCodeGenerator.enter_framec                 C   sD   |s@g }t |jjƒD ]\}}| |¡ q|r@|  dd |¡ ¡ d S )NrÀ   rÁ   )r   r_   rÂ   r­   r˜   rÅ   )r)   r+   Úwith_python_scoperÆ   rÇ   Ú_r/   r/   r0   Úleave_frameì  s    zCodeGenerator.leave_framec                 C   s   | j jrd| S d| S )Nzasync def %szdef %s)r7   Úis_async)r)   r8   r/   r/   r0   Úfuncô  s    zCodeGenerator.funcc              
   C   sŒ  |  ¡ }|j |¡ t|ƒ}d}tƒ }g }t|jƒD ]@\}}|jdkrJ|}|jdkr`| |j¡ | 	|j 
|j¡¡ q4t|jdƒ}	d|	krè|dk	rÐz|j|t|jƒ   W qâ tk
rÌ   |  d|j¡ Y qâX n| 	|j d¡¡ d|_d|	krd|kr| 	|j d¡¡ d|_d|	kr@d|kr@| 	|j d¡¡ d|_d	|_|j |¡ |  d
|  d¡d |¡f |¡ |  ¡  |  |¡ |  |¡ |  |¡ t|jƒD ]¦\}}|j 
|j¡}
|  d|
 ¡ |  ¡  z|j|t|jƒ  }W n2 tk
r   |  d|
d|j |jf ¡ Y nX |  d|
 ¡ |  ||¡ |  |
¡ |   ¡  q¢|  !¡  |  "|j|¡ | j#|dd | j$|dd |   ¡  ||fS )z/Dump the function def of a macro or call block.NÚcaller)r,   Úvarargs)rÏ   r,   rÐ   zhWhen defining macros or call blocks the special "caller" argument must be omitted or be given a default.Tr,   rÐ   Fz%s(%s):Zmacrorµ   úif %s is missing:z%s = undefined(%r, name=%r)zparameter %r was not providedú%s = )rž   ©rÊ   )%rp   r_   Úanalyze_noderS   rF   Ú	enumerater¸   r8   rz   r­   ÚrefrR   ÚbodyÚdefaultsÚlenÚ
IndexErrorr–   r•   Údeclare_parameterrT   rU   rV   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º   rO   rÖ   Údefaultr/   r/   r0   Ú
macro_bodyù  st    

þ 


ý
zCodeGenerator.macro_bodyc                 C   s`   d  dd„ |jjD ƒ¡}t|jddƒ}t|jjƒdkr>|d7 }|  d|||j|j|jf ¡ dS )	z<Dump the macro definition for the def created by macro_body.rµ   c                 s   s   | ]}t |jƒV  qd S r#   )Úreprr8   r²   r/   r/   r0   r´   H  s     z*CodeGenerator.macro_def.<locals>.<genexpr>r8   Nrn   ú,zLMacro(environment, macro, %r, (%s), %r, %r, %r, context.eval_ctx.autoescape))	rÅ   r*   r¸   r¼   rÙ   r¦   rU   rV   rT   )r)   rß   r+   Z	arg_tupler8   r/   r/   r0   Ú	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 %dNú in )r•   r8   rã   )r)   r*   rm   r/   r/   r0   ÚpositionQ  s    

zCodeGenerator.positionc                 C   s"   dd  dd„ t|j ¡ ƒD ƒ¡ S )Nz{%s}rµ   c                 s   s   | ]\}}d ||f V  qdS ©ú%r: %sNr/   )r³   r8   rÇ   r/   r/   r0   r´   Y  s    z3CodeGenerator.dump_local_context.<locals>.<genexpr>)rÅ   r   r_   Zdump_storesr™   r/   r/   r0   Údump_local_contextX  s    þz CodeGenerator.dump_local_contextc                 C   s"   |   d¡ |   d¡ |   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˜   rx   r/   r/   r0   Úwrite_commons]  s    

zCodeGenerator.write_commonsc                 C   s   | 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_targetsr™   r/   r/   r0   rÜ   f  s    z(CodeGenerator.push_parameter_definitionsc                 C   s   | j  ¡  dS )z+Pops the current parameter definitions set.N)r’   Úpoprx   r/   r/   r0   rÞ   o  s    z'CodeGenerator.pop_parameter_definitionsc                 C   s   | j r| j d  |¡ dS )z€Marks a parameter in the current parameter definitions as stored.
        This will skip the enforced undefined checks.
        éÿÿÿÿN)r’   r€   ©r)   rÇ   r/   r/   r0   rÝ   s  s    z#CodeGenerator.mark_parameter_storedc                 C   s   | j  |¡ d S r#   )r“   r­   rï   r/   r/   r0   Úpush_context_referencez  s    z$CodeGenerator.push_context_referencec                 C   s   | j  ¡  d S r#   )r“   rí   rx   r/   r/   r0   Úpop_context_reference}  s    z#CodeGenerator.pop_context_referencec                 C   s
   | j d S )Nrî   ©r“   rx   r/   r/   r0   Úget_context_ref€  s    zCodeGenerator.get_context_refc                 C   s   | j d }|dkrdS d| S )Nrî   r„   Zresolvez
%s.resolverò   rï   r/   r/   r0   rÃ   ƒ  s    
zCodeGenerator.get_resolve_funcc                 C   s   d|   ¡ |  |¡f S )Nz%s.derived(%s))ró   rê   r™   r/   r/   r0   Ú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.Frî   )r’   rï   r/   r/   r0   Úparameter_is_undeclared  s    z%CodeGenerator.parameter_is_undeclaredc                 C   s   | j  tƒ ¡ dS )z+Pushes a new layer for assignment tracking.N)r‘   r­   rF   rx   r/   r/   r0   Úpush_assign_tracking•  s    z"CodeGenerator.push_assign_trackingc                 C   sò   | j  ¡ }|jr|sdS dd„ |D ƒ}t|ƒdkr^tt|ƒƒ}|j |¡}|  d||f ¡ nR|  d¡ t	|ƒD ]4\}}|r†|  
d¡ |j |¡}|  
d||f ¡ qp|  
d	¡ |rît|ƒdkrÔ|  d
|d  ¡ n|  dd 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 )Nrn   rË   r/   r²   r/   r/   r0   Ú
<listcomp>   s      z5CodeGenerator.pop_assign_tracking.<locals>.<listcomp>rn   úcontext.vars[%r] = %szcontext.vars.update({rµ   ré   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_namesr8   rÖ   rà   r/   r/   r0   Úpop_assign_tracking™  s.    




ÿÿz!CodeGenerator.pop_assign_trackingc                 C   sæ  |d kst dƒ‚t| j| jƒ}ddlm} |  dd t¡ ¡ |  dd |¡ ¡ | jj	rd|  d¡ | j
 rpdprd	}| tj¡d k	}| tj¡D ]0}|j| jkr´|  d
|j |j¡ || j|j< q| tj¡D ]j}|j| jkrÎ|j}	|  ¡  | j|	< }
d|	kr&|	 dd¡\}}|  d|||
f ¡ qÎ|  d|	|
f ¡ qÎ|  d| j ¡ | jd|  d¡|f dd |  ¡  |  ¡  t|ƒ}dt|jdƒkrª|j d¡}|  d| ¡ |j  |¡ d |_!|_"|oÎ| j# |_$|râ|  d¡ |  %|¡ |  &|j¡ |  '|j|¡ | j(|dd |  )¡  |rª| j#s<|  ¡  |  d¡ |  ¡  t*r`| jj	s`|  d¡ n8|  d| jj	rvdpxd	 ¡ |  ¡  |  d¡ |  )¡  |  )d| j#  ¡ t+| jƒD ]è\}}|  d|  d| ¡|f |d¡ |  ¡  |  ¡  t|ƒ}t|jdƒ}d|kr$|j d¡}|  d| ¡ d |krN|j d ¡}|  d!|||f ¡ |j  |¡ ||_,|  %|¡ |  &|j¡ |  '|j|¡ | j(|dd |  )¡  q´| jd"d d#d$„ | jD ƒ¡ dd |  d%d& d'd$„ | j-D ƒ¡ ¡ d S )(Nzno root frame allowedr   )Ú__all__zfrom __future__ import %srµ   zfrom jinja2.runtime import zOfrom jinja2.asyncsupport import auto_await, auto_aiter, make_async_loop_contextz, environment=environmentÚ zblock %r defined twiceÚ.rn   zfrom %s import %s as %szimport %s as %sz	name = %rz%s(context, missing=missing%s):Úroot)r°   r)   rx   z%s = TemplateReference(context)Tzparent_template = NonerÓ   ú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_)r)   Úsuperr  z %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/   r0   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/   r0   r´   (  s     ).ÚAssertionErrorr   r7   r8   Zjinja2.runtimerþ   r˜   rÅ   Úcode_featuresrÍ   r:   Úfindr   ZExtendsÚfind_allZBlockr†   r–   r•   ZImportedNameÚ
importnamer…   r—   ÚrsplitrÎ   r›   rì   r\   rR   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Ö   r8   Úblock_framerO   r/   r/   r0   Úvisit_Template·  sº    

ÿÿÿ


þ
ÿ þ

ÿ
ÿþÿzCodeGenerator.visit_Templatec                 C   sÒ   d}|j r8| jrdS | jdkr8|  d¡ |  ¡  |d7 }|jrJ|  |¡}n|  ¡ }tr€| j	j
s€|jdkr€|  d|j|f |¡ nD| j	j
rŒdpŽd}|  d||j|f |¡ |  ¡  |  d	|¡ |  ¡  |  |¡ dS )
z.Call a block and register it for the template.r   Núif parent_template is None:rn   z$yield from context.blocks[%r][0](%s)ú	async forÚforz&%s event in context.blocks[%r][0](%s):Úevent)r`   rˆ   r‡   r˜   r›   Zscopedrô   ró   r  r7   rÍ   rc   r8   r©   rœ   )r)   r*   r+   r^   r„   Úloopr/   r/   r0   r}   +  s@    

ÿ ÿÿ  ÿÿzCodeGenerator.visit_Blockc                 C   sÊ   |j s|  d|j¡ | jdkrZ| js6|  d¡ |  ¡  |  dd ¡ | jrRtƒ ‚n|  ¡  |  d|¡ |  	|j
|¡ |  d| j ¡ |  dt ¡ |  ¡  |  d	¡ |  ¡  |jr¸d
| _|  jd7  _dS )zCalls the extender.z,cannot use extend from a non top-level scoper   r  úraise TemplateRuntimeError(%r)zextended multiple timesz+parent_template = environment.get_template(ú, %r)z6for name, parent_block in parent_template.blocks.%s():z8context.blocks.setdefault(name, []).append(parent_block)Trn   N)r`   r–   r•   r‡   rˆ   r˜   r›   r‚   rœ   r(   Útemplater¦   r8   Údict_item_iterra   ©r)   r*   r+   r/   r/   r0   Úvisit_ExtendsK  s4    ÿ

ÿÿ
zCodeGenerator.visit_Extendsc                 C   s‚  |j r|  d¡ |  ¡  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}|  d| |¡ |  |j|¡ |  d| j ¡ |j rà|  ¡  |  d¡ |  ¡  |  d¡ |  ¡  |  d	¡ |  ¡  d
}|jr| jjrødpúd}|  d||  |¡f ¡ n6| jjr,|  d¡ n trB|  d¡ d}n
|  d¡ |sn|  ¡  |  d|¡ |  ¡  |j r~|  ¡  dS )zHandles includes.ztry:Zget_or_select_templateZget_templateZselect_templateztemplate = environment.%s(r  zexcept TemplateNotFound:rª   rš   Fr  r  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›   r3   r  r   ZConstrJ   r   rD   rE   ZTupleZListr(   r¦   r8   rœ   Úwith_contextr7   rÍ   rê   r  r©   )r)   r*   r+   Ú	func_nameZskip_event_yieldr  r/   r/   r0   Úvisit_Includez  sP    



þ


zCodeGenerator.visit_Includec                 C   sÚ   |   d|j |j¡ |¡ |jr0|  d|j ¡ | jjrB|  d¡ |  d¡ |  |j	|¡ |  d| j
 ¡ |jr–|  d| jjr‚dp„d|  |¡f ¡ n| jjrª|  d	¡ n
|  d
¡ |jrÖ|j d¡sÖ|   d|j ¡ dS )zVisit regular imports.rÒ   úcontext.vars[%r] = úawait zenvironment.get_template(ú, %r).ú*make_module%s(context.get_all(), True, %s)Ú_asyncrÿ   ú_get_default_module_async()ú_get_default_module()rË   ú!context.exported_vars.discard(%r)N)r˜   r_   rÖ   rÇ   r`   r¦   r7   rÍ   r(   r  r8   r  rê   Ú
startswithr  r/   r/   r0   Úvisit_Import°  s&    

ÿÿ
zCodeGenerator.visit_Importc              	      sþ  |   |¡ |  d| jjrdpd ¡ |  |jˆ ¡ |  d| j ¡ |jrn|  d| jjrZdp\d|  ˆ ¡f ¡ n| jjr‚|  d¡ n
|  d¡ g }g }|j	D ]Â}t
|tƒr²|\}}n|}|  d	ˆ j |¡|f ¡ |  d
ˆ j |¡ ¡ |  ¡  |  |¡ dd¡ dd¡}|  dˆ j |¡d|t|ƒf |f ¡ |  ¡  ˆ jrš| |¡ | d¡sš| |¡ qš|r¸t|ƒdkr–|d }|  d|ˆ j |¡f ¡ n"|  dd ‡ fdd„|D ƒ¡ ¡ |rút|ƒdkrà|  d|d  ¡ n|  dd tt|ƒ¡ ¡ dS )zVisit named imports.z/included_template = %senvironment.get_template(r"  rÿ   r#  r$  r%  r&  r'  z,%s = getattr(included_template, %r, missing)rÑ   ú{z{{r¶   z}}z9%s = undefined(%r %% included_template.__name__, name=%r)zGthe template %%r (imported on %s) does not export the requested name %srË   rn   r   rø   zcontext.vars.update({%s})rµ   c                 3   s"   | ]}d |ˆ j  |¡f V  qdS rè   )r_   rÖ   )r³   r8   ©r+   r/   r0   r´   ú  s    z1CodeGenerator.visit_FromImport.<locals>.<genexpr>r(  z-context.exported_vars.difference_update((%s))N)r¯   r¦   r7   rÍ   r(   r  r8   r  rê   rP   r3   rD   r˜   r_   rÖ   r›   rç   Úreplacerã   rœ   r`   r­   r)  rÙ   rÅ   r   )r)   r*   r+   Z	var_namesZdiscarded_namesr8   r  rç   r/   r,  r0   Úvisit_FromImportÅ  sv    
ÿÿÿ



ÿ
þÿûý	

ÿÿÿÿzCodeGenerator.visit_FromImportc                 C   sN  |  ¡ }|  ¡ }|  ¡ }|jp2dt|jdddƒk}d }|rH|j d¡}|jj|dd |jrn|jj|dd |jrl|  	¡ }|jj|dd |  
d	|  |¡ |j¡ |  ¡  |  |¡ |  
| jjrÈd
pÊd¡ |  |j|¡ |  d¡ |  | jjrödpød¡ |  d¡ |  ¡  |  
d|j¡ |  |j|¡ |  d¡ |  ¡  |  
d¡ |  |j|¡ |  d¡ | j|dd |jr¤|  
d|  d¡ |¡ |  ¡  |  |¡ |j|_|r¸|  
d| ¡ | tj¡D ],}	|	jdkrÄ|	jdkrÄ|  d|	j¡ qÄ|jr|  	¡ }
|  
d|
 ¡ |  
| jjr$d
p&d|¡ |  |j|¡ |rj| jjrZ|  d| ¡ n|  d| ¡ n
|  d¡ |jrŠ|  d| ¡ |jrž|  d¡ nB| jjr¸|s¸|  d¡ |  |j|¡ | jjrà|sà|  d¡ |jrò|  d¡ |jr|  d ¡ n|  |rd!pd¡ |  ¡  |  |¡ |  |j|¡ |jrR|  
d"|
 ¡ |  ¡  | j||jon|j d |jr¼|  
d#|
 ¡ |  ¡  |  |¡ |  |j|¡ |  |¡ |  ¡  |jrJ|   |¡ |  ¡  |  !||¡ | jjrö|  d$¡ |  d%¡ | jjr|  d¡ |  |j|¡ | jjr6|  d¡ |  d&¡ |  "|¡ d S )'Nr  )r×   )Zonly)r  r×   )Z
for_branchÚelseÚtestz
%s(fiter):z
async for zfor ræ   zauto_aiter(fiter)Zfiterú:úif r¢   é   TrÓ   z'%s(reciter, loop_render_func, depth=0):rÀ   Ú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:r"  zloop(z, loop))#rp   Ú	recursiverR   Ziter_child_nodesr_   rÛ   rÔ   Úelse_r0  r—   r˜   rÎ   r›   rÉ   r7   rÍ   r(   rÇ   r¦   rœ   rÌ   rc   r  r   ÚNamer   r8   r–   r•   rû   r«   r×   rŸ   r¤   r§   )r)   r*   r+   Z
loop_frameZ
test_frameZ
else_frameZextended_loopZloop_refZloop_filter_funcr8   Ziteration_indicatorr/   r/   r0   Ú	visit_For  sÔ    ÿÿÿ





ÿÿ
ÿ





ÿ










zCodeGenerator.visit_Forc                 C   sÊ   |  ¡ }|  d|¡ |  |j|¡ |  d¡ |  ¡  |  |j|¡ |  ¡  |j	D ]F}|  d|¡ |  |j|¡ |  d¡ |  ¡  |  |j|¡ |  ¡  qP|j
rÆ|  d¡ |  ¡  |  |j
|¡ |  ¡  d S )Nr2  r1  zelif rš   )rq   r˜   r(   r0  r¦   r›   r«   r×   rœ   Úelif_r6  )r)   r*   r+   Zif_framer9  r/   r/   r0   Úvisit_If‡  s&    




zCodeGenerator.visit_Ifc                 C   s€   |   ||¡\}}|  ¡  |jrX|j d¡s:|  d|j ¡ |j |j¡}|  d|j ¡ |  d|j |j¡ ¡ |  	||¡ d S )NrË   rù   r!  rÒ   )
râ   r¯   r`   r8   r)  r¦   r_   rÖ   r˜   rå   )r)   r*   r+   Zmacro_framerß   rÖ   r/   r/   r0   Úvisit_Macroœ  s    zCodeGenerator.visit_Macroc                 C   sR   |   ||¡\}}|  d¡ |  ||¡ |  ||¡ | j|j|dd |  |¡ d S )Nz	caller = T)Úforward_caller)râ   r˜   rå   r¤   Ú
visit_CallÚcallr§   )r)   r*   r+   Z
call_framerß   r/   r/   r0   Úvisit_CallBlock§  s    
zCodeGenerator.visit_CallBlockc                 C   sh   |  ¡ }|j |¡ |  |¡ |  |¡ |  |j|¡ |  ||¡ |  |j	|¡ |  
|¡ |  |¡ d S r#   )rp   r_   rÔ   rÉ   rc   r«   r×   r¤   r{   Úfilterr§   rÌ   )r)   r*   r+   Zfilter_framer/   r/   r0   Úvisit_FilterBlock¯  s    


zCodeGenerator.visit_FilterBlockc                 C   s„   |  ¡ }|j |¡ |  |¡ tt|j|jƒƒD ]6\}\}}|  ¡  |  	||¡ |  
d¡ |  	||¡ q0|  |j|¡ |  |¡ d S ©NrÁ   )rp   r_   rÔ   rÉ   rÕ   r   ZtargetsÚvaluesr¯   r(   r¦   r«   r×   rÌ   )r)   r*   r+   Z
with_framerà   rÇ   Úexprr/   r/   r0   Ú
visit_Withº  s    

zCodeGenerator.visit_Withc                 C   s   |   |¡ |  |j|¡ d S r#   )r¯   r(   r*   r  r/   r/   r0   Ú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Žˆ  d	¡ ˆ  ¡  d}g }|jD ]Ð}z|sªt 	¡ ‚| 
|j¡}	W n$ tj	k
rÜ   | |¡ Y q˜Y nX z2|jjrt|	d
ƒrþ|	 ¡ }	nt|	ƒ}	||	ƒ}	W n$ tk
r4   | |¡ Y q˜Y nX |r\t|d tƒr\|d  |	¡ q˜| |	g¡ q˜t|ƒdk s„|jd k	r|jd k	rÈt|ƒdkr°ˆ  d|j ¡ nˆ  d|j ¡ ˆ  ¡  |D ]}
t|
tƒrtt|
ƒƒ}|jd krˆ  d| ¡ nˆ  |d ¡ nÊ|jd kr0ˆ  d|
¡ n
ˆ  |
¡ d}|jjrTˆ  d¡ n |jjrjˆ  d¡ n
ˆ  d¡ ˆ jjd k	r°ˆ  d¡ tˆ jjddƒr¨ˆ  d¡ |d7 }ˆ  |
|¡ ˆ  d| ¡ |jd k	rÌˆ  d¡ qÌ|jd k	rŠˆ  ¡  ˆ  t|ƒdkrdpd¡ npg }g }|D ]>}
t|
tƒrN| t|
ƒ dd¡¡ n| d¡ | |
¡ q&ˆ  d¡ ˆ  tt|ƒƒd ¡ ˆ  ¡  |D ]ä}ˆ  |¡ d}|jjrÂˆ  d¡ |d7 }n|jjrÞˆ  d¡ |d7 }ˆ jjd k	rVˆ  d¡ tˆ jjddƒrˆ  d¡ n:tˆ jjddƒr2ˆ  d¡ ntˆ jjddƒrNˆ  d¡ |d7 }ˆ  ||¡ ˆ  d| d  ¡ q’ˆ  ¡  ˆ  d¡ |r˜ˆ  ¡  d S )!NTZcontextfunctionFZevalcontextfunctionZenvironmentfunctionc                    s   t ˆ j ˆ j| ¡ƒS r#   ©r   r7   Úfinalize©r®   rx   r/   r0   Ú<lambda>×  s   ÿz,CodeGenerator.visit_Output.<locals>.<lambda>c                    s   t ˆ j | ¡ƒS r#   rG  rI  rx   r/   r0   rJ  Ú  ó    r  Ú__html__rî   r3  rn   r£   z%s.extend((r¢   rä   z7(escape if context.eval_ctx.autoescape else to_string)(zescape(z
to_string(zenvironment.finalize(ú	context, r¥   ú))ú%z%%z%sz % (r   úcontext.eval_ctx, úenvironment, rµ   )rˆ   rb   r7   rH  r¼   r   r˜   r›   r   Ú
ImpossibleÚas_constr%   r­   r   ÚhasattrrL  r   Ú	Exceptionr3   rE   rÙ   rc   rã   r   r¯   r&   r¦   r(   rœ   r-  )r)   r*   r+   Zallow_constant_finalizerÎ   rH  Zoutdent_laterr×   ÚchildZconstrK   ÚvalÚcloseÚformatZ	argumentsZargumentr/   rx   r0   Úvisit_OutputÊ  sì    
ÿ














 ÿ
"








 ÿ ÿ ÿ

zCodeGenerator.visit_Outputc                 C   sF   |   ¡  |  |¡ |  |j|¡ |  d¡ |  |j|¡ |  |¡ d S rB  )rö   r¯   r(   rÇ   r¦   r*   rý   r  r/   r/   r0   Úvisit_Assign[  s    

zCodeGenerator.visit_Assignc                 C   s²   |   ¡  | ¡ }d|_|j |¡ |  |¡ |  |¡ |  |j|¡ |  	|¡ |  
|j|¡ |  d¡ |jd k	r€|  |j|¡ n|  d|j ¡ |  d¡ |  |¡ |  |¡ d S )NFz9 = (Markup if context.eval_ctx.autoescape else identity)(ú
concat(%s)r¥   )rö   rp   rb   r_   rÔ   rÉ   rc   r«   r×   r¯   r(   rÇ   r¦   r@  r{   rý   rÌ   )r)   r*   r+   r  r/   r/   r0   Úvisit_AssignBlockc  s     






zCodeGenerator.visit_AssignBlockc                 C   s’   |j dkr(|jr(| jr(| jd  |j¡ |j |j¡}|j dkr„|j |¡}|d k	rj|d tkrj|  	|¡r„|  
d|j||f ¡ d S |  
|¡ d S )Nr4  rî   r~   r   z-(undefined(name=%r) if %s is missing else %s))r   r`   r‘   rz   r8   r_   rÖ   Z	find_loadr   rõ   r¦   )r)   r*   r+   rÖ   r~   r/   r/   r0   r   |  s    
ÿ
ÿzCodeGenerator.visit_Namec                 C   sR   |j  |j¡}|  d| ¡ |  ¡  |  dd ¡ |  ¡  |  d||jf ¡ d S )Nz!if not isinstance(%s, Namespace):r  z/cannot assign attribute on non-namespace objectz%s[%r])r_   rÖ   r8   r˜   r›   rœ   Úattr)r)   r*   r+   rÖ   r/   r/   r0   Úvisit_NSRef  s    ÿzCodeGenerator.visit_NSRefc                 C   s8   |  |j¡}t|tƒr&|  t|ƒ¡ n|  t|ƒ¡ d S r#   )rS  r%   r3   rB   r¦   Ústrrã   )r)   r*   r+   rW  r/   r/   r0   Úvisit_Const›  s    
zCodeGenerator.visit_Constc                 C   sF   z|   t| |j¡ƒ¡ W n& tjk
r@   |   d|j ¡ Y nX d S )Nz9(Markup if context.eval_ctx.autoescape else identity)(%r))r¦   rã   rS  r%   r   rR  Údatar  r/   r/   r0   Úvisit_TemplateData¢  s    ÿz CodeGenerator.visit_TemplateDatac                 C   sV   |   d¡ d}t|jƒD ]"\}}|r.|   d¡ |  ||¡ q|   |dkrLdpNd¡ d S )Nú(rî   rµ   r   z,)r¥   ©r¦   rÕ   r"   r(   ©r)   r*   r+   rà   rK   r/   r/   r0   Úvisit_Tuple©  s    

zCodeGenerator.visit_Tuplec                 C   sF   |   d¡ t|jƒD ]"\}}|r*|   d¡ |  ||¡ q|   d¡ d S )Nú[rµ   ú]re  rf  r/   r/   r0   Ú
visit_List²  s    

zCodeGenerator.visit_Listc                 C   s`   |   d¡ t|jƒD ]<\}}|r*|   d¡ |  |j|¡ |   d¡ |  |j|¡ q|   d¡ d S )Nr+  rµ   z: r¶   )r¦   rÕ   r"   r(   rL   rJ   rf  r/   r/   r0   Ú
visit_Dictº  s    


zCodeGenerator.visit_Dictc                    s   t ‡ fdd„ƒ}|S )Nc                    sŒ   | j jrJˆ | j jkrJ|  dˆ  ¡ |  |j|¡ |  d¡ |  |j|¡ n4|  d¡ |  |j|¡ |  dˆ  ¡ |  |j|¡ |  d¡ d S )Nz$environment.call_binop(context, %r, rµ   rd  ú %s r¥   )r7   Ú	sandboxedZintercepted_binopsr¦   r(   ÚleftÚrightr  ©Úoperatorr/   r0   rQ   Å  s    
ÿ

z$CodeGenerator.binop.<locals>.visitor©r2   ©rq  ÚinterceptablerQ   r/   rp  r0   ÚbinopÄ  s    zCodeGenerator.binopc                    s   t ‡ fdd„ƒ}|S )Nc                    s\   | j jr2ˆ | j jkr2|  dˆ  ¡ |  |j|¡ n|  dˆ  ¡ |  |j|¡ |  d¡ d S )Nz#environment.call_unop(context, %r, rd  r¥   )r7   rm  Zintercepted_unopsr¦   r(   r*   r  rp  r/   r0   rQ   Ö  s    
ÿz#CodeGenerator.uaop.<locals>.visitorrr  rs  r/   rp  r0   ÚuaopÕ  s    	zCodeGenerator.uaopú+ú-Ú*ú/z//z**rO  Úand)rt  Úorznot c                 C   s^   |j jrd}n|j jrd}nd}|  d| ¡ |jD ]}|  ||¡ |  d¡ q4|  d¡ d S )Nz;(context.eval_ctx.volatile and markup_join or unicode_join)Zmarkup_joinZunicode_joinz%s((rµ   rN  )r%   r&   r   r¦   r   r(   )r)   r*   r+   r  rº   r/   r/   r0   Úvisit_Concatð  s    
zCodeGenerator.visit_Concatc                 C   s*   |   |j|¡ |jD ]}|   ||¡ qd S r#   )r(   rD  Zops)r)   r*   r+   Úopr/   r/   r0   Úvisit_Compareÿ  s    
zCodeGenerator.visit_Comparec                 C   s&   |   dt|j  ¡ |  |j|¡ d S )Nrl  )r¦   Ú	operatorsr~  r(   rD  r  r/   r/   r0   Úvisit_Operand  s    zCodeGenerator.visit_Operandc                 C   s,   |   d¡ |  |j|¡ |   d|j ¡ d S )Nzenvironment.getattr(r  )r¦   r(   r*   r^  r  r/   r/   r0   Úvisit_Getattr	  s    
zCodeGenerator.visit_Getattrc                 C   s~   t |jtjƒr@|  |j|¡ |  d¡ |  |j|¡ |  d¡ n:|  d¡ |  |j|¡ |  d¡ |  |j|¡ |  d¡ d S )Nrh  ri  zenvironment.getitem(rµ   r¥   )r3   rº   r   ZSlicer(   r*   r¦   r  r/   r/   r0   Úvisit_Getitem  s    


zCodeGenerator.visit_Getitemc                 C   s`   |j d k	r|  |j |¡ |  d¡ |jd k	r:|  |j|¡ |jd k	r\|  d¡ |  |j|¡ d S )Nr1  )Ústartr(   r¦   Ústopr¡   r  r/   r/   r0   Úvisit_Slice  s    




zCodeGenerator.visit_Slicec                 C   s,  | j jr|  d¡ |  | j|j d ¡ | j j |j¡}|d krT|  d|j |j¡ t|ddƒrl|  d¡ n.t|ddƒr„|  d¡ nt|d	dƒrš|  d
¡ |j	d k	r´|  
|j	|¡ nJ|jjrÔ|  d|j|jf ¡ n*|jjrî|  d|j ¡ n|  d|j ¡ |  ||¡ |  d¡ | j jr(|  d¡ d S )Núawait auto_await(rd  zno filter named %rZcontextfilterFrM  ZevalcontextfilterrP  ZenvironmentfilterrQ  zB(context.eval_ctx.autoescape and Markup(concat(%s)) or concat(%s))zMarkup(concat(%s))r\  r¥   )r7   rÍ   r¦   rv   r8   Úgetr–   r•   r¼   r*   r(   r%   r&   rc   r   r»   )r)   r*   r+   rÎ   r/   r/   r0   r{   (  s2    



þ

zCodeGenerator.visit_Filterc                 C   s`   |   | j|j d ¡ |j| jjkr8|  d|j |j¡ |  |j|¡ |  ||¡ |   d¡ d S )Nrd  zno test named %rr¥   )	r¦   rw   r8   r7   r–   r•   r(   r*   r»   r  r/   r/   r0   r|   H  s    zCodeGenerator.visit_Testc                    s^   ‡ ‡‡fdd„}ˆ  d¡ ˆ ˆjˆ ¡ ˆ  d¡ ˆ ˆjˆ ¡ ˆ  d¡ |ƒ  ˆ  d¡ d S )Nc                      s4   ˆj d k	rˆ ˆj ˆ ¡S ˆ ddˆ ˆ¡  ¡ 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/   r0   Úwrite_expr2S  s
    
þz1CodeGenerator.visit_CondExpr.<locals>.write_expr2rd  z if z else r¥   )r¦   r(   Zexpr1r0  )r)   r*   r+   rŠ  r/   r‰  r0   Úvisit_CondExprQ  s    


zCodeGenerator.visit_CondExprc                 C   s|   | j jr|  d¡ | j jr&|  d¡ n
|  d¡ |  |j|¡ |rJddipLd }|  |||¡ |  d¡ | j jrx|  d¡ d S )Nr‡  zenvironment.call(context, zcontext.call(rÏ   r¥   )r7   rÍ   r¦   rm  r(   r*   r»   )r)   r*   r+   r<  r¹   r/   r/   r0   r=  b  s    


zCodeGenerator.visit_Callc                 C   s"   |   |jd ¡ |  |j|¡ d S )Nú=)r¦   rL   r(   rJ   r  r/   r/   r0   Úvisit_Keywordq  s    zCodeGenerator.visit_Keywordc                 C   s&   |   d¡ |  |j|¡ |   d¡ d S )NzMarkup(r¥   ©r¦   r(   rD  r  r/   r/   r0   Úvisit_MarkSafew  s    
zCodeGenerator.visit_MarkSafec                 C   s&   |   d¡ |  |j|¡ |   d¡ d S )Nz5(context.eval_ctx.autoescape and Markup or identity)(r¥   rŽ  r  r/   r/   r0   Úvisit_MarkSafeIfAutoescape|  s    
z(CodeGenerator.visit_MarkSafeIfAutoescapec                 C   s   |   d|j ¡ d S )Nzenvironment.©r¦   r8   r  r/   r/   r0   Úvisit_EnvironmentAttribute  s    z(CodeGenerator.visit_EnvironmentAttributec                 C   s   |   d|j|jf ¡ d S )Nzenvironment.extensions[%r].%s)r¦   Z
identifierr8   r  r/   r/   r0   Úvisit_ExtensionAttribute„  s    z&CodeGenerator.visit_ExtensionAttributec                 C   s   |   | j|j ¡ d S r#   )r¦   r…   r	  r  r/   r/   r0   Úvisit_ImportedName‡  s    z CodeGenerator.visit_ImportedNamec                 C   s   |   |j¡ d S r#   r‘  r  r/   r/   r0   Úvisit_InternalNameŠ  s    z CodeGenerator.visit_InternalNamec                 C   s   |   d¡ d S )Nr„   )r¦   r  r/   r/   r0   Úvisit_ContextReference  s    z$CodeGenerator.visit_ContextReferencec                 C   s   |   d|¡ d S )NÚcontinuerë   r  r/   r/   r0   Úvisit_Continue  s    zCodeGenerator.visit_Continuec                 C   s   |   d|¡ d S )NÚbreakrë   r  r/   r/   r0   Úvisit_Break“  s    zCodeGenerator.visit_Breakc                 C   s:   |  ¡ }|j |¡ |  |¡ |  |j|¡ |  |¡ d S r#   )rp   r_   rÔ   rÉ   r«   r×   rÌ   )r)   r*   r+   Úscope_framer/   r/   r0   Úvisit_Scope–  s
    
zCodeGenerator.visit_Scopec                 C   sŒ   |   ¡ }|  d||  |¡f ¡ |  d| ¡ |  |j|¡ |  |¡ |jdd}|j |¡ |  	|¡ |  
|j|¡ |  |¡ |  ¡  d S )Nr¿   z
%s.vars = T)ro   )r—   r˜   rô   r(   r„   rð   rp   r_   rÔ   rÉ   r«   r×   rÌ   rñ   )r)   r*   r+   r   r›  r/   r/   r0   Úvisit_OverlayScope  s    


z CodeGenerator.visit_OverlayScopec              	   C   sp   |j D ]d}|  d|j ¡ |  |j|¡ z|j |j¡}W n tjk
rX   d|j_	Y qX t
|j|j|ƒ qd S )Nzcontext.eval_ctx.%s = T)Zoptionsr˜   rL   r(   rJ   rS  r%   r   rR  r&   Úsetattr)r)   r*   r+   ÚkeywordrW  r/   r/   r0   Úvisit_EvalContextModifier«  s    
z'CodeGenerator.visit_EvalContextModifierc                 C   sb   |   ¡ }|j ¡ }|  d| ¡ |  ||¡ |jD ]}|  ||¡ q2|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_ctxrV  r/   r/   r0   Úvisit_ScopedEvalContextModifier¶  s    

z-CodeGenerator.visit_ScopedEvalContextModifier)NFT)F)rn   )N)N)Nr   )Nr   )N)F)N)T)T)F)drY   rZ   r[   rX   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  r}   r  r   r*  r.  r8  r:  r;  r?  rA  rE  rF  rZ  r[  r]  r   r_  ra  rc  rg  rj  rk  ru  rv  Z	visit_AddZ	visit_SubZ	visit_MulZ	visit_DivZvisit_FloorDivZ	visit_PowZ	visit_ModZ	visit_AndZvisit_OrZ	visit_PosZ	visit_NegZ	visit_Notr2   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/   r0   rƒ   ô   sÜ       ÿ
C






5
M		
t /6@  	










rƒ   )NFT)=rr   Ú	itertoolsr   rk   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   r€  rT  rI   r  r  Úexecr­   ÚSyntaxErrorr  r2   r<   rH   rR   rf   rS   r\   ÚRuntimeErrorrN   ru   rM   rU  r‚   rƒ   r/   r/   r/   r0   Ú<module>   sb   	$ø

    ÿ
	>