forked from qt-creator/qt-creator
LocatorFilter classes: Use more linkForEditor
Limit the usage of ambiguous internalData. Change-Id: Ice67884b9fb2ff303939cd5998c6e80453e82530 Reviewed-by: <github-actions-qt-creator@cristianadam.eu> Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
@@ -17,7 +17,8 @@ namespace Utils {
|
|||||||
class QTCREATOR_UTILS_EXPORT Link
|
class QTCREATOR_UTILS_EXPORT Link
|
||||||
{
|
{
|
||||||
public:
|
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)
|
: targetFilePath(filePath)
|
||||||
, targetLine(line)
|
, targetLine(line)
|
||||||
, targetColumn(column)
|
, targetColumn(column)
|
||||||
@@ -48,8 +49,8 @@ public:
|
|||||||
int linkTextEnd = -1;
|
int linkTextEnd = -1;
|
||||||
|
|
||||||
FilePath targetFilePath;
|
FilePath targetFilePath;
|
||||||
int targetLine;
|
int targetLine = 0;
|
||||||
int targetColumn;
|
int targetColumn = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
using LinkHandler = std::function<void(const Link &)>;
|
using LinkHandler = std::function<void(const Link &)>;
|
||||||
@@ -58,3 +59,12 @@ using Links = QList<Link>;
|
|||||||
} // namespace Utils
|
} // namespace Utils
|
||||||
|
|
||||||
Q_DECLARE_METATYPE(Utils::Link)
|
Q_DECLARE_METATYPE(Utils::Link)
|
||||||
|
|
||||||
|
namespace std {
|
||||||
|
|
||||||
|
template<> struct hash<Utils::Link>
|
||||||
|
{
|
||||||
|
size_t operator()(const Utils::Link &fn) const { return qHash(fn); }
|
||||||
|
};
|
||||||
|
|
||||||
|
} // std
|
||||||
|
@@ -6,25 +6,20 @@
|
|||||||
#include "clangdclient.h"
|
#include "clangdclient.h"
|
||||||
#include "clangmodelmanagersupport.h"
|
#include "clangmodelmanagersupport.h"
|
||||||
|
|
||||||
|
#include <coreplugin/editormanager/editormanager.h>
|
||||||
#include <cppeditor/cppeditorconstants.h>
|
#include <cppeditor/cppeditorconstants.h>
|
||||||
#include <cppeditor/cppeditortr.h>
|
#include <cppeditor/cppeditortr.h>
|
||||||
#include <cppeditor/cpplocatorfilter.h>
|
#include <cppeditor/cpplocatorfilter.h>
|
||||||
#include <cppeditor/cppmodelmanager.h>
|
#include <cppeditor/cppmodelmanager.h>
|
||||||
#include <cppeditor/indexitem.h>
|
#include <cppeditor/indexitem.h>
|
||||||
|
|
||||||
#include <languageclient/languageclientutils.h>
|
#include <languageclient/languageclientutils.h>
|
||||||
#include <languageclient/locatorfilter.h>
|
#include <languageclient/locatorfilter.h>
|
||||||
|
|
||||||
#include <projectexplorer/projectmanager.h>
|
#include <projectexplorer/projectmanager.h>
|
||||||
|
|
||||||
#include <utils/link.h>
|
#include <utils/link.h>
|
||||||
#include <utils/algorithm.h>
|
#include <utils/algorithm.h>
|
||||||
|
|
||||||
#include <QHash>
|
#include <QHash>
|
||||||
|
|
||||||
#include <set>
|
|
||||||
#include <tuple>
|
|
||||||
|
|
||||||
using namespace Core;
|
using namespace Core;
|
||||||
using namespace LanguageClient;
|
using namespace LanguageClient;
|
||||||
using namespace LanguageServerProtocol;
|
using namespace LanguageServerProtocol;
|
||||||
@@ -159,33 +154,27 @@ QList<LocatorFilterEntry> ClangGlobalSymbolFilter::matchesFor(
|
|||||||
QList<LocatorFilterEntry> matches = m_cppFilter->matchesFor(future, entry);
|
QList<LocatorFilterEntry> matches = m_cppFilter->matchesFor(future, entry);
|
||||||
const QList<LocatorFilterEntry> lspMatches = m_lspFilter->matchesFor(future, entry);
|
const QList<LocatorFilterEntry> lspMatches = m_lspFilter->matchesFor(future, entry);
|
||||||
if (!lspMatches.isEmpty()) {
|
if (!lspMatches.isEmpty()) {
|
||||||
std::set<std::tuple<FilePath, int, int>> locations;
|
QSet<Link> locations;
|
||||||
for (const auto &entry : std::as_const(matches)) {
|
for (const auto &entry : std::as_const(matches)) {
|
||||||
const CppEditor::IndexItem::Ptr item
|
QTC_ASSERT(entry.linkForEditor, continue);
|
||||||
= qvariant_cast<CppEditor::IndexItem::Ptr>(entry.internalData);
|
locations.insert(*entry.linkForEditor);
|
||||||
locations.insert(std::make_tuple(item->filePath(), item->line(), item->column()));
|
|
||||||
}
|
}
|
||||||
for (const auto &entry : lspMatches) {
|
for (const auto &entry : lspMatches) {
|
||||||
if (!entry.internalData.canConvert<Link>())
|
QTC_ASSERT(entry.linkForEditor, continue);
|
||||||
continue;
|
if (!locations.contains(*entry.linkForEditor))
|
||||||
const auto link = qvariant_cast<Link>(entry.internalData);
|
|
||||||
if (locations.find(std::make_tuple(link.targetFilePath, link.targetLine,
|
|
||||||
link.targetColumn)) == locations.cend()) {
|
|
||||||
matches << entry; // TODO: Insert sorted?
|
matches << entry; // TODO: Insert sorted?
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return matches;
|
return matches;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClangGlobalSymbolFilter::accept(const LocatorFilterEntry &selection, QString *newText,
|
void ClangGlobalSymbolFilter::accept(const LocatorFilterEntry &selection, QString *newText,
|
||||||
int *selectionStart, int *selectionLength) const
|
int *selectionStart, int *selectionLength) const
|
||||||
{
|
{
|
||||||
if (qvariant_cast<CppEditor::IndexItem::Ptr>(selection.internalData))
|
Q_UNUSED(newText)
|
||||||
m_cppFilter->accept(selection, newText, selectionStart, selectionLength);
|
Q_UNUSED(selectionStart)
|
||||||
else
|
Q_UNUSED(selectionLength)
|
||||||
m_lspFilter->accept(selection, newText, selectionStart, selectionLength);
|
EditorManager::openEditor(selection);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -236,6 +225,8 @@ private:
|
|||||||
static_cast<SymbolKind>(info.kind()), info.name(),
|
static_cast<SymbolKind>(info.kind()), info.name(),
|
||||||
info.detail().value_or(QString()));
|
info.detail().value_or(QString()));
|
||||||
entry.internalData = QVariant::fromValue(info);
|
entry.internalData = QVariant::fromValue(info);
|
||||||
|
const Position pos = info.range().start();
|
||||||
|
entry.linkForEditor = {m_currentFilePath, pos.line() + 1, pos.character()};
|
||||||
entry.extraInfo = parent.extraInfo;
|
entry.extraInfo = parent.extraInfo;
|
||||||
if (!entry.extraInfo.isEmpty())
|
if (!entry.extraInfo.isEmpty())
|
||||||
entry.extraInfo.append("::");
|
entry.extraInfo.append("::");
|
||||||
@@ -289,19 +280,13 @@ private:
|
|||||||
}
|
}
|
||||||
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 LocatorFilterEntry &decl : std::as_const(declarations)) {
|
||||||
Utils::erase(allMatches, [&decl](const LocatorFilterEntry &e) {
|
Utils::erase(allMatches, [&decl](const LocatorFilterEntry &e) {
|
||||||
return e.internalData == decl.internalData;
|
return e.internalData == decl.internalData;
|
||||||
});
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// The base implementation expects the position in the internal data.
|
|
||||||
for (LocatorFilterEntry &e : allMatches) {
|
|
||||||
const Position pos = qvariant_cast<DocumentSymbol>(e.internalData).range().start();
|
|
||||||
e.internalData = QVariant::fromValue(Utils::LineColumn(pos.line(), pos.character()));
|
|
||||||
}
|
|
||||||
|
|
||||||
return allMatches;
|
return allMatches;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -362,8 +347,10 @@ QList<LocatorFilterEntry> ClangdCurrentDocumentFilter::matchesFor(
|
|||||||
void ClangdCurrentDocumentFilter::accept(const LocatorFilterEntry &selection, QString *newText,
|
void ClangdCurrentDocumentFilter::accept(const LocatorFilterEntry &selection, QString *newText,
|
||||||
int *selectionStart, int *selectionLength) const
|
int *selectionStart, int *selectionLength) const
|
||||||
{
|
{
|
||||||
QTC_ASSERT(d->activeFilter, return);
|
Q_UNUSED(newText)
|
||||||
d->activeFilter->accept(selection, newText, selectionStart, selectionLength);
|
Q_UNUSED(selectionStart)
|
||||||
|
Q_UNUSED(selectionLength)
|
||||||
|
EditorManager::openEditor(selection);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
|
@@ -58,17 +58,13 @@ void CMakeTargetLocatorFilter::prepareSearch(const QString &entry)
|
|||||||
if (index >= 0) {
|
if (index >= 0) {
|
||||||
const FilePath path = target.backtrace.isEmpty() ? cmakeProject->projectFilePath()
|
const FilePath path = target.backtrace.isEmpty() ? cmakeProject->projectFilePath()
|
||||||
: target.backtrace.last().path;
|
: 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;
|
LocatorFilterEntry filterEntry(this, target.title);
|
||||||
extraData.insert("project", cmakeProject->projectFilePath().toString());
|
filterEntry.linkForEditor = {path, line};
|
||||||
extraData.insert("line", line);
|
|
||||||
extraData.insert("file", path.toString());
|
|
||||||
|
|
||||||
LocatorFilterEntry filterEntry(this, target.title, extraData);
|
|
||||||
filterEntry.extraInfo = path.shortNativePath();
|
filterEntry.extraInfo = path.shortNativePath();
|
||||||
filterEntry.highlightInfo = {index, int(entry.length())};
|
filterEntry.highlightInfo = {index, int(entry.length())};
|
||||||
filterEntry.filePath = path;
|
filterEntry.filePath = cmakeProject->projectFilePath();
|
||||||
|
|
||||||
m_result.append(filterEntry);
|
m_result.append(filterEntry);
|
||||||
}
|
}
|
||||||
@@ -111,8 +107,7 @@ void BuildCMakeTargetLocatorFilter::accept(const LocatorFilterEntry &selection,
|
|||||||
Q_UNUSED(selectionStart)
|
Q_UNUSED(selectionStart)
|
||||||
Q_UNUSED(selectionLength)
|
Q_UNUSED(selectionLength)
|
||||||
|
|
||||||
const QVariantMap extraData = selection.internalData.toMap();
|
const FilePath projectPath = selection.filePath;
|
||||||
const FilePath projectPath = FilePath::fromString(extraData.value("project").toString());
|
|
||||||
|
|
||||||
// Get the project containing the target selected
|
// Get the project containing the target selected
|
||||||
const auto cmakeProject = qobject_cast<CMakeProject *>(
|
const auto cmakeProject = qobject_cast<CMakeProject *>(
|
||||||
@@ -160,15 +155,7 @@ void OpenCMakeTargetLocatorFilter::accept(const LocatorFilterEntry &selection,
|
|||||||
Q_UNUSED(newText)
|
Q_UNUSED(newText)
|
||||||
Q_UNUSED(selectionStart)
|
Q_UNUSED(selectionStart)
|
||||||
Q_UNUSED(selectionLength)
|
Q_UNUSED(selectionLength)
|
||||||
|
EditorManager::openEditor(selection);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // CMakeProjectManager::Internal
|
} // CMakeProjectManager::Internal
|
||||||
|
@@ -10,7 +10,7 @@
|
|||||||
void Core::Internal::runSearch(QFutureInterface<Core::LocatorFilterEntry> &future,
|
void Core::Internal::runSearch(QFutureInterface<Core::LocatorFilterEntry> &future,
|
||||||
const QList<ILocatorFilter *> &filters, const QString &searchText)
|
const QList<ILocatorFilter *> &filters, const QString &searchText)
|
||||||
{
|
{
|
||||||
std::unordered_set<Utils::FilePath> addedCache;
|
std::unordered_set<Utils::Link> addedCache;
|
||||||
const bool checkDuplicates = (filters.size() > 1);
|
const bool checkDuplicates = (filters.size() > 1);
|
||||||
const auto duplicatesRemoved = [&](const QList<LocatorFilterEntry> &entries) {
|
const auto duplicatesRemoved = [&](const QList<LocatorFilterEntry> &entries) {
|
||||||
if (!checkDuplicates)
|
if (!checkDuplicates)
|
||||||
@@ -19,7 +19,7 @@ void Core::Internal::runSearch(QFutureInterface<Core::LocatorFilterEntry> &futur
|
|||||||
results.reserve(entries.size());
|
results.reserve(entries.size());
|
||||||
for (const LocatorFilterEntry &entry : entries) {
|
for (const LocatorFilterEntry &entry : entries) {
|
||||||
const auto &link = entry.linkForEditor;
|
const auto &link = entry.linkForEditor;
|
||||||
if (!link || addedCache.emplace(link->targetFilePath).second)
|
if (!link || addedCache.emplace(*link).second)
|
||||||
results.append(entry);
|
results.append(entry);
|
||||||
}
|
}
|
||||||
return results;
|
return results;
|
||||||
|
@@ -86,6 +86,7 @@ QList<LocatorFilterEntry> CppCurrentDocumentFilter::matchesFor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
LocatorFilterEntry filterEntry(this, name, id, info->icon());
|
LocatorFilterEntry filterEntry(this, name, id, info->icon());
|
||||||
|
filterEntry.linkForEditor = {info->filePath(), info->line(), info->column()};
|
||||||
filterEntry.extraInfo = extraInfo;
|
filterEntry.extraInfo = extraInfo;
|
||||||
if (match.hasMatch()) {
|
if (match.hasMatch()) {
|
||||||
filterEntry.highlightInfo = highlightInfo(match);
|
filterEntry.highlightInfo = highlightInfo(match);
|
||||||
@@ -127,13 +128,13 @@ 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 LocatorFilterEntry &decl : std::as_const(declarations)) {
|
||||||
Utils::erase(betterEntries, [&decl](const LocatorFilterEntry &e) {
|
Utils::erase(betterEntries, [&decl](const LocatorFilterEntry &e) {
|
||||||
return e.internalData == decl.internalData;
|
return e.internalData == decl.internalData;
|
||||||
});
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return betterEntries;
|
return betterEntries;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -143,8 +144,7 @@ void CppCurrentDocumentFilter::accept(const LocatorFilterEntry &selection, QStri
|
|||||||
Q_UNUSED(newText)
|
Q_UNUSED(newText)
|
||||||
Q_UNUSED(selectionStart)
|
Q_UNUSED(selectionStart)
|
||||||
Q_UNUSED(selectionLength)
|
Q_UNUSED(selectionLength)
|
||||||
IndexItem::Ptr info = qvariant_cast<IndexItem::Ptr>(selection.internalData);
|
EditorManager::openEditor(selection);
|
||||||
EditorManager::openEditorAt({info->filePath(), info->line(), info->column()});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CppCurrentDocumentFilter::onDocumentUpdated(Document::Ptr doc)
|
void CppCurrentDocumentFilter::onDocumentUpdated(Document::Ptr doc)
|
||||||
|
@@ -33,6 +33,7 @@ LocatorFilterEntry CppLocatorFilter::filterEntryFromIndexItem(IndexItem::Ptr inf
|
|||||||
{
|
{
|
||||||
const QVariant id = QVariant::fromValue(info);
|
const QVariant id = QVariant::fromValue(info);
|
||||||
LocatorFilterEntry filterEntry(this, info->scopedSymbolName(), id, info->icon());
|
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)
|
if (info->type() == IndexItem::Class || info->type() == IndexItem::Enum)
|
||||||
filterEntry.extraInfo = info->shortNativeFilePath();
|
filterEntry.extraInfo = info->shortNativeFilePath();
|
||||||
else
|
else
|
||||||
@@ -121,9 +122,7 @@ void CppLocatorFilter::accept(const LocatorFilterEntry &selection,
|
|||||||
Q_UNUSED(newText)
|
Q_UNUSED(newText)
|
||||||
Q_UNUSED(selectionStart)
|
Q_UNUSED(selectionStart)
|
||||||
Q_UNUSED(selectionLength)
|
Q_UNUSED(selectionLength)
|
||||||
IndexItem::Ptr info = qvariant_cast<IndexItem::Ptr>(selection.internalData);
|
EditorManager::openEditor(selection);
|
||||||
EditorManager::openEditorAt({info->filePath(), info->line(), info->column()}, {},
|
|
||||||
EditorManager::AllowExternalEditor);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CppClassesFilter::CppClassesFilter(CppLocatorData *locatorData)
|
CppClassesFilter::CppClassesFilter(CppLocatorData *locatorData)
|
||||||
@@ -141,6 +140,7 @@ LocatorFilterEntry CppClassesFilter::filterEntryFromIndexItem(IndexItem::Ptr inf
|
|||||||
{
|
{
|
||||||
const QVariant id = QVariant::fromValue(info);
|
const QVariant id = QVariant::fromValue(info);
|
||||||
LocatorFilterEntry filterEntry(this, info->symbolName(), id, info->icon());
|
LocatorFilterEntry filterEntry(this, info->symbolName(), id, info->icon());
|
||||||
|
filterEntry.linkForEditor = {info->filePath(), info->line(), info->column()};
|
||||||
filterEntry.extraInfo = info->symbolScope().isEmpty()
|
filterEntry.extraInfo = info->symbolScope().isEmpty()
|
||||||
? info->shortNativeFilePath()
|
? info->shortNativeFilePath()
|
||||||
: info->symbolScope();
|
: info->symbolScope();
|
||||||
@@ -173,6 +173,7 @@ LocatorFilterEntry CppFunctionsFilter::filterEntryFromIndexItem(IndexItem::Ptr i
|
|||||||
}
|
}
|
||||||
|
|
||||||
LocatorFilterEntry filterEntry(this, name + info->symbolType(), id, info->icon());
|
LocatorFilterEntry filterEntry(this, name + info->symbolType(), id, info->icon());
|
||||||
|
filterEntry.linkForEditor = {info->filePath(), info->line(), info->column()};
|
||||||
filterEntry.extraInfo = extraInfo;
|
filterEntry.extraInfo = extraInfo;
|
||||||
|
|
||||||
return filterEntry;
|
return filterEntry;
|
||||||
|
@@ -572,12 +572,9 @@ void CppModelManager::findUnusedFunctions(const FilePath &folder)
|
|||||||
return entry.displayName.startsWith(prefix); })) {
|
return entry.displayName.startsWith(prefix); })) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
Link link;
|
if (!entry.linkForEditor)
|
||||||
if (entry.internalData.canConvert<Link>())
|
continue;
|
||||||
link = qvariant_cast<Link>(entry.internalData);
|
const Link link = *entry.linkForEditor;
|
||||||
else if (const auto item = qvariant_cast<IndexItem::Ptr>(entry.internalData))
|
|
||||||
link = Link(item->filePath(), item->line(), item->column());
|
|
||||||
|
|
||||||
if (link.hasValidTarget() && link.targetFilePath.isReadableFile()
|
if (link.hasValidTarget() && link.targetFilePath.isReadableFile()
|
||||||
&& (folder.isEmpty() || link.targetFilePath.isChildOf(folder))
|
&& (folder.isEmpty() || link.targetFilePath.isChildOf(folder))
|
||||||
&& ProjectManager::projectForFile(link.targetFilePath)) {
|
&& ProjectManager::projectForFile(link.targetFilePath)) {
|
||||||
|
@@ -96,7 +96,7 @@ static LocatorFilterEntry generateLocatorEntry(const SymbolInformation &info,
|
|||||||
if (std::optional<QString> container = info.containerName())
|
if (std::optional<QString> container = info.containerName())
|
||||||
entry.extraInfo = container.value_or(QString());
|
entry.extraInfo = container.value_or(QString());
|
||||||
entry.displayIcon = symbolIcon(info.kind());
|
entry.displayIcon = symbolIcon(info.kind());
|
||||||
entry.internalData = QVariant::fromValue(info.location().toLink(pathMapper));
|
entry.linkForEditor = info.location().toLink(pathMapper);
|
||||||
return entry;
|
return entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -127,7 +127,7 @@ LocatorFilterEntry DocumentLocatorFilter::generateLocatorEntry(const DocumentSym
|
|||||||
entry.extraInfo = detail.value_or(QString());
|
entry.extraInfo = detail.value_or(QString());
|
||||||
entry.displayIcon = symbolIcon(info.kind());
|
entry.displayIcon = symbolIcon(info.kind());
|
||||||
const Position &pos = info.range().start();
|
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;
|
return entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -150,7 +150,7 @@ QList<LocatorFilterEntry> DocumentLocatorFilter::generateLocatorEntries(
|
|||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
QList<LocatorFilterEntry> DocumentLocatorFilter::generateEntries(const QList<T> &list,
|
QList<LocatorFilterEntry> DocumentLocatorFilter::generateEntries(const QList<T> &list,
|
||||||
const QString &filter)
|
const QString &filter)
|
||||||
{
|
{
|
||||||
QList<LocatorFilterEntry> entries;
|
QList<LocatorFilterEntry> entries;
|
||||||
FuzzyMatcher::CaseSensitivity caseSensitivity
|
FuzzyMatcher::CaseSensitivity caseSensitivity
|
||||||
@@ -169,6 +169,7 @@ QList<LocatorFilterEntry> DocumentLocatorFilter::generateEntries(const QList<T>
|
|||||||
void DocumentLocatorFilter::prepareSearch(const QString &/*entry*/)
|
void DocumentLocatorFilter::prepareSearch(const QString &/*entry*/)
|
||||||
{
|
{
|
||||||
QMutexLocker locker(&m_mutex);
|
QMutexLocker locker(&m_mutex);
|
||||||
|
m_currentFilePath = m_pathMapper ? m_currentUri.toFilePath(m_pathMapper) : Utils::FilePath();
|
||||||
if (m_symbolCache && !m_currentSymbols.has_value()) {
|
if (m_symbolCache && !m_currentSymbols.has_value()) {
|
||||||
locker.unlock();
|
locker.unlock();
|
||||||
m_symbolCache->requestSymbols(m_currentUri, Schedule::Now);
|
m_symbolCache->requestSymbols(m_currentUri, Schedule::Now);
|
||||||
@@ -208,17 +209,8 @@ void DocumentLocatorFilter::accept(const LocatorFilterEntry &selection,
|
|||||||
int * /*selectionStart*/,
|
int * /*selectionStart*/,
|
||||||
int * /*selectionLength*/) const
|
int * /*selectionLength*/) const
|
||||||
{
|
{
|
||||||
if (selection.internalData.canConvert<Utils::LineColumn>()) {
|
if (selection.linkForEditor)
|
||||||
QTC_ASSERT(m_pathMapper, return);
|
EditorManager::openEditor(selection);
|
||||||
auto lineColumn = qvariant_cast<Utils::LineColumn>(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<Utils::Link>()) {
|
|
||||||
EditorManager::openEditorAt(qvariant_cast<Utils::Link>(selection.internalData), {},
|
|
||||||
EditorManager::AllowExternalEditor);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
WorkspaceLocatorFilter::WorkspaceLocatorFilter()
|
WorkspaceLocatorFilter::WorkspaceLocatorFilter()
|
||||||
@@ -299,7 +291,6 @@ QList<LocatorFilterEntry> WorkspaceLocatorFilter::matchesFor(
|
|||||||
locker.relock();
|
locker.relock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (!m_filterKinds.isEmpty()) {
|
if (!m_filterKinds.isEmpty()) {
|
||||||
m_results = Utils::filtered(m_results, [&](const SymbolInfoWithPathMapper &info) {
|
m_results = Utils::filtered(m_results, [&](const SymbolInfoWithPathMapper &info) {
|
||||||
return m_filterKinds.contains(SymbolKind(info.symbol.kind()));
|
return m_filterKinds.contains(SymbolKind(info.symbol.kind()));
|
||||||
@@ -316,10 +307,7 @@ void WorkspaceLocatorFilter::accept(const LocatorFilterEntry &selection,
|
|||||||
int * /*selectionStart*/,
|
int * /*selectionStart*/,
|
||||||
int * /*selectionLength*/) const
|
int * /*selectionLength*/) const
|
||||||
{
|
{
|
||||||
if (selection.internalData.canConvert<Utils::Link>()) {
|
EditorManager::openEditor(selection);
|
||||||
EditorManager::openEditorAt(qvariant_cast<Utils::Link>(selection.internalData), {},
|
|
||||||
EditorManager::AllowExternalEditor);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void WorkspaceLocatorFilter::handleResponse(Client *client,
|
void WorkspaceLocatorFilter::handleResponse(Client *client,
|
||||||
|
@@ -42,6 +42,7 @@ protected:
|
|||||||
|
|
||||||
QPointer<DocumentSymbolCache> m_symbolCache;
|
QPointer<DocumentSymbolCache> m_symbolCache;
|
||||||
LanguageServerProtocol::DocumentUri m_currentUri;
|
LanguageServerProtocol::DocumentUri m_currentUri;
|
||||||
|
Utils::FilePath m_currentFilePath;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void updateSymbols(const LanguageServerProtocol::DocumentUri &uri,
|
void updateSymbols(const LanguageServerProtocol::DocumentUri &uri,
|
||||||
|
@@ -136,10 +136,8 @@ void ElementTasks::openClassDefinition(const qmt::MElement *element)
|
|||||||
CppEditor::IndexItem::Ptr info = qvariant_cast<CppEditor::IndexItem::Ptr>(entry.internalData);
|
CppEditor::IndexItem::Ptr info = qvariant_cast<CppEditor::IndexItem::Ptr>(entry.internalData);
|
||||||
if (info->scopedSymbolName() != qualifiedClassName)
|
if (info->scopedSymbolName() != qualifiedClassName)
|
||||||
continue;
|
continue;
|
||||||
if (EditorManager::instance()->openEditorAt(
|
if (EditorManager::openEditor(entry))
|
||||||
{info->filePath(), info->line(), info->column()})) {
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -52,6 +52,7 @@ QList<LocatorFilterEntry> FunctionFilter::matchesFor(QFutureInterface<LocatorFil
|
|||||||
if (match.hasMatch()) {
|
if (match.hasMatch()) {
|
||||||
QVariant id = QVariant::fromValue(info);
|
QVariant id = QVariant::fromValue(info);
|
||||||
LocatorFilterEntry filterEntry(this, info.displayName, id/*, info.icon*/);
|
LocatorFilterEntry filterEntry(this, info.displayName, id/*, info.icon*/);
|
||||||
|
filterEntry.linkForEditor = {info.fileName, info.line, info.column};
|
||||||
filterEntry.extraInfo = info.extraInfo;
|
filterEntry.extraInfo = info.extraInfo;
|
||||||
filterEntry.highlightInfo = highlightInfo(match);
|
filterEntry.highlightInfo = highlightInfo(match);
|
||||||
|
|
||||||
@@ -78,6 +79,5 @@ void FunctionFilter::accept(const LocatorFilterEntry &selection,
|
|||||||
Q_UNUSED(newText)
|
Q_UNUSED(newText)
|
||||||
Q_UNUSED(selectionStart)
|
Q_UNUSED(selectionStart)
|
||||||
Q_UNUSED(selectionLength)
|
Q_UNUSED(selectionLength)
|
||||||
const LocatorData::Entry entry = qvariant_cast<LocatorData::Entry>(selection.internalData);
|
EditorManager::openEditor(selection);
|
||||||
EditorManager::openEditorAt({entry.fileName, entry.line, entry.column});
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user