[clang-tools-extra] 257559e - [clangd] Function return type hints: support lambdas, don't duplicate "->"
Sam McCall via cfe-commits
cfe-commits at lists.llvm.org
Sat Feb 26 12:36:05 PST 2022
Author: Sam McCall
Date: 2022-02-26T21:28:09+01:00
New Revision: 257559ed9ab74c2dd3882075c45b4ae002256425
URL: https://github.com/llvm/llvm-project/commit/257559ed9ab74c2dd3882075c45b4ae002256425
DIFF: https://github.com/llvm/llvm-project/commit/257559ed9ab74c2dd3882075c45b4ae002256425.diff
LOG: [clangd] Function return type hints: support lambdas, don't duplicate "->"
While here, fix an ugliness:
auto foo()->auto { return 42; }
This (silly) code gains a "-> int" hint. While correct and useful, it renders as
auto foo()->int->auto { return 42; }
which is confusing enough to do more harm than good I think.
Differential Revision: https://reviews.llvm.org/D120416
Added:
Modified:
clang-tools-extra/clangd/InlayHints.cpp
clang-tools-extra/clangd/unittests/InlayHintTests.cpp
Removed:
################################################################################
diff --git a/clang-tools-extra/clangd/InlayHints.cpp b/clang-tools-extra/clangd/InlayHints.cpp
index 671f9a151d40f..2f9624f68af3e 100644
--- a/clang-tools-extra/clangd/InlayHints.cpp
+++ b/clang-tools-extra/clangd/InlayHints.cpp
@@ -254,17 +254,30 @@ class InlayHintVisitor : public RecursiveASTVisitor<InlayHintVisitor> {
}
bool VisitFunctionDecl(FunctionDecl *D) {
- if (auto *AT = D->getReturnType()->getContainedAutoType()) {
- QualType Deduced = AT->getDeducedType();
- if (!Deduced.isNull()) {
- addTypeHint(D->getFunctionTypeLoc().getRParenLoc(), D->getReturnType(),
- /*Prefix=*/"-> ");
- }
+ if (auto *FPT =
+ llvm::dyn_cast<FunctionProtoType>(D->getType().getTypePtr())) {
+ if (!FPT->hasTrailingReturn())
+ addReturnTypeHint(D, D->getFunctionTypeLoc().getRParenLoc());
}
+ return true;
+ }
+ bool VisitLambdaExpr(LambdaExpr *E) {
+ FunctionDecl *D = E->getCallOperator();
+ if (!E->hasExplicitResultType())
+ addReturnTypeHint(D, E->hasExplicitParameters()
+ ? D->getFunctionTypeLoc().getRParenLoc()
+ : E->getIntroducerRange().getEnd());
return true;
}
+ void addReturnTypeHint(FunctionDecl *D, SourceLocation Loc) {
+ auto *AT = D->getReturnType()->getContainedAutoType();
+ if (!AT || AT->getDeducedType().isNull())
+ return;
+ addTypeHint(Loc, D->getReturnType(), /*Prefix=*/"-> ");
+ }
+
bool VisitVarDecl(VarDecl *D) {
// Do not show hints for the aggregate in a structured binding,
// but show hints for the individual bindings.
diff --git a/clang-tools-extra/clangd/unittests/InlayHintTests.cpp b/clang-tools-extra/clangd/unittests/InlayHintTests.cpp
index 6c3ac0d62e0e5..d93a6e68a6ee8 100644
--- a/clang-tools-extra/clangd/unittests/InlayHintTests.cpp
+++ b/clang-tools-extra/clangd/unittests/InlayHintTests.cpp
@@ -527,13 +527,18 @@ TEST(TypeHints, Lambda) {
assertTypeHints(R"cpp(
void f() {
int cap = 42;
- auto $L[[L]] = [cap, $init[[init]] = 1 + 1](int a) {
+ auto $L[[L]] = [cap, $init[[init]] = 1 + 1](int a$ret[[)]] {
return a + cap + init;
};
}
)cpp",
ExpectedHint{": (lambda)", "L"},
- ExpectedHint{": int", "init"});
+ ExpectedHint{": int", "init"}, ExpectedHint{"-> int", "ret"});
+
+ // Lambda return hint shown even if no param list.
+ assertTypeHints("auto $L[[x]] = <:$ret[[:>]]{return 42;};",
+ ExpectedHint{": (lambda)", "L"},
+ ExpectedHint{"-> int", "ret"});
}
// Structured bindings tests.
@@ -616,6 +621,9 @@ TEST(TypeHints, ReturnTypeDeduction) {
// Do not hint `auto` for trailing return type.
auto f3() -> int;
+ // Do not hint when a trailing return type is specified.
+ auto f4() -> auto* { return "foo"; }
+
// `auto` conversion operator
struct A {
operator auto($retConv[[)]] { return 42; }
More information about the cfe-commits
mailing list