[PATCH] D38639: [clangd] #include statements support for Open definition

Ilya Biryukov via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Dec 20 10:17:16 PST 2017


ilya-biryukov requested changes to this revision.
ilya-biryukov added a comment.
This revision now requires changes to proceed.

Another round of review



================
Comment at: clangd/ClangdUnit.cpp:113
 
+  CppFilePreambleCallbacks(IncludeReferenceMap &IRM)
+      : IRM(IRM) {}
----------------
ilya-biryukov wrote:
> Let's create a new empty map inside this class and have a `takeIncludeReferences` method (similar to `TopLevelDeclIDs` and `takeTopLevelDeclIDs`)
This comment is not addressed yet, but marked as done.


================
Comment at: clangd/ClangdUnit.cpp:147
+  IncludeReferenceMap &IRM;
+  std::vector<std::pair<SourceRange, std::string>> TempPreambleIncludeLocations;
 };
----------------
Nebiroth wrote:
> ilya-biryukov wrote:
> > We should have `SourceMgr` at all the proper places now, let's store `IncludeReferenceMap` directly
> The idea was to pass a single map around to fill with every reference instead of having separate maps being merged together.
You copy the map for preamble and then append to it in `CppFilePreambleCallbacks`? That also LG, we should not have many references there anyway.


================
Comment at: clangd/ClangdUnit.cpp:281
+                 IntrusiveRefCntPtr<vfs::FileSystem> VFS,
+                 IncludeReferenceMap IRM) {
 
----------------
Nebiroth wrote:
> ilya-biryukov wrote:
> > What reference does this `IncludeReferenceMap` contain? Includes from the preamble? 
> This should contain every reference available for one file.
Thanks for clarifying, LG.


================
Comment at: clangd/ClangdUnit.cpp:141
+  std::unique_ptr<PPCallbacks> createPPCallbacks() {
+    return llvm::make_unique<IncludeRefsCollector>(*SourceMgr, IRM);
+  }
----------------
Maybe add `assert(SourceMgr && "SourceMgr must be set at this point")` here?


================
Comment at: clangd/ClangdUnit.cpp:281
+    std::shared_ptr<PCHContainerOperations> PCHs,
+    IntrusiveRefCntPtr<vfs::FileSystem> VFS, IncludeReferenceMap IRM) {
 
----------------
Don't we already store the map we need in `PreambleData`? Why do we need an extra `IRM` parameter?


================
Comment at: clangd/ClangdUnit.h:276
+std::vector<Location>
+findDefinitions(const Context &Ctx, ParsedAST &AST, Position Pos);
+
----------------
ilya-biryukov wrote:
> This function moved without need and lost a comment.
Now we have duplicated definitions here. Bad merge?


================
Comment at: clangd/CodeComplete.cpp:328
                                   unsigned NumResults) override final {
-    if (auto SS = Context.getCXXScopeSpecifier())
-      CompletedName.SSInfo = extraCompletionScope(S, **SS);
+//    if (auto SS = Context.getCXXScopeSpecifier())
+//      CompletedName.SSInfo = extraCompletionScope(S, **SS);
----------------
Accidental change?


================
Comment at: clangd/CodeComplete.cpp:807
   // Enable index-based code completion when Index is provided.
-  Result.IncludeNamespaceLevelDecls = !Index;
+  // Result.IncludeNamespaceLevelDecls = !Index;
 
----------------
Accidental change?


================
Comment at: clangd/XRefs.cpp:41
 
+  std::vector<Location> takeLocations() {
+    // Don't keep the same location multiple times.
----------------
We don't need locations anymore. Remove them.


================
Comment at: clangd/XRefs.cpp:177
 
+  std::vector<Location> IRMResult;
+  if (!AST.getIRM().empty()) {
----------------
Probably a good place for a comment. Also, maybe rename local var to something easier to understand like `IncludeDefinitions`
```
/// Process targets for paths inside #include directive.
std::vector<Location> IncludeTargets;
```


================
Comment at: clangd/XRefs.cpp:178
+  std::vector<Location> IRMResult;
+  if (!AST.getIRM().empty()) {
+    for (auto &IncludeLoc : AST.getIRM()) {
----------------
No need to special case empty maps, remove the if altogether.


================
Comment at: clangd/XRefs.cpp:183
+      unsigned CharNumber = SourceMgr.getSpellingColumnNumber(
+          DeclMacrosFinder->getSearchedLocation());
+
----------------
Replace with `DeclMacrosFinder->getSearchedLocation()` `SourceLocationBeg`, it makes the code easier to read.


================
Comment at: clangd/XRefs.cpp:185
+
+      if ((unsigned)R.start.line ==
+              SourceMgr.getSpellingLineNumber(
----------------
why do we need to convert to unsigned? To slience compiler warnings?


================
Comment at: clangd/XRefs.cpp:188
+                  DeclMacrosFinder->getSearchedLocation()) &&
+          ((unsigned)R.start.character >= CharNumber &&
+           CharNumber <= (unsigned)R.end.character)) {
----------------
this should be `R.start.charater <= CharNumber && CharNumber <= R.end.character`


Repository:
  rCTE Clang Tools Extra

https://reviews.llvm.org/D38639





More information about the cfe-commits mailing list