B
    7r\ff                 @   sX  d 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
 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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m Z  ddl!m"Z"m#Z#m$Z$m%Z%m&Z& ddl'm(Z( G dd de)Z*G dd dee*Z+G dd de+Z,G dd de%Z-dd Z.G dd de)Z/G dd dee*Z0G dd  d e/e0Z1G d!d" d"e/e0Z2G d#d$ d$e/e0Z3G d%d& d&e/e+Z4G d'd( d(e0Z5G d)d* d*e5Z6G d+d, d,e5Z7G d-d. d.e7Z8G d/d0 d0e7Z9G d1d2 d2e7Z:d3d4 Z;d5d6 Z<ee#d7ej=d8d9 Z>d:d; Z?G d<d= d=e)Z@G d>d? d?e$ZAd@S )Aa  
Contains all classes and functions to deal with lists, dicts, generators and
iterators in general.

Array modifications
*******************

If the content of an array (``set``/``list``) is requested somewhere, the
current module will be checked for appearances of ``arr.append``,
``arr.insert``, etc.  If the ``arr`` name points to an actual array, the
content will be added

This can be really cpu intensive, as you can imagine. Because |jedi| has to
follow **every** ``append`` and check wheter it's the right array. However this
works pretty good, because in *slow* cases, the recursion detector and other
settings will stop this process.

It is important to note that:

1. Array modfications work only in the current module.
2. Jedi only checks Array additions; ``list.pop``, etc are ignored.
    )debug)settings)force_unicodeis_py3)memoize_method)compiled)analysis)	recursion)LazyKnownContextLazyKnownContextsLazyTreeContext)get_int_or_none	is_stringpredefine_namesevaluate_call_of_leafreraise_as_evaluatorEvaluatorKeyError)safe_property)to_list)evaluator_method_cache)ParserTreeFilterBuiltinOverwritepublish_method)
ContextSetNO_CONTEXTSContextTreeContextContextualizedNode)get_comp_forsc               @   s   e Zd Zdd ZdS )IterableMixinc             C   s   t t| jdS )NNone)r   r   builtin_from_name	evaluator)self r$   =lib/python3.7/site-packages/jedi/evaluate/context/iterable.pypy__stop_iteration_returns.   s    z(IterableMixin.py__stop_iteration_returnsN)__name__
__module____qualname__r&   r$   r$   r$   r%   r   -   s   r   c               @   sH   e Zd ZdZdZededddedddd	d
 Zedd ZdS )GeneratorBaseNZGENERATOR_OBJECTsendnext   )Zpython_version_match__next__   c             C   s   t dd |  D S )Nc             s   s   | ]}|  V  qd S )N)infer).0lazy_contextr$   r$   r%   	<genexpr>:   s    z+GeneratorBase.py__next__.<locals>.<genexpr>)r   	from_sets
py__iter__)r#   r$   r$   r%   
py__next__6   s    zGeneratorBase.py__next__c             C   s   t | dS )N	generator)r   CompiledContextName)r#   r$   r$   r%   name<   s    zGeneratorBase.name)	r'   r(   r)   
array_typeZspecial_object_identifierr   r6   propertyr9   r$   r$   r$   r%   r*   2   s   
r*   c                   s8   e Zd ZdZ fddZdd Zdd Zdd	 Z  ZS )
	GeneratorzHandling of `yield` functions.c                s   t t| | || _d S )N)superr<   __init___func_execution_context)r#   r"   Zfunc_execution_context)	__class__r$   r%   r>   C   s    zGenerator.__init__c             C   s
   | j  S )N)r?   Zget_yield_lazy_contexts)r#   r$   r$   r%   r5   G   s    zGenerator.py__iter__c             C   s
   | j  S )N)r?   Zget_return_values)r#   r$   r$   r%   r&   J   s    z$Generator.py__stop_iteration_returnsc             C   s   dt | j| jf S )Nz
<%s of %s>)typer'   r?   )r#   r$   r$   r%   __repr__M   s    zGenerator.__repr__)	r'   r(   r)   __doc__r>   r5   r&   rB   __classcell__r$   r$   )r@   r%   r<   A   s
   r<   c               @   s*   e Zd Zedd Zdd ZdddZdS )	CompForContextc             C   s   | |j ||S )N)r"   )clsparent_contextcomp_forr$   r$   r%   from_comp_forR   s    zCompForContext.from_comp_forc             C   s   | j S )N)	tree_node)r#   r$   r$   r%   get_nodeV   s    zCompForContext.get_nodeNc             c   s   t | j| V  d S )N)r   r"   )r#   Zsearch_globalZuntil_positionZorigin_scoper$   r$   r%   get_filtersY   s    zCompForContext.get_filters)NN)r'   r(   r)   classmethodrI   rK   rL   r$   r$   r$   r%   rE   Q   s   rE   c             C   sX   |j d }|dkr2|j d j d dkr,t}qLt}n|dkr@t}n|dkrLt}|| ||S )Nr   {   :([)childrenDictComprehensionSetComprehensionGeneratorComprehensionListComprehension)r"   contextatomZbracketrF   r$   r$   r%   comprehension_from_atom]   s    
rZ   c                   st   e Zd Z fddZdd Zdd Zddd	Ze d
d ZdddZ	eg de
dd Zdd Zdd Z  ZS )ComprehensionMixinc                s    t t| | || _|| _d S )N)r=   r[   r>   _defining_context_atom)r#   r"   defining_contextrY   )r@   r$   r%   r>   l   s    zComprehensionMixin.__init__c             C   s   | j jd S )zreturn 'a for a in b'rO   )r]   rS   )r#   r$   r$   r%   _get_comprehensionq   s    z%ComprehensionMixin._get_comprehensionc             C   s   |   jd S )zreturn CompFor('for a in b')rO   )r_   rS   )r#   r$   r$   r%   _get_comp_forv   s    z ComprehensionMixin._get_comp_forr   c             C   s   |   j| S )ze
        The first part `x + 1` of the list comprehension:

            [x + 1 for x in foo]
        )r_   rS   )r#   indexr$   r$   r%   
_eval_nodez   s    zComprehensionMixin._eval_nodec             C   s   t ||S )N)rE   rI   )r#   rG   rH   r$   r$   r%   _get_comp_for_context   s    z(ComprehensionMixin._get_comp_for_contextNc             c   sD  |d }d|j |j dd  k}|j |j dd  }|p@| j}||}t||}|j||d}|j |j dd  }	xt|D ]\}
}| }t|||	}| 	||}t
|||~ y(x"| |dd  |D ]
}|V  qW W nN tk
r0   ||  }| jdkr&||| dfV  n|V  Y nX W d Q R X qW d S )	Nr   asyncforrO   in)is_asyncdictr-   )rS   ra   r\   	eval_noder   iterate	enumerater0   unpack_tuple_to_dictrc   r   _nested
IndexErrorrb   r:   )r#   	comp_forsrG   rH   rg   Z
input_nodeZinput_typesZcnZiteratedexprlistir2   typesdctZcontext_resultr$   r$   r%   rm      s.    


zComprehensionMixin._nested)defaultc             c   s.   t t|  }x| |D ]
}|V  qW d S )N)tupler   r`   rm   )r#   ro   rt   r$   r$   r%   _iterate   s    zComprehensionMixin._iteratec             c   s    x|   D ]}t|V  q
W d S )N)rw   r   )r#   Zset_r$   r$   r%   r5      s    zComprehensionMixin.py__iter__c             C   s   dt | j| jf S )Nz
<%s of %s>)rA   r'   r]   )r#   r$   r$   r%   rB      s    zComprehensionMixin.__repr__)r   )N)r'   r(   r)   r>   r_   r`   rb   r   rc   rm   r   rw   r5   rB   rD   r$   r$   )r@   r%   r[   k   s   

r[   c               @   sL   e Zd ZdZedd Zedd Zdd Zdd	 Z	e
d
d Zdd ZdS )Sequenceinstancec             C   s   t | | jS )N)r   r8   r:   )r#   r$   r$   r%   r9      s    zSequence.namec             C   s    t | j| j}|| \}|S )N)r   r!   r"   r:   Zexecute_evaluated)r#   Zcompiled_objZonly_objr$   r$   r%   
get_object   s    zSequence.get_objectc             C   s   d S )Nr$   )r#   r$   r$   r%   
py__bool__   s    zSequence.py__bool__c             C   s   t | j| jS )N)r   r!   r"   r:   )r#   r$   r$   r%   py__class__   s    zSequence.py__class__c             C   s   | j jS )N)r"   builtins_module)r#   r$   r$   r%   parent   s    zSequence.parentc                s   t  fdd  D S )Nc             3   s   | ]\}} j |V  qd S )N)r\   ri   )r1   kv)r#   r$   r%   r3      s   z'Sequence.dict_values.<locals>.<genexpr>)r   r4   _items)r#   r$   )r#   r%   dict_values   s    
zSequence.dict_valuesN)r'   r(   r)   Zapi_typer;   r9   r   rz   r{   r|   r   r~   r   r$   r$   r$   r%   rx      s   rx   c               @   s   e Zd ZdZdd ZdS )rW   listc          	   C   sD   t |trt| S t|  }ttt || }W d Q R X | S )N)	
isinstanceslicer   r   r5   r   rn   	TypeErrorr0   )r#   ra   Z	all_typesr2   r$   r$   r%   py__getitem__   s    
zListComprehension.py__getitem__N)r'   r(   r)   r:   r   r$   r$   r$   r%   rW      s   rW   c               @   s   e Zd ZdZdS )rU   setN)r'   r(   r)   r:   r$   r$   r$   r%   rU      s   rU   c               @   sX   e Zd ZdZ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dS )rT   rh   c             C   s   |   jd S )Nr/   )r_   rS   )r#   r$   r$   r%   r`      s    zDictComprehension._get_comp_forc             c   s$   x|   D ]\}}t|V  q
W d S )N)rw   r   )r#   keysvaluesr$   r$   r%   r5      s    zDictComprehension.py__iter__c             C   sN   xD|   D ]8\}}x.|D ]&}t|tjr|jt d|kr|S qW q
W |  S )N)ru   )rw   r   r   CompiledObjectget_safe_valueobjectr   )r#   ra   r   r   r   r$   r$   r%   r      s    
zDictComprehension.py__getitem__c             C   s   t dd |  D S )Nc             s   s   | ]\}}|V  qd S )Nr$   )r1   r   r   r$   r$   r%   r3      s    z0DictComprehension.dict_values.<locals>.<genexpr>)r   r4   rw   )r#   r$   r$   r%   r      s    zDictComprehension.dict_valuesr   c             C   s    t |  }tt| jd|gS )Nr   )r   r   r   FakeSequencer"   )r#   r2   r$   r$   r%   _imitate_values   s    z!DictComprehension._imitate_valuesitemsc                s(    fdd   D }tt jd|S )Nc          	      s.   g | ]&\}}t t jd t|t|gqS )rv   )r
   r   r"   r   )r1   keyvalue)r#   r$   r%   
<listcomp>  s   z4DictComprehension._imitate_items.<locals>.<listcomp>r   )rw   r   r   r"   )r#   lazy_contextsr$   )r#   r%   _imitate_items   s    
z DictComprehension._imitate_itemsc             C   s   g S )Nr$   )r#   r$   r$   r%   exact_key_items  s    z!DictComprehension.exact_key_itemsN)r'   r(   r)   r:   r`   r5   r   r   r   r   r   r   r$   r$   r$   r%   rT      s   rT   c               @   s   e Zd ZdS )rV   N)r'   r(   r)   r$   r$   r$   r%   rV     s   rV   c                   sX   e Zd ZddddZ fddZdd Zd	d
 Zdd Zdd Zdd Z	dd Z
  ZS )SequenceLiteralContextrv   r   r   )rQ   rR   rN   c                sF   t t| | || _|| _| jjdkr0d| _ntj|jd  | _d S )N)testlist_star_exprtestlistrv   r   )	r=   r   r>   rY   r\   rA   r:   mappingrS   )r#   r"   r^   rY   )r@   r$   r%   r>     s    zSequenceLiteralContext.__init__c          	   C   s   | j dkrxt| j|}xR|  D ]F\}}x<| j|D ],}t|tjr8|	|d
 r8| j|S q8W q"W td|  t|trt| S tttt |  | }W dQ R X | j|S dS )z9Here the index is an int/str. Raises IndexError/KeyError.rh   z==zNo key found in dictionary %s.N)r:   r   create_simple_objectr"   r   r\   ri   r   r   Zexecute_operationr   r   r   r   r   r   KeyErrorrn   )r#   ra   Zcompiled_obj_indexr   r   r   noder$   r$   r%   r   (  s    

z$SequenceLiteralContext.py__getitem__c             c   s   | j dkrPt }x$|  D ]\}}|| j|O }qW xT|D ]}t|V  q<W n<x|  D ]}t| j|V  qZW xt| j| D ]
}|V  q~W dS )z
        While values returns the possible values for any array field, this
        function returns the value for a certain index.
        rh   N)r:   r   r   r\   ri   r   r   check_array_additions)r#   rr   r   _r   additionr$   r$   r%   r5   ;  s    

