From 321fae46f67a014e5089cb48e378be13d422fc00 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Wed, 3 Aug 2022 13:54:42 +0200 Subject: [PATCH] LanguageClient: Support limit parameter for completion request ... and make use of it in the ClangCodeModel tests. Change-Id: Ib2186273aec1db9b354892c2e1c4ebd82e3c1c96 Reviewed-by: Reviewed-by: Qt CI Bot Reviewed-by: David Schulz --- src/libs/languageserverprotocol/completion.h | 3 +++ src/libs/languageserverprotocol/jsonkeys.h | 1 + src/plugins/clangcodemodel/clangdclient.cpp | 6 ------ src/plugins/clangcodemodel/test/clangdtests.cpp | 4 ++++ src/plugins/languageclient/client.cpp | 11 +++++++++++ src/plugins/languageclient/client.h | 3 +++ .../languageclient/languageclientcompletionassist.cpp | 2 ++ 7 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/libs/languageserverprotocol/completion.h b/src/libs/languageserverprotocol/completion.h index b635e121e42..1aa1f2ff531 100644 --- a/src/libs/languageserverprotocol/completion.h +++ b/src/libs/languageserverprotocol/completion.h @@ -83,6 +83,9 @@ public: void setContext(const CompletionContext &context) { insert(contextKey, context); } void clearContext() { remove(contextKey); } + + // clangd extension + void setLimit(int limit) { insert(limitKey, limit); } }; class LANGUAGESERVERPROTOCOL_EXPORT CompletionItem : public JsonObject diff --git a/src/libs/languageserverprotocol/jsonkeys.h b/src/libs/languageserverprotocol/jsonkeys.h index 3c520ebad93..cc3d57ca614 100644 --- a/src/libs/languageserverprotocol/jsonkeys.h +++ b/src/libs/languageserverprotocol/jsonkeys.h @@ -139,6 +139,7 @@ constexpr char labelKey[] = "label"; constexpr char languageIdKey[] = "languageId"; constexpr char languageKey[] = "language"; constexpr char legendKey[] = "legend"; +constexpr char limitKey[] = "limit"; constexpr char lineKey[] = "line"; constexpr char linesKey[] = "lines"; constexpr char locationKey[] = "location"; diff --git a/src/plugins/clangcodemodel/clangdclient.cpp b/src/plugins/clangcodemodel/clangdclient.cpp index 7ea057530b2..d8841a6880b 100644 --- a/src/plugins/clangcodemodel/clangdclient.cpp +++ b/src/plugins/clangcodemodel/clangdclient.cpp @@ -167,13 +167,7 @@ static BaseClientInterface *clientInterface(Project *project, const Utils::FileP indexingOption += "=0"; const QString headerInsertionOption = QString("--header-insertion=") + (settings.autoIncludeHeaders() ? "iwyu" : "never"); -#ifdef WITH_TESTS - // For the #include < test, which needs to get a local header file, but the list - // is being flooded with system include headers. 4280 on Windows! - const QString limitResults = QString("--limit-results=0"); -#else const QString limitResults = QString("--limit-results=%1").arg(settings.completionResults()); -#endif Utils::CommandLine cmd{settings.clangdFilePath(), {indexingOption, headerInsertionOption, diff --git a/src/plugins/clangcodemodel/test/clangdtests.cpp b/src/plugins/clangcodemodel/test/clangdtests.cpp index 661c561a123..a3fc8c483ff 100644 --- a/src/plugins/clangcodemodel/test/clangdtests.cpp +++ b/src/plugins/clangcodemodel/test/clangdtests.cpp @@ -1550,6 +1550,9 @@ void ClangdTestCompletion::testCompletePreprocessorKeywords() void ClangdTestCompletion::testCompleteIncludeDirective() { + // Our local include is way down in the result list. + client()->setCompletionResultsLimit(0); + ProposalModelPtr proposal; getProposal("includeDirectiveCompletion.cpp", proposal); @@ -1558,6 +1561,7 @@ void ClangdTestCompletion::testCompleteIncludeDirective() QVERIFY(hasItem(proposal, " otherFile.h>")); QVERIFY(hasItem(proposal, " mylib/")); QVERIFY(!hasSnippet(proposal, "class ")); + client()->setCompletionResultsLimit(-1); } void ClangdTestCompletion::testCompleteGlobals() diff --git a/src/plugins/languageclient/client.cpp b/src/plugins/languageclient/client.cpp index e57700133da..78a2a259c99 100644 --- a/src/plugins/languageclient/client.cpp +++ b/src/plugins/languageclient/client.cpp @@ -328,6 +328,7 @@ public: QTimer m_shutdownTimer; LanguageServerProtocol::ClientInfo m_clientInfo; QJsonValue m_configuration; + int m_completionResultsLimit = -1; }; Client::Client(BaseClientInterface *clientInterface) @@ -1578,6 +1579,16 @@ TextEditor::RefactoringChangesData *Client::createRefactoringChangesBackend() co return new TextEditor::RefactoringChangesData; } +void Client::setCompletionResultsLimit(int limit) +{ + d->m_completionResultsLimit = limit; +} + +int Client::completionResultsLimit() const +{ + return d->m_completionResultsLimit; +} + const ServerCapabilities &Client::capabilities() const { return d->m_serverCapabilities; diff --git a/src/plugins/languageclient/client.h b/src/plugins/languageclient/client.h index d718012e49d..a126b194670 100644 --- a/src/plugins/languageclient/client.h +++ b/src/plugins/languageclient/client.h @@ -202,6 +202,9 @@ public: // Caller takes ownership virtual TextEditor::RefactoringChangesData *createRefactoringChangesBackend() const; + void setCompletionResultsLimit(int limit); + int completionResultsLimit() const; + signals: void initialized(const LanguageServerProtocol::ServerCapabilities &capabilities); void capabilitiesChanged(const DynamicCapabilities &capabilities); diff --git a/src/plugins/languageclient/languageclientcompletionassist.cpp b/src/plugins/languageclient/languageclientcompletionassist.cpp index baac3b007e2..8066e9b752e 100644 --- a/src/plugins/languageclient/languageclientcompletionassist.cpp +++ b/src/plugins/languageclient/languageclientcompletionassist.cpp @@ -379,6 +379,8 @@ IAssistProposal *LanguageClientCompletionAssistProcessor::perform(const AssistIn params.setPosition({line, column}); params.setContext(context); params.setTextDocument(TextDocumentIdentifier(DocumentUri::fromFilePath(interface->filePath()))); + if (const int limit = m_client->completionResultsLimit(); limit >= 0) + params.setLimit(limit); CompletionRequest completionRequest(params); completionRequest.setResponseCallback([this](auto response) { this->handleCompletionResponse(response);