
    Je                     \   d Z ddlZddlZddlZddlmZ ddlZddlm	Z	m
Z
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mZmZ dd	lmZ dd
lmZ ddlmZmZm Z  ddl!m"Z" ddl#m$Z$ ddl%m&Z&m'Z'm(Z( ddl)m*Z* ddl+m,Z, dj[                  e*      Z. ej^                  e0      Z1 G d de      Z2y)zR
Manager for all LSP clients connected to the servers defined
in our Preferences.
    N)SignalSlotQTimer)QMessageBox)PYSIDE2)on_conf_change)InstallerPylspError)_get_conf_pathrunning_under_pytestrunning_in_mac_app)PYTHON_CONFIG)check_connection_port)SUPPORTED_LANGUAGESSpyderCompletionProviderWorkspaceUpdateKind)	LSPClient)TABS)ClientStatusLSPStatusWidgetServerDisabledMessageBox)PREFERRED_MODULES)is_module_installedz, c                   b   e Zd ZdZdZdZdZddddd	d
defddddddddddddddddddddd d!gZd"Z	e
Zd#Zd$Zd%d&gZd'Zd(Zd)Z ee      Z	 d* Zd+ Zd_d,efd-Zd. Zd/ Zd0 Zd1 Zd2 Zd3 Zd4 Zd5 Z d6 Z!d7 Z"d8 Z# e$       d9        Z%d: Z&d; Z' e$e      d<        Z(d= Z)d> Z*d? Z+d@ Z, e$e-e-      dA        Z. e$       dB        Z/dCed,efdDZ0e1dE        Z2 e1dFdGdHgI      dJ        Z3 e1dKdLI      dM        Z4 e1dNdOI      dP        Z5 e1dQdRdSgI      dT        Z6d_dUZ7dV Z8dW Z9dX Z:dY Z;dZ Z<d[ Z=d\ Z>d] Z?y^)`LanguageServerProviderz!Language Server Protocol manager.lsp   T)enable_hover_hintsT)show_lsp_down_warningT)code_completionT)jedi_definitionT)jedi_definition/follow_importsT)jedi_signature_helpTpreload_modules)pyflakesT)mccabeF)
formattingautopep8)format_on_saveF)pycodestyleF)pycodestyle/filename )pycodestyle/excluder,   )pycodestyle/selectr,   )pycodestyle/ignorer,   )pycodestyle/max_line_lengthO   )
pydocstyleF)pydocstyle/conventionnumpy)pydocstyle/selectr,   )pydocstyle/ignorer,   )pydocstyle/matchz(?!test_).*\.py)pydocstyle/match_dirz[^\.].*)zadvanced/enabledF)advanced/modulepylsp)advanced/host	127.0.0.1)advanced/port'  )advanced/externalF)advanced/stdioFz0.2.0stoppedrunningr<   	localhost   i'  i  c                    t        j                  | ||       i | _        i | _        i | _        i | _        i | _        i | _        t        i       | _	        i | _
        | j                          d| _        d | _        | j                  g| _        y )NT)r   __init__clientsclients_restart_countclients_restart_timersclients_restartingclients_hearbeatclients_statusbarsetrequestsregister_queueupdate_lsp_configurationshow_no_external_server_warningcurrent_project_pathcreate_statusbarSTATUS_BAR_CLASSES)selfparentconfigs      ]/usr/lib/python3/dist-packages/spyder/plugins/completion/providers/languageserver/provider.pyrF   zLanguageServerProvider.__init__   s     ))$?%'"&(#"$ "!#B %%'/3,$(! !!#
    c                 
   | j                   D ]Z  }	 | j                   |   H| j                   |   j                          | j                   |   j                  d       | j                   |= \ y# t        t        t
        f$ r Y tw xY w)zStop all heartbeatsN)rK   stop	setParent	TypeErrorKeyErrorRuntimeErrorrU   languages     rX   __del__zLanguageServerProvider.__del__   s    -- 	H((2>))(388:))(3==dC--h7	 x6 s   AA++BBra   c                    | j                   | j                  |      dd}|rWt        j                  dj	                  |             | j                  |t        j                         | j                  ||       y| j                  |   r| j                  | j                  |   z
  dz   }t        j                  dj	                  ||             | j                  |t        j                         | j                  |xx   dz  cc<   | j                  ||       | j                  |   }| j                  |   dk  rt        j                  d       d| j                  |<   | j                  |   j                          d| j                  |<   	 | j                  |   j                          | j                  |   j!                  d       | j                  |= t"        r|d	   j%                  ddd       n|d	   j%                          |d	   j                          | j-                  |       yyy# t&        t(        t*        f$ r Y *w xY w)
