U
    \Sh                    @  s  d Z ddlm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 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'm(Z(m)Z)m*Z* ddl+m,Z, ddl-m.Z.m/Z/ ddl0m1Z1m2Z2 ddl3m4Z4 ddl5m6Z6 ddl7m8Z8m9Z9m:Z: ddl;m<Z< ddl=m>Z> ddl?m@Z@mAZAmBZBmCZC ddlDmEZEmFZF e6GeHZIeJdejKZLdddddd d!d"ZMG d#d$ d$eZNG d%d& d&eZOd}d(d)d*d+d,d-ZPd~d(d.d)d/d0d1d2ZQd(d.d3d4d5d6ZRG d7d8 d8e2ZSdd(d.d)d9d:d;d<ZTdd(d.d)d=d>d?d@ZUddAd(d)dBdCdDdEZVG dFdG dGZWG dHdI dIeWe8ZXG dJdK dKeWe9ZYG dLdM dMeWe:ZZG dNdO dOe%ee[e[f  Z\G dPdQ dQe\Z]G dRdS dSe]Z^G dTdU dUe\Z_G dVdW dWe\Z`G dXdY dYe\ZaG dZd[ d[eaZbG d\d] d]eaZcG d^d_ d_eaZdG d`da dae\ZeG dbdc dce\ZfG ddde dee<ZgG dfdg dge<ZhG dhdi die4Zidjd(d(dkdBdldmdnZjG dodp dpe(ZkG dqdr dre'ZldjdsdtdkdudvdwdxZmdjdydzd{d|ZndS )zThe Python domain.    )annotationsN)	Parameter)AnyIterableIteratorList
NamedTupleTuplecast)nodes)ElementNode)
directives)Inliner)addnodes)desc_signaturepending_xrefpending_xref_condition)Sphinx)Builder)ObjectDescription)DomainIndex
IndexEntryObjType)BuildEnvironment)___)TokenTokenProcessor)XRefRole)logging)FieldGroupedField
TypedField)SphinxDirective)signature_from_str)find_pending_xref_conditionmake_idmake_refnodenested_parse_with_titles)
OptionSpecTextlikeNodeaM  ^ ([\w.]*\.)?            # class name(s)
          (\w+)  \s*             # thing name
          (?: \[\s*(.*)\s*])?    # optional: type parameters list
          (?: \(\s*(.*)\s*\)     # optional: arguments
           (?:\s* -> \s* (.*))?  #           return annotation
          )? $                   # and nothing more
          modulekeywordoperatorobject	exception	statementzbuilt-in function)r-   r.   r/   r0   r1   r2   builtinc                   @  s.   e Zd ZU ded< ded< ded< ded< dS )ObjectEntrystrdocnamenode_idobjtypeboolaliasedN__name__
__module____qualname____annotations__ r@   r@   H/root/rtd-docs/venv/lib/python3.8/site-packages/sphinx/domains/python.pyr4   B   s   
r4   c                   @  s6   e Zd ZU ded< ded< ded< ded< ded< dS )	ModuleEntryr5   r6   r7   synopsisplatformr9   
deprecatedNr;   r@   r@   r@   rA   rB   I   s
   
rB   Fr5   r9   ztuple[str, str, str, bool])	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~typing.   Noneobjclass)
startswithsplit)rF   rG   refspecifictitlereftyper@   r@   rA   parse_reftargetQ   s"    


rW   BuildEnvironment | Nonezaddnodes.pending_xref)targetenvrG   rH   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.	py:modulepy:class)r[   r\   rI   rL    resolved	condition*py)	refdomainrV   rF   rT   )r]   )
ref_contextgetrW   config!python_use_unqualified_type_namesrS   r   r   Textr   )	rY   rZ   rG   kwargsrV   rU   rT   	shortname	contnodesr@   r@   rA   type_to_xrefl   s(    

  rl   
list[Node])
annotationrZ   rH   c                   s  |j jddd fdddddfdd ztj| d	d
}g }|D ]}t|tjrp||d  qPt|tjr|	 r|rt|d t
jr|d  dkr|  |tt||d	d q|tt|| qP|| qP|W S  tk
r   t| |g Y S X dS )zParse type annotation.zast.ASTrm   noderH   c                   s  t | tjr.t| jd  d| j gS t | tjrh| 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 t | tjr@| jS t | tjrX| jS t | tjrttddgS t | tjrtddg}| jr| jD ]4}|	| |tdd |t  q|  |  |tdd	 |S t | tj r"t!fd
d| j"D g S t | tj#r>t| j$gS t | tj%rt&| jdddkrh | S rt&| jdddkr | S | j}|tdd |	| j' |tdd	 |d dkrt(|dd  ddD ]*\}}t |tjrt)dd|||< q|S t | tj*r<| j
| j+ S t | tj,r| jrg }| jD ]4}|	| |tdd |t  q\|  |  ntddtddg}|S t-d S )Nr   rI   r]   |z...rK   [,]c                 3  s   | ]} |V  qd S Nr@   ).0eunparser@   rA   	<genexpr>   s     z5_parse_annotation.<locals>.unparse.<locals>.<genexpr>id>   UnionOptionalLiteral)r~   typing.LiteralrJ   )start()).
isinstanceast	Attributer   rh   valueattrBinOpleftextendoprightBitOrr   desc_sig_spacedesc_sig_punctuationConstantEllipsisr9   desc_sig_keywordreprintZdesc_sig_literal_numberr5   Zdesc_sig_literal_stringExprr   Invertr   eltsappendpopModulesumbodyNamer{   	Subscriptgetattrslice	enumerateliteralUnaryOpoperandr	   SyntaxError)rp   resultelemiZsubnode_unparse_pep_604_annotationZshort_literalsry   r@   rA   ry      s    "










z"_parse_annotation.<locals>.unparsezast.Subscriptc                   s   | j }t|tjr|j}g }t|tjrr| |jd  |jdd  D ]$}| t  | | qJn| | t	| jdddkr| t  |
td |S )Nr   rJ   r{   r]   r}   rO   )r   r   r   r   r   r	   r   r   r   r   r   r   rh   )rp   Z	subscriptZ	flattenedeltrx   r@   rA   r      s    z6_parse_annotation.<locals>._unparse_pep_604_annotationT)type_commentsr   rL   rK   )rG   N)rf   "python_display_short_literal_typesr   parser   r   r   r   rh   stripr   r   astextr   rl   r5   r   )rn   rZ   treer   rp   r@   r   rA   _parse_annotation   s(    Sr   c                      sd   e Zd Zddd fddZdddd	Zddd
dZdddddZdddddddZ  ZS )_TypeParameterListParserr5   rO   sigrH   c                   s(   | dd }t |g g | _d S )N
r]   )replacer   super__init__type_params)selfr   	signature	__class__r@   rA   r     s    z!_TypeParameterListParser.__init__zlist[Token]rH   c                 C  s   g }|   r|| j dD ]0\}}| jtj|gkr|| tj|g7 } qq| jtjkrl|| tj7 }q| jtjdgtjdgtjdgr|	  qq|S )N))r   r   ){})rr   rt   :=rs   )
fetch_tokenr   currenttokenOPZfetch_untilINDENTDEDENTmatchr   )r   tokensZldelimZrdelimr@   r@   rA   fetch_type_param_spec  s"      z._TypeParameterListParser.fetch_type_param_specc                 C  s(  |   r$| jtjkr | jj }| jrb| jtjdgtjdgrb| jtjdgkrZt	j
}qht	j}nt	j}t	j}t	j}|    | jr| jtjdgtjdgr| jtjdgkr|  }| |}| jtjdgkr|  }| |}|t	jkr
|t	jkr
td|j d||||f}| j| q d S )Nra   **r   r   z6type parameter bound or constraint is not allowed for z parameters)r   r   r   NAMEr   r   previousr   r   r   VAR_POSITIONALVAR_KEYWORDPOSITIONAL_OR_KEYWORDemptyr   _build_identifierr   descriptionr   r   )r   tp_nametp_kindtp_ann
tp_defaultr   
type_paramr@   r@   rA   r   !  s,    
  

z_TypeParameterListParser.parse)r   rH   c              
     sl  ddl m}m fdd  fdd}g }t|}|D ]b}|tjdgtjdgtjd	gs|tjd
gtjdgg}|| j||d  q||j	 q8t
tjdddd}d}|||||gD ]\}}}	| j||d}
||
 |tjd
gtjdgoZ|tjtjtjtjdgtjdgtjdgoX|	tjtjtjtjdgtjdgtjd	g }qd| S )Nr   )chainteec                   s     | \}}t |d  t||S ru   )nextzip)iterableab)r   r@   rA   pairwiseD  s    
z<_TypeParameterListParser._build_identifier.<locals>.pairwisec                 3  s.     | D ]\\}}\}}|||fV  qd S ru   r@   )r   r   Z_zr   c)r   r@   rA   
triplewiseI  s    z>_TypeParameterListParser._build_identifier.<locals>.triplewiser   rr   r   ra   r   )nativer]   )rL   rL   z
<sentinel>Fr   rt   r   )	itertoolsr   r   iterr   r   r   r   _pformat_tokenr   r   	ENDMARKERr   NUMBERSTRINGjoinr   )r   r   r   r   ZidentstokZis_unpack_operatorstopr   afteridentr@   )r   r   rA   r   A  s<     
    	z*_TypeParameterListParser._build_identifierFr   r9   )r   r   rH   c                 C  s  |r
|j S |tjtjrdS |tjdgtjdgtjdgrJ|j  dS |tjdgtjdgtjdgtjd	gtjd
gtjdgtjdgtjdgtjdgtjdgtjdgtjdgtjdgtjdgtjdgtjdgtjdgtjdgtjdgtjdgtjdgr
d|j  dS |j S )Nr]   r   rs   # r   rq   &^<>+-ra   r   @/z//%z<<z>>z>>>z<=z>=z==z!=)r   r   r   NEWLINEr   r   )r   r   r   r@   r@   rA   r   k  s>                    z'_TypeParameterListParser._pformat_token)F)	r<   r=   r>   r   r   r   r   r   __classcell__r@   r@   r   rA   r     s
    *r   z!addnodes.desc_type_parameter_list)tp_listrZ   multi_line_parameter_listrH   c                 C  s  t | }||d< t| }|  |jD ]\}}}}|tjtjhkrNtdt 	 }	|tj
krr|	t dd7 }	n|tjkr|	t dd7 }	|	t d|7 }	|tjk	rVt||}
|
sq(|	t dd7 }	|	t  7 }	t jd|
 }|drN|drN| }|dr$|dr$|	|7 }	n(|	t dd7 }	|	|7 }	|	t dd7 }	n|	|7 }	|tjk	r|	t  7 }	|	t dd	7 }	|	t  7 }	|	tjd|d
gdd7 }	||	7 }q(|S )z5Parse a list of type parameters according to PEP 695.r   zQpositional-only or keyword-only parameters are prohibited in type parameter listsr]   ra   r   r   r   r   r   default_valueFclassesZsupport_smartquotes)r]   r]   )r   Zdesc_type_parameter_listr   r   r   r   POSITIONAL_ONLYKEYWORD_ONLYr   Zdesc_type_parameterr   desc_sig_operatorr   desc_sig_namer   r   r   r   rR   endswithr   r   inline)r   rZ   r   r   parserr   r   r   r   rp   rn   Ztype_ann_exprZtype_ann_textr@   r@   rA   _parse_type_list  sP    






r
  zaddnodes.desc_parameterlist)arglistrZ   r   rH   c           	   
   C  s  t | }||d< td|  }d}|j D ]}|j|jkrb||jkrb|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 }nD|j|jkr|t dd7 }|t d|j7 }n|t d|j7 }|j|jk	r^t|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,|tjkr|t ddt dd7 }|S )z*Parse a list of arguments using AST parserr   z(%s)Nr]   r   ra   r   r   r   r   Fr  )r]   r]   )r   desc_parameterlistr&   
parametersvalueskindr  desc_parameterr  r  r   r   r  namer   rn   r   r   r   r   defaultr   r  r   )	r  rZ   r   paramsr   Z	last_kindparamrp   childrenr@   r@   rA   _parse_arglist  sN    
r  r   rO   )signoder  r   rH   c                 C  s  t  }||d< |g}z`|dD ]<}| }d }}|drx|t   |d  |d 7  < |dd  }q:|d	r|  |dd  }qx|d	r|d
s|d7 }|dd  }q|dr|d7 }|dd  }q|r|d  t 	ddt 
||7  < |rJ|t   |d  |d 7  < |d8 }q|r$|  |d8 }qJq$t|dkrvt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).
    r   rs   r   rr   rL   rJ   Nrt   z[]r]   )r   r  rS   r   rR   r   Zdesc_optionalr   r  r  r  len
IndexError)r  r  r   Z	paramliststackargumentZ	ends_openZ
ends_closer@   r@   rA   _pseudo_parse_arglist  sP    	


  
r  c                      sl   e Zd Zejddddfdddddddddd	 fd	d
Zejddddfdddddddddd	ddZ  ZS )PyXrefMixinNr5   ztype[TextlikeNode]zNode | NonerX   zInliner | Noner   )	rolenamedomainrY   	innernodecontnoderZ   inlinerlocationrH   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$  TrT   r[   r\   rV   rF   rI   rL   r]   r^   r_   r`   ra   )r]   r]   )r   	make_xrefr   r   rd   re   rW   clearrf   rg   r  rS   r   r   )r   r  r   rY   r!  r"  rZ   r#  r$  r   rV   rF   Zreftitler   r  rj   Ztextnoderk   r   r@   rA   r%  8  s6       


