o
    tf(*                     @   sb  d Z ddlZddlZddlZddlZddlmZmZmZm	Z	 ej
dk r*ddlmZ nddlmZ ddlmZ ddlmZ zddlmZ W n eyS   dd	lmZ Y nw 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 ddl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)m*Z* ddl+m,Z,m-Z-m.Z.m/Z/m0Z0 G dd de-Z1e1j2Z3dS )z: A configurable frontend for stdio-based Language Servers
    N)DictTextTuplecast)   
   )entry_points)jupyter_config_path)ConfigManager)_i18n)_)Bool)r   )Instance)List)Unicodedefault   )APP_CONFIG_D_SECTIONSEP_LISTENER_ALL_V1EP_LISTENER_CLIENT_V1EP_LISTENER_SERVER_V1
EP_SPEC_V1)LANGUAGE_SERVER_SPEC_MAP)LanguageServerSession)LoadableCallableSchema)KeyedLanguageServerSpecsLanguageServerManagerAPIMessageScopeSpecBase	SpecMakerc                       s  e Zd ZU dZeeeddZeeeddjddZ	e
deddjddZeed	< eeei d
dZeee ef ed< eddjddZe
dddZeedjddZeedjddZeedjddZeddd Zeddd Zedde fddZ!def fddZ"dd  Z#d!d" Z$d7d$d%Z%d&ede fd'd(Z&d)d* Z'd+d, Z(d-d. Z)d/d0 Z*d1d2 Z+d3d4 Z,d&efd5d6Z-  Z.S )8LanguageServerManagerzManage language serverszAextra language server specs, keyed by implementation, from conf.d)	validatorhelpz8a dict of language server specs, keyed by implementationT)configz@try to find known language servers in sys.prefix (and elsewhere))r#   
autodetectz&sessions keyed by language server name)traitdefault_valuer#   sessionszPath to virtual documents relative to the content manager root
        directory.

        Its default value can be set with JP_LSP_VIRTUAL_DIR and fallback to
        '.virtual_documents'.
        z(Whether the manager has been initializedF)r#   r'   )r&   language_serversc                 C   s   i S )N selfr*   r*   \/var/www/html/software/conda/envs/catlas/lib/python3.10/site-packages/jupyter_lsp/manager.py_default_language_serversd   s   z/LanguageServerManager._default_language_serversvirtual_documents_dirc                 C   s   t ddS )NZJP_LSP_VIRTUAL_DIRz.virtual_documents)osgetenvr+   r*   r*   r-   _default_virtual_documents_dirh   s   z4LanguageServerManager._default_virtual_documents_dirconf_d_language_serversreturnc              	   C   sP   i }t t d}tD ]}|jdi |d| d| jji di  q
|S )N)Zread_config_pathjupyterr$   r)   r*   )r
   r	   r   updateget	__class____name__)r,   r)   managerZappr*   r*   r-    _default_conf_d_language_serversl   s   z6LanguageServerManager._default_conf_d_language_serverskwargsc                    s"   i | _ i | _t jdi | dS )z4Before starting, perform all necessary configurationNr*   )all_language_servers_language_servers_from_configsuper__init__)r,   r<   r8   r*   r-   r@   {   s   zLanguageServerManager.__init__c                 O   s"   |    |   |   d| _d S )NT)init_language_serversinit_listenersinit_sessions_ready)r,   argsr<   r*   r*   r-   
initialize   s   
z LanguageServerManager.initializec                    s"   | j stdI d H  | j rdS )Ng?T)rE   asynciosleepr+   r*   r*   r-   ready   s
   zLanguageServerManager.readyNc                 C   s,   t | j| _| jdd| _| jdd| _dS )z2determine the final language server configuration.Tonly_installedFN)dictr)   r>   _collect_language_serversr=   r+   r*   r*   r-   rB      s   z+LanguageServerManager.init_language_serversrL   c                 C   sN   i }t | j}|| j | jr|| j|d || dd | D S )NrK   c                 S   s    i | ]\}}| d r||qS )argv)r7   ).0keyspecr*   r*   r-   
<dictcomp>   s     zCLanguageServerManager._collect_language_servers.<locals>.<dictcomp>)rM   r>   r6   r3   r%   _autodetect_language_serversitems)r,   rL   r)   Zlanguage_servers_from_configr*   r*   r-   rN      s   


z/LanguageServerManager._collect_language_serversc                 C   s4   i }| j  D ]\}}t||| d||< q|| _dS )z*create, but do not initialize all sessions)language_serverrR   parentN)r)   rU   r   r(   )r,   r(   rV   rR   r*   r*   r-   rD      s   
z#LanguageServerManager.init_sessionsc           	      C   s   t j| jtgt j| jtgt j| jt	gi}|
 D ]C\}}|\}}t|dD ]&}z	||  W q% tyK } z| jd|j| W Y d}~q%d}~ww |D ]}| jj|jd| qNqdS )z'register traitlets-configured listenersgroupz!Failed to load entry point %s: %sN)scope)r   ALLall_listenersr   CLIENTclient_listenersr   SERVERserver_listenersr   rU   r   appendload	Exceptionlogwarningnamer8   register_message_listenervalue)	r,   ZscopesrZ   Ztrt_epZ	listenersentry_pointZepterrZlistenerr*   r*   r-   rC      s"   z$LanguageServerManager.init_listenersc                 C   sD   | j |j}|du r| jd|j dS t|g|jB |_dS )z&subscribe a handler to session, or staNz,[{}] no session: handler subscription failed)r(   r7   rV   rd   errorformatsethandlersr,   handlersessionr*   r*   r-   	subscribe   s   zLanguageServerManager.subscribec                    sV   |  tj||jI d H  | j|j}|d u r$| jd|j d S |	| d S )Nz'[{}] no session: client message dropped)
wait_for_listenersr   r]   rV   r(   r7   rd   rk   rl   write)r,   messagerp   rq   r*   r*   r-   on_client_message   s   

z'LanguageServerManager.on_client_messagec                    sT    fdd| j  D }|D ]}| tj||I d H  q jD ]}|| q d S )Nc                    s   g | ]
\}}| kr|qS r*   r*   )rP   Zls_keysessrq   r*   r-   
<listcomp>   s    z;LanguageServerManager.on_server_message.<locals>.<listcomp>)r(   rU   rs   r   r_   rn   Zwrite_message)r,   ru   rq   r)   rp   r*   rx   r-   on_server_message   s   

z'LanguageServerManager.on_server_messagec                    sH   | j  j}|d u r| jd j d S  fdd|jD |_d S )Nz.[{}] no session: handler unsubscription failedc                    s   g | ]}| kr|qS r*   r*   )rP   hrp   r*   r-   ry      s    z5LanguageServerManager.unsubscribe.<locals>.<listcomp>)r(   r7   rV   rd   rk   rl   rn   ro   r*   r|   r-   unsubscribe   s   z!LanguageServerManager.unsubscribec                 c   s   d }zt td}W n ty   | jd Y nw g }|pg D ]}z| }W n tyG } z| jtd|j	| W Y d }~q d }~ww z!|rbt
|drbtt|}|| sb||j	 W q || pgi }W n# ty } z| jtd|j	| t  W Y d }~q d }~ww tt|}	|	r| jtd|j	|	 q | D ]	\}
}|
|fV  qq |r| jtdd| d S d S )	NrX   zFailed to load entry_pointsz4Failed to load language server spec finder `{}`: 
{}is_installedzBFailed to fetch commands from language server spec finder `{}`:
{}zEFailed to validate commands from language server spec finder `{}`:
{}z#Skipped non-installed server(s): {}z, )r   r   rc   rd   	exceptionrb   re   r   rl   rf   hasattrr   r   r~   ra   	traceback	print_exclistr   Ziter_errorsrU   infojoin)r,   rL   Z_entry_pointsZskipped_serversepZspec_finderrj   Zspec_finder_from_basespecserrorsrQ   rR   r*   r*   r-   rT      st   




z2LanguageServerManager._autodetect_language_servers)r4   N)/r9   
__module____qualname____doc__r   r   r   r3   tagr)   r   r%   bool__annotations__Dict_r   r   r(   r   r   r   r   r/   rE   List_r   r\   r`   r^   r   r.   r2   r   r;   r@   rG   rJ   rB   rN   rD   rC   rr   rv   rz   r}   rT   __classcell__r*   r*   rA   r-   r!   2   s   
 	



	r!   )4r   rH   r0   sysr   typingr   r   r   r   version_infoimportlib_metadatar   importlib.metadataZjupyter_core.pathsr	   Zjupyter_server.services.configr
   Zjupyter_server.transutilsr   r   ImportErrorZ	traitletsr   r   r   r   r   r   r   	constantsr   r   r   r   r   Zschemar   rq   r   Ztrait_typesr   r   typesr   r   r   r   r    r!   rg   Zlsp_message_listenerr*   r*   r*   r-   <module>   s<    
	  

