diff --git a/clang-tools-extra/clangd/Hover.cpp b/clang-tools-extra/clangd/Hover.cpp --- a/clang-tools-extra/clangd/Hover.cpp +++ b/clang-tools-extra/clangd/Hover.cpp @@ -1058,20 +1058,24 @@ // - `bool param1` // - `int param2 = 5` Output.addParagraph().appendText("→ ").appendCode(*ReturnType); - if (Parameters && !Parameters->empty()) { - Output.addParagraph().appendText("Parameters: "); - markup::BulletList &L = Output.addBulletList(); - for (const auto &Param : *Parameters) { - std::string Buffer; - llvm::raw_string_ostream OS(Buffer); - OS << Param; - L.addItem().addParagraph().appendCode(std::move(OS.str())); - } + } + + if (Parameters && !Parameters->empty()) { + Output.addParagraph().appendText("Parameters: "); + markup::BulletList &L = Output.addBulletList(); + for (const auto &Param : *Parameters) { + std::string Buffer; + llvm::raw_string_ostream OS(Buffer); + OS << Param; + L.addItem().addParagraph().appendCode(std::move(OS.str())); } - } else if (Type) { - Output.addParagraph().appendText("Type: ").appendCode(*Type); } + // Don't print Type after Parameters or ReturnType as this will just duplicate + // the information + if (Type && !ReturnType && !Parameters) + Output.addParagraph().appendText("Type: ").appendCode(*Type); + if (Value) { markup::Paragraph &P = Output.addParagraph(); P.appendText("Value = "); diff --git a/clang-tools-extra/clangd/unittests/HoverTests.cpp b/clang-tools-extra/clangd/unittests/HoverTests.cpp --- a/clang-tools-extra/clangd/unittests/HoverTests.cpp +++ b/clang-tools-extra/clangd/unittests/HoverTests.cpp @@ -2680,6 +2680,32 @@ // In cls protected: int method())", + }, + { + [](HoverInfo &HI) { + HI.Definition = "cls(int a, int b = 5)"; + HI.AccessSpecifier = "public"; + HI.Kind = index::SymbolKind::Constructor; + HI.NamespaceScope = ""; + HI.LocalScope = "cls"; + HI.Name = "cls"; + HI.Parameters.emplace(); + HI.Parameters->emplace_back(); + HI.Parameters->back().Type = "int"; + HI.Parameters->back().Name = "a"; + HI.Parameters->emplace_back(); + HI.Parameters->back().Type = "int"; + HI.Parameters->back().Name = "b"; + HI.Parameters->back().Default = "5"; + }, + R"(constructor cls + +Parameters: +- int a +- int b = 5 + +// In cls +public: cls(int a, int b = 5))", }, { [](HoverInfo &HI) {