B
    da                 @   s.  d Z ddlZddlZddlZddlZddlZddlZddlmZ ddlmZm	Z	m
Z
mZmZmZmZmZmZ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 dd
lmZ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*m+Z+m,Z,m-Z- ddl.m/Z/ ddl0m1Z1m2Z2 ddl3m4Z4 ddl3m5Z6 ddl7m8Z8 ddl9m:Z: ddl;m<Z<m=Z=m>Z> ddl?m@Z@mAZA ddlBmCZC ddlDmEZEmFZFmGZGmHZH ddlImJZJmKZK e:LeMZNeOdejPZQe1de1de1de1de1d e1d!e1d"d#ZRG d$d% d%eZSG d&d' d'eZTdieUeVeeUeUeUeVf d)d*d+ZWdjeUee/ eVejd,d-d.ZXeUe/ee d/d0d1ZYdkeUee/ ejZd2d3d4Z[eeUdd5d6d7Z\G d8d9 d9Z]G d:d; d;e]e<Z^G d<d= d=e]e=Z_G d>d? d?e]e>Z`G d@dA dAe(eeUeUf  ZaG dBdC dCeaZbG dDdE dEebZcG dFdG dGeaZdG dHdI dIeaZeG dJdK dKeaZfG dLdM dMefZgG dNdO dOefZhG dPdQ dQefZiG dRdS dSeaZjG dTdU dUeaZkG dVdW dWe@ZlG dXdY dYe@ZmG dZd[ d[e8Zne"eUeUedd\d]d^ZoG d_d` d`e+ZpG dadb dbe*Zqe"e/eeedcdddeZre"e	eUef dfdgdhZsdS )lzThe Python domain.    N)	Parameter)
AnyDictIterableIteratorList
NamedTupleOptionalTupleTypecast)nodes)ElementNode)
directives)Inliner)addnodes)desc_signaturepending_xrefpending_xref_condition)Sphinx)Builder)RemovedInSphinx60Warning)ObjectDescription)DomainIndex
IndexEntryObjType)BuildEnvironment)___)ast)parse)XRefRole)logging)FieldGroupedField
TypedField)SphinxDirectiveswitch_source_input)signature_from_str)find_pending_xref_conditionmake_idmake_refnodenested_parse_with_titles)
OptionSpecTextlikeNodea  ^ ([\w.]*\.)?            # class name(s)
          (\w+)  \s*             # thing name
          (?: \(\s*(.*)\s*\)     # optional: arguments
           (?:\s* -> \s* (.*))?  #           return annotation
          )? $                   # and nothing more
          modulekeywordoperatorobject	exception	statementzbuilt-in function)r1   r2   r3   r4   r5   r6   builtinc               @   s.   e Zd ZU eed< eed< eed< eed< dS )ObjectEntrydocnamenode_idobjtypealiasedN)__name__
__module____qualname__str__annotations__bool rC   rC   b/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/sphinx/domains/python.pyr8   =   s   
r8   c               @   s6   e Zd ZU eed< eed< eed< eed< eed< dS )ModuleEntryr9   r:   synopsisplatform
deprecatedN)r=   r>   r?   r@   rA   rB   rC   rC   rC   rD   rE   D   s
   
rE   F)	reftargetsuppress_prefixreturnc             C   s   d}|  dr$| dd } | }d}nV|  drJ| dd } | dd }n0|r^| dd }n|  drv| d	d }n| }| d
ks|  drd}nd}|| ||fS )zLParse a type string and return (reftype, reftarget, title, refspecific flag)F.   NT~ztyping.   Noneobjclass)
startswithsplit)rI   rJ   refspecifictitlereftyperC   rC   rD   parse_reftargetL   s"    


rY   )targetenvrJ   rK   c       	      C   s   |r |j d|j dd}ni }t| |\}} }}|jjrj|dd }td|ddtd|d	dg}nt|g}t	d|d
|| |d|S )z0Convert a type string to a cross reference node.z	py:modulezpy:class)z	py:modulezpy:classrL   rO    resolved)	condition*py)	refdomainrX   rI   rV   )r\   )
ref_contextgetrY   config!python_use_unqualified_type_namesrU   r   r   Textr   )	rZ   r[   rJ   kwargsrX   rW   rV   	shortname	contnodesrC   rC   rD   type_to_xrefg   s    
rj   )
annotationr[   rK   c                s   t jtt d fdd yt| }g }x |D ]}t|tjrR||d  q2t|tj	r|
 r|rt|d tjr|d  dkr|  |tt||dd q|tt|| q2|| q2W |S  tk
r   t| |gS X d	S )
zParse type annotation.)noderK   c                sD  t | tjr,td | jd | jf gS t | tjrf | j}|	 | j
 |	 | j |S t | tjrt tddt gS t | tjr,| jtkrtddgS t | jtrtdt| jgS t | jt rtdt| jgS t | jtrtdt| jgS tt| jgS nt | tjrD | jS t | tjr\ | jS t | tjrxtddgS t | tjrtddg}| jrx>| jD ]4}|	 | |tdd |t  qW |  |  |tdd	 |S t | tj r*t! fd
