diff --git a/clang-tools-extra/clangd/Config.h b/clang-tools-extra/clangd/Config.h --- a/clang-tools-extra/clangd/Config.h +++ b/clang-tools-extra/clangd/Config.h @@ -147,8 +147,8 @@ bool Parameters = true; bool DeducedTypes = true; bool Designators = true; - // Limit the length of type names in inlay hints. - size_t TypeNameLimit = 32; + // Limit the length of type names in inlay hints. (0 means no limit) + uint32_t TypeNameLimit = 32; } InlayHints; }; diff --git a/clang-tools-extra/clangd/ConfigCompile.cpp b/clang-tools-extra/clangd/ConfigCompile.cpp --- a/clang-tools-extra/clangd/ConfigCompile.cpp +++ b/clang-tools-extra/clangd/ConfigCompile.cpp @@ -614,7 +614,7 @@ if (F.TypeNameLimit) Out.Apply.push_back( [Value(**F.TypeNameLimit)](const Params &, Config &C) { - C.InlayHints.TypeNameLimit = stoul(Value); + C.InlayHints.TypeNameLimit = Value; }); } diff --git a/clang-tools-extra/clangd/ConfigFragment.h b/clang-tools-extra/clangd/ConfigFragment.h --- a/clang-tools-extra/clangd/ConfigFragment.h +++ b/clang-tools-extra/clangd/ConfigFragment.h @@ -322,8 +322,8 @@ std::optional> DeducedTypes; /// Show designators in aggregate initialization. std::optional> Designators; - /// Limit the length of type name hints. - std::optional> TypeNameLimit; + /// Limit the length of type name hints. (0 means no limit) + std::optional> TypeNameLimit; }; InlayHintsBlock InlayHints; }; diff --git a/clang-tools-extra/clangd/ConfigYAML.cpp b/clang-tools-extra/clangd/ConfigYAML.cpp --- a/clang-tools-extra/clangd/ConfigYAML.cpp +++ b/clang-tools-extra/clangd/ConfigYAML.cpp @@ -255,7 +255,7 @@ F.Designators = *Value; }); Dict.handle("TypeNameLimit", [&](Node &N) { - if (auto Value = scalarValue(N, "TypeNameLimit")) + if (auto Value = uint32Value(N, "TypeNameLimit")) F.TypeNameLimit = *Value; }); Dict.parse(N); @@ -379,6 +379,17 @@ return std::nullopt; } + std::optional> uint32Value(Node &N, llvm::StringRef Desc) { + if (auto Scalar = scalarValue(N, Desc)) { + unsigned long long Num; + if (!llvm::getAsUnsignedInteger(**Scalar, 0, Num)) { + return Located(Num, Scalar->Range); + } + } + warning(Desc + " invalid number", N); + return std::nullopt; + } + // Try to parse a list of single scalar values, or just a single value. std::optional>> scalarValues(Node &N) { std::vector> Result; 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 @@ -688,7 +688,8 @@ return; std::string TypeName = T.getAsString(Policy); - if (TypeName.length() < Cfg.InlayHints.TypeNameLimit) + if (Cfg.InlayHints.TypeNameLimit == 0 || + TypeName.length() < Cfg.InlayHints.TypeNameLimit) addInlayHint(R, HintSide::Right, InlayHintKind::Type, Prefix, TypeName, /*Suffix=*/""); }