C++: pass ModelItemInfo around wrapped in a QSharedPointer.

Change-Id: I36162ea589ad01cf2ba79fc931732422fc1e6983
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>
This commit is contained in:
Erik Verbruggen
2014-03-13 14:15:58 +01:00
parent f26d6a76a4
commit 20c4f523ab
15 changed files with 163 additions and 144 deletions

View File

@@ -1919,11 +1919,11 @@ void AddIncludeForUndefinedIdentifier::match(const CppQuickFixInterface &interfa
QList<Core::LocatorFilterEntry> matches = classesFilter->matchesFor(dummyInterface, className); QList<Core::LocatorFilterEntry> matches = classesFilter->matchesFor(dummyInterface, className);
bool classExists = false; bool classExists = false;
foreach (const Core::LocatorFilterEntry &entry, matches) { foreach (const Core::LocatorFilterEntry &entry, matches) {
const ModelItemInfo info = entry.internalData.value<ModelItemInfo>(); ModelItemInfo::Ptr info = entry.internalData.value<ModelItemInfo::Ptr>();
if (info.symbolName != className) if (info->symbolName() != className)
continue; continue;
classExists = true; classExists = true;
const QString &fileName = info.fileName; const QString &fileName = info->fileName();
const QFileInfo fileInfo(fileName); const QFileInfo fileInfo(fileName);
// find the shortest way to include fileName given the includePaths // find the shortest way to include fileName given the includePaths

View File

@@ -125,19 +125,19 @@ public:
break; break;
if (m_fileNames.isEmpty() || m_fileNames.contains(it.value()->fileName())) { if (m_fileNames.isEmpty() || m_fileNames.contains(it.value()->fileName())) {
QVector<Core::SearchResultItem> resultItems; QVector<Core::SearchResultItem> resultItems;
QList<ModelItemInfo> modelInfos = search(it.value()); QList<ModelItemInfo::Ptr> modelInfos = search(it.value());
foreach (const ModelItemInfo &info, modelInfos) { foreach (const ModelItemInfo::Ptr &info, modelInfos) {
int index = matcher.indexIn(info.symbolName); int index = matcher.indexIn(info->symbolName());
if (index != -1) { if (index != -1) {
QString text = info.symbolName; QString text = info->symbolName();
QString scope = info.symbolScope; QString scope = info->symbolScope();
if (info.type == ModelItemInfo::Function) { if (info->type() == ModelItemInfo::Function) {
QString name; QString name;
info.unqualifiedNameAndScope(info.symbolName, &name, &scope); info->unqualifiedNameAndScope(info->symbolName(), &name, &scope);
text = name + info.symbolType; text = name + info->symbolType();
} else if (info.type == ModelItemInfo::Declaration){ } else if (info->type() == ModelItemInfo::Declaration){
text = ModelItemInfo::representDeclaration(info.symbolName, text = ModelItemInfo::representDeclaration(info->symbolName(),
info.symbolType); info->symbolType());
} }
Core::SearchResultItem item; Core::SearchResultItem item;
@@ -145,7 +145,7 @@ public:
item.text = text; item.text = text;
item.textMarkPos = -1; item.textMarkPos = -1;
item.textMarkLength = 0; item.textMarkLength = 0;
item.icon = info.icon; item.icon = info->icon();
item.lineNumber = -1; item.lineNumber = -1;
item.userData = qVariantFromValue(info); item.userData = qVariantFromValue(info);
resultItems << item; resultItems << item;

View File

@@ -45,18 +45,18 @@ CppClassesFilter::~CppClassesFilter()
{ {
} }
QList<QList<CppTools::ModelItemInfo> > CppClassesFilter::itemsToMatchUserInputAgainst() const QList<QList<ModelItemInfo::Ptr> > CppClassesFilter::itemsToMatchUserInputAgainst() const
{ {
return QList<QList<CppTools::ModelItemInfo> >() << m_data->classes(); return QList<QList<CppTools::ModelItemInfo::Ptr> >() << m_data->classes();
} }
Core::LocatorFilterEntry CppClassesFilter::filterEntryFromModelItemInfo(const ModelItemInfo &info) Core::LocatorFilterEntry CppClassesFilter::filterEntryFromModelItemInfo(ModelItemInfo::Ptr info)
{ {
const QVariant id = qVariantFromValue(info); const QVariant id = qVariantFromValue(info);
Core::LocatorFilterEntry filterEntry(this, info.symbolName, id, info.icon); Core::LocatorFilterEntry filterEntry(this, info->symbolName(), id, info->icon());
filterEntry.extraInfo = info.symbolScope.isEmpty() filterEntry.extraInfo = info->symbolScope().isEmpty()
? info.shortNativeFilePath() ? info->shortNativeFilePath()
: info.symbolScope; : info->symbolScope();
return filterEntry; return filterEntry;
} }

View File

@@ -45,8 +45,8 @@ public:
~CppClassesFilter(); ~CppClassesFilter();
private: private:
QList<QList<CppTools::ModelItemInfo> > itemsToMatchUserInputAgainst() const; QList<QList<CppTools::ModelItemInfo::Ptr> > itemsToMatchUserInputAgainst() const;
Core::LocatorFilterEntry filterEntryFromModelItemInfo(const ModelItemInfo &info); Core::LocatorFilterEntry filterEntryFromModelItemInfo(ModelItemInfo::Ptr info);
}; };
} // namespace CppTools } // namespace CppTools

View File

@@ -84,28 +84,28 @@ QList<Core::LocatorFilterEntry> CppCurrentDocumentFilter::matchesFor(
const Qt::CaseSensitivity caseSensitivityForPrefix = caseSensitivity(entry); const Qt::CaseSensitivity caseSensitivityForPrefix = caseSensitivity(entry);
foreach (const ModelItemInfo & info, m_itemsOfCurrentDoc) foreach (ModelItemInfo::Ptr info, m_itemsOfCurrentDoc) {
{
if (future.isCanceled()) if (future.isCanceled())
break; break;
QString matchString = info.symbolName; QString matchString = info->symbolName();
if (info.type == ModelItemInfo::Declaration) if (info->type() == ModelItemInfo::Declaration)
matchString = ModelItemInfo::representDeclaration(info.symbolName, info.symbolType); matchString = ModelItemInfo::representDeclaration(info->symbolName(),
else if (info.type == ModelItemInfo::Function) info->symbolType());
matchString += info.symbolType; else if (info->type() == ModelItemInfo::Function)
matchString += info->symbolType();
if ((hasWildcard && regexp.exactMatch(matchString)) if ((hasWildcard && regexp.exactMatch(matchString))
|| (!hasWildcard && matcher.indexIn(matchString) != -1)) || (!hasWildcard && matcher.indexIn(matchString) != -1))
{ {
QVariant id = qVariantFromValue(info); QVariant id = qVariantFromValue(info);
QString name = matchString; QString name = matchString;
QString extraInfo = info.symbolScope; QString extraInfo = info->symbolScope();
if (info.type == ModelItemInfo::Function) { if (info->type() == ModelItemInfo::Function) {
if (info.unqualifiedNameAndScope(matchString, &name, &extraInfo)) if (info->unqualifiedNameAndScope(matchString, &name, &extraInfo))
name += info.symbolType; name += info->symbolType();
} }
Core::LocatorFilterEntry filterEntry(this, name, id, info.icon); Core::LocatorFilterEntry filterEntry(this, name, id, info->icon());
filterEntry.extraInfo = extraInfo; filterEntry.extraInfo = extraInfo;
if (matchString.startsWith(entry, caseSensitivityForPrefix)) if (matchString.startsWith(entry, caseSensitivityForPrefix))
@@ -123,8 +123,8 @@ QList<Core::LocatorFilterEntry> CppCurrentDocumentFilter::matchesFor(
void CppCurrentDocumentFilter::accept(Core::LocatorFilterEntry selection) const void CppCurrentDocumentFilter::accept(Core::LocatorFilterEntry selection) const
{ {
ModelItemInfo info = qvariant_cast<CppTools::ModelItemInfo>(selection.internalData); ModelItemInfo::Ptr info = qvariant_cast<CppTools::ModelItemInfo::Ptr>(selection.internalData);
Core::EditorManager::openEditorAt(info.fileName, info.line, info.column); Core::EditorManager::openEditorAt(info->fileName(), info->line(), info->column());
} }
void CppCurrentDocumentFilter::refresh(QFutureInterface<void> &future) void CppCurrentDocumentFilter::refresh(QFutureInterface<void> &future)

View File

@@ -61,7 +61,7 @@ private slots:
private: private:
CppModelManager * m_modelManager; CppModelManager * m_modelManager;
QString m_currentFileName; QString m_currentFileName;
QList<ModelItemInfo> m_itemsOfCurrentDoc; QList<ModelItemInfo::Ptr> m_itemsOfCurrentDoc;
SearchSymbols search; SearchSymbols search;
}; };

View File

@@ -44,22 +44,22 @@ CppFunctionsFilter::~CppFunctionsFilter()
{ {
} }
QList<QList<CppTools::ModelItemInfo> > CppFunctionsFilter::itemsToMatchUserInputAgainst() const QList<QList<CppTools::ModelItemInfo::Ptr> > CppFunctionsFilter::itemsToMatchUserInputAgainst() const
{ {
return QList<QList<CppTools::ModelItemInfo> >() << m_data->functions(); return QList<QList<CppTools::ModelItemInfo::Ptr> >() << m_data->functions();
} }
Core::LocatorFilterEntry CppFunctionsFilter::filterEntryFromModelItemInfo(const CppTools::ModelItemInfo &info) Core::LocatorFilterEntry CppFunctionsFilter::filterEntryFromModelItemInfo(ModelItemInfo::Ptr info)
{ {
const QVariant id = qVariantFromValue(info); const QVariant id = qVariantFromValue(info);
QString name = info.symbolName; QString name = info->symbolName();
QString extraInfo = info.symbolScope; QString extraInfo = info->symbolScope();
info.unqualifiedNameAndScope(name, &name, &extraInfo); info->unqualifiedNameAndScope(name, &name, &extraInfo);
if (extraInfo.isEmpty()) if (extraInfo.isEmpty())
extraInfo = info.shortNativeFilePath(); extraInfo = info->shortNativeFilePath();
Core::LocatorFilterEntry filterEntry(this, name + info.symbolType, id, info.icon); Core::LocatorFilterEntry filterEntry(this, name + info->symbolType(), id, info->icon());
filterEntry.extraInfo = extraInfo; filterEntry.extraInfo = extraInfo;
return filterEntry; return filterEntry;

View File

@@ -45,8 +45,8 @@ public:
~CppFunctionsFilter(); ~CppFunctionsFilter();
private: private:
QList<QList<ModelItemInfo> > itemsToMatchUserInputAgainst() const; QList<QList<ModelItemInfo::Ptr> > itemsToMatchUserInputAgainst() const;
Core::LocatorFilterEntry filterEntryFromModelItemInfo(const ModelItemInfo &info); Core::LocatorFilterEntry filterEntryFromModelItemInfo(ModelItemInfo::Ptr info);
}; };
} // namespace Internal } // namespace Internal

View File

@@ -53,19 +53,19 @@ CppLocatorData::CppLocatorData(CppModelManager *modelManager)
this, SLOT(onAboutToRemoveFiles(QStringList))); this, SLOT(onAboutToRemoveFiles(QStringList)));
} }
QList<ModelItemInfo> CppLocatorData::enums() QList<ModelItemInfo::Ptr> CppLocatorData::enums()
{ {
flushPendingDocument(true); flushPendingDocument(true);
return allModelItemInfos(m_allEnums); return allModelItemInfos(m_allEnums);
} }
QList<ModelItemInfo> CppLocatorData::classes() QList<ModelItemInfo::Ptr> CppLocatorData::classes()
{ {
flushPendingDocument(true); flushPendingDocument(true);
return allModelItemInfos(m_allClasses); return allModelItemInfos(m_allClasses);
} }
QList<ModelItemInfo> CppLocatorData::functions() QList<ModelItemInfo::Ptr> CppLocatorData::functions()
{ {
flushPendingDocument(true); flushPendingDocument(true);
return allModelItemInfos(m_allFunctions); return allModelItemInfos(m_allFunctions);
@@ -120,15 +120,15 @@ void CppLocatorData::flushPendingDocument(bool force)
foreach (CPlusPlus::Document::Ptr doc, m_pendingDocuments) { foreach (CPlusPlus::Document::Ptr doc, m_pendingDocuments) {
const QString fileName = findOrInsertFilePath(doc->fileName()); const QString fileName = findOrInsertFilePath(doc->fileName());
QList<ModelItemInfo> resultsEnums; QList<ModelItemInfo::Ptr> resultsEnums;
QList<ModelItemInfo> resultsClasses; QList<ModelItemInfo::Ptr> resultsClasses;
QList<ModelItemInfo> resultsFunctions; QList<ModelItemInfo::Ptr> resultsFunctions;
const int sizeHint = m_allEnums[fileName].size() + m_allClasses[fileName].size() const int sizeHint = m_allEnums[fileName].size() + m_allClasses[fileName].size()
+ m_allFunctions[fileName].size() + 10; + m_allFunctions[fileName].size() + 10;
const QList<ModelItemInfo> results = m_search(doc, sizeHint); const QList<ModelItemInfo::Ptr> results = m_search(doc, sizeHint);
foreach (const ModelItemInfo &info, results) { foreach (ModelItemInfo::Ptr info, results) {
switch (info.type) { switch (info->type()) {
case ModelItemInfo::Enum: case ModelItemInfo::Enum:
resultsEnums.append(info); resultsEnums.append(info);
break; break;
@@ -152,11 +152,11 @@ void CppLocatorData::flushPendingDocument(bool force)
m_pendingDocuments.reserve(MaxPendingDocuments); m_pendingDocuments.reserve(MaxPendingDocuments);
} }
QList<ModelItemInfo> CppLocatorData::allModelItemInfos(const QHash<QString, QList<ModelItemInfo::Ptr> CppLocatorData::allModelItemInfos(const QHash<QString,
QList<ModelItemInfo> > &items) const QList<ModelItemInfo::Ptr>> &items) const
{ {
QList<ModelItemInfo> result; QList<ModelItemInfo::Ptr> result;
QHashIterator<QString, QList<ModelItemInfo> > it(items); QHashIterator<QString, QList<ModelItemInfo::Ptr> > it(items);
while (it.hasNext()) { while (it.hasNext()) {
it.next(); it.next();
result.append(it.value()); result.append(it.value());

View File

@@ -49,9 +49,9 @@ class CppLocatorData : public QObject
public: public:
explicit CppLocatorData(CppModelManager *modelManager); explicit CppLocatorData(CppModelManager *modelManager);
QList<ModelItemInfo> enums(); QList<ModelItemInfo::Ptr> enums();
QList<ModelItemInfo> classes(); QList<ModelItemInfo::Ptr> classes();
QList<ModelItemInfo> functions(); QList<ModelItemInfo::Ptr> functions();
private slots: private slots:
void onDocumentUpdated(const CPlusPlus::Document::Ptr &document); void onDocumentUpdated(const CPlusPlus::Document::Ptr &document);
@@ -59,8 +59,8 @@ private slots:
private: private:
void flushPendingDocument(bool force); void flushPendingDocument(bool force);
QList<ModelItemInfo> allModelItemInfos(const QHash<QString, QList<ModelItemInfo::Ptr> allModelItemInfos(
QList<ModelItemInfo> > &items) const; const QHash<QString, QList<ModelItemInfo::Ptr>> &items) const;
QString findOrInsertFilePath(const QString &path) QString findOrInsertFilePath(const QString &path)
{ return m_strings.insert(path); } { return m_strings.insert(path); }
@@ -71,9 +71,9 @@ private:
StringTable &m_strings; // Used to avoid QString duplication StringTable &m_strings; // Used to avoid QString duplication
SearchSymbols m_search; SearchSymbols m_search;
QHash<QString, QList<ModelItemInfo> > m_allEnums; QHash<QString, QList<ModelItemInfo::Ptr> > m_allEnums;
QHash<QString, QList<ModelItemInfo> > m_allClasses; QHash<QString, QList<ModelItemInfo::Ptr> > m_allClasses;
QHash<QString, QList<ModelItemInfo> > m_allFunctions; QHash<QString, QList<ModelItemInfo::Ptr> > m_allFunctions;
mutable QMutex m_pendingDocumentsMutex; mutable QMutex m_pendingDocumentsMutex;
QVector<CPlusPlus::Document::Ptr> m_pendingDocuments; QVector<CPlusPlus::Document::Ptr> m_pendingDocuments;

View File

@@ -47,13 +47,14 @@ CppLocatorFilter::~CppLocatorFilter()
{ {
} }
Core::LocatorFilterEntry CppLocatorFilter::filterEntryFromModelItemInfo(const CppTools::ModelItemInfo &info) Core::LocatorFilterEntry CppLocatorFilter::filterEntryFromModelItemInfo(ModelItemInfo::Ptr info)
{ {
const QVariant id = qVariantFromValue(info); const QVariant id = qVariantFromValue(info);
Core::LocatorFilterEntry filterEntry(this, info.scopedSymbolName(), id, info.icon); Core::LocatorFilterEntry filterEntry(this, info->scopedSymbolName(), id, info->icon());
filterEntry.extraInfo = info.type == ModelItemInfo::Class || info.type == ModelItemInfo::Enum if (info->type() == ModelItemInfo::Class || info->type() == ModelItemInfo::Enum)
? info.shortNativeFilePath() filterEntry.extraInfo = info->shortNativeFilePath();
: info.symbolType; else
filterEntry.extraInfo = info->symbolType();
return filterEntry; return filterEntry;
} }
@@ -63,9 +64,9 @@ void CppLocatorFilter::refresh(QFutureInterface<void> &future)
Q_UNUSED(future) Q_UNUSED(future)
} }
QList<QList<CppTools::ModelItemInfo> > CppLocatorFilter::itemsToMatchUserInputAgainst() const QList<QList<CppTools::ModelItemInfo::Ptr> > CppLocatorFilter::itemsToMatchUserInputAgainst() const
{ {
return QList<QList<CppTools::ModelItemInfo> >() return QList<QList<CppTools::ModelItemInfo::Ptr> >()
<< m_data->classes() << m_data->classes()
<< m_data->functions() << m_data->functions()
<< m_data->enums(); << m_data->enums();
@@ -77,7 +78,8 @@ static bool compareLexigraphically(const Core::LocatorFilterEntry &a,
return a.displayName < b.displayName; return a.displayName < b.displayName;
} }
QList<Core::LocatorFilterEntry> CppLocatorFilter::matchesFor(QFutureInterface<Core::LocatorFilterEntry> &future, const QString &origEntry) QList<Core::LocatorFilterEntry> CppLocatorFilter::matchesFor(
QFutureInterface<Core::LocatorFilterEntry> &future, const QString &origEntry)
{ {
QString entry = trimWildcards(origEntry); QString entry = trimWildcards(origEntry);
QList<Core::LocatorFilterEntry> goodEntries; QList<Core::LocatorFilterEntry> goodEntries;
@@ -91,12 +93,13 @@ QList<Core::LocatorFilterEntry> CppLocatorFilter::matchesFor(QFutureInterface<Co
bool hasColonColon = entry.contains(QLatin1String("::")); bool hasColonColon = entry.contains(QLatin1String("::"));
const Qt::CaseSensitivity caseSensitivityForPrefix = caseSensitivity(entry); const Qt::CaseSensitivity caseSensitivityForPrefix = caseSensitivity(entry);
const QList<QList<CppTools::ModelItemInfo> > itemLists = itemsToMatchUserInputAgainst(); const QList<QList<CppTools::ModelItemInfo::Ptr> > itemLists = itemsToMatchUserInputAgainst();
foreach (const QList<CppTools::ModelItemInfo> &items, itemLists) { foreach (const QList<CppTools::ModelItemInfo::Ptr> &items, itemLists) {
foreach (const ModelItemInfo &info, items) { foreach (ModelItemInfo::Ptr info, items) {
if (future.isCanceled()) if (future.isCanceled())
break; break;
const QString matchString = hasColonColon ? info.scopedSymbolName() : info.symbolName; const QString matchString = hasColonColon ? info->scopedSymbolName()
: info->symbolName();
if ((hasWildcard && regexp.exactMatch(matchString)) if ((hasWildcard && regexp.exactMatch(matchString))
|| (!hasWildcard && matcher.indexIn(matchString) != -1)) { || (!hasWildcard && matcher.indexIn(matchString) != -1)) {
const Core::LocatorFilterEntry filterEntry = filterEntryFromModelItemInfo(info); const Core::LocatorFilterEntry filterEntry = filterEntryFromModelItemInfo(info);
@@ -119,6 +122,6 @@ QList<Core::LocatorFilterEntry> CppLocatorFilter::matchesFor(QFutureInterface<Co
void CppLocatorFilter::accept(Core::LocatorFilterEntry selection) const void CppLocatorFilter::accept(Core::LocatorFilterEntry selection) const
{ {
ModelItemInfo info = qvariant_cast<CppTools::ModelItemInfo>(selection.internalData); ModelItemInfo::Ptr info = qvariant_cast<CppTools::ModelItemInfo::Ptr>(selection.internalData);
Core::EditorManager::openEditorAt(info.fileName, info.line, info.column); Core::EditorManager::openEditorAt(info->fileName(), info->line(), info->column());
} }

View File

@@ -48,13 +48,14 @@ public:
CppLocatorFilter(CppLocatorData *locatorData); CppLocatorFilter(CppLocatorData *locatorData);
~CppLocatorFilter(); ~CppLocatorFilter();
QList<Core::LocatorFilterEntry> matchesFor(QFutureInterface<Core::LocatorFilterEntry> &future, const QString &entry); QList<Core::LocatorFilterEntry> matchesFor(QFutureInterface<Core::LocatorFilterEntry> &future,
const QString &entry);
void accept(Core::LocatorFilterEntry selection) const; void accept(Core::LocatorFilterEntry selection) const;
void refresh(QFutureInterface<void> &future); void refresh(QFutureInterface<void> &future);
private: protected:
virtual QList<QList<ModelItemInfo> > itemsToMatchUserInputAgainst() const; virtual QList<QList<ModelItemInfo::Ptr> > itemsToMatchUserInputAgainst() const;
virtual Core::LocatorFilterEntry filterEntryFromModelItemInfo(const ModelItemInfo &info); virtual Core::LocatorFilterEntry filterEntryFromModelItemInfo(ModelItemInfo::Ptr info);
protected: protected:
CppLocatorData *m_data; CppLocatorData *m_data;

View File

@@ -53,7 +53,8 @@ void SearchSymbols::setSymbolsToSearchFor(const SymbolTypes &types)
symbolsToSearchFor = types; symbolsToSearchFor = types;
} }
QList<ModelItemInfo> SearchSymbols::operator()(Document::Ptr doc, int sizeHint, const QString &scope) QList<ModelItemInfo::Ptr> SearchSymbols::operator()(Document::Ptr doc, int sizeHint,
const QString &scope)
{ {
QString previousScope = switchScope(scope); QString previousScope = switchScope(scope);
items.clear(); items.clear();
@@ -62,7 +63,7 @@ QList<ModelItemInfo> SearchSymbols::operator()(Document::Ptr doc, int sizeHint,
accept(doc->globalSymbolAt(i)); accept(doc->globalSymbolAt(i));
} }
(void) switchScope(previousScope); (void) switchScope(previousScope);
QList<ModelItemInfo> result = items; QList<ModelItemInfo::Ptr> result = items;
strings.scheduleGC(); strings.scheduleGC();
items.clear(); items.clear();
m_paths.clear(); m_paths.clear();
@@ -288,12 +289,12 @@ void SearchSymbols::appendItem(const QString &symbolName, const QString &symbolT
} }
const QIcon icon = icons.iconForSymbol(symbol); const QIcon icon = icons.iconForSymbol(symbol);
items.append(ModelItemInfo(findOrInsert(symbolName), items.append(ModelItemInfo::create(findOrInsert(symbolName),
findOrInsert(symbolType), findOrInsert(symbolType),
findOrInsert(symbolScope), findOrInsert(symbolScope),
itemType, itemType,
findOrInsert(path), findOrInsert(path),
symbol->line(), symbol->line(),
symbol->column() - 1, // 1-based vs 0-based column symbol->column() - 1, // 1-based vs 0-based column
icon)); icon));
} }

View File

@@ -43,22 +43,21 @@
#include <QIcon> #include <QIcon>
#include <QString> #include <QString>
#include <QSet> #include <QSet>
#include <QSharedPointer>
#include <QHash> #include <QHash>
#include <functional> #include <functional>
namespace CppTools { namespace CppTools {
struct CPPTOOLS_EXPORT ModelItemInfo class CPPTOOLS_EXPORT ModelItemInfo
{ {
Q_DISABLE_COPY(ModelItemInfo)
public:
enum ItemType { Enum, Class, Function, Declaration }; enum ItemType { Enum, Class, Function, Declaration };
ModelItemInfo() private:
: type(Declaration),
line(0),
column(0)
{ }
ModelItemInfo(const QString &symbolName, ModelItemInfo(const QString &symbolName,
const QString &symbolType, const QString &symbolType,
const QString &symbolScope, const QString &symbolScope,
@@ -67,38 +66,42 @@ struct CPPTOOLS_EXPORT ModelItemInfo
int line, int line,
int column, int column,
const QIcon &icon) const QIcon &icon)
: symbolName(symbolName), : m_symbolName(symbolName),
symbolType(symbolType), m_symbolType(symbolType),
symbolScope(symbolScope), m_symbolScope(symbolScope),
fileName(fileName), m_fileName(fileName),
icon(icon), m_icon(icon),
type(type), m_type(type),
line(line), m_line(line),
column(column) m_column(column)
{ } {}
ModelItemInfo(const ModelItemInfo &otherInfo) public:
: symbolName(otherInfo.symbolName), typedef QSharedPointer<ModelItemInfo> Ptr;
symbolType(otherInfo.symbolType), static Ptr create(const QString &symbolName,
symbolScope(otherInfo.symbolScope), const QString &symbolType,
fileName(otherInfo.fileName), const QString &symbolScope,
icon(otherInfo.icon), ItemType type,
type(otherInfo.type), const QString &fileName,
line(otherInfo.line), int line,
column(otherInfo.column) int column,
{ } const QIcon &icon)
{
return Ptr(new ModelItemInfo(
symbolName, symbolType, symbolScope, type, fileName, line, column, icon));
}
QString scopedSymbolName() const QString scopedSymbolName() const
{ {
return symbolScope.isEmpty() return m_symbolScope.isEmpty()
? symbolName ? m_symbolName
: symbolScope + QLatin1String("::") + symbolName; : m_symbolScope + QLatin1String("::") + m_symbolName;
} }
bool unqualifiedNameAndScope(const QString &defaultName, QString *name, QString *scope) const bool unqualifiedNameAndScope(const QString &defaultName, QString *name, QString *scope) const
{ {
*name = defaultName; *name = defaultName;
*scope = symbolScope; *scope = m_symbolScope;
const QString qualifiedName = scopedSymbolName(); const QString qualifiedName = scopedSymbolName();
const int colonColonPosition = qualifiedName.lastIndexOf(QLatin1String("::")); const int colonColonPosition = qualifiedName.lastIndexOf(QLatin1String("::"));
if (colonColonPosition != -1) { if (colonColonPosition != -1) {
@@ -121,16 +124,26 @@ struct CPPTOOLS_EXPORT ModelItemInfo
} }
QString shortNativeFilePath() const QString shortNativeFilePath() const
{ return Utils::FileUtils::shortNativePath(Utils::FileName::fromString(fileName)); } { return Utils::FileUtils::shortNativePath(Utils::FileName::fromString(m_fileName)); }
QString symbolName; // as found in the code, therefore might be qualified QString symbolName() const { return m_symbolName; }
QString symbolType; QString symbolType() const { return m_symbolType; }
QString symbolScope; QString symbolScope() const { return m_symbolScope; }
QString fileName; QString fileName() const { return m_fileName; }
QIcon icon; QIcon icon() const { return m_icon; }
ItemType type; ItemType type() const { return m_type; }
int line; int line() const { return m_line; }
int column; int column() const { return m_column; }
private:
QString m_symbolName; // as found in the code, therefore might be qualified
QString m_symbolType;
QString m_symbolScope;
QString m_fileName;
QIcon m_icon;
ItemType m_type;
int m_line;
int m_column;
}; };
class SearchSymbols: public std::binary_function<CPlusPlus::Document::Ptr, int, QList<ModelItemInfo> >, class SearchSymbols: public std::binary_function<CPlusPlus::Document::Ptr, int, QList<ModelItemInfo> >,
@@ -145,10 +158,11 @@ public:
void setSymbolsToSearchFor(const SymbolTypes &types); void setSymbolsToSearchFor(const SymbolTypes &types);
QList<ModelItemInfo> operator()(CPlusPlus::Document::Ptr doc, int sizeHint = 500) QList<ModelItemInfo::Ptr> operator()(CPlusPlus::Document::Ptr doc, int sizeHint = 500)
{ return operator()(doc, sizeHint, QString()); } { return operator()(doc, sizeHint, QString()); }
QList<ModelItemInfo> operator()(CPlusPlus::Document::Ptr doc, int sizeHint, const QString &scope); QList<ModelItemInfo::Ptr> operator()(CPlusPlus::Document::Ptr doc, int sizeHint,
const QString &scope);
protected: protected:
using SymbolVisitor::visit; using SymbolVisitor::visit;
@@ -201,7 +215,7 @@ private:
QString _scope; QString _scope;
CPlusPlus::Overview overview; CPlusPlus::Overview overview;
CPlusPlus::Icons icons; CPlusPlus::Icons icons;
QList<ModelItemInfo> items; QList<ModelItemInfo::Ptr> items;
SymbolTypes symbolsToSearchFor; SymbolTypes symbolsToSearchFor;
QHash<const CPlusPlus::StringLiteral *, QString> m_paths; QHash<const CPlusPlus::StringLiteral *, QString> m_paths;
}; };
@@ -209,6 +223,6 @@ private:
} // namespace CppTools } // namespace CppTools
Q_DECLARE_OPERATORS_FOR_FLAGS(CppTools::SearchSymbols::SymbolTypes) Q_DECLARE_OPERATORS_FOR_FLAGS(CppTools::SearchSymbols::SymbolTypes)
Q_DECLARE_METATYPE(CppTools::ModelItemInfo) Q_DECLARE_METATYPE(CppTools::ModelItemInfo::Ptr)
#endif // SEARCHSYMBOLS_H #endif // SEARCHSYMBOLS_H

View File

@@ -181,10 +181,10 @@ void SymbolsFindFilter::finish()
void SymbolsFindFilter::openEditor(const Core::SearchResultItem &item) void SymbolsFindFilter::openEditor(const Core::SearchResultItem &item)
{ {
if (!item.userData.canConvert<ModelItemInfo>()) if (!item.userData.canConvert<ModelItemInfo::Ptr>())
return; return;
ModelItemInfo info = item.userData.value<ModelItemInfo>(); ModelItemInfo::Ptr info = item.userData.value<ModelItemInfo::Ptr>();
EditorManager::openEditorAt(info.fileName, info.line, info.column); EditorManager::openEditorAt(info->fileName(), info->line(), info->column());
} }
QWidget *SymbolsFindFilter::createConfigWidget() QWidget *SymbolsFindFilter::createConfigWidget()