diff --git a/clang-tools-extra/clangd/CodeComplete.h b/clang-tools-extra/clangd/CodeComplete.h --- a/clang-tools-extra/clangd/CodeComplete.h +++ b/clang-tools-extra/clangd/CodeComplete.h @@ -31,6 +31,7 @@ #include "llvm/ADT/StringRef.h" #include #include +#include namespace clang { class NamedDecl; @@ -262,7 +263,7 @@ llvm::Optional NewReq; /// The result is consumed by `codeComplete()` if speculation succeeded. /// NOTE: the destructor will wait for the async call to finish. - std::future Result; + std::future> Result; }; /// Gets code completions at a specified \p Pos in \p FileName. diff --git a/clang-tools-extra/clangd/CodeComplete.cpp b/clang-tools-extra/clangd/CodeComplete.cpp --- a/clang-tools-extra/clangd/CodeComplete.cpp +++ b/clang-tools-extra/clangd/CodeComplete.cpp @@ -70,6 +70,7 @@ #include #include #include +#include // We log detailed candidate here if you run with -debug-only=codecomplete. #define DEBUG_TYPE "CodeComplete" @@ -1363,13 +1364,14 @@ return true; } -std::future startAsyncFuzzyFind(const SymbolIndex &Index, - const FuzzyFindRequest &Req) { - return runAsync([&Index, Req]() { +std::future> +startAsyncFuzzyFind(const SymbolIndex &Index, const FuzzyFindRequest &Req) { + return runAsync>([&Index, Req]() { trace::Span Tracer("Async fuzzyFind"); SymbolSlab::Builder Syms; - Index.fuzzyFind(Req, [&Syms](const Symbol &Sym) { Syms.insert(Sym); }); - return std::move(Syms).build(); + bool Incomplete = + Index.fuzzyFind(Req, [&Syms](const Symbol &Sym) { Syms.insert(Sym); }); + return std::make_pair(Incomplete, std::move(Syms).build()); }); } @@ -1721,7 +1723,9 @@ SPAN_ATTACH(Tracer, "Speculative results", true); trace::Span WaitSpec("Wait speculative results"); - return SpecFuzzyFind->Result.get(); + auto SpecRes = SpecFuzzyFind->Result.get(); + Incomplete |= SpecRes.first; + return std::move(SpecRes.second); } SPAN_ATTACH(Tracer, "Speculative results", false); diff --git a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp --- a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp +++ b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp @@ -2594,7 +2594,8 @@ Opts.Index = &Requests; auto CompleteAtPoint = [&](StringRef P) { - cantFail(runCodeComplete(Server, File, Test.point(P), Opts)); + auto CCR = cantFail(runCodeComplete(Server, File, Test.point(P), Opts)); + EXPECT_TRUE(CCR.HasMore); }; CompleteAtPoint("1");