Skip to content

Commit

Permalink
[clangd] show underlying type in type hint for decltype(expr)
Browse files Browse the repository at this point in the history
Reviewed By: nridge

Differential Revision: https://reviews.llvm.org/D140814
  • Loading branch information
v1nh1shungry authored and HighCommander4 committed Jan 3, 2023
1 parent 1fc0ad6 commit dde8a0f
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 4 deletions.
14 changes: 14 additions & 0 deletions clang-tools-extra/clangd/InlayHints.cpp
Expand Up @@ -662,7 +662,21 @@ class InlayHintVisitor : public RecursiveASTVisitor<InlayHintVisitor> {
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);
}

Expand Down
9 changes: 5 additions & 4 deletions clang-tools-extra/clangd/unittests/InlayHintTests.cpp
Expand Up @@ -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;
Expand All @@ -1377,11 +1376,13 @@ TEST(TypeHints, Decltype) {
template <class, class> 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) {
Expand Down

0 comments on commit dde8a0f

Please sign in to comment.