
    Xh0*                        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 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-      Z1e1jd                  Z3y# e$ r	 dd	lmZ Y uw xY w)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U dZ ee ed            Z ee ed            j                  d      Z	 e
d ed            j                  d      Zeed	<    e ee      i d
      Zeee   ef   ed<    ed      j                  d      Z e
dd      Z ee      j                  d      Z ee      j                  d      Z ee      j                  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    G/var/www/html/myenv/lib/python3.12/site-packages/jupyter_lsp/manager.py_default_language_serversz/LanguageServerManager._default_language_serversd   s    	    virtual_documents_dirc                 6    t        j                  dd       xs dS )NJP_LSP_VIRTUAL_DIRz.virtual_documents)osgetenvr/   s    r1   _default_virtual_documents_dirz4LanguageServerManager._default_virtual_documents_dirh   s    yy-t4L8LLr3   conf_d_language_serversreturnc           
          i }t        t                     }t        D ][  } |j                  di |j	                  d| d      j	                  | j
                  j                  i       j	                  di        ] |S )N)read_config_pathjupyterr&   r+   r.   )r   r
   r   updateget	__class____name__)r0   r+   managerapps       r1    _default_conf_d_language_serversz6LanguageServerManager._default_conf_d_language_serversl   s{    571D1FG( 	C### ++uF34T^^,,b1',	  r3   kwargsc                 @    i | _         i | _        t        |   di | y)z4Before starting, perform all necessary configurationNr.   )all_language_servers_language_servers_from_configsuper__init__)r0   rF   rA   s     r1   rK   zLanguageServerManager.__init__{   s#    >@!GI*"6"r3   c                 r    | j                          | j                          | j                          d| _        y )NT)init_language_serversinit_listenersinit_sessions_ready)r0   argsrF   s      r1   
initializez LanguageServerManager.initialize   s-    ""$r3   c                 |   K   | j                   s*t        j                  d       d {    | j                   s*y7 w)Ng?T)rP   asynciosleepr/   s    r1   readyzLanguageServerManager.ready   s0     ++--$$$ ++ %s   %<:<<c                     t        | j                        | _        | j                  d      | _        | j                  d      | _        y)z2determine the final language server configuration.Tonly_installedFN)dictr+   rI   _collect_language_serversrH   r/   s    r1   rM   z+LanguageServerManager.init_language_servers   sD     .2$2G2G-H* $ > >d > S$($B$BRW$B$X!r3   rY   c                 Z   i }t        | j                        }|j                  | j                         | j                  r!|j                  | j                  |             |j                  |       |j                         D ci c]  \  }}|j                  d      s|| c}}S c c}}w )NrX   argv)rZ   rI   r?   r:   r'   _autodetect_language_serversitemsr@   )r0   rY   r+   language_servers_from_configkeyspecs         r1   r[   z/LanguageServerManager._collect_language_servers   s     68'+D,N,N'O$$++D,H,HI??##111P
 	 <= ,<+A+A+CXic4txxPVGWT	XXXs   B'B'c                 |    i }| j                   j                         D ]  \  }}t        |||       ||<    || _        y)z*create, but do not initialize all sessions)language_serverrb   parentN)r+   r_   r   r*   )r0   r*   rd   rb   s       r1   rO   z#LanguageServerManager.init_sessions   sI    %)%:%:%@%@%B 	!OT(= /d4)H_%	 !r3   c                 D   t         j                  | j                  t        gt         j                  | j
                  t        gt         j                  | j                  t        gi}|j                         D ]n  \  }}|\  }}t        |      D ]"  }	 |j                  |j                                $ |D ].  } | j$                  j'                  |j(                        |       0 p y# t        $ r1}| j                  j!                  d|j"                  |       Y d}~d}~ww xY w)z'register traitlets-configured listenersgroupz!Failed to load entry point %s: %sN)scope)r   ALLall_listenersr   CLIENTclient_listenersr   SERVERserver_listenersr   r_   r	   appendload	ExceptionlogwarningnamerA   register_message_listenervalue)	r0   scopesri   trt_ep	listenersentry_pointepterrlisteners	            r1   rN   z$LanguageServerManager.init_listeners   s    t113EF$"7"79N!O$"7"79N!O

 $\\^ 
	VME6%+"I{#+6 YY$$SXXZ0Y & VK88u{{8KHUV
	V ! YHH$$%H#((TWXXYs   C%%	D.'DDc                     | j                   j                  |j                        }|5| j                  j	                  dj                  |j                               yt        |g      |j                  z  |_        y)z&subscribe a handler to session, or staNz,[{}] no session: handler subscription failed)r*   r@   rd   rs   errorformatsethandlers)r0   handlersessions      r1   	subscribezLanguageServerManager.subscribe   sf    --##G$;$;<?HHNN>EE++
 y>G,<,<<r3   c                 P  K   | j                  t        j                  ||j                         d {    | j                  j                  |j                        }|5| j                  j                  dj                  |j                               y |j                  |       y 7 rw)Nz'[{}] no session: client message dropped)
wait_for_listenersr   rl   rd   r*   r@   rs   r   r   write)r0   messager   r   s       r1   on_client_messagez'LanguageServerManager.on_client_message   s     %%'*A*A
 	
 	
 --##G$;$;<?HHNN9@@++
 g	
s   /B&B$A3B&c                 $  K   | j                   j                         D cg c]  \  }}||k(  s| }}}|D ]+  }| j                  t        j                  ||       d {    - |j
                  D ]  }|j                  |        y c c}}w 7 /wr-   )r*   r_   r   r   rn   r   write_message)r0   r   r   ls_keysessr+   r   s          r1   on_server_messagez'LanguageServerManager.on_server_message   s     '+}}':':'<
#vtF
 
 !1 	))##W.>  	
 '' 	+G!!'*	+

s    BBB,BB0Bc                    | j                   j                  |j                        }|5| j                  j	                  dj                  |j                               y |j                  D cg c]
  }||k7  s	| c}|_        y c c}w )Nz.[{}] no session: handler unsubscription failed)r*   r@   rd   rs   r   r   r   )r0   r   r   hs       r1   unsubscribez!LanguageServerManager.unsubscribe   so    --##G$;$;<?HHNN@GG++
 '.'7'7H!1<AHHs   +
B6Bc              #   t  K   d }	 t        t              }g }|xs g D ]  }	 |j                         }	 |rIt        |d      r=t        t        |      }|j                  |       s|j                  |j                         ` ||       xs i }t#        t%        j&                  |            }	|	r?| j                  j                  t        d      j                  |j                  |	             |j)                         D ]  \  }
}|
|f   |rC| j                  j+                  t        d      j                  dj-                  |                   y y # t        $ r | j                  j	                  d       Y `w xY w# t        $ rI}| j                  j                  t        d      j                  |j                  |             Y d }~d }~ww xY w# t        $ r]}| j                  j                  t        d      j                  |j                  |             t        j                           Y d }~d }~ww xY ww)	Nrg   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   rr   rs   	exceptionrq   rt   r   r   ru   hasattrr   r    r   rp   	traceback	print_exclistr   iter_errorsr_   infojoin)r0   rY   _entry_pointsskipped_serversepspec_finderr}   spec_finder_from_basespecserrorsra   rb   s               r1   r^   z2LanguageServerManager._autodetect_language_servers   s    	>(z:M %2 *	 B)+!{N;04X{0K-4AA$G+22277;$#D)/R 2>>uEFF  % fRWWf-	 "[[]  	T4i S*	 X HHMM78??IIo. c  	>HH<=	>    MNUU
    	  % fRWWc*	 ##%	s   H8E H8E:A
G=H8>G
CH8$E73H86E77H8:	G>GH8GH8	H5AH0*H80H55H8)r;   N)/rB   
__module____qualname____doc__r   r   r   r:   tagr+   r   r'   bool__annotations__Dict_r   r   r*   r   r   r   r   r4   rP   List_r   rk   ro   rm   r   r2   r9   r   rE   rK   rR   rV   rM   r[   rO   rN   r   r   r   r   r^   __classcell__)rA   s   @r1   r#   r#   2   s   !$*RS
 *IJ 
c 
   1WX	cc  
 	019	
 d5; 556  $ 
cc  ;5F 	cc  	cc  	cc    ! $%M &M &' 2J   ( # #
YY"Y	!Y&!V(= +I;4 ;r3   r#   )4r   rT   r7   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#   rv   lsp_message_listenerr.   r3   r1   <module>r      s     	 
  * * g// 2 8,4  #  # &  - * 1 D4 DP -FF I	  ,+,s   B6 6CC