
    Mh(*                        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                   H    e Zd ZU dZ ee ed                    Z ee ed                                        d          Z	 e
d ed                                        d          Zeed	<    e ee          i d
          Zeee         ef         ed<    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e fd            Z!def 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%   
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                     i S )N selfs    S/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/jupyter_lsp/manager.py_default_language_serversz/LanguageServerManager._default_language_serversd   s    	    virtual_documents_dirc                 ,    t          j        dd          S )NJP_LSP_VIRTUAL_DIRz.virtual_documents)osgetenvr.   s    r0   _default_virtual_documents_dirz4LanguageServerManager._default_virtual_documents_dirh   s    y-/CDDDr2   conf_d_language_serversreturnc           
         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       r0    _default_conf_d_language_serversz6LanguageServerManager._default_conf_d_language_serversl   s    571D1F1FGGG( 	 	C##  ++333344T^,b11',,     r2   kwargsc                 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/   rE   r@   s     r0   rJ   zLanguageServerManager.__init__{   s6    >@!GI*""6"""""r2   c                     |                                   |                                  |                                  d| _        d S )NT)init_language_serversinit_listenersinit_sessions_ready)r/   argsrE   s      r0   
initializez LanguageServerManager.initialize   sC    ""$$$r2   c                 Z   K   | j         s!t          j        d           d {V  | j         !dS )Ng?T)rO   asynciosleepr.   s    r0   readyzLanguageServerManager.ready   sC      + 	%-$$$$$$$$$ + 	%tr2   Nc                     t          | j                  | _        |                     d          | _        |                     d          | _        dS )z2determine the final language server configuration.Tonly_installedFN)dictr+   rH   _collect_language_serversrG   r.   s    r0   rL   z+LanguageServerManager.init_language_servers   sP     .2$2G-H-H* $ > >d > S S$($B$BRW$B$X$X!!!r2   rX   c                 (   i }t          | j                  }|                    | j                   | j        r)|                    |                     |                     |                    |           d |                                D             S )NrW   c                 D    i | ]\  }}|                     d           ||S )argv)r?   ).0keyspecs      r0   
<dictcomp>zCLanguageServerManager._collect_language_servers.<locals>.<dictcomp>   s0    XXXic4txxPVGWGWXTXXXr2   )rY   rH   r>   r9   r'   _autodetect_language_serversitems)r/   rX   r+   language_servers_from_configs       r0   rZ   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Xr2   c                     i }| j                                         D ]\  }}t          |||           ||<   || _        dS )z*create, but do not initialize all sessions)language_serverr`   parentN)r+   rc   r   r*   )r/   r*   rf   r`   s       r0   rN   z#LanguageServerManager.init_sessions   sZ    %)%:%@%@%B%B 	 	!OT(= /d4) ) )H_%% !r2   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   rc   r	   appendload	Exceptionlogwarningnamer@   register_message_listenervalue)	r/   scopesrk   trt_ep	listenersentry_pointepterrlisteners	            r0   rM   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)r*   r?   rf   ru   errorformatsethandlersr/   handlersessions      r0   	subscribezLanguageServerManager.subscribe   su    -##G$;<<?HNN>EE+   
 Fy>>G,<<r2   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   rf   r*   r?   ru   r   r   write)r/   messager   r   s       r0   on_client_messagez'LanguageServerManager.on_client_message   s      %%'*A
 
 	
 	
 	
 	
 	
 	
 	
 -##G$;<<?HNN9@@+   
 Fgr2   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      r0   
<listcomp>z;LanguageServerManager.on_server_message.<locals>.<listcomp>   s)     
 
 
#vtFr2   )r*   rc   r   r   rp   r   write_message)r/   r   r   r+   r   s     `  r0   on_server_messagez'LanguageServerManager.on_server_message   s      
 
 
 
'+}':':'<'<
 
 
 !1 	 	))#W.>          ' 	+ 	+G!!'****	+ 	+r2   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     r0   r   z5LanguageServerManager.unsubscribe.<locals>.<listcomp>   s    HHH!1<<A<<<r2   )r*   r?   rf   ru   r   r   r   r   s    ` r0   unsubscribez!LanguageServerManager.unsubscribe   s}    -##G$;<<?HNN@GG+   
 FHHHHw'7HHHr2   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_errorsrc   infojoin)r/   rX   _entry_pointsskipped_serversepspec_finderr   spec_finder_from_basespecserrorsr_   r`   s               r0   rb   z2LanguageServerManager._autodetect_language_servers   s     	>(z:::MM 	> 	> 	>H<=====	> %2 *	  *	 B)+     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
)r:   N)/rA   
__module____qualname____doc__r   r   r   r9   tagr+   r   r'   bool__annotations__Dict_r   r   r*   r   r   r   r   r3   rO   List_r   rm   rq   ro   r   r1   r8   r   rD   rJ   rQ   rU   rL   rZ   rN   rM   r   r   r   r   rb   __classcell__)r@   s   @r0   r#   r#   2   s        !!$f*QRSS  
 v*QIJJ   
c 
    t11WXX  	cc    
 	(0119	
 	
 	
 d5; 556    $G   
cc  T;5  F E  	cc  u  	cc  u  	cc  W    !  W$%%E E &%E W&'' 2J       (' # # # # # # #    
Y Y Y YY"Y	!Y Y Y Y&! ! !V V V(= = =   + + +I I I;4 ; ; ; ; ; ; ; ;r2   r#   )4r   rS   r6   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-   r2   r0   <module>r      su     				 



     * * * * * * * * * * * * 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             D D D D D4 D D DP -F   s   A AA