a
    a|                     @   s   d Z ddlZddlmZmZmZmZ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dlmZmZmZ d	ZeeZG d
d deZdS )z
Fallback completion actor.

This takes a plain text/source file and returns the individual words
written on it and the keywords associated by Pygments to the
programming language of that file.
    N)QObjectQThreadQMutexQMutexLockerSignalSlot)get_lexer_by_name)diff_match_patch)CompletionItemKind)CompletionRequestTypes)get_keywords	get_wordsis_prefix_validZFallbackc                   @   s\   e Zd Ze ZeeeZeeZdd Z	dd Z
dd Zdd Zd	d
 Zeedd ZdS )FallbackActorc                 C   sb   t |  d| _d| _t | _i | _t | _t	 | _
| | j
 | j
j| j | j| j d S )NFT)r   __init__ZstoppedZdaemonr   mutexfile_tokensr	   
diff_patchr   threadZmoveToThreadstartedZconnectsig_mailbox
handle_msg)selfparent r   Qlib/python3.9/site-packages/spyder/plugins/completion/providers/fallback/actor.pyr   ,   s    
zFallbackActor.__init__c                    s   t |||}|sg S zt|}t|}W n ty>   g }Y n0 t|}dd |D }t|||}	dd |	D }	|	D ]}
|
d |vrt||
 qt dur    fdd|D }|S )zl
        Return all tokens in `text` and all keywords associated by
        Pygments to `language`.
        c              
   S   s"   g | ]}t j||||d tdqS  )kind
insertTextZlabelZsortTextZ
filterTextZdocumentationZprovider)r
   ZKEYWORDFALLBACK_COMPLETION).0keywordr   r   r   
<listcomp>I   s   z*FallbackActor.tokenize.<locals>.<listcomp>c              
   S   s"   g | ]}t j||||d tdqS r   )r
   ZTEXTr    )r!   tokenr   r   r   r#   T   s   r   Nc                    s    g | ]} |d    v r|qS )r   )lowerr!   kcurrent_wordr   r   r#   c   s   )r   r   r   	Exceptionsetr   appendr%   )r   textoffsetlanguager)   ZvalidZlexerkeywordsZkeyword_settokensr$   r   r(   r   tokenize9   s.    

zFallbackActor.tokenizec                 C   sB   t | j$ td | j  W d   n1 s40    Y  dS )zStop actor.zFallback plugin stopping...N)r   r   loggerdebugr   quitr   r   r   r   stoph   s    
zFallbackActor.stopc                 C   s   | j   dS )zStart thread.N)r   startr6   r   r   r   r8   n   s    zFallbackActor.startc                 C   s   t d | j  dS )zThread started.zFallback plugin starting...N)r3   r4   sig_fallback_readyemitr6   r   r   r   r   r   s    
zFallbackActor.startedc                    sB   fdddD \}}}}t d|| |tjkrV|d |d |d d| j|< n|tjkr|| jvrd	|d |d d| j|< |d
 }| j| }|d |d< | j||d \}}|| j| d< nv|tj	kr| j
|i  n\|tjkr>g }	|| jv r(| j| }
| |
d |
d |
d |d }	d|	i}	| j||	 dS )zHandle one messagec                    s   g | ]} | qS r   r   r&   messager   r   r#   z   s   z,FallbackActor.handle_msg.<locals>.<listcomp>)typeidfilemsgzPerform request {0} with id {1}r-   r.   r/   )r-   r.   r/   r   diffr)   paramsN)r3   r4   formatr   ZDOCUMENT_DID_OPENr   ZDOCUMENT_DID_CHANGEr   Zpatch_applyZDOCUMENT_DID_CLOSEpopZDOCUMENT_COMPLETIONr2   sig_set_tokensr:   )r   r<   Zmsg_typeZ_idr?   r@   rA   r-   _r1   Z	text_infor   r;   r   r   w   sH    






zFallbackActor.handle_msgN)__name__
__module____qualname__r   r9   intdictrE   r   r   r2   r7   r8   r   r   r   r   r   r   r   r   &   s   
/r   )__doc__ZloggingZqtpy.QtCorer   r   r   r   r   r   Zpygments.lexersr   r	   Zspyder.plugins.completion.apir
   r   Z2spyder.plugins.completion.providers.fallback.utilsr   r   r   r    Z	getLoggerrG   r3   r   r   r   r   r   <module>   s   	 
