
    qSe)                        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 	 ddlmZ n# e$ r	 dd	lmZ Y nw xY 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e-          Z1e1j2        Z3d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                   
    e Zd ZdZ ee ed                    Z ee ed                                        d          Z	 e
d ed                                        d          Z e ee          i d	
          Z ed                              d          Z e
dd          Z ee                              d          Z ee                              d          Z ee                              d          Z ed          d             Z ed          d             Z ed          d             Z fdZd Zd Zd%dZde de!fdZ"d Z#d Z$d  Z%d! Z&d" Z'd# Z(de fd$Z) xZ*S )&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                     i S )N selfs    3lib/python3.11/site-packages/jupyter_lsp/manager.py_default_language_serversz/LanguageServerManager._default_language_servers]   s    	    virtual_documents_dirc                 ,    t          j        dd          S )NJP_LSP_VIRTUAL_DIRz.virtual_documents)osgetenvr,   s    r.   _default_virtual_documents_dirz4LanguageServerManager._default_virtual_documents_dira   s    y-/CDDDr0   conf_d_language_serversc           
         i }t          t                                }t          D ]X} |j        di |                    d| d                              | j        j        i                               di            Y|S )N)read_config_pathjupyterr&   r)   r+   )r   r
   r   updateget	__class____name__)r-   r)   managerapps       r.    _default_conf_d_language_serversz6LanguageServerManager._default_conf_d_language_serverse   s    1D1F1FGGG( 	 	C##  ++333344T^,b11',,     r0   c                 V    i | _         i | _         t                      j        di | dS )z4Before starting, perform all necessary configurationNr+   )all_language_servers_language_servers_from_configsuper__init__)r-   kwargsr=   s     r.   rF   zLanguageServerManager.__init__t   s6    >@!-/*""6"""""r0   c                     |                                   |                                  |                                  d| _        d S )NT)init_language_serversinit_listenersinit_sessions_ready)r-   argsrG   s      r.   
initializez LanguageServerManager.initializez   sC    ""$$$r0   c                 Z   K   | j         s!t          j        d           d {V  | j         !dS )Ng?T)rL   asynciosleepr,   s    r.   readyzLanguageServerManager.ready   sC      + 	%-$$$$$$$$$ + 	%tr0   returnNc                     t          | j                  | _        |                     d          | _        |                     d          | _        dS )z2determine the final language server configuration.Tonly_installedFN)dictr)   rD   _collect_language_serversrC   r,   s    r.   rI   z+LanguageServerManager.init_language_servers   sP     .2$2G-H-H* $ > >d > S S$($B$BRW$B$X$X!!!r0   rV   c                 (   i }t          | j                  }|                    | j                   | j        r)|                    |                     |                     |                    |           d |                                D             S )NrU   c                 D    i | ]\  }}|                     d           ||S )argv)r<   ).0keyspecs      r.   
<dictcomp>zCLanguageServerManager._collect_language_servers.<locals>.<dictcomp>   s0    XXXic4txxPVGWGWXTXXXr0   )rW   rD   r;   r7   
autodetect_autodetect_language_serversitems)r-   rV   r)   language_servers_from_configs       r.   rX   z/LanguageServerManager._collect_language_servers   s     68'+D,N'O'O$$++D,HIII? 	##111PP  
 	 <=== YX+;+A+A+C+CXXXXr0   c                     i }| j                                         D ]\  }}t          |||           ||<   || _        dS )z*create, but do not initialize all sessions)language_serverr^   parentN)r)   rb   r   sessions)r-   rg   re   r^   s       r.   rK   z#LanguageServerManager.init_sessions   sZ    %)%:%@%@%B%B 	 	!OT(= /d4) ) )H_%% !r0   c                    t           j        | j        t          gt           j        | j        t          gt           j        | j        t          gi}|
                                D ]\  }}|\  }}t          |          D ]b}	 |                    |                                           +# t          $ r+}| j                            d|j        |           Y d}~[d}~ww xY w|D ]+} | j                            |j                  |           ,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   rb   r	   appendload	Exceptionlogwarningnamer=   register_message_listenervalue)	r-   scopesrk   trt_ep	listenersentry_pointepterrlisteners	            r.   rJ   z$LanguageServerManager.init_listeners   sE    t13EF$"79N!O$"79N!O

 $\\^^ 
	V 
	VME6%+"I{#+666 Y YY$$SXXZZ0000  Y Y YH$$%H#(TWXXXXXXXXY & V VK88u{8KKHUUUUV
	V 
	Vs   <'B$$
