U
    e-                     @   s|   d dl mZ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 G d
d deZG dd deZdS )    )absolute_importprint_function   )CythonTransform)EncodedString)Options)
PyrexTypes   )ExpressionWriter)warningc                   @   s:   e Zd ZdZdddZdd Zdd Zd	d
 Zdd ZdS )AnnotationWriterzW
    A Cython code writer for Python expressions in argument/variable annotations.
    Nc                 C   s   t |  || _d| _dS )zdescription is optional. If specified it is used in
        warning messages for the nodes that don't convert to string properly.
        If not specified then no messages are generated.
        FN)r
   __init__description
incomplete)selfr    r   E/tmp/pip-unpacked-wheel-7k3cqui1/Cython/Compiler/AutoDocTransforms.pyr      s    
zAnnotationWriter.__init__c                 C   s2   |  d d| _| jr.t|jd| jdd d S )Nz<???>Tz6Failed to convert code to string representation in {0}r   levelputr   r   r   posformatr   noder   r   r   
visit_Node   s    
zAnnotationWriter.visit_Nodec                 C   s2   |  d d| _| jr.t|jd| jdd d S )Nz<lambda>Tz8Failed to convert lambda to string representation in {0}r   r   r   r   r   r   r   visit_LambdaNode    s    
z!AnnotationWriter.visit_LambdaNodec                 C   s   |  |d d S )N )Zemit_stringr   r   r   r   visit_UnicodeNode)   s    z"AnnotationWriter.visit_UnicodeNodec                 C   s   |  |jj d S N)r   stringZunicode_valuer   r   r   r   visit_AnnotationNode.   s    z%AnnotationWriter.visit_AnnotationNode)N)	__name__
__module____qualname____doc__r   r   r   r   r!   r   r   r   r   r      s   
		r   c                       s   e Zd Z f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dZdd Z fddZdd Zdd Zdd Zd d! Zd"d# Z  ZS )&EmbedSignaturec                    s    t t| | d | _d | _d S r   )superr&   r   
class_name
class_node)r   context	__class__r   r   r   4   s    zEmbedSignature.__init__c                 C   s   t  }||}|S r   )r
   writer   r   writerresultr   r   r   	_fmt_expr9   s    
zEmbedSignature._fmt_exprc                 C   s   t  }||}|S r   )r   r-   r.   r   r   r   _fmt_annotation?   s    
zEmbedSignature._fmt_annotationc                 C   s,   | j d }|dk| _|dk| _|dk| _d S )Nzembedsignature.formatcpythonZclinic)current_directivesis_format_cis_format_pythonis_format_clinic)r   Zsignature_formatr   r   r   _setup_formatE   s    


zEmbedSignature._setup_formatc                 C   s   |j }d }d }|jr | jrpd}nP|jr2| jrpd}n>| jrX|jtjk	rp|jj|j dd}n| j	rp|j
sp| |j}|j
r| js| |j
}|jr| |j}|r|d|  }|r|d|  }n|r|d|  }|S )Nz$selfz$typer   Zfor_display: %sz = %sz=%s)nameis_self_argr8   Zis_type_argr6   typer   py_object_typedeclaration_coder7   
annotation	_fmt_typer2   defaultr1   )r   argarg_docrA   Z
defaultvalr   r   r   _fmt_argK   s6    zEmbedSignature._fmt_argc                 C   s.   |j }|jr*| js*| |j}|d|  }|S )Nr;   )r<   rA   r8   r2   )r   rD   rE   rA   r   r   r   _fmt_star_argh   s    zEmbedSignature._fmt_star_argr   NFc                 C   s   g }|D ]$}	|r|	j js| |	}
||
 q|rR| |}
||| d|
  n|rf||| d |rv||d |r| |}
|d|
  |S )Nz*%s*/z**%s)entryr=   rF   appendrG   insert)r   argsnpoargsnpargspargsnkargskargs	hide_selfarglistrD   rE   r   r   r   _fmt_arglistp   s     


zEmbedSignature._fmt_arglistc                 C   s   |t jkrd S | jr&|jddd}|S | jr~d }|jrB| jd }n|jrP| }|d krz|jddd}|	dd	dd}|S d S )	Nr   r   r:   Zc_string_type _rH   p)
r   r?   r6   r@   r7   	is_stringr5   Z
is_numericZpy_type_namereplace)r   r>   coderA   r   r   r   rB      s     
zEmbedSignature._fmt_typec              	   C   s   | j |||||||d}d|}d||f }| jrD|rDd||f }| js|d }|	r^| |	}n|
rl| |
}|r|d||f }|S )N)rS   z, z%s(%s)%s.%sz%s -> %s)rU   joinr6   r8   r2   rB   )r   Zcls_name	func_namerM   rN   rO   rP   rQ   rR   return_exprreturn_typerS   rT   Zarglist_docZfunc_docZret_docr   r   r   _fmt_signature   s,         


zEmbedSignature._fmt_signaturec                 C   sP   | j r| jd r|S |r4| j r$d}nd}|||f S | j r@d}nd}|| S d S )NZbindingz	%s
--

%sz%s
%sz%s
--

z%s)r8   r5   )r   	signatureZnode_docZdocfmtr   r   r   _embed_signature   s    zEmbedSignature._embed_signaturec                    s   t js
|S tt| |S d S r   )r   Z
docstringsr'   r&   __call__r   r+   r   r   rd      s    zEmbedSignature.__call__c                 C   sV   | j }| j}|| _z|j| _ W n tk
r:   |j | _ Y nX | | || _ || _|S r   )r(   r)   r<   AttributeErrorZvisitchildren)r   r   ZoldnameZoldclassr   r   r   visit_ClassDefNode   s    
z!EmbedSignature.visit_ClassDefNodec                 C   s   |S r   r   r   r   r   r   r      s    zEmbedSignature.visit_LambdaNodec                 C   sX  | j d s|S |   d}d}|jjrZ| jo4|jdk}|s>|S d }|j}| jrh| j}d}n| j|j }}t|dd}t|dd}t	|j
| | }| j|||j
|||j||j|jd |d}	|	rT|r| jr| jjjj}
n|j}
|
jd k	r|
j}n(|st|d	d d k	r|jjj}nd }| |	|}t||
_|sTt|d	d d k	rTt||jj_|S )
NembedsignatureFr   TZnum_posonly_argsr   Znum_kwonly_args)r_   r`   rS   py_func)r5   r9   rJ   Z
is_specialr)   r<   r6   r(   getattrlenrM   ra   Zstar_argZstarstar_argreturn_type_annotationr>   Zscopedocrh   rc   r   )r   r   Zis_constructorrS   r(   r^   rN   rQ   rO   rb   Z
doc_holderold_docnew_docr   r   r   visit_DefNode   sZ    
      


zEmbedSignature.visit_DefNodec                 C   s   |j s
|S | jd s|S |   | j| j|jjj|jj|j	d}|r|j
jd k	rZ|j
j}n t|dd d k	rv|jj
j}nd }| ||}t||j
_t|dd }|d k	rt||j
_|S )Nrg   )r`   rh   )Zoverridabler5   r9   ra   r(   Z
declaratorbaser<   rM   r`   rJ   rl   ri   rh   rc   r   )r   r   rb   rm   rn   rh   r   r   r   visit_CFuncDefNode  s.    
 
z!EmbedSignature.visit_CFuncDefNodec           
      C   s  | j d s|S |   |j}|j}|j}d }|jdkr| jrx|jjddd}|jj	s^d| }q|jj
r|jjd | }n| jr| |j}|d kr|jD ]8}|jdkrq| jrd	| j|f }|j}|r| |}q|d k	rd
||f }| ||j}	| jst|	|_|S )Nrg   publicr   r   r:   z'%s'.__get__r\   z%s: %s)r5   r9   rJ   bodyr<   Z
visibilityr6   r>   r@   Zis_pyobjectZis_extension_typemodule_namer7   rB   statsr(   rk   r2   rc   rl   r8   r   )
r   r   rJ   ru   Z	prop_name	type_namestatZret_annotationrb   rn   r   r   r   visit_PropertyNode  s>    






z!EmbedSignature.visit_PropertyNode)r   r   Nr   NF)r   r   Nr   NNNF)r"   r#   r$   r   r1   r2   r9   rF   rG   rU   rB   ra   rc   rd   rf   r   ro   rq   rz   __classcell__r   r   r+   r   r&   2   s<   	         
            
-r&   N)
__future__r   r   ZVisitorr   ZStringEncodingr   r   r   r   Z
CodeWriterr
   ZErrorsr   r   r&   r   r   r   r   <module>   s   '