[PATCH] D137894: [clangd] Add extension for adding context (enclosing function or class) in references results

Nathan Ridge via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Dec 14 00:42:07 PST 2022


nridge added inline comments.


================
Comment at: clang-tools-extra/clangd/XRefs.cpp:1426
+      LookupRequest ContainerLookup;
+      llvm::DenseMap<SymbolID, size_t> RefIndexForContainer;
       Index->relations(OverriddenBy, [&](const SymbolID &Subject,
----------------
Unlike the QueryIndex case, I think multiple references having the same container does not apply here (different overrides will be contained in different classes), but it's worth adding a comment to clarify that.


================
Comment at: clang-tools-extra/clangd/XRefs.cpp:1484
+    LookupRequest ContainerLookup;
+    llvm::DenseMap<SymbolID, size_t> RefIndexForContainer;
     Results.HasMore |= Index->refs(Req, [&](const Ref &R) {
----------------
We can have multiple references with the same container (e.g. multiple references in the same function), so I think we need `DenseMap<SymbolID, std::vector<size_t>>` here.


================
Comment at: clang-tools-extra/clangd/XRefs.cpp:1501
       }
+      SymbolID Container = R.Container;
+      ContainerLookup.IDs.insert(Container);
----------------
For good measure, perhaps condition the container-related logic here on `AddContext`?


================
Comment at: clang-tools-extra/clangd/unittests/XRefsTests.cpp:2188
         };
-        void test(Derived* D) {
+        void test(Derived* D, Base* B) {
           D->func();  // No references to the overrides.
----------------
Did you mean to add a call to `B->func()` as well here?


================
Comment at: clang-tools-extra/clangd/unittests/XRefsTests.cpp:2238
   for (const auto &R : Code.ranges())
     ExpectedLocations.push_back(rangeIs(R));
   EXPECT_THAT(findReferences(AST, Code.point(), 0).References,
----------------
Did you mean to test the payload here?


================
Comment at: clang-tools-extra/clangd/unittests/XRefsTests.cpp:2310
+    int $decl[[foo]]() { return 42; }
+    void bar() { $bar(bar)[[foo]](); }
+    struct S { void bar() { $S(S::bar)[[foo]](); } };
----------------
nit: the payloads aren't actually used here


================
Comment at: clang-tools-extra/clangd/unittests/XRefsTests.cpp:2357
+  EXPECT_THAT(findReferences(AST, Main.point(), 0, /*Index=*/nullptr,
+                             /*AddContext*/ true)
+                  .References,
----------------
nit: we're not actually using the context


================
Comment at: clang-tools-extra/clangd/unittests/XRefsTests.cpp:2376
+  auto LimitRefs = findReferences(AST, Main.point(), /*Limit*/ 1,
+                                  IndexedTU.index().get(), /*AddContext*/ true);
   EXPECT_EQ(1u, LimitRefs.References.size());
----------------
likewise


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D137894/new/

https://reviews.llvm.org/D137894



More information about the cfe-commits mailing list