Skip to content

Commit c9ad896

Browse files
authored
[clang-doc] Add functions to namespace template (#171938)
Emit namespace-level (global) functions in HTML.
1 parent 5f6a5e0 commit c9ad896

File tree

7 files changed

+124
-27
lines changed

7 files changed

+124
-27
lines changed

clang-tools-extra/clang-doc/JSONGenerator.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -629,8 +629,10 @@ static void serializeInfo(const NamespaceInfo &I, json::Object &Obj,
629629
serializeInfo(Info, Object, RepositoryUrl);
630630
};
631631

632-
if (!I.Children.Functions.empty())
632+
if (!I.Children.Functions.empty()) {
633633
serializeArray(I.Children.Functions, Obj, "Functions", SerializeInfo);
634+
Obj["HasFunctions"] = true;
635+
}
634636

635637
if (!I.Children.Concepts.empty())
636638
serializeArray(I.Children.Concepts, Obj, "Concepts", SerializeInfo);

clang-tools-extra/clang-doc/assets/function-template.mustache

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,17 @@
77
}}
88
<div class="delimiter-container">
99
<div id="{{USR}}">
10+
{{#Template}}
11+
<pre><code class="language-cpp code-clang-doc">template &lt;{{#Parameters}}{{Param}}{{^End}}, {{/End}}{{/Parameters}}&gt;</code></pre>
12+
{{/Template}}
1013
{{! Function Prototype }}
11-
<pre><code class="language-cpp code-clang-doc">{{ReturnType.Name}} {{Name}} ({{#Params}}{{^End}}{{Type}} {{Name}}, {{/End}}{{#End}}{{Type}} {{Name}}{{/End}}{{/Params}})</code></pre>
14+
<pre><code class="language-cpp code-clang-doc">{{ReturnType.Name}} {{Name}}{{#Template}}{{#Specialization}}&lt;{{#Parameters}}{{Param}}{{^End}}, {{/End}}{{/Parameters}}&gt;{{/Specialization}}{{/Template}} ({{#Params}}{{^End}}{{Type}} {{Name}}, {{/End}}{{#End}}{{Type}} {{Name}}{{/End}}{{/Params}})</code></pre>
1215
{{! Function Comments }}
1316
{{#Description}}
1417
<div>
1518
{{>Comments}}
1619
</div>
1720
{{/Description}}
21+
<p>Defined at line {{Location.LineNumber}} of file {{Location.Filename}}</p>
1822
</div>
1923
</div>

clang-tools-extra/clang-doc/assets/namespace-template.mustache

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,20 @@
4343
</ul>
4444
</li>
4545
{{/HasRecords}}
46+
{{#HasFunctions}}
47+
<li class="sidebar-section">
48+
<a class="sidebar-item" href="#Functions">Functions</a>
49+
</li>
50+
<li>
51+
<ul>
52+
{{#Functions}}
53+
<li class="sidebar-item-container">
54+
<a class="sidebar-item" href="#{{USR}}">{{Name}}{{#Template}}{{#Specialization}}&lt;{{#Parameters}}{{Param}}{{^End}}, {{/End}}{{/Parameters}}&gt;{{/Specialization}}{{/Template}}</a>
55+
</li>
56+
{{/Functions}}
57+
</ul>
58+
</li>
59+
{{/HasFunctions}}
4660
</ul>
4761
</div>
4862
<div class="resizer" id="resizer"></div>
@@ -71,6 +85,18 @@
7185
</ul>
7286
</section>
7387
{{/HasRecords}}
88+
{{#HasFunctions}}
89+
<section id="Functions" class="section-container">
90+
<h2>Functions</h2>
91+
<ul class="class-container">
92+
{{#Functions}}
93+
<li>
94+
{{>FunctionPartial}}
95+
</li>
96+
{{/Functions}}
97+
</ul>
98+
</section>
99+
{{/HasFunctions}}
74100
</div>
75101
</div>
76102
</main>

clang-tools-extra/test/clang-doc/json/namespace.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ typedef int MyTypedef;
7373
// CHECK-NEXT: }
7474
// CHECK-NEXT: ],
7575
// CHECK-NEXT: "HasEnums": true,
76+
// CHECK-NEXT: "HasFunctions": true,
7677
// CHECK-NEXT: "HasRecords": true,
7778
// CHECK-NEXT: "InfoType": "namespace",
7879
// CHECK-NEXT: "Name": "Global Namespace",

clang-tools-extra/test/clang-doc/namespace.cpp

Lines changed: 45 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
namespace {
4646
void anonFunction() {}
4747
// MD-ANON-INDEX-LINE: *Defined at {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}namespace.cpp#[[@LINE-1]]*
48-
// HTML-ANON-INDEX-LINE-NOT: <p>Defined at line [[@LINE-2]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}namespace.cpp</p>
48+
// HTML-ANON-INDEX-LINE: <p>Defined at line [[@LINE-2]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}namespace.cpp</p>
4949

5050
class AnonClass {};
5151
// MD-ANON-CLASS-LINE: *Defined at {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}namespace.cpp#[[@LINE-1]]*
@@ -80,7 +80,7 @@ namespace PrimaryNamespace {
8080
// Function in PrimaryNamespace
8181
void functionInPrimaryNamespace() {}
8282
// MD-PRIMARY-INDEX-LINE: *Defined at {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}namespace.cpp#[[@LINE-1]]*
83-
// HTML-PRIMARY-INDEX-LINE-NOT: <p>Defined at line [[@LINE-2]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}namespace.cpp</p>
83+
// HTML-PRIMARY-INDEX-LINE: <p>Defined at line [[@LINE-2]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}namespace.cpp</p>
8484

8585
// Class in PrimaryNamespace
8686
class ClassInPrimaryNamespace {};
@@ -97,7 +97,7 @@ namespace NestedNamespace {
9797
// Function in NestedNamespace
9898
void functionInNestedNamespace() {}
9999
// MD-NESTED-INDEX-LINE: *Defined at {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}namespace.cpp#[[@LINE-1]]*
100-
// HTML-NESTED-INDEX-LINE-NOT: <p>Defined at line [[@LINE-2]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}namespace.cpp</p>
100+
// HTML-NESTED-INDEX-LINE: <p>Defined at line [[@LINE-2]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}namespace.cpp</p>
101101

102102
// Class in NestedNamespace
103103
class ClassInNestedNamespace {};
@@ -128,10 +128,17 @@ class ClassInNestedNamespace {};
128128
// HTML-NESTED-INDEX: </a>
129129
// HTML-NESTED-INDEX: </li>
130130
// HTML-NESTED-INDEX: </ul>
131-
// HTML-NESTED-INDEX-NOT: <h2 id="Functions">Functions</h2>
132-
// HTML-NESTED-INDEX-NOT: <h3 id="{{([0-9A-F]{40})}}">functionInNestedNamespace</h3>
133-
// HTML-NESTED-INDEX-NOT: <p>void functionInNestedNamespace()</p>
134-
// HTML-NESTED-INDEX-NOT: <p> Function in NestedNamespace</p>
131+
// HTML-NESTED-INDEX: <div class="delimiter-container">
132+
// HTML-NESTED-INDEX: <div id="{{([0-9A-F]{40})}}">
133+
// HTML-NESTED-INDEX: <pre><code class="language-cpp code-clang-doc">void functionInNestedNamespace ()</code></pre>
134+
// HTML-NESTED-INDEX: <div>
135+
// HTML-NESTED-INDEX: <div>
136+
// HTML-NESTED-INDEX: <p> Function in NestedNamespace</p>
137+
// HTML-NESTED-INDEX: </div>
138+
// HTML-NESTED-INDEX: </div>
139+
// HTML-NESTED-INDEX: <p>Defined at line 98 of file {{.*}}namespace.cpp</p>
140+
// HTML-NESTED-INDEX: </div>
141+
// HTML-NESTED-INDEX: </div>
135142
} // namespace PrimaryNamespace
136143

137144
// MD-PRIMARY-INDEX: # namespace PrimaryNamespace
@@ -148,25 +155,31 @@ class ClassInNestedNamespace {};
148155
// HTML-PRIMARY-INDEX: <h2>PrimaryNamespace</h2>
149156
// HTML-PRIMARY-INDEX-NOT: <h2 id="Namespaces">Namespaces</h2>
150157
// HTML-PRIMARY-INDEX-NOT: <a href="NestedNamespace{{[\/]}}index.html">NestedNamespace</a>
151-
// HTML-PRIMARY-INDEX <h2>Inner Classes</h2>
152-
// HTML-PRIMARY-INDEX <ul class="class-container">
153-
// HTML-PRIMARY-INDEX <li id="{{([0-9A-F]{40})}}" style="max-height: 40px;">
154-
// HTML-PRIMARY-INDEX <a href="_ZTVN16PrimaryNamespace23ClassInPrimaryNamespaceE.html">
155-
// HTML-PRIMARY-INDEX <pre><code class="language-cpp code-clang-doc">class ClassInPrimaryNamespace</code></pre>
156-
// HTML-PRIMARY-INDEX </a>
157-
// HTML-PRIMARY-INDEX </li>
158-
// HTML-PRIMARY-INDEX </ul>
159-
// HTML-PRIMARY-INDEX-NOT: <h2 id="Functions">Functions</h2>
160-
// HTML-PRIMARY-INDEX-NOT: <h3 id="{{([0-9A-F]{40})}}">functionInPrimaryNamespace</h3>
161-
// HTML-PRIMARY-INDEX-NOT: <p>void functionInPrimaryNamespace()</p>
162-
// HTML-PRIMARY-INDEX-NOT: <p> Function in PrimaryNamespace</p>
163-
158+
// HTML-PRIMARY-INDEX: <h2>Inner Classes</h2>
159+
// HTML-PRIMARY-INDEX: <ul class="class-container">
160+
// HTML-PRIMARY-INDEX: <li id="{{([0-9A-F]{40})}}" style="max-height: 40px;">
161+
// HTML-PRIMARY-INDEX: <a href="_ZTVN16PrimaryNamespace23ClassInPrimaryNamespaceE.html">
162+
// HTML-PRIMARY-INDEX: <pre><code class="language-cpp code-clang-doc">class ClassInPrimaryNamespace</code></pre>
163+
// HTML-PRIMARY-INDEX: </a>
164+
// HTML-PRIMARY-INDEX: </li>
165+
// HTML-PRIMARY-INDEX: </ul>
166+
// HTML-PRIMARY-INDEX: <div class="delimiter-container">
167+
// HTML-PRIMARY-INDEX: <div id="{{([0-9A-F]{40})}}">
168+
// HTML-PRIMARY-INDEX: <pre><code class="language-cpp code-clang-doc">void functionInPrimaryNamespace ()</code></pre>
169+
// HTML-PRIMARY-INDEX: <div>
170+
// HTML-PRIMARY-INDEX: <div>
171+
// HTML-PRIMARY-INDEX: <p> Function in PrimaryNamespace</p>
172+
// HTML-PRIMARY-INDEX: </div>
173+
// HTML-PRIMARY-INDEX: </div>
174+
// HTML-PRIMARY-INDEX: <p>Defined at line 81 of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}namespace.cpp</p>
175+
// HTML-PRIMARY-INDEX: </div>
176+
// HTML-PRIMARY-INDEX: </div>
164177
// AnotherNamespace
165178
namespace AnotherNamespace {
166179
// Function in AnotherNamespace
167180
void functionInAnotherNamespace() {}
168181
// MD-ANOTHER-INDEX-LINE: *Defined at {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}namespace.cpp#[[@LINE-1]]*
169-
// HTML-ANOTHER-INDEX-LINE-NOT: <p>Defined at line [[@LINE-2]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}namespace.cpp</p>
182+
// HTML-ANOTHER-INDEX-LINE: <p>Defined at line [[@LINE-2]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}namespace.cpp</p>
170183

171184
// Class in AnotherNamespace
172185
class ClassInAnotherNamespace {};
@@ -198,10 +211,17 @@ class ClassInAnotherNamespace {};
198211
// HTML-ANOTHER-INDEX: </a>
199212
// HTML-ANOTHER-INDEX: </li>
200213
// HTML-ANOTHER-INDEX: </ul>
201-
// HTML-ANOTHER-INDEX-NOT: <h2 id="Functions">Functions</h2>
202-
// HTML-ANOTHER-INDEX-NOT: <h3 id="{{([0-9A-F]{40})}}">functionInAnotherNamespace</h3>
203-
// HTML-ANOTHER-INDEX-NOT: <p>void functionInAnotherNamespace()</p>
204-
// HTML-ANOTHER-INDEX-NOT: <p> Function in AnotherNamespace</p>
214+
// HTML-ANOTHER-INDEX: <div class="delimiter-container">
215+
// HTML-ANOTHER-INDEX: <div id="{{([0-9A-F]{40})}}">
216+
// HTML-ANOTHER-INDEX: <pre><code class="language-cpp code-clang-doc">void functionInAnotherNamespace ()</code></pre>
217+
// HTML-ANOTHER-INDEX: <div>
218+
// HTML-ANOTHER-INDEX: <div>
219+
// HTML-ANOTHER-INDEX: <p> Function in AnotherNamespace</p>
220+
// HTML-ANOTHER-INDEX: </div>
221+
// HTML-ANOTHER-INDEX: </div>
222+
// HTML-ANOTHER-INDEX: <p>Defined at line 180 of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}namespace.cpp</p>
223+
// HTML-ANOTHER-INDEX: </div>
224+
// HTML-ANOTHER-INDEX: </div>
205225

206226
// COM: FIXME: Add namespaces to namespace template
207227
// HTML-GLOBAL-INDEX-NOT: <div id="main-content" class="col-xs-12 col-sm-9 col-md-8 main-content">

clang-tools-extra/test/clang-doc/templates.cpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
// RUN: clang-doc --doxygen --executor=standalone %s -output=%t/docs --format=html
1111
// RUN: cat %t/docs/json/GlobalNamespace/index.json | FileCheck %s --check-prefix=JSON
1212
// RUN: cat %t/docs/html/GlobalNamespace/_ZTV5tuple.html | FileCheck %s --check-prefix=HTML-STRUCT
13+
// RUN: cat %t/docs/html/GlobalNamespace/index.html | FileCheck %s --check-prefix=HTML
1314

1415
// YAML: ---
1516
// YAML-NEXT: USR: '{{([0-9A-F]{40})}}'
@@ -72,6 +73,15 @@ void ParamPackFunction(T... args);
7273
// JSON-NEXT: ]
7374
// JSON-NEXT: },
7475

76+
// HTML: <div class="delimiter-container">
77+
// HTML-NEXT: <div id="{{([0-9A-F]{40})}}">
78+
// HTML-NEXT: <pre><code class="language-cpp code-clang-doc">template &lt;class... T&gt;</code></pre>
79+
// HTML-NEXT: <pre><code class="language-cpp code-clang-doc">void ParamPackFunction (T... args)</code></pre>
80+
// COM: FIXME: Omit defined line if not defined, or emit declaration line.
81+
// HTML-NEXT: <p>Defined at line of file </p>
82+
// HTML-NEXT: </div>
83+
// HTML-NEXT: </div>
84+
7585
template <typename T, int U = 1>
7686
void function(T x) {}
7787

@@ -125,6 +135,15 @@ void function(T x) {}
125135
// JSON-NEXT: ]
126136
// JSON-NEXT: }
127137

138+
// HTML: <div class="delimiter-container">
139+
// HTML-NEXT: <div id="{{([0-9A-F]{40})}}">
140+
// HTML-NEXT: <pre><code class="language-cpp code-clang-doc">template &lt;typename T, int U = 1&gt;</code></pre>
141+
// HTML-NEXT: <pre><code class="language-cpp code-clang-doc">void function (T x)</code></pre>
142+
// HTML-NEXT: <p>Defined at line [[# @LINE - 56]] of file {{.*}}templates.cpp</p>
143+
// HTML-NEXT: </div>
144+
// HTML-NEXT: </div>
145+
146+
128147
template <>
129148
void function<bool, 0>(bool x) {}
130149

@@ -183,6 +202,14 @@ void function<bool, 0>(bool x) {}
183202
// JSON-NEXT: }
184203
// JSON-NEXT: },
185204

205+
// HTML: <div class="delimiter-container">
206+
// HTML-NEXT: <div id="{{([0-9A-F]{40})}}">
207+
// HTML-NEXT: <pre><code class="language-cpp code-clang-doc">template &lt;&gt;</code></pre>
208+
// HTML-NEXT: <pre><code class="language-cpp code-clang-doc">void function&lt;bool, 0&gt; (bool x)</code></pre>
209+
// HTML-NEXT: <p>Defined at line [[# @LINE - 62]] of file {{.*}}templates.cpp</p>
210+
// HTML-NEXT: </div>
211+
// HTML-NEXT: </div>
212+
186213
/// A Tuple type
187214
///
188215
/// Does Tuple things.
@@ -272,3 +299,19 @@ tuple<int, int, bool> func_with_tuple_param(tuple<int, int, bool> t) { return t;
272299
// JSON-NEXT: "QualName": "tuple<int, int, bool>",
273300
// JSON-NEXT: "USR": "{{([0-9A-F]{40})}}"
274301
// JSON-NEXT: },
302+
303+
// HTML: <div class="delimiter-container">
304+
// HTML-NEXT: <div id="{{([0-9A-F]{40})}}">
305+
// HTML-NEXT: <pre><code class="language-cpp code-clang-doc">tuple func_with_tuple_param (tuple t)</code></pre>
306+
// HTML-NEXT: <div>
307+
// HTML-NEXT: <div>
308+
// HTML-NEXT: <p> A function with a tuple parameter</p>
309+
// HTML-NEXT: </div>
310+
// HTML-NEXT: <h3>Parameters</h3>
311+
// HTML-NEXT: <div>
312+
// HTML-NEXT: <b>t</b> The input to func_with_tuple_param
313+
// HTML-NEXT: </div>
314+
// HTML-NEXT: </div>
315+
// HTML-NEXT: <p>Defined at line [[# @LINE - 77]] of file {{.*}}templates.cpp</p>
316+
// HTML-NEXT: </div>
317+
// HTML-NEXT: </div>

clang-tools-extra/unittests/clang-doc/JSONGeneratorTest.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,7 @@ TEST_F(JSONGeneratorTest, emitNamespaceJSON) {
246246
}
247247
],
248248
"HasEnums": true,
249+
"HasFunctions": true,
249250
"HasRecords": true,
250251
"InfoType": "namespace",
251252
"Name": "Global Namespace",

0 commit comments

Comments
 (0)