[PATCH] D54999: [clangd] Populate include graph during static indexing action.
Ilya Biryukov via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Nov 28 05:30:15 PST 2018
ilya-biryukov added inline comments.
================
Comment at: clangd/index/IndexAction.cpp:23
+// Collects the nodes and edges of include graph during indexing action.
+struct IncludeGraphCollector : public PPCallbacks {
+public:
----------------
Could we add an assertion that the final graph does not contain uninitialized nodes?
================
Comment at: clangd/index/IndexAction.cpp:28
+
+ // Populates the node for a new include.
+ void FileChanged(SourceLocation Loc, FileChangeReason Reason,
----------------
Maybe expand a bit on what a node is? I.e. mention file digests, URIs, etc.
================
Comment at: clangd/index/IndexAction.cpp:33
+ // We only need to process each file once. So we don't care about anything
+ // but enteries.
+ if (Reason != FileChangeReason::EnterFile)
----------------
s/enteries/entries
================
Comment at: clangd/index/IndexAction.cpp:44
+
+ auto &Node = I->getValue();
+ if (auto Digest = digestFile(SM, FileID))
----------------
Is there a way to check the node has already been populated? Can we do this and avoid recomputing the hashes for the same file/assert they're the same in assertion mode?
E.g. by looking at `URI.empty()`?
================
Comment at: clangd/index/IndexAction.cpp:45
+ auto &Node = I->getValue();
+ if (auto Digest = digestFile(SM, FileID))
+ Node.Digest = std::move(*Digest);
----------------
What happens if we can't compute a digest for a file? Are we left with an uninitialized memory?
================
Comment at: clangd/index/IndexAction.cpp:63
+
+ auto IncludingURI =
+ URIFromFileEntry(SM.getFileEntryForID(SM.getFileID(HashLoc)));
----------------
Maybe convert both URIs before adding anything to `IG`?
To make sure we don't change `IG` unless both URIs can be parsed
================
Comment at: clangd/index/IndexAction.cpp:72
+
+#ifndef NDEBUG
+ // Sanity check to ensure we have already populated a skipped file.
----------------
Maybe move the if block into the function body? To make sure we're be producing compiler errors on changes to the base function signature regardless of the compile configuration
================
Comment at: clangd/index/IndexAction.cpp:109
CI.getPreprocessor().addCommentHandler(PragmaHandler.get());
+ if (IncludeGraphCallback != nullptr)
+ CI.getPreprocessor().addPPCallbacks(
----------------
NIT: maybe remove `!= nullptr`? the callback is a function, not a pointer, so `nullptr` might be a bit confusing
================
Comment at: clangd/index/IndexAction.cpp:133
RefsCallback(Collector->takeRefs());
+ if (IncludeGraphCallback != nullptr)
+ IncludeGraphCallback(std::move(IG));
----------------
NIT: maybe remove `!= nullptr`?
================
Comment at: unittests/clangd/IndexActionTests.cpp:79
+ {testPath("level1_1.h"), "#include \"level2_1.h\""},
+ {testPath("level1_2.h"), "#include \"level2_2.h\""},
+ {testPath("level1_3.h"), "#include \"level2_3.h\""}};
----------------
Why 3 headers on each level? 1 or 2, would probably read a but simpler.
================
Comment at: unittests/clangd/IndexActionTests.cpp:104
+ EXPECT_TRUE(Main.IsTU);
+ EXPECT_EQ(Main.URI.data(), IG.find(PathToURI(MainFilePath))->getKeyData());
+
----------------
Directly looking at the graph to capture the include structure might be more straightforward, e.g.
```
EXPECT_THAT(graph,
UnorderedElementsAre(Pair(Main, IncludersAre("level1", ....)))
```
This won't work on `StringMap`, but converting to `std::map<string, node>` should be simple. Other invariants can be tested separately (e.g. values of `IsTU`)
Maybe try that?
================
Comment at: unittests/clangd/IndexActionTests.cpp:126
+}
+
+} // namespace
----------------
Could we also test a few corner cases?
- Self-includes (with and without include guards).
- Skipped files (multiple includes of the same file with `#pragma once` or include guards)
Repository:
rCTE Clang Tools Extra
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D54999/new/
https://reviews.llvm.org/D54999
More information about the cfe-commits
mailing list