When the # of top-level declarations changes after reparsing a
translation unit, refresh code-completion results because they've probably changed. However, enforce a cooldown period between refreshes, to avoid thrashing. llvm-svn: 111218
This commit is contained in:
parent
a66d1694f4
commit
2c8bd47a6a
|
@ -259,6 +259,20 @@ private:
|
|||
/// type, which is used for type equality comparisons.
|
||||
llvm::StringMap<unsigned> CachedCompletionTypes;
|
||||
|
||||
/// \brief The number of top-level declarations present the last time we
|
||||
/// cached code-completion results.
|
||||
///
|
||||
/// The value is used to help detect when we should repopulate the global
|
||||
/// completion cache.
|
||||
unsigned NumTopLevelDeclsAtLastCompletionCache;
|
||||
|
||||
/// \brief The number of reparses left until we'll consider updating the
|
||||
/// code-completion cache.
|
||||
///
|
||||
/// This is meant to avoid thrashing during reparsing, by not allowing the
|
||||
/// code-completion cache to be updated on every reparse.
|
||||
unsigned CacheCodeCompletionCoolDown;
|
||||
|
||||
/// \brief Cache any "global" code-completion results, so that we can avoid
|
||||
/// recomputing them with each completion.
|
||||
void CacheCodeCompletionResults();
|
||||
|
|
|
@ -53,7 +53,9 @@ ASTUnit::ASTUnit(bool _MainFileIsAST)
|
|||
: CaptureDiagnostics(false), MainFileIsAST(_MainFileIsAST),
|
||||
CompleteTranslationUnit(true), ConcurrencyCheckValue(CheckUnlocked),
|
||||
PreambleRebuildCounter(0), SavedMainFileBuffer(0),
|
||||
ShouldCacheCodeCompletionResults(false) {
|
||||
ShouldCacheCodeCompletionResults(false),
|
||||
NumTopLevelDeclsAtLastCompletionCache(0),
|
||||
CacheCodeCompletionCoolDown(0) {
|
||||
}
|
||||
|
||||
ASTUnit::~ASTUnit() {
|
||||
|
@ -285,6 +287,10 @@ void ASTUnit::CacheCodeCompletionResults() {
|
|||
|
||||
if (CachingTimer)
|
||||
CachingTimer->stopTimer();
|
||||
|
||||
// Make a note of the state when we performed this caching.
|
||||
NumTopLevelDeclsAtLastCompletionCache = top_level_size();
|
||||
CacheCodeCompletionCoolDown = 15;
|
||||
}
|
||||
|
||||
void ASTUnit::ClearCachedCompletionResults() {
|
||||
|
@ -1411,6 +1417,14 @@ bool ASTUnit::Reparse(RemappedFile *RemappedFiles, unsigned NumRemappedFiles) {
|
|||
bool Result = Parse(OverrideMainBuffer);
|
||||
if (ReparsingTimer)
|
||||
ReparsingTimer->stopTimer();
|
||||
|
||||
if (ShouldCacheCodeCompletionResults) {
|
||||
if (CacheCodeCompletionCoolDown > 0)
|
||||
--CacheCodeCompletionCoolDown;
|
||||
else if (top_level_size() != NumTopLevelDeclsAtLastCompletionCache)
|
||||
CacheCodeCompletionResults();
|
||||
}
|
||||
|
||||
return Result;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue