From 0fa349237daccfe64d63d6cff0ba236ac8555168 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 17 Jun 2022 09:48:54 +0200 Subject: [PATCH] ClangCodeModel: Special rendering for deprecated completion items We add the attribute textually and show a warning icon. Fixes: QTCREATORBUG-2325 Change-Id: Icc0305a703e26c84095167087b30fa3456f97614 Reviewed-by: David Schulz --- .../languageserverprotocol/completion.cpp | 10 +++++++++ src/libs/languageserverprotocol/completion.h | 21 +++++++++++++++++++ src/libs/languageserverprotocol/jsonkeys.h | 1 + src/plugins/clangcodemodel/clangdclient.cpp | 11 ++++++++++ .../languageclientcompletionassist.cpp | 9 ++++++++ .../languageclientcompletionassist.h | 1 + 6 files changed, 53 insertions(+) diff --git a/src/libs/languageserverprotocol/completion.cpp b/src/libs/languageserverprotocol/completion.cpp index 9f04338e87e..10d38c71178 100644 --- a/src/libs/languageserverprotocol/completion.cpp +++ b/src/libs/languageserverprotocol/completion.cpp @@ -49,6 +49,16 @@ Utils::optional CompletionItem::insertTextForm return Utils::nullopt; } +Utils::optional> CompletionItem::tags() const +{ + if (const auto value = optionalValue(tagsKey)) { + QList tags; + for (auto it = value->cbegin(); it != value->cend(); ++it) + tags << static_cast(it->toInt()); + return tags; + } + return {}; +} CompletionItemResolveRequest::CompletionItemResolveRequest(const CompletionItem ¶ms) : Request(methodName, params) diff --git a/src/libs/languageserverprotocol/completion.h b/src/libs/languageserverprotocol/completion.h index ab5e43ac220..b635e121e42 100644 --- a/src/libs/languageserverprotocol/completion.h +++ b/src/libs/languageserverprotocol/completion.h @@ -214,6 +214,27 @@ public: void setData(const QJsonValue &data) { insert(dataKey, data); } void clearData() { remove(dataKey); } + /** + * Completion item tags are extra annotations that tweak the rendering of a + * completion item. + * @since 3.15.0 + */ + enum CompletionItemTag { + Deprecated = 1, + }; + + /** + * Tags for this completion item. + * @since 3.15.0 + */ + Utils::optional> tags() const; + + /** + * Indicates if this item is deprecated. + * @deprecated Use `tags` instead if supported. + */ + Utils::optional deprecated() const { return optionalValue(deprecatedKey); } + bool isValid() const override { return contains(labelKey); } }; diff --git a/src/libs/languageserverprotocol/jsonkeys.h b/src/libs/languageserverprotocol/jsonkeys.h index f5c10a0b5d6..3c520ebad93 100644 --- a/src/libs/languageserverprotocol/jsonkeys.h +++ b/src/libs/languageserverprotocol/jsonkeys.h @@ -209,6 +209,7 @@ constexpr char symbolKindKey[] = "symbolKind"; constexpr char syncKindKey[] = "syncKind"; constexpr char synchronizationKey[] = "synchronization"; constexpr char tabSizeKey[] = "tabSize"; +constexpr char tagsKey[] = "tags"; constexpr char targetKey[] = "target"; constexpr char textDocumentKey[] = "textDocument"; constexpr char textDocumentSyncKey[] = "textDocumentSync"; diff --git a/src/plugins/clangcodemodel/clangdclient.cpp b/src/plugins/clangcodemodel/clangdclient.cpp index 326539e5619..771ce6a44bd 100644 --- a/src/plugins/clangcodemodel/clangdclient.cpp +++ b/src/plugins/clangcodemodel/clangdclient.cpp @@ -741,6 +741,7 @@ public: private: QIcon icon() const override; + QString text() const override; }; class ClangdClient::ClangdCompletionAssistProcessor : public LanguageClientCompletionAssistProcessor @@ -2551,6 +2552,8 @@ ClangdCompletionItem::SpecialQtType ClangdCompletionItem::getQtType(const Comple QIcon ClangdCompletionItem::icon() const { + if (isDeprecated()) + return Utils::Icons::WARNING.icon(); const SpecialQtType qtType = getQtType(item()); switch (qtType) { case SpecialQtType::Signal: @@ -2566,6 +2569,14 @@ QIcon ClangdCompletionItem::icon() const return LanguageClientCompletionItem::icon(); } +QString ClangdCompletionItem::text() const +{ + const QString clangdValue = LanguageClientCompletionItem::text(); + if (isDeprecated()) + return "[[deprecated]]" + clangdValue; + return clangdValue; +} + MessageId ClangdClient::Private::getAndHandleAst(const TextDocOrFile &doc, const AstHandler &astHandler, AstCallbackMode callbackMode, const Range &range) diff --git a/src/plugins/languageclient/languageclientcompletionassist.cpp b/src/plugins/languageclient/languageclientcompletionassist.cpp index e10729987ce..0ab76a10c07 100644 --- a/src/plugins/languageclient/languageclientcompletionassist.cpp +++ b/src/plugins/languageclient/languageclientcompletionassist.cpp @@ -227,6 +227,15 @@ bool LanguageClientCompletionItem::isPerfectMatch(int pos, QTextDocument *doc) c return textToInsert == textAt(QTextCursor(doc), pos - length, length); } +bool LanguageClientCompletionItem::isDeprecated() const +{ + if (const auto tags = m_item.tags(); tags && tags->contains(CompletionItem::Deprecated)) + return true; + if (const auto deprecated = m_item.deprecated()) + return *deprecated; + return false; +} + class LanguageClientCompletionModel : public GenericProposalModel { public: diff --git a/src/plugins/languageclient/languageclientcompletionassist.h b/src/plugins/languageclient/languageclientcompletionassist.h index 2f5ba014fab..19a8ec93063 100644 --- a/src/plugins/languageclient/languageclientcompletionassist.h +++ b/src/plugins/languageclient/languageclientcompletionassist.h @@ -135,6 +135,7 @@ public: bool operator <(const LanguageClientCompletionItem &other) const; bool isPerfectMatch(int pos, QTextDocument *doc) const; + bool isDeprecated() const; private: LanguageServerProtocol::CompletionItem m_item;