From 5868e15c3008cdeb44862225aec34322d9fadc04 Mon Sep 17 00:00:00 2001 From: Alexis Murzeau Date: Sat, 9 May 2020 02:55:42 +0200 Subject: [PATCH] LSP: Always override the assist providers if the server supports them When the default assist provider is not DocumentContentCompletionProvider because of some plugin that also provide an assist provider, this would fail. If the user has configured a language server, assume is prefer that and always propose the server's assist providers when available. This the case for CMake files but probably C/C++ files too if the CppEditor plugin is configured to handle them. Change-Id: I641d73466c8b520beb494dae8e6b274debd2881f Reviewed-by: David Schulz --- src/plugins/languageclient/client.cpp | 28 +++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/plugins/languageclient/client.cpp b/src/plugins/languageclient/client.cpp index 6cf6ac709b7..e49444661a1 100644 --- a/src/plugins/languageclient/client.cpp +++ b/src/plugins/languageclient/client.cpp @@ -374,15 +374,17 @@ void Client::activateDocument(TextEditor::TextDocument *document) auto uri = DocumentUri::fromFilePath(document->filePath()); showDiagnostics(uri); SemanticHighligtingSupport::applyHighlight(document, m_highlights.value(uri), capabilities()); - // only replace the assist provider if the completion provider is the default one or null - if (!document->completionAssistProvider() - || qobject_cast( - document->completionAssistProvider())) { - m_resetAssistProvider[document] = {document->completionAssistProvider(), - document->functionHintAssistProvider(), - document->quickFixAssistProvider()}; + // only replace the assist provider if the language server support it + if (m_serverCapabilities.completionProvider()) { + m_resetAssistProvider[document].completionAssistProvider = document->completionAssistProvider(); document->setCompletionAssistProvider(m_clientProviders.completionAssistProvider); + } + if (m_serverCapabilities.signatureHelpProvider()) { + m_resetAssistProvider[document].functionHintProvider = document->functionHintAssistProvider(); document->setFunctionHintAssistProvider(m_clientProviders.functionHintProvider); + } + if (m_serverCapabilities.codeActionProvider()) { + m_resetAssistProvider[document].quickFixAssistProvider = document->quickFixAssistProvider(); document->setQuickFixAssistProvider(m_clientProviders.quickFixAssistProvider); } document->setFormatter(new LanguageClientFormatter(document, this)); @@ -1094,11 +1096,17 @@ void Client::removeDiagnostics(const DocumentUri &uri) void Client::resetAssistProviders(TextEditor::TextDocument *document) { const AssistProviders providers = m_resetAssistProvider.take(document); - if (document->completionAssistProvider() == m_clientProviders.completionAssistProvider) + + if (document->completionAssistProvider() == m_clientProviders.completionAssistProvider && + providers.completionAssistProvider) document->setCompletionAssistProvider(providers.completionAssistProvider); - if (document->functionHintAssistProvider() == m_clientProviders.functionHintProvider) + + if (document->functionHintAssistProvider() == m_clientProviders.functionHintProvider && + providers.functionHintProvider) document->setFunctionHintAssistProvider(providers.functionHintProvider); - if (document->quickFixAssistProvider() == m_clientProviders.quickFixAssistProvider) + + if (document->quickFixAssistProvider() == m_clientProviders.quickFixAssistProvider && + providers.quickFixAssistProvider) document->setQuickFixAssistProvider(providers.quickFixAssistProvider); }