U
    nuf	[                     @   s  d Z ddlmZ ddlmZ ddlmZmZmZ ddlm	Z	m
Z
mZmZ ddlmZm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mZmZ dd
lmZ ddlm Z  ddl!m"Z" G dd dZ#G dd dee#Z$G dd de$Z%dd Z&G dd dZ'G dd dZ(G dd de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*e$Z-G d#d$ d$Z.G d%d& d&e'e)e.Z/G d'd( d(e)Z0G d)d* d*e(e0e.Z1G d+d, d,e)Z2G d-d. d.e2Z3G d/d0 d0e2Z4G d1d2 d2e(e)e.Z5G d3d4 d4e)Z6d5d6 Z7G d7d8 d8eZ8d9S ):zd
Contains all classes and functions to deal with lists, dicts, generators and
iterators in general.
    )compiled)analysis)LazyKnownValueLazyKnownValuesLazyTreeValue)get_int_or_none	is_stringreraise_getitem_errorsSimpleGetItemNotFound)safe_propertyto_list)inference_state_method_cache)LazyAttributeOverwritepublish_method)ValueSetValue	NO_VALUESContextualizedNodeiterate_valuessentinelLazyValueWrapper)get_sync_comp_forsCompForContext)check_array_additionsc                   @   s$   e Zd ZdddZdd ZejZdS )IterableMixinNc                 C   s
   |  |S N)
py__iter__selfcontextualized_node r!   A/tmp/pip-unpacked-wheel-ol4ehs9f/jedi/inference/value/iterable.py
py__next__   s    zIterableMixin.py__next__c                 C   s   t t| jdgS NNoner   r   builtin_from_nameinference_stater   r!   r!   r"   py__stop_iteration_returns   s    z(IterableMixin.py__stop_iteration_returns)N)__name__
__module____qualname__r#   r*   r   get_safe_valuer!   r!   r!   r"   r      s   
	r   c                   @   sl   e Zd ZdZdd Zdd Zdd Zedd	d
 Zededdd Z	dd Z
edd Zdd ZdS )GeneratorBaseNc                 C   s   |    \}|S r   )_get_clsexecute_annotation)r   instancer!   r!   r"   _get_wrapped_value)   s    z GeneratorBase._get_wrapped_valuec                 C   s   | j jd\}|S N	Generator)r(   Ztyping_moduleZpy__getattribute__)r   	generatorr!   r!   r"   r0   -   s    zGeneratorBase._get_clsc                 C   s   dS )NTr!   r)   r!   r!   r"   
py__bool__1   s    zGeneratorBase.py__bool____iter__c                 C   s
   t | gS r   )r   r   	argumentsr!   r!   r"   _iter4   s    zGeneratorBase._itersend__next__c                 C   s   t dd |  D S )Nc                 s   s   | ]}|  V  qd S r   infer.0
lazy_valuer!   r!   r"   	<genexpr>;   s     z&GeneratorBase._next.<locals>.<genexpr>r   	from_setsr   r9   r!   r!   r"   _next8   s    zGeneratorBase._nextc                 C   s   t t| jdgS r$   r&   r)   r!   r!   r"   r*   =   s    z(GeneratorBase.py__stop_iteration_returnsc                 C   s   t | dS r4   )r   CompiledValueNamer)   r!   r!   r"   name@   s    zGeneratorBase.namec                 C   s4   ddl m} |   }||ttf}|  |S )Nr   TupleGenericManager)jedi.inference.gradual.genericsrJ   merge_types_of_iteratepy__class__r   r0   Zwith_generics)r   rJ   Z
gen_valuesZgmr!   r!   r"   get_annotated_class_objectD   s    z(GeneratorBase.get_annotated_class_object)r+   r,   r-   
array_typer3   r0   r7   r   r;   rF   r*   propertyrH   rN   r!   r!   r!   r"   r/   &   s   

r/   c                       s:   e Zd ZdZ fddZdddZdd Zd	d
 Z  ZS )r5   zHandling of `yield` functions.c                    s   t  | || _d S r   )super__init___func_execution_context)r   r(   Zfunc_execution_context	__class__r!   r"   rR   M   s    zGenerator.__init__Nc                 C   s"   | j  }|r||S | j  S r   )rS   Zinfer_annotationsiterateZget_yield_lazy_values)r   r    	iteratorsr!   r!   r"   r   Q   s    

