U
    nufS                     @   s  d Z ddl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 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 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& G dd 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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/d%d&d'd(d&d)Z0d*d+ Z1d,d- Z2d.d/ Z3d0d1 Z4e3e d2d3 Z5dS )4z$
Imitate the parser representation.
    N)partial)	Parameter)Path)Optional)debug)to_list)memoize_method)AbstractFilter)AbstractNameDefinitionValueNameMixinParamNameInterface)ValueValueSet	NO_VALUES)LazyKnownValue)	_sentinel)inference_state_function_cache)reraise_getitem_errors)BuiltinSignature)CompiledContextCompiledModuleContextc                   @   s*   e Zd ZdZd	ddZdd Zdd ZdS )
CheckAttributezARaises :exc:`AttributeError` if the attribute X is not available.Nc                 C   s
   || _ d S N)
check_name)selfr    r   A/tmp/pip-unpacked-wheel-ol4ehs9f/jedi/inference/compiled/value.py__init__   s    zCheckAttribute.__init__c                 C   s$   || _ | jd kr |jdd  | _| S )N   )funcr   __name__)r   r   r   r   r   __call__   s    
zCheckAttribute.__call__c                 C   s&   |d kr| S |j | j t| j|S r   )access_handlegetattr_pathsr   r   r   )r   instanceownerr   r   r   __get__%   s    zCheckAttribute.__get__)N)r    
__module____qualname____doc__r   r!   r&   r   r   r   r   r      s   
r   c                       s~  e Zd ZdL fdd	Z fddZe dd Ze dd	 Ze d
d Zdd Z	d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ed$d% Zed&d' ZdMd)d*Zed+d, Z fd-d.Z fd/d0ZdN fd1d2	Zd3d4 Zed5d6 Z d7d8 Z!e"fd9d:Z#d;d< Z$ fd=d>Z%d?d@ Z&dAdB Z'dCdD Z(edEdF Z)dGdH Z*dOdJdKZ+  Z,S )PCompiledValueNc                    s   t  || || _d S r   )superr   r"   )r   inference_stater"   parent_context	__class__r   r   r   /   s    zCompiledValue.__init__c                    s   | j  }|d k	r"t| j| S z| j d W n  tk
rR   t | Y S X | j 	 rddl
m} t|| j| j| |gS t| |S d S )Nr!   r   )CompiledInstance)r"   Zget_return_annotationcreate_from_access_pathr,   execute_annotationr#   AttributeErrorr+   
py__call__is_classZjedi.inference.valuer0   r   r-   _execute_function)r   	argumentsreturn_annotationr0   r.   r   r   r4   3   s     

zCompiledValue.py__call__c                 C   s   t | j| j S r   )r1   r,   r"   py__class__r   r   r   r   r9   H   s    zCompiledValue.py__class__c                    s"    ft  fdd j D  S )Nc                 3   s   | ]}t  j|V  qd S r   r1   r,   .0accessr:   r   r   	<genexpr>N   s   z*CompiledValue.py__mro__.<locals>.<genexpr>)tupler"   Zpy__mro__accessesr:   r   r:   r   	py__mro__L   s    zCompiledValue.py__mro__c                    s   t  fdd j D S )Nc                 3   s   | ]}t  j|V  qd S r   r;   r<   r:   r   r   r?   U   s   z,CompiledValue.py__bases__.<locals>.<genexpr>)r@   r"   py__bases__r:   r   r:   r   rB   S   s    zCompiledValue.py__bases__c                 C   s
   | j  S r   )r"   get_qualified_namesr:   r   r   r   rC   Z   s    z!CompiledValue.get_qualified_namesc                 C   s
   | j  S r   )r"   
py__bool__r:   r   r   r   rD   ]   s    zCompiledValue.py__bool__c                 C   s
   | j  S r   )r"   r5   r:   r   r   r   r5   `   s    zCompiledValue.is_classc                 C   s
   | j  S r   )r"   is_functionr:   r   r   r   rE   c   s    zCompiledValue.is_functionc                 C   s
   | j  S r   )r"   	is_moduler:   r   r   r   rF   f   s    zCompiledValue.is_modulec                 C   s   dS )NTr   r:   r   r   r   is_compiledi   s    zCompiledValue.is_compiledc                 C   s   dS )NFr   r:   r   r   r   is_stubl   s    zCompiledValue.is_stubc                 C   s
   | j  S r   )r"   is_instancer:   r   r   r   rI   o   s    zCompiledValue.is_instancec                 C   s
   | j  S r   )r"   	py__doc__r:   r   r   r   rJ   r   s    zCompiledValue.py__doc__c           
      c   s   z| j  }W nv tk
r   |  \}}|s4g }n
|d}| j  rT|dd |D ]&}| d\}}}t	| ||V  qXY nX |D ]}	t
| |	V  qd S )N,r   r   =)r"   Zget_signature_params
ValueError_parse_function_docsplitismethoddescriptorinsertstrip	partitionUnresolvableParamNameSignatureParamName)
r   Zsignature_paramsZ
params_strrettokenspname_defaultsignature_paramr   r   r   get_param_namesu   s    

zCompiledValue.get_param_namesc                 C   s   |   \}}t| |gS r   )rN   r   )r   rZ   Zreturn_stringr   r   r   get_signatures   s    zCompiledValue.get_signaturesc                 C   s   d| j j| j f S Nz<%s: %s>)r/   r    r"   get_reprr:   r   r   r   __repr__   s    zCompiledValue.__repr__c                 C   s   |   }|d krdS t|S )N) rb   )rJ   rN   )r   docr   r   r   rN      s    z!CompiledValue._parse_function_docc                 C   s
   | j  S r   )r"   Zget_api_typer:   r   r   r   api_type   s    zCompiledValue.api_typeFc                 c   s   |  |V  d S r   )_ensure_one_filter)r   rI   Zorigin_scoper   r   r   get_filters   s    zCompiledValue.get_filtersc                 C   s   t | j| |S r   )CompiledValueFilterr,   )r   rI   r   r   r   re      s    z CompiledValue._ensure_one_filterc              
      s   t tttN z| jj|| jj d}W n, tk
rT   t	 | Y W  5 Q R  S X W 5 Q R X |d krtt	 |S t
t| j|gS N)safe)r   
IndexErrorKeyError	TypeErrorr"   py__simple_getitem__r,   allow_unsafe_executionsr3   r+   r   r1   )r   indexr>   r.   r   r   rm      s    
(z"CompiledValue.py__simple_getitem__c                    s6    j  }|d kr t ||S t fdd|D S )Nc                 3   s   | ]}t  j|V  qd S r   r;   r<   r:   r   r   r?      s   z.CompiledValue.py__getitem__.<locals>.<genexpr>)r"   Zpy__getitem__all_valuesr+   py__getitem__r   )r   Zindex_value_setcontextualized_nodeZall_access_pathsr.   r:   r   rp      s    
zCompiledValue.py__getitem__c                 #   sR   | j  st |E d H  | j  }|d kr2d S |D ]}tt| j|V  q6d S r   )r"   Zhas_iterr+   
py__iter__Zpy__iter__listr   r1   r,   )r   rq   Zaccess_path_listr>   r.   r   r   rr      s    

zCompiledValue.py__iter__c                 C   s
   | j  S r   )r"   
py__name__r:   r   r   r   rs      s    zCompiledValue.py__name__c                 C   s$   |   }|d kr| j }t| |S r   )rs   r"   r`   CompiledValueNamer   rY   r   r   r   rY      s    
zCompiledValue.namec              	   c   s   ddl m} ddlm} | jdkr&d S |  d  D ]R}z| jjj	
| W n tk
rf   Y q6Y q6X || j|}| j||E d H  q6|| E d H  d S )Nr   )
docstringsbuiltin_from_namefunction   )Zjedi.inferencerv   jedi.inference.compiledrx   rd   rN   rO   r,   builtins_moduler"   r#   r3   executeZinfer_return_types)r   paramsrv   rx   rY   Zbltn_objr   r   r   r6      s    

