details.
:py:`func.has_param_details` If function parameters have description
:py:`func.return_value` Return value description. Can be empty.
+:py:`func.return_values` Description of particular empty values. See
+ below for details.
:py:`func.brief` Brief description. Can be empty. [1]_
:py:`func.description` Detailed description. Can be empty. [2]_
:py:`func.has_details` If there is enough content for the full
:py:`'inout'` or :py:`''` if unspecified.
=========================== ===================================================
+The :py:`func.return_values` is a list of return values and their description
+(in contract to :py:`func.return_value`, which is just a single description).
+Each item is a tuple of :py:`(value, description)`. Can be empty, it can also
+happen that both :py:`func.return_value` and :py:`func.return_values` are
+present.
+
`Variable properties`_
``````````````````````
out.templates = {}
out.params = {}
out.return_value = None
+ out.return_values = []
out.add_css_class = None
out.footer_navigation = False
out.example_navigation = None
logging.warning("{}: superfluous @return section found, ignoring: {} ".format(state.current, ''.join(i.itertext())))
else:
out.return_value = parsed.return_value
+ if parsed.return_values:
+ out.return_values += parsed.return_values
# The same is (of course) with bubbling up the <mcss:class>
# element. Reset the current value with the value coming from
for name in param_names.findall('parametername'):
if i.attrib['kind'] == 'param':
out.params[name.text] = (description, name.attrib['direction'] if 'direction' in name.attrib else '')
+ elif i.attrib['kind'] == 'retval':
+ out.return_values += [(name.text, description)]
else:
assert i.attrib['kind'] == 'templateparam'
out.templates[name.text] = description
parsed = parse_desc_internal(state, element.find('detaileddescription'))
parsed.parsed += parse_desc(state, element.find('inbodydescription'))
assert not parsed.section # might be problematic
- return (parsed.parsed, parsed.templates, parsed.params, parsed.return_value, parsed.search_keywords, parsed.is_deprecated)
+ return (parsed.parsed, parsed.templates, parsed.params, parsed.return_value, parsed.return_values, parsed.search_keywords, parsed.is_deprecated)
def parse_define_desc(state: State, element: ET.Element):
# Verify that we didn't ignore any important info by accident
func.type = parse_type(state, element.find('type'))
func.name = fix_type_spacing(html.escape(element.find('name').text))
func.brief = parse_desc(state, element.find('briefdescription'))
- func.description, templates, params, func.return_value, search_keywords, func.is_deprecated = parse_func_desc(state, element)
+ func.description, templates, params, func.return_value, func.return_values, search_keywords, func.is_deprecated = parse_func_desc(state, element)
# Extract function signature to prefix, suffix and various flags. Important
# things affecting caller such as static or const (and rvalue overloads)
# Some param description got unused
if params: logging.warning("{}: function parameter description doesn't match parameter names: {}".format(state.current, repr(params)))
- func.has_details = func.description or func.has_template_details or func.has_param_details or func.return_value
+ func.has_details = func.description or func.has_template_details or func.has_param_details or func.return_value or func.return_values
if func.brief or func.has_details:
if not state.doxyfile['M_SEARCH_DISABLED']:
result = Empty()
{% if func.brief %}
<p>{{ func.brief }}</p>
{% endif %}
- {% if func.has_template_details or func.has_param_details or func.return_value %}
+ {% if func.has_template_details or func.has_param_details or func.return_value or func.return_values %}
<table class="m-table m-fullwidth m-flat">
{% if func.has_template_details %}
<thead>
</tbody>
{% endif %}
{% if func.return_value %}
- <tfoot>
+ {{ '<thead>' if func.return_values else '<tfoot>' }}
<tr>
<th{% if not func.has_template_details and not func.has_param_details %} style="width: 1%"{% endif %}>Returns</th>
<td>{{ func.return_value }}</td>
</tr>
- </tfoot>
+ {{ '</thead>' if func.return_values else '</tfoot>' }}
+ {% elif func.return_values %}
+ <thead>
+ <tr><th colspan="2">Returns</th></tr>
+ </thead>
+ {% endif %}
+ {% if func.return_values %}
+ <tbody>
+ {% for value, description in func.return_values %}
+ <tr>
+ <td{% if loop.index == 1 and not func.has_template_details and not func.has_param_details and not func.return_value %} style="width: 1%"{% endif %}>{{ value }}</td>
+ <td>{{ description }}</td>
+ </tr>
+ {% endfor %}
+ </tbody>
{% endif %}
</table>
{% endif %}
@param things And an array!
@param stuff Another array
@return It returns!
+@retval 0 Zero?
+@retval 42 The Answer.
Ooooh, more text!
*/
*/
int justReturn();
+/**
+@brief Function
+@retval 42 With just return value docs should still have detailed section
+*/
+int justReturnValues();
+
/**
@brief A function with scattered docs
@tparam A First template parameter docs
@param b Second parameter docs
+
+That goes also for the return values.
+
+@retval 0 Zero
+
+Yes?
+
+@retval 1337 1337 h4xx0r?!
+@retval 42 The answer. To everything
*/
-template<class A, class B> void bar(int a, int b);
+template<class A, class B> int bar(int a, int b);
/**
@brief Function with one description for all params
<span class="m-dox-wrap-bumper">auto <a href="#ada6488b07291f349307778cc7bb3547d" class="m-dox">justReturn</a>(</span><span class="m-dox-wrap">) -> int</span>
</dt>
<dd>Function.</dd>
+ <dt>
+ <span class="m-dox-wrap-bumper">auto <a href="#a2aed7a8280e0ed79f5f9ceb0d54f4a30" class="m-dox">justReturnValues</a>(</span><span class="m-dox-wrap">) -> int</span>
+ </dt>
+ <dd>Function.</dd>
<dt>
<div class="m-dox-template">template<class A, class B></div>
- <span class="m-dox-wrap-bumper">void <a href="#a291ca0ca1dec918416a1316b23de0e42" class="m-dox">bar</a>(</span><span class="m-dox-wrap">int a,
- int b)</span>
+ <span class="m-dox-wrap-bumper">auto <a href="#aea7a925ccf30c967a965b2549cec4154" class="m-dox">bar</a>(</span><span class="m-dox-wrap">int a,
+ int b) -> int</span>
</dt>
<dd>A function with scattered docs.</dd>
<dt>
<td>Another array</td>
</tr>
</tbody>
- <tfoot>
+ <thead>
<tr>
<th>Returns</th>
<td>It returns!</td>
</tr>
- </tfoot>
+ </thead>
+ <tbody>
+ <tr>
+ <td>0</td>
+ <td>Zero?</td>
+ </tr>
+ <tr>
+ <td>42</td>
+ <td>The Answer.</td>
+ </tr>
+ </tbody>
</table>
<p>Ooooh, more text!</p>
</div></section>
</tfoot>
</table>
</div></section>
- <section class="m-dox-details" id="a291ca0ca1dec918416a1316b23de0e42"><div>
+ <section class="m-dox-details" id="a2aed7a8280e0ed79f5f9ceb0d54f4a30"><div>
+ <h3>
+ <span class="m-dox-wrap-bumper">int Foo::<wbr /></span><span class="m-dox-wrap"><span class="m-dox-wrap-bumper"><a href="#a2aed7a8280e0ed79f5f9ceb0d54f4a30" class="m-dox-self">justReturnValues</a>(</span><span class="m-dox-wrap">)</span></span>
+ </h3>
+ <p>Function.</p>
+ <table class="m-table m-fullwidth m-flat">
+ <thead>
+ <tr><th colspan="2">Returns</th></tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td style="width: 1%">42</td>
+ <td>With just return value docs should still have detailed section</td>
+ </tr>
+ </tbody>
+ </table>
+ </div></section>
+ <section class="m-dox-details" id="aea7a925ccf30c967a965b2549cec4154"><div>
<h3>
<div class="m-dox-template">
template<class A, class B>
</div>
- <span class="m-dox-wrap-bumper">void Foo::<wbr /></span><span class="m-dox-wrap"><span class="m-dox-wrap-bumper"><a href="#a291ca0ca1dec918416a1316b23de0e42" class="m-dox-self">bar</a>(</span><span class="m-dox-wrap">int a,
+ <span class="m-dox-wrap-bumper">int Foo::<wbr /></span><span class="m-dox-wrap"><span class="m-dox-wrap-bumper"><a href="#aea7a925ccf30c967a965b2549cec4154" class="m-dox-self">bar</a>(</span><span class="m-dox-wrap">int a,
int b)</span></span>
</h3>
<p>A function with scattered docs.</p>
<td>Second parameter docs</td>
</tr>
</tbody>
+ <thead>
+ <tr><th colspan="2">Returns</th></tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>0</td>
+ <td>Zero</td>
+ </tr>
+ <tr>
+ <td>1337</td>
+ <td>1337 h4xx0r?!</td>
+ </tr>
+ <tr>
+ <td>42</td>
+ <td>The answer. To everything</td>
+ </tr>
+ </tbody>
</table>
-<p>This is a function that has the docs all scattered around. They should get merged and reordered.</p>
+<p>This is a function that has the docs all scattered around. They should get merged and reordered.</p><p>That goes also for the return values.</p><p>Yes?</p>
</div></section>
<section class="m-dox-details" id="a1e4e8c2c75da6e24d78c8a84e0cb3226"><div>
<h3>