Ejemplo n.º 1
0
 def Start( self ):
   request_data = BuildRequestData()
   if self._extra_data:
     request_data.update( self._extra_data )
   self._response = self.PostDataToHandler( request_data,
                                            'debug_info',
                                            display_message = False )
Ejemplo n.º 2
0
class CompletionRequest(BaseRequest):
    def __init__(self, extra_data=None):
        super(CompletionRequest, self).__init__()

        self._completion_start_column = base.CompletionStartColumn()

        # This field is also used by the omni_completion_request subclass
        self.request_data = BuildRequestData(self._completion_start_column)
        if extra_data:
            self.request_data.update(extra_data)

    def CompletionStartColumn(self):
        return self._completion_start_column

    def Start(self, query):
        self.request_data["query"] = query
        self._response_future = self.PostDataToHandlerAsync(self.request_data, "completions", TIMEOUT_SECONDS)

    def Done(self):
        return self._response_future.done()

    def Response(self):
        if not self._response_future:
            return []
        try:
            return [_ConvertCompletionDataToVimData(x) for x in JsonFromFuture(self._response_future)]
        except Exception as e:
            vimsupport.PostVimMessage(str(e))
        return []
Ejemplo n.º 3
0
    def Start(self):
        request_data = BuildRequestData()
        if self._extra_data:
            request_data.update(self._extra_data)
        request_data["event_name"] = self._event_name

        self._response_future = self.PostDataToHandlerAsync(request_data, "event_notification")
Ejemplo n.º 4
0
 def Start(self):
     request_data = BuildRequestData()
     request_data.update({"completer_target": self._completer_target, "command_arguments": self._arguments})
     try:
         self._response = self.PostDataToHandler(request_data, "run_completer_command")
     except ServerError as e:
         vimsupport.PostMultiLineNotice(e)
 def Start( self ):
   request_data = BuildRequestData()
   request_data.update( { 'filetypes': self.filetypes } )
   try:
     self._response = self.PostDataToHandler( request_data,
                                              'semantic_completion_available' )
   except ( ServerError, ReadTimeout ) as e:
     HandleServerException( e )
Ejemplo n.º 6
0
  def Start( self ):
    request_data = BuildRequestData( self._filepath )
    if self._extra_data:
      request_data.update( self._extra_data )
    request_data[ 'event_name' ] = self._event_name

    self._response_future = self.PostDataToHandlerAsync( request_data,
                                                         'event_notification' )
Ejemplo n.º 7
0
 def Start( self ):
   request_data = BuildRequestData()
   request_data.update( {
     'completer_target': self._completer_target,
     'command_arguments': self._arguments
   } )
   with HandleServerException():
     self._response = self.PostDataToHandler( request_data,
                                              'run_completer_command' )
Ejemplo n.º 8
0
 def Start( self ):
   request_data = BuildRequestData()
   if self._extra_data:
     request_data.update( self._extra_data )
   request_data.update( {
     'command_arguments': self._arguments
   } )
   self._response = self.PostDataToHandler( request_data,
                                            'run_completer_command' )
 def Start( self ):
   request_data = BuildRequestData()
   request_data.update( {
     'completer_target': self._completer_target,
     'command_arguments': self._arguments
   } )
   try:
     self._response = self.PostDataToHandler( request_data,
                                             'run_completer_command' )
   except ServerError as e:
     vimsupport.PostVimMessage( e )
Ejemplo n.º 10
0
 def Start( self ):
   request_data = BuildRequestData()
   request_data.update( {
     'completer_target': self._completer_target,
     'command_arguments': self._arguments
   } )
   try:
     self._response = self.PostDataToHandler( request_data,
                                              'run_completer_command' )
   except ( ServerError, ReadTimeout ) as e:
     HandleServerException( e )
Ejemplo n.º 11
0
  def __init__( self, extra_data = None ):
    super( CompletionRequest, self ).__init__()

    self._completion_start_column = base.CompletionStartColumn()

    # This field is also used by the omni_completion_request subclass
    self.request_data = BuildRequestData( self._completion_start_column )
    if extra_data:
      self.request_data.update( extra_data )
Ejemplo n.º 12
0
 def GetDefinedSubcommands( self ):
   if self._IsServerAlive():
     return BaseRequest.PostDataToHandler( BuildRequestData(),
                                           'defined_subcommands' )
   else:
     return []
