B
    \G1                 @   s   d Z ddlZddlZddlmZ ddlmZ ddlmZ ddl	m
Z
mZ ddlmZ ddlmZ dd	lmZmZ dd
lmZ edZedejZedejZedejZedZG dd deZG dd deZG dd de
Zdd ZdS )z
    sphinx.domains.c
    ~~~~~~~~~~~~~~~~

    The C language domain.

    :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
    :license: BSD, see LICENSE for details.
    N)nodes)addnodes)ObjectDescription)DomainObjType)_)XRefRole)Field
TypedField)make_refnodez(\W+)z^([^(]*?)          # return type
        ([\w:.]+)  \s*     # thing name (colon allowed for C++)
        (?: \((.*)\) )?    # optionally arguments
        (\s+const)? $      # const specifier
    z^([^(]+?)          # return type
        (\( [^()]+ \)) \s* # name in parentheses
        \( (.*) \)         # arguments
        (\s+const)? $      # const specifier
    z^\s*([^(,]+?)      # return type
        \( ([^()]+) \) \s* # name in parentheses
        \( (.*) \)         # arguments
        (\s+const)?        # const specifier
        \s*(?=$|,)         # end with comma or end of string
    z^\(\s*\*\s*(.*?)\s*\)$c               @   s   e Zd ZdZededddddeded	d
ddededd
ddgZe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 ) CObjectz-
    Description of a C language object.
    	parameterZ
Parameters)paramr   argZargumenttype)r   )labelnamesZtyperolenameZ	typenamesZreturnvalueZReturnsF)Zreturnsreturn)r   Zhas_argr   Z
returntypezReturn type)Zrtype)constZvoidcharZwchar_tintZshortZlongfloatZdoubleZunsignedsignedZFILEZclock_tZtime_tZ	ptrdiff_tZsize_tZssize_tZstructZ_Boolc          	   C   sz   xtdd t |D D ]\}t||}|d tjd krj|| jkrjtjddd|d d d}||7 }||7 }q||7 }qW d S )	Nc             S   s   g | ]}|r|qS  r   ).0Z_fr   r   /lib/python3.7/site-packages/sphinx/domains/c.py
<listcomp>V   s    z'CObject._parse_type.<locals>.<listcomp>r   r    cr   )Z	refdomainZreftypeZ	reftargetmodname	classname)		wsplit_resplitr   ZTextstringZascii_letters	stopwordsr   Zpending_xref)selfnodectypepartZtnodeZpnoder   r   r   _parse_typeS   s    


zCObject._parse_typec             c   st   xnt |}|rD| V  t d|}d|kr@|dd\}}qlP qd|krd|dd\}}|V  q|V  P qW d S )Nr   ,   )c_funcptr_arg_sig_rematchgroupsubr"   )r%   arglistmr   r   r   r   r   _parse_arglistb   s    

zCObject._parse_arglistc          	   C   s  t |}|dkrt|}|dkr,td| \}}}}|tdd7 }| |d | y<|dd\}}	|d7 }|t	||7 }|t
|	|	7 }W n$ tk
r   |t
||7 }Y nX t|}|r|d}| jjd}
| jdkr|
r|
d	 | }n|}|s\| jd
ks6| jdkrB| drB|t 7 }|rX|t	||7 }|S t }|dddd}x| |D ]}| }tjdddd}yt|}|r,| ||dd  |t|d|d7 }| |d|d d  |dr`|t	|d|d7 }n4|dd\}}| || |td| d| 7 }W n" tk
r   | || Y nX ||7 }qW ||7 }|r|t	||7 }|S )z'Transform a C signature into RST nodes.Nzno matchr   z::r+   zc:typezc:member.functionmacroz()`z\ T)Znoemph(   z)(   )        )c_funcptr_sig_rer-   c_sig_re
ValueErrorgroupsr   Z	desc_typer)   r"   Zdesc_addnameZ	desc_namec_funcptr_name_rer.   envref_contextgetnameobjtyperstripendswithZdesc_parameterlistreplacer2   stripZdesc_parameterr,   r   Zemphasisrsplit)r%   sigsignoder1   ZrettyperG   r0   r   r    funcnametypenamefullnameZ	paramlistr   r   r'   argnamer   r   r   handle_signatureu   sh    




zCObject.handle_signaturec             C   sv   | j dkrtd| S | j dkr,td| S | j dkrBtd| S | j dkrXtd| S | j d	krntd
| S dS d S )Nr5   z%s (C function)memberz%s (C member)r6   z%s (C macro)r   z%s (C type)varz%s (C variable)r   )rH   r   )r%   rG   r   r   r   get_index_text   s    




zCObject.get_index_textc             C   s   d| }|| j jjkr|d | |d | | j |d< | j j| | jjd d }||kr| jj	j
d| d | j|| d	  | jd
 | jj| jf||< | |}|r| jd d||dd f d S )Nzc.r   idsfirstr   objectsz&duplicate C object description of %s, zother instance in r   )lineentriesZsingler   )stateZdocumentrX   appendr   Znote_explicit_targetrD   Z
domaindataZstate_machineZreporterZwarningZdoc2pathlinenodocnamerH   rW   Z	indexnode)r%   rG   rN   rO   Z
targetnameinvZ	indextextr   r   r   add_target_and_index   s     

zCObject.add_target_and_indexc             C   s2   d| _ | jdkr.| jr.| jd | jjd< d| _ d S )NFzc:typer   T)typename_setrG   r   rD   rE   )r%   r   r   r   before_content   s
    
zCObject.before_contentc             C   s   | j r| jjdd  d S )Nzc:type)rc   rD   rE   pop)r%   r   r   r   after_content   s    zCObject.after_contentN)__name__
__module____qualname____doc__r
   r   r	   Zdoc_field_typessetr$   r)   r2   rT   rW   rb   rd   rf   r   r   r   r   r   ;   s"   

Er   c               @   s   e Zd Zdd ZdS )	CXRefRolec             C   sT   |sL| d}|dd dkrL|dd  }|d}|dkrL||d d  }||fS )N~r   r+   r4   r3   )lstriprfind)r%   rD   ZrefnodeZhas_explicit_titletitletargetdotr   r   r   process_link   s    

zCXRefRole.process_linkN)rg   rh   ri   rs   r   r   r   r   rl      s   rl   c               @   s   e Zd ZdZdZdZeeddeeddeeddeeddeed	d
dZe	e	e	e	e	dZ
edde e e e dZdi iZdd Zdd Zdd Zdd Zdd ZdS )CDomainzC language domain.r   Cr5   funcrU   r6   r   Zvariabledata)r5   rU   r6   r   rV   T)Z
fix_parens)rv   rU   r6   rw   r   rZ   c             C   s<   x6t | jd  D ] \}\}}||kr| jd |= qW d S )NrZ   )listrw   items)r%   r`   rR   fnZ_lr   r   r   	clear_doc  s     zCDomain.clear_docc             C   s<   x6|d   D ]&\}\}}||kr||f| jd |< qW d S )NrZ   )ry   rw   )r%   ZdocnamesZ	otherdatarR   rz   rH   r   r   r   merge_domaindata!  s    zCDomain.merge_domaindatac       	      C   sR   | d}|tjkr|S || jd kr*d S | jd | }t|||d d| ||S )Nz *rZ   r   zc.)rI   r   r$   rw   r   )	r%   rD   fromdocnamebuildertyprq   r&   contnodeobjr   r   r   resolve_xref(  s    

zCDomain.resolve_xrefc             C   sX   | d}|| jd krg S | jd | }d| |d  t|||d d| ||fgS )Nz *rZ   zc:r+   r   zc.)rI   rw   Zrole_for_objtyper   )r%   rD   r}   r~   rq   r&   r   r   r   r   r   resolve_any_xref6  s    
zCDomain.resolve_any_xrefc             c   s>   x8t | jd  D ]"\}\}}||||d| dfV  qW d S )NrZ   zc.r+   )rx   rw   ry   )r%   Zrefnamer`   r   r   r   r   get_objectsB  s     zCDomain.get_objectsN)rg   rh   ri   rj   rG   r   r   r   Zobject_typesr   Z
directivesrl   ZrolesZinitial_datar{   r|   r   r   r   r   r   r   r   rt      s0   
rt   c             C   s   |  t dddddS )NZbuiltinr+   T)versionZenv_versionZparallel_read_safeZparallel_write_safe)Z
add_domainrt   )Zappr   r   r   setupH  s
    
r   ) rj   rer#   Zdocutilsr   Zsphinxr   Zsphinx.directivesr   Zsphinx.domainsr   r   Zsphinx.localer   Zsphinx.rolesr   Zsphinx.util.docfieldsr	   r
   Zsphinx.util.nodesr   compiler!   VERBOSEr@   r?   r,   rC   r   rl   rt   r   r   r   r   r   <module>
   s.   




 4K