o
    i)                     @   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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ei d	d
Z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d Z fddZdd Zdd Zd4d!d"Zd#e de!fd$d%Z"d&d' Z#d(d) Z$d*d+ Z%d,d- Z&d.d/ Z'd0d1 Z(d#e fd2d3Z)  Z*S )5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#   z&sessions keyed by language server name)traitdefault_valuer#   zPath 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/var/www/edux/Edux_v2/venv/lib/python3.10/site-packages/jupyter_lsp/manager.py_default_language_servers]   s   z/LanguageServerManager._default_language_serversvirtual_documents_dirc                 C   s   t ddS )NJP_LSP_VIRTUAL_DIRz.virtual_documents)osgetenvr)   r(   r(   r+   _default_virtual_documents_dira   s   z4LanguageServerManager._default_virtual_documents_dirconf_d_language_serversc              	   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_serverse   s   z6LanguageServerManager._default_conf_d_language_serversc                    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*   kwargsr7   r(   r+   r?   t   s   zLanguageServerManager.__init__c                 O   s"   |    |   |   d| _d S )NT)init_language_serversinit_listenersinit_sessions_ready)r*   argsr@   r(   r(   r+   
initializez   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.readyreturnNc                 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_serversrM   c                 C   sN   i }t | j}|| j | jr|| j|d || dd | D S )NrL   c                 S   s    i | ]\}}| d r||qS )argv)r6   ).0keyspecr(   r(   r+   
<dictcomp>   s     zCLanguageServerManager._collect_language_servers.<locals>.<dictcomp>)rN   r=   r5   r2   
autodetect_autodetect_language_serversitems)r*   rM   r'   language_servers_from_configr(   r(   r+   rO      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_serverrS   parentN)r'   rW   r   sessions)r*   r[   rY   rS   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   rW   r   appendload	Exceptionlogwarningnamer7   register_message_listenervalue)	r*   scopesr^   trt_ep	listenersentry_pointepterr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[   r6   rY   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   rY   r[   r6   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(   )rQ   ls_keysessrz   r(   r+   
<listcomp>   s    z;LanguageServerManager.on_server_message.<locals>.<listcomp>)r[   rW   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(   )rQ   hry   r(   r+   r      s    z5LanguageServerManager.unsubscribe.<locals>.<listcomp>)r[   r6   rY   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_errorsrW   infojoin)r*   rM   _entry_pointsskipped_serversepspec_finderrr   spec_finder_from_basespecserrorsrR   rS   r(   r(   r+   rV      st   




z2LanguageServerManager._autodetect_language_servers)rK   N)+r8   
__module____qualname____doc__r   r   r   r2   tagr'   r   rU   Dict_r   r   r[   r   r-   rE   List_r   r`   rd   rb   r   r,   r1   r;   r?   rG   rJ   rB   boolr   rO   rD   rC   r{   r   r   r   rV   __classcell__r(   r(   rA   r+   r!   1   sr    	




	r!   )4r   rH   r/   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<    
	  
