Author: Nathan Ridge Date: 2021-06-21T01:13:00-04:00 New Revision: e37653da1399d846e02897680412139fdcde93ab
URL: https://github.com/llvm/llvm-project/commit/e37653da1399d846e02897680412139fdcde93ab DIFF: https://github.com/llvm/llvm-project/commit/e37653da1399d846e02897680412139fdcde93ab.diff LOG: [clangd] Type hints for C++14 return type deduction Differential Revision: https://reviews.llvm.org/D103789 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 d0e0e961abcf3..1002aee218477 100644 --- a/clang-tools-extra/clangd/InlayHints.cpp +++ b/clang-tools-extra/clangd/InlayHints.cpp @@ -72,6 +72,19 @@ class InlayHintVisitor : public RecursiveASTVisitor<InlayHintVisitor> { return true; } + bool VisitFunctionDecl(FunctionDecl *D) { + if (auto *AT = D->getReturnType()->getContainedAutoType()) { + QualType Deduced = AT->getDeducedType(); + if (!Deduced.isNull()) { + addInlayHint(D->getFunctionTypeLoc().getRParenLoc(), + InlayHintKind::TypeHint, + "-> " + D->getReturnType().getAsString(TypeHintPolicy)); + } + } + + return true; + } + bool VisitVarDecl(VarDecl *D) { // Do not show hints for the aggregate in a structured binding. // In the future, we may 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 3c5503448ab8f..2c5597e17e2f0 100644 --- a/clang-tools-extra/clangd/unittests/InlayHintTests.cpp +++ b/clang-tools-extra/clangd/unittests/InlayHintTests.cpp @@ -478,14 +478,31 @@ TEST(TypeHints, StructuredBindings) { } TEST(TypeHints, ReturnTypeDeduction) { - // FIXME: Not handled yet. - // This test is currently here mostly because a naive implementation - // might have us print something not super helpful like the function type. - assertTypeHints(R"cpp( - auto func(int x) { - return x + 1; - } - )cpp"); + assertTypeHints( + R"cpp( + auto f1(int x$ret1a[[)]]; // Hint forward declaration too + auto f1(int x$ret1b[[)]] { return x + 1; } + + // Include pointer operators in hint + int s; + auto& f2($ret2[[)]] { return s; } + + // Do not hint `auto` for trailing return type. + auto f3() -> int; + + // `auto` conversion operator + struct A { + operator auto($retConv[[)]] { return 42; } + }; + + // FIXME: Dependent types do not work yet. + template <typename T> + struct S { + auto method() { return T(); } + }; + )cpp", + ExpectedHint{"-> int", "ret1a"}, ExpectedHint{"-> int", "ret1b"}, + ExpectedHint{"-> int &", "ret2"}, ExpectedHint{"-> int", "retConv"}); } TEST(TypeHints, DependentType) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits