From dde8a0fe91ccd4b54d5bd0c18043e0dd35652e47 Mon Sep 17 00:00:00 2001 From: v1nh1shungry Date: Tue, 3 Jan 2023 03:12:39 -0500 Subject: [PATCH] [clangd] show underlying type in type hint for `decltype(expr)` Reviewed By: nridge Differential Revision: https://reviews.llvm.org/D140814 --- clang-tools-extra/clangd/InlayHints.cpp | 14 ++++++++++++++ clang-tools-extra/clangd/unittests/InlayHintTests.cpp | 9 +++++---- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/clang-tools-extra/clangd/InlayHints.cpp b/clang-tools-extra/clangd/InlayHints.cpp index 6bbad09..7af3965 100644 --- a/clang-tools-extra/clangd/InlayHints.cpp +++ b/clang-tools-extra/clangd/InlayHints.cpp @@ -662,7 +662,21 @@ private: sourceLocToPosition(SM, Spelled->back().endLocation())}; } + static bool shouldPrintCanonicalType(QualType QT) { + // The sugared type is more useful in some cases, and the canonical + // type in other cases. For now, prefer the sugared type unless + // we are printing `decltype(expr)`. This could be refined further + // (see https://github.com/clangd/clangd/issues/1298). + if (QT->isDecltypeType()) + return true; + if (const AutoType *AT = QT->getContainedAutoType()) + if (AT->getDeducedType()->isDecltypeType()) + return true; + return false; + } + void addTypeHint(SourceRange R, QualType T, llvm::StringRef Prefix) { + TypeHintPolicy.PrintCanonicalTypes = shouldPrintCanonicalType(T); addTypeHint(R, T, Prefix, TypeHintPolicy); } diff --git a/clang-tools-extra/clangd/unittests/InlayHintTests.cpp b/clang-tools-extra/clangd/unittests/InlayHintTests.cpp index fa90abe..53621f9 100644 --- a/clang-tools-extra/clangd/unittests/InlayHintTests.cpp +++ b/clang-tools-extra/clangd/unittests/InlayHintTests.cpp @@ -1364,7 +1364,6 @@ TEST(TypeHints, Aliased) { TEST(TypeHints, Decltype) { assertTypeHints(R"cpp( $a[[decltype(0)]] a; - // FIXME: will be nice to show `: int` instead $b[[decltype(a)]] b; const $c[[decltype(0)]] &c = b; @@ -1377,11 +1376,13 @@ TEST(TypeHints, Decltype) { template struct Foo; using G = Foo<$g[[decltype(0)]], float>; + + auto $h[[h]] = $i[[decltype(0)]]{}; )cpp", - ExpectedHint{": int", "a"}, - ExpectedHint{": decltype(0)", "b"}, + ExpectedHint{": int", "a"}, ExpectedHint{": int", "b"}, ExpectedHint{": int", "c"}, ExpectedHint{": int", "e"}, - ExpectedHint{": int", "f"}, ExpectedHint{": int", "g"}); + ExpectedHint{": int", "f"}, ExpectedHint{": int", "g"}, + ExpectedHint{": int", "h"}, ExpectedHint{": int", "i"}); } TEST(DesignatorHints, Basic) { -- 2.7.4