diff --git a/src/libs/utils/link.h b/src/libs/utils/link.h index 6f01b484348..655957e9acc 100644 --- a/src/libs/utils/link.h +++ b/src/libs/utils/link.h @@ -17,7 +17,8 @@ namespace Utils { class QTCREATOR_UTILS_EXPORT Link { public: - Link(const FilePath &filePath = FilePath(), int line = 0, int column = 0) + Link() = default; + Link(const FilePath &filePath, int line = 0, int column = 0) : targetFilePath(filePath) , targetLine(line) , targetColumn(column) @@ -48,8 +49,8 @@ public: int linkTextEnd = -1; FilePath targetFilePath; - int targetLine; - int targetColumn; + int targetLine = 0; + int targetColumn = 0; }; using LinkHandler = std::function; @@ -58,3 +59,12 @@ using Links = QList; } // namespace Utils Q_DECLARE_METATYPE(Utils::Link) + +namespace std { + +template<> struct hash +{ + size_t operator()(const Utils::Link &fn) const { return qHash(fn); } +}; + +} // std diff --git a/src/plugins/clangcodemodel/clangdlocatorfilters.cpp b/src/plugins/clangcodemodel/clangdlocatorfilters.cpp index e94e65f1af5..7f431a36bf7 100644 --- a/src/plugins/clangcodemodel/clangdlocatorfilters.cpp +++ b/src/plugins/clangcodemodel/clangdlocatorfilters.cpp @@ -6,25 +6,20 @@ #include "clangdclient.h" #include "clangmodelmanagersupport.h" +#include #include #include #include #include #include - #include #include - #include - #include #include #include -#include -#include - using namespace Core; using namespace LanguageClient; using namespace LanguageServerProtocol; @@ -159,33 +154,27 @@ QList ClangGlobalSymbolFilter::matchesFor( QList matches = m_cppFilter->matchesFor(future, entry); const QList lspMatches = m_lspFilter->matchesFor(future, entry); if (!lspMatches.isEmpty()) { - std::set> locations; + QSet locations; for (const auto &entry : std::as_const(matches)) { - const CppEditor::IndexItem::Ptr item - = qvariant_cast(entry.internalData); - locations.insert(std::make_tuple(item->filePath(), item->line(), item->column())); + QTC_ASSERT(entry.linkForEditor, continue); + locations.insert(*entry.linkForEditor); } for (const auto &entry : lspMatches) { - if (!entry.internalData.canConvert()) - continue; - const auto link = qvariant_cast(entry.internalData); - if (locations.find(std::make_tuple(link.targetFilePath, link.targetLine, - link.targetColumn)) == locations.cend()) { + QTC_ASSERT(entry.linkForEditor, continue); + if (!locations.contains(*entry.linkForEditor)) matches << entry; // TODO: Insert sorted? - } } } - return matches; } void ClangGlobalSymbolFilter::accept(const LocatorFilterEntry &selection, QString *newText, int *selectionStart, int *selectionLength) const { - if (qvariant_cast(selection.internalData)) - m_cppFilter->accept(selection, newText, selectionStart, selectionLength); - else - m_lspFilter->accept(selection, newText, selectionStart, selectionLength); + Q_UNUSED(newText) + Q_UNUSED(selectionStart) + Q_UNUSED(selectionLength) + EditorManager::openEditor(selection); } @@ -236,6 +225,8 @@ private: static_cast(info.kind()), info.name(), info.detail().value_or(QString())); entry.internalData = QVariant::fromValue(info); + const Position pos = info.range().start(); + entry.linkForEditor = {m_currentFilePath, pos.line() + 1, pos.character()}; entry.extraInfo = parent.extraInfo; if (!entry.extraInfo.isEmpty()) entry.extraInfo.append("::"); @@ -289,19 +280,13 @@ private: } if (definitions.size() == 1 && declarations.size() + definitions.size() == duplicates.size()) { - for (const LocatorFilterEntry &decl : std::as_const(declarations)) + for (const LocatorFilterEntry &decl : std::as_const(declarations)) { Utils::erase(allMatches, [&decl](const LocatorFilterEntry &e) { return e.internalData == decl.internalData; }); + } } } - - // The base implementation expects the position in the internal data. - for (LocatorFilterEntry &e : allMatches) { - const Position pos = qvariant_cast(e.internalData).range().start(); - e.internalData = QVariant::fromValue(Utils::LineColumn(pos.line(), pos.character())); - } - return allMatches; } @@ -362,8 +347,10 @@ QList ClangdCurrentDocumentFilter::matchesFor( void ClangdCurrentDocumentFilter::accept(const LocatorFilterEntry &selection, QString *newText, int *selectionStart, int *selectionLength) const { - QTC_ASSERT(d->activeFilter, return); - d->activeFilter->accept(selection, newText, selectionStart, selectionLength); + Q_UNUSED(newText) + Q_UNUSED(selectionStart) + Q_UNUSED(selectionLength) + EditorManager::openEditor(selection); } } // namespace Internal diff --git a/src/plugins/cmakeprojectmanager/cmakelocatorfilter.cpp b/src/plugins/cmakeprojectmanager/cmakelocatorfilter.cpp index 65b179cdf00..e902230ae43 100644 --- a/src/plugins/cmakeprojectmanager/cmakelocatorfilter.cpp +++ b/src/plugins/cmakeprojectmanager/cmakelocatorfilter.cpp @@ -58,17 +58,13 @@ void CMakeTargetLocatorFilter::prepareSearch(const QString &entry) if (index >= 0) { const FilePath path = target.backtrace.isEmpty() ? cmakeProject->projectFilePath() : target.backtrace.last().path; - const int line = target.backtrace.isEmpty() ? -1 : target.backtrace.last().line; + const int line = target.backtrace.isEmpty() ? 0 : target.backtrace.last().line; - QVariantMap extraData; - extraData.insert("project", cmakeProject->projectFilePath().toString()); - extraData.insert("line", line); - extraData.insert("file", path.toString()); - - LocatorFilterEntry filterEntry(this, target.title, extraData); + LocatorFilterEntry filterEntry(this, target.title); + filterEntry.linkForEditor = {path, line}; filterEntry.extraInfo = path.shortNativePath(); filterEntry.highlightInfo = {index, int(entry.length())}; - filterEntry.filePath = path; + filterEntry.filePath = cmakeProject->projectFilePath(); m_result.append(filterEntry); } @@ -111,8 +107,7 @@ void BuildCMakeTargetLocatorFilter::accept(const LocatorFilterEntry &selection, Q_UNUSED(selectionStart) Q_UNUSED(selectionLength) - const QVariantMap extraData = selection.internalData.toMap(); - const FilePath projectPath = FilePath::fromString(extraData.value("project").toString()); + const FilePath projectPath = selection.filePath; // Get the project containing the target selected const auto cmakeProject = qobject_cast( @@ -160,15 +155,7 @@ void OpenCMakeTargetLocatorFilter::accept(const LocatorFilterEntry &selection, Q_UNUSED(newText) Q_UNUSED(selectionStart) Q_UNUSED(selectionLength) - - const QVariantMap extraData = selection.internalData.toMap(); - const int line = extraData.value("line").toInt(); - const auto file = FilePath::fromVariant(extraData.value("file")); - - if (line >= 0) - EditorManager::openEditorAt({file, line}, {}, EditorManager::AllowExternalEditor); - else - EditorManager::openEditor(file, {}, EditorManager::AllowExternalEditor); + EditorManager::openEditor(selection); } } // CMakeProjectManager::Internal diff --git a/src/plugins/coreplugin/locator/locatorsearchutils.cpp b/src/plugins/coreplugin/locator/locatorsearchutils.cpp index 77e460ad4f3..a6a90107fe3 100644 --- a/src/plugins/coreplugin/locator/locatorsearchutils.cpp +++ b/src/plugins/coreplugin/locator/locatorsearchutils.cpp @@ -10,7 +10,7 @@ void Core::Internal::runSearch(QFutureInterface &future, const QList &filters, const QString &searchText) { - std::unordered_set addedCache; + std::unordered_set addedCache; const bool checkDuplicates = (filters.size() > 1); const auto duplicatesRemoved = [&](const QList &entries) { if (!checkDuplicates) @@ -19,7 +19,7 @@ void Core::Internal::runSearch(QFutureInterface &futur results.reserve(entries.size()); for (const LocatorFilterEntry &entry : entries) { const auto &link = entry.linkForEditor; - if (!link || addedCache.emplace(link->targetFilePath).second) + if (!link || addedCache.emplace(*link).second) results.append(entry); } return results; diff --git a/src/plugins/cppeditor/cppcurrentdocumentfilter.cpp b/src/plugins/cppeditor/cppcurrentdocumentfilter.cpp index a52edbfce52..8b9386567d9 100644 --- a/src/plugins/cppeditor/cppcurrentdocumentfilter.cpp +++ b/src/plugins/cppeditor/cppcurrentdocumentfilter.cpp @@ -86,6 +86,7 @@ QList CppCurrentDocumentFilter::matchesFor( } LocatorFilterEntry filterEntry(this, name, id, info->icon()); + filterEntry.linkForEditor = {info->filePath(), info->line(), info->column()}; filterEntry.extraInfo = extraInfo; if (match.hasMatch()) { filterEntry.highlightInfo = highlightInfo(match); @@ -127,13 +128,13 @@ QList CppCurrentDocumentFilter::matchesFor( } if (definitions.size() == 1 && declarations.size() + definitions.size() == duplicates.size()) { - for (const LocatorFilterEntry &decl : std::as_const(declarations)) + for (const LocatorFilterEntry &decl : std::as_const(declarations)) { Utils::erase(betterEntries, [&decl](const LocatorFilterEntry &e) { return e.internalData == decl.internalData; }); + } } } - return betterEntries; } @@ -143,8 +144,7 @@ void CppCurrentDocumentFilter::accept(const LocatorFilterEntry &selection, QStri Q_UNUSED(newText) Q_UNUSED(selectionStart) Q_UNUSED(selectionLength) - IndexItem::Ptr info = qvariant_cast(selection.internalData); - EditorManager::openEditorAt({info->filePath(), info->line(), info->column()}); + EditorManager::openEditor(selection); } void CppCurrentDocumentFilter::onDocumentUpdated(Document::Ptr doc) diff --git a/src/plugins/cppeditor/cpplocatorfilter.cpp b/src/plugins/cppeditor/cpplocatorfilter.cpp index c6567165910..ddf185c2aed 100644 --- a/src/plugins/cppeditor/cpplocatorfilter.cpp +++ b/src/plugins/cppeditor/cpplocatorfilter.cpp @@ -33,6 +33,7 @@ LocatorFilterEntry CppLocatorFilter::filterEntryFromIndexItem(IndexItem::Ptr inf { const QVariant id = QVariant::fromValue(info); LocatorFilterEntry filterEntry(this, info->scopedSymbolName(), id, info->icon()); + filterEntry.linkForEditor = {info->filePath(), info->line(), info->column()}; if (info->type() == IndexItem::Class || info->type() == IndexItem::Enum) filterEntry.extraInfo = info->shortNativeFilePath(); else @@ -121,9 +122,7 @@ void CppLocatorFilter::accept(const LocatorFilterEntry &selection, Q_UNUSED(newText) Q_UNUSED(selectionStart) Q_UNUSED(selectionLength) - IndexItem::Ptr info = qvariant_cast(selection.internalData); - EditorManager::openEditorAt({info->filePath(), info->line(), info->column()}, {}, - EditorManager::AllowExternalEditor); + EditorManager::openEditor(selection); } CppClassesFilter::CppClassesFilter(CppLocatorData *locatorData) @@ -141,6 +140,7 @@ LocatorFilterEntry CppClassesFilter::filterEntryFromIndexItem(IndexItem::Ptr inf { const QVariant id = QVariant::fromValue(info); LocatorFilterEntry filterEntry(this, info->symbolName(), id, info->icon()); + filterEntry.linkForEditor = {info->filePath(), info->line(), info->column()}; filterEntry.extraInfo = info->symbolScope().isEmpty() ? info->shortNativeFilePath() : info->symbolScope(); @@ -173,6 +173,7 @@ LocatorFilterEntry CppFunctionsFilter::filterEntryFromIndexItem(IndexItem::Ptr i } LocatorFilterEntry filterEntry(this, name + info->symbolType(), id, info->icon()); + filterEntry.linkForEditor = {info->filePath(), info->line(), info->column()}; filterEntry.extraInfo = extraInfo; return filterEntry; diff --git a/src/plugins/cppeditor/cppmodelmanager.cpp b/src/plugins/cppeditor/cppmodelmanager.cpp index 36d70882920..27984cce88f 100644 --- a/src/plugins/cppeditor/cppmodelmanager.cpp +++ b/src/plugins/cppeditor/cppmodelmanager.cpp @@ -572,12 +572,9 @@ void CppModelManager::findUnusedFunctions(const FilePath &folder) return entry.displayName.startsWith(prefix); })) { continue; } - Link link; - if (entry.internalData.canConvert()) - link = qvariant_cast(entry.internalData); - else if (const auto item = qvariant_cast(entry.internalData)) - link = Link(item->filePath(), item->line(), item->column()); - + if (!entry.linkForEditor) + continue; + const Link link = *entry.linkForEditor; if (link.hasValidTarget() && link.targetFilePath.isReadableFile() && (folder.isEmpty() || link.targetFilePath.isChildOf(folder)) && ProjectManager::projectForFile(link.targetFilePath)) { diff --git a/src/plugins/languageclient/locatorfilter.cpp b/src/plugins/languageclient/locatorfilter.cpp index 03f3cf50bca..88dc4419972 100644 --- a/src/plugins/languageclient/locatorfilter.cpp +++ b/src/plugins/languageclient/locatorfilter.cpp @@ -96,7 +96,7 @@ static LocatorFilterEntry generateLocatorEntry(const SymbolInformation &info, if (std::optional container = info.containerName()) entry.extraInfo = container.value_or(QString()); entry.displayIcon = symbolIcon(info.kind()); - entry.internalData = QVariant::fromValue(info.location().toLink(pathMapper)); + entry.linkForEditor = info.location().toLink(pathMapper); return entry; } @@ -127,7 +127,7 @@ LocatorFilterEntry DocumentLocatorFilter::generateLocatorEntry(const DocumentSym entry.extraInfo = detail.value_or(QString()); entry.displayIcon = symbolIcon(info.kind()); const Position &pos = info.range().start(); - entry.internalData = QVariant::fromValue(Utils::LineColumn(pos.line(), pos.character())); + entry.linkForEditor = {m_currentFilePath, pos.line() + 1, pos.character()}; return entry; } @@ -150,7 +150,7 @@ QList DocumentLocatorFilter::generateLocatorEntries( template QList DocumentLocatorFilter::generateEntries(const QList &list, - const QString &filter) + const QString &filter) { QList entries; FuzzyMatcher::CaseSensitivity caseSensitivity @@ -169,6 +169,7 @@ QList DocumentLocatorFilter::generateEntries(const QList void DocumentLocatorFilter::prepareSearch(const QString &/*entry*/) { QMutexLocker locker(&m_mutex); + m_currentFilePath = m_pathMapper ? m_currentUri.toFilePath(m_pathMapper) : Utils::FilePath(); if (m_symbolCache && !m_currentSymbols.has_value()) { locker.unlock(); m_symbolCache->requestSymbols(m_currentUri, Schedule::Now); @@ -208,17 +209,8 @@ void DocumentLocatorFilter::accept(const LocatorFilterEntry &selection, int * /*selectionStart*/, int * /*selectionLength*/) const { - if (selection.internalData.canConvert()) { - QTC_ASSERT(m_pathMapper, return); - auto lineColumn = qvariant_cast(selection.internalData); - const Utils::Link link(m_currentUri.toFilePath(m_pathMapper), - lineColumn.line + 1, - lineColumn.column); - EditorManager::openEditorAt(link, {}, EditorManager::AllowExternalEditor); - } else if (selection.internalData.canConvert()) { - EditorManager::openEditorAt(qvariant_cast(selection.internalData), {}, - EditorManager::AllowExternalEditor); - } + if (selection.linkForEditor) + EditorManager::openEditor(selection); } WorkspaceLocatorFilter::WorkspaceLocatorFilter() @@ -299,7 +291,6 @@ QList WorkspaceLocatorFilter::matchesFor( locker.relock(); } - if (!m_filterKinds.isEmpty()) { m_results = Utils::filtered(m_results, [&](const SymbolInfoWithPathMapper &info) { return m_filterKinds.contains(SymbolKind(info.symbol.kind())); @@ -316,10 +307,7 @@ void WorkspaceLocatorFilter::accept(const LocatorFilterEntry &selection, int * /*selectionStart*/, int * /*selectionLength*/) const { - if (selection.internalData.canConvert()) { - EditorManager::openEditorAt(qvariant_cast(selection.internalData), {}, - EditorManager::AllowExternalEditor); - } + EditorManager::openEditor(selection); } void WorkspaceLocatorFilter::handleResponse(Client *client, diff --git a/src/plugins/languageclient/locatorfilter.h b/src/plugins/languageclient/locatorfilter.h index 3eebd907a26..0d762b669ae 100644 --- a/src/plugins/languageclient/locatorfilter.h +++ b/src/plugins/languageclient/locatorfilter.h @@ -42,6 +42,7 @@ protected: QPointer m_symbolCache; LanguageServerProtocol::DocumentUri m_currentUri; + Utils::FilePath m_currentFilePath; private: void updateSymbols(const LanguageServerProtocol::DocumentUri &uri, diff --git a/src/plugins/modeleditor/elementtasks.cpp b/src/plugins/modeleditor/elementtasks.cpp index 6702344db5c..74c3faa3f4f 100644 --- a/src/plugins/modeleditor/elementtasks.cpp +++ b/src/plugins/modeleditor/elementtasks.cpp @@ -136,10 +136,8 @@ void ElementTasks::openClassDefinition(const qmt::MElement *element) CppEditor::IndexItem::Ptr info = qvariant_cast(entry.internalData); if (info->scopedSymbolName() != qualifiedClassName) continue; - if (EditorManager::instance()->openEditorAt( - {info->filePath(), info->line(), info->column()})) { + if (EditorManager::openEditor(entry)) return; - } } } } diff --git a/src/plugins/qmljstools/qmljsfunctionfilter.cpp b/src/plugins/qmljstools/qmljsfunctionfilter.cpp index 7ce42af1149..7fcf045c7de 100644 --- a/src/plugins/qmljstools/qmljsfunctionfilter.cpp +++ b/src/plugins/qmljstools/qmljsfunctionfilter.cpp @@ -52,6 +52,7 @@ QList FunctionFilter::matchesFor(QFutureInterface(selection.internalData); - EditorManager::openEditorAt({entry.fileName, entry.line, entry.column}); + EditorManager::openEditor(selection); }