B
    bg*                 @   s   d dl Z d dl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	Zd
ZdZd-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d/d d!Zd0d"d#Zd$d% Zd&d' Z d1d)d*Z!d2d+d,Z"dS )3    N)python_bytes_to_unicode)dbg)KnownContentFileIOFolderIO)SubModuleName)load_module_from_path)ParserTreeFilter)convert_names)z.toxz.venvz.mypy_cachevenv__pycache__i      c             c   sJ   xD| D ]<}||krqt |ts$|V  |jdkrt| | E d H  qW d S )Nmodule)
isinstancer   api_type_resolve_namesgoto)Zdefinition_namesZavoid_namesnamer   r   8lib/python3.7/site-packages/jedi/inference/references.pyr      s    


r   c             C   s   t dd | D S )Nc             s   s&   | ]}|j d kr|n|j |fV  qd S )N)	tree_name).0nr   r   r   	<genexpr>/   s   z _dictionarize.<locals>.<genexpr>)dict)namesr   r   r   _dictionarize-   s    r   c             C   s   t | |}x2t|D ]&}|tt|g|   ddO }qW |tt||jO }xJt|D ]>}|jdks\|j	d ks\|j	j
jdkrq\|tt|j|jO }q\W tt|S )NF)Z
only_stubsZprefer_stub_to_compiledparamZtrailer)_find_nameslistsetr	   get_root_contextZis_stub_find_global_variablesvaluer   r   parenttype_add_names_in_same_contextparent_contextstring_namer   )module_contextr   found_namesr   r   r   r   _find_defining_names4   s    
r*   c             C   s,   |  |}t| }|| tt|S )N)Zcreate_namer   r   addr   )r(   r   r   r)   r   r   r   r   H   s    

r   c             c   s`   | j d krd S d }xHt| |d}t||}|s4P |E d H  t|dd d}|d j}qW d S )N)r&   until_positionc             S   s   | j S )N)	start_pos)xr   r   r   <lambda>^       z,_add_names_in_same_context.<locals>.<lambda>)keyr   )	tree_noder   r   getsortedr-   )contextr'   r,   Zfilter_r   Zorderedr   r   r   r%   P   s    

r%   c          	   c   s   x|| D ]t}|j d krq| }y
|j}W n tk
r>   wY qX x8| |D ](}|V  ||j }t||jE d H  qNW qW d S )N)r   r    Zget_global_filterAttributeErrorr3   Zcreate_contextr%   r'   )r   search_namer   r(   methodZglobal_namecr   r   r   r!   b   s    


r!   Fc                s  j }|j}zd|_t|}W d d|_X t| g}|sxHtdd |D D ]2}|krP|jd k	rP|jj|	 j
krP|| qPW |stdd |D r|}nt|||}i }	x|D ]ȉxj |g D ]}
tt|
}t fdd|D rZ | xv|D ]J}x |	|g D ]} | qW y
|	|= W n tk
rP   Y nX q
W qx |D ]}|	|g | q`W qW qW   }|rfdd|D S |S )	NFTc             s   s   | ]}|  V  qd S )N)r    )r   dr   r   r   r      s    z"find_references.<locals>.<genexpr>c             s   s   | ]}|j d kV  qdS )r   N)r   )r   r   r   r   r   r      s    c             3   s   | ]}| kV  qd S )Nr   )r   r   )found_names_dctr   r   r      s    c                s   g | ]}|   kr|qS r   )r    )r   r   )r(   r   r   
<listcomp>   s    z#find_references.<locals>.<listcomp>)inference_stater"   Zflow_analysis_enabledr*   r   r   r2   projectpath
py__file__parentsappendany#get_module_contexts_containing_nameZget_used_namesr3   r   updateKeyError
setdefaultvalues)r(   r   Zonly_in_moduleinfr7   r)   module_contextsmZpotential_modulesZnon_matching_reference_mapsZ	name_leafnewZdctr   resultr   )r;   r(   r   find_referencesr   sL    




 rN   c             C   sf   y|  }W n tk
r    d S X t|dd}||s<d S t|j|}t| |}| r^d S | S )Nreplace)errors)	readFileNotFoundErrorr   searchr   r?   r   is_compiledZ
as_context)r=   file_ioregexcodeZnew_file_iorK   r   r   r   	_check_fs   s    

rX   c             C   s   t  }t  }x|  D ]r}|r|dr.q|dd}|dr|dd  }|tjjrj|d d }|	tj
| j| q|	| qW ||fS )N   #zutf-8ignore/   )r   rQ   
splitlines
startswithdecodeendswithosr?   sepr+   join)	folder_iorU   ignored_pathsignored_nameslpr   r   r   r   gitignored_lines   s    
rj   c       	      #   s   t   x|  D ]\}}}xN|D ]F}|j}|jdkrH| krHd |fV  |jdkr"t||\}} |O  q"W  fdd|D |d d < x|D ]} | d fV  qW qW d S )N)z.pyz.pyiz
.gitignorec                s&   g | ]}|j  kr| tkr|qS r   )r?   Zget_base_name_IGNORE_FOLDERS)r   re   )except_pathsr   r   r<      s   
z9recurse_find_python_folders_and_files.<locals>.<listcomp>)r   walkr?   suffixr   rj   )	re   rl   Zroot_folder_ioZ
folder_iosZfile_iosrU   r?   rf   rg   r   )rl   r   %recurse_find_python_folders_and_files   s    





ro   c             c   s*   x$t | |D ]\} }|d k	r|V  qW d S )N)ro   )re   rl   rU   r   r   r   recurse_find_python_files   s    rp   c             #   s   |   }t }dd |D }x|D ]}| j}|d kr:q"| }x`|j t fdd|D rh |krjP x"t||D ]}|j|krv|V  qvW |  | }qDW q"W d S )Nc             S   s   g | ]}|  qS r   )r@   )r   rK   r   r   r   r<      s    z2_find_python_files_in_sys_path.<locals>.<listcomp>c             3   s   | ]}  |V  qd S )N)r_   )r   ri   )r?   r   r   r      s    z1_find_python_files_in_sys_path.<locals>.<genexpr>)	Zget_sys_pathr   Z	get_valuerU   Zget_parent_folderr?   rC   rp   r+   )r=   rJ   Zsys_pathrl   Zyielded_pathsr(   rU   re   r   )r?   r   _find_python_files_in_sys_path   s"    




rq   c             c   s*   dd |D }t t| jj|E d H  d S )Nc             S   s   g | ]}|  qS r   )r@   )r   rK   r   r   r   r<      s    z)_find_project_modules.<locals>.<listcomp>)rp   r   r>   r?   )r=   rJ   Zexcept_r   r   r   _find_project_modules   s    rr   r\   c             c   sR   x|D ]}|  rq|V  qW t|dkr.dS t| |}t| |||dE dH  dS )z
    Search a name in the directories of modules.

    :param limit_reduction: Divides the limits on opening/parsing files by this
        factor.
       N)limit_reduction)rT   lenrr   search_in_file_ios)r=   rJ   r   rt   r(   file_io_iteratorr   r   r   rD     s    	


rD   c             c   s   t | }t| }d}d}tdt| |r0dnd }	x^|D ]V}
|d7 }t| |
|	}|d k	r|d7 }|V  ||krtd| P ||kr>td| P q>W d S )Nr   z\b r\   zHit limit of parsed files: %szHit limit of opened files: %s)_PARSED_FILE_LIMIT_OPENED_FILE_LIMITrecompileescaperX   r   )r=   rw   r   rt   ZcompleteZparse_limitZ
open_limitZfile_io_countZparsed_file_countrV   rU   rK   r   r   r   rv     s"     


rv   )r   )F)r   )r   )r\   )r\   F)#rb   r{   Zparsor   Z
jedi.debugr   Zjedi.file_ior   r   Zjedi.inference.namesr   Zjedi.inference.importsr   Zjedi.inference.filtersr   Z!jedi.inference.gradual.conversionr	   rk   rz   ry   r   r   r*   r   r%   r!   rN   rX   rj   ro   rp   rq   rr   rD   rv   r   r   r   r   <module>   s4   

6


