U
    {±Ëh/^  ã                   @   sŠ   d Z ddlmZ ddlT ddlmZ G dd„ dƒZG dd„ deƒZG d	d
„ d
eƒZG dd„ deƒZ	G dd„ dee	ƒZ
G dd„ dee	ƒZdS )a  
Serializes a Cython code tree to Cython code. This is primarily useful for
debugging and testing purposes.
The output is in a strict format, no whitespace or comments from the input
is preserved (and it could not be as it is not present in the code tree).
é   )ÚTreeVisitor)Ú*)ÚCSimpleBaseTypeNodec                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚLinesResultc                 C   s   g | _ d| _d S ©NÚ )ÚlinesÚs©Úself© r   ú5/tmp/pip-unpacked-wheel-fhl22ezh/Cython/CodeWriter.pyÚ__init__   s    zLinesResult.__init__c                 C   s   |  j |7  _ d S ©N)r	   ©r   r	   r   r   r   Úput   s    zLinesResult.putc                 C   s   | j  | j¡ d| _d S r   )r   Úappendr	   r
   r   r   r   Únewline   s    zLinesResult.newlinec                 C   s   |   |¡ |  ¡  d S r   )r   r   r   r   r   r   Úputline   s    
zLinesResult.putlineN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   r   r      s   r   c                       sd  e Zd ZdZdZdV‡ fdd„	Zdd„ Zdd	„ Zd
d„ ZdWdd„Z	dd„ Z
dd„ ZdXdd„Zdd„ ZdYdd„Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Z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'dLdM„ Z(dNdO„ Z)dPdQ„ Z*dRdS„ Z+dTdU„ Z,‡  Z-S )ZÚDeclarationWriterzE
    A Cython code writer that is limited to declarations nodes.
    z    Nc                    s4   t ƒ  ¡  |d krtƒ }|| _d| _i | _d| _d S )Né    )Úsuperr   r   ÚresultÚ
numindentsÚ	tempnamesÚtempblockindex©r   r   ©Ú	__class__r   r   r   &   s    
zDeclarationWriter.__init__c                 C   s   |   |¡ | jS r   ©Úvisitr   ©r   Útreer   r   r   Úwrite/   s    
zDeclarationWriter.writec                 C   s   |  j d7  _ d S ©Nr   ©r   r
   r   r   r   Úindent3   s    zDeclarationWriter.indentc                 C   s   |  j d8  _ d S r'   r(   r
   r   r   r   Údedent6   s    zDeclarationWriter.dedentr   c                 C   s   | j  | j| j | ¡ d S r   )r   r   Úindent_stringr   r   r   r   r   Ú	startline9   s    zDeclarationWriter.startlinec                 C   s   | j  |¡ d S r   )r   r   r   r   r   r   r   <   s    zDeclarationWriter.putc                 C   s   | j  | j| j | ¡ d S r   )r   r   r+   r   r   r   r   r   r   ?   s    zDeclarationWriter.putlinec                 C   s   | j  |¡ d S r   )r   r   r   r   r   r   ÚendlineB   s    zDeclarationWriter.endlinec                 C   s   |   |¡ |  ¡  d S r   ©r,   r-   r   r   r   r   ÚlineE   s    
zDeclarationWriter.lineFc                 C   s”   t |ƒdkr|d d… D ]<}|  |¡ |rJ|jd k	rJ|  d¡ |  |j¡ |  d¡ q|  |d ¡ |r|d jd k	r|  d¡ |  |d j¡ d S )Nr   éÿÿÿÿú = ú, )Úlenr#   Údefaultr   )r   ÚitemsÚ
output_rhsÚitemr   r   r   Úcomma_separated_listI   s    


z&DeclarationWriter.comma_separated_listc                 C   s   |   ¡  |  |¡ |  ¡  d S r   )r)   r#   r*   ©r   Únoder   r   r   Ú_visit_indentedV   s    
z!DeclarationWriter._visit_indentedc                 C   s   t d| ƒ‚d S ©Nz"Node not handled by serializer: %r©ÚAssertionErrorr9   r   r   r   Ú
visit_Node[   s    zDeclarationWriter.visit_Nodec                 C   s   |   |¡ d S r   ©Zvisitchildrenr9   r   r   r   Úvisit_ModuleNode^   s    z"DeclarationWriter.visit_ModuleNodec                 C   s   |   |¡ d S r   r@   r9   r   r   r   Úvisit_StatListNodea   s    z$DeclarationWriter.visit_StatListNodec                 C   s8   |j d krd}n
d|j  }|  d| ¡ |  |j¡ d S )Nr   z"%s"zcdef extern from %s:)Zinclude_filer   r;   Úbody)r   r:   Úfiler   r   r   Úvisit_CDefExternNoded   s
    

z&DeclarationWriter.visit_CDefExternNodec                 C   s   |   d¡ |  |j¡ d S )Nr   ©r   r#   Úbaser9   r   r   r   Úvisit_CPtrDeclaratorNodel   s    
z*DeclarationWriter.visit_CPtrDeclaratorNodec                 C   s   |   d¡ |  |j¡ d S )Nú&rF   r9   r   r   r   Úvisit_CReferenceDeclaratorNodep   s    
z0DeclarationWriter.visit_CReferenceDeclaratorNodec                 C   s:   |   |j¡ |  d¡ |jd k	r,|   |j¡ |  d¡ d S ©Nú[ú])r#   rG   r   Z	dimensionr9   r   r   r   Úvisit_CArrayDeclaratorNodet   s
    

z,DeclarationWriter.visit_CArrayDeclaratorNodec                 C   s0   |   |j¡ |  d¡ |  |j¡ |  d¡ d S ©Nú(ú))r#   rG   r   r8   Úargsr-   r9   r   r   r   Úvisit_CFuncDeclaratorNode{   s    
z+DeclarationWriter.visit_CFuncDeclaratorNodec                 C   s   |   |j¡ d S r   ©r   Únamer9   r   r   r   Úvisit_CNameDeclaratorNode‚   s    z+DeclarationWriter.visit_CNameDeclaratorNodec                 C   sh   |j rN|  d|j ¡ |jdk r4|  d|j  ¡ n|jdkrN|  d|j ¡ |jd k	rd|  |j¡ d S )N)z	unsigned r   zsigned r   zshort zlong )Zis_basic_c_typer   ÚsignedZlongnessrU   r9   r   r   r   Úvisit_CSimpleBaseTypeNode…   s    


z+DeclarationWriter.visit_CSimpleBaseTypeNodec                 C   s   |   |j¡ |   |j¡ d S r   )r#   Ú	base_typeÚ
declaratorr9   r   r   r   Úvisit_CComplexBaseTypeNode   s    z,DeclarationWriter.visit_CComplexBaseTypeNodec                 C   s&   |   |j¡ |  d¡ |  |j¡ d S )NÚ.)r#   rY   r   rU   r9   r   r   r   Úvisit_CNestedBaseTypeNode”   s    
z+DeclarationWriter.visit_CNestedBaseTypeNodec                 C   s8   |   |j¡ |  d¡ |  |j|jj ¡ |  d¡ d S rK   )r#   Zbase_type_noder   r8   Úpositional_argsÚkeyword_argsZkey_value_pairsr9   r   r   r   Úvisit_TemplatedTypeNode™   s    
z)DeclarationWriter.visit_TemplatedTypeNodec                 C   s<   |   d¡ |  |j¡ |  d¡ | j|jdd |  ¡  d S )Núcdef ú T)r6   )r,   r#   rY   r   r8   Zdeclaratorsr-   r9   r   r   r   Úvisit_CVarDefNodeŸ   s
    

z#DeclarationWriter.visit_CVarDefNodec                 C   s   |   |¡ |jr@|  d¡ |  |j¡ |jd k	r@|  d|j ¡ |rN|  |¡ |  d¡ |  ¡  |sp|  d¡ n|D ]}|  |¡ qt|  ¡  d S )Nrb   ú "%s"ú:Úpass)	r,   rU   r   Úcnamer-   r)   r   r#   r*   )r   r:   ÚdeclÚextrasÚ
attributesÚ	attributer   r   r   Ú_visit_container_node¦   s    




z'DeclarationWriter._visit_container_nodec                 C   sP   |j rd}nd}|jdkr"|d7 }|jr0|d7 }||j7 }|  ||d |j¡ d S )Nú	ctypedef ra   Úpubliczpublic zpacked )Ztypedef_flagÚ
visibilityÚpackedÚkindrl   rj   )r   r:   rh   r   r   r   Úvisit_CStructOrUnionDefNode¹   s    

