summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam McCall <sam.mccall@gmail.com>2023-05-16 17:24:48 +0200
committerSam McCall <sam.mccall@gmail.com>2023-05-17 20:25:42 +0200
commit0e66105a9260d80d58215c0c627f35e950c35b99 (patch)
tree6dcb79cdacd0c8ecef418d3b0c563f182890ee62
parent8497dfdf5f35cc9c2f0e74762b34873eb3b1022d (diff)
downloadllvm-0e66105a9260d80d58215c0c627f35e950c35b99.tar.gz
[clangd] Tweak "provides" hover card when symbols have the same name
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(). Differential Revision: https://reviews.llvm.org/D150683
-rw-r--r--clang-tools-extra/clangd/Hover.cpp16
-rw-r--r--clang-tools-extra/clangd/unittests/HoverTests.cpp6
2 files changed, 11 insertions, 11 deletions
diff --git a/clang-tools-extra/clangd/Hover.cpp b/clang-tools-extra/clangd/Hover.cpp
index de589e70f4af..d1f6f3a7b06c 100644
--- a/clang-tools-extra/clangd/Hover.cpp
+++ b/clang-tools-extra/clangd/Hover.cpp
@@ -1268,6 +1268,9 @@ void maybeAddUsedSymbols(ParsedAST &AST, HoverInfo &HI, const Inclusion &Inc) {
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 @@ markup::Document HoverInfo::present() const {
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()));
diff --git a/clang-tools-extra/clangd/unittests/HoverTests.cpp b/clang-tools-extra/clangd/unittests/HoverTests.cpp
index f95c94755993..135fdfc4c23b 100644
--- a/clang-tools-extra/clangd/unittests/HoverTests.cpp
+++ b/clang-tools-extra/clangd/unittests/HoverTests.cpp
@@ -3052,6 +3052,7 @@ TEST(Hover, UsedSymbols) {
} 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 @@ TEST(Hover, UsedSymbols) {
#define BAR 5
int bar1();
int bar2();
+ int bar1(double);
class Bar {};
)cpp");
TU.AdditionalFiles["system/vector"] = guard(R"cpp(
@@ -3487,11 +3489,11 @@ int foo = 3)",
},
{[](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"};