From b72c3bc8a21684b977d3919835bb238b6ab9ee13 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Tue, 12 Mar 2024 12:49:01 +0100 Subject: [PATCH] LanguageClient: add a tooltip to deprecated items in the call hierarchy Change-Id: Ica03cdd06eea755852e6e9e3335ffeb5f8cae499 Reviewed-by: Christian Kandeler --- src/plugins/languageclient/callhierarchy.cpp | 106 +++++++++---------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/src/plugins/languageclient/callhierarchy.cpp b/src/plugins/languageclient/callhierarchy.cpp index b6ead79a7f6..2f53a120ebe 100644 --- a/src/plugins/languageclient/callhierarchy.cpp +++ b/src/plugins/languageclient/callhierarchy.cpp @@ -36,13 +36,48 @@ enum { }; } -class CallHierarchyItem : public TreeItem +class CallHierarchyRootItem : public TreeItem { public: - CallHierarchyItem(const LanguageServerProtocol::CallHierarchyItem &item, - const Direction direction, - Client *client) + CallHierarchyRootItem(const CallHierarchyItem &item) : m_item(item) + {} + + QVariant data(int column, int role) const override + { + switch (role) { + case Qt::DecorationRole: + if (hasTag(SymbolTag::Deprecated)) + return Utils::Icons::WARNING.icon(); + return symbolIcon(int(m_item.symbolKind())); + case Qt::DisplayRole: + return m_item.name(); + case Qt::ToolTipRole: + if (hasTag(SymbolTag::Deprecated)) + return Tr::tr("Deprecated"); + break; + default: + break; + } + return TreeItem::data(column, role); + } + +protected: + const CallHierarchyItem m_item; + + bool hasTag(const SymbolTag tag) const + { + if (const std::optional> tags = m_item.symbolTags()) + return tags->contains(tag); + return false; + } +}; + +class CallHierarchyTreeItem : public CallHierarchyRootItem +{ +public: + CallHierarchyTreeItem(const CallHierarchyItem &item, const Direction direction, Client *client) + : CallHierarchyRootItem(item) , m_direction(direction) , m_client(client) { @@ -51,12 +86,6 @@ public: QVariant data(int column, int role) const override { switch (role) { - case Qt::DecorationRole: - if (m_item.symbolTags().value_or(QList()).contains(SymbolTag::Deprecated)) - return Utils::Icons::WARNING.icon(); - return symbolIcon(int(m_item.symbolKind())); - case Qt::DisplayRole: - return m_item.name(); case LinkRole: { if (!m_client) return QVariant(); @@ -69,8 +98,9 @@ public: return *detail; return {}; default: - return TreeItem::data(column, role); + break; } + return CallHierarchyRootItem::data(column, role); } bool canFetchMore() const override { @@ -95,7 +125,7 @@ public: if (result && !result->isNull()) { for (const CallHierarchyIncomingCall &item : result->toList()) { if (item.isValid()) - appendChild(new CallHierarchyItem(item.from(), m_direction, m_client)); + appendChild(new CallHierarchyTreeItem(item.from(), m_direction, m_client)); } } if (!hasChildren()) @@ -111,7 +141,7 @@ public: if (result && !result->isNull()) { for (const CallHierarchyOutgoingCall &item : result->toList()) { if (item.isValid()) - appendChild(new CallHierarchyItem(item.to(), m_direction, m_client)); + appendChild(new CallHierarchyTreeItem(item.to(), m_direction, m_client)); } } if (!hasChildren()) @@ -122,60 +152,28 @@ public: } protected: - const LanguageServerProtocol::CallHierarchyItem m_item; const Direction m_direction; bool m_fetchedChildren = false; QPointer m_client; }; -class CallHierarchyDirectionItem : public CallHierarchyItem +class CallHierarchyDirectionItem : public CallHierarchyTreeItem { public: - CallHierarchyDirectionItem(const LanguageServerProtocol::CallHierarchyItem &item, + CallHierarchyDirectionItem(const CallHierarchyItem &item, const Direction direction, Client *client) - : CallHierarchyItem(item, direction, client) + : CallHierarchyTreeItem(item, direction, client) {} QVariant data(int column, int role) const override { if (role == Qt::DisplayRole) return m_direction == Incoming ? Tr::tr("Incoming") : Tr::tr("Outgoing"); - if (role == Qt::DecorationRole) - return {}; - return CallHierarchyItem::data(column, role); + return TreeItem::data(column, role); } }; - -class CallHierarchyRootItem : public TreeItem -{ -public: - CallHierarchyRootItem(const LanguageServerProtocol::CallHierarchyItem &item, Client *client) - : m_item(item) - { - appendChild(new CallHierarchyDirectionItem(m_item, Incoming, client)); - appendChild(new CallHierarchyDirectionItem(m_item, Outgoing, client)); - } - - QVariant data(int column, int role) const override - { - switch (role) { - case Qt::DecorationRole: - if (m_item.symbolTags().value_or(QList()).contains(SymbolTag::Deprecated)) - return Utils::Icons::WARNING.icon(); - return symbolIcon(int(m_item.symbolKind())); - case Qt::DisplayRole: - return m_item.name(); - default: - return TreeItem::data(column, role); - } - } - -private: - const LanguageServerProtocol::CallHierarchyItem m_item; -}; - class CallHierarchy : public QWidget { public: @@ -212,7 +210,7 @@ public: AnnotatedItemDelegate m_delegate; NavigationTreeView *m_view; - TreeModel m_model; + TreeModel m_model; }; void CallHierarchy::updateHierarchyAtCursorPosition() @@ -254,11 +252,13 @@ void CallHierarchy::handlePrepareResponse(Client *client, if (error) client->log(*error); - const std::optional> + const std::optional> result = response.result(); if (result && !result->isNull()) { - for (const LanguageServerProtocol::CallHierarchyItem &item : result->toList()) { - auto newItem = new CallHierarchyRootItem(item, client); + for (const CallHierarchyItem &item : result->toList()) { + auto newItem = new CallHierarchyRootItem(item); + newItem->appendChild(new CallHierarchyDirectionItem(item, Incoming, client)); + newItem->appendChild(new CallHierarchyDirectionItem(item, Outgoing, client)); m_model.rootItem()->appendChild(newItem); m_view->expand(newItem->index()); newItem->forChildrenAtLevel(1, [&](const TreeItem *child) {