From a38a7033688ff00f0fd7e4a3049fb0c854de043b Mon Sep 17 00:00:00 2001 From: David Schulz Date: Fri, 1 Oct 2021 10:40:53 +0200 Subject: [PATCH] LanguageClient: Fix current document filter The DocumentSymbol is an hierarchical symbol format so we also need to take childrens into account when using the current document locator filter. Change-Id: I57f11e8f1781893613719102f87e5a2b2d0af941 Reviewed-by: Christian Kandeler --- src/plugins/languageclient/locatorfilter.cpp | 29 ++++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/src/plugins/languageclient/locatorfilter.cpp b/src/plugins/languageclient/locatorfilter.cpp index 5d2a583a27f..d5cac61d669 100644 --- a/src/plugins/languageclient/locatorfilter.cpp +++ b/src/plugins/languageclient/locatorfilter.cpp @@ -111,6 +111,15 @@ Core::LocatorFilterEntry generateLocatorEntry(const SymbolInformation &info, return entry; } +QList generateLocatorEntries(const SymbolInformation &info, + Core::ILocatorFilter *filter, + const QRegularExpression ®exp) +{ + if (!regexp.match(info.name()).hasMatch()) + return { generateLocatorEntry(info, filter) }; + return {}; +} + Core::LocatorFilterEntry generateLocatorEntry(const DocumentSymbol &info, Core::ILocatorFilter *filter) { @@ -125,6 +134,19 @@ Core::LocatorFilterEntry generateLocatorEntry(const DocumentSymbol &info, return entry; } +QList generateLocatorEntries(const DocumentSymbol &info, + Core::ILocatorFilter *filter, + const QRegularExpression ®exp) +{ + QList entries; + if (regexp.match(info.name()).hasMatch()) + entries << generateLocatorEntry(info, filter); + const QList children = info.children().value_or(QList()); + for (const DocumentSymbol &child : children) + entries << generateLocatorEntries(child, filter, regexp); + return entries; +} + template QList DocumentLocatorFilter::generateEntries(const QList &list, const QString &filter) @@ -138,11 +160,8 @@ QList DocumentLocatorFilter::generateEntries(const QLi if (!regexp.isValid()) return entries; - for (const T &item : list) { - QRegularExpressionMatch match = regexp.match(item.name()); - if (match.hasMatch()) - entries << generateLocatorEntry(item, this); - } + for (const T &item : list) + entries << generateLocatorEntries(item, this, regexp); return entries; }