U
    nufgC                  	   @   s  d Z ddlZddlmZ ddlmZ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 dd	lmZ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  d! Z"dddddddddZ#d! Z$G dd deZ%G dd deZ&G dd deZ'G dd  d eZ(G d!d" d"eZ)G d#d$ d$e'e)Z*G d%d& d&e(e)Z+G d'd( d(eZ,G d)d* d*eZ-G d+d, d,eZ.G d-d. d.eZ/G d/d0 d0eZ0G d1d2 d2eZ1G d3d4 d4eZ2G d5d6 d6eZ3G d7d8 d8e
Z4G d9d: d:eZ5G d;d< d<eZ6G d=d> d>eZ7dS )?z
We need to somehow work with the typing objects. Since the typing objects are
pretty bare we need to add all the Jedi customizations to make them work as
values.

This file deals with all the typing.py cases.
    N)debug)builtin_from_namecreate_simple_object)ValueSet	NO_VALUESValueLazyValueWrapperValueWrapper)LazyKnownValues)repack_with_argument_clinic)FilterWrapper)NameWrapper	ValueName)
ClassMixin)BaseTypingValueBaseTypingClassWithGenericsBaseTypingInstance)TypeVarClass)LazyGenericManagerTupleGenericManagerz$Tuple Generic Protocol Callable Typezbuiltins.listzbuiltins.dictzbuiltins.setzbuiltins.frozensetzcollections.ChainMapzcollections.Counterzcollections.defaultdictzcollections.deque)ListDictSet	FrozenSetChainMapCounterDefaultDictDequez!Optional Union ClassVar Annotatedc                   @   s   e Zd Zdd Zdd ZdS )TypingModuleNamec                 C   s   t |  S N)r   _remapself r#   A/tmp/pip-unpacked-wheel-ol4ehs9f/jedi/inference/gradual/typing.pyinfer'   s    zTypingModuleName.inferc                 c   s  | j }| jj}zt| }W n tk
r.   Y nX t|| j| j|V  d S |tkrjt	|| j| jV  n |t
krt|| j| jV  n |dkrd S |dkr| j \}t||V  n|dkrt|| j| jV  n|dkrt|dV  n|dkrt|| j| jV  n||dkr4| j \}t||V  nV|dkrZ| j \}t||V  n0|d	krzt|| j| jV  n| j E d H  d S )
NZruntimeTypeVarAnyTYPE_CHECKINGTrueoverloadNewTypecast	TypedDict)string_nameparent_contextinference_state_TYPE_ALIAS_TYPESKeyError	TypeAliascreate_cachedZ	tree_name_PROXY_CLASS_TYPESProxyTypingClassValue_PROXY_TYPESProxyTypingValueZ_wrapped_namer%   r   AnyClassr   OverloadFunctionNewTypeFunctionCastFunctionTypedDictClass)r"   namer0   actualclsvZcast_fnr#   r#   r$   r    *   sr         
  
  
  


  zTypingModuleName._remapN)__name__
__module____qualname__r%   r    r#   r#   r#   r$   r   &   s   r   c                   @   s   e Zd ZeZdS )TypingModuleFilterWrapperN)rB   rC   rD   r   Zname_wrapper_classr#   r#   r#   r$   rE   `   s   rE   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ProxyWithGenericsc                 C   s   | j j}|dkr|   S |dkrB|   tt| jdgB S |dkrT| jd S |dkrj| jd  S tt	t
td}|| }t|| j| | j | jdgS )	NUnionOptionalNoneTyper   )ClassVarZ	Annotated)TupleGenericProtocolCallablegenerics_manager)
_tree_namevaluegather_annotation_classesexecute_annotationr   r   r0   _generics_managerrL   rM   rN   rO   r/   )r"   r.   Zmappedr@   r#   r#   r$   rU   e   s.    

z$ProxyWithGenerics.execute_annotationc                 C   s   t | j S r   )r   	from_setsrV   to_tupler!   r#   r#   r$   rT      s    z+ProxyWithGenerics.gather_annotation_classesc                 C   s   t | j| j|S r   )rF   r/   rR   r"   rQ   r#   r#   r$   _create_instance_with_generics   s
    z0ProxyWithGenerics._create_instance_with_genericsc                    sL   |   }|si S |  }|dkrHt| jd |d | fddS i S )NrH   rI   r   c                    s   |  kS r   r#   xnoner#   r$   <lambda>       z3ProxyWithGenerics.infer_type_vars.<locals>.<lambda>)get_generics
