o
    2gA                     @  s  U 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m	Z	m
Z
mZmZmZmZmZ ddlmZ ddlZeeef Zded< edZd	ed
< edZd	ed< dHddZG dd dZG dd deZdZd	ed< dZd	ed< dZ d	ed< dZ!d	ed< dZ"d	ed < d!Z#d	ed"< d#Z$d	ed$< G d%d& d&Z%dId+d,Z&dJd.d/Z'dKd0d1Z(dLd2d3Z)dMd6d7Z*dNd;d<Z+dOd?d@Z,dPdDdEZ-dQdFdGZ.dS )RzParsing/inferring signatures from documentation.

This module provides several functions to generate better stubs using
docstrings and Sphinx docs (.rst files).
    )annotationsN)AnyFinalMutableMappingMutableSequence
NamedTupleSequenceTuple)	TypeAlias
_TypeAliasSigz4^[a-zA-Z_][\w\[\], .\"\']*(\.[a-zA-Z_][\w\[\], ]*)*$r   _TYPE_REz\**[A-Za-z_][A-Za-z0-9_]*$_ARG_NAME_REsstrreturnboolc                 C  s.   | dv rdS d| v rd| vrdS t | duS )zCTry to determine whether a string might be a valid type annotation.)TrueFalseretvalF,[N)r   match)r    r   D/home/garg/my-data/venv/lib/python3.10/site-packages/mypy/stubdoc.pyis_valid_type   s
   r   c                   @  sN   e Zd ZdZ	dddddddZdddZdddZdddZdddZdS ) ArgSigz%Signature info for a single argument.NFz...)defaultdefault_valuenamer   type
str | Noner   r   r   r   Nonec                C  s   || _ || _|| _|| _d S N)r   r    r   r   )selfr   r    r   r   r   r   r   __init__'   s   
zArgSig.__init__c                 C  s   | j do| j d S )N***r   
startswithr$   r   r   r   is_star_arg5   s   zArgSig.is_star_argc                 C  s   | j dS )Nr'   r(   r*   r   r   r   is_star_kwarg8   s   zArgSig.is_star_kwargc                 C  s    d t| jt| jt| jS )Nz$ArgSig(name={}, type={}, default={}))formatreprr   r    r   r*   r   r   r   __repr__;   s   zArgSig.__repr__otherr   c                 C  s>   t |tr| j|jko| j|jko| j|jko| j|jkS dS )NF)
isinstancer   r   r    r   r   )r$   r0   r   r   r   __eq__@   s   



zArgSig.__eq__r#   )
r   r   r    r!   r   r   r   r   r   r"   r   r   )r   r   )r0   r   r   r   )	__name__
__module____qualname____doc__r%   r+   r,   r/   r2   r   r   r   r   r   $   s    


r   c                   @  sX   e Zd ZU ded< ded< ded< dd	d
ZdddZdddZ				ddddZdS )FunctionSigr   r   list[ArgSig]argsr!   ret_typer   r   c                 C  s2   t | jdo| jdo| jo| jd jdv S )N__r   r$   cls)r   r   r)   endswithr:   r*   r   r   r   is_special_methodP   s   
zFunctionSig.is_special_methodc                 C  sb   | j r| j d jdv r| j dd }n| j }t|dko0tdd |D o0|d  o0|d  S )z=Return if this signature has catchall args: (*args, **kwargs)r   r=      N   c                 s  s    | ]}|j d v V  qdS ))Nobjectr   
typing.AnyN)r    ).0ar   r   r   	<genexpr>`       z0FunctionSig.has_catchall_args.<locals>.<genexpr>)r:   r   lenallr+   r,   )r$   r:   r   r   r   has_catchall_argsX   s   

zFunctionSig.has_catchall_argsc                 C  s   |   o| jdv S )zKReturn if this signature is the catchall identity: (*args, **kwargs) -> Any)Nr   rD   )rK   r;   r*   r   r   r   is_catchall_signaturee   s   z!FunctionSig.is_catchall_signature FNindentis_asyncany_val	docstringc                 C  s  g }| j D ]L}|j}|tjv rd| }|jd u r*|d ur*|jdvr*|jds*|}n|j}|rA|d| 7 }|jr@|d|j 7 }n|jrL|d|j 7 }|| qd}	| j	rZ| j	n|}
|
d urdd|
 }	|rhd	nd}d
j
||| jd||	d}|rd| dtj| }nd}| | S )N_r=   r&   z: z = =rM   z -> zasync z({indent}{prefix}def {name}({args}){ret}:, )rN   prefixr   r:   ret
z    z ...)r:   r   keywordkwlistr    r)   r   r   appendr;   r-   joinmypyutilquote_docstring)r$   rN   rO   rP   rQ   r:   argarg_defarg_typeretfieldr;   rU   sigsuffixr   r   r   
format_sigi   s@   




zFunctionSig.format_sigr3   )rM   FNN)
rN   r   rO   r   rP   r!   rQ   r!   r   r   )r4   r5   r6   __annotations__r@   rK   rL   re   r   r   r   r   r8   K   s   
 


r8   rA   
STATE_INITrB   STATE_FUNCTION_NAME   STATE_ARGUMENT_LIST   STATE_ARGUMENT_TYPE   STATE_ARGUMENT_DEFAULT   STATE_RETURN_VALUE   STATE_OPEN_BRACKETc                   @  s8   e Zd ZdZdddZdd
dZdddZdddZdS )DocStringParserz+Parse function signatures in documentation.function_namer   r   r"   c                 C  sB   || _ tg| _d| _d | _d| _d | _d| _d| _g | _	g | _
d S )NrM   r   F)rt   rg   stateaccumulatorra   arg_namearg_defaultr;   foundr:   
signatures)r$   rt   r   r   r   r%      s   
zDocStringParser.__init__tokentokenize.TokenInfoc                 C  s  |j tjkr|j| jkr| jd tkr| jt dS |j tj	kr@|jdkr@| jd tkr@| j
  d| _d| _| jt dS | jd tkrN| j
  dS |j tj	krp|jdv rp| jd tkrp|  j|j7  _| jt dS |j tj	kr|jdv r| jd tkr|  j|j7  _| j
  dS |j tj	kr|jdkr| jd tkr| j| _d| _| jt dS |j tj	kr|jdkr| jd ttfv r| jd tkr| j| _| j
  n| j| _d| _| jt dS |j tj	kr|jd	v r| jd tttfv r| jd tkr| j| _| j
  n9| jd tkr"| j| _| j
  n'| jd tkrI| j| _|jd
kr<| j dksIt| jsI|   dS |jd
krT| j
  | jr| jrrt| jsr| jt| jdt| jd n| jt| j| jt| jd d| _d| _d| _d| _dS |j tj	kr|jdkr| jd tkrd| _| jt dS |j tjtjfv r| jd ttfv r| jd tkrt| js|   dS | j| _d| _| j
  | jr| j t!| j| j| jd d| _g | _d| _dS |  j|j7  _dS )z)Process next token from the token stream.(rM   T)r   r~   {)])}:rS   )r   r   r   N)r   r    r   z->)r   r:   r;   Fr   )"r    tokenizeNAMEstringrt   ru   rg   rZ   rh   OPpoprv   ry   rj   rr   rw   rl   ra   rn   rx   stripr   r   resetr   r:   r   r   rp   NEWLINE	ENDMARKERr;   rz   r8   )r$   r{   r   r   r   	add_token   s   








*

zDocStringParser.add_tokenc                 C  s   t g| _g | _d| _d| _d S )NFrM   )rg   ru   r:   ry   rv   r*   r   r   r   r   8  s   
zDocStringParser.resetlist[FunctionSig]c                   s.   ddddfd	d
 t | j fdddS )z:Return sorted copy of the list of signatures found so far.r   r   	signaturer8   r   r   c                   s   t  fdd|jD S )Nc                 3  s    | ]}|j  kV  qd S r#   r   )rE   xr   r   r   rG   B  rH   zBDocStringParser.get_signatures.<locals>.has_arg.<locals>.<genexpr>)anyr:   )r   r   r   r   r   has_argA  s   z/DocStringParser.get_signatures.<locals>.has_argc                   s    d| o	 d| S )Nz*argsz**kwargsr   )r   )r   r   r   args_kwargsD  s   z3DocStringParser.get_signatures.<locals>.args_kwargsc                   s    | rdS dS )NrA   r   r   )r   )r   r   r   <lambda>H  s    z0DocStringParser.get_signatures.<locals>.<lambda>)keyN)r   r   r   r8   r   r   )r   r8   r   r   )sortedrz   r*   r   )r   r   r   get_signatures>  s   
zDocStringParser.get_signaturesN)rt   r   r   r"   )r{   r|   r   r"   )r   r"   )r   r   )r4   r5   r6   r7   r%   r   r   r   r   r   r   r   rs      s    

 
rs   docstrr!   r   list[FunctionSig] | Nonec              	     s   t | tr| s	dS t|}ttj1 ztt| 	dj
}|D ]}|| q#W n ty<   Y W d   dS w W d   n1 sGw   Y  | }ddd  fd	d
|D S )a=  Convert function signature to list of FunctionSig

    Look for function signatures of function in docstring. Signature is a string of
    the format <function_name>(<signature>) -> <return type> or perhaps without
    the return type.

    Returns empty list, when no signature is found, one signature in typical case,
    multiple signatures, if docstring specifies multiple signatures for overload functions.
    Return None if the docstring is empty.

    Arguments:
        * docstr: docstring
        * name: name of function for which signatures are to be found
    Nzutf-8rc   r8   r   r   c                 S  s   t | jt dd | jD kS )z1return true if function argument names are uniquec                 S  s   h | ]}|j qS r   r   rE   r_   r   r   r   	<setcomp>j  s    zCinfer_sig_from_docstring.<locals>.is_unique_args.<locals>.<setcomp>)rI   r:   )rc   r   r   r   is_unique_argsh  s   z0infer_sig_from_docstring.<locals>.is_unique_argsc                   s   g | ]} |r|qS r   r   )rE   rc   r   r   r   
<listcomp>m  s    z,infer_sig_from_docstring.<locals>.<listcomp>)rc   r8   r   r   )r1   r   rs   
contextlibsuppressr   
TokenErrorioBytesIOencodereadliner   IndentationErrorr   )r   r   ru   tokensr{   sigsr   r   r   infer_sig_from_docstringK  s$   
r   r9   c                 C  s    t d|  d}|r|d jS g S )zXConvert signature in form of "(self: TestClass, arg0: str='ada')" to List[TypedArgList].stubr   )r   r:   )r   rV   r   r   r   !infer_arg_sig_from_anon_docstringp  s   
r   c                 C  s   t | |}|r|d jS dS )zWConvert signature in form of "func(self: TestClass, arg0) -> int" to their return type.r   N)r   r;   )r   r   rV   r   r   r   !infer_ret_type_sig_from_docstringx  s   

r   c                 C  s"   dd |   D }td|dS )zSConvert signature in form of "(self: TestClass, arg0) -> int" to their return type.c                 S  s&   g | ]}|  d rd|   qS )r~   r   )r   r)   )rE   liner   r   r   r     s   & z:infer_ret_type_sig_from_anon_docstring.<locals>.<listcomp>rM   r   )
splitlinesr   r[   )r   linesr   r   r   &infer_ret_type_sig_from_anon_docstring  s   r   rc   'tuple[str, list[str], list[str]] | Nonec           	      C  s   t d| }|s
dS |d}|dd }|d}| s$|g g fS dd |d	D }g }g }d
}|t|k rf|| dsGd|| v rHn||| d |d7 }||d  	dr`n|t|k s:|t|k r|| }|d}|dd
 }|| |d7 }|t|k sl|||fS )zSplit function signature into its name, positional an optional arguments.

    The expected format is "func_name(arg, opt_arg=False)". Return the name of function
    and lists of positional and optional argument names.
    z([.a-zA-Z0-9_]+)\(([^)]*)\)NrA   .r}   rB   c                 S  s   g | ]}|  qS r   )r   r   r   r   r   r     s    z#parse_signature.<locals>.<listcomp>r   r   r   rS   z[])
