U
    (Q^jÿ  ã                	   @   sä  d Z ddlmZ ddlmZ ddlmZ ddlm	Z	 ddl
mZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZmZmZ ddlmZmZmZmZmZmZmZ ddl m!Z!m"Z"m#Z#m$Z$m%Z% dddddddddœZ&e'e(dƒrêdZ)ndZ)dgZ*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   Únotinr   ÚitemsÚdivisionz%from __future__ import generator_stopÚ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© ú3/tmp/pip-install-bd4o36v9/Jinja2/jinja2/compiler.pyÚnew_func@   s
    zoptimizeconst.<locals>.new_funcr   )r1   r4   r2   r0   r3   Úoptimizeconst?   s    r5   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   ÚTemplateÚ	TypeErrorZcode_generator_classr+   ÚstreamÚgetvalue)r-   ÚenvironmentÚnameÚfilenamer9   Ú
defer_initr'   Ú	generatorr2   r2   r3   Ú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Úkeyr2   r2   r3   rL   W   s"    rL   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-   r2   r2   r3   Úfind_undeclaredl   s    rV   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-   r2   r2   r3   Ú__init__{   s    zMacroRef.__init__N)Ú__name__Ú
__module__Ú__qualname__r\   r2   r2   r2   r3   rW   y   s   rW   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(   ri   rb   r2   r2   r3   r\   …   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__Úupdaterc   Úcopy©r,   Úrvr2   r2   r3   ro   ¥   s    z
Frame.copyFc                 C   s&   |rt | j| jjd dS t | j| ƒS )zReturn an inner frame.é   ra   )r`   r(   rc   rb   )r,   Úisolatedr2   r2   r3   Ú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)ro   re   rp   r2   r2   r3   Úsoft²   s    z
Frame.soft)NN)F)	r]   r^   r_   Ú__doc__r\   ro   rt   ru   Ú__copy__r2   r2   r2   r3   r`   ‚   s   
 
r`   c                   @   s   e Zd ZdZdS )rR   z?Exception used by the `UndeclaredNameVisitor` to signal a stop.N©r]   r^   r_   rv   r2   r2   r2   r3   rR   À   s   rR   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&   )rJ   ÚfiltersÚtests©r,   r2   r2   r3   r\   Ç   s    z DependencyFinderVisitor.__init__c                 C   s   |   |¡ | j |j¡ d S r&   )Úgeneric_visitrz   Úaddr<   r[   r2   r2   r3   Úvisit_FilterË   s    
z$DependencyFinderVisitor.visit_Filterc                 C   s   |   |¡ | j |j¡ d S r&   )r}   r{   r~   r<   r[   r2   r2   r3   Ú
visit_TestÏ   s    
z"DependencyFinderVisitor.visit_Testc                 C   s   dS )zStop visiting at blocks.Nr2   r[   r2   r2   r3   Úvisit_BlockÓ   s    z#DependencyFinderVisitor.visit_BlockN)r]   r^   r_   rv   r\   r   r€   r   r2   r2   r2   r3   ry   Ä   s
   ry   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	rQ   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&   )rJ   rT   rS   )r,   rT   r2   r2   r3   r\   Ý   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)Úctxr<   rT   rS   r~   rR   Údiscardr[   r2   r2   r3   Ú
visit_Nameá   s
    z UndeclaredNameVisitor.visit_Namec                 C   s   dS )zStop visiting a blocks.Nr2   r[   r2   r2   r3   r   é   s    z!UndeclaredNameVisitor.visit_BlockN)r]   r^   r_   rv   r\   r…   r   r2   r2   r2   r3   rQ   ×   s   rQ   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.
    Nrx   r2   r2   r2   r3   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   rr   TÚcontext)r   r;   r<   r=   r9   Zcreated_block_contextr>   r'   r
   r*   Úimport_aliasesÚblocksÚextends_so_farÚhas_known_extendsÚcode_linenor{   rz   Ú
debug_infoÚ_write_debug_infoÚ
_new_linesÚ
_last_lineÚ_first_writeÚ_last_identifierÚ_indentationÚ_assign_stackÚ_param_def_blockÚ_context_reference_stack)r,   r;   r<   r=   r9   r>   r'   r2   r2   r3   r\   ö   s8    
zCodeGenerator.__init__c                 C   s   t ||| j| jƒ‚dS )z*Fail with a :exc:`TemplateAssertionError`.N)r   r<   r=   )r,   ÚmsgÚlinenor2   r2   r3   Úfail9  s    zCodeGenerator.failc                 C   s   |  j d7  _ d| j  S )zGet a new unique identifier.rr   zt_%d)r“   r|   r2   r2   r3   Ú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›   rg   Ú	writeline©r,   r.   r2   r2   r3   rg   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œ   Úindentrg   ÚoutdentÚ
autoescape)r,   r.   Úforce_unescapedr2   r2   r3   Úreturn_buffer_contentsG  s    

z$CodeGenerator.return_buffer_contentsc                 C   s   |  j d7  _ dS )zIndent by one.rr   N©r”   r|   r2   r2   r3   rŸ   Y  s    zCodeGenerator.indentrr   c                 C   s   |  j |8  _ dS )zOutdent by step.Nr¤   )r,   Ústepr2   r2   r3   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()rg   rœ   )r,   r.   r-   r2   r2   r3   Ú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ú))rg   Úwriter   r2   r2   r3   Ú	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-   r2   r2   r3   Ú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-   r2   r2   r3   Ú
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’   r9   rª   r   r   rŽ   Úappendr”   )r,   Úxr2   r2   r3   rª   ~  s    

ÿzCodeGenerator.writer   c                 C   s   |   ||¡ |  |¡ dS )z!Combination of newline and write.N)Únewlinerª   )r,   r²   r-   Úextrar2   r2   r3   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.rr   N)Úmaxr   r™   r‘   r   )r,   r-   r´   r2   r2   r3   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&   )rP   ©Ú.0r²   r2   r2   r3   Ú	<genexpr>£  s     z*CodeGenerator.signature.<locals>.<genexpr>r2   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_kwargsrP   rN   )	r,   r-   r.   Úextra_kwargsZkwarg_workaroundÚkwargÚargrP   rN   r2   r2   r3   Ú	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.)rz   r{   z%s = environment.%s[%r]N)ry   r+   Úgetattrr›   rœ   )r,   r   rU   r-   Ú
dependencyÚmappingr<   r2   r2   r3   Ú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   rc   Úloadsr   r   rœ   Úget_resolve_funcr   r   r±   ÚNotImplementedErrorÚjoin)r,   r.   ÚundefsÚtargetÚactionÚparamr2   r2   r3   Úenter_frameÛ  s    ÿ
zCodeGenerator.enter_framec                 C   sD   |s@g }t |jjƒD ]\}}| |¡ q|r@|  dd |¡ ¡ d S )NrÆ   rÇ   )r   rc   rÈ   r±   rœ   rË   )r,   r.   Úwith_python_scoperÌ   rÍ   Ú_r2   r2   r3   Úleave_frameì  s    zCodeGenerator.leave_framec                 C   s   | j jrd| S d| S )Nzasync def %szdef %s)r;   Úis_async)r,   r<   r2   r2   r3   Ú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):Úmacror¹   úif %s is missing:z%s = undefined(%r, name=%r)zparameter %r was not providedú%s = )r¢   ©rÑ   )%rt   rc   Úanalyze_noderW   rJ   Ú	enumerater¼   r<   r~   r±   ÚrefrV   ÚbodyÚdefaultsÚlenÚ
IndexErrorrš   r™   Údeclare_parameterrX   rY   rZ   rf   rœ   rÕ   rË   rŸ   rg   rÐ   Úpush_parameter_definitionsr+   Úmark_parameter_storedr    Úpop_parameter_definitionsr¯   r£   rÓ   )r,   r-   r.   Ú	macro_refZexplicit_callerZskip_special_paramsr¼   Úidxr¿   rS   rÞ   Údefaultr2   r2   r3   Ú
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&   )Úreprr<   r¶   r2   r2   r3   r¸   H  s     z*CodeGenerator.macro_def.<locals>.<genexpr>r<   Nrr   ú,zLMacro(environment, macro, %r, (%s), %r, %r, %r, context.eval_ctx.autoescape))	rË   r-   r¼   rÁ   rá   rª   rY   rZ   rX   )r,   rç   r.   Z	arg_tupler<   r2   r2   r3   Ú	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™   r<   rë   )r,   r-   rq   r2   r2   r3   Ú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: %sNr2   )r·   r<   rÍ   r2   r2   r3   r¸   Y  s    z3CodeGenerator.dump_local_context.<locals>.<genexpr>)rË   r   rc   Zdump_storesr   r2   r2   r3   Ú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|   r2   r2   r3   Ú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±   rc   Zdump_param_targetsr   r2   r2   r3   rä   f  s    z(CodeGenerator.push_parameter_definitionsc                 C   s   | j  ¡  dS )z+Pops the current parameter definitions set.N)r–   Úpopr|   r2   r2   r3   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Í   r2   r2   r3   rå   s  s    z#CodeGenerator.mark_parameter_storedc                 C   s   | j  |¡ d S r&   )r—   r±   r÷   r2   r2   r3   Úpush_context_referencez  s    z$CodeGenerator.push_context_referencec                 C   s   | j  ¡  d S r&   )r—   rõ   r|   r2   r2   r3   Úpop_context_reference}  s    z#CodeGenerator.pop_context_referencec                 C   s
   | j d S )Nrö   ©r—   r|   r2   r2   r3   Úget_context_ref€  s    zCodeGenerator.get_context_refc                 C   s   | j d }|dkrdS d| S )Nrö   rˆ   Úresolvez
%s.resolverú   r÷   r2   r2   r3   rÉ   ƒ  s    
zCodeGenerator.get_resolve_funcc                 C   s   d|   ¡ |  |¡f S )Nz%s.derived(%s))rû   rò   r   r2   r2   r3   Ú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÷   r2   r2   r3   Ú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±   rJ   r|   r2   r2   r3   Ú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 )Nrr   rÒ   r2   r¶   r2   r2   r3   Ú
<listcomp>   s      z5CodeGenerator.pop_assign_tracking.<locals>.<listcomp>rr   úcontext.vars[%r] = %szcontext.vars.update({r¹   rñ   z})úcontext.exported_vars.add(%r)r   z"context.exported_vars.update((%s)))r•   rõ   rd   rá   ÚnextÚiterrc   rÞ   rœ   rÝ   rª   rË   r   rë   )r,   r.   ÚvarsZpublic_namesr<   rÞ   rè   r2   r2   r3   Ú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Ú.rr   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 = 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_%sNr2   r¶   r2   r2   r3   r¸   #  s   ÿz/CodeGenerator.visit_Template.<locals>.<genexpr>zdebug_info = %rú&c                 s   s   | ]}d | V  qdS )z%s=%sNr2   r¶   r2   r2   r3   r¸   (  s     ).ÚAssertionErrorr   r;   r<   Zjinja2.runtimer  rœ   rË   Úcode_featuresrÔ   r>   Úfindr   ZExtendsÚfind_allZBlockrŠ   rš   r™   ZImportedNameÚ
importnamer‰   r›   ÚrsplitrÕ   rŸ   rô   r`   rV   rß   rc   rã   rÜ   rd   re   rŒ   rf   rÐ   rÄ   r¯   rÓ   r    Úsupports_yield_fromr   rh   rŽ   )r,   r-   r.   r(   ZexportedZenvenvZhave_extendsrh   Úimport_ÚimpÚaliasÚmoduleÚobjrÞ   r<   Úblock_framerS   r2   r2   r3   Ú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:rr   z$yield from context.blocks[%r][0](%s)ú	async forÚforz&%s event in context.blocks[%r][0](%s):Úevent)rd   rŒ   r‹   rœ   rŸ   Úscopedrý   rû   r  r;   rÔ   rg   r<   r­   r    )r,   r-   r.   rb   rˆ   Úloopr2   r2   r3   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)Trr   N)rd   rš   r™   r‹   rŒ   rœ   rŸ   r†   r    r+   Útemplaterª   r<   Údict_item_iterre   ©r,   r-   r.   r2   r2   r3   Ú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Ÿ   r6   r$  r   ZConstrN   r   rH   rI   ZTupleZListr+   rª   r<   r    Úwith_contextr;   rÔ   rò   r  r­   )r,   r-   r.   Ú	func_nameZskip_event_yieldr!  r2   r2   r3   Ú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œ   rc   rÞ   rÍ   rd   rª   r;   rÔ   r+   r$  r<   r(  rò   Ú
startswithr&  r2   r2   r3   Ú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ˆ 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/  r0  r1  z,%s = getattr(included_template, %r, missing)rÙ   z9%s = undefined(%r %% included_template.__name__, name=%r)zGthe template %%r (imported on %s) does not export the requested name %srÒ   rr   r   r  zcontext.vars.update({%s})r¹   c                 3   s"   | ]}d |ˆ j  |¡f V  qdS rð   )rc   rÞ   )r·   r<   ©r.   r2   r3   r¸   õ  s    z1CodeGenerator.visit_FromImport.<locals>.<genexpr>r2  z-context.exported_vars.difference_update((%s))N)r³   rª   r;   rÔ   r+   r$  r<   r(  rò   rT   r6   rH   rœ   rc   rÞ   rŸ   rï   rë   r    rd   r±   r3  rá   rË   r   )r,   r-   r.   Z	var_namesZdiscarded_namesr<   r  r2   r5  r3   Úvisit_FromImportÅ  st    
ÿÿÿ



ÿ
þÿûý	

ÿÿÿÿ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ß   )Ú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))#rt   Ú	recursiverV   Ziter_child_nodesrc   rã   rÜ   Úelse_r9  r›   rœ   rÕ   rŸ   rÐ   r;   rÔ   r+   rÍ   rª   r    rÓ   rg   r  r   ÚNamerƒ   r<   rš   r™   r  r¯   rß   r£   r¨   r«   )r,   r-   r.   Z
loop_frameZ
test_frameZ
else_frameZextended_loopZloop_refZloop_filter_funcr<   Ziteration_indicatorr2   r2   r3   Ú	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 )Nr;  r:  zelif rž   )ru   rœ   r+   r9  rª   rŸ   r¯   rß   r    Úelif_r?  )r,   r-   r.   Zif_framerB  r2   r2   r3   Ú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³   rd   r<   r3  rª   rc   rÞ   rœ   rí   )r,   r-   r.   Zmacro_framerç   rÞ   r2   r2   r3   Ú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ç   r2   r2   r3   Úvisit_CallBlock¢  s    
zCodeGenerator.visit_CallBlockc                 C   sh   |  ¡ }|j |¡ |  |¡ |  |¡ |  |j|¡ |  ||¡ |  |j	|¡ |  
|¡ |  |¡ d S r&   )rt   rc   rÜ   rÐ   rg   r¯   rß   r¨   r   Úfilterr«   rÓ   )r,   r-   r.   Zfilter_framer2   r2   r3   Úvisit_FilterBlockª  s    


