a
     ³ŠaØ  ã                   @   sÜ   d 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 ddlmZ ddlmZ ddlmZ e d¡Ze d	¡Ze d
¡Ze d¡ZeeeedœZdd„ Zdd„ Zddd„Zdd„ Zedd„ ƒZdd„ ZdS )z5
Utilities needed by the fallback completion engine.
é    N)Úwords)Úget_lexer_for_filenameÚget_lexer_by_nameÚ	TextLexer)Úmemoize)Úqstring_length)Úcustom_extension_lexer_mappingz\wz\sz[^\W\d_]\w+z[^\W\d_]\w+[-\w]*)ZcssZscssZhtmlZxmlc                 C   sX   | pd} t j | ¡\}}|tv r.tt| ƒ}n&zt| ƒ}W n tyR   tƒ  Y S 0 |S )z+Get a Pygments Lexer given a filename.
    Ú )ÚosÚpathÚsplitextr   r   r   Ú	Exceptionr   )ÚfilenameÚrootZextÚlexer© r   úQlib/python3.9/site-packages/spyder/plugins/completion/providers/fallback/utils.pyÚfind_lexer_for_filename2   s    r   c              
   C   sF  d}g }t | ƒD ]*}|D ] }| ¡  |¡r|t| |ƒ7 }qqt| dƒsJ|S d| jv r‚z|| jd d d j W S  ty€   Y n0 | j ¡ D ]´}|D ]ª}zŒt	|d tƒrº| 
|d j¡ nh|d }d|d v sÜd|d v r"t dd|d ¡}t d	d|¡}d
|v r| 
| d
¡¡ n
| |¡ W q” ty<   Y q”Y q”0 q”qŒ|S )z(Get the keywords for a given lexer.
    )ZbuiltinÚkeywordZwordÚtokensÚkeywordsr   z)\bz)(\s+)z\\.r	   z[^0-9a-zA-Z|]+ú|)ÚdirÚlowerÚ
startswithÚgetattrÚhasattrr   r   r   ÚvaluesÚ
isinstanceÚextendÚreÚsubÚsplitÚappend)r   Zsearch_attrsr   ÚattrZsearch_attrZvalsÚvalZini_valr   r   r   Úget_keywordsA   s8    


r&   r	   c                    s6   t  | ¡ t¡}dd„ ‡ fdd„| | ¡D ƒ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.
    c                 S   s   g | ]}|d kr|‘qS )r	   r   )Ú.0Úxr   r   r   Ú
<listcomp>m   s   úzget_words.<locals>.<listcomp>c                 3   s6   | ].}ˆ d u s&ˆ |  ¡ k s&| ¡ ˆ k r| ¡ V  qd S )N)ÚstartÚendÚgroup)r'   Úm©Úexclude_offsetr   r   Ú	<genexpr>n   s
   üzget_words.<locals>.<genexpr>)ÚLANGUAGE_REGEXÚgetr   Ú	all_regexÚfinditer)Útextr/   ÚlanguageÚregexr   r   r.   r   Ú	get_wordse   s    
ÿÿr8   c                 C   sÎ   t | ƒt| ƒ }|| d }|t| ƒks0|dk r4dS | | }t |¡du}d}t | ¡ t¡}d}	| | ¡D ]2}
|
 	¡ \}}t
||ƒ}||krl||krl|
 ¡ }	ql||kr¶t |¡r¶|}	|	dkpÈ|	dkoÈ|}|S )z(Check if current offset prefix is valid.é   r   FNéÿÿÿÿr	   )r   ÚlenÚempty_regexÚmatchr1   r2   r   r3   r4   ÚspanÚmaxr,   Úletter_regex)r5   Úoffsetr6   Z
utf16_diffZ
new_offsetZcurrent_pos_textZempty_startZmax_endr7   Úprefixr=   r*   r+   Zvalidr   r   r   Úis_prefix_validw   s&    


rC   c                 C   sˆ   t  | ¡}t  | ¡}t  |¡d }tjj ||g¡}|s<dS |g}|rz| t  |¡¡ t  |¡}tjj d|t	j
 g¡}qBd t|ƒ¡S )z¢
    Given a file path, determine the full module path.

    e.g. '/usr/lib/python3.7/dist-packages/numpy/core/__init__.pyc' yields
    'numpy.core.__init__'
    r   NÚ__init__Ú.)ÚospÚdirnameÚbasenamer   Ú	importlibÚ	machineryÚ
PathFinderÚ	find_specr#   r
   ÚsepÚjoinÚreversed)r   rG   ÚmodÚspecÚitemsr   r   r   Úget_parent_until•   s    




ÿrS   c                   C   s   t ddddddS )z&Default response when asking for info.r	   )ÚnameZargspecZnoteZ	docstringZcalltip)Údictr   r   r   r   Údefault_info_response¬   s    rV   )Nr	   )Ú__doc__rI   r
   Úos.pathr   rF   r    Zpygments.lexerr   Zpygments.lexersr   r   r   Zspyder.utils.miscr   Zspyder.utils.qstringhelpersr   Zspyder.utils.syntaxhighlightersr   Úcompiler@   r<   r3   Zkebab_regexr1   r   r&   r8   rC   rS   rV   r   r   r   r   Ú<module>   s2   



ü$

