B
    7r\<                 @   s$  d dl Z d dlZd dlZd dlmZ d dl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 eejZejejejejejejejejejejej efZ!ere!ej"ej#ej$f7 Z!eejZee%j&Z'ej(d )e*Z+ee+d Z,dd	 Z-e* Z.ej/ej0ej1ej2ej3ej4ej5ej6d
Z7ej8ej9dZ:e:;e7 ejejejee'e,e<e=fZ>e.fddZ?eddZ@dd ZAdd ZBdd ZCG dd de*ZDdd ZEdd ZFG dd de*ZGdd ZHed kreIeJed!d"d# eKL ZMndZKdZMed$kreIeJed%d"d# ndZNG d&d' d'e*ZOd(d) ZPdS )*    N)dedent)
namedtuple)unicodeis_py3builtins
py_versionforce_unicodeprint_to_stderr)getattr_static__dict____subclasshook__c             c   s   dV  | V  dS )z0Used to have an object to return for generators.*   N )Zfoor   r   <lib/python3.7/site-packages/jedi/evaluate/compiled/access.py_a_generator.   s    r   )z==z!=iszis not<z<=>z>=)+-c             C   sL   yt | |\}}W n tk
r0   |tkr, |S X t|tkrHt| |S |S )N)r
   AttributeError	_sentineltypeALLOWED_DESCRIPTOR_ACCESSgetattr)objnamedefaultattris_get_descriptorr   r   r   safe_getattrT   s    
r    SignatureParamz<name has_default default has_annotation annotation kind_namec                s    fdd}|S )Nc                s   d fdd	}|S )z
        This decorator caches just the ids, oopposed to caching the object itself.
        Caching the id has the advantage that an object doesn't need to be
        hashable.
        Nc                sn   t |  }t|}y||  || d S  tk
rh    dkrL| ||}n
| |}|||f||< |S X d S )Nr   Zmixed_cache)r   idKeyError)	evaluatorr   Zparent_contextcachekeyresult)attribute_namefuncr   r   wrapperp   s    

