1# Copyright (C) 2013-2020 ycmd contributors
2#
3# This file is part of ycmd.
4#
5# ycmd is free software: you can redistribute it and/or modify
6# it under the terms of the GNU General Public License as published by
7# the Free Software Foundation, either version 3 of the License, or
8# (at your option) any later version.
9#
10# ycmd is distributed in the hope that it will be useful,
11# but WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13# GNU General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License
16# along with ycmd.  If not, see <http://www.gnu.org/licenses/>.
17
18from ycmd.completers.completer import Completer
19from ycmd.completers.all.identifier_completer import IdentifierCompleter
20from ycmd.completers.general.filename_completer import FilenameCompleter
21from ycmd.completers.general.ultisnips_completer import UltiSnipsCompleter
22
23
24class GeneralCompleterStore( Completer ):
25  """
26  Holds a list of completers that can be used in all filetypes.
27
28  It overrides all Completer API methods so that specific calls to
29  GeneralCompleterStore are passed to all general completers.
30  """
31
32  def __init__( self, user_options ):
33    super().__init__( user_options )
34    self._identifier_completer = IdentifierCompleter( user_options )
35    self._filename_completer = FilenameCompleter( user_options )
36    self._ultisnips_completer = UltiSnipsCompleter( user_options )
37    self._non_filename_completers = [ self._identifier_completer ]
38    if user_options.get( 'use_ultisnips_completer', True ):
39      self._non_filename_completers.append( self._ultisnips_completer )
40    self._all_completers = [ self._identifier_completer,
41                             self._filename_completer,
42                             self._ultisnips_completer ]
43
44
45  def SupportedFiletypes( self ):
46    return set()
47
48
49  def GetIdentifierCompleter( self ):
50    return self._identifier_completer
51
52
53  def ComputeCandidates( self, request_data ):
54    candidates = self._filename_completer.ComputeCandidates( request_data )
55    if candidates:
56      return candidates
57    for completer in self._non_filename_completers:
58      candidates += completer.ComputeCandidates( request_data )
59    return candidates
60
61
62  def OnFileReadyToParse( self, request_data ):
63    for completer in self._all_completers:
64      completer.OnFileReadyToParse( request_data )
65
66
67  def OnBufferVisit( self, request_data ):
68    for completer in self._all_completers:
69      completer.OnBufferVisit( request_data )
70
71
72  def OnBufferUnload( self, request_data ):
73    for completer in self._all_completers:
74      completer.OnBufferUnload( request_data )
75
76
77  def OnInsertLeave( self, request_data ):
78    for completer in self._all_completers:
79      completer.OnInsertLeave( request_data )
80
81
82  def OnCurrentIdentifierFinished( self, request_data ):
83    for completer in self._all_completers:
84      completer.OnCurrentIdentifierFinished( request_data )
85
86
87  def GettingCompletions( self ):
88    for completer in self._all_completers:
89      completer.GettingCompletions()
90
91
92  def Shutdown( self ):
93    for completer in self._all_completers:
94      completer.Shutdown()
95