U
    d-                     @   sh  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e	ed
ddZdd Zee dddZeeedddZd+eeeddddZeedddZe je jeeeedddZe je jeeeeedd d!Zeeee je jed"d#d$Ze je jeedd%d&d'Zeeed(d)d*ZdS ),    N)	Parameter)FunctionType)CallableDictOptionalTupleTypeTypeVarUnionget_type_hints   )get_args	issubtype_WrappedMethod)Z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   2lib/python3.8/site-packages/overrides/signature.pyr      s    
r   c                 C   sL   t | rdS |d krdS t |r$dS zt| |W S  tk
rF   Y dS X d S )NT)r   r   	TypeError)leftrightr   r   r   
_issubtype"   s    r   )r   c              	   C   s*   z
t | W S  ttfk
r$   Y d S X d S N)r   	NameErrorr   callabler   r   r   _get_type_hints0   s    
r    )	callable1	callable2r   c                 C   sH   | j dd }z
|j }W n tk
r0   Y dS X |dd }||kS )N.r   F)
__module__splitAttributeError)r!   r"   Zmod1Zmod2r   r   r   _is_same_module7   s    
r'   F)super_callablesub_callable	is_staticr   c           	      C   s   t | } t |}zt| }W n tk
r4   Y dS X t| }t|}t|}|j}t|| }|dk	r|dk	rt||| 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inspectZ	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_nameZsame_main_moduler   r   r   ensure_signature_is_compatibleA   s>    

     	r8   )r   r   c                 C   s   t | drt | dr| jS | S )N__self____func__)hasattrr:   r   r   r   r   r+   v   s    r+   )r3   r5   r4   r6   check_first_parameterr7   c                 C   s|  t dd |j D }t| j D ]N\}\}}	|dkrB|sBq&|	jtjkrPq&|	jtjkr^q&t	|d|||	st
| d| dq&||jkr&|	jtjkr&t|j |}
|j| }|	j|jkr|	jtjkr|jtjkst
| d| d|	j dq&||
kr.|	jtjkr.t
| d| d	| dq&||kr&||kr&t|| || s&t
d| d
| d|	j d|j d	q&d S )Nc                 s   s   | ]}|j tjkV  qd S r   kindr   VAR_KEYWORD.0pr   r   r   	<genexpr>   s    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itemsr>   r   VAR_POSITIONALPOSITIONAL_ONLYis_param_defined_in_subr   r?   listkeysindexKEYWORD_ONLYPOSITIONAL_OR_KEYWORDr   
annotation)r3   r5   r4   r6   r<   r7   sub_has_var_kwargsZsuper_indexnamesuper_param	sub_index	sub_paramr   r   r   r0   |   sP        


 r0   )r3   r5   r4   r6   r<   is_same_main_moduler7   c                 C   s  dd |j  D }dd | j  D }tdd |D }	tdd |D }
|	snt|t|k rnt| dd}t|D ]\}}|dkr|sqz|| t|kr|jtjkrqz|jtj	kr|j
tjkrqz|jtjkrqzt| d	|j d
|jtjkr d S |||  }|jtjkr$|d8 }|jtjkrN|	szt| d	|j dqz|j|jkr|jtj	krx|jtjks|jtj	kr|
st| d	|j d|j d|j dqz|j|ks|rzt||jd ||jd sztd| d|j d|j d|j d	qzd S )Nc                 S   s"   g | ]}|j tjtjfkr|qS r   r>   r   rT   r?   rA   vr   r   r   
<listcomp>   s   z=ensure_all_positional_args_defined_in_sub.<locals>.<listcomp>c                 S   s"   g | ]}|j tjtjfkr|qS r   r]   r^   r   r   r   r`      s   c                 s   s   | ]}|j tjkV  qd S r   r>   r   rN   r@   r   r   r   rC      s    z<ensure_all_positional_args_defined_in_sub.<locals>.<genexpr>c                 s   s   | ]}|j tjkV  qd S r   ra   r@   r   r   r   rC      s    z: parameter list too shortr   rD   z8` positionally required in subclass but not in supertyper   z` must be presentrE   z
` and is `rF   rG   z$ overriding must be a supertype of `rH   )rJ   rK   rI   lenr   rL   r>   r   rN   rO   defaultemptyrU   rX   r   getrV   )r3   r5   r4   r6   r<   r\   r7   Zsub_parameter_valuesZsuper_parameter_valuessub_has_var_argsZsuper_has_var_argsZsuper_shiftrS   r[   rY   r   r   r   r1      s    	





 "r1   )rX   rf   rW   r5   rY   r   c                 C   s^   | |j kp\|jtjkr|p\|jtjkr*|p\|jtjkr:|p\|jtjkrN|rN|p\|jtjko\|S r   )rJ   r>   r   rN   r?   rO   rU   rT   )rX   rf   rW   r5   rY   r   r   r   rP      s    
	rP   )r3   r5   r<   r7   r   c           
      C   s   | j  }tdd |D }tdd |D }t|j  D ]\}\}}	|	jtjkrvt||krvt	|| jtjkrvq<|| j kr<|	j
tjkr<|	jtjkr<|	jtjkr<|	jtjkr|s<|	jtjkr|s<|	jtjkr|s<|dks|r<t| d| dq<d S )Nc                 s   s   | ]}|j tjkV  qd S r   ra   r@   r   r   r   rC     s     z.ensure_no_extra_args_in_sub.<locals>.<genexpr>c                 s   s   | ]}|j tjkV  qd S r   r=   r@   r   r   r   rC     s     r   rD   z` is not a valid parameter.)rJ   rK   rI   rL   rM   r>   r   rO   rb   rQ   rc   rd   rN   r?   rT   rU   r   )
r3   r5   r<   r7   Zsuper_paramsZsuper_var_argsZsuper_var_kwargsrZ   rX   r[   r   r   r   r2   	  sH    










r2   )r4   r6   r7   c                 C   sH   |  dd }| dd }t||sD|d k	rDt| d| d| dd S )Nr   z: return type `z` is not a `z`.)re   r   r   )r4   r6   r7   Zsuper_returnZ
sub_returnr   r   r   r/   (  s    r/   )F) r,   r   typesr   typingr   r   r   r   r   r	   r
   r   Ztyping_utilsr   r   r   r   boolr   r   r    r'   r8   r+   Z	Signaturestrr0   r1   rP   r2   r/   r   r   r   r   <module>   sd   ( 5.L   