o
    NizB                     @  sx  d dl mZ d dlZd dl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mZmZmZ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" er~d dl#m$Z$ d dl%m&Z& d dl'm(Z( d dl)m*Z*m+Z+ e,e-Z.e/dej0Z1G dd dZ2G dd de2eZ3G dd de2eZ4G dd de2e Z5G dd dee6e7e7f  Z8dS )    )annotationsN)TYPE_CHECKINGClassVar)nodes)
directives)addnodes)desc_signaturepending_xrefpending_xref_condition)ObjectDescription)_parse_annotation_parse_arglist_parse_type_list_pseudo_parse_arglistparse_reftarget)_)logging)FieldGroupedField
TypedField)make_id)Node)Inliner)BuildEnvironment)
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
          c                      sN   e Zd Zejddddfd fddZedZejddddfdddZ	  Z
S )PyXrefMixinNrolenamestrdomaintarget	innernodetype[TextlikeNode]contnodeNode | NoneenvBuildEnvironment | NoneinlinerInliner | Nonelocationreturnr   c	              
     s   t  j||||||d d d}	t|	tr~|d usJ d|	d< |jd|	d< |jd|	d< t|\}
}}}||krN|
|	d< ||	d< |	  |	|||7 }	|	S |jj	r~|	j
}|	  |dd	 }|d
|}td
d
|ddtd
d
g|R ddig}|	| |	S )N)r'   r)   Trefspecific	py:modulepy:classreftype	reftarget. resolved)	conditionr4   *)super	make_xref
isinstancer	   ref_contextgetr   clearconfig!python_use_unqualified_type_nameschildrensplitr
   extend)selfr   r   r    r!   r#   r%   r'   r)   resultr.   r/   reftitler   r>   	shortnametextnode	contnodes	__class__ Q/home/ubuntu/.local/lib/python3.10/site-packages/sphinx/domains/python/_object.pyr7   2   s4   


zPyXrefMixin.make_xrefz>(\s*[\[\]\(\),](?:\s*o[rf]\s)?\s*|\s+o[rf]\s+|\s*\|\s*|\.\.\.)
list[Node]c	                 C  s   | j |}	t|o| |k}
d}g }td |	D ]1}|
r"t|}|s*| j |r5||p2||| n|| 	|||||||| |dv rJd}q|S )NF>   typing.Literal~typing.LiteralLiteralT)
_delimiters_rer?   boolastextfilterr   Textmatchappendr7   )rA   r   r   r    r!   r#   r%   r'   r)   sub_targetssplit_contnode
in_literalresults
sub_targetrI   rI   rJ   
make_xrefs_   s    

zPyXrefMixin.make_xrefs)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!   r"   r#   r$   r%   r&   r'   r(   r)   r$   r*   rK   )__name__
__module____qualname__r   emphasisr7   recompilerO   r[   __classcell__rI   rI   rG   rJ   r   1   s     )	r   c                   @     e Zd ZdS )PyFieldNr\   r]   r^   rI   rI   rI   rJ   rd          rd   c                   @  rc   )PyGroupedFieldNre   rI   rI   rI   rJ   rg      rf   rg   c                   @  rc   )PyTypedFieldNre   rI   rI   rI   rJ   rh      rf   rh   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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#Zd@d%d&ZdAd*d+ZdBd.d/ZdCd2d3ZdDd6d7ZdEd8d9ZdEd:d;ZdFd<d=Zd>S )GPyObjectz
    Description of a general Python object.

    :cvar allow_nesting: Class is an object that allows for nested namespaces
    :vartype allow_nesting: bool
    )zno-indexno-index-entryzno-contents-entryzno-typesettingnoindexnoindexentrynocontentsentrysingle-line-parameter-listsingle-line-type-parameter-listmodule	canonical
annotationzClassVar[OptionSpec]option_spec	parameter
Parameters)paramrt   argargumentkeywordkwargkwparamclass)	paramtypetypeT)labelnamestyperolename	typenamescan_collapsevariable	Variables)varivarcvar)vartype
exceptionsRaisesexc)raisesraise	exceptionexcept)r   r   r   r   returnvalueReturnsF)returnsr*   )r   has_argr   
returntypezReturn type)rtype)r   r   r   bodyrolenamesigr   r*   list[nodes.Node]c                 C  s   g S )zTMay return a prefix to put before the object name in the
        signature.
        rI   )rA   r   rI   rI   rJ   get_signature_prefix      zPyObject.get_signature_prefixrP   c                 C  s   dS )zqMay return true if an empty argument list is to be generated even if
        the document contains none.
        FrI   )rA   rI   rI   rJ   needs_arglist   r   zPyObject.needs_arglistsignoder   tuple[str, str]c              
   C  s~  t |}|du rt| \}}}}}| jd| jjd}	| jjd}
|
rZd}|rH||
ks8||
d rH|| }|t	|
d 
d}n$|rS|
d | | }n|
d | }nd}|rh|d}
|| }nd}
|}|	|d< |
|d	< ||d
< | jjjp| jjjpd}t	|}|d}d| jvo||d |d   |  kodkn  }|d}d| jvo||d |d   |  kodkn  }| |}|rt|tu rd| d}t||tjt|dg|R  7 }|r|t||7 }n|	r|r| jjjr|	d }|t||7 }|t||7 }|r?z|t|| j|7 }W n ty> } ztjd|||d W Y d}~nd}~ww |rz|t|| j|7 }W n> ty]   t||| Y n/ t tfy } ztjd|||d t||| W Y d}~nd}~ww | ! r|t" 7 }|rt#|| j}|tj$|dg|R  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
        Nrp   r,   r-   Fr0   Tr2   r|   fullnamer      rn         ro   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): %srr    )(	py_sig_rerT   
ValueErrorgroupsoptionsr:   r%   r9   
startswithlenlstriprstripr<   $python_maximum_signature_line_lengthmaximum_signature_line_lengthspanr   r~   r   	TypeErrorr   desc_annotationdesc_addnameadd_module_names	desc_namer   	Exceptionloggerwarningr   SyntaxErrorr   NotImplementedErrorr   desc_parameterlistr   desc_returnsdesc_sig_spacer   rS   )rA   r   r   mprefixnametp_listarglistretannmodname	classname
add_moduler   max_lensig_lentp_list_spanmulti_line_parameter_listarglist_spanmulti_line_type_parameter_list
sig_prefixmsgnodetextr   r>   annorI   rI   rJ   handle_signature   s   
	




&

&



zPyObject.handle_signaturesig_nodetuple[str, ...]c                 C  sB   d|vrdS | d}|d }|r|g|dR S t|dS )Nr   rI   rp   r0   )r:   r?   tuple)rA   r   r   r   rI   rI   rJ   _object_hierarchy_parts<  s   
z PyObject._object_hierarchy_partsr   r   c                 C  s   d}t |)z2Return the text for the index entry of the object.z!must be implemented in subclasses)r   )rA   r   r   r   rI   rI   rJ   get_index_textG  s   zPyObject.get_index_textname_clsNonec           
      C  s   | j d| jjd}|r|d nd|d  }t| j| jjd|}|d | | jj| | jj	j
}|j|| j||d | j d}|rR|j|| j|d	|d
 d| j vrn| ||}	|	rp| jd d|	|dd f d S d S d S )Nrp   r,   r0   r2   r   idsr   rq   T)aliasedr)   rj   entriessingle)r   r:   r%   r9   r   statedocumentrU   note_explicit_targetdomainspython_domainnote_objectobjtyper   	indexnode)
rA   r   r   r   r   r   node_idr   canonical_name	indextextrI   rI   rJ   add_target_and_indexL  s$   

zPyObject.add_target_and_indexc                 C  s   d}| j r| j d \}}| jr|}n|r|d}|r1|| jjd< | jr1| jjdg }|| d| jv rS| jjdg }|| jjd | jd | jjd< dS 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`.
        Nr1   r0   r-   
py:classesrp   
py:modulesr,   )	r   allow_nestingstripr%   r9   
setdefaultrU   r   r:   )rA   r   r   name_prefixclassesmodulesrI   rI   rJ   before_contenta  s"   


zPyObject.before_contentc                 C  s   | j jdg }| jr$tt |  W d   n1 sw   Y  t|dkr.|d nd| j jd< d| j	v rV| j jdg }|rM| | j jd< dS | j jd dS 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   Nr   r1   r-   rp   r   r,   )
r%   r9   r   r   
contextlibsuppress
IndexErrorpopr   r   )rA   r   r   rI   rI   rJ   after_content  s   



zPyObject.after_contentc                 C  s   | dsdS | jjj}|j d}|jr|dv rd}nd}|d ^ }}|jdkr2| d|| S |jdkr;|| S |jd	krKd
g ||| S dS )N
_toc_partsr2   r   >   methodfunctionz()r   r   hideallr0   )r:   r%   appr<   parentadd_function_parenthesestoc_object_entries_show_parentsjoin)rA   r   r<   r   parensparentsr   rI   rI   rJ   _toc_entry_name  s   




zPyObject._toc_entry_nameN)r   r   r*   r   )r*   rP   )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*   r   )r   r   r*   r   )r\   r]   r^   __doc__r   flag	unchangedrs   __annotations__rh   r   rg   r   rd   doc_field_typesr   r   r   r   r   r   r   r   r   r  rI   rI   rI   rJ   ri      s\   
 





x



!ri   )9
__future__r   r   r`   typingr   r   docutilsr   docutils.parsers.rstr   sphinxr   sphinx.addnodesr   r	   r
   sphinx.directivesr   "sphinx.domains.python._annotationsr   r   r   r   r   sphinx.localer   sphinx.utilr   sphinx.util.docfieldsr   r   r   sphinx.util.nodesr   docutils.nodesr   docutils.parsers.rst.statesr   sphinx.environmentr   sphinx.util.typingr   r   	getLoggerr\   r   ra   VERBOSEr   r   rd   rg   rh   r   r   ri   rI   rI   rI   rJ   <module>   s:    
O 