Skip to content

Commit

Permalink
[clangd] Dont index ObjCCategoryDecls for completion
Browse files Browse the repository at this point in the history
They are already provided by Sema, deserializing from preamble if need
be. Moreover category names are meaningless outside interface/implementation
context, hence they were only causing noise.

Differential Revision: https://reviews.llvm.org/D104540
  • Loading branch information
kadircet committed Jun 22, 2021
1 parent 36b66ab commit 544d20e
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 2 deletions.
8 changes: 8 additions & 0 deletions clang-tools-extra/clangd/CodeComplete.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/Error.h"
Expand Down Expand Up @@ -1910,6 +1911,13 @@ bool isIndexedForCodeCompletion(const NamedDecl &ND, ASTContext &ASTCtx) {
if (isExplicitTemplateSpecialization(&ND))
return false;

// Category decls are not useful on their own outside the interface or
// implementation blocks. Moreover, sema already provides completion for
// these, even if it requires preamble deserialization. So by excluding them
// from the index, we reduce the noise in all the other completion scopes.
if (llvm::isa<ObjCCategoryDecl>(&ND) || llvm::isa<ObjCCategoryImplDecl>(&ND))
return false;

if (InTopLevelScope(ND))
return true;

Expand Down
39 changes: 39 additions & 0 deletions clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3221,6 +3221,45 @@ TEST(CompletionTest, NoCrashDueToMacroOrdering) {
UnorderedElementsAre(Labeled("ECHO(X)"), Labeled("ECHO2(X)")));
}

TEST(CompletionTest, ObjCCategoryDecls) {
TestTU TU;
TU.ExtraArgs.push_back("-xobjective-c");
TU.HeaderCode = R"objc(
@interface Foo
@end
@interface Foo (FooExt1)
@end
@interface Foo (FooExt2)
@end
@interface Bar
@end
@interface Bar (BarExt)
@end)objc";

{
Annotations Test(R"objc(
@implementation Foo (^)
@end
)objc");
TU.Code = Test.code().str();
auto Results = completions(TU, Test.point());
EXPECT_THAT(Results.Completions,
UnorderedElementsAre(Labeled("FooExt1"), Labeled("FooExt2")));
}
{
Annotations Test(R"objc(
@interface Foo (^)
@end
)objc");
TU.Code = Test.code().str();
auto Results = completions(TU, Test.point());
EXPECT_THAT(Results.Completions, UnorderedElementsAre(Labeled("BarExt")));
}
}
} // namespace
} // namespace clangd
} // namespace clang
5 changes: 3 additions & 2 deletions clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -552,8 +552,9 @@ TEST_F(SymbolCollectorTest, ObjCSymbols) {
EXPECT_THAT(Symbols,
UnorderedElementsAre(
QName("Person"), QName("Person::someMethodName:lastName:"),
QName("MyCategory"), QName("Person::someMethodName2:"),
QName("MyProtocol"), QName("MyProtocol::someMethodName3:")));
AllOf(QName("MyCategory"), ForCodeCompletion(false)),
QName("Person::someMethodName2:"), QName("MyProtocol"),
QName("MyProtocol::someMethodName3:")));
}

TEST_F(SymbolCollectorTest, ObjCPropertyImpl) {
Expand Down

0 comments on commit 544d20e

Please sign in to comment.