d| j"D g S t | tj#rFt| j$gS t | tj%r | j}|tdd |	 | j& |tdd	 |d dkrxBt'|dd  ddD ]*\}}t |tjrt(dd|||< qW |S t | tj)r
 | j
 | j* S t | tj+r| jrvg }x>| jD ]4}|	 | |tdd |t  q,W |  |  ntddtddg}|S t,j-dk r<t | tj.rtdt| j/gS t | tjrtddgS t | tj0rt| jgS t | tj1rtdt| j2gS t | tj3r<tdt| j/gS t4d S )Nz%s.%sr   r\   |z...rN   [,]c             3   s   | ]} |V  qd S )NrC   ).0e)unparserC   rD   	<genexpr>   s    z5_parse_annotation.<locals>.unparse.<locals>.<genexpr>)Literalztyping.LiteralrM   )start())      )5
isinstancer!   	Attributer   rf   valueattrBinOpleftextendoprightBitOrr   desc_sig_spacedesc_sig_punctuationConstantEllipsisrB   desc_sig_keywordreprintZdesc_sig_literal_numberr@   Zdesc_sig_literal_stringExprr   Invertr   eltsappendpopModulesumbodyNameid	Subscriptslice	enumerateliteralUnaryOpoperandr
   sysversion_infoBytessNameConstantNumnStrSyntaxError)rl   resultelemiZsubnode)rs   rC   rD   rs      s     








z"_parse_annotation.<locals>.unparser   rO   rN   T)rJ   N)r!   ASTr   r   	ast_parser{   r   r   r   rf   stripr   r   astextr   rj   r@   r   )rk   r[   treer   rl   rC   )rs   rD   _parse_annotation   s"    \r   )arglistr[   rK   c          
   C   s  t | }td|  }d}x|j D ]}|j|jkr^||jkr^|t ddt dd7 }|j|j	kr||j
|jdfkr|t ddt dd7 }t  }|j|jkr|t dd7 }|t d|j7 }nB|j|jkr|t dd7 }|t d|j7 }n|t d|j7 }|j|jk	rXt|j|}|t dd7 }|t  7 }|t jd| 7 }|j|jk	r|j|jk	r|t  7 }|t dd7 }|t  7 }n|t dd7 }|tjd|jd	gd
d7 }||7 }|j}q(W |tjkr |t ddt dd7 }|S )z*Parse a list of arguments using AST parserz(%s)Nr\   /r_   z**:=default_valueF)classesZsupport_smartquotes)r\   r\   )r   desc_parameterlistr*   
parametersvalueskindPOSITIONAL_ONLYdesc_parameterZdesc_sig_operatorKEYWORD_ONLYPOSITIONAL_OR_KEYWORDVAR_POSITIONALdesc_sig_namenameVAR_KEYWORDrk   emptyr   r   r   defaultr   inliner   )r   r[   paramssigZ	last_kindparamrl   childrenrC   rC   rD   _parse_arglist   sH    


r   )signoder   rK   c             C   s  t  }|g}yxf|dD ]V}| }d }}x@|drv|t   |d  |d 7  < |dd  }q8W x&|dr|  |dd  }qzW x0|dr|d	s|d7 }|dd  }qW x&|dr|d7 }|dd  }qW |r"|d  t 	d
d
t 
||7  < x6|rX|t   |d  |d 7  < |d8 }q$W x|rv|  |d8 }q\W q W t|dkrtW n6 tk
r   t  }|t 	||7 }| |7 } Y n
X | |7 } dS )z"Parse" a list of arguments separated by commas.

    Arguments can have "optional" annotations given by enclosing them in
    brackets.  Currently, this will split at any comma, even if it's inside a
    string literal (e.g. default argument value).
    ro   r   rn   rO   rM   Nrp   z[]r\   )r   r   rU   r   rT   r   Zdesc_optionalr   endswithr   r   len