zCodeGenerator.visit_FilterBlockc                 C   s„   |  ¡ }|j |¡ |  |¡ tt|j|jƒƒD ]6\}\}}|  ¡  |  	||¡ |  
d¡ |  	||¡ q0|  |j|¡ |  |¡ d S ©NrÇ   )rt   rc   rÜ   rÐ   rÝ   r   ÚtargetsÚvaluesr³   r+   rª   r¯   rß   rÓ   )r,   r-   r.   Z
with_framerè   rÍ   Úexprr2   r2   r3   Ú
visit_Withµ  s    

zCodeGenerator.visit_Withc                 C   s   |   |¡ |  |j|¡ d S r&   )r³   r+   r-   r&  r2   r2   r3   Ú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   r;   Úfinalize©r²   r|   r2   r3   Ú<lambda>Ò  s   ÿz,CodeGenerator.visit_Output.<locals>.<lambda>c                    s   t ˆ j | ¡ƒS r&   rQ  rS  r|   r2   r3   rT  Õ  ó    r  Ú__html__rö   r<  rr   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Œ   rf   r;   rR  rÁ   r   rœ   rŸ   r   Ú
ImpossibleÚas_constr(   r±   r¡   ÚhasattrrV  r   Ú	Exceptionr6   rI   rá   rg   rë   r   r³   r)   rª   r+   r    Úreplace)r,   r-   r.   Zallow_constant_finalizerÕ   rR  Zoutdent_laterrß   ÚchildÚconstrO   ÚvalÚcloseÚformatÚ	argumentsÚargumentr2   r|   r3   Úvisit_OutputÅ  sì    
ÿ














 ÿ
