[clangd] Drop returntype/type when hovering over type-ish names

Summary:
Some names, e.g. constructor/destructor/conversions, already contain
the type info, no need to duplicate them in the hoverinfo.

Fixes https://github.com/clangd/clangd/issues/252

Reviewers: sammccall, ilya-biryukov

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

Tags: #clang

Differential Revision: https://reviews.llvm.org/D73110
This commit is contained in:
Kadir Cetinkaya 2020-01-21 16:49:32 +01:00
parent 1256d68093
commit 1fbb1d6df0
No known key found for this signature in database
GPG Key ID: E39E36B8D2057ED6
2 changed files with 21 additions and 15 deletions
clang-tools-extra/clangd

View File

@ -266,20 +266,19 @@ void fillFunctionTypeAndParams(HoverInfo &HI, const Decl *D,
}
}
if (const auto *CCD = llvm::dyn_cast<CXXConstructorDecl>(FD)) {
// Constructor's "return type" is the class type.
HI.ReturnType = declaredType(CCD->getParent()).getAsString(Policy);
// Don't provide any type for the constructor itself.
} else if (llvm::isa<CXXDestructorDecl>(FD)) {
HI.ReturnType = "void";
} else {
HI.ReturnType = printType(FD->getReturnType(), Policy);
// We don't want any type info, if name already contains it. This is true for
// constructors/destructors and conversion operators.
const auto NK = FD->getDeclName().getNameKind();
if (NK == DeclarationName::CXXConstructorName ||
NK == DeclarationName::CXXDestructorName ||
NK == DeclarationName::CXXConversionFunctionName)
return;
QualType QT = FD->getType();
if (const VarDecl *VD = llvm::dyn_cast<VarDecl>(D)) // Lambdas
QT = VD->getType().getDesugaredType(D->getASTContext());
HI.Type = printType(QT, Policy);
}
HI.ReturnType = printType(FD->getReturnType(), Policy);
QualType QT = FD->getType();
if (const VarDecl *VD = llvm::dyn_cast<VarDecl>(D)) // Lambdas
QT = VD->getType().getDesugaredType(D->getASTContext());
HI.Type = printType(QT, Policy);
// FIXME: handle variadics.
}

View File

@ -327,7 +327,6 @@ class Foo {})cpp";
HI.Name = "X";
HI.LocalScope = "X<T *>::"; // FIXME: X<T *, void>::
HI.Kind = index::SymbolKind::Constructor;
HI.ReturnType = "X<T *>";
HI.Definition = "X()";
HI.Parameters.emplace();
}},
@ -337,10 +336,18 @@ class Foo {})cpp";
HI.Name = "~X";
HI.LocalScope = "X::";
HI.Kind = index::SymbolKind::Destructor;
HI.ReturnType = "void";
HI.Definition = "~X()";
HI.Parameters.emplace();
}},
{"class X { operator [[in^t]](); };",
[](HoverInfo &HI) {
HI.NamespaceScope = "";
HI.Name = "operator int";
HI.LocalScope = "X::";
HI.Kind = index::SymbolKind::ConversionFunction;
HI.Definition = "operator int()";
HI.Parameters.emplace();
}},
// auto on lambda
{R"cpp(