o
    Rh	.                     @   s  d dl Z d dl m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 ddlmZmZ e
deeef dZe
d	eeef dZd
e	defddZdd Zdee fddZdededefddZ	d4dedededdfddZdedefddZde jd e jd!ed"ed#ed$efd%d&Zde jd e jd!ed"ed#ed'ed$efd(d)Zd*ed+ed,ed e jd-e jdefd.d/Zde jd e jd#ed$eddf
d0d1Zd!ed"ed$efd2d3ZdS )5    N)	Parameter)FunctionType)CallableDictOptionalTupleTypeTypeVarUnionget_type_hints   )get_args	issubtype_WrappedMethod)bound_WrappedMethod2treturnc                 C   s.   t | trdS t| D ]	}t|r dS qdS )a_  Recursively check if `t` or any types contained by `t` is a `TypeVar`.

    Examples where we return `True`: `T`, `Optional[T]`, `Tuple[Optional[T], ...]`, ...
    Examples where we return `False`: `int`, `Optional[str]`, ...

    :param t: Type to evaluate.
    :return: `True` if the input type contains an unbound `TypeVar`, `False` otherwise.
    TF)
isinstancer	   r   _contains_unbound_typevar)r   arg r   U/home/air/sanwanet/backup_V2/venv/lib/python3.10/site-packages/overrides/signature.pyr      s   
r   c                 C   sF   t | rdS |d u rdS t |rdS zt| |W S  ty"   Y dS w )NT)r   r   	TypeError)leftrightr   r   r   
_issubtype"   s   r   c              	   C   s$   zt | W S  ttfy   Y d S w N)r   	NameErrorr   callabler   r   r   _get_type_hints0   s
   
r!   	callable1	callable2c                 C   s>   | j dd }t|dd }|d u rdS |dd }||kS )N.r   
__module__F)r%   splitgetattr)r"   r#   mod1mod2r   r   r   _is_same_module7   s   r*   Fsuper_callablesub_callable	is_staticc           	      C   s   t | } t |}zt| }W n
 ty   Y dS w t| }t|}t|}|j}t|| }|durP|durPt||| t|||||| t	||||||| t
|||| dS )a  Ensure that the signature of `sub_callable` is compatible with the signature of `super_callable`.

    Guarantees that any call to `super_callable` will work on `sub_callable` by checking the following criteria:

    1. The return type of `sub_callable` is a subtype of the return type of `super_callable`.
    2. All parameters of `super_callable` are present in `sub_callable`, unless `sub_callable`
       declares `*args` or `**kwargs`.
    3. All positional parameters of `super_callable` appear in the same order in `sub_callable`.
    4. All parameters of `super_callable` are a subtype of the corresponding parameters of `sub_callable`.
    5. All required parameters of `sub_callable` are present in `super_callable`, unless `super_callable`
       declares `*args` or `**kwargs`.

    :param super_callable: Function to check compatibility with.
    :param sub_callable: Function to check compatibility of.
    :param is_static: True if staticmethod and should check first argument.
    N)_unbound_funcinspect	signature
ValueErrorr!   __qualname__r*    ensure_return_type_compatibility ensure_all_kwargs_defined_in_sub)ensure_all_positional_args_defined_in_subensure_no_extra_args_in_sub)	r+   r,   r-   	super_sigsuper_type_hintssub_sigsub_type_hintsmethod_namesame_main_moduler   r   r   ensure_signature_is_compatibleB   s6   

	r=   r    c                 C   s   t | drt | dr| jS | S )N__self____func__)hasattrr?   r   r   r   r   r.   w   s   r.   r7   r9   r8   r:   check_first_parameterr;   c                 C   sp  t dd |j D }t| j D ]\}\}}	|dkr |s q|	jtjkr'q|	jtjkr.qt	|d|||	s@t
