diff options
author | Sam McCall <sam.mccall@gmail.com> | 2023-05-16 17:24:48 +0200 |
---|---|---|
committer | Sam McCall <sam.mccall@gmail.com> | 2023-05-17 20:25:42 +0200 |
commit | 0e66105a9260d80d58215c0c627f35e950c35b99 (patch) | |
tree | 6dcb79cdacd0c8ecef418d3b0c563f182890ee62 | |
parent | 8497dfdf5f35cc9c2f0e74762b34873eb3b1022d (diff) | |
download | llvm-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.cpp | 16 | ||||
-rw-r--r-- | clang-tools-extra/clangd/unittests/HoverTests.cpp | 6 |
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"}; |