o
    7f                     @  s  d Z ddlmZ ddlmZ ddl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mZ dd	lmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5 G d
d dZ6dBddZ7dCddZ8e	dDdEddZ9edDdFddZ9dDdFddZ9G dd de-e# Z:dGd d!Z;dHd#d$Z<dId&d'Z=dJd(d)Z>dKd*d+Z?dKd,d-Z@dJd.d/ZAdLd2d3ZBdMd6d7ZCdNd9d:ZDdOd=d>ZEdPd@dAZFdS )Qz3Calculation of the least upper bound types (joins).    )annotations)overloadN)map_instance_to_supertype)CONTRAVARIANT	COVARIANT	INVARIANT)state)SubtypeContextfind_memberis_equivalentis_proper_subtypeis_protocol_implementation
is_subtype)AnyTypeCallableTypeDeletedType
ErasedTypeFunctionLikeInstanceLiteralTypeNoneType
Overloaded
ParametersParamSpecTypePartialType
ProperType	TupleTypeTypeTypeAliasTypeTypedDictType	TypeOfAnyTypeTypeTypeVarLikeTypeTypeVarTupleTypeTypeVarTypeTypeVisitorUnboundTypeUninhabitedType	UnionType
UnpackTypefind_unpack_in_listget_proper_typeget_proper_typessplit_with_prefix_and_suffixc                   @  s*   e Zd ZdddZdd	d
ZdddZdS )InstanceJoinerreturnNonec                 C  s
   g | _ d S N)seen_instances)self r4   B/home/ertert/spirit/venv/lib/python3.10/site-packages/mypy/join.py__init__7      
zInstanceJoiner.__init__tr   sr   c                 C  s  ||f| j v s||f| j v rt|S | j ||f |j|jkreg }|jjr}|jjd us/J |jjd us7J |jj}|jj}|jjj| }t	|t
sMJ |j}t|j||\}}	}
t|j||\}}}|tt|	|f |
 }|tt||f | }n|j}|j}t|||jjjD ]\}}}t|}t|}d }t	|trttj|}nt	|trttj|}nt	|tr|jtkrt||| }t|jdkr||jvr| j   t|  S t||js| j   t|  S nd|jttfv rt ||s| j   t|  S t||| }nDt	|t
r>tt||| }t	|t!r/|jj"dks*J t#|}n"t	|ts7J |$|j% qt ||sKt|j  S t||| }|d usXJ || qt!|j|}n|jj&r|t'||t(dddr|| )||}n| )||}| j   |S )Nr   builtins.tupleT)ignore_type_params)subtype_context)*r2   object_from_instanceappendtypehas_type_var_tuple_typetype_var_tuple_prefixtype_var_tuple_suffixdefn	type_vars
isinstancer#   tuple_fallbackr-   argsr   listzipr+   r   r    from_another_anyr$   variancer   
join_typeslenvaluespopr   upper_boundr   r   r   r   fullnamer)   extenditemsbasesr   r	   join_instances_via_supertype)r3   r8   r9   rG   prefixsuffixtvtfallbacks_prefixs_middles_suffixt_prefixt_middlet_suffixs_argst_argstasatype_var	ta_proper	sa_propernew_typeresultr4   r4   r5   join_instances:   s   







zInstanceJoiner.join_instancesc           	      C  s   |j jD ]}t||rt|||   S q|j jD ]}t||r't|||   S qd }|j jD ]}t||j }| ||}|d u sEt||rG|}q.|d usNJ |j jD ]}t|t	rf| ||}t||rf|}qR|S r1   )
r?   _promoter   rL   rT   r   ri   	is_betterrE   r   )	r3   r8   r9   pbestbasemappedrespromoter4   r4   r5   rU      s.   



z+InstanceJoiner.join_instances_via_supertypeN)r/   r0   )r8   r   r9   r   r/   r   )__name__
__module____qualname__r6   ri   rU   r4   r4   r4   r5   r.   6   s    

