From fb9df48c8557005bc10be1cf48e9294d0693fb3d Mon Sep 17 00:00:00 2001 From: Ilya Biryukov Date: Fri, 29 Dec 2017 14:59:22 +0000 Subject: [clangd] Properly set filterText for index-based completion items It was previously set to an identifier that the user typed, leading to surprising behavior in VSCode (probably in other editors too). git-svn-id: https://llvm.org/svn/llvm-project/clang-tools-extra/trunk@321554 91177308-0d34-0410-b5e6-96231b3b80d8 --- clangd/CodeComplete.cpp | 2 +- unittests/clangd/CodeCompleteTests.cpp | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/clangd/CodeComplete.cpp b/clangd/CodeComplete.cpp index 87f73b20..28ea4dbb 100644 --- a/clangd/CodeComplete.cpp +++ b/clangd/CodeComplete.cpp @@ -558,7 +558,7 @@ CompletionItem indexCompletionItem(const Symbol &Sym, llvm::StringRef Filter, Item.insertText = Sym.Name; // FIXME(ioeric): support snippets. Item.insertTextFormat = InsertTextFormat::PlainText; - Item.filterText = Filter; + Item.filterText = Sym.Name; // FIXME(ioeric): sort symbols appropriately. Item.sortText = ""; diff --git a/unittests/clangd/CodeCompleteTests.cpp b/unittests/clangd/CodeCompleteTests.cpp index e3042c3d..5f852d02 100644 --- a/unittests/clangd/CodeCompleteTests.cpp +++ b/unittests/clangd/CodeCompleteTests.cpp @@ -54,6 +54,7 @@ namespace { using namespace llvm; using ::testing::AllOf; using ::testing::Contains; +using ::testing::Each; using ::testing::ElementsAre; using ::testing::Not; @@ -75,6 +76,11 @@ MATCHER_P(Snippet, Text, "") { return arg.insertTextFormat == clangd::InsertTextFormat::Snippet && arg.insertText == Text; } +MATCHER(FilterContainsName, "") { + if (arg.filterText.empty()) + return true; + return llvm::StringRef(arg.insertText).contains(arg.filterText); +} // Shorthand for Contains(Named(Name)). Matcher &> Has(std::string Name) { return Contains(Named(std::move(Name))); @@ -95,9 +101,13 @@ CompletionList completions(StringRef Text, auto File = getVirtualTestFilePath("foo.cpp"); Annotations Test(Text); Server.addDocument(Context::empty(), File, Test.code()); - return Server.codeComplete(Context::empty(), File, Test.point(), Opts) - .get() - .second.Value; + auto CompletionList = + Server.codeComplete(Context::empty(), File, Test.point(), Opts) + .get() + .second.Value; + // Sanity-check that filterText is valid. + EXPECT_THAT(CompletionList.items, Each(FilterContainsName())); + return CompletionList; } TEST(CompletionTest, Limit) { @@ -513,7 +523,7 @@ TEST(CompletionTest, IndexBasedWithFilter) { void f() { ns::x^ } )cpp", Opts); - EXPECT_THAT(Results.items, Contains(AllOf(Named("XYZ"), Filter("x")))); + EXPECT_THAT(Results.items, Contains(AllOf(Named("XYZ"), Filter("XYZ")))); EXPECT_THAT(Results.items, Not(Has("foo"))); } -- cgit v1.2.3