diff options
-rw-r--r-- | clang-tools-extra/clangd/ClangdUnit.cpp | 3 | ||||
-rw-r--r-- | clang-tools-extra/unittests/clangd/ClangdUnitTests.cpp | 22 |
2 files changed, 25 insertions, 0 deletions
diff --git a/clang-tools-extra/clangd/ClangdUnit.cpp b/clang-tools-extra/clangd/ClangdUnit.cpp index 7fdae21849e..eadd891826b 100644 --- a/clang-tools-extra/clangd/ClangdUnit.cpp +++ b/clang-tools-extra/clangd/ClangdUnit.cpp @@ -57,6 +57,9 @@ public: bool HandleTopLevelDecl(DeclGroupRef DG) override { for (Decl *D : DG) { + if (D->isFromASTFile()) + continue; + // ObjCMethodDecl are not actually top-level decls. if (isa<ObjCMethodDecl>(D)) continue; diff --git a/clang-tools-extra/unittests/clangd/ClangdUnitTests.cpp b/clang-tools-extra/unittests/clangd/ClangdUnitTests.cpp index c4171e16b33..d7961da2ac5 100644 --- a/clang-tools-extra/unittests/clangd/ClangdUnitTests.cpp +++ b/clang-tools-extra/unittests/clangd/ClangdUnitTests.cpp @@ -257,6 +257,28 @@ Bar* bar; } } +MATCHER_P(DeclNamed, Name, "") { + if (NamedDecl *ND = dyn_cast<NamedDecl>(arg)) + if (ND->getName() == Name) + return true; + if (auto *Stream = result_listener->stream()) { + llvm::raw_os_ostream OS(*Stream); + arg->dump(OS); + } + return false; +} + +TEST(ClangdUnitTest, TopLevelDecls) { + TestTU TU; + TU.HeaderCode = R"( + int header1(); + int header2; + )"; + TU.Code = "int main();"; + auto AST = TU.build(); + EXPECT_THAT(AST.getLocalTopLevelDecls(), ElementsAre(DeclNamed("main"))); +} + } // namespace } // namespace clangd } // namespace clang |