z:compiled_objects_cache.<locals>.decorator.<locals>.wrapper)Nr   )r)   r*   )r(   )r)   r   	decoratorj   s    z)compiled_objects_cache.<locals>.decoratorr   )r(   r+   r   )r(   r   compiled_objects_cachei   s    r,   c             C   s   | j |S )N)Zcompiled_subprocessZget_or_create_access_handle)r$   r   r   r   r   create_access   s    r-   c             C   s   t j| }t _z`yt| W nN tk
r@   td||f  d S  tk
rj   dd l}td|   d S X W d |t _X t j| }t	| |S )Nz$Module %s not importable in path %s.r   zCannot import:
%s)
syspath
__import__ImportErrorr	   	Exception	traceback
format_excmodulescreate_access_path)r$   Zdotted_nameZsys_pathZtempr3   moduler   r   r   load_module   s    

r8   c               @   s$   e Zd Zdd Zdd Zdd ZdS )
AccessPathc             C   s
   || _ d S )N)accesses)selfr:   r   r   r   __init__   s    zAccessPath.__init__c             C   s   | j S )N)r:   )r;   r   r   r   __getstate__   s    zAccessPath.__getstate__c             C   s
   || _ d S )N)r:   )r;   valuer   r   r   __setstate__   s    zAccessPath.__setstate__N)__name__
__module____qualname__r<   r=   r?   r   r   r   r   r9      s   r9   c             C   s   t | |}t| S )N)r-   r9   get_access_path_tuples)r$   r   accessr   r   r   r6      s    
r6   c                s    fddS )Nc                 s   t  | |S )N)r   )argskwargs)r)   r   r   <lambda>   s    z*_force_unicode_decorator.<locals>.<lambda>r   )r)   r   )r)   r   _force_unicode_decorator   s    rH   c               @   s  e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdCddZ	dd Z
dd Zdd Zdd Zdd Z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efd*d+Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Z d:d; Z!d<d= Z"d>d? Z#d@dA Z$dBS )DDirectObjectAccessc             C   s   || _ || _d S )N)
_evaluator_obj)r;   r$   r   r   r   r   r<      s    zDirectObjectAccess.__init__c             C   s   d| j j|  f S )Nz%s(%s))	__class__r@   get_repr)r;   r   r   r   __repr__   s    zDirectObjectAccess.__repr__c             C   s   t | j|S )N)r-   rJ   )r;   r   r   r   r   _create_access   s    z!DirectObjectAccess._create_accessc             C   s   t | j|S )N)r6   rJ   )r;   r   r   r   r   _create_access_path   s    z&DirectObjectAccess._create_access_pathc             C   s
   t | jS )N)boolrK   )r;   r   r   r   
py__bool__   s    zDirectObjectAccess.py__bool__c             C   s"   y| j jS  tk
r   d S X d S )N)rK   __file__r   )r;   r   r   r   
py__file__   s    zDirectObjectAccess.py__file__Fc             C   s   t t| jpdS )N )r   inspectZgetdocrK   )r;   Zinclude_call_signaturer   r   r   	py__doc__   s    zDirectObjectAccess.py__doc__c             C   sd   t | jrt| jr| j}n"y| jj}W n tk
r>   d S X y
t|jS  tk
r^   d S X d S )N)_is_class_instancerK   rV   ismethoddescriptorrL   r   r   r@   )r;   clsr   r   r   
py__name__   s    

zDirectObjectAccess.py__name__c                s"   t  fdd jjdd  D S )Nc             3   s   | ]}  |V  qd S )N)rP   ).0rZ   )r;   r   r   	<genexpr>   s    z7DirectObjectAccess.py__mro__accesses.<locals>.<genexpr>   )tuplerK   __mro__)r;   r   )r;   r   py__mro__accesses   s    z$DirectObjectAccess.py__mro__accessesc             C   s0   t | jtttttttfkr d S | 	| j| S )N)
r   rK   strlistr_   r   bytes	bytearraydictrP   )r;   indexr   r   r   py__getitem__   s    z DirectObjectAccess.py__getitem__c             C   sZ   t | jtttttttfkr g S g }x0t	| jD ]"\}}|dkrBP |
| | q0W |S )N   )r   rK   rb   rc   r_   r   rd   re   rf   	enumerateappendrP   )r;   Zlstipartr   r   r   py__iter__list   s    z!DirectObjectAccess.py__iter__listc             C   s   |  | jjS )N)rP   rK   rL   )r;   r   r   r   py__class__   s    zDirectObjectAccess.py__class__c                s    fdd j jD S )Nc                s   g | ]}  |qS r   )rP   )r\   base)r;   r   r   
<listcomp>   s    z2DirectObjectAccess.py__bases__.<locals>.<listcomp>)rK   	__bases__)r;   r   )r;   r   py__bases__   s    zDirectObjectAccess.py__bases__c             C   s   | j jS )N)rK   __path__)r;   r   r   r   
py__path__   s    zDirectObjectAccess.py__path__c             C   s~   d}t | jrt| jS t| jddd|kr8t| jS t| j}|tkrVt| jS t|ddd|krrt| jS t| jS )N)r   Z__builtin__rA   rU   )r   )rV   ismodulerK   reprr    r   rN   object)r;   r   Ztype_r   r   r   rM     s    



zDirectObjectAccess.get_reprc             C   s   t | jS )N)rV   isclassrK   )r;   r   r   r   is_class  s    zDirectObjectAccess.is_classc             C   s   t | jS )N)rV   rY   rK   )r;   r   r   r   rY     s    z%DirectObjectAccess.ismethoddescriptorc             C   s   t ttt| jS )N)rc   mapr   dirrK   )r;   r   r   r   r|     s    zDirectObjectAccess.dirc             C   s(   yt | j dS  tk
r"   dS X d S )NTF)iterrK   	TypeError)r;   r   r   r   has_iter  s
    
zDirectObjectAccess.has_iterc             C   sB   yt | j|\}}W n tk
r(   dS X |r>t|tkr>dS dS )N)FF)TT)TF)r
   rK   r   r   r   )r;   r   r   r   r   r   r   is_allowed_getattr%  s    z%DirectObjectAccess.is_allowed_getattrc             C   s<   y|  t| j|S  tk
r6   |tkr, |  |S X d S )N)rO   r   rK   r   r   )r;   r   r   r   r   r   r   2  s    zDirectObjectAccess.getattrc             C   s8   t | jtttttttfkr"| jS t	dt | j d S )Nz Object is type %s and not simple)
r   rK   rQ   rd   floatintrb   r   slice
ValueError)r;   r   r   r   get_safe_value=  s    z!DirectObjectAccess.get_safe_valuec             C   sP   | j }|  rdS t|r dS t|sHt|sHt|sHt|rLdS dS )Nclassr7   Zfunctioninstance)rK   rz   rV   rv   Z	isbuiltinZismethodrY   Z
isfunction)r;   r   r   r   r   get_api_typeB  s    
zDirectObjectAccess.get_api_typec                s$    fdd   D }dd |D S )Nc                s   g | ]}t  j|qS r   )r-   rJ   )r\   o)r;   r   r   rq   O  s    z=DirectObjectAccess.get_access_path_tuples.<locals>.<listcomp>c             S   s   g | ]}|  |fqS r   )r[   )r\   rD   r   r   r   rq   P  s    )_get_objects_path)r;   r:   r   )r;   r   rC   N  s    z)DirectObjectAccess.get_access_path_tuplesc                s    fdd}t tt | S )Nc              3   s    j } | V  y
| j} W n tk
r*   Y nX | V  y
| j}W n$ tk
r`   t| s\tV  Y n>X |d krrtV  n,ytj| V  W n t	k
r   tV  Y nX d S )N)
rK   __objclass__r   rA   rV   rv   r   r.   r5   r#   )r   Zimp_plz)r;   r   r   getS  s$    