z-DeclarationWriter.visit_CStructOrUnionDefNodec                 C   sJ   d}|j rdd |j ¡ }|jr4|dd |j¡ 7 }|  |d||j¡ d S )Nr   z[%s]r2   z(%s)zcdef cppclass)Z	templatesÚjoinZbase_classesrl   rj   )r   r:   ri   r   r   r   Úvisit_CppClassNodeÅ   s    z$DeclarationWriter.visit_CppClassNodec                 C   s   |   |dd |j¡ d S )Nz	cdef enum)rl   r5   r9   r   r   r   Úvisit_CEnumDefNodeÍ   s    z$DeclarationWriter.visit_CEnumDefNodec                 C   sJ   |   |j¡ |jr"|  d|j ¡ |jr>|  d¡ |  |j¡ |  ¡  d S )Nrd   r1   )r,   rU   rg   r   Úvaluer#   r-   r9   r   r   r   Úvisit_CEnumDefItemNodeÐ   s    
z(DeclarationWriter.visit_CEnumDefItemNodec                 C   s˜   |j r
t‚|jr&|jD ]}|  |¡ q|  d¡ |  |j¡ |jr~|  d¡ |jrh|  |j¡ |  d¡ |  |j¡ |  d¡ |  	d¡ |  
|j¡ d S )Nzcdef class rP   r\   rQ   re   )Úmodule_namer>   Z
decoratorsr#   r,   r   Ú
class_nameZbase_class_nameZbase_class_moduler-   r;   rC   )r   r:   Ú	decoratorr   r   r   Úvisit_CClassDefNodeÙ   s    






z%DeclarationWriter.visit_CClassDefNodec                 C   s8   |   d¡ |  |j¡ |  d¡ |  |j¡ |  ¡  d S )Nrm   rb   )r,   r#   rY   r   rZ   r-   r9   r   r   r   Úvisit_CTypeDefNodeê   s
    

z$DeclarationWriter.visit_CTypeDefNodec                 C   s6   |   d|j ¡ |  |j¡ |  d¡ |  |j¡ d S )Nzdef %s(ú):)r,   rU   r8   rR   r-   r;   rC   r9   r   r   r   Úvisit_FuncDefNodeñ   s    
z#DeclarationWriter.visit_FuncDefNodec                 C   sÎ   |   |jrdnd¡ |jr6|  d |j¡¡ |  d¡ |jdkrV|  |j¡ |  d¡ |jrf|  d¡ |jrŽ|  |j¡ |jj	d k	rŽ|  d¡ |  |j
j¡ |  d¡ |  |j
j¡ |  d¡ |  |j¡ d S )Núcpdef ra   rb   Úprivateúapi rP   r}   )r,   ÚoverridableÚ	modifiersr   rs   ro   ÚapirY   r#   rU   rZ   rG   r8   rR   r-   r;   rC   r9   r   r   r   Úvisit_CFuncDefNodeø   s$    






z$DeclarationWriter.visit_CFuncDefNodec                 C   sh   t |jtƒr|jjd k	r8|  |j¡ |j ¡ r8|  d¡ |  |j¡ |jd k	rd|  d¡ |  |j¡ d S )Nrb   r1   )	Ú
isinstancerY   r   rU   r#   rZ   Zdeclared_namer   r4   r9   r   r   r   Úvisit_CArgDeclNode  s    
ÿ



z$DeclarationWriter.visit_CArgDeclNodec                 C   s>   |   d¡ |  |j¡ |jr2|  d¡ |  |j¡ |  ¡  d S )Nzcimport ú as )r,   r   rx   Úas_namer-   r9   r   r   r   Úvisit_CImportStatNode"  s    

z'DeclarationWriter.visit_CImportStatNodec                 C   s†   |   d¡ |  |j¡ |  d¡ d}|jD ]N\}}}}|d ksBt‚|rLd}n
|  d¡ |  |¡ |r*|  d¡ |  |¡ q*|  ¡  d S )Nzfrom z	 cimport TFr2   rˆ   )r,   r   rx   Zimported_namesr>   r-   )r   r:   ÚfirstÚposrU   r‰   rq   r   r   r   Úvisit_FromCImportStatNode*  s    




z+DeclarationWriter.visit_FromCImportStatNodec                 C   s   |   |j¡ d S r   rT   r9   r   r   r   Úvisit_NameNode;  s    z DeclarationWriter.visit_NameNodec                 C   s"   |   d¡ |  |j¡ |  ¡  d S )Nú@)r,   r#   rz   r-   r9   r   r   r   Úvisit_DecoratorNode>  s    
z%DeclarationWriter.visit_DecoratorNodec                 C   s   |   d¡ |  ¡  d S )Nrf   r.   r9   r   r   r   Úvisit_PassStatNodeC  s    
z$DeclarationWriter.visit_PassStatNode)N)r   )r   )F).r   r   r   Ú__doc__r+   r   r&   r)   r*   r,   r   r   r-   r/   r8   r;   r?   rA   rB   rE   rH   rJ   rN   rS   rV   rX   r[   r]   r`   rc   rl   rr   rt   ru   rw   r{   r|   r~   r…   r‡   rŠ   r   rŽ   r   r‘   Ú__classcell__r   r   r    r   r      sT   	


	r   c                   @   s°   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*S )+ÚStatementWriterzD
    A Cython code writer for most language statement features.
    c                 C   s6   |   ¡  |  |j¡ |  d¡ |  |j¡ |  ¡  d S ©Nr1   )r,   r#   Úlhsr   Úrhsr-   r9   r   r   r   Úvisit_SingleAssignmentNodeM  s
    
z*StatementWriter.visit_SingleAssignmentNodec                 C   s@   |   ¡  |jD ]}|  |¡ |  d¡ q|  |j¡ |  ¡  d S r•   )r,   Zlhs_listr#   r   r—   r-   )r   r:   r–   r   r   r   Úvisit_CascadedAssignmentNodeT  s    

z,StatementWriter.visit_CascadedAssignmentNodec                 C   s4   |   d¡ |  |jj¡ |js(|  d¡ |  ¡  d S )Nzprint ú,)r,   r8   Z	arg_tuplerR   Zappend_newliner   r-   r9   r   r   r   Úvisit_PrintStatNode\  s
    

z#StatementWriter.visit_PrintStatNodec                 C   s€   |   d¡ |jjr"|  |jj¡ n|  |j¡ |  d¡ |  |jj¡ |  	d¡ |  
|j¡ |jd k	r||  d¡ |  
|j¡ d S )Nzfor ú in re   úelse:)r,   ÚtargetZis_sequence_constructorr8   rR   r#   r   ÚiteratorÚsequencer-   r;   rC   Úelse_clauser/   r9   r   r   r   Úvisit_ForInStatNodec  s    




z#StatementWriter.visit_ForInStatNodec                 C   sœ   |   d¡ |  |jd j¡ |  d¡ |  |jd j¡ |jdd … D ]0}|   d¡ |  |j¡ |  d¡ |  |j¡ qF|jd k	r˜|  d¡ |  |j¡ d S )Nzif r   re   r   zelif r   )	r,   r#   Ú
if_clausesÚ	conditionr-   r;   rC   r¡   r/   )r   r:   Zclauser   r   r   Úvisit_IfStatNodeq  s    





z StatementWriter.visit_IfStatNodec                 C   sP   |   d¡ |  |j¡ |  d¡ |  |j¡ |jd k	rL|  d¡ |  |j¡ d S )Nzwhile re   r   )r,   r#   r¤   r-   r;   rC   r¡   r/   r9   r   r   r   Úvisit_WhileStatNode  s    



z#StatementWriter.visit_WhileStatNodec                 C   s   |   d¡ d S )NÚcontinue©r/   r9   r   r   r   Úvisit_ContinueStatNodeŠ  s    z&StatementWriter.visit_ContinueStatNodec                 C   s   |   d¡ d S )NÚbreakr¨   r9   r   r   r   Úvisit_BreakStatNode  s    z#StatementWriter.visit_BreakStatNodec                 C   s   |   |j¡ d S r   )r8   rR   r9   r   r   r   Úvisit_SequenceNode  s    z"StatementWriter.visit_SequenceNodec                 C   s    |   ¡  |  |j¡ |  ¡  d S r   )r,   r#   Úexprr-   r9   r   r   r   Úvisit_ExprStatNode“  s    z"StatementWriter.visit_ExprStatNodec                 C   s<   |   ¡  |  |j¡ |  d|j ¡ |  |j¡ |  ¡  d S )Nz %s= )r,   r#   r–   r   Úoperatorr—   r-   r9   r   r   r   Úvisit_InPlaceAssignmentNode˜  s
    z+StatementWriter.visit_InPlaceAssignmentNodec                 C   sX   |   ¡  |  d¡ |  |j¡ |jd k	r>|  d¡ |  |j¡ |  d¡ |  |j¡ d S )Nzwith rˆ   re   )r,   r   r#   Úmanagerrž   r-   r;   rC   r9   r   r   r   Úvisit_WithStatNodeŸ  s    



z"StatementWriter.visit_WithStatNodec                 C   s0   |   d¡ |  |j¡ |   d¡ |  |j¡ d S )Nútry:zfinally:)r/   r;   rC   Zfinally_clauser9   r   r   r   Úvisit_TryFinallyStatNode©  s    

z(StatementWriter.visit_TryFinallyStatNodec                 C   sF   |   d¡ |  |j¡ |jD ]}|  |¡ q|jd k	rB|  |j¡ d S )Nr³   )r/   r;   rC   Zexcept_clausesr#   r¡   )r   r:   Úxr   r   r   Úvisit_TryExceptStatNode¯  s    


z'StatementWriter.visit_TryExceptStatNodec                 C   sd   |   d¡ |jd k	r*|  d¡ |  |j¡ |jd k	rJ|  d¡ |  |j¡ |  d¡ |  |j¡ d S )NÚexceptrb   r2   re   )r,   Úpatternr   r#   rž   r-   r;   rC   r9   r   r   r   Úvisit_ExceptClauseNode·  s    





z&StatementWriter.visit_ExceptClauseNodec                 C   s6   |   d¡ |jd k	r*|  d¡ |  |j¡ |  ¡  d S )NÚreturnrb   )r,   rv   r   r#   r-   r9   r   r   r   Úvisit_ReturnStatNodeÂ  s
    


z$StatementWriter.visit_ReturnStatNodec                 C   s   |   d¡ d S )NÚraiser¨   r9   r   r   r   Úvisit_ReraiseStatNodeÉ  s    z%StatementWriter.visit_ReraiseStatNodec                 C   s   |   d|jj ¡ d S )Nz(import %s))r   rx   rv   r9   r   r   r   Úvisit_ImportNodeÌ  s    z StatementWriter.visit_ImportNodec                 C   sJ   d}|j D ] }d| j|f | j|< |d7 }q
|  jd7  _|  |j¡ dS )zÌ
        Temporaries are output like $1_1', where the first number is
        an index of the TempsBlockNode and the second number is an index
        of the temporary which that block allocates.
        r   z$%d_%dr   N)Ztempsr   r   r#   rC   )r   r:   ÚidxÚhandler   r   r   Úvisit_TempsBlockNodeÏ  s    

z$StatementWriter.visit_TempsBlockNodec                 C   s   |   | j|j ¡ d S r   )r   r   rÀ   r9   r   r   r   Úvisit_TempRefNodeÜ  s    z!StatementWriter.visit_TempRefNodeN)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”   H  s*   	
r”   c                       s¾  e Zd ZdZdh‡ fdd„	Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zdid$d%„Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d0d1d1d1d2œZd3d4d5d5d5d5d5d5d5d5d5d5d6d7d8d9d9d:d:d;d;d;d;d;d<d=œZd>d?„ Zd@dA„ ZdBdC„ ZdDdE„ ZdFdG„ Z dHdI„ Z!dJdK„ Z"dLdM„ Z#dNdO„ Z$dPdQ„ Z%dRdS„ Z&dTdU„ Z'dVdW„ Z(dXdY„ Z)dZd[„ Z*d\d]„ Z+djd^d_„Z,d`da„ Z-dbdc„ Z.ddde„ Z/dfdg„ Z0‡  Z1S )kÚExpressionWriterzL
    A Cython code writer that is intentionally limited to expressions.
    Nc                    s(   t ƒ  ¡  |d krd}|| _dg| _d S )Nr   r   )r   r   r   Ú
precedencer   r    r   r   r   å  s
    
zExpressionWriter.__init__c                 C   s   |   |¡ | jS r   r"   r$   r   r   r   r&   ì  s    
zExpressionWriter.writec                 C   s   |  j |7  _ d S r   )r   r   r   r   r   r   ð  s    zExpressionWriter.putc                 C   s&   | j  |¡r"| j d t|ƒ … | _ d S r   )r   Úendswithr3   r   r   r   r   Úremoveó  s    zExpressionWriter.removec                 C   sD   t |ƒdkr@|d d… D ]}|  |¡ |  d¡ q|  |d ¡ d S )Nr   r0   r2   )r3   r#   r   )r   r5   r7   r   r   r   r8   ÷  s
    
z%ExpressionWriter.comma_separated_listc                 C   s   t d| ƒ‚d S r<   r=   r9   r   r   r   r?   þ  s    zExpressionWriter.visit_Nodec                 C   s   |   |j¡ d S r   ©r   rv   r9   r   r   r   Úvisit_IntNode  s    zExpressionWriter.visit_IntNodec                 C   s   |   |j¡ d S r   rÇ   r9   r   r   r   Úvisit_FloatNode  s    z ExpressionWriter.visit_FloatNodec                 C   s   |   d¡ d S )NÚNone©r   r9   r   r   r   Úvisit_NoneNode	  s    zExpressionWriter.visit_NoneNodec                 C   s   |   |j¡ d S r   rT   r9   r   r   r   rŽ     s    zExpressionWriter.visit_NameNodec                 C   s   |   d¡ d S )Nz...rË   r9   r   r   r   Úvisit_EllipsisNode  s    z#ExpressionWriter.visit_EllipsisNodec                 C   s   |   t|jƒ¡ d S r   ©r   Ústrrv   r9   r   r   r   Úvisit_BoolNode  s    zExpressionWriter.visit_BoolNodec                 C   s   |   t|jƒ¡ d S r   rÎ   r9   r   r   r   Úvisit_ConstNode  s    z ExpressionWriter.visit_ConstNodec                 C   s   |   |j› d¡ d S )NÚjrÇ   r9   r   r   r   Úvisit_ImagNode  s    zExpressionWriter.visit_ImagNodec                 C   s   |   t|jƒ¡ d S r   ©r   Úreprrv   r9   r   r   r   Úvisit_BytesNode  s    z ExpressionWriter.visit_BytesNodec                 C   s   |   t|jƒ¡ d S r   rÔ   r9   r   r   r   Úvisit_UnicodeNode  s    z"ExpressionWriter.visit_UnicodeNode©r   r   c                 C   s2   |\}}|  ¡ }|  |¡ |  |¡ |  |¡ d S r   )Úsubexpr_nodesr   r8   )r   r:   ÚparensÚ
open_parenÚclose_parenr5   r   r   r   Úemit_sequence!  s
    

