6c53bad58f
The server is multi-threaded and will spawn a new thread for each new request. Thus, the completers need not manage their own threads or even provide async APIs; we _want_ them to block because now were implementing the request-response networking API. The client gets the async API through the network (i.e., it can do something else while the request is pending).
123 lines
4.0 KiB
Python
123 lines
4.0 KiB
Python
#!/usr/bin/env python
|
|
#
|
|
# Copyright (C) 2013 Stanislav Golovanov <stgolovanov@gmail.com>
|
|
# Strahinja Val Markovic <val@markovic.io>
|
|
#
|
|
# This file is part of YouCompleteMe.
|
|
#
|
|
# YouCompleteMe is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# YouCompleteMe is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with YouCompleteMe. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
from ycm.completers.completer import Completer
|
|
from ycm.completers.all.identifier_completer import IdentifierCompleter
|
|
from ycm.completers.general.filename_completer import FilenameCompleter
|
|
from ycm.completers.general.ultisnips_completer import UltiSnipsCompleter
|
|
|
|
|
|
class GeneralCompleterStore( Completer ):
|
|
"""
|
|
Holds a list of completers that can be used in all filetypes.
|
|
|
|
It overrides all Competer API methods so that specific calls to
|
|
GeneralCompleterStore are passed to all general completers.
|
|
"""
|
|
|
|
def __init__( self, user_options ):
|
|
super( GeneralCompleterStore, self ).__init__( user_options )
|
|
self._identifier_completer = IdentifierCompleter( user_options )
|
|
self._filename_completer = FilenameCompleter( user_options )
|
|
self._ultisnips_completer = UltiSnipsCompleter( user_options )
|
|
self._non_filename_completers = filter( lambda x: x,
|
|
[ self._ultisnips_completer,
|
|
self._identifier_completer ] )
|
|
self._all_completers = filter( lambda x: x,
|
|
[ self._identifier_completer,
|
|
self._filename_completer,
|
|
self._ultisnips_completer ] )
|
|
self._current_query_completers = []
|
|
|
|
|
|
def SupportedFiletypes( self ):
|
|
return set()
|
|
|
|
|
|
def GetIdentifierCompleter( self ):
|
|
return self._identifier_completer
|
|
|
|
|
|
def ShouldUseNow( self, request_data ):
|
|
self._current_query_completers = []
|
|
|
|
if self._filename_completer.ShouldUseNow( request_data ):
|
|
self._current_query_completers = [ self._filename_completer ]
|
|
return True
|
|
|
|
should_use_now = False
|
|
|
|
for completer in self._non_filename_completers:
|
|
should_use_this_completer = completer.ShouldUseNow( request_data )
|
|
should_use_now = should_use_now or should_use_this_completer
|
|
|
|
if should_use_this_completer:
|
|
self._current_query_completers.append( completer )
|
|
|
|
return should_use_now
|
|
|
|
|
|
def ComputeCandidates( self, request_data ):
|
|
if not self.ShouldUseNow( request_data ):
|
|
return []
|
|
|
|
candidates = []
|
|
for completer in self._current_query_completers:
|
|
candidates += completer.ComputeCandidates( request_data )
|
|
|
|
return candidates
|
|
|
|
|
|
def OnFileReadyToParse( self, request_data ):
|
|
for completer in self._all_completers:
|
|
completer.OnFileReadyToParse( request_data )
|
|
|
|
|
|
def OnBufferVisit( self, request_data ):
|
|
for completer in self._all_completers:
|
|
completer.OnBufferVisit( request_data )
|
|
|
|
|
|
def OnBufferUnload( self, request_data ):
|
|
for completer in self._all_completers:
|
|
completer.OnBufferUnload( request_data )
|
|
|
|
|
|
def OnInsertLeave( self, request_data ):
|
|
for completer in self._all_completers:
|
|
completer.OnInsertLeave( request_data )
|
|
|
|
|
|
def OnCurrentIdentifierFinished( self, request_data ):
|
|
for completer in self._all_completers:
|
|
completer.OnCurrentIdentifierFinished( request_data )
|
|
|
|
|
|
def GettingCompletions( self ):
|
|
for completer in self._all_completers:
|
|
completer.GettingCompletions()
|
|
|
|
|
|
def Shutdown( self ):
|
|
for completer in self._all_completers:
|
|
completer.Shutdown()
|
|
|
|
|