z1DirectObjectAccess._get_objects_path.<locals>.get)rc   reversed)r;   r   r   )r;   r   r   R  s    z$DirectObjectAccess._get_objects_pathc             C   s"   |j }t| }| || j|jS )N)rD   
_OPERATORSrP   rK   )r;   Zother_access_handleoperatorZother_accessopr   r   r   execute_operationr  s    z$DirectObjectAccess.execute_operationc             C   s   t | jo| jtkS )N)rV   ry   rK   r   )r;   r   r   r   needs_type_completionsw  s    z)DirectObjectAccess.needs_type_completionsc          	      s    j }tdk rtdtdkrftj}t|rf|t|dsf|t|dsf|jtjksb|j	tj	krftyt
|}W n ttfk
r   tY nX  fdd|j D S )N!   z'inspect.signature was introduced in 3.3"   r<   __new__c          
      sH   g | ]@}t |j|j|jk	 |j|j|jk	 |jt|jd qS ))r   Zhas_defaultr   Zhas_annotation
annotationZ	kind_name)r!   r   r   emptyrP   r   rb   Zkind)r\   p)r;   r   r   rq     s   z;DirectObjectAccess.get_signature_params.<locals>.<listcomp>)rK   r   r   rV   Z"_signature_get_user_defined_methodry   r   r<   rx   r   	signatureRuntimeErrorr~   Z
parametersvalues)r;   r   Zuser_defr   r   )r;   r   get_signature_paramsz  s"    


z'DirectObjectAccess.get_signature_paramsc             C   s   |  | j S )N)rP   rK   )r;   r   r   r   negate  s    zDirectObjectAccess.negatec                s    fdd j  D S )Nc                s   g | ]}  |qS r   )rP   )r\   v)r;   r   r   rq     s    z2DirectObjectAccess.dict_values.<locals>.<listcomp>)rK   r   )r;   r   )r;   r   dict_values  s    zDirectObjectAccess.dict_valuesc             C   s   t || jS )N)
issubclassrK   )r;   Z	exceptionr   r   r   is_super_class  s    z!DirectObjectAccess.is_super_classc                s&   t  fdd  D }  |fS )zw
        Used to return a couple of infos that are needed when accessing the sub
        objects of an objects
        c             3   s    | ]}t | |fV  qd S )N)r   r   )r\   r   )r;   r   r   r]     s   z3DirectObjectAccess.get_dir_infos.<locals>.<genexpr>)rf   r|   r   )r;   Ztuplesr   )r;   r   get_dir_infos  s    
z DirectObjectAccess.get_dir_infosN)F)%r@   rA   rB   r<   rN   rO   rP   rR   rT   rW   r[   ra   rh   rn   ro   rs   ru   rH   rM   rz   rY   r|   r   r   r   r   r   r   rC   r   r   r   r   r   r   r   r   r   r   r   r   rI      s@   
 &rI   c             C   s8   y
| j }W n tk
r   dS X |tko2t|t S dS )zLike inspect.* methods.FN)rL   r   r   r   NOT_CLASS_TYPES)r   rZ   r   r   r   rX     s
    
rX   #   z
        async def _coroutine(): pass
        _coroutine = _coroutine()
        CoroutineType = type(_coroutine)
        _coroutine.close()  # Prevent ResourceWarning
    Zblubexec$   z
        async def _async_generator():
            yield
        _async_generator = _async_generator()
        AsyncGeneratorType = type(_async_generator)
    c               @   s@   e Zd ZejZeeddjZ	ej
ZedZeZeZeZeZdS )_SPECIAL_OBJECTSNg      ?)r@   rA   rB   typesFunctionTypeZFUNCTION_CLASSr   rI   rR   ZBOUND_METHOD_CLASS
ModuleTypeZMODULE_CLASSr   ZGENERATOR_OBJECTr   ZBUILTINS
_coroutineZ	COROUTINE_coroutine_wrapperZCOROUTINE_WRAPPER_async_generatorZASYNC_GENERATORr   r   r   r   r     s   r   c             C   s   t t|}t| |S )N)r   r   r6   )r$   Z
identifierr   r   r   r   get_special_object  s    
r   )QrV   r   r.   textwrapr   r   r   collectionsr   Zjedi._compatibilityr   r   r   r   r   r	   Z%jedi.evaluate.compiled.getattr_staticr
   r   rb   replaceMethodDescriptorTypeBuiltinFunctionTypeCodeType	FrameTyper   GeneratorTypeGetSetDescriptorType
LambdaTypeMemberDescriptorType
MethodTyper   TracebackTyper   MappingProxyTypeSimpleNamespaceDynamicClassAttributeset__iter__WrapperDescriptorTyper   __get__rx   Zobject_class_dictClassMethodDescriptorTyper   r   eqneis_is_notltlegtgeZCOMPARISON_OPERATORSaddsubr   updatestaticmethodclassmethodr   r    r!   r,   r-   r8   r9   r6   rH   rI   rX   r   compiler   	__await__r   r   r   r   r   r   r   r   <module>   s    






  