\r.   declarationType | Noner9   r   r8   r/   r   c                 C  s2  t | } t |}t |}|j|jf|j|jfkr$tj|}tj|}t|tr+|S t|tr2|S t	||ddr;|S t	||ddrD|S t| t
rQtj||gS t|tr`t|ts`||}}t|trot|tso||}}t||\}}t|t
rt|t
s||}}|t|}| du st|| r|S | S )zReturn a simple least upper bound given the declared type.

    This function should be only used by binder, and should not recurse.
    For all other uses, use `join_types()`.
    T)ignore_promotionsN)r+   can_be_truecan_be_falsemypytypeopstrue_or_falserE   r   r   r   r(   make_simplified_unionr   r'   normalize_callablesacceptTypeJoinVisitorr   )ru   r9   r8   valuer4   r4   r5   join_simple   s6   





r   c                 C  s(   t | |r|S t || r| S tt|S )zQReturn one of types (expanded) if it is a supertype of other, otherwise top type.)r   object_or_any_from_typer+   r9   r8   r4   r4   r5   trivial_join   s
   

r   instance_joinerInstanceJoiner | Nonec                 C     d S r1   r4   r9   r8   r   r4   r4   r5   rL      s   rL   c                 C  r   r1   r4   r   r4   r4   r5   rL         c                 C  s   t j| |rt| |S t| } t|}| j| jf|j|jfkr,t j| } t j|}t| t	r;t|t	s;|| } }t| t
rB| S t| trI|S t| trXt|tsX|| } }t| trgt|tsg|| } }t| |\} }|t| |S )zkReturn the least upper bound of s and t.

    For example, the join of 'int' and 'object' is 'object'.
    )rz   r{   is_recursive_pairr   r+   rx   ry   r|   rE   r(   r   r   r   r'   r~   r   r   r   r4   r4   r5   rL      s&   





c                   @  s  e Zd ZdZdRdSd	d
ZdTddZdUddZdVddZdWddZdXddZ	dYddZ
dZdd Zd[d"d#Zd\d%d&Zd]d(d)Zd^d+d,Zd_d.d/Zd`d1d2Zdad4d5Zdbd7d8Zdcd;d<Zddd=d>Zded@dAZdfdCdDZdgdFdGZdhdIdJZdidLdMZdjdPdQZdS )kr   zpImplementation of the least upper bound algorithm.

    Attributes:
      s: The other (left) type operand.
    Nr9   r   r   r   r/   r0   c                 C  s   || _ || _d S r1   )r9   r   )r3   r9   r   r4   r4   r5   r6   %  s   
zTypeJoinVisitor.__init__r8   r&   c                 C  s
   t tjS r1   )r   r    special_formr3   r8   r4   r4   r5   visit_unbound_type)  r7   z"TypeJoinVisitor.visit_unbound_typer(   c                 C  s"   t | j|r|S tj| j|gS r1   )r   r9   rz   r{   r}   r   r4   r4   r5   visit_union_type,  s   z TypeJoinVisitor.visit_union_typer   c                 C  s   |S r1   r4   r   r4   r4   r5   	visit_any2  r   zTypeJoinVisitor.visit_anyr   c                 C  sH   t jr!t| jttfr|S t| jtrttj	S t
j| j|gS | jS r1   )r   strict_optionalrE   r9   r   r'   r&   r   r    r   rz   r{   r}   r   r4   r4   r5   visit_none_type5  s   
zTypeJoinVisitor.visit_none_typer'   c                 C     | j S r1   r9   r   r4   r4   r5   visit_uninhabited_type@     z&TypeJoinVisitor.visit_uninhabited_typer   c                 C  r   r1   r   r   r4   r4   r5   visit_deleted_typeC  r   z"TypeJoinVisitor.visit_deleted_typer   c                 C  r   r1   r   r   r4   r4   r5   visit_erased_typeF  r   z!TypeJoinVisitor.visit_erased_typer$   c                 C  s,   t | jtr| jj|jkr| jS | | jS r1   )rE   r9   r$   iddefaultr   r4   r4   r5   visit_type_varI  s   zTypeJoinVisitor.visit_type_varr   c                 C     | j |kr|S | | j S r1   r9   r   r   r4   r4   r5   visit_param_specO     
z TypeJoinVisitor.visit_param_specr#   c                 C  r   r1   r   r   r4   r4   r5   visit_type_var_tupleT  r   z$TypeJoinVisitor.visit_type_var_tupler)   c                 C  s   t r1   )NotImplementedErrorr   r4   r4   r5   visit_unpack_typeY  r   z!TypeJoinVisitor.visit_unpack_typer   c                   sv   t | jtr5t|jt| jjkr| | jS ddlm  |j fddt	| jj|jD t
| j|dS | | jS )Nr   
meet_typesc                   s   g | ]	\}} ||qS r4   r4   ).0s_at_ar   r4   r5   
<listcomp>c  s    z4TypeJoinVisitor.visit_parameters.<locals>.<listcomp>)	arg_types	arg_names)rE   r9   r   rM   r   r   	mypy.meetr   copy_modifiedrI   combine_arg_namesr   r4   r   r5   visit_parameters\  s   

