B
    nb\!                 @   s   d Z 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 ddlmZ ddlmZmZmZ ddlmZ G dd	 d	eZd
d Zdd ZdddZe	dd Zdd ZdS )z(
Introspection utilities used by Spyder
    N)memoize)custom_extension_lexer_mapping)words)get_lexer_for_filenameget_lexer_by_name	TextLexer)Tokenc               @   sZ   e Zd ZedejZedejZdddZdd Z	d	d
 Z
dd Zdd Zdd ZdS )CodeInfoz[^\d\W][\w\.]*z([^\d\W][\w\.]*)\([^\)\()]*\ZNFc       
      K   s   | j | || _|| _|| _|| _|| _|| _|| _|r| 	 | _
|dkrxR|r| j||d  }	|	dsx|	dr||	dd 7 }P |d8 }qNW nd| _
|| _|dkrg | _d| _d| _d| _d| _d| _n|   d S )	NZcompletions   zdef zclass      r   )__dict__updatenamefilenamesource_codeis_python_likein_comment_or_stringsys_pathposition_get_docstring	docstring
startswithindexlinescolumnline_numlineobjfull_obj	_get_info)
selfr   r   r   r   r   r   r   kwargsbase r%   ?lib/python3.7/site-packages/spyder/utils/introspection/utils.py__init__#   s6    
zCodeInfo.__init__c             C   s  | j d | j  | _t| j| _| jd | _t| jd | _| j  | jd  }t| j	}tt
|ddkrt| j| j}|r| j|d r|d | _nd | _| j| _| jr| j  | jd  }|| jd  }t| j|}|r| j|  | _d | _nzd}||}xj|D ]b\}}	|t|	7 }|| jkr|	d t|	|| j   | _|	| _|tjjkrptjj}|| _P qW | jdkr| jtjkr| jrt| j| j}
|
r|
d | _| j| jt| j | _| jt| j | j | _d S )Nr   za br   )infoZ
definition)r   r   
splitlinesr   lenr   r   r   find_lexer_for_filenamer   listZ
get_tokensrefindallid_regexendswithr   r    matchgroupcontextr   ZLiteralStringr   Namer   func_call_regexr   )r"   Z	full_linelexertokensrestr2   posZline_tokensr4   tokenZ	func_callr%   r%   r&   r!   K   sJ    


zCodeInfo._get_infoc             C   s   | j }x0|r6| j||d  dkr,|d7 }P |d8 }qW | j }x:|t| jk rx| j|d | dkrn|d8 }P |d7 }q@W |r|t| jk r| j|| S dS )z'Find the docstring we are currently in.   )z"""z'''r   r   )r   r   r+   )r"   leftrightr%   r%   r&   r      s    zCodeInfo._get_docstringc             C   s*   y|   |  kS  tk
r$   dS X d S )NF)	serialize	Exception)r"   otherr%   r%   r&   __eq__   s    zCodeInfo.__eq__c             C   s
   t | |S )zAllow dictionary-like access.)getattr)r"   itemr%   r%   r&   __getitem__   s    zCodeInfo.__getitem__c          	   C   s`   i }xB| j  D ]4\}}yt| |||< W q tk
rB   Y qX qW | j|d< | j|d< |S )Nr0   r7   )r   itemspickledumpsrA   r0   r7   )r"   statekeyvaluer%   r%   r&   r@      s    



zCodeInfo.serialize)NFFN)__name__
__module____qualname__r.   compileUNICODEr0   r7   r'   r!   r   rC   rF   r@   r%   r%   r%   r&   r	      s     
&5r	   c             C   sV   | pd} t j| \}}|tkr.tt| }n$yt| }W n tk
rP   t S X |S )z+Get a Pygments Lexer given a filename.
    r   )ospathsplitextr   r   r   rA   r   )r   rootZextr8   r%   r%   r&   r,      s    r,   c          
   C   s  t | dsg S d| jkr:y| jd d d jS    Y nX g }x| j D ]}x|D ]}yt|d trz||d j nd|d }d|d ksd|d krtdd|d }tdd|}d	|kr||d	 n
|	| W qT t
k
r   wTY qTX qTW qJW |S )
z(Get the keywords for a given lexer.
    r9   keywordsr   z)\bz)(\s+)z\\.r   z[^0-9a-zA-Z|]+|)hasattrr9   r   values
isinstanceextendr.   subsplitappendrA   )r8   rV   ZvalsvalZini_valr%   r%   r&   get_keywords   s.    


r`   c          	   C   s   | dkr|dks$|dks$| r0|r0|r0d}t || rp|dkrp|dkrptj| d }t| }| }W dQ R X |dkrtd}n|dkrtd}n
td}tt	|
d	| }|S )
z
    Extract all words from a source code file to be used in code completion.

    Extract the list of words that contains the file in the editor,
    to carry out the inline completion similar to VSCode.
    Nz5Must provide `file_path` or `content` and `extension`r   )z.cssz([^a-zA-Z-]))z.Rz.cz.mdz.cppz.javaz.pyz([^a-zA-Z_])z([^a-zA-Z])r   )rA   rR   rS   rT   openreadr.   rP   sortedsetr\   r]   )Z	file_pathZcontent	extensionZ	error_msgZinfileZregexr   r%   r%   r&   	get_words   s    

rf   c             C   s   t | }y*t | }t |d }t||g W n tk
rH   dS X |g}xN|t | y"t |}td|tj	 g W qR tk
r   P Y qRX qRW d
t|S )z
    Given a file path, determine the full module path.

    e.g. '/usr/lib/python2.7/dist-packages/numpy/core/__init__.pyc' yields
    'numpy.core'
    r   Nr'   .)ospdirnamebasenamerT   impfind_moduleImportErrorr^   rR   sepjoinreversed)rS   ri   modrG   r%   r%   r&   get_parent_until   s     


rr   c               C   s   t ddddddS )z&Default response when asking for info.r   )r   ZargspecZnoter   Zcalltip)dictr%   r%   r%   r&   default_info_response
  s    rt   )NNN)__doc__rk   rR   rH   os.pathrS   rh   r.   Zspyder.utils.miscr   Zspyder.utils.syntaxhighlightersr   Zpygments.lexerr   Zpygments.lexersr   r   r   Zpygments.tokenr   objectr	   r,   r`   rf   rr   rt   r%   r%   r%   r&   <module>	   s"    
