[PATCH] D75106: [clangd] Fix early selection for non-vardecl declarators
Kadir Cetinkaya via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Mar 4 01:46:22 PST 2020
kadircet updated this revision to Diff 248123.
kadircet marked 2 inline comments as done.
kadircet added a comment.
- Add the old test for hover over operator back.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D75106/new/
https://reviews.llvm.org/D75106
Files:
clang-tools-extra/clangd/Selection.cpp
clang-tools-extra/clangd/unittests/HoverTests.cpp
clang-tools-extra/clangd/unittests/SelectionTests.cpp
Index: clang-tools-extra/clangd/unittests/SelectionTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/SelectionTests.cpp
+++ clang-tools-extra/clangd/unittests/SelectionTests.cpp
@@ -375,6 +375,11 @@
int test(I *f) { return 42 + [[f.^foo]]; }
)cpp",
"ObjCPropertyRefExpr"},
+ {"struct foo { [[int has^h<:32:>]]; };", "FieldDecl"},
+ {"struct foo { [[op^erator int()]]; };", "CXXConversionDecl"},
+ {"struct foo { [[^~foo()]]; };", "CXXDestructorDecl"},
+ // FIXME: The following to should be class itself instead.
+ {"struct foo { [[fo^o(){}]] };", "CXXConstructorDecl"},
};
for (const Case &C : Cases) {
Annotations Test(C.Code);
Index: clang-tools-extra/clangd/unittests/HoverTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/HoverTests.cpp
+++ clang-tools-extra/clangd/unittests/HoverTests.cpp
@@ -339,7 +339,7 @@
HI.Definition = "~X()";
HI.Parameters.emplace();
}},
- {"class X { operator [[in^t]](); };",
+ {"class X { [[op^erator]] int(); };",
[](HoverInfo &HI) {
HI.NamespaceScope = "";
HI.Name = "operator int";
@@ -348,6 +348,13 @@
HI.Definition = "operator int()";
HI.Parameters.emplace();
}},
+ {"class X { operator [[^X]](); };",
+ [](HoverInfo &HI) {
+ HI.NamespaceScope = "";
+ HI.Name = "X";
+ HI.Kind = index::SymbolKind::Class;
+ HI.Definition = "class X {}";
+ }},
// auto on lambda
{R"cpp(
Index: clang-tools-extra/clangd/Selection.cpp
===================================================================
--- clang-tools-extra/clangd/Selection.cpp
+++ clang-tools-extra/clangd/Selection.cpp
@@ -10,6 +10,7 @@
#include "Logger.h"
#include "SourceCode.h"
#include "clang/AST/ASTTypeTraits.h"
+#include "clang/AST/Decl.h"
#include "clang/AST/DeclCXX.h"
#include "clang/AST/Expr.h"
#include "clang/AST/ExprCXX.h"
@@ -634,12 +635,22 @@
// Usually empty, but sometimes children cover tokens but shouldn't own them.
SourceRange earlySourceRange(const DynTypedNode &N) {
if (const Decl *D = N.get<Decl>()) {
+ // We want constructor name to be claimed by TypeLoc not the constructor
+ // itself. Similar for deduction guides, we rather want to select the
+ // underlying TypeLoc.
+ // FIXME: Unfortunately this doesn't work, even though RecursiveASTVisitor
+ // traverses the underlying TypeLoc inside DeclarationName, it is null for
+ // constructors.
+ if (isa<CXXConstructorDecl>(D) || isa<CXXDeductionGuideDecl>(D))
+ return SourceRange();
+ // This will capture Field, Function, MSProperty, NonTypeTemplateParm and
+ // VarDecls. We want the name in the declarator to be claimed by the decl
+ // and not by any children. For example:
// void [[foo]]();
- if (auto *FD = llvm::dyn_cast<FunctionDecl>(D))
- return FD->getNameInfo().getSourceRange();
// int (*[[s]])();
- else if (auto *VD = llvm::dyn_cast<VarDecl>(D))
- return VD->getLocation();
+ // struct X { int [[hash]] [32]; [[operator]] int();}
+ if (const auto *DD = llvm::dyn_cast<DeclaratorDecl>(D))
+ return DD->getLocation();
} else if (const auto *CCI = N.get<CXXCtorInitializer>()) {
// : [[b_]](42)
return CCI->getMemberLocation();
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D75106.248123.patch
Type: text/x-patch
Size: 3522 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200304/767bbb14/attachment-0001.bin>
More information about the cfe-commits
mailing list