Implementing the new GoToImprecise command

Same as GoTo, but trades correctness for speed. See the docs for details.
This commit is contained in:
Strahinja Val Markovic 2014-03-21 12:37:01 -07:00
parent 9cf566bd8f
commit 90e097efa4
8 changed files with 63 additions and 27 deletions

View File

@ -627,6 +627,19 @@ the current translation unit, jumps to the symbol's declaration.
Supported in filetypes: `c, cpp, objc, objcpp, python, cs`
### The `GoToImprecise` subcommand
WARNING: This command trades correctness for speed!
Same as the `GoTo` command except that it doesn't recompile the file with
libclang before looking up nodes in the AST. This can be very useful when you're
editing files that take long to compile but you know that you haven't made any
changes since the last parse that would lead to incorrect jumps. When you're
just browsing around your codebase, this command can spare you quite a bit of
latency.
Supported in filetypes: `c, cpp, objc, objcpp`
### The `ClearCompilationFlagCache` subcommand
YCM caches the flags it gets from the `FlagsForFile` function in your

View File

@ -133,7 +133,8 @@ Location ClangCompleter::GetDeclarationLocation(
int line,
int column,
const std::vector< UnsavedFile > &unsaved_files,
const std::vector< std::string > &flags ) {
const std::vector< std::string > &flags,
bool reparse ) {
ReleaseGil unlock;
shared_ptr< TranslationUnit > unit =
translation_unit_store_.GetOrCreate( filename, unsaved_files, flags );
@ -142,7 +143,7 @@ Location ClangCompleter::GetDeclarationLocation(
return Location();
}
return unit->GetDeclarationLocation( line, column, unsaved_files );
return unit->GetDeclarationLocation( line, column, unsaved_files, reparse );
}
@ -151,7 +152,8 @@ Location ClangCompleter::GetDefinitionLocation(
int line,
int column,
const std::vector< UnsavedFile > &unsaved_files,
const std::vector< std::string > &flags ) {
const std::vector< std::string > &flags,
bool reparse ) {
ReleaseGil unlock;
shared_ptr< TranslationUnit > unit =
translation_unit_store_.GetOrCreate( filename, unsaved_files, flags );
@ -160,7 +162,7 @@ Location ClangCompleter::GetDefinitionLocation(
return Location();
}
return unit->GetDefinitionLocation( line, column, unsaved_files );
return unit->GetDefinitionLocation( line, column, unsaved_files, reparse );
}

View File

@ -62,14 +62,16 @@ public:
int line,
int column,
const std::vector< UnsavedFile > &unsaved_files,
const std::vector< std::string > &flags );
const std::vector< std::string > &flags,
bool reparse = true );
Location GetDefinitionLocation(
const std::string &filename,
int line,
int column,
const std::vector< UnsavedFile > &unsaved_files,
const std::vector< std::string > &flags );
const std::vector< std::string > &flags,
bool reparse = true );
void DeleteCachesForFile( const std::string &filename );

View File