zCompiledValue._execute_functionc                 C   s4   z| j  W S  tk
r.   |tkr& | Y S X d S r   )r"   get_safe_valuerM   r   )r   r[   r   r   r   r      s    zCompiledValue.get_safe_valuec                 C   s>   z t t| j| j|j|gW S  tk
r8   t Y S X d S r   )r   r1   r,   r"   execute_operationrl   r   )r   otheroperatorr   r   r   r      s    
zCompiledValue.execute_operationc                    s   j  dkrtgS j  \}}fdd|D  |dkrTtdd  D S |r|t fddjj|D  S t	  S )NNonec                    s   g | ]}t t j|gqS r   )r   r1   r,   )r=   pathr:   r   r   
<listcomp>   s   z4CompiledValue.execute_annotation.<locals>.<listcomp>Unionc                 s   s   | ]}|  V  qd S r   )r2   )r=   argr   r   r   r?      s     z3CompiledValue.execute_annotation.<locals>.<genexpr>c                    s   g | ]}|  qS r   )Zwith_genericsr=   v)r7   r   r   r     s   )
r"   r`   r   Zget_annotation_name_and_argsZ	from_setsr,   Ztyping_moduleZpy__getattribute__r2   r+   )r   rY   argsr.   )r7   r   r   r2      s    

z CompiledValue.execute_annotationc                 C   s   t | j| j S r   )r1   r,   r"   negater:   r   r   r   r   
  s    zCompiledValue.negatec                 C   s   t S r   r   r:   r   r   r   get_metaclasses  s    zCompiledValue.get_metaclassesc                 C   s   t | S r   )r   r:   r   r   r   _as_context  s    zCompiledValue._as_contextc                 C   s
   | j  S r   )r"   Zget_array_typer:   r   r   r   
array_type  s    zCompiledValue.array_typec                    s    fdd j  D S )Nc                    s   g | ]}t  j|qS r   r;   )r=   kr:   r   r   r     s   z0CompiledValue.get_key_values.<locals>.<listcomp>)r"   Zget_key_pathsr:   r   r:   r   get_key_values  s    
zCompiledValue.get_key_valuesTc                 C   s   | j  dkrdS d S )N)r   z<class 'NoneType'>r   )r"   r`   )r   Zadd_class_infor   r   r   get_type_hint  s    zCompiledValue.get_type_hint)N)FN)N)T)-r    r'   r(   r   r4   r   r9   rA   rB   rC   rD   r5   rE   rF   rG   rH   rI   rJ   r   r]   r^   ra   r   rN   propertyrd   rf   re   rm   rp   rr   rs   rY   r6   r   r   r   r2   r   r   r   r   r   r   __classcell__r   r   r.   r   r*   .   sZ   








	
r*   c                   @   sF   e Zd ZdZdd Zdd Zdd Zedd	 Ze	e
 d
ddZdS )CompiledModuleNc                 C   s   t | S r   )r   r:   r   r   r   r   &  s    zCompiledModule._as_contextc                 C   s
   | j  S r   )r"   
py__path__r:   r   r   r   r   )  s    zCompiledModule.py__path__c                 C   s   |   d k	S r   )r   r:   r   r   r   
is_package,  s    zCompiledModule.is_packagec                 C   s"   |   }|d krdS t|dS )Nr   .)rs   r@   rO   ru   r   r   r   string_names/  s    zCompiledModule.string_names)returnc                 C   s
   | j  S r   )r"   
py__file__r:   r   r   r   r   7  s    zCompiledModule.py__file__)r    r'   r(   Zfile_ior   r   r   r   r   r   r   r   r   r   r   r   r   #  s   
r   c                   @   sT   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zedd Z	dd Z
edd ZdS )CompiledNamec                 C   s&   || _ | | _|| _|| _|| _d S r   )_inference_state
as_contextr-   _parent_valuestring_nameis_descriptor)r   r,   Zparent_valuerY   r   r   r   r   r   <  s
    
zCompiledName.__init__c                 C   s   |    S r   )infer_compiled_valuerJ   r:   r   r   r   rJ   C  s    zCompiledName.py__doc__c                 C   s"   | j  }|d krd S || jf S r   )r-   rC   r   )r   Zparent_qualified_namesr   r   r   _get_qualified_namesF  s    
z!CompiledName._get_qualified_namesc                 C   s$   | j }| s| r | j  S d S r   )r-   rF   r5   	get_value)r   contextr   r   r   get_defining_qualified_valueL  s    
z)CompiledName.get_defining_qualified_valuec                 C   s:   z| j j}W n tk
r$   d }Y nX d| jj|| jf S )Nz<%s: (%s).%s>)r-   rY   r3   r/   r    r   ru   r   r   r   ra   S  s
    
zCompiledName.__repr__c                 C   s   | j r
dS |  jS )Nr$   )r   r   rd   r:   r   r   r   rd   Z  s    zCompiledName.api_typec                 C   s   t |  gS r   )r   r   r:   r   r   r   inferc  s    zCompiledName.inferc                 C   s   t | j| j| jS r   )create_from_namer   r   r   r:   r   r   r   r   f  s    z!CompiledName.infer_compiled_valueN)r    r'   r(   r   rJ   r   r   ra   r   rd   r   r   r   r   r   r   r   r   ;  s   
r   c                   @   s8   e Zd Zdd Zedd Zdd Zdd Zd	d
 ZdS )rU   c                 C   s   |j | _ || _d S r   )r-   _signature_param)r   compiled_valuer\   r   r   r   r   l  s    zSignatureParamName.__init__c                 C   s   | j jS r   )r   rY   r:   r   r   r   r   p  s    zSignatureParamName.string_namec                 C   sB   |   | j }| jjr&|d| jj 7 }| jjr>|d| jj 7 }|S )Nz: rL   )Z_kind_stringr   r   has_annotationZannotation_stringhas_defaultZdefault_string)r   sr   r   r   	to_stringt  s    zSignatureParamName.to_stringc                 C   s   t t| jjS r   )getattrr   r   Z	kind_namer:   r   r   r   get_kind|  s    zSignatureParamName.get_kindc                 C   sL   | j }| jj}t}|jr*tt||jg}|jrHt||j	}||
 O }|S r   )r   r-   r,   r   r   r   r1   r[   r   
annotationZexecute_with_values)r   rX   r,   valuesr   r   r   r   r     s    zSignatureParamName.inferN)	r    r'   r(   r   r   r   r   r   r   r   r   r   r   rU   k  s   
rU   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
rT   c                 C   s   |j | _ || _|| _d S r   )r-   r   _default)r   r   rY   r[   r   r   r   r     s    zUnresolvableParamName.__init__c                 C   s   t jS r   )r   POSITIONAL_ONLYr:   r   r   r   r     s    zUnresolvableParamName.get_kindc                 C   s   | j }| jr|d| j 7 }|S )NrL   )r   r   )r   stringr   r   r   r     s    zUnresolvableParamName.to_stringc                 C   s   t S r   r   r:   r   r   r   r     s    zUnresolvableParamName.inferN)r    r'   r(   r   r   r   r   r   r   r   r   rT     s   rT   c                   @   s   e Zd Zdd ZdS )rt   c                 C   s   || _ || _|j| _d S r   )r   _valuer-   )r   valuerY   r   r   r   r     s    zCompiledValueName.__init__N)r    r'   r(   r   r   r   r   r   rt     s   rt   c                   @   s    e Zd ZdZdd Zdd ZdS )EmptyCompiledNamez
    Accessing some names will raise an exception. To avoid not having any
    completions, just give Jedi the option to return this object. It infers to
    nothing.
    c                 C   s   |j | _|| _d S r   )r|   r-   r   )r   r,   rY   r   r   r   r     s    zEmptyCompiledName.__init__c                 C   s   t S r   r   r:   r   r   r   r     s    zEmptyCompiledName.inferN)r    r'   r(   r)   r   r   r   r   r   r   r     s   r   c                   @   sT   e Zd ZdddZdd ZdddZedddd	d
Zdd Zdd Z	dd Z
dS )rg   Fc                 C   s   || _ || _|| _d S r   )r   r   rI   )r   r,   r   rI   r   r   r   r     s    zCompiledValueFilter.__init__c                    s6   | j j | jj | j| fdd fddddS )Nc                    s    j | dS rh   )Zis_allowed_getattrrY   r"   ri   r   r   <lambda>      z)CompiledValueFilter.get.<locals>.<lambda>c                    s   |    kS r   )dirr   )r"   r   r   r     r   T)check_has_attribute)r   r"   r   rn   _getru   r   r   r   get  s    

zCompiledValueFilter.getc           	         s   | \}}}|dk	r<t | j| }|r< fdd|D S |rH|sHg S |sP|sh| jjsh| j ddgS | jrz| szg S | j |dgS )zU
        To remove quite a few access calls we introduced the callback here.
        Nc                    s   g | ]}t | qS r   )rt   r   r   r   r   r     s     z,CompiledValueFilter._get.<locals>.<listcomp>T)is_emptyr   )r1   r   r2   rn   _get_cached_namerI   )	r   rY   Zallowed_getattr_callbackZin_dir_callbackr   Zhas_attributer   Zproperty_return_annotationr   r   r   r   r     s&    