py__name__r   r0   infer_type_varsfilter)r"   	value_setannotation_genericsannotation_namer#   r]   r$   rc      s    z!ProxyWithGenerics.infer_type_varsN)rB   rC   rD   rU   rT   rZ   rc   r#   r#   r#   r$   rF   d   s   !rF   c                   @   s    e Zd ZeZdd Zdd ZdS )r8   c                 C   s   | j j| j| j| jt|dS )NrP   )index_classr4   r0   r/   rR   r   )r"   Zgenerics_tupler#   r#   r$   with_generics   s    zProxyTypingValue.with_genericsc                    s   t  fdd|D S )Nc              	   3   s2   | ]*}j jjjjt j|d dV  qdS ))Zcontext_of_indexindex_valuerP   N)rh   r4   r0   r/   rR   r   context).0rj   contextualized_noder"   r#   r$   	<genexpr>   s   	z1ProxyTypingValue.py__getitem__.<locals>.<genexpr>r   r"   Zindex_value_setrn   r#   rm   r$   py__getitem__   s    	zProxyTypingValue.py__getitem__N)rB   rC   rD   rF   rh   ri   rr   r#   r#   r#   r$   r8      s   r8   c                   @   s(   e Zd Zdd Zdd Zedd ZdS )_TypingClassMixinc                 C   s   t | jjdgS )Nobject)r
   r0   builtins_modulepy__getattribute__r!   r#   r#   r$   py__bases__   s    z_TypingClassMixin.py__bases__c                 C   s   g S r   r#   r!   r#   r#   r$   get_metaclasses   s    z!_TypingClassMixin.get_metaclassesc                 C   s   t | | jS r   )r   rR   r!   r#   r#   r$   r>      s    z_TypingClassMixin.nameN)rB   rC   rD   rw   rx   propertyr>   r#   r#   r#   r$   rs      s   rs   c                   @   s   e Zd Zdd Zdd ZdS )TypingClassWithGenericsc                 C   s~   i }|   }|s|S |  }|dkr6|d | S |dkr^t|dkrz|d | S n|dkrz|  \}||S |S )NrJ   r   rO         rL   )ra   rb   rc   rU   len)r"   re   type_var_dictrf   rg   Ztuple_annotationr#   r#   r$   rc      s$    

z'TypingClassWithGenerics.infer_type_varsc                 C   s   t | j| j|S r   )rz   r/   rR   rY   r#   r#   r$   rZ      s
    z6TypingClassWithGenerics._create_instance_with_genericsN)rB   rC   rD   rc   rZ   r#   r#   r#   r$   rz      s   rz   c                   @   s   e Zd ZeZdS )r6   N)rB   rC   rD   rz   rh   r#   r#   r#   r$   r6      s   r6   c                   @   sH   e Zd Zdd Zedd Zdd Zdd Zd	d
 Zdd Z	dd Z
dS )r3   c                 C   s   |j | _ || _|| _|| _d S r   )r0   r/   _origin_tree_name_actual)r"   r/   Zorigin_tree_namer?   r#   r#   r$   __init__   s    zTypeAlias.__init__c                 C   s   t | | jS r   )r   r   r!   r#   r#   r$   r>      s    zTypeAlias.namec                 C   s   | j jS r   )r>   r.   r!   r#   r#   r$   rb      s    zTypeAlias.py__name__c                 C   s   d| j j| jf S )Nz<%s: %s>)	__class__rB   r   r!   r#   r#   r$   __repr__  s    zTypeAlias.__repr__c                 C   sd   | j d\}}ddlm} || j|g| jj \}||}t|dksTt	|t
t|}|S )N.r   )Importerr|   )r   splitZjedi.inference.importsr   r0   ru   followrv   r}   AssertionErrornextiter)r"   module_name
class_namer   moduleclassesr@   r#   r#   r$   _get_wrapped_value  s      

zTypeAlias._get_wrapped_valuec                 C   s   t |  gS r   )r   r   r!   r#   r#   r$   rT     s    z#TypeAlias.gather_annotation_classesc                 C   s   g S r   r#   r!   r#   r#   r$   get_signatures  s    zTypeAlias.get_signaturesN)rB   rC   rD   r   ry   r>   rb   r   r   rT   r   r#   r#   r#   r$   r3      s   
r3   c                   @   s   e Zd Zdd Zdd ZdS )rO   c                 C   sX   z| j d }| j d }W n" tk
r:   td t Y S X ddlm} ||||S dS )zG
            def x() -> Callable[[Callable[..., _T]], _T]: ...
        r   r|   z+Callable[...] defined without two arguments)infer_return_for_callableN)rV   
IndexErrorr   warningr   !jedi.inference.gradual.annotationr   )r"   	argumentsZparam_valuesZresult_valuesr   r#   r#   r$   
py__call__  s    


zCallable.py__call__c                 C   s
   t | gS r   rp   )r"   instanceZclass_valuer#   r#   r$   	py__get__)  s    zCallable.py__get__N)rB   rC   rD   r   r   r#   r#   r#   r$   rO     s   rO   c                   @   sJ   e Zd Zdd Zdd ZdddZdd	 Zd
d Zedd Z	dd Z
dS )rL   c                 C   s
   | j  S r   )rV   Zis_homogenous_tupler!   r#   r#   r$   _is_homogenous.  s    zTuple._is_homogenousc                 C   s@   |   r| jdS t|tr*| j|S td|  tS d S )Nr   z The getitem type on Tuple was %s)r   rV   get_index_and_execute
isinstanceintr   Zdbgr   r"   indexr#   r#   r$   py__simple_getitem__3  s    
zTuple.py__simple_getitem__Nc                 c   s>   |   rt| jdV  n| j D ]}t| V  q&d S Nr   )r   r
   rV   r   rX   rU   )r"   rn   rA   r#   r#   r$   
py__iter__=  s    zTuple.py__iter__c                 C   s(   |   r| jdS t| j  S r   )r   rV   r   r   rW   rX   rU   rq   r#   r#   r$   rr   D  s
    zTuple.py__getitem__c                 C   s   | j jd \}|S Ntuple)r0   ru   rv   rU   )r"   tuple_r#   r#   r$   r   L  s    
zTuple._get_wrapped_valuec                 C   s   | j jS r   )Z_wrapped_valuer>   r!   r#   r#   r$   r>   Q  s    z
Tuple.namec              	   C   s   ddl m}m} |dd }|  r>| j d | S i }|D ]@}z
|j	}W n t
k
rl   Y qFY nX | }|||| j| qF|S d S )Nr   )merge_pairwise_genericsmerge_type_var_dictsc                 S   s   |    dkS r   )rb   lowerr[   r#   r#   r$   r_   Z  r`   z'Tuple.infer_type_vars.<locals>.<lambda>)r   r   r   rd   r   Z_class_valuera   rc   Zmerge_types_of_iterateZget_annotated_class_objectAttributeError)r"   re   r   r   r~   elementmethodZpy_classr#   r#   r$   rc   U  s(    



zTuple.infer_type_vars)N)rB   rC   rD   r   r   r   rr   r   ry   r>   rc   r#   r#   r#   r$   rL   -  s   


