Put the include depenency table into a separate class, and cache it when possible.

This commit is contained in:
Erik Verbruggen
2010-03-17 12:34:29 +01:00
parent 6ed0cd5d32
commit 1cc5e1fe01
7 changed files with 239 additions and 117 deletions

View File

@@ -178,6 +178,7 @@ static void find_helper(QFutureInterface<Usage> &future,
const CppTools::CppModelManagerInterface::WorkingCopy workingCopy,
Snapshot snapshot,
Document::Ptr symbolDocument,
DependencyTable dependencyTable,
Symbol *symbol)
{
QTime tm;
@@ -200,7 +201,7 @@ static void find_helper(QFutureInterface<Usage> &future,
files.append(doc->fileName());
}
} else {
files += snapshot.filesDependingOn(sourceFile);
files += dependencyTable.filesDependingOn(sourceFile);
}
files.removeDuplicates();
//qDebug() << "done in:" << tm.elapsed() << "number of files to parse:" << files.size();
@@ -215,6 +216,15 @@ static void find_helper(QFutureInterface<Usage> &future,
future.setProgressValue(files.size());
}
void CppFindReferences::updateDependencyTable(const Snapshot &snapshot)
{
if (!m_deps.isValidFor(snapshot)) {
DependencyTable newDeps;
newDeps.build(snapshot);
m_deps = newDeps;
}
}
void CppFindReferences::findUsages(Document::Ptr symbolDocument, Symbol *symbol)
{
Find::SearchResult *search = _resultWindow->startNewSearch(Find::SearchResultWindow::SearchOnly);
@@ -255,9 +265,11 @@ void CppFindReferences::findAll_helper(Document::Ptr symbolDocument, Symbol *sym
Core::ProgressManager *progressManager = Core::ICore::instance()->progressManager();
updateDependencyTable(snapshot);
QFuture<Usage> result;
result = QtConcurrent::run(&find_helper, workingCopy, snapshot, symbolDocument, symbol);
result = QtConcurrent::run(&find_helper, workingCopy, snapshot, symbolDocument, m_deps, symbol);
m_watcher.setFuture(result);
Core::FutureProgress *progress = progressManager->addTask(result, tr("Searching..."),
@@ -375,11 +387,12 @@ public:
static void findMacroUses_helper(QFutureInterface<Usage> &future,
const CppTools::CppModelManagerInterface::WorkingCopy workingCopy,
const Snapshot snapshot,
DependencyTable dependencyTable,
const Macro macro)
{
const QString& sourceFile = macro.fileName();
QStringList files(sourceFile);
files += snapshot.filesDependingOn(sourceFile);
files += dependencyTable.filesDependingOn(sourceFile);
files.removeDuplicates();
future.setProgressRange(0, files.size());
@@ -411,8 +424,10 @@ void CppFindReferences::findMacroUses(const Macro &macro)
source.mid(macro.offset(), macro.length()), 0, macro.length());
}
updateDependencyTable(snapshot);
QFuture<Usage> result;
result = QtConcurrent::run(&findMacroUses_helper, workingCopy, snapshot, macro);
result = QtConcurrent::run(&findMacroUses_helper, workingCopy, snapshot, m_deps, macro);
m_watcher.setFuture(result);
Core::ProgressManager *progressManager = Core::ICore::instance()->progressManager();

View File

@@ -36,6 +36,7 @@
#include <QtCore/QFutureWatcher>
#include <utils/filesearch.h>
#include <cplusplus/CppDocument.h>
#include <cplusplus/DependencyTable.h>
#include <cplusplus/FindUsages.h>
namespace Find {
@@ -77,11 +78,13 @@ private Q_SLOTS:
private:
void findAll_helper(CPlusPlus::Document::Ptr symbolDocument, CPlusPlus::Symbol *symbol);
void updateDependencyTable(const CPlusPlus::Snapshot &snapshot);
private:
QPointer<CppModelManagerInterface> _modelManager;
Find::SearchResultWindow *_resultWindow;
QFutureWatcher<CPlusPlus::Usage> m_watcher;
CPlusPlus::DependencyTable m_deps;
};
} // end of namespace Internal