diff --git a/clang-tools-extra/clangd/InlayHints.cpp b/clang-tools-extra/clangd/InlayHints.cpp --- a/clang-tools-extra/clangd/InlayHints.cpp +++ b/clang-tools-extra/clangd/InlayHints.cpp @@ -331,8 +331,9 @@ if (!T.getTypePtrOrNull()) return; - addInlayHint(R, InlayHintKind::TypeHint, - std::string(Prefix) + T.getAsString(TypeHintPolicy)); + std::string TypeName = T.getAsString(TypeHintPolicy); + if (TypeName.length() < TypeNameLimit) + addInlayHint(R, InlayHintKind::TypeHint, std::string(Prefix) + TypeName); } std::vector &Results; @@ -341,6 +342,8 @@ StringRef MainFileBuf; const HeuristicResolver *Resolver; PrintingPolicy TypeHintPolicy; + + static const size_t TypeNameLimit = 32; }; std::vector inlayHints(ParsedAST &AST) { diff --git a/clang-tools-extra/clangd/unittests/InlayHintTests.cpp b/clang-tools-extra/clangd/unittests/InlayHintTests.cpp --- a/clang-tools-extra/clangd/unittests/InlayHintTests.cpp +++ b/clang-tools-extra/clangd/unittests/InlayHintTests.cpp @@ -591,6 +591,17 @@ )cpp"); } +TEST(TypeHints, LongTypeName) { + assertTypeHints(R"cpp( + template + struct A {}; + struct MultipleWords {}; + A foo(); + // Omit type hint past a certain length (currently 32) + auto var = foo(); + )cpp"); +} + // FIXME: Low-hanging fruit where we could omit a type hint: // - auto x = TypeName(...); // - auto x = (TypeName) (...);