IndexError)r   r   Z	paramliststackargumentZ	ends_openZ
ends_closerC   rC   rD   _pseudo_parse_arglist'  sH    r   c                   sx   e Zd Zejddddfeeeee ee	e
eed	 fddZejddddfeeeee ee	e
eee d	ddZ  ZS )PyXrefMixinN)	rolenamedomainrZ   	innernodecontnoder[   inlinerlocationrK   c	          
      s   t  j||||||d d d}	t|	trd|	d< |jd|	d< |jd|	d< t|\}
}}}||kr|
|	d< ||	d< |	  |	|||7 }	nZ|jj	r|	j
}|	  |dd	 }|d
|}td
d
|ddtd|ddig}|	| |	S )N)r   r   TrV   z	py:modulezpy:classrX   rI   rL   rO   r\   r]   )r^   r^   r_   )r\   r\   )super	make_xrefr{   r   rb   rc   rY   clearrd   re   r   rU   r   r   )selfr   r   rZ   r   r   r[   r   r   r   rX   rI   Zreftitler   r   rh   Ztextnoderi   )	__class__rC   rD   r   [  s,    


zPyXrefMixin.make_xrefc	             C   s   d}	t |	}
t |	|}t|o*| |k}d}g }xntd |D ]`}|rTt|}|sb|
|rx|	|pr||| n|	| 
|||||||| |dkrBd}qBW |S )Nz>(\s*[\[\]\(\),](?:\s*o[rf]\s)?\s*|\s+o[rf]\s+|\s*\|\s*|\.\.\.)F)ru   ztyping.Literalz~typing.LiteralT)recompilerU   rB   r   filterr   rf   matchr   r   )r   r   r   rZ   r   r   r[   r   r   delimsZ	delims_reZsub_targetsZsplit_contnodeZ
in_literalresultsZ
sub_targetrC   rC   rD   
make_xrefs|  s     

zPyXrefMixin.make_xrefs)r=   r>   r?   r   Zemphasisr@   r   r0   r   r   r   r   r   r   __classcell__rC   rC   )r   rD   r   Z  s   ,r   c               @   s   e Zd ZdS )PyFieldN)r=   r>   r?   rC   rC   rC   rD   r     s   r   c               @   s   e Zd ZdS )PyGroupedFieldN)r=   r>   r?   rC   rC   rC   rD   r     s   r   c               @   s   e Zd ZdS )PyTypedFieldN)r=   r>   r?   rC   rC   rC   rD   r     s   r   c               @   s^  e Zd ZU dZejejejejejejdZee	d< e
deddddd	d
e
deddddd	d
ededddd	dededdddededddddgZdZeeej dddZed d!d"Zeeeeef d#d$d%Zeeed&f d'd(d)Zeeeef ed*d+d,Zeeef eed-d.d/d0Zd-d d1d2Zd-d d3d4Zeed'd5d6Z d-S )7PyObjectz
    Description of a general Python object.

    :cvar allow_nesting: Class is an object that allows for nested namespaces
    :vartype allow_nesting: bool
    )noindexnoindexentrynocontentsentryr1   	canonicalrk   option_spec	parameterZ
Parameters)r   r   argr   r2   kwargZkwparamrS   )Z	paramtypetypeT)labelnamesZtyperolenameZ	typenamescan_collapsevariable	Variables)varZivarZcvar)vartype
exceptionsZRaisesexc)Zraisesraiser5   except)r   r   r   r   ZreturnvalueZReturnsF)ZreturnsrK   )r   has_argr   Z
returntypezReturn type)Zrtype)r   r   r   Zbodyrolename)r   rK   c             C   s   g S )zTMay return a prefix to put before the object name in the
        signature.
        rC   )r   r   rC   rC   rD   get_signature_prefix  s    zPyObject.get_signature_prefix)rK   c             C   s   dS )zqMay return true if an empty argument list is to be generated even if
        the document contains none.
        FrC   )r   rC   rC   rD   needs_arglist  s    zPyObject.needs_arglist)r   r   rK   c          
   C   s  t |}|dkrt| \}}}}| jd| jjd}| jjd}	|	rd}
|r||	ksn||	d r|| }|t	|	d 
d}q|r|	d | | }q|	d | }n$d}
|r|d}	|| }nd}	|}||d< |	|d	< ||d
< | |}|rRt|tkr8td|t |t|dt|7 }n|tjt|df| 7 }|rj|t||7 }n0|r|
r| jjjr|d }|t||7 }|t||7 }|r&y|t|| j7 }W n^ tk
r   t|| Y n@ tk
r" } z tj d|||d t|| W dd}~X Y nX n| ! r<|t" 7 }|rdt#|| j}|tj$|df| 7 }| jd}|r|td| dt% t|7 }||fS )aJ  Transform a Python signature into RST nodes.

        Return (fully qualified name of the thing, classname if any).

        If inside a class, the current class name is handled intelligently:
        * it is stripped from the displayed name if present
        * it is added to the full name (return value) if not present
        Nr1   z	py:modulezpy:classFrL   Tr\   rS   fullnamezPython directive method get_signature_prefix() returning a string is deprecated. It must now return a list of nodes. Return value was '{}'.z could not parse arglist (%r): %s)r   rk    )&	py_sig_rer   
ValueErrorgroupsoptionsrc   r[   rb   rT   r   lstriprstripr   r   r@   warningswarnformatr   r   desc_annotationr   rf   desc_addnamerd   add_module_namesZ	desc_namer   r   r   NotImplementedErrorloggerwarningr   r   r   Zdesc_returnsr   )r   r   r   mprefixr   r   Zretannmodname	classnameZ
add_moduler   Z
sig_prefixZnodetextr   r   annorC   rC   rD   handle_signature  sx    	






zPyObject.handle_signature.)sig_noderK   c             C   sD   d|krdS | d}|d }|r2|f|dS t|dS d S )Nr   rC   r1   rL   )rc   rU   tuple)r   r  r  r   rC   rC   rD   _object_hierarchy_parts2  s    
z PyObject._object_hierarchy_parts)r  r   rK   c             C   s   t ddS )z2Return the text for the index entry of the object.z!must be implemented in subclassesN)r  )r   r  r   rC   rC   rD   get_index_text=  s    zPyObject.get_index_textN)name_clsr   r   rK   c       
      C   s   | j d| jjd}|r$|d nd|d  }t| j| jjd|}|d | | jj| t	t
| jd}|j|| j||d | j d	}|r|j|| j|d
|d d| j kr| ||}	|	r| jd d|	|dd f d S )Nr1   z	py:modulerL   r\   r   idsr`   )r   r   T)r<   r   r   entriessingle)r  rc   r[   rb   r,   statedocumentr   note_explicit_targetr   PythonDomain
get_domainnote_objectr;   r  	indexnode)
r   r  r   r   r  r   r:   r   canonical_name	indextextrC   rC   rD   add_target_and_indexA  s    
zPyObject.add_target_and_indexc             C   s   d}| j r2| j d \}}| jr$|}n|r2|d}|rb|| jjd< | jrb| jjdg }|| d| jkr| jjdg }|| jjd | jd | jjd< dS )	a  Handle object nesting before content

        :py:class:`PyObject` represents Python language constructs. For
        constructs that are nestable, such as a Python classes, this method will
        build up a stack of the nesting hierarchy so that it can be later
        de-nested correctly, in :py:meth:`after_content`.

        For constructs that aren't nestable, the stack is bypassed, and instead
        only the most recent object is tracked. This object prefix name will be
        removed with :py:meth:`after_content`.
        NrO   rL   zpy:classz
py:classesr1   z
py:modulesz	py:module)	r   allow_nestingr   r[   rb   
setdefaultr   r  rc   )r   r  r   Zname_prefixr   modulesrC   rC   rD   before_contentV  s     


zPyObject.before_contentc             C   s   | j jdg }| jr8y|  W n tk
r6   Y nX t|dkrL|d nd| j jd< d| jkr| j jdg }|r| | j jd< n| j jd dS )	a^  Handle object de-nesting after content

        If this class is a nestable object, removing the last nested class prefix
        ends further nesting in the object.

        If this class is not a nestable object, the list of classes should not
        be altered as we didn't affect the nesting levels in
        :py:meth:`before_content`.
        z
py:classesr   rO   Nzpy:classr1   z
py:modulesz	py:module)r[   rb   r)  r(  r   r   r   r  )r   r   r*  rC   rC   rD   after_contentw  s    

zPyObject.after_contentc             C   s   | dsdS | jjj}|j d}|jr8|dkr8d}nd}|d ^ }}|jdkrd| d|| S |jdkrv|| S |jd	krd
||| g S dS )NZ
_toc_partsr\   r;   >   functionmethodz()r   r   ZhideallrL   )rc   r[   apprd   parentZadd_function_parenthesesZtoc_object_entries_show_parentsjoin)r   r  rd   r;   parensparentsr   rC   rC   rD   _toc_entry_name  s    




zPyObject._toc_entry_name)!r=   r>   r?   __doc__r   flag	unchangedr   r/   rA   r   r   r   r%   r   Zdoc_field_typesr(  r@   r   r   r   r   rB   r   r   r
   r  r  r  r'  r+  r,  r5  rC   rC   rC   rD   r     sB   


]!r   c                   s   e Zd ZU dZej Zeed< e	de
ji eeej dddZeddd	Zeeef eed
d fddZeeeef edddZ  ZS )
PyFunctionzDescription of a function.r   async)r   rK   c             C   s&   d| j krtddt gS g S d S )Nr:  r\   )r  r   r   r   )r   r   rC   rC   rD   r     s    


zPyFunction.get_signature_prefix)rK   c             C   s   dS )NTrC   )r   rC   rC   rD   r     s    zPyFunction.needs_arglistN)r  r   r   rK   c       	         s   t  ||| d| jkr| jd| jjd}|d d }|\}}|rvtd||f }| jd d||d	d f n*d
t	d |f }| jd d||d	d f d S )Nr   r1   z	py:moduler  r   z%s() (in module %s)r  r  r\   z%s; %s()r7   pair)
r   r'  r  rc   r[   rb   r   r$  r   pairindextypes)	r   r  r   r   r  r:   r   clstext)r   rC   rD   r'    s    
zPyFunction.add_target_and_index)r  r  rK   c             C   s   d S )NrC   )r   r  r  rC   rC   rD   r    s    zPyFunction.get_index_text)r=   r>   r?   r6  r   r   copyr/   rA   updater   r7  r@   r   r   r   r   rB   r   r
   r   r'  r  r   rC   rC   )r   rD   r9    s   
r9  c                   sV   e Zd ZdZee d fddZeee	eef d fddZ
eddd	Z  ZS )
PyDecoratorFunctionzDescription of a decorator.)rK   c                s   d| _ t  S )Nzpy:function)r   r   run)r   )r   rC   rD   rB    s    zPyDecoratorFunction.run)r   r   rK   c                s&   t  ||}|dtdd |S )Nr   @)r   r  insertr   r  )r   r   r   ret)r   rC   rD   r    s    z$PyDecoratorFunction.handle_signaturec             C   s   dS )NFrC   )r   rC   rC   rD   r     s    z!PyDecoratorFunction.needs_arglist)r=   r>   r?   r6  r   r   rB  r@   r   r
   r  rB   r   r   rC   rC   )r   rD   rA    s   rA  c                   st   e Zd ZU dZej Zeed< e	e
je
jd eeeeef d fddZeeeef eddd	Z  ZS )

PyVariablezDescription of a variable.r   )r   r}   )r   r   rK   c                s   t  ||\}}| jd}|rTt|| j}|tj|dtddt	 f| 7 }| jd}|r|t|dt	 tddt	 t
|7 }||fS )Nr   r\   r   r}   r   )r   r  r  rc   r   r[   r   r
  r   r   r   rf   )r   r   r   r   r  typannotationsr}   )r   rC   rD   r    s    



zPyVariable.handle_signature)r  r  rK   c             C   s,   |\}}|rt d||f S t d| S d S )Nz%s (in module %s)z%s (built-in variable))r   )r   r  r  r   r=  rC   rC   rD   r    s    zPyVariable.get_index_text)r=   r>   r?   r6  r   r   r?  r/   rA   r@  r   r8  r@   r   r
   r  r  r   rC   rC   )r   rD   rF    s   
rF  c               @   sh   e Zd ZU dZej Zeed< e	de
ji dZeeej dddZeeeef edd	d
ZdS )PyClasslikezO
    Description of a class-like object (classes, interfaces, exceptions).
    r   finalT)r   rK   c             C   sD   d| j kr,tdt t| jt gS t| jt gS d S )NrJ  )r  r   rf   r   r   r;   )r   r   rC   rC   rD   r     s    