Ejemplo n.º 13
0
 def GetDefinedSubcommands(self):
     with HandleServerException():
         return BaseRequest.PostDataToHandler(BuildRequestData(),
                                              'defined_subcommands')
     return []
Ejemplo n.º 14
0
def BuildRequestData_AddWorkingDir_test(*args):
    assert_that(BuildRequestData(), has_entry('working_dir', '/some/dir'))
Ejemplo n.º 15
0
 def Start( self ):
   request_data = BuildRequestData()
   request_data.update( { 'filetypes': self.filetypes } )
   with HandleServerException():
     self._response = self.PostDataToHandler( request_data,
                                              'semantic_completion_available' )
Ejemplo n.º 16
0
def BuildRequestData_AddWorkingDirWithFileName_test(*args):
    current_buffer = VimBuffer('foo')
    with MockVimBuffers([current_buffer], [current_buffer]):
        assert_that(BuildRequestData(current_buffer.number),
                    has_entry('working_dir', '/some/dir'))
Ejemplo n.º 17
0
def BuildRequestData_AddWorkingDirWithFileName_test(*args):
    assert_that(BuildRequestData('foo'), has_entry('working_dir', '/some/dir'))
 def Start(self):
     request_data = BuildRequestData()
     with HandleServerException(display=False):
         self._response = self.PostDataToHandler(request_data, 'debug_info')
Ejemplo n.º 19
0
def BuildRequestData_AddWorkingDir_test(*args):
    current_buffer = VimBuffer('foo')
    with MockVimBuffers([current_buffer], current_buffer, (1, 1)):
        assert_that(BuildRequestData(), has_entry('working_dir', '/some/dir'))
Ejemplo n.º 20
0
 def GetDefinedSubcommands( self ):
   request = BaseRequest()
   subcommands = request.PostDataToHandler( BuildRequestData(),
                                            'defined_subcommands' )
   return subcommands if subcommands else []
Ejemplo n.º 21
0
class CommandRequest(BaseRequest):
    def __init__(self,
                 arguments,
                 buffer_command='same-buffer',
                 extra_data=None):
        super(CommandRequest, self).__init__()
        self._arguments = _EnsureBackwardsCompatibility(arguments)
        self._command = arguments and arguments[0]
        self._buffer_command = buffer_command
        self._extra_data = extra_data
        self._response = None
        self._request_data = None

    def Start(self, silent=False):
        self._request_data = BuildRequestData()
        if self._extra_data:
            self._request_data.update(self._extra_data)
        self._request_data.update({'command_arguments': self._arguments})
        self._response = self.PostDataToHandler(self._request_data,
                                                'run_completer_command',
                                                display_message=not silent)

    def Response(self):
        return self._response

    def RunPostCommandActionsIfNeeded(self, modifiers):
        if not self.Done() or self._response is None:
            return

        # If not a dictionary or a list, the response is necessarily a
        # scalar: boolean, number, string, etc. In this case, we print
        # it to the user.
        if not isinstance(self._response, (dict, list)):
            return self._HandleBasicResponse()

        if 'fixits' in self._response:
            return self._HandleFixitResponse()

        if 'message' in self._response:
            return self._HandleMessageResponse()

        if 'detailed_info' in self._response:
            return self._HandleDetailedInfoResponse()

        # The only other type of response we understand is GoTo, and that is the
        # only one that we can't detect just by inspecting the response (it should
        # either be a single location or a list)
        return self._HandleGotoResponse(modifiers)

    def StringResponse(self):
        # Retuns a supporable public API version of the response. The reason this
        # exists is that the ycmd API here is wonky as it originally only supported
        # text-responses and now has things like fixits and such.
        #
        # The supportable public API is basically any text-only response. All other
        # response types are returned as empty strings
        if not self.Done():
            raise RuntimeError("Response is not ready")

        # Completer threw an error ?
        if self._response is None:
            return ""

        # If not a dictionary or a list, the response is necessarily a
        # scalar: boolean, number, string, etc. In this case, we print
        # it to the user.
        if not isinstance(self._response, (dict, list)):
            return str(self._response)

        if 'message' in self._response:
            return self._response['message']

        if 'detailed_info' in self._response:
            return self._response['detailed_info']

        # The only other type of response we understand is 'fixits' and GoTo. We
        # don't provide string versions of them.
        return ""

    def _HandleGotoResponse(self, modifiers):
        if isinstance(self._response, list):
            vimsupport.SetQuickFixList(
                [_BuildQfListItem(x) for x in self._response])
            vimsupport.OpenQuickFixList(focus=True, autoclose=True)
        else:
            vimsupport.JumpToLocation(self._response['filepath'],
                                      self._response['line_num'],
                                      self._response['column_num'], modifiers,
                                      self._buffer_command)

    def _HandleFixitResponse(self):
        if not len(self._response['fixits']):
            vimsupport.PostVimMessage('No fixits found for current line',
                                      warning=False)
        else:
            try:
                fixit_index = 0

                # When there are multiple fixit suggestions, present them as a list to
                # the user hand have her choose which one to apply.
                fixits = self._response['fixits']
                if len(fixits) > 1:
                    fixit_index = vimsupport.SelectFromList(
                        "Multiple FixIt suggestions are available at this location. "
                        "Which one would you like to apply?",
                        [fixit['text'] for fixit in fixits])
                chosen_fixit = fixits[fixit_index]
                if chosen_fixit['resolve']:
                    self._request_data.update({'fixit': chosen_fixit})
                    response = self.PostDataToHandler(self._request_data,
                                                      'resolve_fixit')
                    fixits = response['fixits']
                    assert len(fixits) == 1
                    chosen_fixit = fixits[0]

                vimsupport.ReplaceChunks(chosen_fixit['chunks'],
                                         silent=self._command == 'Format')
            except RuntimeError as e:
                vimsupport.PostVimMessage(str(e))

    def _HandleBasicResponse(self):
        vimsupport.PostVimMessage(self._response, warning=False)

    def _HandleMessageResponse(self):
        vimsupport.PostVimMessage(self._response['message'], warning=False)

    def _HandleDetailedInfoResponse(self):
        vimsupport.WriteToPreviewWindow(self._response['detailed_info'])
 def test_BuildRequestData_AddWorkingDir( self, *args ):
   current_buffer = VimBuffer( 'foo' )
   with MockVimBuffers( [ current_buffer ], [ current_buffer ] ):
     assert_that( BuildRequestData(), has_entry( 'working_dir', '/some/dir' ) )
Ejemplo n.º 23
0
def _BuildRequestDataSubstitute():
    data = BuildRequestData(include_buffer_data=False)
    data['start_column'] = base.CompletionStartColumn()
    return data
Ejemplo n.º 24
0
 def Start( self ):
   request_data = BuildRequestData()
   if self._extra_data:
     request_data.update( self._extra_data )
   with HandleServerException( display = False ):
     self._response = self.PostDataToHandler( request_data, 'debug_info' )
Ejemplo n.º 25
0
 def __init__(self):
     super(MessagesPoll, self).__init__()
     self._request_data = BuildRequestData()
     self._response_future = None
Ejemplo n.º 26
0
class CommandRequest(BaseRequest):
    def __init__(self, arguments, extra_data=None, silent=False):
        super(CommandRequest, self).__init__()
        self._arguments = _EnsureBackwardsCompatibility(arguments)
        self._command = arguments and arguments[0]
        self._extra_data = extra_data
        self._response = None
        self._request_data = None
        self._response_future = None
        self._silent = silent
        self._bufnr = extra_data.pop('bufnr', None) if extra_data else None

    def Start(self):
        if self._bufnr is not None:
            self._request_data = BuildRequestData(self._bufnr)
        else:
            self._request_data = BuildRequestData()

        if self._extra_data:
            self._request_data.update(self._extra_data)
        self._request_data.update({'command_arguments': self._arguments})
        self._response_future = self.PostDataToHandlerAsync(
            self._request_data, 'run_completer_command')

    def Done(self):
        return bool(self._response_future) and self._response_future.done()

    def Response(self):
        if self._response is None and self._response_future is not None:
            # Block
            self._response = self.HandleFuture(
                self._response_future, display_message=not self._silent)

        return self._response

    def RunPostCommandActionsIfNeeded(self,
                                      modifiers,
                                      buffer_command=DEFAULT_BUFFER_COMMAND):

        # This is a blocking call if not Done()
        self.Response()

        if self._response is None:
            # An exception was raised and handled.
            return

        # If not a dictionary or a list, the response is necessarily a
        # scalar: boolean, number, string, etc. In this case, we print
        # it to the user.
        if not isinstance(self._response, (dict, list)):
            return self._HandleBasicResponse()

        if 'fixits' in self._response:
            return self._HandleFixitResponse()

        if 'message' in self._response:
            return self._HandleMessageResponse()

        if 'detailed_info' in self._response:
            return self._HandleDetailedInfoResponse()

        # The only other type of response we understand is GoTo, and that is the
        # only one that we can't detect just by inspecting the response (it should
        # either be a single location or a list)
        return self._HandleGotoResponse(buffer_command, modifiers)

    def StringResponse(self):
        # Retuns a supporable public API version of the response. The reason this
        # exists is that the ycmd API here is wonky as it originally only supported
        # text-responses and now has things like fixits and such.
        #
        # The supportable public API is basically any text-only response. All other
        # response types are returned as empty strings

        # This is a blocking call if not Done()
        self.Response()

        # Completer threw an error ?
        if self._response is None:
            return ""

        # If not a dictionary or a list, the response is necessarily a
        # scalar: boolean, number, string, etc. In this case, we print
        # it to the user.
        if not isinstance(self._response, (dict, list)):
            return str(self._response)

        if 'message' in self._response:
            return self._response['message']

        if 'detailed_info' in self._response:
            return self._response['detailed_info']

        # The only other type of response we understand is 'fixits' and GoTo. We
        # don't provide string versions of them.
        return ""

    def _HandleGotoResponse(self, buffer_command, modifiers):
        if isinstance(self._response, list):
            vimsupport.SetQuickFixList(
                [vimsupport.BuildQfListItem(x) for x in self._response])
            vimsupport.OpenQuickFixList(focus=True, autoclose=True)
        else:
            vimsupport.JumpToLocation(self._response['filepath'],
                                      self._response['line_num'],
                                      self._response['column_num'], modifiers,
                                      buffer_command)

    def _HandleFixitResponse(self):
        if not len(self._response['fixits']):
            vimsupport.PostVimMessage('No fixits found for current line',
                                      warning=False)
        else:
            try:
                fixit_index = 0

                # If there is more than one fixit, we need to ask the user which one
                # should be applied.
                #
                # If there's only one, triggered by the FixIt subcommand (as opposed to
                # `RefactorRename`, for example) and whose `kind` is not `quicfix`, we
                # still need to as the user for confirmation.
                fixits = self._response['fixits']
                if (len(fixits) > 1
                        or (len(fixits) == 1 and self._command == 'FixIt'
                            and fixits[0].get('kind') != 'quickfix')):
                    fixit_index = vimsupport.SelectFromList(
                        "FixIt suggestion(s) available at this location. "
                        "Which one would you like to apply?",
                        [fixit['text'] for fixit in fixits])
                chosen_fixit = fixits[fixit_index]
                if chosen_fixit['resolve']:
                    self._request_data.update({'fixit': chosen_fixit})
                    response = self.PostDataToHandler(self._request_data,
                                                      'resolve_fixit')
                    if response is None:
                        return
                    fixits = response['fixits']
                    assert len(fixits) == 1
                    chosen_fixit = fixits[0]

                vimsupport.ReplaceChunks(chosen_fixit['chunks'],
                                         silent=self._command == 'Format')
            except RuntimeError as e:
                vimsupport.PostVimMessage(str(e))

    def _HandleBasicResponse(self):
        vimsupport.PostVimMessage(self._response, warning=False)

    def _HandleMessageResponse(self):
        vimsupport.PostVimMessage(self._response['message'], warning=False)

    def _HandleDetailedInfoResponse(self):
        vimsupport.WriteToPreviewWindow(self._response['detailed_info'])
 def Start(self):
     request_data = BuildRequestData()
     request_data.update({'filetypes': self.filetypes})
     self._response = self.PostDataToHandler(
         request_data, 'semantic_completion_available')
Ejemplo n.º 28
0
def _BuildRequestDataSubstitute():
    return BuildRequestData(start_column=base.CompletionStartColumn(),
                            include_buffer_data=False)