# Extract corresponding include also for class/struct/union "relateds", if
# it's different from what the class has. This also forcibly enables
# has_details (unlike the case above, where has_details will be enabled
- # only if all members don't have the same include)
+ # only if all members don't have the same include) -- however if
+ # SHOW_INCLUDE_FILES isn't enabled or the file is not documented, this
+ # would generate useless empty detailed sections so in that case it's not
+ # set.
if state.current_kind in ['class', 'struct', 'union']:
location_attribs = element.find('location').attrib
file = location_attribs['declfile'] if 'declfile' in location_attribs else location_attribs['file']
if state.current_include != file:
include = make_include(state, file)
- has_details = True
+ has_details = include and state.doxyfile['SHOW_INCLUDE_FILES']
return id[:i], id[:i] + '.html', id[i+2:], include, has_details
##! M_LINKS_NAVBAR1 =
##! M_LINKS_NAVBAR2 =
##! M_SEARCH_DISABLED = YES
+
+# otherwise it links to Second.h and Union, DO NOT WANT
+AUTOLINK_SUPPORT = NO
Even though it has no members that could set the global include for it.
*/
namespace Empty {}
+
+template <typename> struct SpreadClass;
*/
/** @related Class
- * @brief A related enum in a different file
+ * @brief A related enum in a different file. Detailed info only if includes not disabled.
*/
enum RelatedEnum {};
/** @related Class
- * @brief A related typedef in a different file
+ * @brief A related typedef in a different file. Detailed info only if includes not disabled.
*/
typedef int RelatedInt;
/** @related Class
- * @brief A related variable in a different file
+ * @brief A related variable in a different file. Detailed info only if includes not disabled.
*/
constexpr const int RelatedVar = 3;
/** @related Class
- * @brief A related function in a different file
+ * @brief A related function in a different file. Detailed info only if includes not disabled.
*/
void relatedFunc();
/** @related Class
- * @brief A related define in a different file
+ * @brief A related define in a different file. Detailed info only if includes not disabled.
*/
#define RELATED_DEFINE
}
+
+/**
+@brief A class forward-declared in one file but defined in another
+
+Because Doxygen is stupid, it reports the class to be defined in First.h even
+though there's just a fwdecl. Happens only if the class is a template,
+a non-templated class would have its location reported correctly.
+
+If includes are enabled, members should have Second.h listed as their include,
+but if they are disabled, brief-only members shouldn't have detailed sections
+at all.
+*/
+template<class T> struct SpreadClass {
+ /** @brief A function with (detailed) include information but no details if includes are disabled */
+ void foo();
+};
<dt>
<span class="m-doc-wrap-bumper">enum <a href="#ab66c81fc768958c4185a517d488a89c7" class="m-doc">RelatedEnum</a> { </span><span class="m-doc-wrap"> }</span>
</dt>
- <dd>A related enum in a different file.</dd>
+ <dd>A related enum in a different file. Detailed info only if includes not disabled.</dd>
<dt>
using <a href="#aca8f196c01494bf1dab261745f3693c8" class="m-doc">RelatedInt</a> = int
</dt>
- <dd>A related typedef in a different file.</dd>
+ <dd>A related typedef in a different file. Detailed info only if includes not disabled.</dd>
<dt>
const int <a href="#a15e320413819ae46dffcbccbbb542b8c" class="m-doc">RelatedVar</a> <span class="m-label m-flat m-primary">constexpr</span>
</dt>
- <dd>A related variable in a different file.</dd>
+ <dd>A related variable in a different file. Detailed info only if includes not disabled.</dd>
<dt>
<span class="m-doc-wrap-bumper">void <a href="#a8b69414d6ef13f920d3a855bd22362fb" class="m-doc">relatedFunc</a>(</span><span class="m-doc-wrap">)</span>
</dt>
- <dd>A related function in a different file.</dd>
+ <dd>A related function in a different file. Detailed info only if includes not disabled.</dd>
<dt>
<span class="m-doc-wrap-bumper">#define <a href="#a8887c0b6a87e2438ea90ffe476680da1" class="m-doc">RELATED_DEFINE</a></span>
</dt>
- <dd>A related define in a different file.</dd>
+ <dd>A related define in a different file. Detailed info only if includes not disabled.</dd>
</dl>
</section>
<section>
enum <a href="#ab66c81fc768958c4185a517d488a89c7" class="m-doc-self">RelatedEnum</a>
<div class="m-doc-include m-code m-inverted m-text-right"><span class="cp">#include</span> <a class="cpf" href="Second_8h.html"><Second.h></a></div>
</h3>
- <p>A related enum in a different file.</p>
+ <p>A related enum in a different file. Detailed info only if includes not disabled.</p>
</div></section>
</section>
<section>
typedef int <a href="#aca8f196c01494bf1dab261745f3693c8" class="m-doc-self">RelatedInt</a>
<div class="m-doc-include m-code m-inverted m-text-right"><span class="cp">#include</span> <a class="cpf" href="Second_8h.html"><Second.h></a></div>
</h3>
- <p>A related typedef in a different file.</p>
+ <p>A related typedef in a different file. Detailed info only if includes not disabled.</p>
</div></section>
</section>
<section>
<span class="m-doc-wrap-bumper">void </span><span class="m-doc-wrap"><span class="m-doc-wrap-bumper"><a href="#a8b69414d6ef13f920d3a855bd22362fb" class="m-doc-self">relatedFunc</a>(</span><span class="m-doc-wrap">)</span></span>
<div class="m-doc-include m-code m-inverted m-text-right"><span class="cp">#include</span> <a class="cpf" href="Second_8h.html"><Second.h></a></div>
</h3>
- <p>A related function in a different file.</p>
+ <p>A related function in a different file. Detailed info only if includes not disabled.</p>
</div></section>
</section>
<section>
const int <a href="#a15e320413819ae46dffcbccbbb542b8c" class="m-doc-self">RelatedVar</a> <span class="m-label m-primary">constexpr</span>
<div class="m-doc-include m-code m-inverted m-text-right"><span class="cp">#include</span> <a class="cpf" href="Second_8h.html"><Second.h></a></div>
</h3>
- <p>A related variable in a different file.</p>
+ <p>A related variable in a different file. Detailed info only if includes not disabled.</p>
</div></section>
</section>
<section>
<span class="m-doc-wrap-bumper">#define <a href="#a8887c0b6a87e2438ea90ffe476680da1" class="m-doc-self">RELATED_DEFINE</a></span>
<div class="m-doc-include m-code m-inverted m-text-right"><span class="cp">#include</span> <a class="cpf" href="Second_8h.html"><Second.h></a></div>
</h3>
- <p>A related define in a different file.</p>
+ <p>A related define in a different file. Detailed info only if includes not disabled.</p>
</div></section>
</section>
</div>
<dt>
union <a href="unionContainsNamespace_1_1ContainsClass_1_1Union.html" class="m-doc">Union</a>
</dt>
- <dd><a href="unionContainsNamespace_1_1ContainsClass_1_1Union.html" class="m-doc">Union</a>.</dd>
+ <dd>Union.</dd>
</dl>
</section>
<section id="func-members">
<dt>
<span class="m-doc-wrap-bumper">enum <a href="classClass.html#ab66c81fc768958c4185a517d488a89c7" class="m-doc">RelatedEnum</a> { </span><span class="m-doc-wrap"> }</span>
</dt>
- <dd>A related enum in a different file.</dd>
+ <dd>A related enum in a different file. Detailed info only if includes not disabled.</dd>
</dl>
</section>
<section id="typedef-members">
--- /dev/null
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <title>SpreadClass struct | My Project</title>
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,400i,600,600i%7CSource+Code+Pro:400,400i,600" />
+ <link rel="stylesheet" href="m-dark+documentation.compiled.css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+</head>
+<body>
+<header><nav id="navigation">
+ <div class="m-container">
+ <div class="m-row">
+ <a href="index.html" id="m-navbar-brand" class="m-col-t-8 m-col-m-none m-left-m">My Project</a>
+ </div>
+ </div>
+</nav></header>
+<main><article>
+ <div class="m-container m-container-inflatable">
+ <div class="m-row">
+ <div class="m-col-l-10 m-push-l-1">
+ <h1>
+ <div class="m-doc-include m-code m-inverted m-right-m m-text-right"><span class="cp">#include</span> <a class="cpf" href="First_8h.html"><First.h></a></div>
+ <div class="m-doc-template">template<class T></div>
+ SpreadClass <span class="m-thin">struct</span>
+ </h1>
+ <p>A class forward-declared in one file but defined in another.</p>
+ <div class="m-block m-default">
+ <h3>Contents</h3>
+ <ul>
+ <li>
+ Reference
+ <ul>
+ <li><a href="#pub-methods">Public functions</a></li>
+ </ul>
+ </li>
+ </ul>
+ </div>
+<p>Because Doxygen is stupid, it reports the class to be defined in First.h even though there's just a fwdecl. Happens only if the class is a template, a non-templated class would have its location reported correctly.</p><p>If includes are enabled, members should have Second.h listed as their include, but if they are disabled, brief-only members shouldn't have detailed sections at all.</p>
+ <section id="pub-methods">
+ <h2><a href="#pub-methods">Public functions</a></h2>
+ <dl class="m-doc">
+ <dt>
+ <span class="m-doc-wrap-bumper">void <a href="#a0537e4d57c78086a29ab6143da0d9a21" class="m-doc">foo</a>(</span><span class="m-doc-wrap">)</span>
+ </dt>
+ <dd>A function with (detailed) include information but no details if includes are disabled.</dd>
+ </dl>
+ </section>
+ <section>
+ <h2>Function documentation</h2>
+ <section class="m-doc-details" id="a0537e4d57c78086a29ab6143da0d9a21"><div>
+ <h3>
+ <div class="m-doc-include m-code m-inverted m-right-m m-text-right"><span class="cp">#include</span> <a class="cpf" href="Second_8h.html"><Second.h></a></div>
+ <div class="m-doc-template">
+ template<class T>
+ </div>
+ <span class="m-doc-wrap-bumper">void SpreadClass<T>::<wbr /></span><span class="m-doc-wrap"><span class="m-doc-wrap-bumper"><a href="#a0537e4d57c78086a29ab6143da0d9a21" class="m-doc-self">foo</a>(</span><span class="m-doc-wrap">)</span></span>
+ </h3>
+ <p>A function with (detailed) include information but no details if includes are disabled.</p>
+ </div></section>
+ </section>
+ </div>
+ </div>
+ </div>
+</article></main>
+</body>
+</html>
##! M_LINKS_NAVBAR2 =
##! M_SEARCH_DISABLED = YES
+AUTOLINK_SUPPORT = NO # otherwise it links to Second.h, DO NOT WANT
SHOW_INCLUDE_FILES = NO # explicitly disabled
<section id="related">
<h2><a href="#related">Related</a></h2>
<dl class="m-doc">
- <dt>
- <span class="m-doc-wrap-bumper">enum <a href="#ab66c81fc768958c4185a517d488a89c7" class="m-doc">RelatedEnum</a> { </span><span class="m-doc-wrap"> }</span>
+ <dt id="ab66c81fc768958c4185a517d488a89c7">
+ <span class="m-doc-wrap-bumper">enum <a href="#ab66c81fc768958c4185a517d488a89c7" class="m-doc-self">RelatedEnum</a> { </span><span class="m-doc-wrap"> }</span>
</dt>
- <dd>A related enum in a different file.</dd>
- <dt>
- using <a href="#aca8f196c01494bf1dab261745f3693c8" class="m-doc">RelatedInt</a> = int
+ <dd>A related enum in a different file. Detailed info only if includes not disabled.</dd>
+ <dt id="aca8f196c01494bf1dab261745f3693c8">
+ using <a href="#aca8f196c01494bf1dab261745f3693c8" class="m-doc-self">RelatedInt</a> = int
</dt>
- <dd>A related typedef in a different file.</dd>
- <dt>
- const int <a href="#a15e320413819ae46dffcbccbbb542b8c" class="m-doc">RelatedVar</a> <span class="m-label m-flat m-primary">constexpr</span>
+ <dd>A related typedef in a different file. Detailed info only if includes not disabled.</dd>
+ <dt id="a15e320413819ae46dffcbccbbb542b8c">
+ const int <a href="#a15e320413819ae46dffcbccbbb542b8c" class="m-doc-self">RelatedVar</a> <span class="m-label m-flat m-primary">constexpr</span>
</dt>
- <dd>A related variable in a different file.</dd>
- <dt>
- <span class="m-doc-wrap-bumper">void <a href="#a8b69414d6ef13f920d3a855bd22362fb" class="m-doc">relatedFunc</a>(</span><span class="m-doc-wrap">)</span>
+ <dd>A related variable in a different file. Detailed info only if includes not disabled.</dd>
+ <dt id="a8b69414d6ef13f920d3a855bd22362fb">
+ <span class="m-doc-wrap-bumper">void <a href="#a8b69414d6ef13f920d3a855bd22362fb" class="m-doc-self">relatedFunc</a>(</span><span class="m-doc-wrap">)</span>
</dt>
- <dd>A related function in a different file.</dd>
- <dt>
- <span class="m-doc-wrap-bumper">#define <a href="#a8887c0b6a87e2438ea90ffe476680da1" class="m-doc">RELATED_DEFINE</a></span>
+ <dd>A related function in a different file. Detailed info only if includes not disabled.</dd>
+ <dt id="a8887c0b6a87e2438ea90ffe476680da1">
+ <span class="m-doc-wrap-bumper">#define <a href="#a8887c0b6a87e2438ea90ffe476680da1" class="m-doc-self">RELATED_DEFINE</a></span>
</dt>
- <dd>A related define in a different file.</dd>
+ <dd>A related define in a different file. Detailed info only if includes not disabled.</dd>
</dl>
</section>
- <section>
- <h2>Enum documentation</h2>
- <section class="m-doc-details" id="ab66c81fc768958c4185a517d488a89c7"><div>
- <h3>
- enum <a href="#ab66c81fc768958c4185a517d488a89c7" class="m-doc-self">RelatedEnum</a>
- </h3>
- <p>A related enum in a different file.</p>
- </div></section>
- </section>
- <section>
- <h2>Typedef documentation</h2>
- <section class="m-doc-details" id="aca8f196c01494bf1dab261745f3693c8"><div>
- <h3>
- typedef int <a href="#aca8f196c01494bf1dab261745f3693c8" class="m-doc-self">RelatedInt</a>
- </h3>
- <p>A related typedef in a different file.</p>
- </div></section>
- </section>
- <section>
- <h2>Function documentation</h2>
- <section class="m-doc-details" id="a8b69414d6ef13f920d3a855bd22362fb"><div>
- <h3>
- <span class="m-doc-wrap-bumper">void </span><span class="m-doc-wrap"><span class="m-doc-wrap-bumper"><a href="#a8b69414d6ef13f920d3a855bd22362fb" class="m-doc-self">relatedFunc</a>(</span><span class="m-doc-wrap">)</span></span>
- </h3>
- <p>A related function in a different file.</p>
- </div></section>
- </section>
- <section>
- <h2>Variable documentation</h2>
- <section class="m-doc-details" id="a15e320413819ae46dffcbccbbb542b8c"><div>
- <h3>
- const int <a href="#a15e320413819ae46dffcbccbbb542b8c" class="m-doc-self">RelatedVar</a> <span class="m-label m-primary">constexpr</span>
- </h3>
- <p>A related variable in a different file.</p>
- </div></section>
- </section>
- <section>
- <h2>Define documentation</h2>
- <section class="m-doc-details" id="a8887c0b6a87e2438ea90ffe476680da1"><div>
- <h3>
- <span class="m-doc-wrap-bumper">#define <a href="#a8887c0b6a87e2438ea90ffe476680da1" class="m-doc-self">RELATED_DEFINE</a></span>
- </h3>
- <p>A related define in a different file.</p>
- </div></section>
- </section>
</div>
</div>
</div>
<dt>
<span class="m-doc-wrap-bumper">enum <a href="classClass.html#ab66c81fc768958c4185a517d488a89c7" class="m-doc">RelatedEnum</a> { </span><span class="m-doc-wrap"> }</span>
</dt>
- <dd>A related enum in a different file.</dd>
+ <dd>A related enum in a different file. Detailed info only if includes not disabled.</dd>
</dl>
</section>
<section id="typedef-members">
--- /dev/null
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <title>SpreadClass struct | My Project</title>
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,400i,600,600i%7CSource+Code+Pro:400,400i,600" />
+ <link rel="stylesheet" href="m-dark+documentation.compiled.css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+</head>
+<body>
+<header><nav id="navigation">
+ <div class="m-container">
+ <div class="m-row">
+ <a href="index.html" id="m-navbar-brand" class="m-col-t-8 m-col-m-none m-left-m">My Project</a>
+ </div>
+ </div>
+</nav></header>
+<main><article>
+ <div class="m-container m-container-inflatable">
+ <div class="m-row">
+ <div class="m-col-l-10 m-push-l-1">
+ <h1>
+ <div class="m-doc-template">template<class T></div>
+ SpreadClass <span class="m-thin">struct</span>
+ </h1>
+ <p>A class forward-declared in one file but defined in another.</p>
+ <div class="m-block m-default">
+ <h3>Contents</h3>
+ <ul>
+ <li>
+ Reference
+ <ul>
+ <li><a href="#pub-methods">Public functions</a></li>
+ </ul>
+ </li>
+ </ul>
+ </div>
+<p>Because Doxygen is stupid, it reports the class to be defined in First.h even though there's just a fwdecl. Happens only if the class is a template, a non-templated class would have its location reported correctly.</p><p>If includes are enabled, members should have Second.h listed as their include, but if they are disabled, brief-only members shouldn't have detailed sections at all.</p>
+ <section id="pub-methods">
+ <h2><a href="#pub-methods">Public functions</a></h2>
+ <dl class="m-doc">
+ <dt id="a0537e4d57c78086a29ab6143da0d9a21">
+ <span class="m-doc-wrap-bumper">void <a href="#a0537e4d57c78086a29ab6143da0d9a21" class="m-doc-self">foo</a>(</span><span class="m-doc-wrap">)</span>
+ </dt>
+ <dd>A function with (detailed) include information but no details if includes are disabled.</dd>
+ </dl>
+ </section>
+ </div>
+ </div>
+ </div>
+</article></main>
+</body>
+</html>
XML_PROGRAMLISTING = NO
CASE_SENSE_NAMES = YES
+
##! M_PAGE_FINE_PRINT =
##! M_THEME_COLOR =
##! M_FAVICON =
##! M_LINKS_NAVBAR1 =
##! M_LINKS_NAVBAR2 =
##! M_SEARCH_DISABLED = YES
+
+AUTOLINK_SUPPORT = NO # otherwise it links to Second.h, DO NOT WANT
*/
/** @related Class
- * @brief A related enum in a different file
+ * @brief A related enum in a different file. Detailed info only if includes not disabled.
*/
enum RelatedEnum {};
/** @related Class
- * @brief A related typedef in a different file
+ * @brief A related typedef in a different file. Detailed info only if includes not disabled.
*/
typedef int RelatedInt;
/** @related Class
- * @brief A related variable in a different file
+ * @brief A related variable in a different file. Detailed info only if includes not disabled.
*/
constexpr const int RelatedVar = 3;
/** @related Class
- * @brief A related function in a different file
+ * @brief A related function in a different file. Detailed info only if includes not disabled.
*/
void relatedFunc();
/** @related Class
- * @brief A related define in a different file
+ * @brief A related define in a different file. Detailed info only if includes not disabled.
*/
#define RELATED_DEFINE
}
+
+/**
+@brief A class forward-declared in one file but defined in another
+
+Because Doxygen is stupid, it reports the class to be defined in First.h even
+though there's just a fwdecl. Happens only if the class is a template,
+a non-templated class would have its location reported correctly.
+
+If includes are enabled, members should have Second.h listed as their include,
+but if they are disabled, brief-only members shouldn't have detailed sections
+at all.
+*/
+template<class T> struct SpreadClass {
+ /** @brief A function with (detailed) include information but no details if includes are disabled */
+ void foo();
+};
# The Contained namespace should have just the global include, the
# Spread just the local includes, the class a global include and the
- # group, even though in a single file, should have local includes
+ # group, even though in a single file, should have local includes; and
+ # the SpreadClass struct is forward-declared in another file, which
+ # triggers a silly Doxygen bug so it has per-member includes also
self.assertEqual(*self.actual_expected_contents('namespaceContained.html'))
self.assertEqual(*self.actual_expected_contents('namespaceSpread.html'))
self.assertEqual(*self.actual_expected_contents('classClass.html'))
self.assertEqual(*self.actual_expected_contents('group__group.html'))
+ self.assertEqual(*self.actual_expected_contents('structSpreadClass.html'))
# These two should all have local includes because otherwise it gets
# misleading; the Empty namespace a global one
def test(self):
self.run_doxygen(wildcard='*.xml')
- # No include information as SHOW_INCLUDE_FILES is disabled globally
+ # No include information as SHOW_INCLUDE_FILES is disabled globally,
+ # and no useless detailed sections either
self.assertEqual(*self.actual_expected_contents('namespaceContained.html'))
self.assertEqual(*self.actual_expected_contents('namespaceSpread.html'))
self.assertEqual(*self.actual_expected_contents('classClass.html'))
self.assertEqual(*self.actual_expected_contents('group__group.html'))
+ self.assertEqual(*self.actual_expected_contents('structSpreadClass.html'))
class IncludesUndocumentedFiles(IntegrationTestCase):
def __init__(self, *args, **kwargs):
self.run_doxygen(wildcard='*.xml')
# The files are not documented, so there should be no include
- # information -- practically the same output as when SHOW_INCLUDE_FILES
- # is disabled globally
+ # information and no useless detailed sections either -- practically
+ # the same output as when SHOW_INCLUDE_FILES is disabled globally
self.assertEqual(*self.actual_expected_contents('namespaceContained.html', '../compound_includes_disabled/namespaceContained.html'))
self.assertEqual(*self.actual_expected_contents('namespaceSpread.html', '../compound_includes_disabled/namespaceSpread.html'))
self.assertEqual(*self.actual_expected_contents('classClass.html', '../compound_includes_disabled/classClass.html'))
self.assertEqual(*self.actual_expected_contents('group__group.html', '../compound_includes_disabled/group__group.html'))
+ self.assertEqual(*self.actual_expected_contents('structSpreadClass.html', '../compound_includes_disabled/structSpreadClass.html'))
class IncludesTemplated(IntegrationTestCase):
def __init__(self, *args, **kwargs):