[clangd] show underlying type in type hint for `decltype(expr)`
authorv1nh1shungry <v1nh1shungry@outlook.com>
Tue, 3 Jan 2023 08:12:39 +0000 (03:12 -0500)
committerNathan Ridge <zeratul976@hotmail.com>
Tue, 3 Jan 2023 18:58:39 +0000 (13:58 -0500)
Reviewed By: nridge

Differential Revision: https://reviews.llvm.org/D140814

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

index 6bbad09..7af3965 100644 (file)
@@ -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);
   }
 
index fa90abe..53621f9 100644 (file)
@@ -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 <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) {