C.!CCc                     | j                             |j                  }|4| j                            d                    |j                             dS t          |g          |j        z  |_        dS )z&subscribe a handler to session, or staNz,[{}] no session: handler subscription failed)rg   r<   re   ru   errorformatsethandlersr-   handlersessions      r.   	subscribezLanguageServerManager.subscribe   su    -##G$;<<?HNN>EE+   
 Fy>>G,<<r0   c                 6  K   |                      t          j        ||j                   d {V  | j                            |j                  }|4| j                            d                    |j                             d S |	                    |           d S )Nz'[{}] no session: client message dropped)
wait_for_listenersr   rn   re   rg   r<   ru   r   r   write)r-   messager   r   s       r.   on_client_messagez'LanguageServerManager.on_client_message   s      %%'*A
 
 	
 	
 	
 	
 	
 	
 	
 -##G$;<<?HNN9@@+   
 Fgr0   c                    K   fd| j                                         D             }|D ])}|                     t          j        ||           d {V  *j        D ]}|                    |           d S )Nc                 &    g | ]\  }}|k    |S r+   r+   )r\   ls_keysessr   s      r.   
<listcomp>z;LanguageServerManager.on_server_message.<locals>.<listcomp>   s)     
 
 
#vtFr0   )rg   rb   r   r   rp   r   write_message)r-   r   r   r)   r   s     `  r.   on_server_messagez'LanguageServerManager.on_server_message   s      
 
 
 
'+}':':'<'<
 
 
 !1 	 	))#W.>          ' 	+ 	+G!!'****	+ 	+r0   c                     | j                             j                  }|4| j                            d                    j                             d S fd|j        D             |_        d S )Nz.[{}] no session: handler unsubscription failedc                      g | ]
}|k    |S r+   r+   )r\   hr   s     r.   r   z5LanguageServerManager.unsubscribe.<locals>.<listcomp>   s    HHH!1<<A<<<r0   )rg   r<   re   ru   r   r   r   r   s    ` r.   unsubscribez!LanguageServerManager.unsubscribe   s}    -##G$;<<?HNN@GG+   
 FHHHHw'7HHHr0   c              #     K   d }	 t          t                    }n*# t          $ r | j                            d           Y nw xY wg }|pg D ]}	 |                                }nW# t          $ rJ}| j                            t          d                              |j	        |                     Y d }~hd }~ww xY w	 |rUt          |d          rEt          t          |          }|                    |           s|                    |j	                    ||           pi }nk# t          $ r^}| j                            t          d                              |j	        |                     t          j                     Y d }~9d }~ww xY wt#          t%          j        |                    }	|	rB| j                            t          d                              |j	        |	                     |                                D ]\  }
}|
|fV  |rO| j                            t          d                              d                    |                               d S d S )	Nri   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   rt   ru   	exceptionrs   rv   r   r   rw   hasattrr   r    r   rr   	traceback	print_exclistr   iter_errorsrb   infojoin)r-   rV   _entry_pointsskipped_serversepspec_finderr   spec_finder_from_basespecserrorsr]   r^   s               r.   ra   z2LanguageServerManager._autodetect_language_servers   s     	>(z:::MM 	> 	> 	>H<=====	> %2 *	  *	 B ggii     MNNUU   
 ! %{N;; %04X{0K0K-4AA$GG %+2227;;;$#D))/R 	 	 	  %  fRWc**	   #%%%	 2>uEEFFF   %  fRWf--	   "[[]]    	T4i   	HMM788??IIo..     	 	sH    $AAA%%
B9/A B44B9=AD"D""
F
,AFF
)rS   N)+r>   
__module____qualname____doc__r   r   r   r7   tagr)   r   r`   Dict_r   r   rg   r   r1   rL   List_r   rm   rq   ro   r   r/   r6   rA   rF   rN   rR   rI   boolr   rX   rK   rJ   r   r   r   r   ra   __classcell__)r=   s   @r.   r#   r#   1   s(       !!$f*QRSS  
 v*QIJJ   
c 
    11WXX  	c 
    uh,--5  H $G   
cc  T;5  F E 011155T5BBMu#3444888EEu#3444888EEW    !  W$%%E E &%E W&''    (' # # # # #    
Y Y Y YY"Y	!Y Y Y Y&! ! !V V V(= = =   + + +I I I;4 ; ; ; ; ; ; ; ;r0   r#   )4r   rP   r4   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   r   r   trait_typesr   r   typesr   r   r   r    r!   r#   rx   lsp_message_listenerr+   r0   r.   <module>r      ss     				 



     * * * * * * * * * * * * g///////////// 2 2 2 2 2 2 8 8 8 8 8 8,4444444 , , ,++++++++,       # # # # # #       # # # # # # & & & & & & & &              - , , , , , * * * * * * 1 1 1 1 1 1 1 1             ~ ~ ~ ~ ~4 ~ ~ ~D -F   s   A AA