z TypeJoinVisitor.visit_parametersr   c                 C  s$  t | jtr?| jd u rt | _| j|| j}d }|jjr&t| j|r&|}n| jjjr4t|| jr4| j}|r;t	||r=|S |S t | jt
r\|jjrUt|}|rUt|| jS t|| jjS t | jtrht|| jS t | jtrtt|| jS t | jtrt|| jS t | jtrt|| jS | | jS r1   )rE   r9   r   r   r.   ri   r?   is_protocolr   rk   r   unpack_callback_protocolrL   rY   r!   r   r   r   r   )r3   r8   nominal
structuralcallr4   r4   r5   visit_instancek  s6   
zTypeJoinVisitor.visit_instancer   c                 C  s   t | jtrJt|| jrJt|| jrt|| jS t|| j}| r'| j	s5| j r2| j j	s5d|_
tdd t|jD rHt|j| jS |S t | jtrVt|| jS t | jtrm| jjjrmt| j}|rmt||S t|j| jS )NTc                 s  s    | ]
}t |ttfV  qd S r1   )rE   r   r'   )r   tpr4   r4   r5   	<genexpr>  s
    
z6TypeJoinVisitor.visit_callable_type.<locals>.<genexpr>)rE   r9   r   is_similar_callablesr   combine_similar_callablesjoin_similar_callablesis_type_objtype_objectis_abstractfrom_type_typeanyr,   r   rL   rY   r   r   r?   r   r   )r3   r8   rh   r   r4   r4   r5   visit_callable_type  s2   


z#TypeJoinVisitor.visit_callable_typer   c                 C  s   g }| j }t|trJ|jD ]%}|jD ]}t||r1t||r'|t|| qt||r1|| qq|rCt	|dkr?|d S t
|S t|j|jS t|tr^|jjr^t|}|r^t||S t|j|S )N   r   )r9   rE   r   rS   r   r   r>   r   r   rM   r   rL   rY   r   r?   r   r   )r3   r8   rh   r9   t_items_itemr   r4   r4   r5   visit_overloaded  s,   







z TypeJoinVisitor.visit_overloadedr   list[Type] | Nonec                   s2  t |j t |j du r7du r7| | kr5g }t| D ]}|t|j| |j|  q"|S dS  durqdurq|j  }t|tsMJ t|j	}|j }t|ts^J t|j	}| | kr	 kr	}	|  d }
g }t
|jd|	 |jd|	 D ]\}}|t|| qt||}t|tr|t| n;t|tr|j	jdkr|t| n(t|tr|j	jdksJ |}n
t|tsJ |j}|t|jt|gd |
rt
|j|
 d |j|
 d D ]\}}|t|| q|S | dks| dkrot|tr#t|ts%dS |j	jdks.J |j	jdks7J t|jd |jd }fddt|jD } fddt|jD }t|| }t||}t|j|gdgS dS  dur}|} }|}ndusJ |}}|}|j| }t|tsJ t|j	}t|tsdS | | d k rdS |}	| |	 d }
tt|j|	|
\}}}g }t
||jd|	 D ]\}}|t|| qtt|}t||jd }|t|j|gd |
rt
||j|
 d D ]\}}|t|| q	|S )	a<  Join two tuple types while handling variadic entries.

        This is surprisingly tricky, and we don't handle some tricky corner cases.
        Most of the trickiness comes from the variadic tuple items like *tuple[X, ...]
        since they can have arbitrary partial overlaps (while *Ts can't be split).
        Nr   r:   )rG   r   c                      g | ]