zGenerator.py__iter__c                 C   s
   | j  S r   )rS   Zget_return_valuesr)   r!   r!   r"   r*   W   s    z$Generator.py__stop_iteration_returnsc                 C   s   dt | j| jf S Nz
<%s of %s>)typer+   rS   r)   r!   r!   r"   __repr__Z   s    zGenerator.__repr__)N)	r+   r,   r-   __doc__rR   r   r*   rZ   __classcell__r!   r!   rT   r"   r5   K   s
   
r5   c                 C   s   |j d }|j d }|dkrr|j d j d dkrl|j d }|jdkrN|j d }t| |||j d |j d dS t}n|d	krt}n|d
krt}|j d }|jdkr|j d }|| |||j d dS )Nr      {:   comp_for   )sync_comp_for_nodekey_node
value_node([)defining_contextrc   
entry_node)childrenrY   DictComprehensionSetComprehensionGeneratorComprehensionListComprehension)r(   valueatomZbracketZtest_list_compsync_comp_forclsr!   r!   r"   comprehension_from_atom^   s8    







rs   c                   @   sL   e Zd Ze dd ZdddZeg dedd Zdd	d
Zdd Z	dS )ComprehensionMixinc                 C   s
   t ||S r   r   )r   parent_contextra   r!   r!   r"   _get_comp_for_context   s    z(ComprehensionMixin._get_comp_for_contextNc              
   c   s  |d }|j jdk}|jd }|p&| j}||}t||}|j||d}|jd }	t|D ]\}
}| }t	|||	}| 
||}|||j z| |dd  |E d H  W nD tk
r   || j}| jdkr||| jfV  n|V  Y nX W 5 Q R X q\d S )Nr   ra   r`   )is_asyncr]   dict)parentrY   rj   _defining_context
infer_noder   rV   	enumerater?   unpack_tuple_to_dictrv   Zpredefine_names_nested
IndexError_entry_noderO   _value_node)r   	comp_forsru   ra   rw   Z
input_nodeZinput_typesZcnZiteratedexprlistirB   typesdctcontextr!   r!   r"   r~      s.    





zComprehensionMixin._nesteddefaultc                 c   s"   t t| j}| |E d H  d S r   )tupler   _sync_comp_for_noder~   )r   r   r!   r!   r"   _iterate   s    zComprehensionMixin._iteratec                 c   s   |   D ]}t|V  qd S r   r   r   )r   r    set_r!   r!   r"   r      s    zComprehensionMixin.py__iter__c                 C   s   dt | j| jf S rX   )rY   r+   r   r)   r!   r!   r"   rZ      s    zComprehensionMixin.__repr__)N)N)
r+   r,   r-   r   rv   r~   r   r   r   rZ   r!   r!   r!   r"   rt      s   


rt   c                   @   s   e Zd Zdd ZdS )
_DictMixinc                 C   s   t dd |  D S )Nc                 s   s   | ]}|  V  qd S r   )rM   )rA   Zc_setr!   r!   r"   rC      s     z+_DictMixin._get_generics.<locals>.<genexpr>)r   get_mapping_item_valuesr)   r!   r!   r"   _get_generics   s    z_DictMixin._get_genericsN)r+   r,   r-   r   r!   r!   r!   r"   r      s   r   c                   @   sZ   e Zd ZdZedd Zdd Zedddd	 Zd
d Z	dd Z
edd Zdd ZdS )Sequencer2   c                 C   s   t | | jS r   )r   rG   rO   r)   r!   r!   r"   rH      s    zSequence.namec                 C   s   |    fS r   )rL   rM   r)   r!   r!   r"   r      s    zSequence._get_genericsr!   r   c                 C   s   |   S r   )r   r)   r!   r!   r"   _cached_generics   s    zSequence._cached_genericsc                 C   sD   ddl m} ddlm} t| j| j}||||  	 \}|S )Nr   )GenericClassrI   )
Zjedi.inference.gradual.baser   rK   rJ   r   r'   r(   rO   r   r1   )r   r   rJ   klasscr!   r!   r"   r3      s    

zSequence._get_wrapped_valuec                 C   s   d S r   r!   r)   r!   r!   r"   r7      s    zSequence.py__bool__c                 C   s   | j jS r   )r(   Zbuiltins_moduler)   r!   r!   r"   ry      s    zSequence.parentc                 C   s    | j dkr|  S tt| gS )Nrx   )rO   _dict_valuesr   r   )r   Zindex_value_setr    r!   r!   r"   py__getitem__   s    
zSequence.py__getitem__N)r+   r,   r-   Zapi_typerP   rH   r   r   r   r3   r7   r   ry   r   r!   r!   r!   r"   r      s   



r   c                       s   e Zd Z fddZ  ZS )_BaseComprehensionc                    s0   |j dkstt | || _|| _|| _d S Nrq   )rY   AssertionErrorrQ   rR   rz   r   r   )r   r(   rh   rc   ri   rT   r!   r"   rR      s
    z_BaseComprehension.__init__)r+   r,   r-   rR   r\   r!   r!   rT   r"   r      s   r   c                   @   s   e Zd ZdZdd ZdS )rn   listc              	   C   sF   t |trt| gS t|  }ttt || }W 5 Q R X | S r   )	
isinstanceslicer   r   r   r	   r   	TypeErrorr?   )r   indexZ	all_typesrB   r!   r!   r"   py__simple_getitem__   s    

z&ListComprehension.py__simple_getitem__N)r+   r,   r-   rO   r   r!   r!   r!   r"   rn      s   rn   c                   @   s   e Zd ZdZdS )rl   setNr+   r,   r-   rO   r!   r!   r!   r"   rl      s   rl   c                   @   s   e Zd ZdS )rm   N)r+   r,   r-   r!   r!   r!   r"   rm      s   rm   c                   @   s   e Zd Zdd Zdd ZdS )_DictKeyMixinc                 C   s   |   |  fS r   )
_dict_keysr   r)   r!   r!   r"   r      s    z%_DictKeyMixin.get_mapping_item_valuesc                 C   s   |   S r   )r   r)   r!   r!   r"   get_key_values   s    z_DictKeyMixin.get_key_valuesN)r+   r,   r-   r   r   r!   r!   r!   r"   r      s   r   c                       sj   e Zd ZdZ fddZdddZdd Zd	d
 Zdd Ze	ddd Z
e	ddd Zdd Z  ZS )rk   rx   c                    s6   |j dkstt | || _|| _|| _|| _d S r   )rY   r   rQ   rR   rz   r   r   r   )r   r(   rh   rc   rd   re   rT   r!   r"   rR     s    zDictComprehension.__init__Nc                 c   s    |   D ]\}}t|V  qd S r   r   )r   r    keysvaluesr!   r!   r"   r     s    zDictComprehension.py__iter__c                 C   sD   |   D ]0\}}|D ]"}|jt d|kr|    S qqt d S )Nr   )r   r.   objectr
   )r   r   r   r   kr!   r!   r"   r     s
    z&DictComprehension.py__simple_getitem__c                 C   s   t dd |  D S )Nc                 s   s   | ]\}}|V  qd S r   r!   rA   r   r   r!   r!   r"   rC     s     z/DictComprehension._dict_keys.<locals>.<genexpr>r   rE   r   r)   r!   r!   r"   r     s    zDictComprehension._dict_keysc                 C   s   t dd |  D S )Nc                 s   s   | ]\}}|V  qd S r   r!   r   r!   r!   r"   rC      s     z1DictComprehension._dict_values.<locals>.<genexpr>r   r)   r!   r!   r"   r     s    zDictComprehension._dict_valuesr   c                 C   s    t |  }tt| j|ggS r   r   r   r   FakeListr(   r   r:   rB   r!   r!   r"   _imitate_values"  s    z!DictComprehension._imitate_valuesitemsc                    s(    fdd   D }tt j|gS )Nc                    s,   g | ]$\}}t t jt|t|gqS r!   )r   	FakeTupler(   r   )rA   keyro   r)   r!   r"   
<listcomp>)  s   z4DictComprehension._imitate_items.<locals>.<listcomp>)r   r   r   r(   r   r:   Zlazy_valuesr!   r)   r"   _imitate_items'  s    
z DictComprehension._imitate_itemsc                 C   s   g S r   r!   r)   r!   r!   r"   exact_key_items6  s    z!DictComprehension.exact_key_items)N)r+   r,   r-   rO   rR   r   r   r   r   r   r   r   r   r\   r!   r!   rT   r"   rk     s   
	

rk   c                       sb   e Zd ZdZddddZ fddZ fdd	Zd
d ZdddZdd Z	dd Z
dd Z  ZS )SequenceLiteralValue)testlist_star_exprtestlistZsubscriptlistr   r   r   )rf   rg   r^   c                    sD   t  | || _|| _| jj| jkr.d| _ntj|j	d  | _d S )Nr   r   )
rQ   rR   rp   rz   rY   _TUPLE_LIKErO   r   mappingrj   r   r(   rh   rp   rT   r!   r"   rR   B  s    zSequenceLiteralValue.__init__c                    s*   | j dkr tdd |  D S t  S )Nr   c                 s   s   | ]}|   V  qd S r   )r?   rM   )rA   xr!   r!   r"   rC   O  s     z5SequenceLiteralValue._get_generics.<locals>.<genexpr>)rO   r   r   rQ   r   r)   rT   r!   r"   r   M  s    
z"SequenceLiteralValue._get_genericsc              	   C   s^   t |trt| gS tttt |  | }W 5 Q R X |dksJ|jdkrNt	S | j
|S dS )9Here the index is an int/str. Raises IndexError/KeyError.r_   	subscriptN)r   r   r   r	   r   KeyErrorr   get_tree_entriesrY   r   rz   r{   )r   r   noder!   r!   r"   r   R  s    

z)SequenceLiteralValue.py__simple_getitem__Nc                 c   s\   |   D ]<}|dks|jdkr6tt| jdddV  qt| j|V  qt| j| E dH  dS )
        While values returns the possible values for any array field, this
        function returns the value for a certain index.
        r_   r   N)r   rY   r   Slicerz   r   r   )r   r    r   r!   r!   r"   r   ]  s
    zSequenceLiteralValue.py__iter__c                 C   s   t |  S r   )lenr   r)   r!   r!   r"   	py__len__k  s    zSequenceLiteralValue.py__len__c                 C   s  | j j}| j j| jkr$|d d d S |d }|dkr8g S |jdkr\dd |jd d d D S |jdkrg }t|j}|D ]z}|dkrt| t|d  qxt|d }|d ks|d	kr|jd
krq|| qx|dkst||t|f t|d  qx|S |jd
krg S |gS d S )Nrb   r]   )]})testlist_compc                 S   s   g | ]}|j d kr|qS )	star_expr)rY   )rA   ro   r!   r!   r"   r   {  s    
z9SequenceLiteralValue.get_tree_entries.<locals>.<listcomp>Zdictorsetmakerz**,r   r_   )rp   rj   rY   r   iternextappendr   )r   r   Z
array_nodekviteratorr   opr!   r!   r"   r   o  s6    




z%SequenceLiteralValue.get_tree_entriesc                 C   s   d| j j| jf S rX   )rU   r+   rp   r)   r!   r!   r"   rZ     s    zSequenceLiteralValue.__repr__)N)r+   r,   r-   r   r   rR   r   r   r   r   r   rZ   r\   r!   r!   rT   r"   r   <  s   
-r   c                   @   sb   e Zd ZdZdd Zdd ZdddZed	d
d Zeddd Z	dd Z
dd Zdd ZdS )DictLiteralValuerx   c                 C   s   t | | || _|| _d S r   )r   rR   rz   rp   r   r!   r!   r"   rR     s    zDictLiteralValue.__init__c                 C   st   t | j|}|  D ]L\}}| j|D ]6}||dD ]$}| r:| j|      S q:q*qtd|  dS )r   z==zNo key found in dictionary %s.N)	r   create_simple_objectr(   r   rz   r{   Zexecute_operationr.   r
   )r   r   Zcompiled_value_indexr   ro   r   Zkey_vr!   r!   r"   r     s    z%DictLiteralValue.py__simple_getitem__Nc                 c   s>   t }|  D ]\}}|| j|O }q|D ]}t|V  q*dS )r   N)r   r   rz   r{   r   )r   r    r   r   _r!   r!   r"   r     s
    zDictLiteralValue.py__iter__r   c                 C   s    t |  }tt| j|ggS r   r   r   r!   r!   r"   r     s    z DictLiteralValue._imitate_valuesr   c                    s(    fdd   D }tt j|gS )Nc              	      s4   g | ],\}}t t jt j|t j|fqS r!   )r   r   r(   r   rz   )rA   rd   re   r)   r!   r"   r     s   

z3DictLiteralValue._imitate_items.<locals>.<listcomp>)r   r   r   r(   r   r!   r)   r"   r     s    
zDictLiteralValue._imitate_itemsc                 c   sF   |   D ]8\}}| j|D ]"}t|r| t| j|fV  qqdS )z
        Returns a generator of tuples like dict.items(), where the key is
        resolved (as a string) and the values are still lazy values.
        N)r   rz   r{   r   r.   r   )r   rd   ro   r   r!   r!   r"   r     s    z DictLiteralValue.exact_key_itemsc                    s   t  fdd  D S )Nc                 3   s   | ]\}} j |V  qd S r   rz   r{   rA   r   vr)   r!   r"   rC     s   z0DictLiteralValue._dict_values.<locals>.<genexpr>r   rE   r   r)   r!   r)   r"   r     s    zDictLiteralValue._dict_valuesc                    s   t  fdd  D S )Nc                 3   s   | ]\}} j |V  qd S r   r   r   r)   r!   r"   rC     s   z.DictLiteralValue._dict_keys.<locals>.<genexpr>r   r)   r!   r)   r"   r     s    zDictLiteralValue._dict_keys)N)r+   r,   r-   rO   rR   r   r   r   r   r   r   r   r   r!   r!   r!   r"   r     s   




r   c                       s>   e Zd Z fddZdd ZdddZdd	 Zd
d Z  ZS )_FakeSequencec                    s   t  | || _dS )z7
        type should be one of "tuple", "list"
        N)rQ   rR   _lazy_value_list)r   r(   Zlazy_value_listrT   r!   r"   rR     s    z_FakeSequence.__init__c              	   C   s<   t |trt| gS ttt | j| }W 5 Q R X | S r   )r   r   r   r	   r   r   r   r?   r   r   rB   r!   r!   r"   r     s
    

z"_FakeSequence.py__simple_getitem__Nc                 C   s   | j S r   )r   r   r!   r!   r"   r     s    z_FakeSequence.py__iter__c                 C   s   t t| jS r   )boolr   r   r)   r!   r!   r"   r7     s    z_FakeSequence.py__bool__c                 C   s   dt | j| jf S rX   )rY   r+   r   r)   r!   r!   r"   rZ      s    z_FakeSequence.__repr__)N)	r+   r,   r-   rR   r   r   r7   rZ   r\   r!   r!   rT   r"   r     s
   
r   c                   @   s   e Zd ZdZdS )r   r   Nr   r!   r!   r!   r"   r     s   r   c                   @   s   e Zd ZdZdS )r   r   Nr   r!   r!   r!   r"   r     s   r   c                       sb   e Zd ZdZ fddZdddZdd Zed	d
d Zdd Z	dd Z
dd Zdd Z  ZS )FakeDictrx   c                    s   t  | || _d S r   )rQ   rR   _dct)r   r(   r   rT   r!   r"   rR     s    zFakeDict.__init__Nc                 c   s$   | j D ]}tt| j|V  qd S r   )r   r   r   r   r(   )r   r    r   r!   r!   r"   r     s    
zFakeDict.py__iter__c              	   C   s(   t tt | j| }W 5 Q R X | S r   )r	   r   r   r   r?   r   r!   r!   r"   r     s    zFakeDict.py__simple_getitem__r   c                 C   s   t t| jt|  ggS r   )r   r   r(   r   r   r9   r!   r!   r"   _values  s    zFakeDict._valuesc                 C   s   t dd | j D S )Nc                 s   s   | ]}|  V  qd S r   r>   r@   r!   r!   r"   rC   $  s     z(FakeDict._dict_values.<locals>.<genexpr>)r   rE   r   r   r)   r!   r!   r"   r   #  s    zFakeDict._dict_valuesc                 C   s   t dd |  D S )Nc                 s   s   | ]}|  V  qd S r   r>   r@   r!   r!   r"   rC   '  s     z&FakeDict._dict_keys.<locals>.<genexpr>rD   r)   r!   r!   r"   r   &  s    zFakeDict._dict_keysc                 C   s
   | j  S r   )r   r   r)   r!   r!   r"   r   )  s    zFakeDict.exact_key_itemsc                 C   s   d| j j| jf S )Nz<%s: %s>)rU   r+   r   r)   r!   r!   r"   rZ   ,  s    zFakeDict.__repr__)N)r+   r,   r-   rO   rR   r   r   r   r   r   r   r   rZ   r\   r!   r!   rT   r"   r     s   

r   c                       s.   e Zd Z fddZdddZdd Z  ZS )	MergedArrayc                    s"   t  | |d j| _|| _d S )N)rQ   rR   rO   _arrays)r   r(   ZarraysrT   r!   r"   rR   1  s    zMergedArray.__init__Nc                 c   s   | j D ]}| E d H  qd S r   )r   r   )r   r    arrayr!   r!   r"   r   6  s    
zMergedArray.py__iter__c                 C   s   t dd |  D S )Nc                 s   s   | ]}|  V  qd S r   r>   r@   r!   r!   r"   rC   ;  s     z3MergedArray.py__simple_getitem__.<locals>.<genexpr>rD   )r   r   r!   r!   r"   r   :  s    z MergedArray.py__simple_getitem__)N)r+   r,   r-   rR   r   r   r\   r!   r!   rT   r"   r   0  s   
r   c           	   
   C   s:  |j dkr|j|iS |j dkr>|jd dkr>t| ||jd S |j dkri }t|jddd }d}|t| |D ]Z}|d7 }zt|}W n* tk
r   t	j
| d	|d
| d Y qvX |t| | | qvt|d}|r|dk	rt	j
| d|d| d |S |j dks|j dkr"i S |j dkr2i S tdS )zG
    Unpacking tuple assignments in for statements and expr_stmts.
    rH   rp   r   )rf   rg   r]   )r   r   r   r   Nrb   zvalue-error-too-many-valuesz3ValueError: too many values to unpack (expected %s))messagezvalue-error-too-few-valuesz.ValueError: need more than %s values to unpackpowerZ	atom_exprr   )rY   ro   rj   r}   r   rV   r   r   StopIterationr   addupdater?   NotImplementedError)	r   r   r   r   partsnrB   partZ	has_partsr!   r!   r"   r}   >  s8    




r}   c                   @   s(   e Zd Zdd Zdd ZefddZdS )r   c                 C   s$   |j | _ || _|| _|| _|| _d S r   )r(   _context_start_stop_step)r   Zpython_contextstartstopstepr!   r!   r"   rR   e  s
    zSlice.__init__c                 C   s   t | jjd}| \}|S )Nr   )r   r'   r   r(   Zexecute_with_values)r   ro   Zslice_valuer!   r!   r"   r3   m  s    
zSlice._get_wrapped_valuec                    sR    fdd}z t | j| j| jW S  tk
rL   t ddd Y S X dS )ze
        Imitate CompiledValue.obj behavior and return a ``builtin.slice()``
        object.
        c                    s6   | d krd S  j | }t|dkr(t|\}t|S )Nr]   )r   r{   r   r   r   )elementresultro   r)   r!   r"   getw  s    z!Slice.get_safe_value.<locals>.getN)r   r   r   r   r   )r   r   r   r!   r)   r"   r.   r  s
     zSlice.get_safe_valueN)r+   r,   r-   rR   r3   r   r.   r!   r!   r!   r"   r   d  s   r   N)9r[   Zjedi.inferencer   r   Zjedi.inference.lazy_valuer   r   r   Zjedi.inference.helpersr   r   r	   r
   Zjedi.inference.utilsr   r   Zjedi.inference.cacher   Zjedi.inference.filtersr   r   Zjedi.inference.base_valuer   r   r   r   r   r   r   Zjedi.parser_utilsr   Zjedi.inference.contextr   Z#jedi.inference.value.dynamic_arraysr   r   r/   r5   rs   rt   r   r   r   rn   rl   rm   r   rk   r   r   r   r   r   r   r   r}   r   r!   r!   r!   r"   <module>   sB   $%$0%	
8dJ$&