[PATCH] D147847: [clangd] Hover: Add CalleeArgInfo for constructor expressions
Tom Praschan via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Sat Apr 8 03:59:28 PDT 2023
tom-anders created this revision.
tom-anders added reviewers: nridge, sammccall.
Herald added subscribers: kadircet, arphaman.
Herald added a project: All.
tom-anders requested review of this revision.
Herald added subscribers: cfe-commits, MaskRay, ilya-biryukov.
Herald added a project: clang-tools-extra.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D147847
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
@@ -956,6 +956,29 @@
HI.CalleeArgInfo->Type = "const float &";
HI.CallPassType = HoverInfo::PassType{PassMode::Value, true};
}},
+ {
+ R"cpp(
+ struct Foo {
+ explicit Foo(const float& arg) {}
+ };
+ int main() {
+ int a = 0;
+ Foo foo([[^a]]);
+ }
+ )cpp",
+ [](HoverInfo &HI) {
+ HI.Name = "a";
+ HI.Kind = index::SymbolKind::Variable;
+ HI.NamespaceScope = "";
+ HI.Definition = "int a = 0";
+ HI.LocalScope = "main::";
+ HI.Value = "0";
+ HI.Type = "int";
+ HI.CalleeArgInfo.emplace();
+ HI.CalleeArgInfo->Name = "arg";
+ HI.CalleeArgInfo->Type = "const float &";
+ HI.CallPassType = HoverInfo::PassType{PassMode::Value, true};
+ }},
{// Literal passed to function call
R"cpp(
void fun(int arg_a, const int &arg_b) {};
@@ -1342,6 +1365,7 @@
CustomClass(const Base &x) {}
CustomClass(int &x) {}
CustomClass(float x) {}
+ CustomClass(int x, int y) {}
};
void int_by_ref(int &x) {}
@@ -1388,6 +1412,11 @@
{"base_by_ref([[^derived]]);", PassMode::Ref, false},
{"base_by_const_ref([[^derived]]);", PassMode::ConstRef, false},
{"base_by_value([[^derived]]);", PassMode::Value, false},
+ // Custom class constructor tests
+ {"CustomClass c1([[^base]]);", PassMode::ConstRef, false},
+ {"auto c2 = new CustomClass([[^base]]);", PassMode::ConstRef, false},
+ {"CustomClass c3([[^int_x]]);", PassMode::Ref, false},
+ {"CustomClass c3(int_x, [[^int_x]]);", PassMode::Value, false},
// Converted tests
{"float_by_value([[^int_x]]);", PassMode::Value, true},
{"float_by_value([[^int_ref]]);", PassMode::Value, true},
Index: clang-tools-extra/clangd/Hover.cpp
===================================================================
--- clang-tools-extra/clangd/Hover.cpp
+++ clang-tools-extra/clangd/Hover.cpp
@@ -981,10 +981,21 @@
const auto &OuterNode = N->outerImplicit();
if (!OuterNode.Parent)
return;
- const auto *CE = OuterNode.Parent->ASTNode.get<CallExpr>();
- if (!CE)
+
+ const FunctionDecl *FD = nullptr;
+ llvm::SmallVector<const Expr*> Args;
+
+ if (const auto *CE = OuterNode.Parent->ASTNode.get<CallExpr>()) {
+ FD = CE->getDirectCallee();
+ Args = {CE->arg_begin(), CE->arg_end()};
+ } else if (const auto *CE =
+ OuterNode.Parent->ASTNode.get<CXXConstructExpr>()) {
+ FD = CE->getConstructor();
+ Args = {CE->arg_begin(), CE->arg_end()};
+ }
+ if (!FD)
return;
- const FunctionDecl *FD = CE->getDirectCallee();
+
// For non-function-call-like operatators (e.g. operator+, operator<<) it's
// not immediattely obvious what the "passed as" would refer to and, given
// fixed function signature, the value would be very low anyway, so we choose
@@ -999,8 +1010,8 @@
auto Parameters = resolveForwardingParameters(FD);
// Find argument index for N.
- for (unsigned I = 0; I < CE->getNumArgs() && I < Parameters.size(); ++I) {
- if (CE->getArg(I) != OuterNode.ASTNode.get<Expr>())
+ for (unsigned I = 0; I < Args.size() && I < Parameters.size(); ++I) {
+ if (Args[I] != OuterNode.ASTNode.get<Expr>())
continue;
// Extract matching argument from function declaration.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D147847.511876.patch
Type: text/x-patch
Size: 3666 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230408/3b8ce1ef/attachment.bin>
More information about the cfe-commits
mailing list