forked from qt-creator/qt-creator
CppCurrentDocumentFilter: Avoid using internalData
Change-Id: Ic4dc03101f319449ca9835a23c786fbb0528f1c3 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
This commit is contained in:
@@ -53,13 +53,17 @@ void CppCurrentDocumentFilter::makeAuxiliary()
|
|||||||
QList<LocatorFilterEntry> CppCurrentDocumentFilter::matchesFor(
|
QList<LocatorFilterEntry> CppCurrentDocumentFilter::matchesFor(
|
||||||
QFutureInterface<LocatorFilterEntry> &future, const QString & entry)
|
QFutureInterface<LocatorFilterEntry> &future, const QString & entry)
|
||||||
{
|
{
|
||||||
QList<LocatorFilterEntry> goodEntries;
|
|
||||||
QList<LocatorFilterEntry> betterEntries;
|
|
||||||
|
|
||||||
const QRegularExpression regexp = createRegExp(entry);
|
const QRegularExpression regexp = createRegExp(entry);
|
||||||
if (!regexp.isValid())
|
if (!regexp.isValid())
|
||||||
return goodEntries;
|
return {};
|
||||||
|
|
||||||
|
struct Entry
|
||||||
|
{
|
||||||
|
LocatorFilterEntry entry;
|
||||||
|
IndexItem::Ptr info;
|
||||||
|
};
|
||||||
|
QList<Entry> goodEntries;
|
||||||
|
QList<Entry> betterEntries;
|
||||||
const QList<IndexItem::Ptr> items = itemsOfCurrentDocument();
|
const QList<IndexItem::Ptr> items = itemsOfCurrentDocument();
|
||||||
for (const IndexItem::Ptr &info : items) {
|
for (const IndexItem::Ptr &info : items) {
|
||||||
if (future.isCanceled())
|
if (future.isCanceled())
|
||||||
@@ -74,7 +78,6 @@ QList<LocatorFilterEntry> CppCurrentDocumentFilter::matchesFor(
|
|||||||
QRegularExpressionMatch match = regexp.match(matchString);
|
QRegularExpressionMatch match = regexp.match(matchString);
|
||||||
if (match.hasMatch()) {
|
if (match.hasMatch()) {
|
||||||
const bool betterMatch = match.capturedStart() == 0;
|
const bool betterMatch = match.capturedStart() == 0;
|
||||||
QVariant id = QVariant::fromValue(info);
|
|
||||||
QString name = matchString;
|
QString name = matchString;
|
||||||
QString extraInfo = info->symbolScope();
|
QString extraInfo = info->symbolScope();
|
||||||
if (info->type() == IndexItem::Function) {
|
if (info->type() == IndexItem::Function) {
|
||||||
@@ -84,7 +87,7 @@ QList<LocatorFilterEntry> CppCurrentDocumentFilter::matchesFor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LocatorFilterEntry filterEntry(this, name, id, info->icon());
|
LocatorFilterEntry filterEntry(this, name, {}, info->icon());
|
||||||
filterEntry.linkForEditor = {info->filePath(), info->line(), info->column()};
|
filterEntry.linkForEditor = {info->filePath(), info->line(), info->column()};
|
||||||
filterEntry.extraInfo = extraInfo;
|
filterEntry.extraInfo = extraInfo;
|
||||||
if (match.hasMatch()) {
|
if (match.hasMatch()) {
|
||||||
@@ -96,28 +99,26 @@ QList<LocatorFilterEntry> CppCurrentDocumentFilter::matchesFor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (betterMatch)
|
if (betterMatch)
|
||||||
betterEntries.append(filterEntry);
|
betterEntries.append({filterEntry, info});
|
||||||
else
|
else
|
||||||
goodEntries.append(filterEntry);
|
goodEntries.append({filterEntry, info});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// entries are unsorted by design!
|
// entries are unsorted by design!
|
||||||
betterEntries += goodEntries;
|
betterEntries += goodEntries;
|
||||||
|
|
||||||
QHash<QString, QList<LocatorFilterEntry>> possibleDuplicates;
|
QHash<QString, QList<Entry>> possibleDuplicates;
|
||||||
for (const LocatorFilterEntry &e : std::as_const(betterEntries)) {
|
for (const Entry &e : std::as_const(betterEntries))
|
||||||
const IndexItem::Ptr info = qvariant_cast<IndexItem::Ptr>(e.internalData);
|
possibleDuplicates[e.info->scopedSymbolName() + e.info->symbolType()] << e;
|
||||||
possibleDuplicates[info->scopedSymbolName() + info->symbolType()] << e;
|
|
||||||
}
|
|
||||||
for (auto it = possibleDuplicates.cbegin(); it != possibleDuplicates.cend(); ++it) {
|
for (auto it = possibleDuplicates.cbegin(); it != possibleDuplicates.cend(); ++it) {
|
||||||
const QList<LocatorFilterEntry> &duplicates = it.value();
|
const QList<Entry> &duplicates = it.value();
|
||||||
if (duplicates.size() == 1)
|
if (duplicates.size() == 1)
|
||||||
continue;
|
continue;
|
||||||
QList<LocatorFilterEntry> declarations;
|
QList<Entry> declarations;
|
||||||
QList<LocatorFilterEntry> definitions;
|
QList<Entry> definitions;
|
||||||
for (const LocatorFilterEntry &candidate : duplicates) {
|
for (const Entry &candidate : duplicates) {
|
||||||
const IndexItem::Ptr info = qvariant_cast<IndexItem::Ptr>(candidate.internalData);
|
const IndexItem::Ptr info = candidate.info;
|
||||||
if (info->type() != IndexItem::Function)
|
if (info->type() != IndexItem::Function)
|
||||||
break;
|
break;
|
||||||
if (info->isFunctionDefinition())
|
if (info->isFunctionDefinition())
|
||||||
@@ -127,14 +128,14 @@ QList<LocatorFilterEntry> CppCurrentDocumentFilter::matchesFor(
|
|||||||
}
|
}
|
||||||
if (definitions.size() == 1
|
if (definitions.size() == 1
|
||||||
&& declarations.size() + definitions.size() == duplicates.size()) {
|
&& declarations.size() + definitions.size() == duplicates.size()) {
|
||||||
for (const LocatorFilterEntry &decl : std::as_const(declarations)) {
|
for (const Entry &decl : std::as_const(declarations)) {
|
||||||
Utils::erase(betterEntries, [&decl](const LocatorFilterEntry &e) {
|
Utils::erase(betterEntries, [&decl](const Entry &e) {
|
||||||
return e.internalData == decl.internalData;
|
return e.info == decl.info;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return betterEntries;
|
return Utils::transform(betterEntries, [](const Entry &entry) { return entry.entry; });
|
||||||
}
|
}
|
||||||
|
|
||||||
void CppCurrentDocumentFilter::onDocumentUpdated(Document::Ptr doc)
|
void CppCurrentDocumentFilter::onDocumentUpdated(Document::Ptr doc)
|
||||||
|
|||||||
Reference in New Issue
Block a user