z PyClasslike.get_signature_prefix)r  r  rK   c             C   sL   | j dkr2|std|d  S td|d |f S | j dkrD|d S dS d S )NrS   z%s (built-in class)r   z%s (class in %s)r5   r\   )r;   r   )r   r  r  rC   rC   rD   r    s    

zPyClasslike.get_index_textN)r=   r>   r?   r6  r   r   r?  r/   rA   r@  r   r7  r(  r@   r   r   r   r   r
   r  rC   rC   rC   rD   rI     s   
rI  c            	   @   s   e Zd ZU dZej Zeed< e	e
je
je
je
je
je
jd edddZeeej ddd	Zeeeef ed
ddZdS )PyMethodzDescription of a method.r   )abstractmethodr:  classmethodrJ  propertystaticmethod)rK   c             C   s   d| j krdS dS d S )NrN  FT)r  )r   rC   rC   rD   r   +  s    
zPyMethod.needs_arglist)r   rK   c             C   s  g }d| j kr,|td |t  d| j krT|td |t  d| j kr||td |t  d| j kr|td |t  d| j krttd |td |t  d| j kr|td	 |t  |S )
NrJ  rL  abstractr:  rM  rN  zdUsing the :property: flag with the py:method directiveis deprecated, use ".. py:property::" instead.rO  Zstatic)	r  r   r   rf   r   r   r  r  r   )r   r   r  rC   rC   rD   r   1  s*    




zPyMethod.get_signature_prefix)r  r  rK   c             C   s   |\}}y0| dd\}}|r6| jjjr6d||g}W n0 tk
rh   |r\td||f S d| S Y nX d| jkrtd||f S d| jkrtd||f S d	| jkrtd
||f S td||f S d S )NrL   rM   z%s() (in module %s)z%s()rM  z%s() (%s class method)rN  z%s (%s property)rO  z%s() (%s static method)z%s() (%s method))rsplitr[   rd   r  r2  r  r   r  )r   r  r  r   r=  clsnameZmethnamerC   rC   rD   r  I  s     


zPyMethod.get_index_textN)r=   r>   r?   r6  r   r   r?  r/   rA   r@  r   r7  rB   r   r@   r   r   r   r   r
   r  rC   rC   rC   rD   rK    s   
rK  c                   s>   e Zd ZU dZej Zeed< e	e
 d fddZ  ZS )PyClassMethodzDescription of a classmethod.r   )rK   c                s   d| _ d| jd< t  S )Nz	py:methodTrM  )r   r  r   rB  )r   )r   rC   rD   rB  d  s    
zPyClassMethod.run)r=   r>   r?   r6  r   r   r?  r/   rA   r   r   rB  r   rC   rC   )r   rD   rS  _  s   
rS  c                   s>   e Zd ZU dZej Zeed< e	e
 d fddZ  ZS )PyStaticMethodzDescription of a staticmethod.r   )rK   c                s   d| _ d| jd< t  S )Nz	py:methodTrO  )r   r  r   rB  )r   )r   rC   rD   rB  p  s    
zPyStaticMethod.run)r=   r>   r?   r6  r   r   r?  r/   rA   r   r   rB  r   rC   rC   )r   rD   rT  k  s   
rT  c                   sV   e Zd ZdZee d fddZeee	eef d fddZ
eddd	Z  ZS )
PyDecoratorMethodz!Description of a decoratormethod.)rK   c                s   d| _ t  S )Nz	py:method)r   r   rB  )r   )r   rC   rD   rB  z  s    zPyDecoratorMethod.run)r   r   rK   c                s&   t  ||}|dtdd |S )Nr   rC  )r   r  rD  r   r  )r   r   r   rE  )r   rC   rD   r  ~  s    z"PyDecoratorMethod.handle_signaturec             C   s   dS )NFrC   )r   rC   rC   rD   r     s    zPyDecoratorMethod.needs_arglist)r=   r>   r?   r6  r   r   rB  r@   r   r
   r  rB   r   r   rC   rC   )r   rD   rU  w  s   rU  c                   st   e Zd ZU dZej Zeed< e	e
je
jd eeeeef d fddZeeeef eddd	Z  ZS )
PyAttributezDescription of an attribute.r   )r   r}   )r   r   rK   c                s   t  ||\}}| jd}|rTt|| j}|tj|dtddt	 f| 7 }| jd}|r|t|dt	 tddt	 t
|7 }||fS )Nr   r\   r   r}   r   )r   r  r  rc   r   r[   r   r
  r   r   r   rf   )r   r   r   r   r  rG  rH  r}   )r   rC   rD   r    s     




zPyAttribute.handle_signature)r  r  rK   c             C   sv   |\}}y0| dd\}}|r6| jjjr6d||g}W n, tk
rd   |r\td||f S |S Y nX td||f S )NrL   rM   z%s (in module %s)z%s (%s attribute))rQ  r[   rd   r  r2  r  r   )r   r  r  r   r=  rR  attrnamerC   rC   rD   r    s    
zPyAttribute.get_index_text)r=   r>   r?   r6  r   r   r?  r/   rA   r@  r   r8  r@   r   r
   r  r  r   rC   rC   )r   rD   rV    s   
rV  c                   s   e Zd ZdZej Zeej	ej	ej
d eeeeef d fddZeeej dddZeeeef ed	d
dZ  ZS )
PyPropertyzDescription of an attribute.)rL  rM  r   )r   r   rK   c                s\   t  ||\}}| jd}|rTt|| j}|tj|dtddt	 f| 7 }||fS )Nr   r\   r   )
r   r  r  rc   r   r[   r   r
  r   r   )r   r   r   r   r  rG  rH  )r   rC   rD   r    s    


zPyProperty.handle_signature)r   rK   c             C   sv   g }d| j kr,|td |t  d| j krT|td |t  |td |t  |S )NrL  rP  rM  rS   rN  )r  r   r   rf   r   r   )r   r   r  rC   rC   rD   r     s    

zPyProperty.get_signature_prefix)r  r  rK   c             C   sv   |\}}y0| dd\}}|r6| jjjr6d||g}W n, tk
rd   |r\td||f S |S Y nX td||f S )NrL   rM   z%s (in module %s)z%s (%s property))rQ  r[   rd   r  r2  r  r   )r   r  r  r   r=  rR  rW  rC   rC   rD   r    s    
zPyProperty.get_index_text)r=   r>   r?   r6  r   r   r?  r@  r   r7  r8  r@   r   r
   r  r   r   r   r   r  r   rC   rC   )r   rD   rX    s   
rX  c               @   sj   e Zd ZU dZdZdZdZdZdd dd ej	ej	ej	d	Z
eed
< ee dddZeedddZdS )PyModulez8
    Directive to mark description of a new module.
    TrM   r   Fc             C   s   | S )NrC   )xrC   rC   rD   <lambda>      zPyModule.<lambda>c             C   s   | S )NrC   )rZ  rC   rC   rD   r[    r\  )rG   rF   r   r   rH   r   )rK   c       
   	   C   sF  t t| jd}| jd  }d| jk}|| jjd< t	 }t
| j| j  | jj|_t| j| j| W d Q R X g }|s6t| j| jjd|}tjdd|gdd}| | | jj| |||| jd	d| jd
dd| jk |j|d||d || dtd |f }tjd||dd fgd}	||	 ||j |S )Nr`   r   r   z	py:moduler1   r\   T)r  ZismodrF   rG   rH   )r   z%s; %sr;  )r  )r   r!  r[   r"  	argumentsr   r  rb   r   sectionr)   r  contentr  r.   r,   rZ   Zset_source_infor   note_modulerc   r#  r   r<  r   indexr   r   )
r   r   r  r   Zcontent_noderE  r:   rZ   r&  inoderC   rC   rD   rB    s4    




zPyModule.run)r   rK   c             C   s   d| S )zGenerate old styled node_id.

        Old styled node_id is incompatible with docutils' node_id.
        It can contain dots and hyphens.

        .. note:: Old styled node_id was mainly used until Sphinx-3.0.
        z	module-%srC   )r   r   rC   rC   rD   make_old_id  s    zPyModule.make_old_idN)r=   r>   r?   r6  has_contentrequired_argumentsoptional_argumentsfinal_argument_whitespacer   r7  r   r/   rA   r   r   rB  r@   rc  rC   rC   rC   rD   rY    s   
%rY  c               @   s@   e Zd ZU dZdZdZdZdZi Ze	e
d< ee dddZd	S )
PyCurrentModulez
    This directive is just to tell Sphinx that we're documenting
    stuff in module foo, but links to module foo won't lead here.
    FrM   r   r   )rK   c             C   s8   | j d  }|dkr(| jjdd  n|| jjd< g S )Nr   rQ   z	py:module)r]  r   r[   rb   r   )r   r  rC   rC   rD   rB  4  s
    zPyCurrentModule.runN)r=   r>   r?   r6  rd  re  rf  rg  r   r/   rA   r   r   rB  rC   rC   rC   rD   rh  (  s   
rh  c               @   s,   e Zd Zeeeeeeeef dddZdS )
PyXRefRole)r[   refnodehas_explicit_titlerW   rZ   rK   c             C   s   |j d|d< |j d|d< |sv|d}|d}|dd dkrv|dd  }|d}|dkrv||d d  }|dd dkr|dd  }d|d	< ||fS )
Nz	py:modulezpy:classrL   rN   r   rM   rO   TrV   )rb   rc   r  rfind)r   r[   rj  rk  rW   rZ   dotrC   rC   rD   process_link>  s    


zPyXRefRole.process_linkN)	r=   r>   r?   r   r   rB   r@   r
   rn  rC   rC   rC   rD   ri  =  s   ri  )r0  r   r;   r_  rK   c             C   s   |dkrdS xn|D ]f}t |tjrtttj |}xDt|D ]8}ttj|d  	 }|dksj|
dr<|| q<W qW dS )z+Filter ``:meta:`` field from its docstring.r`   Nr   metazmeta )r{   r   
field_listr   r   fieldreversedZ
field_bodyr   r   rT   remove)r0  r   r;   r_  rl   fieldsrq  
field_namerC   rC   rD   filter_meta_fieldsT  s    
rv  c               @   sR   e Zd ZdZdZedZedZd	ee	 e
ee
e	ee f  ef dddZdS )
PythonModuleIndexz<
    Index subclass to provide the Python module index.
    ZmodindexzPython Module Indexr*  N)docnamesrK   c             C   s  i }| j jjd }t|tdd}t| j jd  dd d}d}d	}xP|D ]F\}\}}	}
}}|rn||krnqLx0|D ]$}||rt|t|d  }|}P qtW d}|s|d }}||d	 	 g }|
d
d	 }||krT||kr$|rN|d }t|d	 d|d |d |d |d |d |d< n*||sN|t|| dddddd d}n|d7 }d	}|rntdnd}|t|| |||	|||
 |}qLW t|| |k }t| }||fS )NZmodindex_common_prefixT)keyreverser*  c             S   s   | d   S )Nr   )lower)rZ  rC   rC   rD   r[  t  r\  z,PythonModuleIndex.generate.<locals>.<lambda>)ry  r\   r   rL   rO   rM      ry            Z
