From 7df00776d12c3529def9d937c064a1b9e690bd4e Mon Sep 17 00:00:00 2001 From: David Schulz Date: Thu, 30 Sep 2021 07:23:23 +0200 Subject: [PATCH] LSP: Add support for activeParameter of SignatureInformation Task-number: QTCREATORBUG-26346 Change-Id: Ieab18f08e4f1b9fa6cacfae0a18310af4bc35165 Reviewed-by: Christian Kandeler --- src/libs/languageserverprotocol/clientcapabilities.h | 6 ++++++ src/libs/languageserverprotocol/jsonkeys.h | 1 + src/libs/languageserverprotocol/languagefeatures.h | 4 ++++ src/plugins/languageclient/client.cpp | 1 + .../languageclient/languageclientfunctionhint.cpp | 9 +++++---- 5 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/libs/languageserverprotocol/clientcapabilities.h b/src/libs/languageserverprotocol/clientcapabilities.h index 147483c5042..c0bdae40319 100644 --- a/src/libs/languageserverprotocol/clientcapabilities.h +++ b/src/libs/languageserverprotocol/clientcapabilities.h @@ -336,6 +336,12 @@ public: Utils::optional> documentationFormat() const; void setDocumentationFormat(const QList &documentationFormat); void clearDocumentationFormat() { remove(documentationFormatKey); } + + Utils::optional activeParameterSupport() const + { return optionalValue(activeParameterSupportKey); } + void setActiveParameterSupport(bool activeParameterSupport) + { insert(activeParameterSupportKey, activeParameterSupport); } + void clearActiveParameterSupport() { remove(activeParameterSupportKey); } }; // The client supports the following `SignatureInformation` specific properties. diff --git a/src/libs/languageserverprotocol/jsonkeys.h b/src/libs/languageserverprotocol/jsonkeys.h index b0109c11349..fa0e5d63e01 100644 --- a/src/libs/languageserverprotocol/jsonkeys.h +++ b/src/libs/languageserverprotocol/jsonkeys.h @@ -29,6 +29,7 @@ namespace LanguageServerProtocol { constexpr char actionsKey[] = "actions"; constexpr char activeParameterKey[] = "activeParameter"; +constexpr char activeParameterSupportKey[] = "activeParameterSupport"; constexpr char activeSignatureKey[] = "activeSignature"; constexpr char addedKey[] = "added"; constexpr char additionalTextEditsKey[] = "additionalTextEdits"; diff --git a/src/libs/languageserverprotocol/languagefeatures.h b/src/libs/languageserverprotocol/languagefeatures.h index fc8df0bc716..ade9507d0b6 100644 --- a/src/libs/languageserverprotocol/languagefeatures.h +++ b/src/libs/languageserverprotocol/languagefeatures.h @@ -145,6 +145,10 @@ public: void setParameters(const QList ¶meters) { insertArray(parametersKey, parameters); } void clearParameters() { remove(parametersKey); } + + Utils::optional activeParameter() const { return optionalValue(activeParameterKey); } + void setActiveParameter(int activeParameter) { insert(activeParameterKey, activeParameter); } + void clearActiveParameter() { remove(activeParameterKey); } }; /** diff --git a/src/plugins/languageclient/client.cpp b/src/plugins/languageclient/client.cpp index 220ddb42c55..5f2b44d5e91 100644 --- a/src/plugins/languageclient/client.cpp +++ b/src/plugins/languageclient/client.cpp @@ -248,6 +248,7 @@ static ClientCapabilities generateClientCapabilities() signatureHelp.setDynamicRegistration(true); TextDocumentClientCapabilities::SignatureHelpCapabilities::SignatureInformationCapabilities info; info.setDocumentationFormat({MarkupKind::markdown, MarkupKind::plaintext}); + info.setActiveParameterSupport(true); signatureHelp.setSignatureInformation(info); documentCapabilities.setSignatureHelp(signatureHelp); diff --git a/src/plugins/languageclient/languageclientfunctionhint.cpp b/src/plugins/languageclient/languageclientfunctionhint.cpp index 76a851d0cd4..f554d4a3b0e 100644 --- a/src/plugins/languageclient/languageclientfunctionhint.cpp +++ b/src/plugins/languageclient/languageclientfunctionhint.cpp @@ -61,11 +61,12 @@ QString FunctionHintProposalModel::text(int index) const if (index < 0 || m_sigis.signatures().size() <= index) return {}; const SignatureInformation signature = m_sigis.signatures().at(index); + int parametersIndex = signature.activeParameter().value_or(-1); + if (parametersIndex < 0) { + if (index == m_sigis.activeSignature().value_or(-1)) + parametersIndex = m_sigis.activeParameter().value_or(-1); + } QString label = signature.label(); - if (index != m_sigis.activeSignature().value_or(-1)) - return label; - - const int parametersIndex = m_sigis.activeParameter().value_or(-1); if (parametersIndex < 0) return label;