B
    eÐùYjÿ  ã            	   @   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* ,d¡ W n e-k
r    Y nX ye+dƒ W n e-k
rH   dZ.Y nX dZ.dd „ Z/d6d"d#„Z0d$d%„ Z1d&d'„ Z2G d(d)„ d)e3ƒZ4G d*d+„ d+e3ƒZ5G d,d-„ d-e6ƒZ7G d.d/„ d/eƒZ8G d0d1„ d1eƒZ9G d2d3„ d3e:ƒZ;G d4d5„ d5eƒZ<d!S )7z­
    jinja2.compiler
    ~~~~~~~~~~~~~~~

    Compiles nodes into python code.

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

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

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