[PATCH] D120416: [clangd] Function return type hints: support lambdas, don't duplicate "->"

2022-02-26 Thread Sam McCall via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
sammccall marked an inline comment as done.
Closed by commit rG257559ed9ab7: [clangd] Function return type hints: support 
lambdas, dont duplicate - (authored by sammccall).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D120416/new/

https://reviews.llvm.org/D120416

Files:
  clang-tools-extra/clangd/InlayHints.cpp
  clang-tools-extra/clangd/unittests/InlayHintTests.cpp


Index: clang-tools-extra/clangd/unittests/InlayHintTests.cpp
===
--- clang-tools-extra/clangd/unittests/InlayHintTests.cpp
+++ clang-tools-extra/clangd/unittests/InlayHintTests.cpp
@@ -527,13 +527,18 @@
   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 @@
 // 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; }
Index: clang-tools-extra/clangd/InlayHints.cpp
===
--- clang-tools-extra/clangd/InlayHints.cpp
+++ clang-tools-extra/clangd/InlayHints.cpp
@@ -254,17 +254,30 @@
   }
 
   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(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.


Index: clang-tools-extra/clangd/unittests/InlayHintTests.cpp
===
--- clang-tools-extra/clangd/unittests/InlayHintTests.cpp
+++ clang-tools-extra/clangd/unittests/InlayHintTests.cpp
@@ -527,13 +527,18 @@
   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 @@
 // 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; }
Index: clang-tools-extra/clangd/InlayHints.cpp
===
--- clang-tools-extra/clangd/InlayHints.cpp
+++ clang-tools-extra/clangd/InlayHints.cpp
@@ -254,17 +254,30 @@
   }
 
   bool VisitFunctionDecl(FunctionDecl *D) {
-if (auto *AT = D->getReturnType()->getContainedAutoType()) {
-  QualType Deduced = AT->getDeducedType();
-  if (!Deduced.isNull()) {
-

[PATCH] D120416: [clangd] Function return type hints: support lambdas, don't duplicate "->"

2022-02-26 Thread Sam McCall via Phabricator via cfe-commits
sammccall marked 2 inline comments as done.
sammccall added inline comments.



Comment at: clang-tools-extra/clangd/unittests/InlayHintTests.cpp:626
+auto f4() -> auto* { return "foo"; }
+
 // `auto` conversion operator

Trass3r wrote:
> Should there be a test for `void` too or does it just work?
Added a test verifying that an auto-typed function/lambda with no return 
statements gets a `-> void` hint.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D120416/new/

https://reviews.llvm.org/D120416

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D120416: [clangd] Function return type hints: support lambdas, don't duplicate "->"

2022-02-23 Thread Trass3r via Phabricator via cfe-commits
Trass3r added inline comments.



Comment at: clang-tools-extra/clangd/unittests/InlayHintTests.cpp:626
+auto f4() -> auto* { return "foo"; }
+
 // `auto` conversion operator

Should there be a test for `void` too or does it just work?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D120416/new/

https://reviews.llvm.org/D120416

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D120416: [clangd] Function return type hints: support lambdas, don't duplicate "->"

2022-02-23 Thread Nathan Ridge via Phabricator via cfe-commits
nridge accepted this revision.
nridge added a comment.
This revision is now accepted and ready to land.

Nice!




Comment at: clang-tools-extra/clangd/unittests/InlayHintTests.cpp:539
+  // Lambda return hint shown even if no param list.
+  assertTypeHints("auto $L[[x]] = <:$ret[[:>]]{return 42;};",
+  ExpectedHint{": (lambda)", "L"},

Maybe add a comment like "use digraphs to place a literal `]` in an annotation 
range"


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D120416/new/

https://reviews.llvm.org/D120416

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D120416: [clangd] Function return type hints: support lambdas, don't duplicate "->"

2022-02-23 Thread Sam McCall via Phabricator via cfe-commits
sammccall created this revision.
sammccall added a reviewer: nridge.
Herald added subscribers: usaxena95, kadircet, arphaman, kristof.beyls.
sammccall requested review of this revision.
Herald added subscribers: cfe-commits, MaskRay, ilya-biryukov.
Herald added a project: clang-tools-extra.

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.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D120416

Files:
  clang-tools-extra/clangd/InlayHints.cpp
  clang-tools-extra/clangd/unittests/InlayHintTests.cpp


Index: clang-tools-extra/clangd/unittests/InlayHintTests.cpp
===
--- clang-tools-extra/clangd/unittests/InlayHintTests.cpp
+++ clang-tools-extra/clangd/unittests/InlayHintTests.cpp
@@ -527,13 +527,18 @@
   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 @@
 // 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; }
Index: clang-tools-extra/clangd/InlayHints.cpp
===
--- clang-tools-extra/clangd/InlayHints.cpp
+++ clang-tools-extra/clangd/InlayHints.cpp
@@ -254,17 +254,30 @@
   }
 
   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(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.


Index: clang-tools-extra/clangd/unittests/InlayHintTests.cpp
===
--- clang-tools-extra/clangd/unittests/InlayHintTests.cpp
+++ clang-tools-extra/clangd/unittests/InlayHintTests.cpp
@@ -527,13 +527,18 @@
   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 @@
 // 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; }
Index: clang-tools-extra/clangd/InlayHints.cpp
===
--- clang-tools-extra/clangd/InlayHints.cpp
+++ clang-tools-extra/clangd/InlayHints.cpp
@@