diff options
author | Haojian Wu <hokein@google.com> | 2018-01-25 09:20:09 +0000 |
---|---|---|
committer | Haojian Wu <hokein@google.com> | 2018-01-25 09:20:09 +0000 |
commit | 48b486568353e90ebc92ecc57436c0c609be7004 (patch) | |
tree | e4554deab1c2c30bfd41e39f239862edc399b5dd | |
parent | 41e45955bb32d02bce91b1cd2dcf3f0ebedcd062 (diff) | |
download | bcm5719-llvm-48b486568353e90ebc92ecc57436c0c609be7004.tar.gz bcm5719-llvm-48b486568353e90ebc92ecc57436c0c609be7004.zip |
[clangd] Limit completion results.
Summary:
* truncate symbols from static/dynamic index to the limited number
(which would save lots of cost in constructing the merged symbols).
* add an CLI option allowing to limit the number of returned completion results.
(default to 100)
Reviewers: sammccall
Reviewed By: sammccall
Subscribers: klimek, ilya-biryukov, jkorous-apple, ioeric, cfe-commits
Differential Revision: https://reviews.llvm.org/D42484
llvm-svn: 323408
-rw-r--r-- | clang-tools-extra/clangd/CodeComplete.cpp | 2 | ||||
-rw-r--r-- | clang-tools-extra/clangd/index/Merge.cpp | 2 | ||||
-rw-r--r-- | clang-tools-extra/clangd/tool/ClangdMain.cpp | 7 | ||||
-rw-r--r-- | clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp | 13 |
4 files changed, 23 insertions, 1 deletions
diff --git a/clang-tools-extra/clangd/CodeComplete.cpp b/clang-tools-extra/clangd/CodeComplete.cpp index e070831ed2e..d0916aa30fd 100644 --- a/clang-tools-extra/clangd/CodeComplete.cpp +++ b/clang-tools-extra/clangd/CodeComplete.cpp @@ -864,6 +864,8 @@ private: SymbolSlab::Builder ResultsBuilder; // Build the query. FuzzyFindRequest Req; + if (Opts.Limit) + Req.MaxCandidateCount = Opts.Limit; Req.Query = Filter->pattern(); Req.Scopes = getQueryScopes(Recorder.CCContext, Recorder.CCSema->getSourceManager()); diff --git a/clang-tools-extra/clangd/index/Merge.cpp b/clang-tools-extra/clangd/index/Merge.cpp index 8264dcc2b9b..61e3024bced 100644 --- a/clang-tools-extra/clangd/index/Merge.cpp +++ b/clang-tools-extra/clangd/index/Merge.cpp @@ -50,7 +50,7 @@ class MergedIndex : public SymbolIndex { for (const Symbol &S : Dyn) if (!SeenDynamicSymbols.count(S.ID)) Callback(S); - return More; + return !More; // returning true indicates the result is complete. } private: diff --git a/clang-tools-extra/clangd/tool/ClangdMain.cpp b/clang-tools-extra/clangd/tool/ClangdMain.cpp index 69f41ce8ac9..2d965198f89 100644 --- a/clang-tools-extra/clangd/tool/ClangdMain.cpp +++ b/clang-tools-extra/clangd/tool/ClangdMain.cpp @@ -86,6 +86,12 @@ static llvm::cl::opt<PCHStorageFlag> PCHStorage( clEnumValN(PCHStorageFlag::Memory, "memory", "store PCHs in memory")), llvm::cl::init(PCHStorageFlag::Disk)); +static llvm::cl::opt<int> LimitCompletionResult( + "limit-completion", + llvm::cl::desc("Limit the number of completion results returned by clangd. " + "0 means no limit."), + llvm::cl::init(0)); + static llvm::cl::opt<bool> RunSynchronously( "run-synchronously", llvm::cl::desc("Parse on main thread. If set, -j is ignored"), @@ -215,6 +221,7 @@ int main(int argc, char *argv[]) { clangd::CodeCompleteOptions CCOpts; CCOpts.EnableSnippets = EnableSnippets; CCOpts.IncludeIneligibleResults = IncludeIneligibleResults; + CCOpts.Limit = LimitCompletionResult; // Initialize and run ClangdLSPServer. ClangdLSPServer LSPServer(Out, WorkerThreadsCount, StorePreamblesInMemory, CCOpts, ResourceDirRef, CompileCommandsDirPath, diff --git a/clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp b/clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp index 729c2bb098c..7c166cc197b 100644 --- a/clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp +++ b/clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp @@ -529,6 +529,19 @@ TEST(CompletionTest, SemaIndexMerge) { UnorderedElementsAre(Named("local"), Named("Index"), Named("both"))); } +TEST(CompletionTest, SemaIndexMergeWithLimit) { + clangd::CodeCompleteOptions Opts; + Opts.Limit = 1; + auto Results = completions( + R"cpp( + namespace ns { int local; void both(); } + void f() { ::ns::^ } + )cpp", + {func("ns::both"), cls("ns::Index")}, Opts); + EXPECT_EQ(Results.items.size(), Opts.Limit); + EXPECT_TRUE(Results.isIncomplete); +} + TEST(CompletionTest, IndexSuppressesPreambleCompletions) { MockFSProvider FS; MockCompilationDatabase CDB; |