U
    {h.                     @   st   d dl 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 )    N   )CythonTransform)EncodedString)Options)
PyrexTypes   )ExpressionWriter)warningc                   @   s2   e Zd ZdZd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-fhl22ezh/Cython/Compiler/AutoDocTransforms.pyr      s    
zAnnotationWriter.__init__c                 C   s2   |  d d| _| jr.t|jd| jdd d S )Nz<???>Tz5Failed to convert code to string representation in {}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>Tz7Failed to convert lambda to string representation in {}r   r   r   r   r   r   r   visit_LambdaNode    s    
z!AnnotationWriter.visit_LambdaNodec                 C   s   |  |jj d S N)r   string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
      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  | d | _d | _d S r   )superr   
class_name
class_node)r   context	__class__r   r   r   /   s    zEmbedSignature.__init__c                 C   s   t  }||}|S r   )r   writer   r   writerresultr   r   r   	_fmt_expr4   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_format@   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_argr5   Zis_type_argr3   typer   py_object_typedeclaration_coder4   
annotation	_fmt_typer/   defaultr.   )r   argarg_docr>   Z
defaultvalr   r   r   _fmt_argF   s6    zEmbedSignature._fmt_argc                 C   s.   |j }|jr*| js*| |j}|d|  }|S )Nr8   )r9   r>   r5   r/   )r   rA   rB   r>   r   r   r   _fmt_star_argc   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:   rC   appendrD   insert)r   argsnpoargsnpargspargsnkargskargs	hide_selfarglistrA   rB   r   r   r   _fmt_arglistk   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 )	N r   r7   Zc_string_type _rE   p)
r   r<   r3   r=   r4   	is_stringr2   Z
is_numericZpy_type_namereplace)r   r;   coder>   r   r   r   r?      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)rP   z, z%s(%s)%s.%sz%s -> %s)rR   joinr3   r5   r/   r?   )r   Zcls_name	func_namerJ   rK   rL   rM   rN   rO   return_exprreturn_typerP   rQ   Zarglist_docZfunc_docZret_docr   r   r   _fmt_signature   s,         


zEmbedSignature._fmt_signaturec                 C   sZ   | j r| jd r|S |r>| j r$d}nd}t|}|||f S | j rJd}nd}|| S d S )NZbindingz	%s
--

%sz%s

%sz%s
--

z%s)r5   r2   inspectcleandoc)r   	signatureZnode_docZdocfmtr   r   r   _embed_signature   s    
zEmbedSignature._embed_signaturec                    s   t js
|S t |S d S r   )r   Z
docstringsr$   __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&   r9   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   s  | j d s|S |   d}d}|jjrf| jo4|jdk}|rVd }|j}| jrd| j}d}qt| j|j }}n| j|j }}t|dd}t|dd}t	|j
| | }| j|||j
|||j||j|jd |d}	|	r|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 }| |	|}|jjrP|sP|jjd k	rZt||
_|st|d	d d k	rt||jj_|S )
NembedsignatureFr   TZnum_posonly_argsr   Znum_kwonly_args)r]   r^   rP   py_func)r2   r6   rG   Z
is_specialr&   r9   r3   r%   getattrlenrJ   r_   Zstar_argZstarstar_argreturn_type_annotationr;   Zscopedocrh   rc   Zwrapperbase_cnamer   )r   r   Zis_constructorrP   r%   r\   rK   rN   rL   rb   Z
doc_holderold_docnew_docr   r   r   visit_DefNode   s\    
      

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overridabler2   r6   r_   r%   Z
declaratorbaser9   rJ   r^   rG   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   publicrS   r   r7   z'%s'.__get__rZ   z%s: %s)r2   r6   rG   bodyr9   Z
visibilityr3   r;   r=   Zis_pyobjectZis_extension_typemodule_namer4   r?   statsr%   rk   r/   rc   rl   r5   r   )
r   r   rG   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   r.   r/   r6   rC   rD   rR   r?   r_   rc   rd   rf   r   ro   rq   rz   __classcell__r   r   r(   r   r#   -   s<   	         
            
3r#   )r`   ZVisitorr   ZStringEncodingr   rS   r   r   Z
CodeWriterr   ZErrorsr	   r
   r#   r   r   r   r   <module>   s   "