Author: Tom Praschan Date: 2023-04-28T21:46:32+02:00 New Revision: a7b4fd953f44b790f8832a5b57d7598bd12adfb2
URL: https://github.com/llvm/llvm-project/commit/a7b4fd953f44b790f8832a5b57d7598bd12adfb2 DIFF: https://github.com/llvm/llvm-project/commit/a7b4fd953f44b790f8832a5b57d7598bd12adfb2.diff LOG: [clangd] Hover: resolve forwarding parameters for CalleeArgInfo This uses the logic added in D124690 Differential Revision: https://reviews.llvm.org/D147846 Added: Modified: clang-tools-extra/clangd/Hover.cpp clang-tools-extra/clangd/unittests/HoverTests.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clangd/Hover.cpp b/clang-tools-extra/clangd/Hover.cpp index 3eb0900715744..f59642dbf721d 100644 --- a/clang-tools-extra/clangd/Hover.cpp +++ b/clang-tools-extra/clangd/Hover.cpp @@ -996,13 +996,15 @@ void maybeAddCalleeArgInfo(const SelectionTree::Node *N, HoverInfo &HI, HoverInfo::PassType PassType; + auto Parameters = resolveForwardingParameters(FD); + // Find argument index for N. - for (unsigned I = 0; I < CE->getNumArgs() && I < FD->getNumParams(); ++I) { + for (unsigned I = 0; I < CE->getNumArgs() && I < Parameters.size(); ++I) { if (CE->getArg(I) != OuterNode.ASTNode.get<Expr>()) continue; // Extract matching argument from function declaration. - if (const ParmVarDecl *PVD = FD->getParamDecl(I)) { + if (const ParmVarDecl *PVD = Parameters[I]) { HI.CalleeArgInfo.emplace(toHoverInfoParam(PVD, PP)); if (N == &OuterNode) PassType.PassBy = getPassMode(PVD->getType()); diff --git a/clang-tools-extra/clangd/unittests/HoverTests.cpp b/clang-tools-extra/clangd/unittests/HoverTests.cpp index 5ad9d69cb0dc2..5bf089fbbfeca 100644 --- a/clang-tools-extra/clangd/unittests/HoverTests.cpp +++ b/clang-tools-extra/clangd/unittests/HoverTests.cpp @@ -906,6 +906,35 @@ class Foo final {})cpp"; HI.CalleeArgInfo->Type = "int &"; HI.CallPassType = HoverInfo::PassType{PassMode::Ref, false}; }}, + {// make_unique-like function call + R"cpp( + struct Foo { + explicit Foo(int arg_a) {} + }; + template<class T, class... Args> + T make(Args&&... args) + { + return T(args...); + } + + void code() { + int a = 1; + auto foo = make<Foo>([[^a]]); + } + )cpp", + [](HoverInfo &HI) { + HI.Name = "a"; + HI.Kind = index::SymbolKind::Variable; + HI.NamespaceScope = ""; + HI.Definition = "int a = 1"; + HI.LocalScope = "code::"; + HI.Value = "1"; + HI.Type = "int"; + HI.CalleeArgInfo.emplace(); + HI.CalleeArgInfo->Name = "arg_a"; + HI.CalleeArgInfo->Type = "int"; + HI.CallPassType = HoverInfo::PassType{PassMode::Value, false}; + }}, { R"cpp( void foobar(const float &arg); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits