forked from qt-creator/qt-creator
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:
@@ -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) {
|
||||||
|
Reference in New Issue
Block a user