B
    7r\F                 @   s  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 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 d dlmZmZmZ d dlmZ d dlm 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&Z'G dd dej(Z)G dd dej*Z+G dd deZ,G d d! d!ej-Z.G d"d# d#ej/Z0G d$d% d%e!Z1G d&d' d'ej*Z2G d(d) d)eZ3G d*d+ d+eZ4d,S )-    )abstractproperty)debug)settings)compiled)filters)ContextNO_CONTEXTS
ContextSetiterator_to_context_set)LazyKnownContextLazyKnownContexts)evaluator_method_cache)AbstractArgumentsAnonymousArguments)FunctionExecutionContextFunctionContextAbstractFunction)ClassContextapply_py__get__ClassFilter)iterable)get_parent_scopec               @   s   e Zd Zdd Zdd ZdS )InstanceExecutedParamc             C   s
   || _ d S )N)	_instance)selfinstance r   =lib/python3.7/site-packages/jedi/evaluate/context/instance.py__init__   s    zInstanceExecutedParam.__init__c             C   s
   t | jS )N)r	   r   )r   r   r   r   infer   s    zInstanceExecutedParam.inferN)__name__
__module____qualname__r   r   r   r   r   r   r      s   r   c               @   s   e Zd Zdd Zdd ZdS )AnonymousInstanceArgumentsc             C   s
   || _ d S )N)r   )r   r   r   r   r   r      s    z#AnonymousInstanceArguments.__init__c             C   sR   ddl m} t| j}|j }t|dkr2|gS t||j||j}||d< |S )Nr   )search_params   )	Zjedi.evaluate.dynamicr$   r   r   	tree_nodeZ
get_paramslenlist	evaluator)r   execution_contextr$   Z
self_paramZtree_paramsZexecuted_paramsr   r   r   get_executed_params   s    


z.AnonymousInstanceArguments.get_executed_paramsN)r    r!   r"   r   r+   r   r   r   r   r#      s   r#   c                   s   e Zd ZdZdZ fd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%ddZdd Zdd Zedd Zdd Zdd  Ze d!d" Zd#d$ Z  ZS )&AbstractInstanceContextz3
    This class is used to evaluate instances.
    r   c                s"   t t| || || _|| _d S )N)superr,   r   class_contextvar_args)r   r)   parent_contextr.   r/   )	__class__r   r   r   6   s    z AbstractInstanceContext.__init__c             C   s   dS )NFr   )r   r   r   r   is_class=   s    z AbstractInstanceContext.is_classc                s"   |  d  st fdd}|S )N__call__c                s   t  fddD S )Nc             3   s   | ]}|   V  qd S )N)r   execute).0name)	argumentsr   r   	<genexpr>H   s    zFAbstractInstanceContext.py__call__.<locals>.execute.<locals>.<genexpr>)r	   	from_sets)r7   )names)r7   r   r4   G   s    z3AbstractInstanceContext.py__call__.<locals>.execute)get_function_slot_namesAttributeError)r   r4   r   )r:   r   
py__call__@   s
    
z"AbstractInstanceContext.py__call__c             C   s   | j S )N)r.   )r   r   r   r   py__class__L   s    z#AbstractInstanceContext.py__class__c             C   s   d S )Nr   )r   r   r   r   
py__bool__O   s    z"AbstractInstanceContext.py__bool__c             C   s,   x&| j ddD ]}||}|r|S qW g S )NF)include_self_names)get_filtersget)r   r6   filterr:   r   r   r   r;   S   s
    
z/AbstractInstanceContext.get_function_slot_namesc                s   t  fdd|D S )Nc             3   s   | ]}|  j  V  qd S )N)r   Zexecute_evaluated)r5   r6   )evaluated_argsr   r   r8   _   s   zAAbstractInstanceContext.execute_function_slots.<locals>.<genexpr>)r	   r9   )r   r:   rD   r   )rD   r   execute_function_slots]   s    
z.AbstractInstanceContext.execute_function_slotsc             C   sR   |  d}|rFt|tr(| |||jS t| jd}| |||S nt| S d S )N__get__None)	r;   
isinstancer,   rE   r.   r   Zbuiltin_from_namer)   r	   )r   objr:   Znone_objr   r   r   	py__get__c   s    

z!AbstractInstanceContext.py__get__NTc             c   s   |r@x:| j  D ],}t|tjr*|jd k	rt| j| ||V  qW xB| j  D ]4}t|tjrnt| j| |V  qLt	| j| ||V  qLW d S )N)
r.   Z	py__mro__rH   r   CompiledObjectr&   SelfAttributeFilterr)   CompiledInstanceClassFilterInstanceClassFilter)r   search_globalZuntil_positionorigin_scoper@   clsr   r   r   rA   p   s    
z#AbstractInstanceContext.get_filtersc             C   sL   y|  d}W n tk
r,   td tS X t| j|}| ||S d S )N__getitem__z(No __getitem__, cannot access the array.)	r;   KeyErrorr   warningr   r   Zcreate_simple_objectr)   rE   )r   indexr:   Z	index_objr   r   r   py__getitem__   s    
z%AbstractInstanceContext.py__getitem__c             c   s   |  d}|s td|   d S x|| |D ]n}t|tr| jjjj	dkrPd}nd}| |}|rtt
||V  qtd| q,x| D ]
}|V  qW q,W d S )N__iter__zNo __iter__ on %s.   next__next__z(Instance has no __next__ function in %s.)r;   r   rT   rE   rH   r,   r)   Zenvironmentversion_infomajorr   
py__iter__)r   Ziter_slot_names	generatorr6   lazy_contextr   r   r   r]      s     


z"AbstractInstanceContext.py__iter__c             C   s   d S )Nr   )r   r   r   r   r6      s    zAbstractInstanceContext.namec             C   s   | | jS )N)get_function_executionr/   )r   r.   bound_methodr   r   r   _create_init_execution   s    z.AbstractInstanceContext._create_init_executionc             c   sR   xL|  dD ]>}t|trt| j|jj}t| |j	|}| 
|j	|V  qW d S )Nr   )r;   rH   LazyInstanceClassNamer   from_contextr0   	tree_nameparentBoundMethodr.   rb   )r   r6   functionra   r   r   r   create_init_executions   s    

z.AbstractInstanceContext.create_init_executionsc             C   s   |j jdkr|j }t|}||jkr(|S | ||}|jdkrt||}t| ||}|jj	dkrv||krv| 
||S | S n6|jdkrt| j||}|S |jdkr| ||S t|S )N)funcdefclassdefrj   r   rk   Zcomp_for)rf   typer   r&   create_instance_contextr   rd   rg   r6   valuerb   r`   r   r)   NotImplementedError)r   r.   nodeZscoper0   funcra   r   r   r   rm      s*    




z/AbstractInstanceContext.create_instance_contextc             C   s   d| j j| j| jf S )Nz<%s of %s(%s)>)r1   r    r.   r/   )r   r   r   r   __repr__   s    z AbstractInstanceContext.__repr__)NNNT)r    r!   r"   __doc__api_typer   r2   propertyr=   r>   r?   r;   rE   rJ   rA   rV   r]   r   r6   rb   ri   r   rm   rr   __classcell__r   r   )r1   r   r,   0   s&   
 


r,   c                   s<   e Zd Z fddZedd Z fddZdd Z  ZS )	CompiledInstancec                sL   || _ | dkr2| |jkr2tjr2t| |}tt	| 
|||| d S )N)r(   set)_original_var_argsZ
py__name__Zget_root_contextZbuiltins_moduler   Zdynamic_array_additionsr   Zget_dynamic_array_instancer-   rw   r   )r   r)   r0   r.   r/   )r1   r   r   r      s    zCompiledInstance.__init__c             C   s   t | | jjjS )N)r   ZCompiledContextNamer.   r6   string_name)r   r   r   r   r6      s    zCompiledInstance.namec                s(   t |jdkr|S tt| ||S d S )Nrk   )r   rl   r-   rw   rm   )r   r.   rp   )r1   r   r   rm      s    z(CompiledInstance.create_instance_contextc             C   s(   t | j d\}}|d k	r tS | S )N) N)rY   ry   unpackr   r   )r   keyr_   r   r   r   'get_first_non_keyword_argument_contexts   s    z8CompiledInstance.get_first_non_keyword_argument_contexts)	r    r!   r"   r   ru   r6   rm   r~   rv   r   r   )r1   r   rw      s   rw   c                   s(   e Zd Z fddZedd Z  ZS )TreeInstancec                s"   t t| |||| |j| _d S )N)r-   r   r   r&   )r   r)   r0   r.   r/   )r1   r   r   r      s    zTreeInstance.__init__c             C   s   t | | jjjS )N)r   ZContextNamer.   r6   re   )r   r   r   r   r6      s    zTreeInstance.name)r    r!   r"   r   ru   r6   rv   r   r   )r1   r   r      s   r   c                   s   e Zd Z fddZ  ZS )AnonymousInstancec                s    t t| j|||t| d d S )N)r/   )r-   r   r   r#   )r   r)   r0   r.   )r1   r   r   r     s
    
zAnonymousInstance.__init__)r    r!   r"   r   rv   r   r   )r1   r   r     s   r   c                   s(   e Zd Z fddZedd Z  ZS )CompiledInstanceNamec                s.   t t| ||j|j || _|| _|| _d S )N)r-   r   r   r0   rz   r   _class_class_member_name)r   r)   r   klassr6   )r1   r   r   r     s    
zCompiledInstanceName.__init__c             c   sZ   xT| j  D ]F}|jdk}|jd k	r<|r<t| j| j|V  q|rLt|V  q|V  qW d S )Nrh   )r   r   rt   r&   rg   r   r   CompiledBoundMethod)r   result_contextZis_functionr   r   r   r     s    
zCompiledInstanceName.infer)r    r!   r"   r   r
   r   rv   r   r   )r1   r   r     s   
r   c               @   s0   e Zd ZeZdd Zdd Zdd Zdd Zd	S )
rM   c             C   s(   || _ || _|| _t|jdd| _d S )NT)is_instance)
_evaluatorr   r   rY   rA   _class_filter)r   r)   r   r   r   r   r   r   '  s    z$CompiledInstanceClassFilter.__init__c             C   s   |  | j|S )N)_convertr   rB   )r   r6   r   r   r   rB   -  s    zCompiledInstanceClassFilter.getc             C   s   |  | j S )N)r   r   values)r   r   r   r   r   0  s    z"CompiledInstanceClassFilter.valuesc                s    fdd|D S )Nc                s    g | ]}t  j j j|qS r   )r   r   r   r   )r5   n)r   r   r   
<listcomp>5  s   z8CompiledInstanceClassFilter._convert.<locals>.<listcomp>r   )r   r:   r   )r   r   r   3  s    
z$CompiledInstanceClassFilter._convertN)	r    r!   r"   r   
name_classr   rB   r   r   r   r   r   r   rM   $  s
   rM   c                   s6   e Zd Z fddZdd Zd
ddZdd	 Z  ZS )rg   c                s0   t t| |j|j|j || _|| _|| _d S )N)	r-   rg   r   r)   r0   r&   r   r   	_function)r   r   r   rh   )r1   r   r   r   ;  s    
zBoundMethod.__init__c             C   s   t | jdS )NZBOUND_METHOD_CLASS)r   Zget_special_objectr)   )r   r   r   r   r>   E  s    zBoundMethod.py__class__Nc             C   sJ   |d krt | j}t| j|}t| jtjr>t| j| j	| |S | j
|S )N)r#   r   InstanceArgumentsrH   r   r   rK   r   r)   r0   r`   )r   r7   r   r   r   r`   H  s    
z"BoundMethod.get_function_executionc             C   s   d| j j| jf S )Nz<%s: %s>)r1   r    r   )r   r   r   r   rr   W  s    zBoundMethod.__repr__)N)r    r!   r"   r   r>   r`   rr   rv   r   r   )r1   r   rg   :  s   

