Skip to content

Commit

Permalink
Merge branch 'lsp-override-builtin'
Browse files Browse the repository at this point in the history
  • Loading branch information
puremourning committed Apr 21, 2021
2 parents 8dfa2e9 + eb1e1a0 commit 88e7f40
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 17 deletions.
25 changes: 19 additions & 6 deletions .ycm_extra_conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,25 @@ def Settings( **kwargs ):

if language == 'python':
return {
'interpreter_path': PathToPythonUsedDuringBuild()
'interpreter_path': PathToPythonUsedDuringBuild(),
'ls': {
'python': {
'analysis': {
'extraPaths': [
p.join( DIR_OF_THIS_SCRIPT ),
p.join( DIR_OF_THIRD_PARTY, 'bottle' ),
p.join( DIR_OF_THIRD_PARTY, 'regex-build' ),
p.join( DIR_OF_THIRD_PARTY, 'frozendict' ),
p.join( DIR_OF_THIRD_PARTY, 'jedi_deps', 'jedi' ),
p.join( DIR_OF_THIRD_PARTY, 'jedi_deps', 'parso' ),
p.join( DIR_OF_WATCHDOG_DEPS, 'watchdog', 'build', 'lib3' ),
p.join( DIR_OF_WATCHDOG_DEPS, 'pathtools' ),
p.join( DIR_OF_THIRD_PARTY, 'waitress' )
],
'useLibraryCodeForTypes': True
}
}
}
}

return {}
Expand All @@ -184,11 +202,6 @@ def Settings( **kwargs ):
def PythonSysPath( **kwargs ):
sys_path = kwargs[ 'sys_path' ]

interpreter_path = kwargs[ 'interpreter_path' ]
major_version = subprocess.check_output( [
interpreter_path, '-c', 'import sys; print( sys.version_info[ 0 ] )' ]
).rstrip().decode( 'utf8' )

sys_path[ 0:0 ] = [ p.join( DIR_OF_THIS_SCRIPT ),
p.join( DIR_OF_THIRD_PARTY, 'bottle' ),
p.join( DIR_OF_THIRD_PARTY, 'regex-build' ),
Expand Down
20 changes: 17 additions & 3 deletions ycmd/completers/language_server/generic_lsp_completer.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,23 @@
# along with ycmd. If not, see <http://www.gnu.org/licenses/>.

import string
import logging
from ycmd import responses, utils
from ycmd.completers.language_server import language_server_completer


class GenericLSPCompleter( language_server_completer.LanguageServerCompleter ):
def __init__( self, user_options, server_settings ):
utils.LOGGER.info( "Initializing generic LSP completer with: %s",
server_settings )

self._name = server_settings[ 'name' ]
self._supported_filetypes = server_settings[ 'filetypes' ]
self._project_root_files = server_settings.get( 'project_root_files', [] )
self._capabilities = server_settings.get( 'capabilities', {} )

self._command_line = server_settings.get( 'cmdline' )

self._port = server_settings.get( 'port' )
if self._port:
connection_type = 'tcp'
Expand All @@ -37,9 +42,18 @@ def __init__( self, user_options, server_settings ):
connection_type = 'stdio'

if self._command_line:
self._command_line[ 0 ] = utils.FindExecutable(
self._command_line[ 0 ] )

# We modify this, so take a copy
self._command_line = list( self._command_line )
cmd = utils.FindExecutable( self._command_line[ 0 ] )

if cmd is None:
utils.LOGGER.warn( "Unable to find any executable with the path %s. "
"Cannot use %s completer.",
self._command_line[ 0 ],
self._name )
raise RuntimeError( f"Invalid cmdline: { str( self._command_line ) }" )

self._command_line[ 0 ] = cmd
for idx in range( len( self._command_line ) ):
self._command_line[ idx ] = string.Template(
self._command_line[ idx ] ).safe_substitute( {
Expand Down
21 changes: 13 additions & 8 deletions ycmd/server_state.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,13 @@ def _GetGenericLSPCompleter( user_options, filetype ):
custom_lsp = user_options[ 'language_server' ]
for server_settings in custom_lsp:
if filetype in server_settings[ 'filetypes' ]:
return generic_lsp_completer.GenericLSPCompleter(
user_options, server_settings )
try:
return generic_lsp_completer.GenericLSPCompleter(
user_options, server_settings )
except Exception:
LOGGER.exception( "Unable to instantiate generic completer for "
f"filetype { filetype }" )
# We might just use a built-in completer
return None


Expand Down Expand Up @@ -61,14 +66,14 @@ def _GetFiletypeCompleterForFiletype( self, filetype ):
except KeyError:
pass

try:
module = import_module( f'ycmd.completers.{ filetype }.hook' )
completer = module.GetCompleter( self._user_options )
except ImportError:
completer = None
completer = _GetGenericLSPCompleter( self._user_options, filetype )

if completer is None:
completer = _GetGenericLSPCompleter( self._user_options, filetype )
try:
module = import_module( f'ycmd.completers.{ filetype }.hook' )
completer = module.GetCompleter( self._user_options )
except ImportError:
completer = None

supported_filetypes = { filetype }
if completer:
Expand Down

0 comments on commit 88e7f40

Please sign in to comment.