================ @@ -1005,14 +1332,22 @@ class InlayHintVisitor : public RecursiveASTVisitor<InlayHintVisitor> { // The sugared type is more useful in some cases, and the canonical // type in other cases. auto Desugared = maybeDesugar(AST, T); - std::string TypeName = Desugared.getAsString(TypeHintPolicy); - if (T != Desugared && !shouldPrintTypeHint(TypeName)) { + std::vector<InlayHintLabelPart> Chunks; + TypeInlayHintLabelPartBuilder Builder(Desugared, AST, MainFilePath, + TypeHintPolicy, Prefix, Chunks); + Builder.Visit(Desugared.getTypePtr()); + if (T != Desugared && !shouldPrintTypeHint(Chunks)) { // If the desugared type is too long to display, fallback to the sugared // type. - TypeName = T.getAsString(TypeHintPolicy); + Chunks.clear(); + TypeInlayHintLabelPartBuilder Builder(T, AST, MainFilePath, + TypeHintPolicy, Prefix, Chunks); + Builder.Visit(T.getTypePtr()); } - if (shouldPrintTypeHint(TypeName)) - addInlayHint(R, HintSide::Right, InlayHintKind::Type, Prefix, TypeName, + if (shouldPrintTypeHint(Chunks)) ---------------- HighCommander4 wrote:
I realized the code has a pre-existing issue where we call `shouldPrintTypeHint()` twice in the case where `T != Desugared` and the length of the `Desugared` string is under the limit. We can avoid it by structuring the code like this: ```c++ auto Chunks = buildTypeHint(Desugared); if (T != Desugared) { if (shouldPrintTypeHint(Chunks)) { addInlayHint(...); return; } Chunks = buildTypeHint(T, ...); } if (shouldPrintTypeHint(Chunks)) { addInlayHint(...); } ``` https://github.com/llvm/llvm-project/pull/86629 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits