aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/cpptools/cpplocatorfilter.cpp
diff options
context:
space:
mode:
authorNikolai Kosjar <nikolai.kosjar@digia.com>2013-08-23 15:07:19 +0200
committerErik Verbruggen <erik.verbruggen@digia.com>2013-08-30 16:42:26 +0200
commitfc731a3a673b5e2992bf90e01bca2913bbece0cd (patch)
treed48be851fbb2170e795b8845dc9ea8b855733cec /src/plugins/cpptools/cpplocatorfilter.cpp
parentde1ec224244bbfbf0faccc100168a418a2054515 (diff)
CppTools: Introduce LocatorData
Until now the locator filters CppLocatorFilter, CppClassesFilter and CppFunctionsFilter used unnecessarily their own SearchSymbols instance. The results were also saved separately, which was unfavorable since e.g. the functions and classes data could be shared. Starting with this patch an instance of LocatorData will serve all mentioned filters. This saves about 20MB of memory after indexing the Qt Creator project. Change-Id: I8a34b67eb9fe0e5c68ba6e7c8f576389c78efc6f Reviewed-by: Thomas Hartmann <Thomas.Hartmann@digia.com> Reviewed-by: Erik Verbruggen <erik.verbruggen@digia.com>
Diffstat (limited to 'src/plugins/cpptools/cpplocatorfilter.cpp')
-rw-r--r--src/plugins/cpptools/cpplocatorfilter.cpp97
1 files changed, 17 insertions, 80 deletions
diff --git a/src/plugins/cpptools/cpplocatorfilter.cpp b/src/plugins/cpptools/cpplocatorfilter.cpp
index 52cb87695c8..474000e9fb7 100644
--- a/src/plugins/cpptools/cpplocatorfilter.cpp
+++ b/src/plugins/cpptools/cpplocatorfilter.cpp
@@ -36,76 +36,17 @@ using namespace CppTools::Internal;
static const int MaxPendingDocuments = 10;
-CppLocatorFilter::CppLocatorFilter(CppModelManager *manager)
- : m_manager(manager)
- , m_pendingDocumentsMutex(QMutex::Recursive)
+CppLocatorFilter::CppLocatorFilter(CppLocatorData *locatorData)
+ : m_data(locatorData)
{
setId("Classes and Methods");
setDisplayName(tr("C++ Classes and Methods"));
setShortcutString(QString(QLatin1Char(':')));
setIncludedByDefault(false);
-
- m_pendingDocuments.reserve(MaxPendingDocuments);
-
- connect(manager, SIGNAL(documentUpdated(CPlusPlus::Document::Ptr)),
- this, SLOT(onDocumentUpdated(CPlusPlus::Document::Ptr)));
-
- connect(manager, SIGNAL(aboutToRemoveFiles(QStringList)),
- this, SLOT(onAboutToRemoveFiles(QStringList)));
}
CppLocatorFilter::~CppLocatorFilter()
-{ }
-
-
-void CppLocatorFilter::flushPendingDocument(bool force)
-{
- QMutexLocker locker(&m_pendingDocumentsMutex);
- if (!force && m_pendingDocuments.size() < MaxPendingDocuments)
- return;
-
- foreach (CPlusPlus::Document::Ptr doc, m_pendingDocuments) {
- QList<ModelItemInfo> &results = m_searchList[doc->fileName()];
- results = search(doc, results.size() + 10);
- }
-
- m_pendingDocuments.clear();
- m_pendingDocuments.reserve(MaxPendingDocuments);
-}
-
-void CppLocatorFilter::onDocumentUpdated(CPlusPlus::Document::Ptr updatedDoc)
-{
- QMutexLocker locker(&m_pendingDocumentsMutex);
-
- int i = 0, ei = m_pendingDocuments.size();
- for (; i < ei; ++i) {
- const CPlusPlus::Document::Ptr &doc = m_pendingDocuments.at(i);
- if (doc->fileName() == updatedDoc->fileName()
- && doc->revision() < updatedDoc->revision()) {
- m_pendingDocuments[i] = updatedDoc;
- break;
- }
- }
-
- if (i == ei)
- m_pendingDocuments.append(updatedDoc);
-
- flushPendingDocument(false);
-}
-
-void CppLocatorFilter::onAboutToRemoveFiles(const QStringList &files)
{
- QMutexLocker locker(&m_pendingDocumentsMutex);
-
- for (int i = 0; i < m_pendingDocuments.size(); ) {
- if (files.contains(m_pendingDocuments.at(i)->fileName()))
- m_pendingDocuments.remove(i);
- else
- ++i;
- }
-
- foreach (const QString &file, files)
- m_searchList.remove(file);
}
Locator::FilterEntry CppLocatorFilter::filterEntryFromModelItemInfo(const CppTools::ModelItemInfo &info)
@@ -124,6 +65,14 @@ void CppLocatorFilter::refresh(QFutureInterface<void> &future)
Q_UNUSED(future)
}
+QList<QList<CppTools::ModelItemInfo> > CppLocatorFilter::itemsToMatchUserInputAgainst() const
+{
+ return QList<QList<CppTools::ModelItemInfo> >()
+ << m_data->classes()
+ << m_data->functions()
+ << m_data->enums();
+}
+
static bool compareLexigraphically(const Locator::FilterEntry &a,
const Locator::FilterEntry &b)
{
@@ -132,8 +81,6 @@ static bool compareLexigraphically(const Locator::FilterEntry &a,
QList<Locator::FilterEntry> CppLocatorFilter::matchesFor(QFutureInterface<Locator::FilterEntry> &future, const QString &origEntry)
{
- flushPendingDocument(true);
-
QString entry = trimWildcards(origEntry);
QList<Locator::FilterEntry> goodEntries;
QList<Locator::FilterEntry> betterEntries;
@@ -146,18 +93,14 @@ QList<Locator::FilterEntry> CppLocatorFilter::matchesFor(QFutureInterface<Locato
bool hasColonColon = entry.contains(QLatin1String("::"));
const Qt::CaseSensitivity caseSensitivityForPrefix = caseSensitivity(entry);
- QHashIterator<QString, QList<ModelItemInfo> > it(m_searchList);
- while (it.hasNext()) {
- if (future.isCanceled())
- break;
-
- it.next();
-
- const QList<ModelItemInfo> items = it.value();
+ const QList<QList<CppTools::ModelItemInfo> > itemLists = itemsToMatchUserInputAgainst();
+ foreach (const QList<CppTools::ModelItemInfo> &items, itemLists) {
foreach (const ModelItemInfo &info, items) {
+ if (future.isCanceled())
+ break;
const QString matchString = hasColonColon ? info.scopedSymbolName() : info.symbolName;
if ((hasWildcard && regexp.exactMatch(matchString))
- || (!hasWildcard && matcher.indexIn(matchString) != -1)) {
+ || (!hasWildcard && matcher.indexIn(matchString) != -1)) {
const Locator::FilterEntry filterEntry = filterEntryFromModelItemInfo(info);
if (matchString.startsWith(entry, caseSensitivityForPrefix))
betterEntries.append(filterEntry);
@@ -168,9 +111,9 @@ QList<Locator::FilterEntry> CppLocatorFilter::matchesFor(QFutureInterface<Locato
}
if (goodEntries.size() < 1000)
- qSort(goodEntries.begin(), goodEntries.end(), compareLexigraphically);
+ qStableSort(goodEntries.begin(), goodEntries.end(), compareLexigraphically);
if (betterEntries.size() < 1000)
- qSort(betterEntries.begin(), betterEntries.end(), compareLexigraphically);
+ qStableSort(betterEntries.begin(), betterEntries.end(), compareLexigraphically);
betterEntries += goodEntries;
return betterEntries;
@@ -181,9 +124,3 @@ void CppLocatorFilter::accept(Locator::FilterEntry selection) const
ModelItemInfo info = qvariant_cast<CppTools::ModelItemInfo>(selection.internalData);
Core::EditorManager::openEditorAt(info.fileName, info.line, info.column);
}
-
-void CppLocatorFilter::reset()
-{
- m_searchList.clear();
- m_previousEntry.clear();
-}