diff options
author | Vladimír Vondruš <mosra@centrum.cz> | 2019-01-01 17:01:22 (GMT) |
---|---|---|
committer | Vladimír Vondruš <mosra@centrum.cz> | 2019-01-03 10:32:17 (GMT) |
commit | d18b3eaf3486e224fa9de7e77b536883952b40b9 (patch) | |
tree | 045620bc9c59d68e2fb32bf035f0147e164a360b /testing | |
parent | 3b2198babbaf8edafe03e5298e7c194763a1f9fa (diff) | |
download | Doxygen-d18b3eaf3486e224fa9de7e77b536883952b40b9.zip Doxygen-d18b3eaf3486e224fa9de7e77b536883952b40b9.tar.gz Doxygen-d18b3eaf3486e224fa9de7e77b536883952b40b9.tar.bz2 |
Implement a new EXTRACT_PRIVATE_VIRTUAL option.
The classic article about virtuality from Herb Sutter [1] suggests that
virtual functions are always private and public class interface is never
virtual. Until now, it was not really possible to document these
functions in Doxygen:
* Enabling EXTRACT_PRIVATE would show all internals, not just virtual
functions, which is not wanted.
* Enabling HIDE_UNDOC_MEMBERS and HIDE_UNDOC_CLASSES would effectively
disable warnings about *all* undocumented members, which is not wanted.
The usual workaround was to put the members into protected scope just
for Doxygen:
#ifdef DOXYGEN_GENERATING_OUTPUT
protected:
#else
private:
#endif
/** @brief Documented private virtual function */
virtual doStuff();
The new EXTRACT_PRIVATE_VIRTUAL option makes these visible (and able to
be linked to), but shows them *only* if they are documented.
[1] http://www.gotw.ca/publications/mill18.htm
Diffstat (limited to 'testing')
-rw-r--r-- | testing/081/class_interface.xml | 110 | ||||
-rw-r--r-- | testing/081_extract_private_virtual.cpp | 35 |
2 files changed, 145 insertions, 0 deletions
diff --git a/testing/081/class_interface.xml b/testing/081/class_interface.xml new file mode 100644 index 0000000..2385b86 --- /dev/null +++ b/testing/081/class_interface.xml @@ -0,0 +1,110 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version=""> + <compounddef id="class_interface" kind="class" language="C++" prot="public" abstract="yes"> + <compoundname>Interface</compoundname> + <sectiondef kind="public-func"> + <memberdef kind="function" id="class_interface_1ab58d3008a7001cbb47f2fa5a5a1aeefa" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type>void</type> + <definition>void Interface::load</definition> + <argsstring>()</argsstring> + <name>load</name> + <briefdescription> + <para>Load things. </para> + </briefdescription> + <detaileddescription> + <para>Calls <ref refid="class_interface_1a328e0a16ccee5d796ca93801a055d27d" kindref="member">doLoad()</ref>. </para> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="081_extract_private_virtual.cpp" line="13" column="1"/> + </memberdef> + </sectiondef> + <sectiondef kind="private-func"> + <memberdef kind="function" id="class_interface_1a328e0a16ccee5d796ca93801a055d27d" prot="private" static="no" const="no" explicit="no" inline="no" virt="pure-virtual"> + <type>void</type> + <definition>virtual void Interface::doLoad</definition> + <argsstring>()=0</argsstring> + <name>doLoad</name> + <briefdescription> + <para>Pure virtual implementation for <ref refid="class_interface_1ab58d3008a7001cbb47f2fa5a5a1aeefa" kindref="member">load()</ref> </para> + </briefdescription> + <detaileddescription> + <para>Details. </para> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="081_extract_private_virtual.cpp" line="21" column="1"/> + </memberdef> + <memberdef kind="function" id="class_interface_1ad13fffb1181ab0da1f8fbb586eff9afe" prot="private" static="no" const="no" explicit="no" inline="no" virt="virtual"> + <type>void</type> + <definition>virtual void Interface::doOtherStuff</definition> + <argsstring>()</argsstring> + <name>doOtherStuff</name> + <briefdescription> + <para>Non-pure virtual function. </para> + </briefdescription> + <detaileddescription> + <para>Details. </para> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="081_extract_private_virtual.cpp" line="28" column="1"/> + </memberdef> + <memberdef kind="function" id="class_interface_1a46062977049a7c2c2c141e4487e954b8" prot="private" static="no" const="no" explicit="no" inline="no" virt="virtual"> + <type>void</type> + <definition>virtual void Interface::doSomethingUndocumented</definition> + <argsstring>()</argsstring> + <name>doSomethingUndocumented</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="081_extract_private_virtual.cpp" line="31" column="1"/> + </memberdef> + <memberdef kind="function" id="class_interface_1a108dce1debd0596b57e7985bbb0f63a1" prot="private" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type>void</type> + <definition>void Interface::someUtility</definition> + <argsstring>()</argsstring> + <name>someUtility</name> + <briefdescription> + <para>A non-virtual private function, not extracted. </para> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="081_extract_private_virtual.cpp" line="34" column="1"/> + </memberdef> + </sectiondef> + <briefdescription> + <para>An interface. </para> + </briefdescription> + <detaileddescription> + </detaileddescription> + <location file="081_extract_private_virtual.cpp" line="6" column="1" bodyfile="081_extract_private_virtual.cpp" bodystart="6" bodyend="35"/> + <listofallmembers> + <member refid="class_interface_1a328e0a16ccee5d796ca93801a055d27d" prot="private" virt="pure-virtual"> + <scope>Interface</scope> + <name>doLoad</name> + </member> + <member refid="class_interface_1ad13fffb1181ab0da1f8fbb586eff9afe" prot="private" virt="virtual"> + <scope>Interface</scope> + <name>doOtherStuff</name> + </member> + <member refid="class_interface_1a46062977049a7c2c2c141e4487e954b8" prot="private" virt="virtual"> + <scope>Interface</scope> + <name>doSomethingUndocumented</name> + </member> + <member refid="class_interface_1ab58d3008a7001cbb47f2fa5a5a1aeefa" prot="public" virt="non-virtual"> + <scope>Interface</scope> + <name>load</name> + </member> + <member refid="class_interface_1a108dce1debd0596b57e7985bbb0f63a1" prot="private" virt="non-virtual"> + <scope>Interface</scope> + <name>someUtility</name> + </member> + </listofallmembers> + </compounddef> +</doxygen> diff --git a/testing/081_extract_private_virtual.cpp b/testing/081_extract_private_virtual.cpp new file mode 100644 index 0000000..ce4ed30 --- /dev/null +++ b/testing/081_extract_private_virtual.cpp @@ -0,0 +1,35 @@ +// objective: allow linking to private virtual functions +// check: class_interface.xml +// config: EXTRACT_PRIVATE_VIRTUAL = YES + +/** @brief An interface */ +class Interface { + public: + /** + * @brief Load things. + * + * Calls @ref doLoad(). + */ + void load(); + + private: + /** + * @brief Pure virtual implementation for @ref load() + * + * Details. + */ + virtual void doLoad() = 0; + + /** + * @brief Non-pure virtual function + * + * Details. + */ + virtual void doOtherStuff(); + + /* Undocumented, should not appear in the docs */ + virtual void doSomethingUndocumented(); + + /** @brief A non-virtual private function, not extracted */ + void someUtility(); +}; |