zCompiledValueFilter._getr   c                C   s"   |rt | j|S | j||dS d S )Nr   )r   r   _create_name)r   rY   r   r   r   r   r   r     s    z$CompiledValueFilter._get_cached_namec              	      s|   ddl m} g }| jj \}  D ]&}|| | fdd fdd7 }q$| jsx|rx|| jd D ]}||	 7 }qf|S )Nr   rw   c                    s    |  S r   r   r   Z	dir_infosr   r   r     r   z,CompiledValueFilter.values.<locals>.<lambda>c                    s   |  kS r   r   r   r   r   r   r     r   type)
r{   rx   r   r"   Zget_dir_infosr   rI   r   rf   r   )r   rx   namesZneeds_type_completionsrY   filterr   r   r   r     s    


zCompiledValueFilter.valuesc                 C   s   t | j| j||S r   )r   r   r   )r   rY   r   r   r   r   r     s    z CompiledValueFilter._create_namec                 C   s   d| j j| jf S r_   )r/   r    r   r:   r   r   r   ra     s    zCompiledValueFilter.__repr__N)F)F)F)r    r'   r(   r   r   r   r   r   r   r   ra   r   r   r   r   rg     s   


rg   floatstrintdict)zfloating point number	characterinteger
dictionaryr   c              	   C   sD  zrd}|  d}t| |d D ]>\}}|dkr:|d7 }n|dkrJ|d8 }|dkr || } q`q | |d | }W n* ttfk
r   td d}d}Y n(X dd	 }td
||\}}|dkrqq|dd}t	d| ||d  }	|	dkrd}
nF||	
  }td}|| |d }tdd|}t||}
||
fS )z
    Takes a function and returns the params and return value as a tuple.
    This is nothing more than a docstring parser.

    TODO docstrings like utime(path, (atime, mtime)) and a(b [, b]) -> None
    TODO docstrings like 'tuple of integers'
    r   (Nrz   )zno brackets found - no paramrb   c                 S   sH   |  dd}t|D ]$\}}|rd|kr||  d7  < qd|S )Nrz   rK   rL   z=None)grouprO   	enumeratejoin)mr   iar   r   r   change_options,  s
    z+_parse_function_doc.<locals>.change_optionsz ?\[([^\[\]]+)\]-rZ   z-[>-]*    z(,\n|[^\n-])+z[nN]ew (.*)z\1())ro   r   rM   UnboundLocalErrorr   Zdbgresubnreplacesearchendcompilematchr   rR   subdocstr_defaultsr   )rc   countstartr   r   r   Z	param_strr   changesrrV   ro   patternZret_strr   r   r   rN     sB    	



 
rN   c                 C   s@   |j j|d d}d }|D ]"}t| ||d kr.d n| d}q|S )N)r[   r-   )r"   r#   create_cached_compiled_valuer   )r,   r   rY   Zaccess_pathsr   access_pathr   r   r   r   K  s    r   c                    s   d fdd	}|S )z5The cache doesn't care about keyword vs. normal args.Nc                    s    | ||S r   r   )r,   objr-   r   r   r   wrapperZ  s    z'_normalize_create_args.<locals>.wrapper)Nr   )r   r   r   r   r   _normalize_create_argsX  s    r   c                 C   s6   d }|j D ]&\}}t| ||d kr$d n| d}q
|S )Nr   )Zaccessesr   r   )r,   r   r   rY   r>   r   r   r   r1   _  s    r1   c                 C   s,   t |trt|d krt}nt}|| ||S r   )
isinstancer*   AssertionErrorr   )r,   r"   r-   clsr   r   r   r   j  s
    r   )6r)   r   	functoolsr   inspectr   pathlibr   typingr   Zjedir   Zjedi.inference.utilsr   Z
jedi.cacher   Zjedi.inference.filtersr	   Zjedi.inference.namesr
   r   r   Zjedi.inference.base_valuer   r   r   Zjedi.inference.lazy_valuer   Zjedi.inference.compiled.accessr   Zjedi.inference.cacher   Zjedi.inference.helpersr   Zjedi.inference.signaturer   Zjedi.inference.contextr   r   r   r*   r   r   rU   rT   rt   r   rg   r   rN   r   r   r1   r   r   r   r   r   <module>   sP    v0 T	<