rer   groupsplitr   rI   r)   rZ   rstripr?   )	rc   mr   
arg_stringr:   
positionaloptionalir_   r   r   r   parse_signature  s8   





r   r   Sequence[str]r   c                 C  s`   g }| |  |D ]}|dr|| q	|| d q	dd| d}|dd}|S )zNBuild function signature from lists of positional and optional argument names.r&   z=...r~   rT   r   z(self)rM   )extendr)   rZ   r[   replace)r   r   r:   r_   rc   r   r   r   build_signature  s   

r   r   tuple[list[Sig], list[Sig]]c           
      C  s   g }g }| D ]>}|  }td|}|rD|dd   }t|}|rD|\}}}	|ddkr:||t||	f q||t||	f qt|t|fS )ztParse all signatures in a given reST document.

    Return lists of found signatures for functions and classes.
    z,\.\. *(function|method|class) *:: *[a-zA-Z_]z::rA   class)	r   r   r   r   r   r   rZ   r   r   )
r   r   
class_sigsr   r   rc   parsedr   fixedr   r   r   r   parse_all_signatures  s   
r   r   Sequence[Sig]	list[Sig]c                 C  sd   i }| D ]\}}| |g | qg }| D ]\}}tt|dkr-|||d f qt|S )z-Remove names with duplicate found signatures.rA   r   )
setdefaultrZ   itemsrI   setr   )r   sig_mapr   rc   result	name_sigsr   r   r   find_unique_signatures  s   r   c                 C  s*   | sdS d}t || }|r|dS dS )ag  Check for Google/Numpy style docstring type annotation for a property.

    The docstring has the format "<type>: <descriptions>".
    In the type string, we allow the following characters:
    * dot: because sometimes classes are annotated using full path
    * brackets: to allow type hints like List[int]
    * comma/space: things like Tuple[int, int]
    Nz^([a-zA-Z0-9_, \.\[\]]*): rA   )r   r   r   )r   test_strr   r   r   r   infer_prop_type_from_docstring  s
   	r   )r   r   r   r   )r   r!   r   r   r   r   )r   r   r   r9   )r   r   r   r   r   r!   )r   r   r   r!   )rc   r   r   r   )r   r   r   r   r   r   )r   r   r   r   )r   r   r   r   )r   r!   r   r!   )/r7   
__future__r   r   r   rX   r   r   typingr   r   r   r   r   r   r	   typing_extensionsr
   r   	mypy.utilr\   r   r   rf   compiler   r   r   r   r8   rg   rh   rj   rl   rn   rp   rr   rs   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sD    $
	'P 
(
%



%

