[clangd] Dont index ObjCCategoryDecls for completion

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
This commit is contained in:
Kadir Cetinkaya 2021-06-18 17:25:00 +02:00
parent 36b66ab9ed
commit 544d20eab6
No known key found for this signature in database
GPG Key ID: E39E36B8D2057ED6
3 changed files with 50 additions and 2 deletions

View File

@ -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"
@ -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;

View File

@ -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

View File

@ -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) {