From 21c71cded7be1f19aefa4b3932a7d695d4f3ecb4 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Mon, 17 Apr 2023 18:02:55 +0200 Subject: [PATCH] DocumentLocatorFilter: Make internals reusable in LocatorMatcher Prepare for LocatorMatcher implementation. Change-Id: I3d78045a06c8ebefacb033f0eabb5f7a2457ab06 Reviewed-by: Qt CI Bot Reviewed-by: Christian Kandeler --- .../clangcodemodel/clangdlocatorfilters.cpp | 12 ++-- src/plugins/languageclient/locatorfilter.cpp | 61 +++++++++---------- src/plugins/languageclient/locatorfilter.h | 17 ++---- 3 files changed, 38 insertions(+), 52 deletions(-) diff --git a/src/plugins/clangcodemodel/clangdlocatorfilters.cpp b/src/plugins/clangcodemodel/clangdlocatorfilters.cpp index 19fab25d0c7..973156c038a 100644 --- a/src/plugins/clangcodemodel/clangdlocatorfilters.cpp +++ b/src/plugins/clangcodemodel/clangdlocatorfilters.cpp @@ -218,25 +218,23 @@ private: }; QList docEntries; - const auto docSymbolGenerator = [&](const DocumentSymbol &info, - const LocatorFilterEntry &parent) { - LocatorFilterEntry entry; + const auto docSymbolModifier = [&docEntries](LocatorFilterEntry &entry, + const DocumentSymbol &info, + const LocatorFilterEntry &parent) { entry.displayName = ClangdClient::displayNameFromDocumentSymbol( static_cast(info.kind()), info.name(), info.detail().value_or(QString())); - entry.linkForEditor = linkForDocSymbol(info); entry.extraInfo = parent.extraInfo; if (!entry.extraInfo.isEmpty()) entry.extraInfo.append("::"); entry.extraInfo.append(parent.displayName); // TODO: Can we extend clangd to send visibility information? - entry.displayIcon = LanguageClient::symbolIcon(info.kind()); docEntries.append({entry, info}); - return entry; }; - QList allMatches = matchesForImpl(future, entry, docSymbolGenerator); + const QList allMatches = matchesForImpl(future, entry, + docSymbolModifier); if (docEntries.isEmpty()) return allMatches; // SymbolInformation case diff --git a/src/plugins/languageclient/locatorfilter.cpp b/src/plugins/languageclient/locatorfilter.cpp index 8de4c7fe4d8..324a1cec338 100644 --- a/src/plugins/languageclient/locatorfilter.cpp +++ b/src/plugins/languageclient/locatorfilter.cpp @@ -190,8 +190,8 @@ void DocumentLocatorFilter::resetSymbols() m_currentSymbols.reset(); } -static LocatorFilterEntry generateLocatorEntry(const SymbolInformation &info, - DocumentUri::PathMapper pathMapper) +static LocatorFilterEntry entryForSymbolInfo(const SymbolInformation &info, + DocumentUri::PathMapper pathMapper) { LocatorFilterEntry entry; entry.displayName = info.name(); @@ -202,30 +202,37 @@ static LocatorFilterEntry generateLocatorEntry(const SymbolInformation &info, return entry; } -QList DocumentLocatorFilter::entriesForSymbolsInfo( - const QList &infoList, const QRegularExpression ®exp) +LocatorFilterEntries entriesForSymbolsInfo(const QList &infoList, + const QRegularExpression ®exp, const DocumentUri::PathMapper &pathMapper) { - QTC_ASSERT(m_pathMapper, return {}); - QList entries; + QTC_ASSERT(pathMapper, return {}); + LocatorFilterEntries entries; for (const SymbolInformation &info : infoList) { if (regexp.match(info.name()).hasMatch()) - entries << LanguageClient::generateLocatorEntry(info, m_pathMapper); + entries << LanguageClient::entryForSymbolInfo(info, pathMapper); } return entries; } -QList DocumentLocatorFilter::entriesForDocSymbols( - const QList &infoList, const QRegularExpression ®exp, - const DocSymbolGenerator &docSymbolGenerator, const LocatorFilterEntry &parent) +LocatorFilterEntries entriesForDocSymbols(const QList &infoList, + const QRegularExpression ®exp, const FilePath &filePath, + const DocSymbolModifier &docSymbolModifier, const LocatorFilterEntry &parent = {}) { - QList entries; + LocatorFilterEntries entries; for (const DocumentSymbol &info : infoList) { const QList children = info.children().value_or(QList()); const bool hasMatch = regexp.match(info.name()).hasMatch(); - const LocatorFilterEntry entry = hasMatch ? docSymbolGenerator(info, parent) : parent; - if (hasMatch) + LocatorFilterEntry entry; + if (hasMatch) { + entry.displayIcon = LanguageClient::symbolIcon(info.kind()); + const Position &pos = info.range().start(); + entry.linkForEditor = {filePath, pos.line() + 1, pos.character()}; + docSymbolModifier(entry, info, parent); entries << entry; - entries << entriesForDocSymbols(children, regexp, docSymbolGenerator, entry); + } else { + entry = parent; + } + entries << entriesForDocSymbols(children, regexp, filePath, docSymbolModifier, entry); } return entries; } @@ -243,29 +250,19 @@ void DocumentLocatorFilter::prepareSearch(const QString &/*entry*/) QList DocumentLocatorFilter::matchesFor( QFutureInterface &future, const QString &entry) { - const auto docSymbolGenerator = [this](const DocumentSymbol &info, - const LocatorFilterEntry &parent) { + const auto docSymbolModifier = [](LocatorFilterEntry &entry, const DocumentSymbol &info, + const LocatorFilterEntry &parent) { Q_UNUSED(parent) - LocatorFilterEntry entry; entry.displayName = info.name(); if (std::optional detail = info.detail()) - entry.extraInfo = detail.value_or(QString()); - entry.displayIcon = symbolIcon(info.kind()); - entry.linkForEditor = linkForDocSymbol(info); - return entry; + entry.extraInfo = *detail; }; - return matchesForImpl(future, entry, docSymbolGenerator); -} - -Link DocumentLocatorFilter::linkForDocSymbol(const DocumentSymbol &info) const -{ - const Position &pos = info.range().start(); - return {m_currentFilePath, pos.line() + 1, pos.character()}; + return matchesForImpl(future, entry, docSymbolModifier); } QList DocumentLocatorFilter::matchesForImpl( QFutureInterface &future, const QString &entry, - const DocSymbolGenerator &docSymbolGenerator) + const DocSymbolModifier &docSymbolModifier) { const FuzzyMatcher::CaseSensitivity caseSensitivity = ILocatorFilter::caseSensitivity(entry) == Qt::CaseSensitive @@ -293,9 +290,9 @@ QList DocumentLocatorFilter::matchesForImpl( QTC_ASSERT(m_currentSymbols.has_value(), return {}); if (auto list = std::get_if>(&*m_currentSymbols)) - return entriesForDocSymbols(*list, regExp, docSymbolGenerator); + return entriesForDocSymbols(*list, regExp, m_currentFilePath, docSymbolModifier); else if (auto list = std::get_if>(&*m_currentSymbols)) - return entriesForSymbolsInfo(*list, regExp); + return entriesForSymbolsInfo(*list, regExp, m_pathMapper); return {}; } @@ -381,7 +378,7 @@ QList WorkspaceLocatorFilter::matchesFor( }); } auto generateEntry = [](const SymbolInfoWithPathMapper &info) { - return generateLocatorEntry(info.symbol, info.mapper); + return entryForSymbolInfo(info.symbol, info.mapper); }; return Utils::transform(m_results, generateEntry).toList(); } diff --git a/src/plugins/languageclient/locatorfilter.h b/src/plugins/languageclient/locatorfilter.h index fa59b7931cb..52445e19c38 100644 --- a/src/plugins/languageclient/locatorfilter.h +++ b/src/plugins/languageclient/locatorfilter.h @@ -19,6 +19,9 @@ namespace Core { class IEditor; } namespace LanguageClient { +using DocSymbolModifier = std::function; + Core::LocatorMatcherTasks LANGUAGECLIENT_EXPORT workspaceMatchers(const QList &clients, Core::MatcherType type, int maxResultCount = 0); @@ -42,13 +45,9 @@ protected: Utils::FilePath m_currentFilePath; - using DocSymbolGenerator = std::function; - - Utils::Link linkForDocSymbol(const LanguageServerProtocol::DocumentSymbol &info) const; QList matchesForImpl( QFutureInterface &future, const QString &entry, - const DocSymbolGenerator &docSymbolGenerator); + const DocSymbolModifier &docSymbolModifier); private: void updateCurrentClient(); @@ -56,14 +55,6 @@ private: const LanguageServerProtocol::DocumentSymbolsResult &symbols); void resetSymbols(); - QList entriesForSymbolsInfo( - const QList &infoList, - const QRegularExpression ®exp); - QList entriesForDocSymbols( - const QList &infoList, - const QRegularExpression ®exp, const DocSymbolGenerator &docSymbolGenerator, - const Core::LocatorFilterEntry &parent = {}); - QMutex m_mutex; QMetaObject::Connection m_updateSymbolsConnection; QMetaObject::Connection m_resetSymbolsConnection;