[clang-tools-extra] [clang-doc]: Enable horizontal wrapping on longer function definitions (PR #181417)

Samrudh Nelli via cfe-commits cfe-commits at lists.llvm.org
Fri Feb 13 12:44:57 PST 2026


https://github.com/SamrudhNelli created https://github.com/llvm/llvm-project/pull/181417

Could not figure out how to use the `{{^End}}` on the just the inner scope as it would revert to the outer scope with `{{End}}` set for the final function. I think this is a bug and also affects the existing template, function printing.
Hence, reverted to trailing commas for all parameters.
Also disabled "language-cpp" highlighting as it enforced the `display : inline` rule and reset all the custom span classes, therefore implemented a custom highlighter to just colour the function name and parameter types.

@evelez7 Would like to hear your approach on tackling this issue and the changes to be made.
I’d appreciate your thoughts on this approach. I will update the regression tests once we finalize the design.
Fixes #181228 

>From 564745a58365f94cb05d79127124370d874b99a2 Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Fri, 13 Feb 2026 22:38:54 +0530
Subject: [PATCH] fix: Enable horizontal wrapping on longer function
 definitions

Could not figure out how to use the {{^End}} on the just
the inner scope as it would revert to the outer scope with {{End}} set
for the final function.
Hence, reverted to trailing commas for all parameters.
---
 clang-tools-extra/clang-doc/JSONGenerator.cpp  | 18 ++++++++++++++++++
 .../clang-doc/assets/clang-doc-mustache.css    | 18 ++++++++++++++++++
 .../assets/function-template.mustache          |  3 +--
 3 files changed, 37 insertions(+), 2 deletions(-)

diff --git a/clang-tools-extra/clang-doc/JSONGenerator.cpp b/clang-tools-extra/clang-doc/JSONGenerator.cpp
index 5051e7e6e690d..0586aca5f2b15 100644
--- a/clang-tools-extra/clang-doc/JSONGenerator.cpp
+++ b/clang-tools-extra/clang-doc/JSONGenerator.cpp
@@ -456,6 +456,24 @@ static void serializeArray(const Container &Records, Object &Obj,
       ItemObj["End"] = true;
     RecordsArrayRef.push_back(ItemVal);
   }
+  if (Key == "Params") {
+    size_t TotalLength = 0;
+    for (const auto &Val : RecordsArrayRef) {
+      if (const auto *ItemObj = Val.getAsObject()) {
+        if (auto Type = ItemObj->getString("Type")) 
+          TotalLength += Type->size();
+        if (auto Name = ItemObj->getString("Name"))
+          TotalLength += Name->size();
+        TotalLength += 2; // For ', '
+      }
+    }
+    if (TotalLength > 15) {
+      Obj["IsLong"] = true;
+    }
+    else {
+      Obj["IsLong"] = false;
+    }
+  }
   Obj[Key] = RecordsArray;
 }
 
diff --git a/clang-tools-extra/clang-doc/assets/clang-doc-mustache.css b/clang-tools-extra/clang-doc/assets/clang-doc-mustache.css
index 19fba2f9eae76..ae058fb2b9a24 100644
--- a/clang-tools-extra/clang-doc/assets/clang-doc-mustache.css
+++ b/clang-tools-extra/clang-doc/assets/clang-doc-mustache.css
@@ -520,3 +520,21 @@ a, a:visited, a:hover, a:active {
   overflow: hidden;
   padding: 10px;
 }
+
+.params-vertical {
+    display: block;
+    padding-left: 1ch;
+}
+
+.param {
+    display: block;
+}
+
+.hljs-type {
+    color: var(--brand-dark);
+}
+
+.hljs-title {
+    color: var(--brand-dark);
+    font-weight: bold;
+}
\ No newline at end of file
diff --git a/clang-tools-extra/clang-doc/assets/function-template.mustache b/clang-tools-extra/clang-doc/assets/function-template.mustache
index 510219a63d379..9c1355319bf73 100644
--- a/clang-tools-extra/clang-doc/assets/function-template.mustache
+++ b/clang-tools-extra/clang-doc/assets/function-template.mustache
@@ -10,8 +10,7 @@
         <pre><code class="language-cpp code-clang-doc">template <{{#Parameters}}{{Param}}{{^End}}, {{/End}}{{/Parameters}}></code></pre>
         {{/Template}}
         {{! Function Prototype }}
-        <pre><code class="language-cpp code-clang-doc">{{ReturnType.QualName}} {{Name}}{{#Template}}{{#Specialization}}<{{#Parameters}}{{Param}}{{^End}}, {{/End}}{{/Parameters}}>{{/Specialization}}{{/Template}} ({{#Params}}{{Type.QualName}} {{Name}}{{^End}}, {{/End}}{{/Params}})</code></pre>
-        {{! Function Comments }}
+        <pre><code class="nohighlight code-clang-doc"><span class="hljs-type">{{ReturnType.QualName}}</span> <span class="hljs-title">{{Name}}</span> ({{#IsLong}}<span class="params-vertical">{{#Params}}<span class="param"><span class="hljs-type">{{Type.QualName}}</span> {{Name}},</span>{{/Params}}</span>{{/IsLong}}{{^IsLong}}{{#Params}}<span class="hljs-type">{{Type.QualName}}</span> {{Name}}{{^End}}, {{/End}}{{/Params}}{{/IsLong}})</code></pre>
         {{#Description}}
         <div class="doc-card">
             {{>Comments}}



More information about the cfe-commits mailing list