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:
Douglas Gregor 2010-08-17 00:40:40 +00:00
parent a66d1694f4
commit 2c8bd47a6a
2 changed files with 29 additions and 1 deletions

View File

@ -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();

View File

@ -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;
}