zExpressionWriter.emit_sequencec                 C   s   |   |d¡ d S )Nú[]©rÝ   r9   r   r   r   Úvisit_ListNode(  s    zExpressionWriter.visit_ListNodec                 C   s   |   |d¡ d S )Nú()rß   r9   r   r   r   Úvisit_TupleNode+  s    z ExpressionWriter.visit_TupleNodec                 C   s,   t | ¡ ƒdkr|  |d¡ n
|  d¡ d S )Nr   ú{}zset())r3   rÙ   rÝ   r   r9   r   r   r   Úvisit_SetNode.  s    zExpressionWriter.visit_SetNodec                 C   s   |   |d¡ d S )Nrã   rß   r9   r   r   r   Úvisit_DictNode4  s    zExpressionWriter.visit_DictNodec                 C   s&   |   |j¡ |  d¡ |   |j¡ d S ©Nz: )r#   Úkeyr   rv   r9   r   r   r   Úvisit_DictItemNode7  s    
z#ExpressionWriter.visit_DictItemNodeé   é   )Únotú!ú+ú-ú~r   é   é   é   é   é   é   é	   é
   é   )ÚorÚandÚinZnot_inÚisÚis_notú<z<=ú>z>=z!=z==ú|ú^rI   z<<z>>rí   rî   r   r   ú/z//ú%ú**c                 C   s,   | j d }||kr|  d¡ | j  |¡ d S )Nr0   rP   )rÄ   r   r   )r   Únew_precÚold_precr   r   r   Úoperator_enterO  s    

zExpressionWriter.operator_enterc                 C   s2   | j dd … \}}||kr$|  d¡ | j  ¡  d S )NéþÿÿÿrQ   )rÄ   r   Úpop)r   r  r  r   r   r   Úoperator_exitU  s    
zExpressionWriter.operator_exitc                 C   s:   d}| j | }|  |¡ |  d¡ |  |j¡ |  ¡  d S )Nrë   znot )Úunop_precedencer  r   r#   Úoperandr
  ©r   r:   ÚopÚprecr   r   r   Úvisit_NotNode[  s    


zExpressionWriter.visit_NotNodec                 C   sB   |j }| j| }|  |¡ |  d|j  ¡ |  |j¡ |  ¡  d S )Nz%s)r¯   r  r  r   r#   r  r
  r  r   r   r   Úvisit_UnopNodec  s    

zExpressionWriter.visit_UnopNodec                 C   sX   |j }| j |d¡}|  |¡ |  |j¡ |  d| dd¡ ¡ |  |j¡ |  	¡  d S )Nr   z %s Ú_rb   )
r¯   Úbinop_precedenceÚgetr  r#   Úoperand1r   ÚreplaceÚoperand2r
  r  r   r   r   Úvisit_BinopNodek  s    
z ExpressionWriter.visit_BinopNodec                 C   s   |   |¡ d S r   ©r  r9   r   r   r   Úvisit_BoolBinopNodet  s    z$ExpressionWriter.visit_BoolBinopNodec                 C   s   |   |¡ d S r   r  r9   r   r   r   Úvisit_PrimaryCmpNodew  s    z%ExpressionWriter.visit_PrimaryCmpNodec                 C   s`   |   |j¡ |  d¡ t|jtƒrF|j ¡ r:|  |j¡ qR|  d¡ n|   |j¡ |  d¡ d S )NrL   rá   rM   )r#   rG   r   r†   ÚindexÚ	TupleNoderÙ   rÝ   r9   r   r   r   Úvisit_IndexNodez  s    

z ExpressionWriter.visit_IndexNodec                 C   sn   |   |j¡ |  d¡ |jr(|   |j¡ |  d¡ |jrD|   |j¡ |jr`|  d¡ |   |j¡ |  d¡ d S )NrL   re   rM   )r#   rG   r   ÚstartÚstopÚslicer9   r   r   r   Úvisit_SliceIndexNode†  s    


z%ExpressionWriter.visit_SliceIndexNodec                 C   sT   |j js|  |j ¡ |  d¡ |jjs2|  |j¡ |jjsP|  d¡ |  |j¡ d S )Nre   )r  Zis_noner#   r   r   Ústepr9   r   r   r   Úvisit_SliceNode“  s    

z ExpressionWriter.visit_SliceNodec                 C   s<   |   |j¡ |  d¡ |   |j¡ |  d¡ |   |j¡ d S )Nú if z else )r#   Ztrue_valr   ÚtestZ	false_valr9   r   r   r   Úvisit_CondExprNode  s
    

z#ExpressionWriter.visit_CondExprNodec                 C   s    |   |j¡ |  d|j ¡ d S )Nz.%s)r#   Úobjr   rk   r9   r   r   r   Úvisit_AttributeNode¤  s    z$ExpressionWriter.visit_AttributeNodec                 C   s0   |   |j¡ |  d¡ |  |j¡ |  d¡ d S rO   )r#   Úfunctionr   r8   rR   r9   r   r   r   Úvisit_SimpleCallNode¨  s    
z%ExpressionWriter.visit_SimpleCallNodec                 C   s¢   |d krd S t |tƒr0|  |j¡ |  |j¡ nnt |tƒr^| ¡ D ]}|  |¡ |  d¡ qBn@t |t	ƒrŠ|  d¡ |  |j
¡ |  d¡ n|  |¡ |  d¡ d S )Nr2   r   )r†   ZAddNodeÚemit_pos_argsr  r  r  rÙ   r#   r   ZAsTupleNodeÚarg©r   r:   r­   r   r   r   r,  ®  s    





zExpressionWriter.emit_pos_argsc                 C   s”   |d krd S t |tƒr0| ¡ D ]}|  |¡ qn`t |tƒrr| ¡ D ],}|  d|jj ¡ |  |j¡ |  d¡ qBn|  d¡ |  |¡ |  d¡ d S )Nz%s=r2   r  )	r†   ZMergedDictNoderÙ   Úemit_kwd_argsZDictNoder   rç   rv   r#   r.  r   r   r   r/  À  s    



zExpressionWriter.emit_kwd_argsc                 C   sF   |   |j¡ |  d¡ |  |j¡ |  |j¡ |  d¡ |  d¡ d S )NrP   r2   rQ   )r#   r*  r   r,  r^   r/  r_   rÆ   r9   r   r   r   Úvisit_GeneralCallNodeÐ  s    

z&ExpressionWriter.visit_GeneralCallNodec                 C   sj   |\}}|   |¡ |  |¡ |   d¡ |  |¡ |   d¡ |  |¡ |r\|   d¡ |  |¡ |   |¡ d S )Nz for rœ   r%  )r   r#   )r   rC   rž   r    r¤   rÚ   rÛ   rÜ   r   r   r   Úemit_comprehensionØ  s    







z#ExpressionWriter.emit_comprehensionc                 C   s   |   |j¡ d S r   )r#   r­   r9   r   r   r   Úvisit_ComprehensionAppendNodeç  s    z.ExpressionWriter.visit_ComprehensionAppendNodec                 C   s&   |   |j¡ |  d¡ |   |j¡ d S ræ   )r#   Zkey_exprr   Z
value_exprr9   r   r   r   Ú!visit_DictComprehensionAppendNodeê  s    
z2ExpressionWriter.visit_DictComprehensionAppendNodec                 C   sp   ddddœ}||j  ¡  }|jj}|jj}|jjj}d }t|dƒrZ|jd j	}|jd j}|  
|||||¡ d S )NrÞ   rã   )ÚlistÚdictÚsetr£   r   )ÚtypeZpy_type_nameÚlooprC   rž   rŸ   r    Úhasattrr£   r¤   r1  )r   r:   ZtpmaprÚ   rC   rž   r    r¤   r   r   r   Úvisit_ComprehensionNodeï  s    

z(ExpressionWriter.visit_ComprehensionNodec                 C   sn   |j j}|j j}|j jj}d }t|dƒrF|jd j}|jd jjj	}nt|dƒrX|jj	}|  
||||d¡ d S )Nr£   r   r­   rá   )r8  rC   rž   rŸ   r    r9  r£   r¤   r­   r-  r1  )r   r:   rC   rž   r    r¤   r   r   r   Úvisit_GeneratorExpressionNodeü  s    


z.ExpressionWriter.visit_GeneratorExpressionNode)N)rØ   )rØ   )2r   r   r   r’   r   r&   r   rÆ   r8   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/  r0  r1  r2  r3  r:  r;  r“   r   r   r    r   rÃ   à  sš   
   þ               ô	

 þ
rÃ   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	Ú	PxdWriterz\
    A Cython code writer for everything supported in pxd files.
    (currently unused)
    c                 C   s   t d |  |¡j¡ƒ |S )NÚ
)Úprintrs   r&   r   r9   r   r   r   Ú__call__  s    zPxdWriter.__call__c                 C   s~   |j r|  d¡ n
|  d¡ |jr>|  d |j¡¡ |  d¡ |jdkr^|  |j¡ |  d¡ |jrn|  d¡ |  |j¡ d S )Nr   ra   rb   r€   r   )	r‚   r,   rƒ   r   rs   ro   r„   r#   rZ   r9   r   r   r   r…     s    




zPxdWriter.visit_CFuncDefNodec                 C   s   d S r   r   r9   r   r   r   Úvisit_StatNode$  s    zPxdWriter.visit_StatNodeN)r   r   r   r’   r?  r…   r@  r   r   r   r   r<    s   r<  c                   @   s   e Zd ZdZdS )Ú
CodeWriterz(
    A complete Cython code writer.
    N)r   r   r   r’   r   r   r   r   rA  (  s   rA  N)r’   ZCompiler.Visitorr   ZCompiler.ExprNodesZCompiler.Nodesr   r   r   r”   rÃ   r<  rA  r   r   r   r   Ú<module>   s     +   -