[PATCH] D150683: [clangd] Tweak "provides" hover card when symbols have the same name

Sam McCall via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue May 16 08:30:04 PDT 2023


sammccall created this revision.
sammccall added a reviewer: VitaNuo.
Herald added subscribers: kadircet, arphaman.
Herald added a project: All.
sammccall requested review of this revision.
Herald added subscribers: cfe-commits, MaskRay, ilya-biryukov.
Herald added a project: clang-tools-extra.

Previously for overloaded functions we'd show:

  Provides: foo, bar bar bar bar

The symbol name is duplicated

  ==> only show unique names, since we're not displaying the signature

Commas are missing

  ==> fix the logic which was checking for "last element" by value
      (though after the above fix this bug is dead anyway)

While here, remove a redundant bounds check before take_front().


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D150683

Files:
  clang-tools-extra/clangd/Hover.cpp
  clang-tools-extra/clangd/unittests/HoverTests.cpp


Index: clang-tools-extra/clangd/unittests/HoverTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/HoverTests.cpp
+++ clang-tools-extra/clangd/unittests/HoverTests.cpp
@@ -3052,6 +3052,7 @@
   } Cases[] = {{R"cpp(
                   #include ^"bar.h"
                   int fstBar = bar1();
+                  int another= bar1(0);
                   int sndBar = bar2();
                   Bar bar;
                   int macroBar = BAR;
@@ -3075,6 +3076,7 @@
                                           #define BAR 5
                                           int bar1();
                                           int bar2();
+                                          int bar1(double);
                                           class Bar {};
                                         )cpp");
     TU.AdditionalFiles["system/vector"] = guard(R"cpp(
@@ -3487,11 +3489,11 @@
       },
       {[](HoverInfo &HI) {
          HI.Name = "foo.h";
-         HI.UsedSymbolNames = {"Foo", "Bar", "Baz"};
+         HI.UsedSymbolNames = {"Foo", "Bar", "Bar"};
        },
        R"(foo.h
 
-provides Foo, Bar, Baz)"},
+provides Foo, Bar, Bar)"},
       {[](HoverInfo &HI) {
          HI.Name = "foo.h";
          HI.UsedSymbolNames = {"Foo", "Bar", "Baz", "Foobar", "Qux", "Quux"};
Index: clang-tools-extra/clangd/Hover.cpp
===================================================================
--- clang-tools-extra/clangd/Hover.cpp
+++ clang-tools-extra/clangd/Hover.cpp
@@ -1268,6 +1268,9 @@
   for (const auto &UsedSymbolDecl : UsedSymbols)
     HI.UsedSymbolNames.push_back(getSymbolName(UsedSymbolDecl));
   llvm::sort(HI.UsedSymbolNames);
+  HI.UsedSymbolNames.erase(
+      std::unique(HI.UsedSymbolNames.begin(), HI.UsedSymbolNames.end()),
+      HI.UsedSymbolNames.end());
 }
 
 } // namespace
@@ -1529,16 +1532,11 @@
     P.appendText("provides ");
 
     const std::vector<std::string>::size_type SymbolNamesLimit = 5;
-    auto Front =
-        llvm::ArrayRef(UsedSymbolNames)
-            .take_front(std::min(UsedSymbolNames.size(), SymbolNamesLimit));
-
-    for (const auto &Sym : Front) {
-      P.appendCode(Sym);
-      if (Sym != Front.back())
-        P.appendText(", ");
-    }
+    auto Front = llvm::ArrayRef(UsedSymbolNames).take_front(SymbolNamesLimit);
 
+    llvm::interleave(
+        Front, [&](llvm::StringRef Sym) { P.appendCode(Sym); },
+        [&] { P.appendText(", "); });
     if (UsedSymbolNames.size() > Front.size()) {
       P.appendText(" and ");
       P.appendText(std::to_string(UsedSymbolNames.size() - Front.size()));


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D150683.522640.patch
Type: text/x-patch
Size: 2618 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230516/c2386156/attachment.bin>


More information about the cfe-commits mailing list