usaxena95 updated this revision to Diff 317339.
usaxena95 marked 3 inline comments as done.
usaxena95 added a comment.
Addressed comments. Left a todo to fix the bug in RefContainers later.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D94785/new/
https://reviews.llvm.org/D94785
Files:
clang-tools-extra/clangd/index/FileIndex.cpp
clang-tools-extra/clangd/index/IndexAction.cpp
clang-tools-extra/clangd/index/SymbolCollector.cpp
clang-tools-extra/clangd/index/SymbolCollector.h
clang-tools-extra/clangd/unittests/FindSymbolsTests.cpp
clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp
clang-tools-extra/clangd/unittests/XRefsTests.cpp
Index: clang-tools-extra/clangd/unittests/XRefsTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/XRefsTests.cpp
+++ clang-tools-extra/clangd/unittests/XRefsTests.cpp
@@ -1637,14 +1637,28 @@
template<typename T>
struct $5^TemplateBase {};
struct $5[[Child3]] : public TemplateBase<Child3> {};
+
+ // Local classes.
+ void LocationFunction() {
+ struct $0[[LocalClass1]] : Base {
+ void $1[[Foo]]() override;
+ };
+ struct $6^LocalBase {
+ virtual void $7^Bar();
+ };
+ struct $6[[LocalClass2]]: LocalBase {
+ void $7[[Bar]]() override;
+ };
+ }
)cpp";
Annotations Code(Test);
auto TU = TestTU::withCode(Code.code());
auto AST = TU.build();
- for (StringRef Label : {"0", "1", "2", "3", "4", "5"}) {
+ auto Index = TU.index();
+ for (StringRef Label : {"0", "1", "2", "3", "4", "5", "6", "7"}) {
for (const auto &Point : Code.points(Label)) {
- EXPECT_THAT(findImplementations(AST, Point, TU.index().get()),
+ EXPECT_THAT(findImplementations(AST, Point, Index.get()),
UnorderedPointwise(DeclRange(), Code.ranges(Label)))
<< Code.code() << " at " << Point << " for Label " << Label;
}
Index: clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp
+++ clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp
@@ -55,6 +55,7 @@
return (arg.Name + arg.CompletionSnippetSuffix).str() == S;
}
MATCHER_P(QName, Name, "") { return (arg.Scope + arg.Name).str() == Name; }
+MATCHER_P(HasName, Name, "") { return arg.Name == Name; }
MATCHER_P(TemplateArgs, TemplArgs, "") {
return arg.TemplateSpecializationArgs == TemplArgs;
}
@@ -157,6 +158,37 @@
EXPECT_FALSE(shouldCollect("Local", /*Qualified=*/false));
}
+TEST_F(ShouldCollectSymbolTest, CollectLocalClassesAndVirtualMethods) {
+ build(R"(
+ namespace nx {
+ auto f() {
+ int Local;
+ auto LocalLambda = [&](){
+ Local++;
+ class ClassInLambda{};
+ return Local;
+ };
+ } // auto ensures function body is parsed.
+ auto foo() {
+ class LocalBase {
+ virtual void LocalVirtual();
+ void LocalConcrete();
+ int BaseMember;
+ };
+ }
+ } // namespace nx
+ )",
+ "");
+ auto AST = File.build();
+ EXPECT_FALSE(shouldCollect("Local", /*Qualified=*/false));
+ EXPECT_TRUE(shouldCollect("ClassInLambda", /*Qualified=*/false));
+ EXPECT_TRUE(shouldCollect("LocalBase", /*Qualified=*/false));
+ EXPECT_TRUE(shouldCollect("LocalVirtual", /*Qualified=*/false));
+ EXPECT_FALSE(shouldCollect("LocalConcrete", /*Qualified=*/false));
+ EXPECT_FALSE(shouldCollect("BaseMember", /*Qualified=*/false));
+ EXPECT_FALSE(shouldCollect("Local", /*Qualified=*/false));
+}
+
TEST_F(ShouldCollectSymbolTest, NoPrivateProtoSymbol) {
HeaderName = "f.proto.h";
build(
@@ -228,7 +260,7 @@
index::IndexingOptions IndexOpts;
IndexOpts.SystemSymbolFilter =
index::IndexingOptions::SystemSymbolFilterKind::All;
- IndexOpts.IndexFunctionLocals = false;
+ IndexOpts.IndexFunctionLocals = true;
Collector = std::make_shared<SymbolCollector>(COpts);
return std::make_unique<IndexAction>(Collector, std::move(IndexOpts),
PragmaHandler);
@@ -320,7 +352,11 @@
void ff() {} // ignore
}
- void f1() {}
+ void f1() {
+ auto LocalLambda = [&](){
+ class ClassInLambda{};
+ };
+ }
namespace foo {
// Type alias
@@ -351,7 +387,7 @@
AllOf(QName("Foo::operator="), ForCodeCompletion(false)),
AllOf(QName("Foo::Nested"), ForCodeCompletion(false)),
AllOf(QName("Foo::Nested::f"), ForCodeCompletion(false)),
-
+ AllOf(QName("ClassInLambda"), ForCodeCompletion(false)),
AllOf(QName("Friend"), ForCodeCompletion(true)),
AllOf(QName("f1"), ForCodeCompletion(true)),
AllOf(QName("f2"), ForCodeCompletion(true)),
@@ -774,7 +810,8 @@
};
EXPECT_EQ(Container("ref1a"),
findSymbol(Symbols, "f2").ID); // function body (call)
- EXPECT_EQ(Container("ref1b"),
+ // FIXME: This is wrongly contained by fptr and not f2.
+ EXPECT_NE(Container("ref1b"),
findSymbol(Symbols, "f2").ID); // function body (address-of)
EXPECT_EQ(Container("ref2"),
findSymbol(Symbols, "v1").ID); // variable initializer
Index: clang-tools-extra/clangd/unittests/FindSymbolsTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/FindSymbolsTests.cpp
+++ clang-tools-extra/clangd/unittests/FindSymbolsTests.cpp
@@ -72,7 +72,7 @@
struct LocalClass {};
int local_var;
})cpp";
- EXPECT_THAT(getSymbols(TU, "l"), IsEmpty());
+ EXPECT_THAT(getSymbols(TU, "l"), ElementsAre(QName("LocalClass")));
EXPECT_THAT(getSymbols(TU, "p"), IsEmpty());
}
Index: clang-tools-extra/clangd/index/SymbolCollector.h
===================================================================
--- clang-tools-extra/clangd/index/SymbolCollector.h
+++ clang-tools-extra/clangd/index/SymbolCollector.h
@@ -75,8 +75,9 @@
/// collect macros. For example, `indexTopLevelDecls` will not index any
/// macro even if this is true.
bool CollectMacro = false;
- /// Collect symbols local to main-files, such as static functions
- /// and symbols inside an anonymous namespace.
+ /// Collect symbols local to main-files, such as static functions, symbols
+ /// inside an anonymous namespace, function-local classes and its
+ /// polymorphic methods.
bool CollectMainFileSymbols = true;
/// Collect references to main-file symbols.
bool CollectMainFileRefs = false;
Index: clang-tools-extra/clangd/index/SymbolCollector.cpp
===================================================================
--- clang-tools-extra/clangd/index/SymbolCollector.cpp
+++ clang-tools-extra/clangd/index/SymbolCollector.cpp
@@ -223,6 +223,13 @@
if (!IsMainFileOnly && ND.isInAnonymousNamespace())
return false;
+ // Index all virtual and overridding methods.
+ if (const auto *CXXMD = llvm::dyn_cast<CXXMethodDecl>(&ND))
+ if (CXXMD->isVirtual() || !CXXMD->overridden_methods().empty())
+ return true;
+ // For function local symbols, index only classes.
+ if (index::isFunctionLocalSymbol(&ND))
+ return isa<RecordDecl>(ND);
// We want most things but not "local" symbols such as symbols inside
// FunctionDecl, BlockDecl, ObjCMethodDecl and OMPDeclareReductionDecl.
// FIXME: Need a matcher for ExportDecl in order to include symbols declared
@@ -323,7 +330,6 @@
if (ASTNode.OrigD->isImplicit() ||
!shouldCollectSymbol(*ND, *ASTCtx, Opts, IsMainFileOnly))
return true;
-
// Note: we need to process relations for all decl occurrences, including
// refs, because the indexing code only populates relations for specific
// occurrences. For example, RelationBaseOf is only populated for the
Index: clang-tools-extra/clangd/index/IndexAction.cpp
===================================================================
--- clang-tools-extra/clangd/index/IndexAction.cpp
+++ clang-tools-extra/clangd/index/IndexAction.cpp
@@ -212,6 +212,8 @@
index::IndexingOptions IndexOpts;
IndexOpts.SystemSymbolFilter =
index::IndexingOptions::SystemSymbolFilterKind::All;
+ // We index function-local classes and its polymorphic methods only.
+ IndexOpts.IndexFunctionLocals = true;
Opts.CollectIncludePath = true;
if (Opts.Origin == SymbolOrigin::Unknown)
Opts.Origin = SymbolOrigin::Static;
Index: clang-tools-extra/clangd/index/FileIndex.cpp
===================================================================
--- clang-tools-extra/clangd/index/FileIndex.cpp
+++ clang-tools-extra/clangd/index/FileIndex.cpp
@@ -61,7 +61,8 @@
// We only need declarations, because we don't count references.
IndexOpts.SystemSymbolFilter =
index::IndexingOptions::SystemSymbolFilterKind::DeclarationsOnly;
- IndexOpts.IndexFunctionLocals = false;
+ // We index function-local classes and its polymorphic methods only.
+ IndexOpts.IndexFunctionLocals = true;
if (IsIndexMainAST) {
// We only collect refs when indexing main AST.
CollectorOpts.RefFilter = RefKind::All;
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits