diff options
| author | Ilya Biryukov <ibiryukov@google.com> | 2018-01-10 13:51:09 +0000 |
|---|---|---|
| committer | Ilya Biryukov <ibiryukov@google.com> | 2018-01-10 13:51:09 +0000 |
| commit | f60bf347c9769eda92fae02fbc06b5f31e70ffd9 (patch) | |
| tree | ef4b60044238d76873b4b5c5c38b45adf145113d | |
| parent | 400c7b3c7aa5486695dbacad609bb2fb2f4d4436 (diff) | |
| download | bcm5719-llvm-f60bf347c9769eda92fae02fbc06b5f31e70ffd9.tar.gz bcm5719-llvm-f60bf347c9769eda92fae02fbc06b5f31e70ffd9.zip | |
[clangd] Remove duplicates from code completion
Summary:
This patch removes hidden items from code completion.
Items can be hidden, e.g., by other items in the child scopes.
This patch addresses a particular problem of a duplicate completion
item for the class in the following example:
struct Adapter { void method(); };
void Adapter::method() {
Adapter^
}
We should probably investigate if there are other duplicates in
completion and remove them, possibly adding assertions that it never
happens.
Reviewers: sammccall
Reviewed By: sammccall
Subscribers: cfe-commits, klimek
Differential Revision: https://reviews.llvm.org/D41901
llvm-svn: 322185
| -rw-r--r-- | clang-tools-extra/clangd/CodeComplete.cpp | 7 | ||||
| -rw-r--r-- | clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp | 16 |
2 files changed, 23 insertions, 0 deletions
diff --git a/clang-tools-extra/clangd/CodeComplete.cpp b/clang-tools-extra/clangd/CodeComplete.cpp index ee709021f9c..dc5a85027f9 100644 --- a/clang-tools-extra/clangd/CodeComplete.cpp +++ b/clang-tools-extra/clangd/CodeComplete.cpp @@ -294,6 +294,13 @@ public: std::priority_queue<CompletionCandidate> Candidates; for (unsigned I = 0; I < NumResults; ++I) { auto &Result = Results[I]; + // We drop hidden items, as they cannot be found by the lookup after + // inserting the corresponding completion item and only produce noise and + // duplicates in the completion list. However, there is one exception. If + // Result has a Qualifier which is non-informative, we can refer to an + // item by adding that qualifier, so we don't filter out this item. + if (Result.Hidden && (!Result.Qualifier || Result.QualifierIsInformative)) + continue; if (!ClangdOpts.IncludeIneligibleResults && (Result.Availability == CXAvailability_NotAvailable || Result.Availability == CXAvailability_NotAccessible)) diff --git a/clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp b/clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp index c281415b4ec..942a87abae0 100644 --- a/clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp +++ b/clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp @@ -592,6 +592,22 @@ TEST(CompletionTest, ASTIndexMultiFile) { Doc("Doooc"), Detail("void")))); } +TEST(CompletionTest, NoDuplicates) { + auto Items = completions(R"cpp( +struct Adapter { + void method(); +}; + +void Adapter::method() { + Adapter^ +} + )cpp") + .items; + + // Make sure there are no duplicate entries of 'Adapter'. + EXPECT_THAT(Items, ElementsAre(Named("Adapter"), Named("~Adapter"))); +} + } // namespace } // namespace clangd } // namespace clang |