"








 ÿ ÿ ÿ

zCodeGenerator.visit_Outputc                 C   sF   |   ¡  |  |¡ |  |j|¡ |  d¡ |  |j|¡ |  |¡ d S rK  )rÿ   r³   r+   rÍ   rª   r-   r  r&  r2   r2   r3   Ú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)(ú
concat(%s)r©   )rÿ   rt   rf   rc   rÜ   rÐ   rg   r¯   rß   r³   r+   rÍ   rª   rI  r   r  rÓ   )r,   r-   r.   r  r2   r2   r3   Ú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ö   r‚   r   z-(undefined(name=%r) if %s is missing else %s))rƒ   rd   r•   r~   r<   rc   rÞ   Z	find_loadr   rþ   rª   )r,   r-   r.   rÞ   r‚   r2   r2   r3   r…   w  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])rc   rÞ   r<   rœ   rŸ   r    Úattr)r,   r-   r.   rÞ   r2   r2   r3   Úvisit_NSRefŠ  s    ÿzCodeGenerator.visit_NSRefc                 C   s8   |  |j¡}t|tƒr&|  t|ƒ¡ n|  t|ƒ¡ d S r&   )r]  r(   r6   rF   rª   Ústrrë   )r,   r-   r.   rc  r2   r2   r3   Ú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ë   r]  r(   r   r\  Údatar&  r2   r2   r3   Ú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è   rO   r2   r2   r3   Úvisit_Tuple¤  s    

zCodeGenerator.visit_Tuplec                 C   sF   |   d¡ t|jƒD ]"\}}|r*|   d¡ |  ||¡ q|   d¡ d S )Nú[r¹   ú]rs  rt  r2   r2   r3   Ú
visit_List­  s    

