diff options
author | Sam McCall <sam.mccall@gmail.com> | 2018-11-09 15:35:00 +0000 |
---|---|---|
committer | Sam McCall <sam.mccall@gmail.com> | 2018-11-09 15:35:00 +0000 |
commit | 9ac2f7a1f826b0b72e6d86836d523808eaa3563c (patch) | |
tree | 1807211980684b796e1222ae5d4f7761e9910cde | |
parent | f3cae3ab4c45ed95b5f1494b81e1fbe433d8ae74 (diff) | |
download | bcm5719-llvm-9ac2f7a1f826b0b72e6d86836d523808eaa3563c.tar.gz bcm5719-llvm-9ac2f7a1f826b0b72e6d86836d523808eaa3563c.zip |
[clangd] Don't treat top-level decls as "local" if they are from the preamble.
Summary:
These get passed to HandleTopLevelDecl() if they happen to have been
deserialized for any reason. We don't want to treat them as part of the
main file.
Reviewers: ilya-biryukov
Subscribers: ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D54303
llvm-svn: 346503
-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 |