[clang-tools-extra] bc1f243 - [clangd] Improve ObjC protocol suggestions from the index
David Goldman via cfe-commits
cfe-commits at lists.llvm.org
Wed Jun 15 12:03:20 PDT 2022
Author: David Goldman
Date: 2022-06-15T15:02:37-04:00
New Revision: bc1f24332af3dedccb84a975e57adca495ea016d
URL: https://github.com/llvm/llvm-project/commit/bc1f24332af3dedccb84a975e57adca495ea016d
DIFF: https://github.com/llvm/llvm-project/commit/bc1f24332af3dedccb84a975e57adca495ea016d.diff
LOG: [clangd] Improve ObjC protocol suggestions from the index
When querying the index during an ObjC protocol name lookup for code
completion, we should only suggest ObjC protocols.
Differential Revision: https://reviews.llvm.org/D127125
Added:
Modified:
clang-tools-extra/clangd/CodeComplete.cpp
clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp
clang-tools-extra/clangd/unittests/TestIndex.cpp
clang-tools-extra/clangd/unittests/TestIndex.h
Removed:
################################################################################
diff --git a/clang-tools-extra/clangd/CodeComplete.cpp b/clang-tools-extra/clangd/CodeComplete.cpp
index 527b6cdc304db..09e516919c807 100644
--- a/clang-tools-extra/clangd/CodeComplete.cpp
+++ b/clang-tools-extra/clangd/CodeComplete.cpp
@@ -1673,6 +1673,14 @@ class CodeCompleteFlow {
return Output;
}
+ bool includeSymbolFromIndex(const Symbol &Sym) {
+ if (CCContextKind == CodeCompletionContext::CCC_ObjCProtocolName) {
+ return Sym.SymInfo.Lang == index::SymbolLanguage::ObjC &&
+ Sym.SymInfo.Kind == index::SymbolKind::Protocol;
+ }
+ return true;
+ }
+
SymbolSlab queryIndex() {
trace::Span Tracer("Query index");
SPAN_ATTACH(Tracer, "limit", int64_t(Opts.Limit));
@@ -1706,8 +1714,10 @@ class CodeCompleteFlow {
// Run the query against the index.
SymbolSlab::Builder ResultsBuilder;
- if (Opts.Index->fuzzyFind(
- Req, [&](const Symbol &Sym) { ResultsBuilder.insert(Sym); }))
+ if (Opts.Index->fuzzyFind(Req, [&](const Symbol &Sym) {
+ if (includeSymbolFromIndex(Sym))
+ ResultsBuilder.insert(Sym);
+ }))
Incomplete = true;
return std::move(ResultsBuilder).build();
}
diff --git a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp
index 18b02af48095f..88698d3177168 100644
--- a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp
+++ b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp
@@ -3167,6 +3167,20 @@ TEST(CompletionTest, ObjectiveCMethodDeclarationFromMiddle) {
EXPECT_THAT(C, ElementsAre(signature("(id)object")));
}
+TEST(CompletionTest, ObjectiveCProtocolFromIndex) {
+ Symbol FoodClass = objcClass("FoodClass");
+ Symbol SymFood = objcProtocol("Food");
+ Symbol SymFooey = objcProtocol("Fooey");
+ auto Results = completions(R"objc(
+ id<Foo^>
+ )objc",
+ {SymFood, FoodClass, SymFooey},
+ /*Opts=*/{}, "Foo.m");
+
+ auto C = Results.Completions;
+ EXPECT_THAT(C, UnorderedElementsAre(named("Food"), named("Fooey")));
+}
+
TEST(CompletionTest, CursorInSnippets) {
clangd::CodeCompleteOptions Options;
Options.EnableSnippets = true;
diff --git a/clang-tools-extra/clangd/unittests/TestIndex.cpp b/clang-tools-extra/clangd/unittests/TestIndex.cpp
index 3378ac856fc6d..6f7bd3aac207b 100644
--- a/clang-tools-extra/clangd/unittests/TestIndex.cpp
+++ b/clang-tools-extra/clangd/unittests/TestIndex.cpp
@@ -81,6 +81,28 @@ Symbol conceptSym(llvm::StringRef Name) {
return sym(Name, index::SymbolKind::Concept, "@CT@\\0");
}
+Symbol objcSym(llvm::StringRef Name, index::SymbolKind Kind,
+ llvm::StringRef USRPrefix) {
+ Symbol Sym;
+ std::string USR = USRPrefix.str() + Name.str();
+ Sym.Name = Name;
+ Sym.Scope = "";
+ Sym.ID = SymbolID(USR);
+ Sym.SymInfo.Kind = Kind;
+ Sym.SymInfo.Lang = index::SymbolLanguage::ObjC;
+ Sym.Flags |= Symbol::IndexedForCodeCompletion;
+ Sym.Origin = SymbolOrigin::Static;
+ return Sym;
+}
+
+Symbol objcClass(llvm::StringRef Name) {
+ return objcSym(Name, index::SymbolKind::Class, "objc(cs)");
+}
+
+Symbol objcProtocol(llvm::StringRef Name) {
+ return objcSym(Name, index::SymbolKind::Protocol, "objc(pl)");
+}
+
SymbolSlab generateSymbols(std::vector<std::string> QualifiedNames) {
SymbolSlab::Builder Slab;
for (llvm::StringRef QName : QualifiedNames)
diff --git a/clang-tools-extra/clangd/unittests/TestIndex.h b/clang-tools-extra/clangd/unittests/TestIndex.h
index b55f82eac3292..6a4d2cb5cdd01 100644
--- a/clang-tools-extra/clangd/unittests/TestIndex.h
+++ b/clang-tools-extra/clangd/unittests/TestIndex.h
@@ -34,6 +34,14 @@ Symbol ns(llvm::StringRef Name);
// Create a C++20 concept symbol.
Symbol conceptSym(llvm::StringRef Name);
+// Create an Objective-C symbol.
+Symbol objcSym(llvm::StringRef Name, index::SymbolKind Kind,
+ llvm::StringRef USRPrefix);
+// Create an @interface or @implementation.
+Symbol objcClass(llvm::StringRef Name);
+// Create an @protocol.
+Symbol objcProtocol(llvm::StringRef Name);
+
// Create a slab of symbols with the given qualified names as IDs and names.
SymbolSlab generateSymbols(std::vector<std::string> QualifiedNames);
More information about the cfe-commits
mailing list