
    Fh                         S r SSKrSSKrSSKrSSKrSSKrSSKJrJr  SSKJ	r	  SSK
Jr  SSKJr  SSKJrJrJrJrJrJr  SSKJr  S	S
KJr  S	SKJr  S	SKJr  S	SKJr  S	SKJ r    " S S\5      r!g)z1A session for managing a language server process
    N)datetimetimezone)IOLoop)Queue)WebSocketHandler)BunchInstanceSetUnicodeUseEnumobserve)LoggingConfigurable   )stdio)LANGUAGE_SERVER_SPEC)censored_spec)Schema)SessionStatusc                     ^  \ rS rSrSr\" SS9r\" \5      r	\
" \R                  SSS9r\
" \R                  SSS9r\
" \R"                  S	SS9r\
" \S
SS9r\
" \SSS9r\" \
" \5      / SS9r\" \\R6                  S9r\
" \SS9r\
" \SS9rSr SS/r!U 4S jr"S r#S r$S r%S r&\'" S5      S\(4S j5       r)S r*S r+S r,S r-S r.S  r/S! r0S" r1S# r2S$ r3S%r4U =r5$ )&LanguageServerSession   z6Manage a session for a connection to a language serverz'the language server implementation name)helpzthe language server subprocessT)r   
allow_nonezthe JSON-RPC writerzthe JSON-RPC readerz+a queue for string messages from the serverz(a queue for string message to the serverz#the currently subscribed websockets)traitdefault_valuer   )r   )r   Nargv
debug_argvc                 f   > [         TU ]  " U0 UD6  [        R                  " U R                  5        g)z=set up the required traitlets and exit behavior for a sessionN)super__init__atexitregisterstop)selfargskwargs	__class__s      fC:\Users\julio\OneDrive\Documentos\Trabajo\Ideas Frescas\venv\Lib\site-packages\jupyter_lsp/session.pyr    LanguageServerSession.__init__7   s%    $)&)		"    c                 R    SR                   " SSU R                  0U R                  D6$ )NzG<LanguageServerSession(language_server={language_server}, argv={argv})>language_server )formatr,   specr$   s    r(   __repr__LanguageServerSession.__repr__<   s7    X
& D!%!5!5D9=D 	Dr*   c           	      <   [        [        U R                  5      U R                  R                  U R
                  (       a  U R
                  R                  5       OS U R                  (       a  U R                  R                  5       OS [        U R                  5      S9$ )N)handler_countstatuslast_server_message_atlast_handler_message_atr/   )
dictlenhandlersr5   valuer6   	isoformatr7   r   r/   r0   s    r(   to_jsonLanguageServerSession.to_jsonA   sx    dmm,;;$$ .. ++557 // ,,668tyy)
 	
r*   c                    U R                  5         [        R                  U l        U R	                  5         U R                  5         U R                  5         U R                  5         [        R                  " 5       nU R                  U R                  U R                  4 Vs/ s H  nUR                  U" 5       5      PM     snU l        [        R                  U l        gs  snf )z((re)initialize a language server sessionN)r#   r   STARTINGr5   init_queuesinit_processinit_writerinit_readerasyncioget_event_loop	_read_lsp
_write_lsp_broadcast_from_lspcreate_task_tasksSTARTED)r$   loopcoros      r(   
initialize LanguageServerSession.initializeR   s    		#,,%%' $:R:RS
S TV$S

 $++
s     Cc                    [         R                  U l        U R                  (       a!  U R                  R	                  5         SU l        U R
                  (       a!  U R
                  R                  5         SU l        U R                  (       a!  U R                  R                  5         SU l        U R                  (       a)  U R                   Vs/ s H  oR                  5       PM       n[         R                  U l        gs  snf )z(clean up all of the state of the sessionN)r   STOPPINGr5   process	terminatereaderclosewriterrK   cancelSTOPPED)r$   tasks     r(   r#   LanguageServerSession.stopc   s     $,,<<LL""$DL;;KKDK;;KKDK;;'+{{3{t[[]{3#++ 4s   C<r:   changec                     US   (       a"  U R                   (       d  U R                  5         gUS   (       d#  U R                   (       a  U R                  5         ggg)z?re-initialize if someone starts listening, or stop if nobody isnewN)rS   rO   r#   )r$   r\   s     r(   _on_handlers"LanguageServerSession._on_handlersw   s8     %=OO4<<IIK $0r*   c                     U R                  5       U l        [        R                  " 5       R	                  U R
                  R                  U5        g)z9wrapper around the write queue to keep it mostly internalN)nowr7   r   currentadd_callbackto_lsp
put_nowaitr$   messages     r(   writeLanguageServerSession.write   s1    '+xxz$%%dkk&<&<gFr*   c                 J    [         R                  " [        R                  5      $ N)r   rb   r   utcr0   s    r(   rb   LanguageServerSession.now   s    ||HLL))r*   c                     [         R                  " U R                  S   [         R                  [         R                  U R	                  U R                  R                  S0 5      [        R                  5      SS9U l        g)z$start the language server subprocessr   envr   )stdinstdoutrp   bufsizeN)	
subprocessPopenr/   PIPEsubstitute_envgetosenvironrS   r0   s    r(   rB   "LanguageServerSession.init_process   sT    !''IIf//??##DIIMM%$<bjjI
r*   c                 @    [        5       U l        [        5       U l        g)zcreate the queuesN)r   from_lspre   r0   s    r(   rA   !LanguageServerSession.init_queues   s    gr*   c                 v    [         R                  " U R                  R                  U R                  U S9U l        g)z3create the stdout reader (from the language server)streamqueueparentN)r   LspStdIoReaderrS   rr   r}   rU   r0   s    r(   rD   !LanguageServerSession.init_reader   s)    **<<&&dmmD
r*   c                 v    [         R                  " U R                  R                  U R                  U S9U l        g)z0create the stdin writer (to the language server)r   N)r   LspStdIoWriterrS   rq   re   rW   r0   s    r(   rC   !LanguageServerSession.init_writer   s)    **<<%%T[[
r*   c                     UR                  5       nUR                  5        H;  u  pEUR                  U[        R                  " U5      R                  U5      05        M=     U$ rl   )copyitemsupdatestringTemplatesafe_substitute)r$   rp   base	final_envkeyr;   s         r(   rw   $LanguageServerSession.substitute_env   sN    IIK	))+JCc6??5#9#I#I$#OPQ & r*   c                 T   #    U R                   R                  5       I S h  vN   g  N7frl   )rU   readr0   s    r(   rG   LanguageServerSession._read_lsp   s     kk      (&(c                 T   #    U R                   R                  5       I S h  vN   g  N7frl   )rW   ri   r0   s    r(   rH    LanguageServerSession._write_lsp   s     kk!!!r   c                    #    U R                     Sh  vN nU R                  5       U l        U R                  R	                  X5      I Sh  vN   U R                   R                  5         M]   NX N"
 g7f)zNloop for reading messages from the queue of messages from the language
server
N)r}   rb   r6   r   on_server_message	task_donerg   s     r(   rI   )LanguageServerSession._broadcast_from_lsp   sX      "]] 	&'*.((*D'++//>>>MM##%	&> +s7   A2A0A,A04A2A. A2,A0.A20A2)	rK   r}   r7   r6   rS   rU   r5   re   rW   )6__name__
__module____qualname____firstlineno____doc__r   r,   r   r   r/   r	   rt   ru   rS   r   r   rW   r   rU   r   r}   re   r
   r   r:   r   r   NOT_STARTEDr5   r   r7   r6   rK   _skip_serializer    r1   r=   rO   r#   r   r   r_   ri   rb   rB   rA   rD   rC   rw   rG   rH   rI   __static_attributes____classcell__)r'   s   @r(   r   r      sT   @#LMO&'D ?DG e**1FSWXFe**1FSWXFAdH >4F '(2H
 ]-2K2KLF&xDA%h4@F|,O#
D

",",( Z5  G
*



!"& &r*   r   )"r   rE   r!   ry   r   rt   r   r   tornado.ioloopr   tornado.queuesr   tornado.websocketr   	traitletsr   r	   r
   r   r   r   traitlets.configr    r   schemar   specs.utilsr   trait_typesr   typesr   r   r-   r*   r(   <module>r      sN      	   ' !   . E E 0  ( &   _&/ _&r*   