[PATCH] D63818: [clangd] Collect the refs when the main file is header.
Haojian Wu via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Jul 2 02:18:23 PDT 2019
This revision was automatically updated to reflect the committed changes.
Closed by commit rL364893: [clangd] Collect the refs when the main file is header. (authored by hokein, committed by ).
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
Changed prior to commit:
https://reviews.llvm.org/D63818?vs=206644&id=207490#toc
Repository:
rL LLVM
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D63818/new/
https://reviews.llvm.org/D63818
Files:
clang-tools-extra/trunk/clangd/index/SymbolCollector.cpp
clang-tools-extra/trunk/clangd/index/SymbolCollector.h
clang-tools-extra/trunk/clangd/unittests/SymbolCollectorTests.cpp
Index: clang-tools-extra/trunk/clangd/unittests/SymbolCollectorTests.cpp
===================================================================
--- clang-tools-extra/trunk/clangd/unittests/SymbolCollectorTests.cpp
+++ clang-tools-extra/trunk/clangd/unittests/SymbolCollectorTests.cpp
@@ -626,6 +626,33 @@
EXPECT_THAT(Refs, Not(Contains(Pair(findSymbol(MainSymbols, "c").ID, _))));
}
+
+TEST_F(SymbolCollectorTest, HeaderAsMainFile) {
+ CollectorOpts.RefFilter = RefKind::All;
+ Annotations Header(R"(
+ class $Foo[[Foo]] {};
+
+ void $Func[[Func]]() {
+ $Foo[[Foo]] fo;
+ }
+ )");
+ // The main file is normal .cpp file, we shouldn't collect any refs of symbols
+ // which are not declared in the preamble.
+ TestFileName = testPath("foo.cpp");
+ runSymbolCollector("", Header.code());
+ EXPECT_THAT(Refs, UnorderedElementsAre());
+
+ // Run the .h file as main file, we should collect the refs.
+ TestFileName = testPath("foo.h");
+ runSymbolCollector("", Header.code(),
+ /*ExtraArgs=*/{"-xobjective-c++-header"});
+ EXPECT_THAT(Symbols, UnorderedElementsAre(QName("Foo"), QName("Func")));
+ EXPECT_THAT(Refs, UnorderedElementsAre(Pair(findSymbol(Symbols, "Foo").ID,
+ HaveRanges(Header.ranges("Foo"))),
+ Pair(findSymbol(Symbols, "Func").ID,
+ HaveRanges(Header.ranges("Func")))));
+}
+
TEST_F(SymbolCollectorTest, RefsInHeaders) {
CollectorOpts.RefFilter = RefKind::All;
CollectorOpts.RefsInHeaders = true;
Index: clang-tools-extra/trunk/clangd/index/SymbolCollector.h
===================================================================
--- clang-tools-extra/trunk/clangd/index/SymbolCollector.h
+++ clang-tools-extra/trunk/clangd/index/SymbolCollector.h
@@ -134,9 +134,10 @@
void setIncludeLocation(const Symbol &S, SourceLocation);
// Indexed macros, to be erased if they turned out to be include guards.
llvm::DenseSet<const IdentifierInfo *> IndexedMacros;
- // All refs collected from the AST.
- // Only symbols declared in preamble (from #include) and referenced from the
- // main file will be included.
+ // All refs collected from the AST. It includes:
+ // 1) symbols declared in the preamble and referenced from the main file (
+ // which is not a header), or
+ // 2) symbols declared and referenced from the main file (which is a header)
RefSlab::Builder Refs;
// All relations collected from the AST.
RelationSlab::Builder Relations;
Index: clang-tools-extra/trunk/clangd/index/SymbolCollector.cpp
===================================================================
--- clang-tools-extra/trunk/clangd/index/SymbolCollector.cpp
+++ clang-tools-extra/trunk/clangd/index/SymbolCollector.cpp
@@ -314,10 +314,12 @@
if (IsOnlyRef && !CollectRef)
return true;
- // ND is the canonical (i.e. first) declaration. If it's in the main file,
- // then no public declaration was visible, so assume it's main-file only.
+ // ND is the canonical (i.e. first) declaration. If it's in the main file
+ // (which is not a header), then no public declaration was visible, so assume
+ // it's main-file only.
bool IsMainFileOnly =
- SM.isWrittenInMainFile(SM.getExpansionLoc(ND->getBeginLoc()));
+ SM.isWrittenInMainFile(SM.getExpansionLoc(ND->getBeginLoc())) &&
+ !ASTCtx->getLangOpts().IsHeaderFile;
// In C, printf is a redecl of an implicit builtin! So check OrigD instead.
if (ASTNode.OrigD->isImplicit() ||
!shouldCollectSymbol(*ND, *ASTCtx, Opts, IsMainFileOnly))
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D63818.207490.patch
Type: text/x-patch
Size: 3589 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190702/cc0c0da6/attachment-0001.bin>
More information about the cfe-commits
mailing list