z#Restart language server on failure.NstatusrW   instancezManual restart for {}...r   z&Automatic restart attempt {} for {}...r   zRestart failed!Frf   )STOPPEDget_language_configloggerinfoformatupdate_statusr   
RESTARTINGrestart_clientrJ   MAX_RESTART_ATTEMPTSrH   rG   rI   r[   rK   r\   r   
disconnectr]   r^   r_   report_lsp_down)rU   ra   forceclient_configattemptclients         rX   restart_lspz"LanguageServerProvider.restart_lsp   s    ll..x8
 KK299(CDx)@)@A-8$$X.0033H=>@ABGKK@GG# $x)@)@A&&x0A50-8\\(+F ))(3q8-.49''1++H5::<8<++H5
))(388:))(3==dC--h7z*55dD$Gz*557:&++- $$X.! 9 /4 "8\: s   BH' 'H>=H>c                     t        ||       S N)r   )rU   rV   s     rX   rS   z'LanguageServerProvider.create_statusbar   s    vt,,rY   c                 x   |d   }|d   }d}|j                   r|j                         }|| j                  k(  r|rt        j	                  d       d| j
                  |<   | j                  |   j                          d| j                  |<   d| j                  |<   | j                  |t        j                         yyy)ze
        Check if a server restart was successful in order to stop
        further attempts.
        re   rf   TzRestart successful!FNr   )	stdio_pidis_stdio_aliveRUNNINGri   rj   rJ   rI   r[   rH   rl   r   READY)rU   ru   ra   re   rf   checks         rX   check_restartz$LanguageServerProvider.check_restart   s    
 !*% ++-ET\\!eKK-.05D##H-''166848D''134D&&x0x););< ',!rY   c                     t               rt        | dd      sy| j                  |   }|d   }|j                  dd      }|<|j	                         s|| j
                  k7  r|j                  j                  |       yyy)zJ
        Check if client or server for a given language are down.
        rG   Nre   rf   )r   getattrrG   getis_downr|   sig_went_downemit)rU   ra   ru   re   rf   s        rX   check_heartbeatz&LanguageServerProvider.check_heartbeat   s|    
  !4D1h'!::j$/!Vt||%;&&++H5 &<  rY   c                 ~    || j                   |<   | j                  j                  t        j                  d||fi        y)z5
        Update status for the current file.
        rl   N)rL   sig_call_statusbarr   r   ID)rU   ra   re   s      rX   rl   z$LanguageServerProvider.update_status   s=     ,2x($$(F1CR	IrY   c                     | j                   j                  |d      s | j                  |t        j                         | j                   j                  |      r"| j
                  |   }| j                  ||       yy)zG
        Update the status bar widget on client initilization.
        FN)rJ   r   rl   r   r}   rG   r   )rU   optionsra   ru   s       rX   on_initializez$LanguageServerProvider.on_initialize   si    
 &&**8U;x););< ""&&x0\\(+Fvx0 1rY   c                     t                j                  j                  d      s7t               s+	  j                     j                           j                     j                  d        j                  = t        j                  dj                               t               }|j                  d       |j                   j                         |j                  j!                   fd        j#                  t$        j&                         d j                  <    j(                   j*                  <   | j,                  <   |j/                          yyy# t        $ r Y w xY w)zG
        Handle automatic restart of client/server on failure.
        FNzAutomatic restart for {}...c                  &    j                         S rx   )rv   )ra   rU   s   rX   <lambda>z8LanguageServerProvider.handle_lsp_down.<locals>.<lambda>  s    $*:*:8*D rY   T)r	   rJ   r   r   rK   r[   r\   r^   ri   rj   rk   r   setSingleShotsetIntervalTIME_BETWEEN_RESTARTStimeoutconnectrl   r   rm   ro   rH   rI   start)rU   ra   timers   `` rX   handle_lsp_downz&LanguageServerProvider.handle_lsp_down  s7    	H%''++He<,.%%h/446%%h/99$?))(3 KK5<<XFG4LE&d889MM!!"DEx)@)@A04D##H-373L3LD&&x049D''1KKM% / =  s   AE# #	E/.E/c                     t        d      S )NzLanguage Server Protocol (LSP))r
   rU   s    rX   get_namezLanguageServerProvider.get_name#  s    122rY   c                     || j                   v rH| j                   |   d   }|!| j                  |   j                  ||f       y |j                  ||       y y )Nrf   )rG   rO   appendregister_file)rU   ra   filename
codeeditorlanguage_clients        rX   r   z$LanguageServerProvider.register_file&  sZ    t||#"ll84Z@O&##H-44h
5KL--h
C $rY   c                     dg}| j                   }|D ]8  }|t        D cg c]  }|j                          c}v s(|j                  |       : |S c c}w )zd
        Get the list of languages we need to start servers and create
        clients for.
        python)rW   r   lowerr   )rU   	languagesall_optionsoptionls        rX   get_languagesz$LanguageServerProvider.get_languages.  sY    
 J	kk! 	)F-@A!'')AA  (	)  Bs   Ac                 N    |dk(  r| j                         S | j                  |      S )z:Get language configuration options from our config system.r   )generate_python_configget_confr`   s     rX   rh   z*LanguageServerProvider.get_language_config:  s(    x..00==**rY   c                     | j                   }|sIt        j                  t               dd      }t        j                  |      st        j                  |       |S )z
        Get root path to pass to the LSP servers.

        This can be the current project path or the output of
        getcwd_or_home (except for Python, see below).
        	lsp_paths	root_path)rR   ospjoinr   existsosmakedirs)rU   ra   paths      rX   get_root_pathz$LanguageServerProvider.get_root_pathA  sE     (( 88MO[+FD::d#D!rY   c                 
   |t         j                  k(  r|| _        | j                  D ]  }| j                  |   }|d   | j                  k(  s%|d   }|j
                  r"|j                  r|j                  |||d       Xt        j                  dj                  |j                               | j                  |      }||_        | j                  j                  |       | j!                  |       | j#                  |        y)a  
        Send a didChangeWorkspaceFolders request to each LSP server
        when the project path changes so they can update their
        respective root paths.

        If the server doesn't support workspace updates, restart the
        client with the new root path.
        re   rf   )folderrf   kindzA{0}: LSP does not support multiple workspaces, restarting client!N)r   ADDITIONrR   rG   r|   support_multiple_workspacessupport_workspace_updatesend_workspace_folders_changeri   debugrk   ra   r   r   sig_stop_completionsr   %stop_completion_services_for_language&start_completion_services_for_language)rU   project_pathupdate_kindprojectsra   r   rf   r   s           rX   project_path_updatez*LanguageServerProvider.project_path_updateW  s     -666(4D% 	JH"ll84Ox(DLL8*:688 99::".$, +<  LL--3VH4E4E-F "//9F&,HO--228<>>xH??I)	JrY   c                 V    t        |dd      }| j                  j                  |       y)z0Report server errors in our error report dialog.Tz%Internal Python Language Server error)textis_tracebacktitleN)dictsig_exception_occurredr   )rU   error
error_datas      rX   report_server_errorz*LanguageServerProvider.report_server_error{  s+    9


 	##((4rY   c                     t         j                  dk(  rd}nd}t        d      j                  |||j	                               |z   fd}| j
                  j                  |       d| _        y)	za
        Report that connection couldn't be established with
        an external server.
        ntz<br><br>To fix this, please verify that your firewall or antivirus allows Python processes to open ports in your system, or the settings you introduced in our Preferences to connect to external LSP servers.zu<br><br>To fix this, please verify the settings you introduced in our Preferences to connect to external LSP servers.zIt appears there is no {language} language server listening at address:<br><br><tt>{host}:{port}</tt><br><br>Therefore, completion and linting for {language} will not work during this session.)hostportra   c                 D    t        j                  | t        d            S )NWarning)r   warningr
   )rV   warn_strs    rX   wrap_message_boxzJLanguageServerProvider.report_no_external_server.<locals>.wrap_message_box  s    &&vq|XFFrY   FN)r   namer
   rk   
capitalizesig_show_widgetr   rQ   )rU   r   r   ra   
os_messager   r   s         @rX   report_no_external_serverz0LanguageServerProvider.report_no_external_server  s    
 77d?( F   * + ,26x/B/B/D ,2 ,F 		G 	!!"23/4,rY   c                 ~   | j                  |t        j                         | j                  d      syt        j
                  dk(  rd}nd}t        d      j                  |j                               |z   t        d      z   }t        j                  || j                        }| j                  j                  |       y)	z\
        Report that either the transport layer or the LSP server are
        down.
        r   Nr   zTo try to fix this, please verify that your firewall or antivirus allows Python processes to open ports in your system, or restart Spyder.<br><br>z2This problem could be fixed by restarting Spyder. zCompletion and linting in the editor for {language} files will not work during the current session, or stopped working.<br><br>)ra   z"Do you want to restart Spyder now?)rl   r   DOWNr   r   r   r
   rk   r   r   rf   set_confr   r   )rU   ra   r   r   wrappers        rX   rq   z&LanguageServerProvider.report_lsp_down  s     	8\%6%67}}4577d?5  E 
    &(*=*=*?&@ 23	4 	 +33HdmmL!!'*rY   c                 *   d}|| j                   v r| j                   |   }| j                  |   }t               r!t        j                  j                  d      s|S |d   | j                  k(  }|| j                  vr~t        |       }|| j                  |<   |j                  | j                         |j                  j                  t        j                  | j                  |             |j!                          |d   | j"                  k(  r|d   }|d   rX|d   }|d   }t%        ||      }	|	s@| j&                  r| j)                  |||       | j+                  |t,        j.                         yt1        | || j3                  |      |      |d	<   | j5                  |d	          t6        j9                  d
j;                  |             |d	   j!                          | j                  |d<   d}|D ]  }
 |d	   j<                  |
   g | j                  |<   |S )z)Start an LSP client for a given language.FSPY_TEST_USE_INTROSPECTIONre   rW   externalr   r   )rV   server_settingsr   ra   rf   zStarting LSP client for {}...T)rG   rO   r   r   environr   r|   rK   r   r   TIME_HEARTBEATr   r   	functoolspartialr   r   rg   r   rQ   r   rl   r   r   r   r   register_client_instanceri   rj   rk   r   )rU   ra   startedr   queuer   rW   r   r   responseentrys              rX   r   z=LanguageServerProvider.start_completion_services_for_language  s    t||#"ll84O''1E $%zz~~&BC"N%h/4<<?Gt444 t27%%h/!!$"5"56%%i&7&7((('4 5x(DLL8(2
 *%!&>D!&>D4T4@H#?? :: $dH6**8\5F5FG$.7$*--h7%	/
+ --oj.IJ ;BB8LM
+113,0LL)" FE=OJ/==uEF02##H-rY   c                 ,   |j                   j                  | j                         |j                  j                  | j                         |j
                  j                  | j                         |j                  j                  | j                         y)z.Register signals emitted by a client instance.N)r   r   r   sig_initializer   sig_server_errorr   "sig_language_completions_available)rU   rf   s     rX   r   z/LanguageServerProvider.register_client_instance  sm    &&t';';<''(:(:;!!))$*B*BC''33	5rY   c                 N    | j                   j                  | j                         y rx   )sig_provider_readyr   COMPLETION_PROVIDER_NAMEr   s    rX   r   zLanguageServerProvider.start  s    $$T%B%BCrY   c                 r    t         j                  d       | j                  D ]  }| j                  |        y )NzShutting down LSP manager...)ri   rj   rG   r   r`   s     rX   shutdownzLanguageServerProvider.shutdown  s2    23 	AH66x@	ArY   c                 j    d}||k(  rd}|r(t         j                  d       | j                  d       yy)z
        Update server configuration after a change in Spyder's Python
        path.

        `path_dict` corresponds to the previous state of the Python path.
        `new_path_dict` corresponds to the new state of the Python path.
        TFzUpdate server's sys.pathpython_onlyN)ri   r   rP   )rU   	path_dictnew_path_dictupdates       rX   python_path_updatez)LanguageServerProvider.python_path_update  s<     %FLL34))d); rY   c                 (    | j                  d       y )NTr   )rP   r   s    rX   main_interpreter_changedz/LanguageServerProvider.main_interpreter_changed1  s    %%$%7rY   r   c                 ^    | j                   j                  t        j                  d|fi        y )Nset_current_language)r   r   r   r   )rU   r   ra   s      rX   file_opened_closed_or_updatedz4LanguageServerProvider.file_opened_closed_or_updated5  s)    $$ 6R	IrY   c                     || _         t               r t        j                  j	                  d      sy | j                          y Nr   )rW   r   r   r   r   rP   )rU   rW   s     rX   update_configurationz+LanguageServerProvider.update_configuration9  s/    !::>>">?%%'rY   outline_explorergroup_cellsshow_comments)sectionr   c                 x    t               r t        j                  j                  d      sy | j	                          y r  r   r   r   r   rP   rU   r   values      rX   #on_pyls_spyder_configuration_changez:LanguageServerProvider.on_pyls_spyder_configuration_changeA  *      !::>>">?%%'rY   completionsenable_code_snippetsc                 x    t               r t        j                  j                  d      sy | j	                          y r  r
  rU   r  s     rX   !on_code_snippets_enabled_disabledz8LanguageServerProvider.on_code_snippets_enabled_disabledI  s(    !::>>">?%%'rY   pythonpath_managerspyder_pythonpathc                 ~    t               r3t        j                  j                  d      r| j	                  d       y y y )Nr   Tr   r
  r  s     rX   on_pythonpath_option_updatez2LanguageServerProvider.on_pythonpath_option_updateP  s6     !"

;<))d); = #rY   main_interpreterdefaultcustom_interpreterc                 x    t               r t        j                  j                  d      sy | j	                          y r  r
  r  s      rX   on_main_interpreter_changez1LanguageServerProvider.on_main_interpreter_changeY  r  rY   c           	      <   | j                         D ]  }|r|dk7  r| j                  | j                  |      dd}|| j                  vr|| j                  |<   g | j                  |<   X| j                  |   d   }|d   }g d}t        |D cg c]  }||   ||   k7   c}      }|rt        j                  dj                  |             | j                  |   d   | j                  k(  r.|d   r|d   s| j                  ||       || j                  |<   | j                  |   d   | j                  k(  s)| j                  ||       =| j                  |   d   | j                  k(  s^| j                  |   d	   }	|	j                  |d
           yc c}w )z
        Update server configuration after changes done by the user
        through Spyder's Preferences.

        python_only: bool
            Perform an update only for the Python language server.
        r   Nrd   rW   )cmdargsr   r   r   stdiozRestart required for {} client!re   r   rf   configurations)r   rg   rh   rG   rO   anyri   r   rk   rn   r|   send_configurations)
rU   r   ra   rs   current_lang_confignew_lang_configrestart_diffxrestartru   s
             rX   rP   z/LanguageServerProvider.update_lsp_configurationa  s    **, "	?Hx83'+||'+'?'?'I)-/M t||+)6X&02##H-&*ll8&<X&F#"/"9 =(46#$  3159KK 6 7LL!B!I!I "" #||H-h74<<G 0
;$3J$? //-H5BDLL2h/9T\\I++HmD||H-h74<<G!%h!7
!C22+,<=?C"	?6s   F
c                     | j                   j                  |       | j                  |       || j                  |<   | j	                  |       y)zRestart a client.N)r   r   r   rG   r   )rU   ra   rW   s      rX   rn   z%LanguageServerProvider.restart_client  s@    !!&&x0228<!'X33H=rY   c                 R    | j                   D ]  }||vs| j                  |        y rx   )rG   r   )rU   
active_setra   s      rX   update_client_statusz+LanguageServerProvider.update_client_status  s-     	EHz)::8D	ErY   c                    || j                   v r| j                   |   }|d   | j                  k(  rt        j                  dj	                  |             	 t
        r|d   j                  d d d        n|d   j                          	 | j                  |   H| j                  |   j                          | j                  |   j                  d        | j                  |= |d   j                          | j                  |d<   | j                  j                  |       y y # t        $ r Y w xY w# t        t        t        f$ r Y dw xY w)Nre   zStopping LSP client for {}...rf   )rG   r|   ri   rj   rk   r   rp   r]   rK   r[   r\   r^   r_   rg   r   r   )rU   ra   r   s      rX   r   z<LanguageServerProvider.stop_completion_services_for_language  s1   t||#"ll84Ox(DLL8;BB8LM'
3>>tT4P'
3>>@,,X6B--h7<<>--h7AA$G 11(;  
+002(,OH%%%**84) $ !  "8\: s%   0D AD, 	D)(D),EEc                     || j                   v rC| j                   j                  |       | j                  j                  | j                  ||       y y rx   )rN   discardsig_response_readyr   r   )rU   response_typer   ra   req_ids        rX   receive_responsez'LanguageServerProvider.receive_response  sG    T]]"MM!!&)##((--vxA #rY   c                 z   || j                   v r| j                   |   }|d   | j                  k(  re| j                  j                  |       | j                   |   d   }t	        j
                  | j                  ||      |d<   |j                  ||       y | j                  j                  | j                  |i        y )Nre   rf   )ra   r2  response_callback)rG   r|   rN   addr   r   r3  perform_requestr0  r   r   )rU   ra   requestparamsr2  r   ru   s          rX   send_requestz#LanguageServerProvider.send_request  s    t||#"ll84Ox(DLL8!!&)h/
;.7.?.?))HV/M*+&&w7$$T%B%B%+R	1rY   c                     || j                   v rG| j                   |   }|d   | j                  k(  r%| j                   |   d   }|j                  ||       y y y )Nre   rf   )rG   r|   r7  )rU   ra   r8  r9  r   ru   s         rX   send_notificationz(LanguageServerProvider.send_notification  sZ    t||#"ll84Ox(DLL8h/
;&&w7 9 $rY   c                     |j                  dd      }|r| j                  |||       y| j                  D ]  }| j                  |||        y)z7Send notification/request to all available LSP servers.ra   N)popr<  rG   )rU   r8  r9  ra   s       rX   broadcast_notificationz-LanguageServerProvider.broadcast_notification  sN    ::j$/""8Wf= LL B&&x&ABrY   c           
      |   t        j                         }| j                  dd      }| j                  dd      }| j                  dd      }| j                  dd      j                  d	      }| j                  d
d      j                  d	      }| j                  dd      j                  d	      }| j                  dd      j                  d	      }| j                  dd      }	| j                  d      |D 
cg c]  }
|
s|
j	                          c}
|D cg c]  }|r|j	                          c}|D cg c]  }|s|j	                          c}|D cg c]  }|s|j	                          c}d|	d}d| j                  d      i}| j                  d      }|dk(  rG| j                  dd      j                  d	      }| j                  dd      j                  d	      }g }g }nFg }g }| j                  dd      j                  d	      }| j                  dd      j                  d	      }| j                  d      ||D cg c]  }|r|j	                          c}|D cg c]  }|r|j	                          c}|D cg c]  }|s|j	                          c}|D cg c]  }|s|j	                          c}| j                  d      | j                  d      d}| j                  d      }t        ddd       }|r
d}|d!k(  rd}nd!}d"d#|g}|D ci c]
  }|d||k(  i }}|s|	|d!   d$<   | j                  d%d&'      }| j                  d(d&'      }||d)}t        j                  j                         }|j                  d*d+       | j                  d,d-'      rt        j                  } n/| j                  d.d-'      } t               r|j                  d/d+       | | j                  d0d1g 2      |d3}!| j                  d4      | j                  d5d6'      d7}"d| j                  d8      i}#| j                  d9      | j                  d:      d;}$| j                  d<      }%| j                  d=      }&||d><   || j                  v r|&sd?|d@<   ndA|d@<   |%|dB<   |&|dC<   ||dD<   ||dE<   |dF   d   dG   }'|'d   j                  |       |'d   j                  |       |'d   j                  |       |'dH   j                  |       |'dI   j                  |!       |'dJ   j                  |"       |'d8   j                  |#       |'d9   j                  |$       | j                  dK      |'dL   dM<   |D ]  }|'|   j                  ||           |r|	|'d!   d$<   |S c c}
w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w )Nzi
        Update Python server configuration with the options saved in our
        config system.
        r9   r:   r;   r<   r=   r>   r-   r,   ,r+   r.   r/   r0   r1   r*   F)enabledexcluder   selectignorehangClosingmaxLineLengthrB  r%   r3   Customr6   r5   r2   r7   r8   )rB  
convention	addIgnore	addSelectrE  rD  matchmatchDirr'   pylsp_blackz<2.0.0python_lsp_black)distribution_nameblackr(   yapfline_lengthr  r  )r  r  )enable_block_commentsr  
PYTHONPATHNr  r  
executable
PYTHONHOMEr  r  )r  r  )environmentextra_pathsenv_varsr    r  r  )rB  include_paramsr#   r!   r"   )rB  follow_importsr?   r@   r  z8--host {host} --port {port} --tcp --check-parent-processr  z--check-parent-processr   r   r   r   r!  pluginspyls_spyderjedijedi_completionr$   preloadmodules)r   copyr   splitstripr   r   r   r>  sysrV  r   	LOCALHOSTr   )(rU   python_configr  r   r   
cs_excludecs_filename	cs_select	cs_ignorecs_max_line_lengthrC  r   rD  rE  r*   r%   rI  	ds_ignore	ds_selectds_add_ignoreds_add_selectr2   	formatterold_pylsp_blackblack_formatter
formattersfmtformatter_optionsr  display_block_commentspyls_spyder_optionsrZ  rX  r_  r`  r#   r!   external_serverr   r]  s(                                           rX   r   z-LanguageServerProvider.generate_python_config  s,   
 &**, mm-w7}}_k:}}_d3 ]]#8"=CCCH
mm$:B?EEcJMM"6;AA#F	MM"6;AA#F	!]]+H"M }}]37AMGWM)4B% ") B4=H&v||~H4=H&v||~H /	
 t}}Z0

 ]]#:;
!&92>DDSII&92>DDSIIMMII MM*=rBHHMM MM*=rBHHMM }}\2$(5A$ !,,. A )6A$ !,,. A4=H&v||~H4=H&v||~H]]#56&<=

 MM,/	
 .87I
 +OG#)	%O !&/:

 "	
  3)+ 
 
 8Jg&}5 mm& $ 
 "&& "/ "

 &<&
 ::??$\4(==,>=? ..K--0B ( DK "#\40 '==)<1E13 ) 5 !
 }}%67"mm,B4A , C
 t}}%:;
 }}%67"mm,LM
 --(;<./  #e4>>!%&>M&! %=M&!$3j!!&g $f $f   01':9E%%k2
""8,$$Z0%%&9:t$!"))/:%&--.AB!"))/:(,6G(H	9% 	8CCL 1# 67	8
 .@GG]+ NBHH6AAHH0
sT   5V=VV4V
<V
V V  V%V*
>V/V/V4&V4V9N)F)@__name__
__module____qualname____doc__r   DEFAULT_ORDERSLOWPRELOAD_MDOULESCONF_DEFAULTSCONF_VERSIONr   	CONF_TABSrg   r|   rg  ro   r   r   r   r   r   rF   rb   strrv   rS   r   r   rl   r   r   r   r   r   rh   r   r   r   r   r   rq   r   r   r   r   objectr   r   r  r   r  r  r  r  r  rP   rn   r,  r   r3  r:  r<  r?  r    rY   rX   r   r   0   sp   +$MD$'!!0%	O,"!$#""+*!!0,#$&$!=MP LIGGk*I!N $D\*
(	)/C )/V-=*6 I163D
+, 
V J  JF5$5L 
#Y+ +@?B5DA
 
&&< <( 
V8 8Ic IS I ( ( .)?;=(=( M2HI( J( 09LM< N< .%';<>(>(*?X>E
5.A18BtrY   r   )3r~  r   loggingr   os.pathr   r   rf  qtpy.QtCorer   r   r   qtpy.QtWidgetsr   qtpyr   spyder.api.config.decoratorsr   spyder.utils.installersr	   spyder.config.baser
   r   r   r   spyder.config.lspr   spyder.utils.miscr   spyder.plugins.completion.apir   r   r   9spyder.plugins.completion.providers.languageserver.clientr   ;spyder.plugins.completion.providers.languageserver.conftabsr   :spyder.plugins.completion.providers.languageserver.widgetsr   r   r   ,spyder.utils.introspection.module_completionr   spyder.utils.programsr   r   r  	getLoggerr{  ri   r   r  rY   rX   <module>r     s      	  
 - , &  8 74 4 + 3@ @ P L= = J 5 ))-.			8	$W5 WrY   