diff --git a/ycmd/completers/language_server/language_server_completer.py b/ycmd/completers/language_server/language_server_completer.py index 8707142714..c4baff951c 100644 --- a/ycmd/completers/language_server/language_server_completer.py +++ b/ycmd/completers/language_server/language_server_completer.py @@ -1568,7 +1568,7 @@ def GetTriggerCharacters( self, server_trigger_characters ): return server_trigger_characters - def _GetSignatureTriggerCharacters( self, server_trigger_characters ): + def GetSignatureTriggerCharacters( self, server_trigger_characters ): """Same as _GetTriggerCharacters but for signature help.""" return server_trigger_characters @@ -1630,7 +1630,7 @@ def _HandleInitializeInPollThread( self, response ): self.Language(), server_trigger_characters ) - trigger_characters = self._GetSignatureTriggerCharacters( + trigger_characters = self.GetSignatureTriggerCharacters( server_trigger_characters ) if trigger_characters: diff --git a/ycmd/completers/python/python_completer.py b/ycmd/completers/python/python_completer.py index 94c3a732e6..58dd5e1ce5 100644 --- a/ycmd/completers/python/python_completer.py +++ b/ycmd/completers/python/python_completer.py @@ -45,6 +45,7 @@ def __init__( self, user_options ): self._environment_for_file = {} self._environment_for_interpreter_path = {} self._sys_path_for_file = {} + self.signature_triggers.SetServerSemanticTriggers( [ '(', ',' ] ) def SupportedFiletypes( self ): @@ -188,12 +189,40 @@ def _GetExtraData( self, completion ): def ComputeCandidatesInner( self, request_data ): with self._jedi_lock: + completions = self._GetJediScript( request_data ).completions() return [ responses.BuildCompletionData( insertion_text = completion.name, # We store the Completion object returned by Jedi in the extra_data # field to detail the candidates once the filtering is done. extra_data = completion - ) for completion in self._GetJediScript( request_data ).completions() ] + ) for completion in completions ] + + + def ComputeSignaturesInner( self, request_data ): + with self._jedi_lock: + signatures = self._GetJediScript( request_data ).call_signatures() + + active_signature = 0 + active_parameter = 0 + for index, signature in enumerate( signatures ): + if signature.index is not None: + active_signature = index + active_parameter = signature.index + break + + return { + 'activeSignature': active_signature, + 'activeParameter': active_parameter, + 'signatures': [ + { + 'label': s.description + '( ' + ', '.join( + [ p.description[ 6: ] for p in s.params ] ) + ' )', + 'parameters': [ + { 'label': p.description[ 6: ] } for p in s.params + ], + } for s in signatures + ] + } def DetailCandidates( self, request_data, candidates ):