zCodeGenerator.visit_Listc                 C   s`   |   d¡ t|jƒD ]<\}}|r*|   d¡ |  |j|¡ |   d¡ |  |j|¡ q|   d¡ d S )NÚ{r¹   z: rº   )rª   rÝ   r#   r+   rP   rN   rt  r2   r2   r3   Ú
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¹   rr  ú %s r©   )r;   Ú	sandboxedZintercepted_binopsrª   r+   ÚleftÚrightr&  ©Úoperatorr2   r3   rU   À  s    
ÿ

z$CodeGenerator.binop.<locals>.visitor©r5   ©r€  ÚinterceptablerU   r2   r  r3   Ú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, rr  r©   )r;   r|  Zintercepted_unopsrª   r+   r-   r&  r  r2   r3   rU   Ñ  s    
ÿz#CodeGenerator.uaop.<locals>.visitorr  r‚  r2   r  r3   ÚuaopÐ  s    	zCodeGenerator.uaopú+ú-Ú*ú/z//z**rY  Úand)rƒ  Ú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¹   rX  )r(   r)   r¡   rª   r   r+   )r,   r-   r.   r)  r¿   r2   r2   r3   Úvisit_Concatë  s    
zCodeGenerator.visit_Concatc                 C   s*   |   |j|¡ |jD ]}|   ||¡ qd S r&   )r+   rN  Úops)r,   r-   r.   Úopr2   r2   r3   Úvisit_Compareú  s    
zCodeGenerator.visit_Comparec                 C   s&   |   dt|j  ¡ |  |j|¡ d S )Nr{  )rª   Ú	operatorsrŽ  r+   rN  r&  r2   r2   r3   Úvisit_Operand   s    zCodeGenerator.visit_Operandc                 C   s,   |   d¡ |  |j|¡ |   d|j ¡ d S )Nzenvironment.getattr(r#  )rª   r+   r-   rl  r&  r2   r2   r3   Ú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 )Nrv  rw  zenvironment.getitem(r¹   r©   )r6   r¿   r   ZSlicer+   r-   rª   r&  r2   r2   r3   Ú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&  r2   r2   r3   Ú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(rr  zno filter named %rZcontextfilterFrW  ZevalcontextfilterrZ  Zenvironmentfilterr[  zB(context.eval_ctx.autoescape and Markup(concat(%s)) or concat(%s))zMarkup(concat(%s))rj  r©   )r;   rÔ   rª   rz   r<   Úgetrš   r™   rÁ   r-   r+   r(   r)   rg   r¡   rÀ   )r,   r-   r.   rÕ   r2   r2   r3   r   #  s2    



þ

zCodeGenerator.visit_Filterc                 C   s`   |   | j|j d ¡ |j| jjkr8|  d|j |j¡ |  |j|¡ |  ||¡ |   d¡ d S )Nrr  zno test named %rr©   )	rª   r{   r<   r;   rš   r™   r+   r-   rÀ   r&  r2   r2   r3   r€   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ï   r2   ©r.   r-   r,   r2   r3   Úwrite_expr2N  s
    
þz1CodeGenerator.visit_CondExpr.<locals>.write_expr2rr  z if z else r©   )rª   r+   Úexpr1r9  )r,   r-   r.   rš  r2   r™  r3   Ú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 )Nr—  zenvironment.call(context, zcontext.call(rÖ   r©   )r;   rÔ   rª   r|  r+   r-   rÀ   )r,   r-   r.   rE  r½   r2   r2   r3   rF  ]  s    


zCodeGenerator.visit_Callc                 C   s"   |   |jd ¡ |  |j|¡ d S )Nú=)rª   rP   r+   rN   r&  r2   r2   r3   Úvisit_Keywordl  s    zCodeGenerator.visit_Keywordc                 C   s&   |   d¡ |  |j|¡ |   d¡ d S )NzMarkup(r©   ©rª   r+   rN  r&  r2   r2   r3   Ú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&  r2   r2   r3   Úvisit_MarkSafeIfAutoescapew  s    
z(CodeGenerator.visit_MarkSafeIfAutoescapec                 C   s   |   d|j ¡ d S )Nzenvironment.©rª   r<   r&  r2   r2   r3   Úvisit_EnvironmentAttribute|  s    z(CodeGenerator.visit_EnvironmentAttributec                 C   s   |   d|j|jf ¡ d S )Nzenvironment.extensions[%r].%s)rª   Ú
identifierr<   r&  r2   r2   r3   Úvisit_ExtensionAttribute  s    z&CodeGenerator.visit_ExtensionAttributec                 C   s   |   | j|j ¡ d S r&   )rª   r‰   r  r&  r2   r2   r3   Úvisit_ImportedName‚  s    z CodeGenerator.visit_ImportedNamec                 C   s   |   |j¡ d S r&   r¢  r&  r2   r2   r3   Úvisit_InternalName…  s    z CodeGenerator.visit_InternalNamec                 C   s   |   d¡ d S )Nrˆ   )rª   r&  r2   r2   r3   Úvisit_ContextReferenceˆ  s    z$CodeGenerator.visit_ContextReferencec                 C   s   |   d|¡ d S )NÚcontinueró   r&  r2   r2   r3   Úvisit_Continue‹  s    zCodeGenerator.visit_Continuec                 C   s   |   d|¡ d S )NÚbreakró   r&  r2   r2   r3   Úvisit_BreakŽ  s    zCodeGenerator.visit_Breakc                 C   s:   |  ¡ }|j |¡ |  |¡ |  |j|¡ |  |¡ d S r&   )rt   rc   rÜ   rÐ   r¯   rß   rÓ   )r,   r-   r.   Úscope_framer2   r2   r3   Ú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)rs   )r›   rœ   rý   r+   rˆ   rø   rt   rc   rÜ   rÐ   r¯   rß   rÓ   rù   )r,   r-   r.   rƒ   r­  r2   r2   r3   Ú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)Úoptionsrœ   rP   r+   rN   r]  r(   r   r\  r)   Úsetattr)r,   r-   r.   Úkeywordrc  r2   r2   r3   Ú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(   Úsaverœ   r³  rß   r+   Úrevert)r,   r-   r.   Zold_ctx_nameZ	saved_ctxra  r2   r2   r3   Úvisit_ScopedEvalContextModifier±  s    

z-CodeGenerator.visit_ScopedEvalContextModifier)NFT)F)rr   )N)N)Nr   )Nr   )N)F)N)T)T)F)dr]   r^   r_   r\   rš   r›   rg   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*  r4  r6  rA  rC  rD  rH  rJ  rO  rP  rh  ri  rk  r…   rm  ro  rq  ru  rx  rz  r„  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_Notr5   rŒ  r  r‘  r’  r“  r–  r   r€   rœ  rF  rž  r   r¡  r£  r¥  r¦  r§  r¨  rª  r¬  r®  r¯  r³  r¶  r2   r2   r2   r3   r‡   ô   sÜ       ÿ
C






5
M		
t /6;  	










r‡   )NFT)=rv   Ú	itertoolsr   ro   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  r^  rM   r%  r  Úexecr±   ÚSyntaxErrorr  r5   r@   rL   rV   rj   rW   r`   ÚRuntimeErrorrR   ry   rQ   r_  r†   r‡   r2   r2   r2   r3   Ú<module>   sb   	$ø

    ÿ
	>