ilya-biryukov requested changes to this revision. ilya-biryukov added a comment.
Looking forward to getting this change! I miss this as well. Please take a look at my comments, though. I think we might want to use a different API to implement this. ================ Comment at: clangd/ClangdServer.cpp:292 + std::shared_ptr<const PreambleData> StalePreamble = + Resources->getPossiblyStalePreamble(); + if (StalePreamble) ---------------- We can't use `getPossiblyStalePreamble()`, we want latest state of the `Preamble`. Use `getPreamble` instead. ================ Comment at: clangd/ClangdServer.cpp:294 + if (StalePreamble) + IncludeMap = StalePreamble->IncludeMap; + Resources->getAST().get()->runUnderLock( ---------------- We don't need to copy the whole map here, better add a method to `PreambleData` that does actual lookups for the source range. ================ Comment at: clangd/ClangdUnit.cpp:103 + void AfterExecute(CompilerInstance &CI) override { + const SourceManager &SM = CI.getSourceManager(); ---------------- There's a much better public API to get all includes that were encountered by the `Preprocessor`: we need to override `PPCallbacks ::InclusionDirective`. `PrecompiledPreamble` does not currently expose this callbacks, but could you add to `PreambleCallbacks` in a separate commit? ================ Comment at: clangd/ClangdUnit.cpp:151 std::vector<serialization::DeclID> TopLevelDeclIDs; + std::map<SourceLocation, std::string> IncludeMap; }; ---------------- Please use our descriptive `Path` typedef. ================ Comment at: clangd/ClangdUnit.cpp:834 + + for (auto it = IncludeMap.begin(); it != IncludeMap.end(); ++it) { + SourceLocation L = it->first; ---------------- Can we mix in the results from includes outside `DeclarationLocationsFinder`? ================ Comment at: clangd/ClangdUnit.h:136 std::vector<DiagWithFixIts> Diags; + std::map<SourceLocation, std::string> IncludeMap; }; ---------------- `std::unordered_map` is a better fit here, why not use it? ================ Comment at: clangd/ClangdUnit.h:136 std::vector<DiagWithFixIts> Diags; + std::map<SourceLocation, std::string> IncludeMap; }; ---------------- ilya-biryukov wrote: > `std::unordered_map` is a better fit here, why not use it? Using `SourceLocation` after `SourceManager` owning them dies is somewhat hacky. Please store clangd's `Range`s instead. You can get the ranges via `PPCallbacks` method `InclusionDirective`, it has a parameter `CharSourceRange FilenameRange`, exactly what we need here. ================ Comment at: unittests/clangd/ClangdTests.cpp:991 + #include "foo.h" + #include "invalid.h" + int b = a; ---------------- Some includes may come outside of preamble, I would expect current implementation to fail for this case: ``` #include <vector> // <-- works here // preamble ends here int main() { #include "my_include.h" // <-- does not work here } ``` https://reviews.llvm.org/D38639 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits