LanguageClient: add a tooltip to deprecated items in the call hierarchy

Change-Id: Ica03cdd06eea755852e6e9e3335ffeb5f8cae499
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
David Schulz
2024-03-12 12:49:01 +01:00
parent 3107633731
commit b72c3bc8a2

View File

@@ -36,13 +36,48 @@ enum {
}; };
} }
class CallHierarchyItem : public TreeItem class CallHierarchyRootItem : public TreeItem
{ {
public: public:
CallHierarchyItem(const LanguageServerProtocol::CallHierarchyItem &item, CallHierarchyRootItem(const CallHierarchyItem &item)
const Direction direction,
Client *client)
: m_item(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<QList<SymbolTag>> 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_direction(direction)
, m_client(client) , m_client(client)
{ {
@@ -51,12 +86,6 @@ public:
QVariant data(int column, int role) const override QVariant data(int column, int role) const override
{ {
switch (role) { switch (role) {
case Qt::DecorationRole:
if (m_item.symbolTags().value_or(QList<SymbolTag>()).contains(SymbolTag::Deprecated))
return Utils::Icons::WARNING.icon();
return symbolIcon(int(m_item.symbolKind()));
case Qt::DisplayRole:
return m_item.name();
case LinkRole: { case LinkRole: {
if (!m_client) if (!m_client)
return QVariant(); return QVariant();
@@ -69,8 +98,9 @@ public:
return *detail; return *detail;
return {}; return {};
default: default:
return TreeItem::data(column, role); break;
} }
return CallHierarchyRootItem::data(column, role);
} }
bool canFetchMore() const override bool canFetchMore() const override
{ {
@@ -95,7 +125,7 @@ public:
if (result && !result->isNull()) { if (result && !result->isNull()) {
for (const CallHierarchyIncomingCall &item : result->toList()) { for (const CallHierarchyIncomingCall &item : result->toList()) {
if (item.isValid()) if (item.isValid())
appendChild(new CallHierarchyItem(item.from(), m_direction, m_client)); appendChild(new CallHierarchyTreeItem(item.from(), m_direction, m_client));
} }
} }
if (!hasChildren()) if (!hasChildren())
@@ -111,7 +141,7 @@ public:
if (result && !result->isNull()) { if (result && !result->isNull()) {
for (const CallHierarchyOutgoingCall &item : result->toList()) { for (const CallHierarchyOutgoingCall &item : result->toList()) {
if (item.isValid()) if (item.isValid())
appendChild(new CallHierarchyItem(item.to(), m_direction, m_client)); appendChild(new CallHierarchyTreeItem(item.to(), m_direction, m_client));
} }
} }
if (!hasChildren()) if (!hasChildren())
@@ -122,60 +152,28 @@ public:
} }
protected: protected:
const LanguageServerProtocol::CallHierarchyItem m_item;
const Direction m_direction; const Direction m_direction;
bool m_fetchedChildren = false; bool m_fetchedChildren = false;
QPointer<Client> m_client; QPointer<Client> m_client;
}; };
class CallHierarchyDirectionItem : public CallHierarchyItem class CallHierarchyDirectionItem : public CallHierarchyTreeItem
{ {
public: public:
CallHierarchyDirectionItem(const LanguageServerProtocol::CallHierarchyItem &item, CallHierarchyDirectionItem(const CallHierarchyItem &item,
const Direction direction, const Direction direction,
Client *client) Client *client)
: CallHierarchyItem(item, direction, client) : CallHierarchyTreeItem(item, direction, client)
{} {}
QVariant data(int column, int role) const override QVariant data(int column, int role) const override
{ {
if (role == Qt::DisplayRole) if (role == Qt::DisplayRole)
return m_direction == Incoming ? Tr::tr("Incoming") : Tr::tr("Outgoing"); return m_direction == Incoming ? Tr::tr("Incoming") : Tr::tr("Outgoing");
if (role == Qt::DecorationRole) return TreeItem::data(column, role);
return {};
return CallHierarchyItem::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<SymbolTag>()).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 class CallHierarchy : public QWidget
{ {
public: public:
@@ -212,7 +210,7 @@ public:
AnnotatedItemDelegate m_delegate; AnnotatedItemDelegate m_delegate;
NavigationTreeView *m_view; NavigationTreeView *m_view;
TreeModel<TreeItem, CallHierarchyRootItem, CallHierarchyDirectionItem, CallHierarchyItem> m_model; TreeModel<TreeItem, CallHierarchyRootItem, CallHierarchyTreeItem> m_model;
}; };
void CallHierarchy::updateHierarchyAtCursorPosition() void CallHierarchy::updateHierarchyAtCursorPosition()
@@ -254,11 +252,13 @@ void CallHierarchy::handlePrepareResponse(Client *client,
if (error) if (error)
client->log(*error); client->log(*error);
const std::optional<LanguageClientArray<LanguageServerProtocol::CallHierarchyItem>> const std::optional<LanguageClientArray<CallHierarchyItem>>
result = response.result(); result = response.result();
if (result && !result->isNull()) { if (result && !result->isNull()) {
for (const LanguageServerProtocol::CallHierarchyItem &item : result->toList()) { for (const CallHierarchyItem &item : result->toList()) {
auto newItem = new CallHierarchyRootItem(item, client); 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_model.rootItem()->appendChild(newItem);
m_view->expand(newItem->index()); m_view->expand(newItem->index());
newItem->forChildrenAtLevel(1, [&](const TreeItem *child) { newItem->forChildrenAtLevel(1, [&](const TreeItem *child) {