summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSam McCall <sam.mccall@gmail.com>2018-11-09 15:35:00 +0000
committerSam McCall <sam.mccall@gmail.com>2018-11-09 15:35:00 +0000
commit9ac2f7a1f826b0b72e6d86836d523808eaa3563c (patch)
tree1807211980684b796e1222ae5d4f7761e9910cde
parentf3cae3ab4c45ed95b5f1494b81e1fbe433d8ae74 (diff)
downloadbcm5719-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.cpp3
-rw-r--r--clang-tools-extra/unittests/clangd/ClangdUnitTests.cpp22
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
OpenPOWER on IntegriCloud