
    Je                     >   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y)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                     | xs d} t         j                  j                  |       \  }}|t        v rt	        t        |         }|S 	 t        |       }|S # t        $ r t               cY S w xY w)z+Get a Pygments Lexer given a filename.
     )ospathsplitextr	   r   r   	Exceptionr   )filenamerootextlexers       T/usr/lib/python3/dist-packages/spyder/plugins/completion/providers/fallback/utils.pyfind_lexer_for_filenamer   2   st     ~2H  *ID#
,,!"@"EF L		*84E L  	;	s   A A)(A)c                    d}g }t        |       D ]8  }|D ]1  }|j                         j                  |      s#|t        | |      z  }3 : t	        | d      s|S d| j
                  v r#	 || j
                  d   d   d   j                  z   S | j
                  j                         D ]  }|D ]  }	 t        |d   t              r|j                  |d   j                         nz|d   }d|d   v sd|d   v rgt        j                  dd|d         }t        j                  d	d|      }d
|v r!|j                  |j                  d
             n|j                  |         |S # t        $ r Y w xY w# t        $ r Y w xY w)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' 	1Kzz|&&{3GE400	11
 5(#U\\!	ell:6q9!<BBBB ##%  	Cc!fe,OOCFLL1!!fGQ'9A+> ffVRQ8 ff%6C@'>$OOCIIcN;$OOC0	  O%  		   s%   (!E -B,E.	E+*E+.	E:9E:c                     t         j                  |j                         t              }fd|j	                  |       D        D cg c]	  }|dk7  r| }}|S c c}w )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              3      K   | ]<  }&|j                         k  s|j                         k  r|j                          > y w)N)startendgroup).0mexclude_offsets     r   	<genexpr>zget_words.<locals>.<genexpr>n   sA      2)1&2.0	 	 2s   AAr   )LANGUAGE_REGEXgetr"   	all_regexfinditer)textr;   languageregexxr   s    `    r   	get_wordsrE   e   sc     x~~/;E2!&!52
 b  F  Ms   Ac                    t        |       t        |       z
  }||z
  dz
  }|t        |       k\  s|dk  ry| |   }t        j                  |      du}d}t        j                  |j                         t              }d}	|j                  |       D ]=  }
|
j                         \  }}t        ||      }||k\  s(||k  s.|
j                         }	? ||kD  rt        j                  |      r|}	|	dk7  xs	 |	dk(  xr |}|S )z(Check if current offset prefix is valid.   r   FNr   )r   lenempty_regexmatchr=   r>   r"   r?   r@   spanmaxr8   letter_regex)rA   offsetrB   
utf16_diff
new_offsetcurrent_pos_textempty_startmax_endrC   prefixrK   r6   r7   valids                 r   is_prefix_validrW   w   s   
  %D	1J*$q(JSY*q.J'##$45TAKGx~~/;EF% #ZZ\
sc7#U?v}[[]F	#
 ./%FbL:Vr\9kEL    c                    t        j                  |       }t        j                  |       }t        j                  |      d   }t        j
                  j                  j                  ||g      }|sy|g}|rx|j                  t        j                  |             t        j                  |      }t        j
                  j                  j                  d|t        j                  z   g      }|rxdj                  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_untilri      s     kk$G
,,t
C
,,s
A
C))33C'CDEE
S\\'*+++g&""--77
9@2669I8JL 
 88HUO$$rX   c                  "    t        ddddd      S )z&Default response when asking for info.r   )nameargspecnote	docstringcalltip)dict rX   r   default_info_responserr      s    R"BGGrX   )Nr   )__doc__r_   r   os.pathr   r\   r)   pygments.lexerr   pygments.lexersr   r   r   spyder.utils.miscr   spyder.utils.qstringhelpersr   spyder.utils.syntaxhighlightersr	   compilerN   rJ   r?   kebab_regexr=   r   r3   rE   rW   ri   rr   rq   rX   r   <module>r|      s   
  	  	 !( ( & 6
 rzz% bjj
 BJJ~&	 bjj-. 	!H$< 	% 	%,HrX   