Deprecated)r   r[   rd   sortedr   dataitemsrT   r)  r{  rU   r   r   r   )r   rx  r_  Zignoresr*  Zprev_modnameZnum_toplevelsr  r9   r:   rF   	platformsrH   ignorestrippedr  packagelastsubtypeZ	qualifierZcollapseZsorted_contentrC   rC   rD   generatel  sL    




zPythonModuleIndex.generate)N)r=   r>   r?   r6  r   r   	localnamerh   r   r@   r
   r   r   rB   r  rC   rC   rC   rD   rw  c  s   rw  c               @   s  e Zd ZU dZdZdZeedddeedddeeddd	deed
d	ddeedddeedddeedddeedddeeddddeedddd
Ze	e
ef ed< eeeeeeeeeeeeedZe e edde e e edde e d	Zi i dZe	e
e	e
ee f f ed< egZe e	e
e!f dddZ"dBe
e
e
e#ed!d"d#d$Z$e e	e
e%f dd%d&Z&e
e
e
e
e#d!d'd(d)Z'e
d!d*d+d,Z(e)e
 e	d!d-d.d/Z*dCe+e
e
e
e
e,e)ee
e!f  d1d2d3Z-e+e
e.e
e
e/e0e1e0 d4d5d6Z2e+e
e.e
e/e0e)ee
e0f  d7d8d9Z3e.e
e
e4e0d:d;d<Z5e6ee
e
e
e
e
e,f  dd=d>Z7e0e1e
 d?d@dAZ8d!S )Dr!  zPython language domain.r`   Pythonr-  funcrR   r  rS   r   r5   r.  methzclass methodzstatic method	attributer~   rN  _propr1   mod)
r-  r  rS   r5   r.  rM  rO  r  rN  r1   object_types)r-  r  rS   r5   r.  rM  rO  r  rN  r1   Zcurrentmodule	decoratorZdecoratormethodT)Z
fix_parens)	r  r   r  rS   constr~   r  r  rR   )objectsr*  initial_data)rK   c             C   s   | j di S )Nr  )r  r)  )r   rC   rC   rD   r    s    zPythonDomain.objectsFN)r   r;   r:   r<   r   rK   c             C   sj   || j krN| j | }|jr$|dkr$n*|jdkr6|r6dS tjtd||j|d t| jj|||| j |< dS )zQNote a python object for cross reference.

        .. versionadded:: 2.1
        FNzWduplicate object description of %s, other instance in %s, use :noindex: for one of them)r   )r  r<   r  r  r    r9   r8   r[   )r   r   r;   r:   r<   r   otherrC   rC   rD   r#    s    


zPythonDomain.note_objectc             C   s   | j di S )Nr*  )r  r)  )r   rC   rC   rD   r*    s    zPythonDomain.modules)r   r:   rF   rG   rH   rK   c             C   s   t | jj||||| j|< dS )zQNote a python module for cross reference.

        .. versionadded:: 2.1
        N)rE   r[   r9   r*  )r   r   r:   rF   rG   rH   rC   rC   rD   r`    s    
zPythonDomain.note_module)r9   rK   c             C   s`   x,t | j D ]\}}|j|kr| j|= qW x,t | j D ]\}}|j|kr>| j|= q>W d S )N)listr  r  r9   r*  )r   r9   r   rR   r  r  rC   rC   rD   	clear_doc  s    

zPythonDomain.clear_doc)rx  	otherdatarK   c             C   s`   x,|d   D ]\}}|j|kr|| j|< qW x,|d   D ]\}}|j|kr<|| j|< q<W d S )Nr  r*  )r  r9   r  r*  )r   rx  r  r   rR   r  r  rC   rC   rD   merge_domaindata  s    

zPythonDomain.merge_domaindatar   )r[   r  r  r   r   
searchmoderK   c       
         s  |dd dkr|dd }|s$g S g }d}|dkr|dkrJt j n
|  dk	r|r|r|d | d | }	|	jkrj|	 j kr|	}|s|r|d | jkrڈj|d |  j kr|d | }n@|jkrj| j kr|}n d|  fddjD }n|jkr.|}n|dkr<g S |rd|d | jkrd|d | }nd|r|d | jkr|d | }n<|r|r|d | d | jkr|d | d | }|dk	r||j| f |S )	zFind a Python object for "name", perhaps using the given module
        and/or classname.  Returns a list of (name, object entry) tuples.
        r   Nz()rM   rL   c                s4   g | ],}| rj| j kr|j| fqS rC   )r   r  r;   )rq   Zoname)objtypes
searchnamer   rC   rD   
<listcomp>8  s    
z)PythonDomain.find_obj.<locals>.<listcomp>r  )r  r  Zobjtypes_for_roler  r;   r   )
r   r[   r  r  r   r   r  matchesZnewnamer   rC   )r  r  r   rD   find_obj  sJ    




zPythonDomain.find_obj)r[   fromdocnamebuilderr   rZ   rl   r   rK   c             C   s>  | d}| d}	|dr"dnd}
| |||	|||
}|sZ|dkrZ| |||	|d|
}|sz|dkrz| |||	|d|
}|sd S t|dkrd	d
 |D }t|dkr|}n*tjtd|ddd |D dd|d |d \}}|d dkr| ||||S t	|d}|r|j
}n|g}t|||d |d ||S d S )Nz	py:modulezpy:classrV   rM   r   r~   r  r  c             S   s   g | ]}|d  j s|qS )rM   )r<   )rq   r  rC   rC   rD   r  f  s    z-PythonDomain.resolve_xref.<locals>.<listcomp>z5more than one target found for cross-reference %r: %sz, c             s   s   | ]}|d  V  qdS )r   NrC   )rq   r   rC   rC   rD   rt   k  s    z,PythonDomain.resolve_xref.<locals>.<genexpr>refpython)r   r  r   r|  r1   r]   )rc   hasattrr  r   r  r  r    r2  _make_module_refnoder+   r   r-   )r   r[   r  r  r   rZ   rl   r   r  rR  r  r  Z
canonicalsr   rR   r_  r   rC   rC   rD   resolve_xrefM  s4    



zPythonDomain.resolve_xref)r[   r  r  rZ   rl   r   rK   c             C   s   | d}| d}g }	| ||||d d}
t|
dk}x|
D ]\}}|rR|jrRq>|d dkrz|	d| ||||f q>t|d}|r|j}n|g}|	d| |d  t	|||d	 |d ||f q>W |	S )
Nz	py:modulezpy:classrM   r|  r1   zpy:modr]   zpy:r   )
rc   r  r   r<   r   r  r+   r   Zrole_for_objtyper-   )r   r[   r  r  rZ   rl   r   r  rR  r   r  Zmultiple_matchesr   rR   r_  r   rC   rC   rD   resolve_any_xref|  s(    



zPythonDomain.resolve_any_xref)r  r  r   r   rK   c             C   sb   | j | }|}|jr"|d|j 7 }|jr4|td7 }|jrL|d|j d 7 }t|||j|j||S )Nz: z (deprecated)z (rx   )r*  rF   rH   r   rG   r-   r9   r:   )r   r  r  r   r   r1   rW   rC   rC   rD   r    s    
z!PythonDomain._make_module_refnodec             c   s   x,| j  D ]\}}||d|j|jdfV  qW xX| j D ]J\}}|jdkr:|jrl|||j|j|jdfV  q:|||j|j|jdfV  q:W d S )Nr1   r   rO   rM   )r*  r  r9   r:   r  r;   r<   )r   r  r  ZrefnamerR   rC   rC   rD   get_objects  s    
zPythonDomain.get_objects)rl   rK   c             C   sD   | d}| d}| d}|d kr*d S dtd |||gS d S )Nz	py:modulezpy:classrI   rL   )rc   r2  r   )r   rl   r  rR  rZ   rC   rC   rD   get_full_qualified_name  s    


z$PythonDomain.get_full_qualified_name)FN)r   )9r=   r>   r?   r6  r   r   r   r   r  r   r@   rA   r9  rF  rI  rK  rS  rT  rV  rX  rY  rh  rA  rU  r   ri  Zrolesr  r
   r   rw  indicesrN  r8   r  rB   r#  rE   r*  r`  r  r   r  r   r   r  r   r   r   r	   r  r  r   r  r   r  r  rC   rC   rC   rD   r!    sv   
$
$
6-!"r!  )r0  r[   rl   r   rK   c             C   s   t tddd}|ddkr"dS |ddkrB|d	d
krB|S |ddkr||d	}ttt|drp|S ||r||S dS )z1Do not emit nitpicky warnings for built-in types.)r   rK   c             S   s$   |  dr| ddd } | tjkS )Nztyping.rL   rM   )rT   rU   typing__all__)r   rC   rC   rD   istyping  s    
z"builtin_resolver.<locals>.istypingra   r`   NrX   )rS   rR   rI   rQ   )rS   rR   r   )r@   rB   rc   inspectisclassgetattrbuiltins)r0  r[   rl   r   r  rI   rC   rC   rD   builtin_resolver  s    
r  )r0  rK   c             C   sL   |  d | t | ddd | dt | jdtdd d	d
dddS )Nzsphinx.directivesre   Fr[   zobject-description-transformzmissing-referencei  )priorityr7   ry   T)versionZenv_versionZparallel_read_safeZparallel_write_safe)Zsetup_extensionZ
add_domainr!  Zadd_config_valueconnectrv  r  )r0  rC   rC   rD   setup  s    

r  )F)NF)N)tr6  r  r  r   r   r  r  r   r   r   r   r   r   r   r	   r
   r   r   Zdocutilsr   Zdocutils.nodesr   r   Zdocutils.parsers.rstr   Zdocutils.parsers.rst.statesr   Zsphinxr   Zsphinx.addnodesr   r   r   Zsphinx.applicationr   Zsphinx.buildersr   Zsphinx.deprecationr   Zsphinx.directivesr   Zsphinx.domainsr   r   r   r   Zsphinx.environmentr   Zsphinx.localer   r    Zsphinx.pycode.astr!   r"   r   Zsphinx.rolesr#   Zsphinx.utilr$   Zsphinx.util.docfieldsr%   r&   r'   Zsphinx.util.docutilsr(   r)   Zsphinx.util.inspectr*   Zsphinx.util.nodesr+   r,   r-   r.   Zsphinx.util.typingr/   r0   	getLoggerr=   r  r   VERBOSEr  r<  r8   rE   r@   rB   rY   rj   r   r   r   r   r   r   r   r   r   r9  rA  rF  rI  rK  rS  rT  rU  rV  rX  rY  rh  ri  rv  rw  r!  r  r  rC   rC   rC   rD   <module>   s   0

 s
23>  &%A-3AH  