
    Zg-                     r   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rSSKrSSKrSSK	J
r
  SSKJr  SSKJrJr  SSKJrJrJr  SSKJr  SSKJr  SS	KJrJr  S
r\R8                  " \5      r\R>                  \R@                  \RB                  \RD                  4u  rr r!r#0 SS00 S.r$S\%S\%4S jr& " S S\'5      r(g)z*Implements a Nvim host for python plugins.    N)partial)
format_exc)AnySequence)Nvimdecode_if_byteswalk)ErrorResponse)script_host)format_exc_skipget_client_info)Hostnargs   pollspecsshutdownpathnamec                     U(       d  [        S5      e[        R                  R                  U 5        [        R
                  " U5      $ )a  Import python module `name` from a known file path or module directory.

The path should be the base directory from which the module can be imported.
To support python 3.12, the use of `imp` should be avoided.
@see https://docs.python.org/3.12/whatsnew/3.12.html#imp
zMissing module name.)
ValueErrorsysr   append	importlibimport_module)r   r   s     4/usr/lib/python3/dist-packages/pynvim/plugin/host.py_handle_importr      s4     /00HHOOD""4((    c                       \ rS rSrSrS\4S jrS\SS4S jrS	\	S\SS4S
 jr
S rSS jrS rS rS\S\\	   SS4S jrS\S\\	   SS4S jrS rS\\   SS4S jrSS jrS rS rS rS rS rSrg)r   ,   zNvim host for python plugins.

Takes care of loading/unloading plugins and routing msgpack-rpc
requests/notifications to the appropriate handlers.
nvimc                     Xl         0 U l        0 U l        0 U l        SU R                  0U l        S U R                  U R                  S.U l        SU l	        g)z+Set handlers for plugin_load/plugin_unload.nvim_error_eventc                      g)Nok r'   r   r   <lambda>Host.__init__.<locals>.<lambda>>   s    Dr   r   TN)
r"   _specs_loaded_load_errors_on_error_event_notification_handlers_on_specs_requestr   _request_handlers_decode_default)selfr"   s     r   __init__Host.__init__4   s[    	 4 4'
# !++"
  $r   msgreturnNc                 8    U R                   R                  USS9  g )NTasync_)r"   	err_write)r2   r5   s     r   _on_async_errHost._on_async_errE   s    		C-r   kindc                     SR                  U R                  [        U5      5      nU R                  R	                  USS9  U$ )Nz&{}: Async request caused an error:
{}
Tr8   )formatr   r   r"   r:   )r2   r=   r5   errmsgs       r   r-   Host._on_error_eventI   s>     <BBIIs+-		F40r   c                    ^ ^ T R                   R                  T R                  T R                  UU 4S jT R                  S9  g)z;Start listening for msgpack-rpc requests and notifications.c                  &   > TR                  T 5      $ )N)_load)pluginsr2   s   r   r(   Host.start.<locals>.<lambda>U   s    4::g#6r   )err_cbN)r"   run_loop_on_request_on_notificationr;   )r2   rE   s   ``r   start
Host.startQ   s7    		4++006"&"4"4 	 	6r   c                 X    U R                  5         U R                  R                  5         g)zShutdown the host.N)_unloadr"   	stop_loop)r2   s    r   r   Host.shutdownX   s    		r   c                 0   U H<  nUR                   n	UR                  (       a  U R                  U		 M/  U R                  U		 M>     U" U R	                  U5      5      n
U R                  XUS5        U(       a  U R                  U   " U6 $ U R                  U   " U6 $ )NF)_nvim_registered_name_nvim_rpc_syncr0   r.   _configure_nvim_for_discover_functions)r2   clsdelayed_handlersr   syncmodule_handlersr   argshandlermethod_nameplugins              r   _wrap_delayed_functionHost._wrap_delayed_function]   s     (G!77K%%**;7//< ( T--c23 	  $F))$/66..t4d;;r   c                 >   U(       a  [        [        Xc5      nUb  UR                  SU5         U" U6 $ ! [         a_    U(       a&  SR	                  XV[        S5      5      n[        U5      eSR	                  XV[        S5      5      nU R                  US-   5         g f = f)Nr   z+error caught in request handler '{} {}':
{}r   z)error caught in async handler '{} {}'
{}

)r	   r   insert	Exceptionr?   r   r
   r;   )r2   fnrX   decode	nvim_bindr   rZ   r5   s           r   _wrap_functionHost._wrap_functionq   s    6D KK9%
	/t9 	/Et?1+=> #C((Dt?1+=> ""3:.	/s   3 A&BBr   rZ   c                     [        U5      nU R                  R                  US5      nU(       d  U R                  US5      n [	        U5      e U" U6 n U$ )zHandle a msgpack-rpc request.Nrequest)r   r0   get_missing_handler_errorr
   )r2   r   rZ   r[   r5   rvs         r   rI   Host._on_request   s[    t$((,,T48--dI>C$$d^	r   c                     [        U5      nU R                  R                  US5      nU(       d(  U R                  US5      n U R	                  US-   5        g U" U6   g)z"Handle a msgpack-rpc notification.Nnotificationra   )r   r.   rk   rl   r;   )r2   r   rZ   r[   r5   s        r   rJ   Host._on_notification   s[    t$--11$=--dNCCsTz*r   c                     SR                  X!5      n[        R                  " SU5      nU(       a5  U R                  R	                  UR                  S5      5      nUb  US-   U-   nU$ )Nz!no {} handler registered for "{}"z(.+):[^:]+:[^:]+r   ra   )r?   rematchr,   rk   group)r2   r   r=   r5   	pathmatchloader_errors         r   rl   Host._missing_handler_error   s^    188DHH0$7	,,001CDL'Dj</
r   rE   c           
      d   SnU H  n[         R                  " [        R                  R	                  U5      5      R                  5       nSnX0R                  ;   a   MX   US:X  a	  [        nSnOL[        R                  R                  [        R                  R                  U5      S   5      u  pg[        Xg5      n/ nU R                  XXU5        U R                  XXUS5        U(       d   M  XS.U R                  U'   M     ['        U5      S	:X  a	  U(       a  S
OSn
[)        U
S[*        5      nUS   U l        U R.                  R0                  R2                  " USS06  g! [         aJ  n	SR                  [        U	5      R                   X9[#        S5      5      n X@R$                  U'    Sn	A	GM  Sn	A	ff = f)zLoad the remote plugins and register handlers defined in the plugins.

Args:
    plugins: List of plugin paths to rplugin python modules
        registered by remote#host#RegisterPlugin('python3', ...)
        (see the generated rplugin.vim manifest)
FNzscript_host.pyTr   )handlersmodulez*Encountered {} loading plugin at {}: {}
{}   r   zscript-hostzrplugin-hosthostr9   )pathlibPathosr   normpathas_posixr+   r   splitsplitextr   _discover_classesrU   rc   r?   type__name__r   r,   lenr   host_method_specr   r"   apiset_client_info)r2   rE   
has_scriptr   errr{   	directoryr   rz   er=   infos               r   rD   
Host._load   sr    
D<< 0 0 67@@BDC||#.++(F!%J&(ggmmBGG4D4DT4J14M&NOI+I<F&&v>((4G2:%MT"+ : "%W!2z# 	tV-=>G			%%t9D9  .DtAw//*Q-H *-!!$''.s   B
E*E
F/%>F**F/c                 (   U R                   R                  5        Hf  u  pUS   nU HV  nUR                  n[        US5      (       a	  U" 5         M)  UR                  (       a  U R
                  U	 MI  U R                  U	 MX     Mh     0 U l        0 U l         g )Nrz   _nvim_shutdown_hook)r+   itemsrR   hasattrrS   r0   r.   r*   )r2   r   r]   rz   r[   r\   s         r   rN   Host._unload   s     LL..0LDj)H#%;;7$9::I++..{;33K@ $ 1 r   c                     [         R                  " U[         R                  5       H,  u  pE[        USS5      (       d  M  U R	                  XRUS5        M.     g )N_nvim_pluginFT)inspect
getmembersisclassgetattrrU   )r2   r{   rz   plugin_path_rV   s         r   r   Host._discover_classes   sA    ((AFAsNE22((TJ Br   c           
         S n/ n/ n[        USU R                  5      n[        R                  " X5       GH  u  pU
R                  nU
R
                  (       a  SR                  X;5      nU
R                  nU(       a  [        U R                  UXkUX#5      nOI[        U
SU5      nS nU
R                  (       a  U R                  U
5      n[        U R                  U
XX5      nU R                  X5        Xl        U(       a8  XR                  ;   a  [!        SR                  U5      5      eXR                  U'   O7XR"                  ;   a  [!        SR                  U5      5      eXR"                  U'   [%        U
S5      (       a  UR'                  U
R(                  5        UR'                  U5        UR'                  U5        GM     U(       a  XpR*                  U'   g g )Nc                     [        U S5      $ )N_nvim_rpc_method_name)r   )os    r   	predicate+Host._discover_functions.<locals>.predicate   s    1566r   _nvim_decodez{}:{}z.Request handler for "{}" is already registeredz3Notification handler for "{}" is already registered_nvim_rpc_spec)r   r1   r   r   r   _nvim_prefix_plugin_pathr?   rS   r   r^   
_nvim_bindrT   rg   _copy_attributesrR   r0   rc   r.   r   r   r   r*   )r2   objrz   r   delayr   cls_handlersr   	objdecoder   rd   methodrX   
fn_wrappedre   rf   s                   r   rU   Host._discover_functions   s   	7 C1E1EF	''7EA--F** <$$D$T%@%@#%14%-<
 !^Y? 	== $ 8 8 <I$T%8%8"%)9F
!!"1/5,333# &<=CVF^M M1;&&v.888# &<=CVF^M M6@++F3r+,,R../OOJ'
+C 8D ',KK$ r   c           	          [        U5       H0  nUR                  S5      (       d  M  [        X#[        X5      5        M2     g )N_nvim_)dir
startswithsetattrr   )r2   rd   fn2attrs       r   r   Host._copy_attributes  s.    GDx((72#45 r   c                 F   [        U5      n[        R                  " [        R                  R                  U5      5      R                  5       nXR                  ;   a+  U R                  R                  U R                  U   S-   5        U R                  R                  US5      $ )Nra   r   )r   r~   r   r   r   r   r   r,   r"   	out_writer*   rk   )r2   r   s     r   r/   Host._on_specs_request  su    t$||BGG,,T23<<>$$$II 1 1$ 7$ >?{{tQ''r   c                 |    U R                   n[        USU R                  5      nU(       a  UR                  U5      nU$ )Nr   )r"   r   r1   with_decode)r2   r   r"   re   s       r   rT   Host._configure_nvim_for%  s7    yynd.B.BC##F+Dr   )r1   r,   r+   r.   r0   r*   r   r"   )r6   N)r   
__module____qualname____firstlineno____doc__r   r3   strr;   r   r-   rK   r   r^   rg   r   rI   rJ   rl   rD   rN   r   rU   r   r/   rT   __static_attributes__r'   r   r   r   r   ,   s    $T $". . .C c d 6
<(/" 8C= T "S  $ +:Xc] +:t +:ZK*-X6(r   r   ))r   r   r   loggingr   os.pathr~   rs   r   	functoolsr   	tracebackr   typingr   r   
pynvim.apir   r   r	   pynvim.msgpack_rpcr
   pynvim.pluginr   pynvim.utilr   r   __all__	getLoggerr   loggererrordebugr   warningwarnr   r   r   objectr   r'   r   r   <module>r      s    0    	   	 
      2 2 , % 8
			8	$"LL&,,"NN- udD '12F ) )C )6 r   