Skip to content

Commit ca13f55

Browse files
committed
[clangd] Add limit extension on completion and workspace-symbols
This overrides the --limit-results command-line flag, and is not constrained by it. See clangd/clangd#707 Differential Revision: https://reviews.llvm.org/D97801
1 parent 3b99731 commit ca13f55

File tree

3 files changed

+33
-19
lines changed

3 files changed

+33
-19
lines changed

clang-tools-extra/clangd/ClangdLSPServer.cpp

+19-16
Original file line numberDiff line numberDiff line change
@@ -780,7 +780,7 @@ void ClangdLSPServer::onWorkspaceSymbol(
780780
const WorkspaceSymbolParams &Params,
781781
Callback<std::vector<SymbolInformation>> Reply) {
782782
Server->workspaceSymbols(
783-
Params.query, Opts.CodeComplete.Limit,
783+
Params.query, Params.limit.getValueOr(Opts.CodeComplete.Limit),
784784
[Reply = std::move(Reply),
785785
this](llvm::Expected<std::vector<SymbolInformation>> Items) mutable {
786786
if (!Items)
@@ -1031,21 +1031,24 @@ void ClangdLSPServer::onCompletion(const CompletionParams &Params,
10311031
vlog("ignored auto-triggered completion, preceding char did not match");
10321032
return Reply(CompletionList());
10331033
}
1034-
Server->codeComplete(
1035-
Params.textDocument.uri.file(), Params.position, Opts.CodeComplete,
1036-
[Reply = std::move(Reply),
1037-
this](llvm::Expected<CodeCompleteResult> List) mutable {
1038-
if (!List)
1039-
return Reply(List.takeError());
1040-
CompletionList LSPList;
1041-
LSPList.isIncomplete = List->HasMore;
1042-
for (const auto &R : List->Completions) {
1043-
CompletionItem C = R.render(Opts.CodeComplete);
1044-
C.kind = adjustKindToCapability(C.kind, SupportedCompletionItemKinds);
1045-
LSPList.items.push_back(std::move(C));
1046-
}
1047-
return Reply(std::move(LSPList));
1048-
});
1034+
auto Opts = this->Opts.CodeComplete;
1035+
if (Params.limit && *Params.limit >= 0)
1036+
Opts.Limit = *Params.limit;
1037+
Server->codeComplete(Params.textDocument.uri.file(), Params.position, Opts,
1038+
[Reply = std::move(Reply), Opts,
1039+
this](llvm::Expected<CodeCompleteResult> List) mutable {
1040+
if (!List)
1041+
return Reply(List.takeError());
1042+
CompletionList LSPList;
1043+
LSPList.isIncomplete = List->HasMore;
1044+
for (const auto &R : List->Completions) {
1045+
CompletionItem C = R.render(Opts);
1046+
C.kind = adjustKindToCapability(
1047+
C.kind, SupportedCompletionItemKinds);
1048+
LSPList.items.push_back(std::move(C));
1049+
}
1050+
return Reply(std::move(LSPList));
1051+
});
10491052
}
10501053

10511054
void ClangdLSPServer::onSignatureHelp(const TextDocumentPositionParams &Params,

clang-tools-extra/clangd/Protocol.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -750,7 +750,8 @@ llvm::raw_ostream &operator<<(llvm::raw_ostream &O, const SymbolDetails &S) {
750750
bool fromJSON(const llvm::json::Value &Params, WorkspaceSymbolParams &R,
751751
llvm::json::Path P) {
752752
llvm::json::ObjectMapper O(Params, P);
753-
return O && O.map("query", R.query);
753+
return O && O.map("query", R.query) &&
754+
mapOptOrNull(Params, "limit", R.limit, P);
754755
}
755756

756757
llvm::json::Value toJSON(const Command &C) {
@@ -851,7 +852,8 @@ bool fromJSON(const llvm::json::Value &Params, CompletionContext &R,
851852

852853
bool fromJSON(const llvm::json::Value &Params, CompletionParams &R,
853854
llvm::json::Path P) {
854-
if (!fromJSON(Params, static_cast<TextDocumentPositionParams &>(R), P))
855+
if (!fromJSON(Params, static_cast<TextDocumentPositionParams &>(R), P) ||
856+
!mapOptOrNull(Params, "limit", R.limit, P))
855857
return false;
856858
if (auto *Context = Params.getAsObject()->get("context"))
857859
return fromJSON(*Context, R.context, P.field("context"));

clang-tools-extra/clangd/Protocol.h

+10-1
Original file line numberDiff line numberDiff line change
@@ -1056,8 +1056,13 @@ bool operator==(const SymbolDetails &, const SymbolDetails &);
10561056

10571057
/// The parameters of a Workspace Symbol Request.
10581058
struct WorkspaceSymbolParams {
1059-
/// A non-empty query string
1059+
/// A query string to filter symbols by.
1060+
/// Clients may send an empty string here to request all the symbols.
10601061
std::string query;
1062+
1063+
/// Max results to return, overriding global default. 0 means no limit.
1064+
/// Clangd extension.
1065+
llvm::Optional<int> limit;
10611066
};
10621067
bool fromJSON(const llvm::json::Value &, WorkspaceSymbolParams &,
10631068
llvm::json::Path);
@@ -1106,6 +1111,10 @@ bool fromJSON(const llvm::json::Value &, CompletionContext &, llvm::json::Path);
11061111

11071112
struct CompletionParams : TextDocumentPositionParams {
11081113
CompletionContext context;
1114+
1115+
/// Max results to return, overriding global default. 0 means no limit.
1116+
/// Clangd extension.
1117+
llvm::Optional<int> limit;
11091118
};
11101119
bool fromJSON(const llvm::json::Value &, CompletionParams &, llvm::json::Path);
11111120

0 commit comments

Comments
 (0)