\}}| kr|qS r4   r4   r   ia)t_unpack_indexr4   r5   r         z/TypeJoinVisitor.join_tuples.<locals>.<listcomp>c                   r   r4   r4   r   )s_unpack_indexr4   r5   r     r   )r*   rS   lengthranger>   rL   rE   r)   r+   r?   rI   r#   r   rQ   rF   r   r=   rG   	enumeratejoin_type_listr-   tuplerH   )r3   r9   r8   rS   r   s_unpack
s_unpackedt_unpack
t_unpacked
prefix_len
suffix_lensitijoinedtuple_instance
mid_joinedt_others_otherother_joinedvariadicunpack_indexfixedunpackunpackedrV   middlerW   fivir4   )r   r   r5   join_tuples  s   





&


*




zTypeJoinVisitor.join_tuplesc                 C  s   t | jtrI| jd u rt | _| jtj| jtj|}t |t	s&J | 
| j|}|d ur6t||S t| j|r>|S t|| jrG| jS |S t| jtj|S r1   )rE   r9   r   r   r.   ri   rz   r{   rF   r   r   r   rL   )r3   r8   rY   rS   r4   r4   r5   visit_tuple_typeH  s    

z TypeJoinVisitor.visit_tuple_typer   c                   s~   t  jtr, fdd jD } j }t| j@  jj@ }t|||S t  jtr9t	 jj
S   jS )Nc                   s8   i | ]\}}}t ||r|jv | jjv kr||qS r4   )r   required_keysr9   )r   	item_names_item_typet_item_typer   r4   r5   
<dictcomp>j  s    z8TypeJoinVisitor.visit_typeddict_type.<locals>.<dictcomp>)rE   r9   r   rI   create_anonymous_fallbacksetkeysr   r   rL   rY   r   )r3   r8   rS   rY   r   r4   r   r5   visit_typeddict_typeh  s   

