================
@@ -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

Reply via email to