z!SequenceLiteralContext.py__iter__c             C   s.   | j dkr"tdd |  D S |  S dS )z!Returns a list of a list of node.rh   c             s   s   | ]\}}|V  qd S )Nr$   )r1   r   r   r$   r$   r%   r3   S  s    z1SequenceLiteralContext._values.<locals>.<genexpr>N)r:   r   r4   r   )r#   r$   r$   r%   _valuesP  s    
zSequenceLiteralContext._valuesc             C   s  | j j}| j jdkr"|d d d S |d }|dkr6g S |jdkrZdd |jd d d D S |jdkrg }t|j}x|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  qxW |S |jdkr
g S |gS d S )N)r   r   r-   rO   )]})testlist_compc             S   s   g | ]}|j d kr|qS )	star_expr)rA   )r1   r   r$   r$   r%   r   c  s    z1SequenceLiteralContext._items.<locals>.<listcomp>Zdictorsetmakerz**,r   rP   )rY   rS   rA   iterr,   appendAssertionError)r#   cZ
array_nodeZkviteratorr   opr$   r$   r%   r   W  s6    





zSequenceLiteralContext._itemsc             c   sN   xH|   D ]<\}}x2| j|D ]"}t|r | t| j|fV  q W q
W 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 contexts.
        N)r   r\   ri   r   r   r   )r#   key_noder   r   r$   r$   r%   r     s    z&SequenceLiteralContext.exact_key_itemsc             C   s   d| j j| jf S )Nz
<%s of %s>)r@   r'   rY   )r#   r$   r$   r%   rB     s    zSequenceLiteralContext.__repr__)r'   r(   r)   r   r>   r   r5   r   r   r   rB   rD   r$   r$   )r@   r%   r     s   -
r   c                   s@   e Zd ZdZ fddZeddd Zeddd	 Z  ZS )
DictLiteralContextrh   c                s    t t| | || _|| _d S )N)r=   r   r>   r\   rY   )r#   r"   r^   rY   )r@   r$   r%   r>     s    zDictLiteralContext.__init__r   c             C   s    t |  }tt| jd|gS )Nr   )r   r   r   r   r"   )r#   r2   r$   r$   r%   r     s    z"DictLiteralContext._imitate_valuesr   c                s(    fdd   D }tt jd|S )Nc          
      s6   g | ].\}}t t jd t j|t j|fqS )rv   )r
   r   r"   r   r\   )r1   r   Z
value_node)r#   r$   r%   r     s   z5DictLiteralContext._imitate_items.<locals>.<listcomp>r   )r   r   r   r"   )r#   r   r$   )r#   r%   r     s    
z!DictLiteralContext._imitate_items)	r'   r(   r)   r:   r>   r   r   r   rD   r$   r$   )r@   r%   r     s   r   c                   s   e Zd Z fddZ  ZS )
_FakeArrayc                s    t t| | || _|| _d S )N)r=   r   r>   r:   rY   )r#   r"   Z	containerrA   )r@   r$   r%   r>     s    z_FakeArray.__init__)r'   r(   r)   r>   rD   r$   r$   )r@   r%   r     s   r   c                   s<   e Zd Z fddZdd Zdd Zdd Zd	d
 Z  ZS )r   c                s   t t| |d| || _dS )z7
        type should be one of "tuple", "list"
        N)r=   r   r>   _lazy_context_list)r#   r"   r:   Zlazy_context_list)r@   r$   r%   r>     s    zFakeSequence.__init__c          	   C   s(   t tt | j| }W d Q R X | S )N)r   rn   r   r   r0   )r#   ra   r2   r$   r$   r%   r     s    zFakeSequence.py__getitem__c             C   s   | j S )N)r   )r#   r$   r$   r%   r5     s    zFakeSequence.py__iter__c             C   s   t t| jS )N)boollenr   )r#   r$   r$   r%   r{     s    zFakeSequence.py__bool__c             C   s   dt | j| jf S )Nz
<%s of %s>)rA   r'   r   )r#   r$   r$   r%   rB     s    zFakeSequence.__repr__)	r'   r(   r)   r>   r   r5   r{   rB   rD   r$   r$   )r@   r%   r     s
   r   c                   sL   e Zd Z fddZdd Zdd Zeddd	 Zd
d Zdd Z	  Z
S )FakeDictc                s   t t| ||d || _d S )Nrh   )r=   r   r>   _dct)r#   r"   rs   )r@   r$   r%   r>     s    zFakeDict.__init__c             c   s(   x"| j D ]}tt| j|V  qW d S )N)r   r
   r   r   r"   )r#   r   r$   r$   r%   r5     s    zFakeDict.py__iter__c          	   C   s   t r| jjjjdkrt|trLt|}y| j| 	 S  t
k
rH   Y qX n8t|tr|d}y| j| 	 S  t
k
r   Y nX tt
 | j| }W d Q R X |	 S )Nr-   zutf-8)r   r"   Zenvironmentversion_infomajorr   bytesr   r   r0   r   strencoder   )r#   ra   Zindex_unicodeZindex_bytesr2   r$   r$   r%   r     s     



zFakeDict.py__getitem__r   c             C   s   t t| jdt|  gS )Nrv   )r   r   r"   r   r   )r#   r$   r$   r%   r     s    zFakeDict._valuesc             C   s   t dd | j D S )Nc             s   s   | ]}|  V  qd S )N)r0   )r1   r2   r$   r$   r%   r3     s    z'FakeDict.dict_values.<locals>.<genexpr>)r   r4   r   r   )r#   r$   r$   r%   r     s    zFakeDict.dict_valuesc             C   s
   | j  S )N)r   r   )r#   r$   r$   r%   r     s    zFakeDict.exact_key_items)r'   r(   r)   r>   r5   r   r   r   r   r   rD   r$   r$   )r@   r%   r     s   r   c                   s<   e Zd Z fddZdd Zdd Zdd Zd	d
 Z  ZS )MergedArrayc                s$   t t| |||d j || _d S )N)r=   r   r>   r:   _arrays)r#   r"   Zarrays)r@   r$   r%   r>     s    zMergedArray.__init__c             c   s,   x&| j D ]}x| D ]
}|V  qW qW d S )N)r   r5   )r#   arrayr2   r$   r$   r%   r5     s    zMergedArray.py__iter__c             C   s   t dd |  D S )Nc             s   s   | ]}|  V  qd S )N)r0   )r1   r2   r$   r$   r%   r3     s    z,MergedArray.py__getitem__.<locals>.<genexpr>)r   r4   r5   )r#   ra   r$   r$   r%   r      s    zMergedArray.py__getitem__c             c   s,   x&| j D ]}x| D ]
}|V  qW qW d S )N)r   r   )r#   r   ar$   r$   r%   r     s    zMergedArray._itemsc             C   s   t dd | jD S )Nc             s   s   | ]}t |V  qd S )N)r   )r1   r   r$   r$   r%   r3   	  s    z&MergedArray.__len__.<locals>.<genexpr>)sumr   )r#   r$   r$   r%   __len__  s    zMergedArray.__len__)	r'   r(   r)   r>   r5   r   r   r   rD   r$   r$   )r@   r%   r     s
   r   c       	   
   C   s8  |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}xh||D ]Z}|d7 }yt|}W n* tk
r   tj	| d	|d
| d Y qrX |
t| | | qrW t|d}|r |dk	r tj	| d|d| d |S |j dks|j dkr i S |j dkr0i S tdS )zG
    Unpacking tuple assignments in for statements and expr_stmts.
    r9   rY   r   z([rO   )r   r   rp   r   Nr-   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   )rA   r   rS   rl   r   rj   r,   StopIterationr   addupdater0   NotImplementedError)	rX   rr   rp   rs   partsnr2   partZ	has_partsr$   r$   r%   rl     s4    




rl   c             C   s   |j dkrtS t| |S )z@ Just a mapper function for the internal _check_array_additions )r   r   )r:   r   _check_array_additions)rX   sequencer$   r$   r%   r   4  s    
r   )ru   c                s  ddl m  tjd| dd |  }tjr8t|tj	rLtjddd t
 S  fdd}tjd	 }t_|jjd
k}|rdddgnddg}t }x0|D ]&}y|j | }	W n tk
r   wY qX x|	D ]}
| j}|j|
j  k r|jk sq q|
j}|j}|j|}y|j|d  }W n tk
r6   wY n,X |jdks|jd dks|jd dkrbq| |
}t| j|:}|rt||
dd}||kr||||jd |O }W dQ R X qW qW |t_tjd| dd |S )zr
    Checks if a `Array` has "add" (append, insert, extend) statements:

    >>> a = [""]
    >>> a.append(1)
    r   )	argumentszDynamic array search for %sZMAGENTA)ZcolorzDynamic array search aborted.c                s   t  | j| | }t }|dkr2|dd  }|dkrXxJ|D ]\}}|| q@W n.|dkrx$|D ]\}}|t|  O }qfW |S )N)insertrO   )r   r   r   )extendr   )r   TreeArgumentsr"   unpackr   r   r0   rj   )rX   Zarglistadd_nameZparamsrt   r   Zwhateverr2   )r   r$   r%   find_additionsN  s    z._check_array_additions.<locals>.find_additionsFr   r   r   r   r   r   rO   trailerrQ   r   T)Zcut_own_trailerNzDynamic array result %s)jedi.evaluater   r   ZdbgZget_root_contextr   Zdynamic_array_additionsr   r   r   r   Z dynamic_params_for_other_modulesr9   Zstring_namer   rJ   Zget_used_namesr   Z	start_posZend_posr~   rS   ra   rn   rA   Zcreate_contextr	   Zexecution_allowedr"   r   )rX   r   Zmodule_contextr   Ztemp_param_addZis_listZsearch_namesZadded_typesr   Zpossible_namesr9   Zcontext_noder   r   Ztrailer_posZexecution_trailerZrandom_contextZallowedfoundr$   )r   r%   r   =  s\    	



r   c             C   s&   t | |}ddlm} |t|gS )z$Used for set() and list() instances.r   )r   )_ArrayInstancer   r   ZValuesArgumentsr   )ry   r   Zair$   r$   r%   get_dynamic_array_instance  s    
r   c               @   s*   e Zd ZdZdd Zdd Zd
dd	ZdS )r   a  
    Used for the usage of set() and list().
    This is definitely a hack, but a good one :-)
    It makes it possible to use set/list conversions.

    In contrast to Array, ListComprehension and all other iterable types, this
    is something that is only used inside `evaluate/compiled/fake/builtins.py`
    and therefore doesn't need filters, `py__bool__` and so on, because
    we don't use these operations in `builtins.py`.
    c             C   s   || _ || _d S )N)ry   var_args)r#   ry   r   r$   r$   r%   r>     s    z_ArrayInstance.__init__c             c   s   | j }yt| \}}W n tk
r.   Y nX x|  D ]
}|V  q>W ddlm} t||j	rt
|j| j}x|D ]
}|V  qxW d S )Nr   )r   )r   r,   r   r   r0   rj   r   r   r   r   r   rX   ry   )r#   r   r   r2   Zlazyr   Z	additionsr   r$   r$   r%   r5     s    

z_ArrayInstance.py__iter__NFc             C   s   |   S )N)r5   )r#   Zcontextualized_noderg   r$   r$   r%   rj     s    z_ArrayInstance.iterate)NF)r'   r(   r)   rC   r>   r5   rj   r$   r$   r$   r%   r     s   
r   c                   s(   e Zd Z fddZedd Z  ZS )Slicec                s6   t t| j|j|jjd || _|| _|| _|| _d S )N)rG   )	r=   r   r>   r"   r}   _context_start_stop_step)r#   rX   startstopstep)r@   r$   r%   r>     s    
zSlice.__init__c                sL    fdd}yt | j| j| jS  tk
rF   t dddS X dS )zf
        Imitate CompiledObject.obj behavior and return a ``builtin.slice()``
        object.
        c                s6   | d krd S  j | }t|dkr(t|\}t|S )NrO   )r   ri   r   rn   r   )elementrt   rX   )r#   r$   r%   get  s    zSlice.obj.<locals>.getN)r   r   r   r   rn   )r#   r   r$   )r#   r%   obj  s
    z	Slice.obj)r'   r(   r)   r>   r;   r   rD   r$   r$   )r@   r%   r     s   r   N)BrC   Zjedir   r   Zjedi._compatibilityr   r   Z
jedi.cacher   r   r   r   r	   Zjedi.evaluate.lazy_contextr
   r   r   Zjedi.evaluate.helpersr   r   r   r   r   r   Zjedi.evaluate.utilsr   r   Zjedi.evaluate.cacher   Zjedi.evaluate.filtersr   r   r   Zjedi.evaluate.base_contextr   r   r   r   r   Zjedi.parser_utilsr   r   r   r*   r<   rE   rZ   r[   rx   rW   rU   rT   rV   r   r   r   r   r   r   rl   r   Zincrease_indentr   r   r   r   r$   r$   r$   r%   <module>   sN    J0z+(	R#