@ -177,8 +177,10 @@ std::vector< CompletionData > TranslationUnit::CandidatesForLocation(
Location TranslationUnit::GetDeclarationLocation(
int line,
int column,
const std::vector< UnsavedFile > &unsaved_files ) {
ReparseForIndexing( unsaved_files );
const std::vector< UnsavedFile > &unsaved_files,
bool reparse ) {
if (reparse)
ReparseForIndexing( unsaved_files );
unique_lock< mutex > lock( clang_access_mutex_ );
if ( !clang_translation_unit_ )
@ -200,8 +202,10 @@ Location TranslationUnit::GetDeclarationLocation(
Location TranslationUnit::GetDefinitionLocation(
int line,
int column,
const std::vector< UnsavedFile > &unsaved_files ) {
ReparseForIndexing( unsaved_files );
const std::vector< UnsavedFile > &unsaved_files,
bool reparse ) {
if (reparse)
ReparseForIndexing( unsaved_files );
unique_lock< mutex > lock( clang_access_mutex_ );
if ( !clang_translation_unit_ )

View File

@ -69,12 +69,14 @@ public:
Location GetDeclarationLocation(
int line,
int column,
const std::vector< UnsavedFile > &unsaved_files );
const std::vector< UnsavedFile > &unsaved_files,
bool reparse = true );
Location GetDefinitionLocation(
int line,
int column,
const std::vector< UnsavedFile > &unsaved_files );
const std::vector< UnsavedFile > &unsaved_files,
bool reparse = true );
private:
void Reparse( std::vector< CXUnsavedFile > &unsaved_files );

View File

@ -20,7 +20,7 @@ namespace YouCompleteMe {
int YcmCoreVersion() {
// We increment this every time when we want to force users to recompile
// ycm_core.
return 8;
return 9;
}
} // namespace YouCompleteMe

View File

@ -188,7 +188,7 @@ def OverlapLength( left_string, right_string ):
length += 1
COMPATIBLE_WITH_CORE_VERSION = 8
COMPATIBLE_WITH_CORE_VERSION = 9
def CompatibleWithYcmCore():
try:

View File

@ -104,6 +104,7 @@ class ClangCompleter( Completer ):
return [ 'GoToDefinition',
'GoToDeclaration',
'GoTo',
'GoToImprecise',
'ClearCompilationFlagCache']
@ -118,12 +119,14 @@ class ClangCompleter( Completer ):
return self._GoToDeclaration( request_data )
elif command == 'GoTo':
return self._GoTo( request_data )
elif command == 'GoToImprecise':
return self._GoToImprecise( request_data )
elif command == 'ClearCompilationFlagCache':
return self._ClearCompilationFlagCache()
raise ValueError( self.UserCommandsHelpMessage() )
def _LocationForGoTo( self, goto_function, request_data ):
def _LocationForGoTo( self, goto_function, request_data, reparse = True ):
filename = request_data[ 'filepath' ]
if not filename:
raise ValueError( INVALID_FILE_MESSAGE )
@ -140,27 +143,22 @@ class ClangCompleter( Completer ):
line,
column,
files,
flags )
flags,
reparse )
def _GoToDefinition( self, request_data ):
location = self._LocationForGoTo( 'GetDefinitionLocation', request_data )
if not location or not location.IsValid():
raise RuntimeError( 'Can\'t jump to definition.' )
return responses.BuildGoToResponse( location.filename_,
location.line_number_ - 1,
location.column_number_ - 1)
return _ResponseForLocation( location )
def _GoToDeclaration( self, request_data ):
location = self._LocationForGoTo( 'GetDeclarationLocation', request_data )
if not location or not location.IsValid():
raise RuntimeError( 'Can\'t jump to declaration.' )
return responses.BuildGoToResponse( location.filename_,
location.line_number_ - 1,
location.column_number_ - 1)
return _ResponseForLocation( location )
def _GoTo( self, request_data ):
@ -169,11 +167,20 @@ class ClangCompleter( Completer ):
location = self._LocationForGoTo( 'GetDeclarationLocation', request_data )
if not location or not location.IsValid():
raise RuntimeError( 'Can\'t jump to definition or declaration.' )
return _ResponseForLocation( location )
return responses.BuildGoToResponse( location.filename_,
location.line_number_ - 1,
location.column_number_ - 1)
def _GoToImprecise( self, request_data ):
location = self._LocationForGoTo( 'GetDefinitionLocation',
request_data,
reparse = False )
if not location or not location.IsValid():
location = self._LocationForGoTo( 'GetDeclarationLocation',
request_data,
reparse = False )
if not location or not location.IsValid():
raise RuntimeError( 'Can\'t jump to definition or declaration.' )
return _ResponseForLocation( location )
def _ClearCompilationFlagCache( self ):
@ -295,3 +302,9 @@ def _FilterDiagnostics( diagnostics ):
x.text_ != TOO_MANY_ERRORS_DIAG_TEXT_TO_IGNORE ]
def _ResponseForLocation( location ):
return responses.BuildGoToResponse( location.filename_,
location.line_number_ - 1,
location.column_number_ - 1)