rL   c                   @   s   e Zd ZdS )rM   NrB   rC   rD   r#   r#   r#   r$   rM   ~  s   rM   c                   @   s   e Zd ZdS )rN   Nr   r#   r#   r#   r$   rN     s   rN   c                   @   s   e Zd Zdd ZdS )r9   c                 C   s   t d tS )NzUsed Any - returned no results)r   r   r   r!   r#   r#   r$   rU     s    
zAnyClass.execute_annotationN)rB   rC   rD   rU   r#   r#   r#   r$   r9     s   r9   c                   @   s   e Zd Zeddd ZdS )r:   zfunc, /c                 C   s   |S r   r#   )r"   Zfunc_value_setr#   r#   r$   r     s    zOverloadFunction.py__call__NrB   rC   rD   r   r   r#   r#   r#   r$   r:     s   r:   c                   @   s   e Zd Zdd ZdS )r;   c                    sH   |  }t|d t|d\}  d kr,tS t fdd| D S )N)NNc                 3   s&   | ]}t j|j|j  V  qd S r   )r+   r0   rk   noder%   )rl   rn   Z
second_argr"   r#   r$   ro     s   z-NewTypeFunction.py__call__.<locals>.<genexpr>)unpackr   r   r   Zget_calling_nodes)r"   r   Zordered_args_r#   r   r$   r     s    
zNewTypeFunction.py__call__N)rB   rC   rD   r   r#   r#   r#   r$   r;     s   r;   c                       sF   e Zd Z fddZdd Zdd Zedd Zed	d
dZ	  Z
S )r+   c                    s   t  || || _|| _d S r   )superr   _type_value_set	tree_node)r"   r0   r/   r   type_value_setr   r#   r$   r     s    zNewType.__init__c                 C   s   | j  \}|S r   )r   py__class__)r"   cr#   r#   r$   r     s    zNewType.py__class__c                 C   s
   | j  S r   )r   rU   )r"   r   r#   r#   r$   r     s    zNewType.py__call__c                 C   s   ddl m} || dS )Nr   )CompiledValueNamer+   )Zjedi.inference.compiled.valuer   )r"   r   r#   r#   r$   r>     s    zNewType.name)returnc                 C   s   d| j | jf S )Nz<NewType: %s>%s)r   r   r!   r#   r#   r$   r     s    zNewType.__repr__)rB   rC   rD   r   r   r   ry   r>   strr   __classcell__r#   r#   r   r$   r+     s   
r+   c                   @   s   e Zd Zeddd ZdS )r<   ztype, object, /c                 C   s   |  S r   )rU   )r"   r   Zobject_value_setr#   r#   r$   r     s    zCastFunction.py__call__Nr   r#   r#   r#   r$   r<     s   r<   c                   @   s   e Zd ZdZdS )r=   zr
    This class has no responsibilities and is just here to make sure that typed
    dicts can be identified.
    N)rB   rC   rD   __doc__r#   r#   r#   r$   r=     s   r=   c                   @   s<   e Zd ZdZdd Zedd Zdd Zdd	 Zd
d Z	dS )r-   z6Represents the instance version of ``TypedDictClass``.c                 C   s"   |j | _ |j| _|j| _|| _d S r   )r0   r/   r   _definition_class)r"   Zdefinition_classr#   r#   r$   r     s    zTypedDict.__init__c                 C   s   t | | jjS r   )r   r   r>   r!   r#   r#   r$   r>     s    zTypedDict.namec                    s0   t  tr,t fdd| jjddD S tS )Nc                 3   s&   | ]}|  D ]}| V  qqd S r   )getr%   )rl   rd   r>   r   r#   r$   ro     s    z1TypedDict.py__simple_getitem__.<locals>.<genexpr>TZis_instance)r   r   r   rW   r   get_filtersr   r   r#   r   r$   r     s
    
zTypedDict.py__simple_getitem__c                    s6   t jdd  jjddD }t fdd|D S )Nc                 s   s   | ]}|  V  qd S r   )values)rl   fr#   r#   r$   ro     s   z+TypedDict.get_key_values.<locals>.<genexpr>Tr   c                    s   h | ]}t  j|jqS r#   )r   r0   r.   )rl   rA   r!   r#   r$   	<setcomp>  s   z+TypedDict.get_key_values.<locals>.<setcomp>)	itertoolschainfrom_iterabler   r   r   )r"   Zfiltered_valuesr#   r!   r$   get_key_values  s    zTypedDict.get_key_valuesc                 C   s   | j jd\}| \}|S )Ndict)r0   ru   rv   Zexecute_with_values)r"   dresultr#   r#   r$   r     s    
zTypedDict._get_wrapped_valueN)
rB   rC   rD   r   r   ry   r>   r   r   r   r#   r#   r#   r$   r-     s   
	
r-   )8r   r   Zjedir   Zjedi.inference.compiledr   r   Zjedi.inference.base_valuer   r   r   r   r	   Zjedi.inference.lazy_valuer
   Zjedi.inference.argumentsr   Zjedi.inference.filtersr   Zjedi.inference.namesr   r   Zjedi.inference.value.klassr   Zjedi.inference.gradual.baser   r   r   Zjedi.inference.gradual.type_varr   Zjedi.inference.gradual.genericsr   r   r   r5   r1   r7   r   rE   rF   r8   rs   rz   r6   r3   rO   rL   rM   rN   r9   r:   r;   r+   r<   r=   r-   r#   r#   r#   r$   <module>   sT   
:?%&Q