o
    €ec  ã                   @   sœ   d Z ddlmZmZ ddlmZ ddlT ddlmZ G dd„ de	ƒ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).
é    )Úabsolute_importÚprint_functioné   )Ú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   úAD:\Projects\ConvertPro\env\Lib\site-packages\Cython/CodeWriter.pyÚ__init__   s   
zLinesResult.__init__c                 C   ó   |  j |7  _ d S ©N)r   ©r   r   r   r   r   Úput   ó   zLinesResult.putc                 C   s   | j  | j¡ d| _d S r	   )r   Úappendr   r   r   r   r   Únewline   s   
zLinesResult.newlinec                 C   ó   |   |¡ |  ¡  d S r   )r   r   r   r   r   r   Úputline   ó   
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dWdd„Zdd„ ZdXd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 )YÚDeclarationWriterzE
    A Cython code writer that is limited to declarations nodes.
    z    Nc                    s8   t t| ƒ ¡  |d u rtƒ }|| _d| _i | _d| _d S )Nr   )Úsuperr   r   r   ÚresultÚ
numindentsÚ	tempnamesÚtempblockindex©r   r!   ©Ú	__class__r   r   r   '   s   
zDeclarationWriter.__init__c                 C   ó   |   |¡ | jS r   ©Úvisitr!   ©r   Útreer   r   r   Úwrite0   ó   
zDeclarationWriter.writec                 C   s   |  j d7  _ d S ©Nr   ©r"   r   r   r   r   Úindent4   r   zDeclarationWriter.indentc                 C   s   |  j d8  _ d S r/   r0   r   r   r   r   Údedent7   r   zDeclarationWriter.dedentr
   c                 C   ó   | j  | j| j | ¡ d S r   )r!   r   Úindent_stringr"   r   r   r   r   Ú	startline:   ó   zDeclarationWriter.startlinec                 C   ó   | j  |¡ d S r   )r!   r   r   r   r   r   r   =   ó   zDeclarationWriter.putc                 C   r3   r   )r!   r   r4   r"   r   r   r   r   r   @   r6   zDeclarationWriter.putlinec                 C   r7   r   )r!   r   r   r   r   r   ÚendlineC   r8   zDeclarationWriter.endlinec                 C   r   r   ©r5   r9   r   r   r   r   ÚlineF   r   zDeclarationWriter.lineFc                 C   s    t |ƒdkrJ|d d… D ]}|  |¡ |r%|jd ur%|  d¡ |  |j¡ |  d¡ q|  |d ¡ |rL|d jd urN|  d¡ |  |d j¡ d S d S d S d S )Nr   éÿÿÿÿú = ú, )Úlenr*   Údefaultr   )r   ÚitemsÚ
output_rhsÚitemr   r   r   Úcomma_separated_listJ   s   


öz&DeclarationWriter.comma_separated_listc                 C   s   |   ¡  |  |¡ |  ¡  d S r   )r1   r*   r2   ©r   Únoder   r   r   Ú_visit_indentedW   s   
z!DeclarationWriter._visit_indentedc                 C   ó   t d| ƒ‚©Nz"Node not handled by serializer: %r©ÚAssertionErrorrE   r   r   r   Ú
visit_Node\   ó   zDeclarationWriter.visit_Nodec                 C   ó   |   |¡ d S r   ©ZvisitchildrenrE   r   r   r   Úvisit_ModuleNode_   ó   z"DeclarationWriter.visit_ModuleNodec                 C   rN   r   rO   rE   r   r   r   Úvisit_StatListNodeb   rQ   z$DeclarationWriter.visit_StatListNodec                 C   s8   |j d u rd}nd|j  }|  d| ¡ |  |j¡ d S )Nr   z"%s"zcdef extern from %s:)Zinclude_filer   rG   Úbody)r   rF   Úfiler   r   r   Úvisit_CDefExternNodee   s
   

z&DeclarationWriter.visit_CDefExternNodec                 C   ó   |   d¡ |  |j¡ d S )Nr   ©r   r*   ÚbaserE   r   r   r   Úvisit_CPtrDeclaratorNodem   ó   
z*DeclarationWriter.visit_CPtrDeclaratorNodec                 C   rV   )Nú&rW   rE   r   r   r   Úvisit_CReferenceDeclaratorNodeq   rZ   z0DeclarationWriter.visit_CReferenceDeclaratorNodec                 C   s:   |   |j¡ |  d¡ |jd ur|   |j¡ |  d¡ d S ©Nú[ú])r*   rX   r   Ú	dimensionrE   r   r   r   Úvisit_CArrayDeclaratorNodeu   s
   

z,DeclarationWriter.visit_CArrayDeclaratorNodec                 C   s0   |   |j¡ |  d¡ |  |j¡ |  d¡ d S ©Nú(ú))r*   rX   r   rD   Úargsr9   rE   r   r   r   Úvisit_CFuncDeclaratorNode|   s   
z+DeclarationWriter.visit_CFuncDeclaratorNodec                 C   ó   |   |j¡ d S r   ©r   ÚnamerE   r   r   r   Úvisit_CNameDeclaratorNodeƒ   r8   z+DeclarationWriter.visit_CNameDeclaratorNodec                 C   sl   |j r'|  d|j ¡ |jdk r|  d|j  ¡ n|jdkr'|  d|j ¡ |jd ur4|  |j¡ d S d S )N)z	unsigned r
   zsigned r   zshort zlong )Zis_basic_c_typer   ÚsignedZlongnessri   rE   r   r   r   Úvisit_CSimpleBaseTypeNode†   s   


ÿz+DeclarationWriter.visit_CSimpleBaseTypeNodec                 C   s   |   |j¡ |   |j¡ d S r   )r*   Ú	base_typeÚ
declaratorrE   r   r   r   Úvisit_CComplexBaseTypeNode‘   s   z,DeclarationWriter.visit_CComplexBaseTypeNodec                 C   s&   |   |j¡ |  d¡ |  |j¡ d S )NÚ.)r*   rm   r   ri   rE   r   r   r   Úvisit_CNestedBaseTypeNode•   ó   
z+DeclarationWriter.visit_CNestedBaseTypeNodec                 C   s8   |   |j¡ |  d¡ |  |j|jj ¡ |  d¡ d S r]   )r*   Zbase_type_noder   rD   Úpositional_argsÚkeyword_argsZkey_value_pairsrE   r   r   r   Úvisit_TemplatedTypeNodeš   s   
z)DeclarationWriter.visit_TemplatedTypeNodec                 C   s<   |   d¡ |  |j¡ |  d¡ | j|jdd |  ¡  d S )Núcdef ú T)rB   )r5   r*   rm   r   rD   Zdeclaratorsr9   rE   r   r   r   Úvisit_CVarDefNode    s
   

z#DeclarationWriter.visit_CVarDefNodec                 C   s   |   |¡ |jr |  d¡ |  |j¡ |jd ur |  d|j ¡ |r'|  |¡ |  d¡ |  ¡  |s8|  d¡ n
|D ]}|  |¡ q:|  ¡  d S )Nrw   ú "%s"ú:Úpass)	r5   ri   r   Úcnamer9   r1   r   r*   r2   )r   rF   Ú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r|d7 }||j7 }|  ||d |j¡ d S )Nú	ctypedef rv   Úpubliczpublic zpacked )Ztypedef_flagÚ
visibilityÚpackedÚkindr   r   )r   rF   r}   r   r   r   Úvisit_CStructOrUnionDefNodeº   s   

z-DeclarationWriter.visit_CStructOrUnionDefNodec                 C   sJ   d}|j rdd |j ¡ }|jr|dd |j¡ 7 }|  |d||j¡ d S )Nr
   z[%s]r>   z(%s)zcdef cppclass)Z	templatesÚjoinZbase_classesr   r   )r   rF   r~   r   r   r   Úvisit_CppClassNodeÆ   s   z$DeclarationWriter.visit_CppClassNodec                 C   s   |   |dd |j¡ d S )Nz	cdef enum)r   rA   rE   r   r   r   Úvisit_CEnumDefNodeÎ   ó   z$DeclarationWriter.visit_CEnumDefNodec                 C   sJ   |   |j¡ |jr|  d|j ¡ |jr|  d¡ |  |j¡ |  ¡  d S )Nry   r=   )r5   ri   r|   r   Úvaluer*   r9   rE   r   r   r   Úvisit_CEnumDefItemNodeÑ   s   
z(DeclarationWriter.visit_CEnumDefItemNodec                 C   s˜   |j rJ ‚|jr|jD ]}|  |¡ q|  d¡ |  |j¡ |jr?|  d¡ |jr4|  |j¡ |  d¡ |  |j¡ |  d¡ |  d¡ |  	|j
¡ d S )Nzcdef class rc   rp   rd   rz   )Úmodule_nameZ
decoratorsr*   r5   r   Ú
class_nameZbase_class_nameZbase_class_moduler9   rG   rS   )r   rF   Ú	decoratorr   r   r   Úvisit_CClassDefNodeÚ   s   






z%DeclarationWriter.visit_CClassDefNodec                 C   s8   |   d¡ |  |j¡ |  d¡ |  |j¡ |  ¡  d S )Nr‚   rw   )r5   r*   rm   r   rn   r9   rE   r   r   r   Úvisit_CTypeDefNodeë   s
   

z$DeclarationWriter.visit_CTypeDefNodec                 C   s6   |   d|j ¡ |  |j¡ |  d¡ |  |j¡ d S )Nzdef %s(ú):)r5   ri   rD   re   r9   rG   rS   rE   r   r   r   Úvisit_FuncDefNodeò   s   
z#DeclarationWriter.visit_FuncDefNodec                 C   sÎ   |   |jrdnd¡ |jr|  d |j¡¡ |  d¡ |jdkr+|  |j¡ |  d¡ |jr3|  d¡ |jrG|  |j¡ |jj	d urG|  d¡ |  |j
j¡ |  d¡ |  |j
j¡ |  d¡ |  |j¡ d S )Núcpdef rv   rw   Úprivateúapi rc   r“   )r5   ÚoverridableÚ	modifiersr   rˆ   r„   Úapirm   r*   ri   rn   rX   rD   re   r9   rG   rS   rE   r   r   r   Úvisit_CFuncDefNodeù   s$   






z$DeclarationWriter.visit_CFuncDefNodec                 C   sl   t |jtƒr|jjd ur|  |j¡ |j ¡ r|  d¡ |  |j¡ |jd ur4|  d¡ |  |j¡ d S d S )Nrw   r=   )	Ú
isinstancerm   r   ri   r*   rn   Zdeclared_namer   r@   rE   r   r   r   Úvisit_CArgDeclNode  s   



þz$DeclarationWriter.visit_CArgDeclNodec                 C   s>   |   d¡ |  |j¡ |jr|  d¡ |  |j¡ |  ¡  d S )Nzcimport ú as )r5   r   rŽ   Úas_namer9   rE   r   r   r   Úvisit_CImportStatNode#  s   

z'DeclarationWriter.visit_CImportStatNodec                 C   s†   |   d¡ |  |j¡ |  d¡ d}|jD ]'\}}}}|d u s!J ‚|r&d}n|  d¡ |  |¡ |r<|  d¡ |  |¡ q|  ¡  d S )Nzfrom z	 cimport TFr>   rž   )r5   r   rŽ   Zimported_namesr9   )r   rF   ÚfirstÚposri   rŸ   r†   r   r   r   Úvisit_FromCImportStatNode+  s   





€z+DeclarationWriter.visit_FromCImportStatNodec                 C   rg   r   rh   rE   r   r   r   Úvisit_NameNode<  r8   z DeclarationWriter.visit_NameNodec                 C   s"   |   d¡ |  |j¡ |  ¡  d S )Nú@)r5   r*   r   r9   rE   r   r   r   Úvisit_DecoratorNode?  s   
z%DeclarationWriter.visit_DecoratorNodec                 C   s   |   d¡ |  ¡  d S )Nr{   r:   rE   r   r   r   Úvisit_PassStatNodeD  r   z$DeclarationWriter.visit_PassStatNoder   ©r
   )F).r   r   r   Ú__doc__r4   r   r-   r1   r2   r5   r   r   r9   r;   rD   rG   rL   rP   rR   rU   rY   r\   ra   rf   rj   rl   ro   rq   ru   rx   r   r‡   r‰   rŠ   r   r‘   r’   r”   r›   r   r    r£   r¤   r¦   r§   Ú__classcell__r   r   r&   r   r       sV    	


	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 ©Nr=   )r5   r*   Úlhsr   Úrhsr9   rE   r   r   r   Úvisit_SingleAssignmentNodeN  s
   
z*StatementWriter.visit_SingleAssignmentNodec                 C   s@   |   ¡  |jD ]}|  |¡ |  d¡ q|  |j¡ |  ¡  d S r¬   )r5   Zlhs_listr*   r   r®   r9   )r   rF   r­   r   r   r   Úvisit_CascadedAssignmentNodeU  s   

z,StatementWriter.visit_CascadedAssignmentNodec                 C   s4   |   d¡ |  |jj¡ |js|  d¡ |  ¡  d S )Nzprint ú,)r5   rD   Z	arg_tuplere   Zappend_newliner   r9   rE   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 ur@|  d¡ |  
|j¡ d S d S )Nzfor ú in rz   úelse:)r5   ÚtargetZis_sequence_constructorrD   re   r*   r   ÚiteratorÚsequencer9   rG   rS   Úelse_clauser;   rE   r   r   r   Úvisit_ForInStatNoded  s   




þz#StatementWriter.visit_ForInStatNodec                 C   s    |   d¡ |  |jd j¡ |  d¡ |  |jd j¡ |jdd … D ]}|   d¡ |  |j¡ |  d¡ |  |j¡ q#|jd urN|  d¡ |  |j¡ d S d S )Nzif r   rz   r   zelif r´   )	r5   r*   Ú
if_clausesÚ	conditionr9   rG   rS   r¸   r;   )r   rF   Zclauser   r   r   Úvisit_IfStatNoder  s   





þz StatementWriter.visit_IfStatNodec                 C   sT   |   d¡ |  |j¡ |  d¡ |  |j¡ |jd ur(|  d¡ |  |j¡ d S d S )Nzwhile rz   r´   )r5   r*   r»   r9   rG   rS   r¸   r;   rE   r   r   r   Úvisit_WhileStatNode‚  s   



þz#StatementWriter.visit_WhileStatNodec                 C   ó   |   d¡ d S )NÚcontinue©r;   rE   r   r   r   Úvisit_ContinueStatNode‹  rQ   z&StatementWriter.visit_ContinueStatNodec                 C   r¾   )NÚbreakrÀ   rE   r   r   r   Úvisit_BreakStatNodeŽ  rQ   z#StatementWriter.visit_BreakStatNodec                 C   rg   r   )rD   re   rE   r   r   r   Úvisit_SequenceNode‘  r8   z"StatementWriter.visit_SequenceNodec                 C   s    |   ¡  |  |j¡ |  ¡  d S r   )r5   r*   Úexprr9   rE   r   r   r   Úvisit_ExprStatNode”  s   z"StatementWriter.visit_ExprStatNodec                 C   s<   |   ¡  |  |j¡ |  d|j ¡ |  |j¡ |  ¡  d S )Nz %s= )r5   r*   r­   r   Úoperatorr®   r9   rE   r   r   r   Úvisit_InPlaceAssignmentNode™  s
   z+StatementWriter.visit_InPlaceAssignmentNodec                 C   sX   |   ¡  |  d¡ |  |j¡ |jd ur|  d¡ |  |j¡ |  d¡ |  |j¡ d S )Nzwith rž   rz   )r5   r   r*   Úmanagerrµ   r9   rG   rS   rE   r   r   r   Úvisit_WithStatNode   s   



z"StatementWriter.visit_WithStatNodec                 C   s0   |   d¡ |  |j¡ |   d¡ |  |j¡ d S )Nútry:zfinally:)r;   rG   rS   Zfinally_clauserE   r   r   r   Úvisit_TryFinallyStatNodeª  s   

z(StatementWriter.visit_TryFinallyStatNodec                 C   sJ   |   d¡ |  |j¡ |jD ]}|  |¡ q|jd ur#|  |j¡ d S d S )NrË   )r;   rG   rS   Zexcept_clausesr*   r¸   )r   rF   Úxr   r   r   Úvisit_TryExceptStatNode°  s   


ÿz'StatementWriter.visit_TryExceptStatNodec                 C   sd   |   d¡ |jd ur|  d¡ |  |j¡ |jd ur%|  d¡ |  |j¡ |  d¡ |  |j¡ d S )NÚexceptrw   r>   rz   )r5   Úpatternr   r*   rµ   r9   rG   rS   rE   r   r   r   Úvisit_ExceptClauseNode¸  s   





z&StatementWriter.visit_ExceptClauseNodec                 C   s6   |   d¡ |jd ur|  d¡ |  |j¡ |  ¡  d S )NÚreturnrw   )r5   rŒ   r   r*   r9   rE   r   r   r   Úvisit_ReturnStatNodeÃ  s
   


z$StatementWriter.visit_ReturnStatNodec                 C   r¾   )NÚraiserÀ   rE   r   r   r   Úvisit_ReraiseStatNodeÊ  rQ   z%StatementWriter.visit_ReraiseStatNodec                 C   s   |   d|jj ¡ d S )Nz(import %s))r   rŽ   rŒ   rE   r   r   r   Úvisit_ImportNodeÍ  r‹   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*   rS   )r   rF   ÚidxÚhandler   r   r   Úvisit_TempsBlockNodeÐ  s   

z$StatementWriter.visit_TempsBlockNodec                 C   s   |   | j|j ¡ d S r   )r   r#   rØ   rE   r   r   r   Úvisit_TempRefNodeÝ  r‹   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«   I  s,    	
r«   c                
       s  e Zd ZdZd~‡ 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 d!„Zd"d#„ Zd$d%„ Zd&d'„ Zd€d)d*„Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d5d6d6d6d7œZi d8d9“d:d;“d<d=“d>d=“d?d=“d@d=“dAd=“dBd=“dCd=“dDd=“dEd=“dFd=“dGdH“dIdJ“dKdL“dMdN“dOdN“dPdPdQdQdQdQdQdRdSœ¥ZdTdU„ ZdVdW„ ZdXdY„ Z dZd[„ 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-	(d€dtdu„Z.dvdw„ Z/dxdy„ Z0dzd{„ Z1d|d}„ Z2‡  Z3S )ÚExpressionWriterzL
    A Cython code writer that is intentionally limited to expressions.
    Nc                    s,   t t| ƒ ¡  |d u rd}|| _dg| _d S )Nr
   r   )r    rÛ   r   r!   Ú
precedencer%   r&   r   r   r   æ  s
   zExpressionWriter.__init__c                 C   r(   r   r)   r+   r   r   r   r-   í  r.   zExpressionWriter.writec                 C   r   r   )r!   r   r   r   r   r   ñ  r   zExpressionWriter.putc                 C   s*   | j  |¡r| j d t|ƒ … | _ d S d S r   )r!   Úendswithr?   r   r   r   r   Úremoveô  s   ÿzExpressionWriter.removec                 C   sH   t |ƒdkr"|d d… D ]}|  |¡ |  d¡ q|  |d ¡ d S d S )Nr   r<   r>   )r?   r*   r   )r   rA   rC   r   r   r   rD   ø  s   
üz%ExpressionWriter.comma_separated_listc                 C   rH   rI   rJ   rE   r   r   r   rL   ÿ  rM   zExpressionWriter.visit_Nodec                 C   rg   r   ©r   rŒ   rE   r   r   r   Úvisit_IntNode  r8   zExpressionWriter.visit_IntNodec                 C   rg   r   rß   rE   r   r   r   Úvisit_FloatNode  r8   z ExpressionWriter.visit_FloatNodec                 C   r¾   )NÚNone©r   rE   r   r   r   Úvisit_NoneNode  rQ   zExpressionWriter.visit_NoneNodec                 C   rg   r   rh   rE   r   r   r   r¤     r8   zExpressionWriter.visit_NameNodec                 C   r¾   )Nz...rã   rE   r   r   r   Úvisit_EllipsisNode  rQ   z#ExpressionWriter.visit_EllipsisNodec                 C   ó   |   t|jƒ¡ d S r   ©r   ÚstrrŒ   rE   r   r   r   Úvisit_BoolNode  ó   zExpressionWriter.visit_BoolNodec                 C   ræ   r   rç   rE   r   r   r   Úvisit_ConstNode  rê   z ExpressionWriter.visit_ConstNodec                 C   s   |   |j¡ |   d¡ d S )NÚjrß   rE   r   r   r   Úvisit_ImagNode  s   zExpressionWriter.visit_ImagNoder
   c                 C   s8   t |jƒ}|d dv r|dd … }|  d||f ¡ d S )Nr   Zubr   z%s%s)ÚreprrŒ   r   )r   rF   ÚprefixZrepr_valr   r   r   Úemit_string  s   
zExpressionWriter.emit_stringc                 C   ó   |   |d¡ d S )NÚb©rð   rE   r   r   r   Úvisit_BytesNode!  r8   z ExpressionWriter.visit_BytesNodec                 C   rN   r   ró   rE   r   r   r   Úvisit_StringNode$  rQ   z!ExpressionWriter.visit_StringNodec                 C   rñ   )NÚuró   rE   r   r   r   Úvisit_UnicodeNode'  r8   z"ExpressionWriter.visit_UnicodeNode©r
   r
   c                 C   s2   |\}}|  ¡ }|  |¡ |  |¡ |  |¡ d S r   )Úsubexpr_nodesr   rD   )r   rF   ÚparensÚ
open_parenÚclose_parenrA   r   r   r   Úemit_sequence*  s
   

zExpressionWriter.emit_sequencec                 C   rñ   )Nú[]©rý   rE   r   r   r   Úvisit_ListNode1  r8   zExpressionWriter.visit_ListNodec                 C   rñ   )Nú()rÿ   rE   r   r   r   Úvisit_TupleNode4  r8   z ExpressionWriter.visit_TupleNodec                 C   s.   t | ¡ ƒdkr|  |d¡ d S |  d¡ d S )Nr   ú{}zset())r?   rù   rý   r   rE   r   r   r   Úvisit_SetNode7  s   zExpressionWriter.visit_SetNodec                 C   rñ   )Nr  rÿ   rE   r   r   r   Úvisit_DictNode=  r8   zExpressionWriter.visit_DictNodec                 C   ó&   |   |j¡ |  d¡ |   |j¡ d S ©Nz: )r*   Úkeyr   rŒ   rE   r   r   r   Úvisit_DictItemNode@  rr   z#ExpressionWriter.visit_DictItemNodeé   é   )Únotú!ú+ú-ú~Úorr   Úandé   Úiné   Znot_inÚisÚis_notú<z<=ú>z>=z!=z==ú|é   ú^é   r[   é   z<<é   z>>é	   é
   é   )r  r  r   r¥   ú/z//ú%ú**c                 C   s,   | j d }||kr|  d¡ | j  |¡ d S )Nr<   rc   )rÜ   r   r   )r   Únew_precÚold_precr   r   r   Úoperator_enterX  s   

zExpressionWriter.operator_enterc                 C   s2   | j dd … \}}||kr|  d¡ | j  ¡  d S )Néþÿÿÿrd   )rÜ   r   Úpop)r   r'  r&  r   r   r   Úoperator_exit^  s   
zExpressionWriter.operator_exitc                 C   s:   d}| j | }|  |¡ |  d¡ |  |j¡ |  ¡  d S )Nr  znot )Úunop_precedencer(  r   r*   Úoperandr+  ©r   rF   ÚopÚprecr   r   r   Úvisit_NotNoded  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_UnopNodel  s   

zExpressionWriter.visit_UnopNodec                 C   sX   |j }| j |d¡}|  |¡ |  |j¡ |  d| dd¡ ¡ |  |j¡ |  	¡  d S )Nr   z %s Ú_rw   )
rÇ   Úbinop_precedenceÚgetr(  r*   Úoperand1r   ÚreplaceÚoperand2r+  r.  r   r   r   Úvisit_BinopNodet  s   
z ExpressionWriter.visit_BinopNodec                 C   rN   r   ©r9  rE   r   r   r   Úvisit_BoolBinopNode}  rQ   z$ExpressionWriter.visit_BoolBinopNodec                 C   rN   r   r:  rE   r   r   r   Úvisit_PrimaryCmpNode€  rQ   z%ExpressionWriter.visit_PrimaryCmpNodec                 C   s`   |   |j¡ |  d¡ t|jtƒr#|j ¡ r|  |j¡ n|  d¡ n|   |j¡ |  d¡ d S )Nr^   r  r_   )r*   rX   r   rœ   ÚindexÚ	TupleNoderù   rý   rE   r   r   r   Úvisit_IndexNodeƒ  s   

z ExpressionWriter.visit_IndexNodec                 C   sn   |   |j¡ |  d¡ |jr|   |j¡ |  d¡ |jr"|   |j¡ |jr0|  d¡ |   |j¡ |  d¡ d S )Nr^   rz   r_   )r*   rX   r   ÚstartÚstopÚslicerE   r   r   r   Úvisit_SliceIndexNode  s   


z%ExpressionWriter.visit_SliceIndexNodec                 C   sX   |j js
|  |j ¡ |  d¡ |jjs|  |j¡ |jjs*|  d¡ |  |j¡ d S d S )Nrz   )r@  Zis_noner*   r   rA  ÚsteprE   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_valrE   r   r   r   Úvisit_CondExprNode¦  s
   

z#ExpressionWriter.visit_CondExprNodec                 C   s    |   |j¡ |  d|j ¡ d S )Nz.%s)r*   Úobjr   r€   rE   r   r   r   Úvisit_AttributeNode­  s   z$ExpressionWriter.visit_AttributeNodec                 C   s0   |   |j¡ |  d¡ |  |j¡ |  d¡ d S rb   )r*   Úfunctionr   rD   re   rE   r   r   r   Úvisit_SimpleCallNode±  s   
z%ExpressionWriter.visit_SimpleCallNodec                 C   s¨   |d u rd S t |tƒr|  |j¡ |  |j¡ d S t |tƒr1| ¡ D ]}|  |¡ |  d¡ q"d S t |t	ƒrH|  d¡ |  |j
¡ |  d¡ d S |  |¡ |  d¡ d S )Nr>   r   )rœ   ZAddNodeÚemit_pos_argsr6  r8  r>  rù   r*   r   ZAsTupleNodeÚarg©r   rF   rÅ   r   r   r   rM  ·  s    


þ


zExpressionWriter.emit_pos_argsc                 C   s˜   |d u rd S t |tƒr| ¡ D ]}|  |¡ qd S t |tƒr;| ¡ D ]}|  d|jj ¡ |  |j¡ |  d¡ q"d S |  d¡ |  |¡ |  d¡ d S )Nz%s=r>   r%  )	rœ   ZMergedDictNoderù   Úemit_kwd_argsZDictNoder   r  rŒ   r*   rO  r   r   r   rP  É  s   
ÿ
ý

zExpressionWriter.emit_kwd_argsc                 C   sF   |   |j¡ |  d¡ |  |j¡ |  |j¡ |  d¡ |  d¡ d S )Nrc   r>   rd   )r*   rK  r   rM  rs   rP  rt   rÞ   rE   r   r   r   Úvisit_GeneralCallNodeÙ  s   

z&ExpressionWriter.visit_GeneralCallNodec                 C   sj   |\}}|   |¡ |  |¡ |   d¡ |  |¡ |   d¡ |  |¡ |r.|   d¡ |  |¡ |   |¡ d S )Nz for r³   rF  )r   r*   )r   rS   rµ   r·   r»   rú   rû   rü   r   r   r   Úemit_comprehensioná  s   







z#ExpressionWriter.emit_comprehensionc                 C   rg   r   )r*   rÅ   rE   r   r   r   Úvisit_ComprehensionAppendNodeð  r8   z.ExpressionWriter.visit_ComprehensionAppendNodec                 C   r  r  )r*   Zkey_exprr   Z
value_exprrE   r   r   r   Ú!visit_DictComprehensionAppendNodeó  rr   z2ExpressionWriter.visit_DictComprehensionAppendNodec                 C   sp   ddddœ}||j  ¡  }|jj}|jj}|jjj}d }t|dƒr-|jd j	}|jd j}|  
|||||¡ d S )Nrþ   r  )ÚlistÚdictÚsetrº   r   )ÚtypeZpy_type_nameÚlooprS   rµ   r¶   r·   Úhasattrrº   r»   rR  )r   rF   Ztpmaprú   rS   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ƒr#|jd j}|jd jjj	}n	t|dƒr,|jj	}|  
||||d¡ d S )Nrº   r   rÅ   r  )rY  rS   rµ   r¶   r·   rZ  rº   r»   rÅ   rN  rR  )r   rF   rS   rµ   r·   r»   r   r   r   Úvisit_GeneratorExpressionNode  s   


z.ExpressionWriter.visit_GeneratorExpressionNoder   r¨   )rø   )4r   r   r   r©   r   r-   r   rÞ   rD   rL   rà   rá   rä   r¤   rå   ré   rë   rí   rð   rô   rõ   r÷   rý   r   r  r  r  r	  r,  r4  r(  r+  r1  r2  r9  r;  r<  r?  rC  rE  rH  rJ  rL  rM  rP  rQ  rR  rS  rT  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Ú
)Úprintrˆ   r-   r   rE   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r7|  d¡ |  |j¡ d S )Nr•   rv   rw   r–   r—   )	r˜   r5   r™   r   rˆ   r„   rš   r*   rn   rE   r   r   r   r›     s   




zPxdWriter.visit_CFuncDefNodec                 C   s   d S r   r   rE   r   r   r   Úvisit_StatNode-  s   zPxdWriter.visit_StatNodeN)r   r   r   r©   r`  r›   ra  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   rb  1  s    rb  N)r©   Ú
__future__r   r   ZCompiler.Visitorr   ZCompiler.ExprNodesZCompiler.Nodesr   Úobjectr   r   r«   rÛ   r]  rb  r   r   r   r   Ú<module>   s       +   5