rg   c                   s(   e Zd Z fddZ fddZ  ZS )r   c                s"   t t| |j|j|j|j d S )N)r-   r   r   r)   Zaccess_handler0   r&   )r   rq   )r1   r   r   r   \  s    
zCompiledBoundMethod.__init__c                s   t tt|  dd  S )Nr%   )r(   r-   r   get_param_names)r   )r1   r   r   r   `  s    z#CompiledBoundMethod.get_param_names)r    r!   r"   r   r   rv   r   r   )r1   r   r   [  s   r   c               @   s$   e Zd ZdZdd Zedd ZdS )SelfNamez9
    This name calculates the parent_context lazily.
    c             C   s   || _ || _|| _d S )N)r   r.   re   )r   r   r.   re   r   r   r   r   h  s    zSelfName.__init__c             C   s   | j | j| jS )N)r   rm   r.   re   )r   r   r   r   r0   m  s    zSelfName.parent_contextN)r    r!   r"   rs   r   ru   r0   r   r   r   r   r   d  s   r   c               @   s(   e Zd Zdd Zedd Zdd ZdS )rc   c             C   s   || _ || _|| _d S )N)r   r.   r   )r   r   r.   Zclass_member_namer   r   r   r   s  s    zLazyInstanceClassName.__init__c             c   sR   xL| j  D ]>}t|tr.t| j| j|V  qxt|| jD ]
}|V  q<W qW d S )N)r   r   rH   r   rg   r   r.   r   )r   r   cr   r   r   r   x  s
    
zLazyInstanceClassName.inferc             C   s   t | j|S )N)getattrr   )r   r6   r   r   r   __getattr__  s    z!LazyInstanceClassName.__getattr__N)r    r!   r"   r   r
   r   r   r   r   r   r   rc   r  s   rc   c               @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )rN   z
    This filter is special in that it uses the class filter and wraps the
    resulting names in LazyINstanceClassName. The idea is that the class name
    filtering can be very flexible and always be reflected in instances.
    c             C   s&   || _ || _t|jd|dd| _d S )NFT)rO   rP   r   )r   _class_contextrY   rA   r   )r   r)   contextr.   rP   r   r   r   r     s    zInstanceClassFilter.__init__c             C   s   |  | j|S )N)r   r   rB   )r   r6   r   r   r   rB     s    zInstanceClassFilter.getc             C   s   |  | j S )N)r   r   r   )r   r   r   r   r     s    zInstanceClassFilter.valuesc                s    fdd|D S )Nc                s   g | ]}t  j j|qS r   )rc   r   r   )r5   r   )r   r   r   r     s    z0InstanceClassFilter._convert.<locals>.<listcomp>r   )r   r:   r   )r   r   r     s    zInstanceClassFilter._convertN)r    r!   r"   rs   r   rB   r   r   r   r   r   r   rN     s
   	rN   c                   sD   e Zd ZdZeZ fddZdd Zdd Zdd	 Z	d
d Z
  ZS )rL   zU
    This class basically filters all the use cases where `self.*` was assigned.
    c                s$   t t| j||||dd || _d S )NT)r)   r   Znode_contextrP   r   )r-   rL   r   r   )r   r)   r   r.   rP   )r1   r   r   r     s    
zSelfAttributeFilter.__init__c                sN   |  |}t| jtjr$dr$t|S | jj| jj   fdd|D S d S )NFc                s*   g | ]"}|j   k r k rn q|qS r   )	start_pos)r5   r   )endstartr   r   r     s    z/SelfAttributeFilter._filter.<locals>.<listcomp>)_filter_self_namesrH   Z_parser_scoper   rK   r(   r   Zend_pos)r   r:   r   )r   r   r   _filter  s
    
zSelfAttributeFilter._filterc             c   sV   xP|D ]H}|j }|jdkrt|jdkr|jd dkr| r| |r|V  qW d S )NtrailerrX   r   .)rf   rl   r'   ZchildrenZis_definitionZ_access_possible)r   r:   r6   r   r   r   r   r     s    

z&SelfAttributeFilter._filter_self_namesc                s    fdd|D S )Nc                s   g | ]}   j j|qS r   )r   r   r   )r5   r6   )r   r   r   r     s    z6SelfAttributeFilter._convert_names.<locals>.<listcomp>r   )r   r:   r   )r   r   _convert_names  s    z"SelfAttributeFilter._convert_namesc             C   s   |S )Nr   )r   r:   r   r   r   _check_flows  s    z SelfAttributeFilter._check_flows)r    r!   r"   rs   r   r   r   r   r   r   r   rv   r   r   )r1   r   rL     s   
		rL   c                   sN   e Zd Zdd Zedd Zedd Zddd	Zd
d Z fddZ	  Z
S )r   c             C   s   || _ || _d S )N)r   	_var_args)r   r   r/   r   r   r   r     s    zInstanceArguments.__init__c             C   s   | j jS )N)r   argument_node)r   r   r   r   r     s    zInstanceArguments.argument_nodec             C   s   | j jS )N)r   r   )r   r   r   r   r     s    zInstanceArguments.trailerNc             c   s0   d t | jfV  x| j|D ]
}|V  qW d S )N)r   r   r   r|   )r   rq   r   r   r   r   r|     s    zInstanceArguments.unpackc             C   s
   | j  S )N)r   get_calling_nodes)r   r   r   r   r     s    z#InstanceArguments.get_calling_nodesc                s(   t | jtr| j|S tt| |S )N)rH   r   r#   r+   r-   r   )r   r*   )r1   r   r   r+     s    z%InstanceArguments.get_executed_params)N)r    r!   r"   r   ru   r   r   r|   r   r+   rv   r   r   )r1   r   r     s   
r   N)5abcr   Zjedir   r   Zjedi.evaluater   r   Zjedi.evaluate.base_contextr   r   r	   r
   Zjedi.evaluate.lazy_contextr   r   Zjedi.evaluate.cacher   Zjedi.evaluate.argumentsr   r   Zjedi.evaluate.context.functionr   r   r   Zjedi.evaluate.context.klassr   r   r   Zjedi.evaluate.contextr   Zjedi.parser_utilsr   objectr   r#   r,   rw   r   r   ZCompiledNamer   ZAbstractFilterrM   rg   rK   r   ZTreeNameDefinitionr   rc   rN   rL   r   r   r   r   r   <module>   s8    ' 
!	)