Skip to content

Commit

Permalink
[clangd] Simplify auto hover
Browse files Browse the repository at this point in the history
Summary:
Use helper from clang. Also fixes some weird corner cases, e.g.
    auto (*foo)() = bar;

Reviewers: kadircet, hokein

Reviewed By: kadircet, hokein

Subscribers: ioeric, MaskRay, jkorous, arphaman, cfe-commits

Differential Revision: https://reviews.llvm.org/D53347

llvm-svn: 345128
  • Loading branch information
ilya-biryukov committed Oct 24, 2018
1 parent e6f7b0b commit 5a74a9c
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 27 deletions.
36 changes: 9 additions & 27 deletions clang-tools-extra/clangd/XRefs.cpp
Expand Up @@ -585,17 +585,6 @@ class DeducedTypeVisitor : public RecursiveASTVisitor<DeducedTypeVisitor> {

Optional<QualType> getDeducedType() { return DeducedType; }

// Remove the surrounding Reference or Pointer type of the given type T.
QualType UnwrapReferenceOrPointer(QualType T) {
// "auto &" is represented as a ReferenceType containing an AutoType
if (const ReferenceType *RT = dyn_cast<ReferenceType>(T.getTypePtr()))
return RT->getPointeeType();
// "auto *" is represented as a PointerType containing an AutoType
if (const PointerType *PT = dyn_cast<PointerType>(T.getTypePtr()))
return PT->getPointeeType();
return T;
}

// Handle auto initializers:
//- auto i = 1;
//- decltype(auto) i = 1;
Expand All @@ -606,17 +595,9 @@ class DeducedTypeVisitor : public RecursiveASTVisitor<DeducedTypeVisitor> {
D->getTypeSourceInfo()->getTypeLoc().getBeginLoc() != SearchedLocation)
return true;

auto DeclT = UnwrapReferenceOrPointer(D->getType());
const AutoType *AT = dyn_cast<AutoType>(DeclT.getTypePtr());
if (AT && !AT->getDeducedType().isNull()) {
// For auto, use the underlying type because the const& would be
// represented twice: written in the code and in the hover.
// Example: "const auto I = 1", we only want "int" when hovering on auto,
// not "const int".
//
// For decltype(auto), take the type as is because it cannot be written
// with qualifiers or references but its decuded type can be const-ref.
DeducedType = AT->isDecltypeAuto() ? DeclT : DeclT.getUnqualifiedType();
if (auto *AT = D->getType()->getContainedAutoType()) {
if (!AT->getDeducedType().isNull())
DeducedType = AT->getDeducedType();
}
return true;
}
Expand All @@ -640,12 +621,13 @@ class DeducedTypeVisitor : public RecursiveASTVisitor<DeducedTypeVisitor> {
if (CurLoc != SearchedLocation)
return true;

auto T = UnwrapReferenceOrPointer(D->getReturnType());
const AutoType *AT = dyn_cast<AutoType>(T.getTypePtr());
const AutoType *AT = D->getReturnType()->getContainedAutoType();
if (AT && !AT->getDeducedType().isNull()) {
DeducedType = T.getUnqualifiedType();
} else { // auto in a trailing return type just points to a DecltypeType.
const DecltypeType *DT = dyn_cast<DecltypeType>(T.getTypePtr());
DeducedType = AT->getDeducedType();
} else {
// auto in a trailing return type just points to a DecltypeType and
// getContainedAutoType does not unwrap it.
const DecltypeType *DT = dyn_cast<DecltypeType>(D->getReturnType());
if (!DT->getUnderlyingType().isNull())
DeducedType = DT->getUnderlyingType();
}
Expand Down
7 changes: 7 additions & 0 deletions clang-tools-extra/unittests/clangd/XRefsTests.cpp
Expand Up @@ -999,6 +999,13 @@ TEST(Hover, All) {
)cpp",
"",
},
{
R"cpp(// More compilcated structured types.
int bar();
^auto (*foo)() = bar;
)cpp",
"int",
},
};

for (const OneTest &Test : Tests) {
Expand Down

0 comments on commit 5a74a9c

Please sign in to comment.