zPyXrefMixin.make_xrefrm   c	                 C  s   d}	t |	}
t |	|}t|o*| |k}d}g }td |D ]`}|rRt|}|s`|
|rv|	|pp||| n|	| 
|||||||| |dkr@d}q@|S )Nz>(\s*[\[\]\(\),](?:\s*o[rf]\s)?\s*|\s+o[rf]\s+|\s*\|\s*|\.\.\.)F)r~   r   z~typing.LiteralT)recompilerS   r9   r   filterr   rh   r   r   r%  )r   r  r   rY   r!  r"  rZ   r#  r$  delimsZ	delims_reZsub_targetsZsplit_contnodeZ
in_literalresultsZ
sub_targetr@   r@   rA   
make_xrefs`  s*    

    zPyXrefMixin.make_xrefs)r<   r=   r>   r   Zemphasisr%  r,  r   r@   r@   r   rA   r  7  s   $-r  c                   @  s   e Zd ZdS )PyFieldNr<   r=   r>   r@   r@   r@   rA   r-    s   r-  c                   @  s   e Zd ZdS )PyGroupedFieldNr.  r@   r@   r@   rA   r/    s   r/  c                   @  s   e Zd ZdS )PyTypedFieldNr.  r@   r@   r@   rA   r0    s   r0  c                   @  s@  e Zd ZU dZejejejejejejejejdZd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ddd d!d"Zd#d$d%d&Zdd'd(d)d*d+Zd'd,d-d.d/Zdd(dd0d1d2Zd(dd'd3d4d5d6Zd3d$d7d8Zd3d$d9d:Zd'dd-d;d<Zd=S )>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nocontentsentrysingle-line-parameter-listsingle-line-type-parameter-listr-   	canonicalrn   r+   option_spec	parameterZ
Parameters)r  r9  argr  r.   kwargZkwparamrQ   )Z	paramtypetypeT)labelnamesZtyperolenameZ	typenamescan_collapsevariable	Variables)varZivarZcvar)vartype
exceptionsZRaisesexc)Zraisesraiser1   except)r=  r  r>  r?  ZreturnvalueZReturnsF)ZreturnsrH   )r=  has_argr>  Z
returntypezReturn type)Zrtype)r=  rH  r>  Zbodyrolenamer5   list[nodes.Node]r   c                 C  s   g S )zTMay return a prefix to put before the object name in the
        signature.
        r@   r   r   r@   r@   rA   get_signature_prefix  s    zPyObject.get_signature_prefixr9   r   c                 C  s   dS )zqMay return true if an empty argument list is to be generated even if
        the document contains none.
        Fr@   r   r@   r@   rA   needs_arglist  s    zPyObject.needs_arglistr   tuple[str, str]r   r  rH   c              
   C  s  t |}|dkrt| \}}}}}| jd| jjd}	| jjd}
|
rd}|r||
ksp||
d r|| }|t	|
d 
d}q|r|
d | | }q|
d | }n$d}|r|d}
|| }nd}
|}|	|d< |
|d	< ||d
< | jjjp
| jjjp
d}t	|}|d}d| jkoR||d |d   |  koNdkn  }|d}d| jko||d |d   |  kodkn  }| |}|rt|tkrtd| d|tjt|df| 7 }|r|t||7 }n0|	r$|r$| jjjr$|	d }|t||7 }|t||7 }|rz|t|| j|7 }W n6 tk
r } ztjd|||d W 5 d}~X Y nX |rz|t|| j|7 }W nf tk
r   t||| Y nF t tfk
r
 } z"tjd|||d t||| W 5 d}~X Y nX n| ! r$|t" 7 }|rLt#|| 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
        Nr-   r[   r\   FrI   Tr]   rQ   fullnamer      r5  rJ      r6  z^Python directive method get_signature_prefix() must return a list of nodes. Return value was 'z'.z could not parse tp_list (%r): %sr$  z could not parse arglist (%r): %srn   r   )(	py_sig_rer   
ValueErrorgroupsoptionsre   rZ   rd   rR   r  lstriprstriprf   $python_maximum_signature_line_lengthZmaximum_signature_line_lengthspanrK  r<  r5   	TypeErrorr   desc_annotationdesc_addnameadd_module_namesZ	desc_namer
  	Exceptionloggerwarningr  r   r  NotImplementedErrorrM  r  r   Zdesc_returnsr   r   rh   )r   r   r  mprefixr  r   r  Zretannmodname	classnameZ
add_modulerP  max_lenZsig_lenZtp_list_spanr   Zarglist_spanZmulti_line_type_parameter_listZ
sig_prefixZnodetextrE  r  annor@   r@   rA   handle_signature  s    	



(
(



 
zPyObject.handle_signatureztuple[str, ...])sig_noderH   c                 C  sD   d|krdS | d}|d }|r2|f|dS t|dS d S )NrP  r@   r-   rI   )re   rS   tuple)r   rk  rf  rP  r@   r@   rA   _object_hierarchy_parts:  s    
z PyObject._object_hierarchy_parts)rf  r  rH   c                 C  s   t ddS )z2Return the text for the index entry of the object.z!must be implemented in subclassesN)rc  )r   rf  r  r@   r@   rA   get_index_textE  s    zPyObject.get_index_textrO   name_clsr   r  rH   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 )Nr-   r[   rI   r]   r   idsrb   rS  r7  T)r:   r$  r3  entriessingle)rW  re   rZ   rd   r(   statedocumentr   note_explicit_targetr
   PythonDomain
get_domainnote_objectr8   rn  	indexnode)
r   rp  r   r  rf  rP  r7   r   canonical_name	indextextr@   r@   rA   add_target_and_indexI  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`.
        NrL   rI   r\   
py:classesr-   
py:modulesr[   )	r>  allow_nestingr   rZ   rd   
setdefaultr   rW  re   )r   re  rP  Zname_prefixr  modulesr@   r@   rA   before_content^  s     


zPyObject.before_contentc                 C  s   | j jdg }| jr8z|  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`.
        r~  r   rL   Nr\   r-   r  r[   )rZ   rd   r  r  r   r  r  rW  )r   r  r  r@   r@   rA   after_content  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]   r8   >   methodfunction()r   rP  ZhideallrI   )re   rZ   apprf   parentZadd_function_parenthesesZtoc_object_entries_show_parentsr   )r   rk  rf   r8   Zparensparentsr  r@   r@   rA   _toc_entry_name  s    




zPyObject._toc_entry_nameN)r<   r=   r>   __doc__r   flag	unchangedr8  r?   r0  r   r/  r"   r-  Zdoc_field_typesr  rK  rM  rj  rm  rn  r}  r  r  r  r@   r@   r@   rA   r1    sX   

 
  x!r1  c                      s   e Zd ZU dZej Zded< ede	j
i ddddd	Zd
dddZddddd fddZddddddZ  ZS )
PyFunctionzDescription of a function.r+   r8  asyncr5   rI  r   c                 C  s&   d| j krtddt gS g S d S )Nr  r]   )rW  r   r   r   rJ  r@   r@   rA   rK    s
    

zPyFunction.get_signature_prefixr9   r   c                 C  s   dS NTr@   rL  r@   r@   rA   rM    s    zPyFunction.needs_arglistrN  r   rO   ro  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
| d}| jd d||d	d f d S )Nr3  r-   r[   rq  r   %s() (in module %s)rr  rs  r]   zbuilt-in function; r  pair)	r   r}  rW  re   rZ   rd   r   rz  r   )	r   rp  r   r  rf  r7   r  clstextr   r@   rA   r}    s    
zPyFunction.add_target_and_index
str | Nonerf  rp  rH   c                 C  s   d S ru   r@   r   rf  rp  r@   r@   rA   rn    s    zPyFunction.get_index_text)r<   r=   r>   r  r1  r8  copyr?   updater   r  rK  rM  r}  rn  r   r@   r@   r   rA   r    s   
 r  c                      sJ   e Zd ZdZdd fddZdddd	 fd
dZddddZ  ZS )PyDecoratorFunctionzDescription of a decorator.rm   r   c                   s   d| _ t  S )Nzpy:functionr  r   runrL  r   r@   rA   r    s    zPyDecoratorFunction.runr5   r   rN  rO  c                   s&   t  ||}|dtdd |S Nr   r   r   rj  insertr   r^  r   r   r  retr   r@   rA   rj    s    z$PyDecoratorFunction.handle_signaturer9   c                 C  s   dS NFr@   rL  r@   r@   rA   rM    s    z!PyDecoratorFunction.needs_arglistr<   r=   r>   r  r  rj  rM  r   r@   r@   r   rA   r    s   r  c                      sd   e Zd ZU dZej Zded< ee	j
e	j
d dddd fd	d
ZddddddZ  ZS )
PyVariablezDescription of a variable.r+   r8  r<  r   r5   r   rN  rO  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   rj  rW  re   r   rZ   r   r]  r   r   r   rh   r   r   r  rP  re  typr   r   r   r@   rA   rj    s&    



zPyVariable.handle_signaturer  c                 C  s,   |\}}|rt d||f S t d| S d S )N%s (in module %s)z%s (built-in variable))r   )r   rf  rp  r  r  r@   r@   rA   rn     s    zPyVariable.get_index_textr<   r=   r>   r  r1  r8  r  r?   r  r   r  rj  rn  r   r@   r@   r   rA   r    s   
r  c                   @  sZ   e Zd ZU dZej Zded< ede	j
i dZdddd	d
ZddddddZdS )PyClasslikezO
    Description of a class-like object (classes, interfaces, exceptions).
    r+   r8  finalTr5   rI  r   c                 C  sD   d| j kr,tdt t| jt gS t| jt gS d S )Nr  )rW  r   rh   r   r   r8   rJ  r@   r@   rA   rK    s    

 z PyClasslike.get_signature_prefixrN  r  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 )NrQ   z%s (built-in class)r   z%s (class in %s)r1   r]   )r8   r   r  r@   r@   rA   rn    s    

zPyClasslike.get_index_textN)r<   r=   r>   r  r1  r8  r  r?   r  r   r  r  rK  rn  r@   r@   r@   rA   r    s   
 r  c                   @  st   e Zd ZU dZej Zded< ee	j
e	j
e	j
e	j
e	j
d ddddZd	d
dddZd	dd	dddZdS )PyMethodzDescription of a method.r+   r8  )abstractmethodr  classmethodr  staticmethodr9   r   c                 C  s   dS r  r@   rL  r@   r@   rA   rM  2  s    zPyMethod.needs_arglistr5   rI  r   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r|td |t  |S )Nr  r  abstractr  r  r  ZstaticrW  r   r   rh   r   r   r   r   re  r@   r@   rA   rK  5  s"    




zPyMethod.get_signature_prefixrN  r  c                 C  s   |\}}z0| dd\}}|r6| jjjr6d||g}W n8 tk
rp   |r`td||f  Y S d|  Y S Y nX d| jkrtd||f S d| jkrtd||f S td	||f S d S )
NrI   rJ   r  z%s()r  z%s() (%s class method)r  z%s() (%s static method)z%s() (%s method))rsplitrZ   rf   r_  r   rU  r   rW  )r   rf  rp  r  r  clsnameZmethnamer@   r@   rA   rn  H  s    

zPyMethod.get_index_textN)r<   r=   r>   r  r1  r8  r  r?   r  r   r  rM  rK  rn  r@   r@   r@   rA   r  &  s   
r  c                      s:   e Zd ZU dZej Zded< dd fddZ  Z	S )PyClassMethodzDescription of a classmethod.r+   r8  rm   r   c                   s   d| _ d| jd< t  S )N	py:methodTr  r  rW  r   r  rL  r   r@   rA   r  a  s    
zPyClassMethod.run
r<   r=   r>   r  r1  r8  r  r?   r  r   r@   r@   r   rA   r  \  s   
r  c                      s:   e Zd ZU dZej Zded< dd fddZ  Z	S )PyStaticMethodzDescription of a staticmethod.r+   r8  rm   r   c                   s   d| _ d| jd< t  S )Nr  Tr  r  rL  r   r@   rA   r  m  s    
zPyStaticMethod.runr  r@   r@   r   rA   r  h  s   
r  c                      sJ   e Zd ZdZdd fddZdddd	 fd
dZddddZ  ZS )PyDecoratorMethodz!Description of a decoratormethod.rm   r   c                   s   d| _ t  S )Nr  r  rL  r   r@   rA   r  w  s    zPyDecoratorMethod.runr5   r   rN  rO  c                   s&   t  ||}|dtdd |S r  r  r  r   r@   rA   rj  {  s    z"PyDecoratorMethod.handle_signaturer9   c                 C  s   dS r  r@   rL  r@   r@   rA   rM    s    zPyDecoratorMethod.needs_arglistr  r@   r@   r   rA   r  t  s   r  c                      sd   e Zd ZU dZej Zded< ee	j
e	j
d dddd fd	d
ZddddddZ  ZS )PyAttributeDescription of an attribute.r+   r8  r  r5   r   rN  rO  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 r  r  r  r   r@   rA   rj    s&    



zPyAttribute.handle_signaturer  c                 C  s~   |\}}z0| dd\}}|r6| jjjr6d||g}W n4 tk
rl   |r`td||f  Y S | Y S Y nX td||f S )NrI   rJ   r  z%s (%s attribute)r  rZ   rf   r_  r   rU  r   r   rf  rp  r  r  r  attrnamer@   r@   rA   rn    s    zPyAttribute.get_index_textr  r@   r@   r   rA   r    s   
r  c                      sn   e Zd ZdZej Zeej	ej	ej
d dddd fddZdd	d
ddZddddddZ  ZS )
PyPropertyr  )r  r  r<  r5   r   rN  rO  c                   s\   t  ||\}}| jd}|rTt|| j}|tj|dtddt	 f| 7 }||fS )Nr<  r]   r   )
r   rj  rW  re   r   rZ   r   r]  r   r   )r   r   r  rP  re  r  r   r   r@   rA   rj    s    

zPyProperty.handle_signaturerI  r   c                 C  sv   g }d| j kr,|td |t  d| j krT|td |t  |td |t  |S )Nr  r  r  rQ   propertyr  r  r@   r@   rA   rK    s    

zPyProperty.get_signature_prefixr  c                 C  s~   |\}}z0| dd\}}|r6| jjjr6d||g}W n4 tk
rl   |r`td||f  Y S | Y S Y nX td||f S )NrI   rJ   r  z%s (%s property)r  r  r@   r@   rA   rn    s    zPyProperty.get_index_text)r<   r=   r>   r  r1  r8  r  r  r   r  r  rj  rK  rn  r   r@   r@   r   rA   r    s   
r  c                   @  sV   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
d
ed< ddddZdS )PyModulez8
    Directive to mark description of a new module.
    TrJ   r   Fc                 C  s   | S ru   r@   xr@   r@   rA   <lambda>      zPyModule.<lambda>c                 C  s   | S ru   r@   r  r@   r@   rA   r    r  )rD   rC   r2  r4  rE   r+   r8  rm   r   c           
   	   C  s*  t t| jd}| jd  }d| jk}|| jjd< t	 }| j
j|_t| j
| j|| j g }|st| 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jd||dd fgd}	||	 ||j |S )Nrb   r   r2  r[   r-   r]   T)rq  ZismodrC   rD   rE   rS  zmodule; r  )rr  )r
   rw  rZ   rx  	argumentsr   rW  rd   r   sectionrt  ru  r*   contentZcontent_offsetr(   rY   Zset_source_inforv  note_modulere   ry  r   r   indexr   r  )
r   r   rf  r2  Zcontent_noder  r7   rY   r|  inoder@   r@   rA   r    s4    





zPyModule.runN)r<   r=   r>   r  has_contentrequired_argumentsoptional_argumentsfinal_argument_whitespacer   r  r8  r?   r  r@   r@   r@   rA   r    s   
r  c                   @  s<   e Zd ZU dZdZdZdZdZi Zde	d< d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.
    FrJ   r   r+   r8  rm   r   c                 C  s8   | j d  }|dkr(| jjdd  n|| jjd< g S )Nr   rO   r[   )r  r   rZ   rd   r   )r   rf  r@   r@   rA   r  &  s
    zPyCurrentModule.runN)r<   r=   r>   r  r  r  r  r  r8  r?   r  r@   r@   r@   rA   r    s   
r  c                   @  s$   e Zd ZdddddddddZd	S )

PyXRefRoler   r   r9   r5   rN  )rZ   refnodehas_explicit_titlerU   rY   rH   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 )
Nr[   r\   rI   rK   r   rJ   rL   TrT   )rd   re   rX  rfind)r   rZ   r  r  rU   rY   dotr@   r@   rA   process_link0  s    


zPyXRefRole.process_linkN)r<   r=   r>   r  r@   r@   r@   rA   r  /  s   r  r   r   )r  r   r8   r  rH   c                 C  sx   |dkrdS |D ]b}t |tjrtttj |}t|D ]8}ttj|d  	 }|dksf|
dr8|| q8qdS )z+Filter ``:meta:`` field from its docstring.rb   Nr   metazmeta )r   r   
field_listr
   r   fieldreversedZ
field_bodyr   r   rR   remove)r  r   r8   r  rp   fieldsr  
field_namer@   r@   rA   filter_meta_fieldsF  s    r  c                   @  s6   e Zd ZdZdZedZedZddddd	d
ZdS )PythonModuleIndexz<
    Index subclass to provide the Python module index.
    ZmodindexzPython Module Indexr  NzIterable[str] | Nonez/tuple[list[tuple[str, list[IndexEntry]]], bool])docnamesrH   c                 C  s  i }| j jjd }t|tdd}t| j jd  dd d}d}d	}|D ]D\}\}}	}
}}|rj||krjqH|D ]&}||rn|t|d  }|} qqnd}|s|d }}||d	 	 g }|
d
d	 }||krN||kr|rH|d }t|d	 d|d |d |d |d |d |d< n*||sH|t|| dddddd d}n|d7 }d	}|rhtdnd}|t|| |||	|||
 |}qHt|| |k }t| }||fS )NZmodindex_common_prefixT)keyreverser  c                 S  s   | d   S )Nr   )lowerr  r@   r@   rA   r  f  r  z,PythonModuleIndex.generate.<locals>.<lambda>)r  r]   r   rI   rL   rJ      rQ  rR        Z
Deprecated)r   rZ   rf   sortedr  dataitemsrR   r  r  rS   r   r   r   )r   r  r  Zignoresr  Zprev_modnameZnum_toplevelsrf  r6   r7   rC   	platformsrE   ignorestrippedrr  packagelastsubtypeZ	qualifierZcollapseZsorted_contentr@   r@   rA   generate^  s\    



  
   zPythonModuleIndex.generate)N)	r<   r=   r>   r  r  r   	localnamerj   r  r@   r@   r@   rA   r  U  s
   r  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d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de	d< egZedd d!d"ZdWd%d%d%d&d'd(d)d*d+Zed,d d-d.Zd%d%d%d%d&d(d/d0d1Z d%d(d2d3d4Z!d5d6d(d7d8d9Z"dXd;d%d%d%d<d=d>d?d@dAZ#d;d%dBd%d%dCdDdEdFdGdHZ$d;d%dBd%dCdDdIdJdKdLZ%dBd%d%dMdDdNdOdPZ&dQd dRdSZ'dDd<dTdUdVZ(d$S )Yrw  zPython language domain.rb   Pythonr  funcrP   r  rQ   rE  r1   r  methzclass methodzstatic method	attributer   r  _propr-   mod)
r  r  rQ   r1   r  r  r  r  r  r-   zdict[str, ObjType]object_types)r  r  rQ   r1   r  r  r  r  r  r-   Zcurrentmodule	decoratorZdecoratormethodT)Z
fix_parens)	r  rE  r  rQ   constr   r  r  rP   )objectsr  z dict[str, dict[str, tuple[Any]]]initial_datazdict[str, ObjectEntry]r   c                 C  s   | j di S )Nr   r  r  rL  r@   r@   rA   r     s    zPythonDomain.objectsFNr5   r9   r   rO   )r  r8   r7   r:   r$  rH   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 themrS  )r   r:   ra  rb  r   r6   r4   rZ   )r   r  r8   r7   r:   r$  otherr@   r@   rA   ry    s    


  zPythonDomain.note_objectzdict[str, ModuleEntry]c                 C  s   | j di S )Nr  r  rL  r@   r@   rA   r    s    zPythonDomain.modules)r  r7   rC   rD   rE   rH   c                 C  s   t | jj||||| j|< dS )zQNote a python module for cross reference.

        .. versionadded:: 2.1
        N)rB   rZ   r6   r  )r   r  r7   rC   rD   rE   r@   r@   rA   r    s
    
  zPythonDomain.note_module)r6   rH   c                 C  sX   t | j D ]\}}|j|kr| j|= qt | j D ]\}}|j|kr8| j|= q8d S ru   )listr   r  r6   r  )r   r6   rP  rP   rf  r  r@   r@   rA   	clear_doc  s    


zPythonDomain.clear_docz	list[str]dict[str, Any])r  	otherdatarH   c                 C  sX   |d   D ]\}}|j|kr|| j|< q|d   D ]\}}|j|kr6|| j|< q6d S )Nr   r  )r  r6   r   r  )r   r  r  rP  rP   rf  r  r@   r@   rA   merge_domaindata  s    

zPythonDomain.merge_domaindatar   r   r  r   zlist[tuple[str, ObjectEntry]])rZ   rf  rg  r  r<  
searchmoderH   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  Nr  rJ   rI   c                   s4   g | ],}| rj| j kr|j| fqS r@   )r  r   r8   )rv   ZonameZobjtypesZ
searchnamer   r@   rA   
<listcomp>*  s    
z)PythonDomain.find_obj.<locals>.<listcomp>r  )r  r  Zobjtypes_for_roler   r8   r   )
r   rZ   rf  rg  r  r<  r	  matchesZnewnamerP  r@   r
  rA   find_obj  sN    




zPythonDomain.find_objr   r   r   Element | None)rZ   fromdocnamebuilderr<  rY   rp   r"  rH   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 )Nr[   r\   rT   rJ   r   r   r  r  c                 S  s   g | ]}|d  j s|qS )rJ   )r:   )rv   rd  r@   r@   rA   r  X  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   Nr@   )rv   r   r@   r@   rA   rz   ]  s     z,PythonDomain.resolve_xref.<locals>.<genexpr>refpython)r<  r  r$  r  r-   r^   )re   hasattrr  r  ra  rb  r   r   _make_module_refnoder'   r  r)   )r   rZ   r  r  r<  rY   rp   r"  rf  r  r	  r  Z
canonicalsr  rP   r  r  r@   r@   rA   resolve_xref?  s@    

 
   
zPythonDomain.resolve_xrefzlist[tuple[str, Element]])rZ   r  r  rY   rp   r"  rH   c                 C  s   | d}| d}g }	| ||||d d}
t|
dk}|
D ]\}}|rP|jrPq<|d dkrx|	d| ||||f q<t|d}|r|j}n|g}|	d| |d  t	|||d	 |d ||f q<|	S )
Nr[   r\   rJ   r  r-   zpy:modr^   zpy:r   )
re   r  r  r:   r   r  r'   r  Zrole_for_objtyper)   )r   rZ   r  r  rY   rp   r"  rf  r  r+  r  Zmultiple_matchesr  rP   r  r  r@   r@   rA   resolve_any_xrefn  s4    


 
 zPythonDomain.resolve_any_xrefr   )r  r  r  r"  rH   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 (r   )r  rC   rE   r   rD   r)   r6   r7   )r   r  r  r  r"  r-   rU   r@   r@   rA   r    s    
 z!PythonDomain._make_module_refnodez-Iterator[tuple[str, str, str, str, str, int]]c                 c  s   | j  D ]\}}||d|j|jdfV  q
| j D ]J\}}|jdkr4|jrf|||j|j|jdfV  q4|||j|j|jdfV  q4d S )Nr-   r   rL   rJ   )r  r  r6   r7   r   r8   r:   )r   rf  r  ZrefnamerP   r@   r@   rA   get_objects  s    
zPythonDomain.get_objectsro   c                 C  sD   | d}| d}| d}|d kr*d S dtd |||gS d S )Nr[   r\   rF   rI   )re   r   r)  )r   rp   rf  r  rY   r@   r@   rA   get_full_qualified_name  s    


z$PythonDomain.get_full_qualified_name)FN)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  Zrolesr  r  indicesr  r   ry  r  r  r  r  r  r  r  r  r  r  r@   r@   r@   rA   rw    sx   
   	
 8/#rw  r   r   r  )r  rZ   rp   r"  rH   c                 C  s   dd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.r5   r9   )srH   c                 S  s$   |  dr| ddd } | tjkS )NrM   rI   rJ   )rR   rS   typing__all__)r  r@   r@   rA   istyping  s    
z"builtin_resolver.<locals>.istypingrc   rb   NrV   )rQ   rP   rF   rO   )rQ   rP   rE  )re   inspectisclassr   builtins)r  rZ   rp   r"  r  rF   r@   r@   rA   builtin_resolver  s    
r!  r  )r  rH   c                 C  sp   |  d | t | ddd | jdd dtd hd | ddd | dt | jd	td
d dddddS )Nzsphinx.directivesrg   FrZ   rZ  )typesr   zobject-description-transformzmissing-referencei  )priorityr3   rR  T)versionZenv_versionZparallel_read_safeZparallel_write_safe)Zsetup_extensionZ
add_domainrw  Zadd_config_valuer   connectr  r!  )r  r@   r@   rA   setup  s    


r&  )F)NF)NF)NF)F)or  
__future__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.directivesr   Zsphinx.domainsr   r   r   r   Zsphinx.environmentr   Zsphinx.localer   r   Zsphinx.pycode.parserr   r   Zsphinx.rolesr    Zsphinx.utilr!   Zsphinx.util.docfieldsr"   r#   r$   Zsphinx.util.docutilsr%   Zsphinx.util.inspectr&   Zsphinx.util.nodesr'   r(   r)   r*   Zsphinx.util.typingr+   r,   	getLoggerr<   ra  r(  VERBOSErT  Zpairindextypesr4   rB   rW   rl   r   r   r
  r  r  r  r-  r/  r0  r5   r1  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rw  r!  r&  r@   r@   r@   rA   <module>   s   $
    
  >   6 6L  &%6-36H  