z$TypeJoinVisitor.visit_typeddict_typer   c                 C  s`   t | jtr)|| jkr|S | jjjjr!|jjjr!tj| j|gS t	| jj|jS t	| j|jS r1   )
rE   r9   r   rY   r?   is_enumrz   r{   r}   rL   r   r4   r4   r5   visit_literal_type|  s   
z"TypeJoinVisitor.visit_literal_typer   c                 C  s   J d)NFzInternal errorr4   r   r4   r4   r5   visit_partial_type  s   z"TypeJoinVisitor.visit_partial_typer!   c                 C  sT   t | jtrtjt|j| jj|jdS t | jtr$| jjj	dkr$| jS | 
| jS )N)linezbuiltins.type)rE   r9   r!   make_normalizedrL   itemr   r   r?   rQ   r   r   r4   r4   r5   visit_type_type  s
   zTypeJoinVisitor.visit_type_typer   c                 C  s   J d| )NFz!This should be never called, got r4   r   r4   r4   r5   visit_type_alias_type  s   z%TypeJoinVisitor.visit_type_alias_typetypr   c                 C  s   t |}t|trt|S t|trttjS t|tr%| 	t
j|S t|tr0| 	|jS t|tr;| 	|jS t|trF| 	|jS t|trQ| 	|jS ttjS r1   )r+   rE   r   r=   r&   r   r    r   r   r   rz   r{   rF   r   rY   r   r$   rP   r   )r3   r   r4   r4   r5   r     s    








zTypeJoinVisitor.defaultr1   )r9   r   r   r   r/   r0   )r8   r&   r/   r   )r8   r(   r/   r   )r8   r   r/   r   )r8   r   r/   r   )r8   r'   r/   r   )r8   r   r/   r   )r8   r   r/   r   )r8   r$   r/   r   )r8   r   r/   r   )r8   r#   r/   r   )r8   r)   r/   r)   )r8   r   r/   r   )r8   r   r/   r   )r8   r   r/   r   )r8   r   r/   r   )r9   r   r8   r   r/   r   )r8   r   r/   r   )r8   r   r/   r   )r8   r   r/   r   )r8   r   r/   r   )r8   r!   r/   r   )r8   r   r/   r   )r   r   r/   r   )rr   rs   rt   __doc__r6   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r4   r4   r4   r5   r     s4    













!

5
k
 




r   boolc                 C  sH   t | } t |}t| tr"t|tsdS t| jjt|jjkr"dS dS )NTF)r+   rE   r   rM   r?   mror8   r9   r4   r4   r5   rk     s   

rk   tuple[ProperType, ProperType]c                 C  s4   t | ttfr|  } t |ttfr| }| |fS r1   )rE   r   r   with_unpacked_kwargsr   r4   r4   r5   r~     s
   r~   r   c                 C  s,   t | jt |jko| j|jko| j|jkS )zcReturn True if t and s have identical numbers of
    arguments, default arguments and varargs.
    )rM   r   min_args
is_var_argr   r4   r4   r5   r     s
   

r   c                 C  t   g }t t| jD ]}|t| j| |j|  q	| jjjdkr%| j}n|j}| j|t	| |t
| j|j|d dS Nzbuiltins.function)r   r   ret_typerY   name)r   rM   r   r>   	safe_meetrY   r?   rQ   r   r   rL   r  r8   r9   r   r   rY   r4   r4   r5   r     s   r   c                 C  sP   t | tst |tst| |S t | tr"t |tr"tt| j|jS tt| S r1   )rE   r)   rL   r?   r   r+   r   r4   r4   r5   	safe_join  s
   
r	  c                 C  s   ddl m} t| tst|ts|| |S t| tr^t|tr^t| j}t|tr.|jj}nt|tr8|j	j}nt|t
rC|jjdksEJ |j}|| j|j}t|trZt
||g}t|S t S )Nr   r   r:   )r   r   rE   r)   r+   r?   r#   rF   r   partial_fallbackr   rQ   r'   )r8   r9   r   r   fallback_typerp   r4   r4   r5   r    s    






r  c                 C  r  r  )r   rM   r   r>   r	  rY   r?   rQ   r   r   rL   r  r  r4   r4   r5   r      s   r   CallableType | Parameterslist[str | None]c                 C  sn   t | j}g }t|D ])}| j| }|j| }||ks)| j|  s)|j|  r/|| q|d q|S )aL  Produces a list of argument names compatible with both callables.

    For example, suppose 't' and 's' have the following signatures:

    - t: (a: int, b: str, X: str) -> None
    - s: (a: int, b: str, Y: str) -> None

    This function would return ["a", "b", None]. This information
    is then used above to compute the join of t and s, which results
    in a signature of (a: int, b: str, str) -> None.

    Note that the third argument's name is omitted and 't' and 's'
    are both valid subtypes of this inferred signature.

    Precondition: is_similar_types(t, s) is true.
    N)rM   r   r   r   	arg_kindsis_namedr>   )r8   r9   num_args	new_namesr   t_names_namer4   r4   r5   r     s   


$r   instancer   c                 C  s   t | jjd g }|S )z;Construct the type 'builtins.object' from an instance type.)r   r?   r   )r  rp   r4   r4   r5   r=   4  s   r=   r   c                 C  s   t | tr	t| S t | tttfrt| jS t | tr t| jS t | t	r*t
| jS t | tr:t | jtr:t
| jS t | trX| jD ]}t |trVt
|}t |trV|  S qBnt | trdt
t| j ttjS r1   )rE   r   r=   r   r   r   rY   r   r
  r!   r   r   r"   rP   r   r(   rS   r)   r+   r?   r   r    implementation_artifact)r   r   	candidater4   r4   r5   r   ;  s*   












r   types
list[Type]c                 C  s2   | st  S | d }| dd  D ]}t||}q|S )Nr   r   )r'   rL   )r  r   r8   r4   r4   r5   r   S  s   r   ProperType | Nonec                 C  s2   | j jsJ | j jdgkrttd| | ddS d S )N__call__T)is_operator)r?   r   protocol_membersr+   r
   )r8   r4   r4   r5   r   ^  s   r   )ru   rv   r9   r   r8   r   r/   r   )r9   r   r8   r   r/   r   r1   )r9   r   r8   r   r   r   r/   r   )r9   r   r8   r   r   r   r/   r   )r8   r   r9   r   r/   r   )r9   r   r8   r   r/   r   )r8   r   r9   r   r/   r   )r8   r   r9   r   r/   r   )r8   r   r9   r   r/   r   )r8   r  r9   r  r/   r  )r  r   r/   r   )r   r   r/   r   )r  r  r/   r   )r8   r   r/   r  )Gr   
__future__r   typingr   mypy.typeopsrz   mypy.maptyper   
mypy.nodesr   r   r   
mypy.stater   mypy.subtypesr	   r
   r   r   r   r   
mypy.typesr   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   rL   r   rk   r~   r   r   r	  r  r   r   r=   r   r   r   r4   r4   r4   r5   <module>   sD     #
|
1
'   











