
    G@d                     6   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j        d          Z ej        d	          Z ej        d
          Z ej        d          ZeeeedZd Zd ZddZd Zed             Z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]*)cssscsshtmlxmlc                     | pd} t           j                            |           \  }}|t          v rt	          t          |                   }n/	 t          |           }n# t          $ r t                      cY S w xY w|S )z+Get a Pygments Lexer given a filename.
     )ospathsplitextr	   r   r   	Exceptionr   )filenamerootextlexers       Rlib/python3.11/site-packages/spyder/plugins/completion/providers/fallback/utils.pyfind_lexer_for_filenamer   2   s     ~2H  **ID#
,,,!"@"EFF	*844EE 	 	 	;;	Ls   A A76A7c                 F   d}g }t          |           D ]A}|D ]<}|                                                    |          r|t          | |          z  }=Bt	          | d          s|S d| j        v r2	 || j        d         d         d         j        z   S # t          $ r Y nw xY w| j                                        D ]}|D ]}	 t          |d         t                    r!|
                    |d         j                   n|d         }d|d         v s
d|d         v rtt          j        dd|d                   }t          j        d	d|          }d
|v r)|
                    |                    d
                     n|                    |           # t          $ r Y w xY w|S )z(Get the keywords for a given lexer.
    )builtinkeyword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   search_attrsr   attrsearch_attrvalsvalini_vals           r   get_keywordsr3   A   s    2LHE

 1 1' 	1 	1Kzz||&&{33 1GE4000	1 5(## U\!!	el:6q9!<BBB 	 	 	D	##%%   	 	Cc!fe,, 
1OOCFL1111!!fGQ''9A+>+> fVRQ88 f%6C@@'>>$OOCIIcNN;;;;$OOC000   	 Os%   2 B 
B B CF
FFr   c                     t                               |                                t                    }d f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                     g | ]
}|d k    |S )r    ).0xs     r   
<listcomp>zget_words.<locals>.<listcomp>m   s-       
 b      c              3      K   | ]J}0|                                 k     s|                                k     4|                                V  Kd S )N)startendgroup)r7   mexclude_offsets     r   	<genexpr>zget_words.<locals>.<genexpr>n   se       2 2)1&22.00	 		 1000	2 2r:   )LANGUAGE_REGEXgetr"   	all_regexfinditer)textr@   languageregexr   s    `   r   	get_wordsrI   e   sx     x~~//;;E 2 2 2 2!&!5!52 2 2  F Mr:   c                 \   t          |           t          |           z
  }||z
  dz
  }|t          |           k    s|dk     rdS | |         }t                              |          du}d}t                              |                                t                    }d}	|                    |           D ]I}
|
	                                \  }}t          ||          }||k    r||k    r|
                                }	J||k    rt                              |          r|}	|	dk    p|	dk    o|}|S )z(Check if current offset prefix is valid.   r   FNr   )r   lenempty_regexmatchrB   rC   r"   rD   rE   spanmaxr>   letter_regex)rF   offsetrG   
utf16_diff
new_offsetcurrent_pos_textempty_startmax_endrH   prefixrO   r<   r=   valids                 r   is_prefix_validr[   w   s3   
  %%D		1J*$q(JSYY*q..uJ'##$455TAKGx~~//;;EF%% # #ZZ\\
sc7##U??v}}[[]]F.// 	&%FbL:Vr\9kELr:   c                    t          j        |           }t          j        |           }t          j        |          d         }t          j        j                            ||g          }|sdS |g}|rp|                    t          j        |                     t          j        |          }t          j        j                            d|t          j
        z   g          }|pd                    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   r`   modspecitemss        r   get_parent_untilrl      s     k$G
,t

C
,s

A
C)33C'CCD EE
 LS\'**++++g&&"-77
9@269I8JL L  L
 88HUOO$$$r:   c                  *    t          ddddd          S )z&Default response when asking for info.r   )nameargspecnote	docstringcalltip)dictr6   r:   r   default_info_responsert      s    R"BGGGGr:   )Nr   )__doc__rb   r   os.pathr   r_   r)   pygments.lexerr   pygments.lexersr   r   r   spyder.utils.miscr   spyder.utils.qstringhelpersr   spyder.utils.syntaxhighlightersr	   compilerR   rN   rD   kebab_regexrB   r   r3   rI   r[   rl   rt   r6   r:   r   <module>r~      s   
     				       				 !          ( ( ( ( ( ( ( ( ( ( & % % % % % 6 6 6 6 6 6     
 rz%  bj
 BJ~&&	 bj-.. 	   ! ! !H   $  < 	% % 	%,H H H H Hr:   