o
    ^i0*                     @   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*   N/home/ubuntu/hpml_nyu/venv/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 pdS )N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)read_config_pathjupyterr$   r)   r*   )r
   r	   r   updateget	__class____name__)r,   r)   manager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?   r:   r*   r-   rC   {   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)rH   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)   rA   _collect_language_serversr@   r+   r*   r*   r-   rE      s   z+LanguageServerManager.init_language_serversrO   c                 C   sN   i }t | j}|| j | jr|| j|d || dd | D S )NrN   c                 S   s    i | ]\}}| d r||qS )argv)r9   ).0keyspecr*   r*   r-   
<dictcomp>   s     zCLanguageServerManager._collect_language_servers.<locals>.<dictcomp>)rP   rA   r8   r4   r%   _autodetect_language_serversitems)r,   rO   r)   language_servers_from_configr*   r*   r-   rQ      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_serverrU   parentN)r)   rX   r   r(   )r,   r(   rZ   rU   r*   r*   r-   rG      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   rX   r   appendload	Exceptionlogwarningnamer:   register_message_listenervalue)	r,   scopesr^   trt_ep	listenersentry_pointepterrlistenerr*   r*   r-   rF      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(   r9   rZ   rh   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   ra   rZ   r(   r9   rh   rt   ru   write)r,   messagery   rz   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*   )rS   ls_keysessrz   r*   r-   
<listcomp>   s    z;LanguageServerManager.on_server_message.<locals>.<listcomp>)r(   rX   r|   r   rc   rw   write_message)r,   r~   rz   r)   ry   r*   r   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*   )rS   hry   r*   r-   r      s    z5LanguageServerManager.unsubscribe.<locals>.<listcomp>)r(   r9   rZ   rh   rt   ru   rw   rx   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 )	Nr\   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   rg   rh   	exceptionrf   ri   r   ru   rj   hasattrr   r   r   re   	traceback	print_exclistr   iter_errorsrX   infojoin)r,   rO   _entry_pointsskipped_serversepspec_finderrr   spec_finder_from_basespecserrorsrT   rU   r*   r*   r-   rW      st   




z2LanguageServerManager._autodetect_language_servers)r5   N)/r;   
__module____qualname____doc__r   r   r   r4   tagr)   r   r%   bool__annotations__Dict_r   r   r(   r   r   r   r   r/   rH   List_r   r`   rd   rb   r   r.   r3   r   r>   rC   rJ   rM   rE   rQ   rG   rF   r{   r   r   r   rW   __classcell__r*   r*   rD   r-   r!   2   s   
 	



	r!   )4r   rK   r1   sysr   typingr   r   r   r   version_infoimportlib_metadatar   importlib.metadatajupyter_core.pathsr	   jupyter_server.services.configr
   jupyter_server.transutilsr   r   ImportError	traitletsr   r   r   r   r   r   r   	constantsr   r   r   r   r   schemar   rz   r   trait_typesr   r   typesr   r   r   r   r    r!   rk   lsp_message_listenerr*   r*   r*   r-   <module>   s<    
	  