| d| d||jv r|	jtjkrt|j |}
|j| }|	j|jkrz|	jtjkrl|jtjkszt
| d| d|	j d||
kr|	jtjkrt
| d| d	| d||v r||v rt|| || st
d| d
| d|	j d|j d	qd S )Nc                 s       | ]	}|j tjkV  qd S r   kindr   VAR_KEYWORD.0pr   r   r   	<genexpr>       
z3ensure_all_kwargs_defined_in_sub.<locals>.<genexpr>r   T: `z` is not present.
` is not ``z` is not parameter at index `: z must be a supertype of `
` but is `)any
parametersvalues	enumerateitemsrD   r   VAR_POSITIONALPOSITIONAL_ONLYis_param_defined_in_subr   rE   listkeysindexKEYWORD_ONLYPOSITIONAL_OR_KEYWORDr   
annotation)r7   r9   r8   r:   rA   r;   sub_has_var_kwargssuper_indexnamesuper_param	sub_index	sub_paramr   r   r   r4   }   sD   

 r4   is_same_main_modulec                 C   s  dd |j  D }dd | j  D }tdd |D }	tdd |D }
|	s7t|t|k r7t| dd}t|D ]\}}|dkrH|sHq=|| t|krv|jtjkrWq=|jtj	krd|j
tjkrdq=|jtjkrkq=t| d	|j d
|jtjkr d S |||  }|jtjkr|d8 }|jtjkr|	st| d	|j dq=|j|jkr|jtj	kr|jtjks|jtj	kr|
st| d	|j d|j d|j d|j|v s|rt||jd ||jd std| d|j d|j d|j d	q=d S )Nc                 S   "   g | ]}|j tjtjfvr|qS r   rD   r   r[   rE   rG   vr   r   r   
<listcomp>   
    z=ensure_all_positional_args_defined_in_sub.<locals>.<listcomp>c                 S   re   r   rf   rg   r   r   r   ri      rj   c                 s   rB   r   rD   r   rU   rF   r   r   r   rI      rJ   z<ensure_all_positional_args_defined_in_sub.<locals>.<genexpr>c                 s   rB   r   rk   rF   r   r   r   rI      rJ   z: parameter list too shortr   rK   z8` positionally required in subclass but not in supertyper   z` must be presentrL   z
` and is `rM   rN   z$ overriding must be a supertype of `rO   )rQ   rR   rP   lenr   rS   rD   r   rU   rV   defaultemptyr\   r`   r   getr]   )r7   r9   r8   r:   rA   rd   r;   sub_parameter_valuessuper_parameter_valuessub_has_var_argssuper_has_var_argssuper_shiftrZ   rc   ra   r   r   r   r5      sp   	 "r5   r`   rr   r^   ra   c                 C   s^   | |j v p.|jtjko|p.|jtjko|p.|jtjko|p.|jtjko&|o&|p.|jtjko.|S r   )rQ   rD   r   rU   rE   rV   r\   r[   )r`   rr   r^   r9   ra   r   r   r   rW      s   
	rW   c           
      C   s   | j  }tdd |D }tdd |D }t|j  D ]\\}\}}	|	jtjkr;t||kr;t	|| jtjkr;q|| j vrz|	j
tjkrz|	jtjkrz|	jtjkrz|	jtjkrZ|sz|	jtjkrb|sz|	jtjkrj|sz|dksp|rzt| d| dqd S )Nc                 s   rB   r   rk   rF   r   r   r   rI         z.ensure_no_extra_args_in_sub.<locals>.<genexpr>c                 s   rB   r   rC   rF   r   r   r   rI     ru   r   rK   z` is not a valid parameter.)rQ   rR   rP   rS   rT   rD   r   rV   rl   rX   rm   rn   rU   rE   r[   r\   r   )
r7   r9   rA   r;   super_paramssuper_var_argssuper_var_kwargsrb   r`   rc   r   r   r   r6   
  s&   

r6   c                 C   sL   |  dd }| dd }t||s"|d ur$t| d| d| dd S d S )Nr   z: return type `z` is not a `z`.)ro   r   r   )r8   r:   r;   super_return
sub_returnr   r   r   r3   )  s   r3   )F) r/   r   typesr   typingr   r   r   r   r   r	   r
   r   typing_utilsr   r   r   r   boolr   r   r!   r*   r=   r.   	Signaturestrr4   r5   rW   r6   r3   r   r   r   r   <module>   s    (
5
-
K

