[PATCH] D88297: [clangd] Trivial setter support when moving items to fields
Nathan James via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Sep 25 06:01:18 PDT 2020
njames93 created this revision.
njames93 added reviewers: sammccall, kadircet, hokein.
Herald added subscribers: cfe-commits, usaxena95, arphaman.
Herald added a project: clang.
njames93 requested review of this revision.
Herald added subscribers: MaskRay, ilya-biryukov.
Extend the Trivial setter documentation to support cases where the value is moved into a field using `std::move`.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D88297
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
@@ -698,6 +698,26 @@
HI.Parameters->back().Name = "v";
HI.AccessSpecifier = "public";
}},
+ {// Setter (move)
+ R"cpp(
+ namespace std { template<typename T> T&& move(T&& t); }
+ struct X { int Y; void [[^setY]](float v) { Y = std::move(v); } };
+ )cpp",
+ [](HoverInfo &HI) {
+ HI.Name = "setY";
+ HI.Kind = index::SymbolKind::InstanceMethod;
+ HI.NamespaceScope = "";
+ HI.Definition = "void setY(float v)";
+ HI.LocalScope = "X::";
+ HI.Documentation = "Trivial setter for `Y`.";
+ HI.Type = "void (float)";
+ HI.ReturnType = "void";
+ HI.Parameters.emplace();
+ HI.Parameters->emplace_back();
+ HI.Parameters->back().Type = "float";
+ HI.Parameters->back().Name = "v";
+ HI.AccessSpecifier = "public";
+ }},
{// Field type initializer.
R"cpp(
struct X { int x = 2; };
@@ -802,8 +822,8 @@
HI.Type = "int";
HI.AccessSpecifier = "public";
}},
- {// No crash on InitListExpr.
- R"cpp(
+ {// No crash on InitListExpr.
+ R"cpp(
struct Foo {
int a[10];
};
Index: clang-tools-extra/clangd/Hover.cpp
===================================================================
--- clang-tools-extra/clangd/Hover.cpp
+++ clang-tools-extra/clangd/Hover.cpp
@@ -455,6 +455,21 @@
} else {
return llvm::None;
}
+
+ // Detect the case when the item is moved into the field.
+ if (auto *CE = llvm::dyn_cast<CallExpr>(RHS->IgnoreCasts())) {
+ // Make sure we get the version of move with 1 arg, the other is for moving
+ // ranges.
+ if (CE->getNumArgs() != 1)
+ return llvm::None;
+ auto *ND = llvm::dyn_cast<NamedDecl>(CE->getCalleeDecl());
+ if (!ND)
+ return llvm::None;
+ if (ND->getName() != "move" || !ND->isInStdNamespace())
+ return llvm::None;
+ RHS = CE->getArg(0);
+ }
+
auto *DRE = llvm::dyn_cast<DeclRefExpr>(RHS->IgnoreCasts());
if (!DRE || DRE->getDecl() != Arg)
return llvm::None;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D88297.294290.patch
Type: text/x-patch
Size: 2365 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200925/2aa7f98f/attachment.bin>
More information about the cfe-commits
mailing list