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

Ilya Biryukov via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Feb 13 06:08:56 PST 2018


ilya-biryukov added inline comments.


================
Comment at: clangd/ClangdUnit.cpp:103
+
+    if (SourceMgr.isInMainFile(FilenameRange.getAsRange().getBegin())) {
+      // Only inclusion directives in the main file make sense. The user cannot
----------------
NIT: replace `FilenameRange.getAsRange()` with `SR`


================
Comment at: clangd/ClangdUnit.cpp:126
+
+  CppFilePreambleCallbacks() : SourceMgr(nullptr) {}
+
----------------
NIT: remove ctor, use initializer on the member instead:
```
private:
  SourceManager *SourceMgr = nullptr;
```


================
Comment at: clangd/ClangdUnit.cpp:160
+  SourceManager *SourceMgr;
+  InclusionLocations IncLocations;
 };
----------------
Maybe swap `IncLocations` and `SourceMgr`?  Grouping `TopLevelDecls`, `TopLevelDeclIDs` and `IncLocations` together seems reasonable, as all of them are essentially output parameters.


================
Comment at: clangd/ClangdUnit.cpp:296
   StoreDiagsConsumer UnitDiagsConsumer(/*ref*/ ASTDiags);
+  InclusionLocations IncLocations;
+  // Copy over the includes from the preamble, then combine with the
----------------
NIT: move `IncLocations` closer to their first use, i.e. create the variable right before `addPPCallbacks()`


================
Comment at: clangd/ClangdUnit.h:51
 
+using IncludeReferenceMap = std::unordered_map<Range, Path, RangeHash>;
+
----------------
malaperle wrote:
> ilya-biryukov wrote:
> > We use `unordered_map` as a `vector<pair<>>` here. (i.e. we never look up values by key, because we don't only the range, merely a point in the range)
> > Replace map with `vector<pair<>>` and remove `RangeHash` that we don't need anymore.
> Done. I also renamed, IncludeReferenceMap  to InclusionLocations. I thought I was more suitable.
LG


================
Comment at: clangd/ClangdUnit.h:105
+  const InclusionLocations &getInclusionLocations() const {
+    return IncLocations;
+  };
----------------
NIT: move to .cpp file to be consisten with other decls in this file.


================
Comment at: clangd/XRefs.cpp:171
+    Range R = IncludeLoc.first;
+    const SourceManager &SourceMgr = AST.getASTContext().getSourceManager();
+    Position Pos = sourceLocToPosition(SourceMgr, SourceLocationBeg);
----------------
NIT: `SourceMgr` does not depend on the loop variable, declare it out of the loop.


================
Comment at: clangd/XRefs.cpp:174
+
+    if (R.start.line == Pos.line && R.start.character <= Pos.character &&
+        Pos.character <= R.end.character) {
----------------
NIT: define `operator <=` for `Position` and do this instead: `R.start <= Pos && Pos < R.end` (note that LSP ranges are half-open, i.e. the end is excluded).
Even better: define a `bool contains(Position Pos) const` helper in the `Range` class and use it here (will abstract away to half-open nature of the range)


================
Comment at: clangd/XRefs.cpp:178
+                                        Range{Position{0, 0}, Position{0, 0}}});
+      return IncludeTargets;
+    }
----------------
Let's follow the pattern of decls and macros here. I.e. not return from the function, merely collect all the results.


================
Comment at: unittests/clangd/XRefsTests.cpp:53
 
+class IgnoreDiagnostics : public DiagnosticsConsumer {
+  void onDiagnosticsReady(
----------------
NIT: remove this class, use `IgnoreDiagnostics` from `Compiler.h` instead.


================
Comment at: unittests/clangd/XRefsTests.cpp:245
+  const char *SourceContents = R"cpp(
+  #include "$2^invalid.h"
+  #include "^foo.h"
----------------
Could we also add tests for corner cases: cursor before opening quote, cursor after the closing quote, cursor in the middle of `#include` token? (we shouldn't navigate anywhere in the middle of the #include token)


Repository:
  rCTE Clang Tools Extra

https://reviews.llvm.org/D38639





More information about the cfe-commits mailing list