|
@@ -17,26 +17,23 @@
|
|
|
# You should have received a copy of the GNU General Public License
|
|
|
# along with YouCompleteMe. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
+import vim
|
|
|
import time
|
|
|
-from ycm.client.base_request import BaseRequest, BuildRequestData
|
|
|
+from ycm.client.base_request import BaseRequest, BuildRequestData, ServerError
|
|
|
+from ycm import vimsupport
|
|
|
+from ycm.utils import ToUtf8IfNeeded
|
|
|
|
|
|
|
|
|
class CommandRequest( BaseRequest ):
|
|
|
- class ServerResponse( object ):
|
|
|
- def __init__( self ):
|
|
|
- pass
|
|
|
-
|
|
|
- def Valid( self ):
|
|
|
- return True
|
|
|
-
|
|
|
def __init__( self, arguments, completer_target = None ):
|
|
|
super( CommandRequest, self ).__init__()
|
|
|
self._arguments = arguments
|
|
|
self._completer_target = ( completer_target if completer_target
|
|
|
else 'filetype_default' )
|
|
|
- # TODO: Handle this case.
|
|
|
- # if completer_target == 'omni':
|
|
|
- # completer = SERVER_STATE.GetOmniCompleter()
|
|
|
+ self._is_goto_command = (
|
|
|
+ True if arguments and arguments[ 0 ].startswith( 'GoTo' ) else False )
|
|
|
+ self._response = None
|
|
|
+
|
|
|
|
|
|
def Start( self ):
|
|
|
request_data = BuildRequestData()
|
|
@@ -44,34 +41,51 @@ class CommandRequest( BaseRequest ):
|
|
|
'completer_target': self._completer_target,
|
|
|
'command_arguments': self._arguments
|
|
|
} )
|
|
|
- self._response = self.PostDataToHandler( request_data,
|
|
|
- 'run_completer_command' )
|
|
|
+ try:
|
|
|
+ self._response = self.PostDataToHandler( request_data,
|
|
|
+ 'run_completer_command' )
|
|
|
+ except ServerError as e:
|
|
|
+ vimsupport.PostVimMessage( e )
|
|
|
|
|
|
|
|
|
def Response( self ):
|
|
|
- # TODO: Call vimsupport.JumpToLocation if the user called a GoTo command...
|
|
|
- # we may want to have specific subclasses of CommandRequest so that a
|
|
|
- # GoToRequest knows it needs to jump after the data comes back.
|
|
|
- #
|
|
|
- # Also need to run the following on GoTo data:
|
|
|
- #
|
|
|
- # CAREFUL about line/column number 0-based/1-based confusion!
|
|
|
- #
|
|
|
- # defs = []
|
|
|
- # defs.append( {'filename': definition.module_path.encode( 'utf-8' ),
|
|
|
- # 'lnum': definition.line,
|
|
|
- # 'col': definition.column + 1,
|
|
|
- # 'text': definition.description.encode( 'utf-8' ) } )
|
|
|
- # vim.eval( 'setqflist( %s )' % repr( defs ) )
|
|
|
- # vim.eval( 'youcompleteme#OpenGoToList()' )
|
|
|
- return self.ServerResponse()
|
|
|
-
|
|
|
-
|
|
|
-def SendCommandRequest( self, arguments, completer ):
|
|
|
- request = CommandRequest( self, arguments, completer )
|
|
|
+ return self._response
|
|
|
+
|
|
|
+
|
|
|
+ def RunPostCommandActionsIfNeeded( self ):
|
|
|
+ if not self._is_goto_command or not self.Done() or not self._response:
|
|
|
+ return
|
|
|
+
|
|
|
+ if isinstance( self._response, list ):
|
|
|
+ defs = [ _BuildQfListItem( x ) for x in self._response ]
|
|
|
+ vim.eval( 'setqflist( %s )' % repr( defs ) )
|
|
|
+ vim.eval( 'youcompleteme#OpenGoToList()' )
|
|
|
+ else:
|
|
|
+ vimsupport.JumpToLocation( self._response[ 'filepath' ],
|
|
|
+ self._response[ 'line_num' ] + 1,
|
|
|
+ self._response[ 'column_num' ] )
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+def SendCommandRequest( arguments, completer ):
|
|
|
+ request = CommandRequest( arguments, completer )
|
|
|
request.Start()
|
|
|
while not request.Done():
|
|
|
time.sleep( 0.1 )
|
|
|
|
|
|
+ request.RunPostCommandActionsIfNeeded()
|
|
|
return request.Response()
|
|
|
|
|
|
+
|
|
|
+def _BuildQfListItem( goto_data_item ):
|
|
|
+ qf_item = {}
|
|
|
+ if 'filepath' in goto_data_item:
|
|
|
+ qf_item[ 'filename' ] = ToUtf8IfNeeded( goto_data_item[ 'filepath' ] )
|
|
|
+ if 'description' in goto_data_item:
|
|
|
+ qf_item[ 'text' ] = ToUtf8IfNeeded( goto_data_item[ 'description' ] )
|
|
|
+ if 'line_num' in goto_data_item:
|
|
|
+ qf_item[ 'lnum' ] = goto_data_item[ 'line_num' ] + 1
|
|
|
+ if 'column_num' in goto_data_item:
|
|
|
+ qf_item[ 'col' ] = goto_data_item[ 'column_num' ]
|
|
|
+ return qf_item
|