summaryrefslogtreecommitdiffstats
path: root/testing
diff options
context:
space:
mode:
authorVladimír Vondruš <mosra@centrum.cz>2019-01-01 17:01:22 (GMT)
committerVladimír Vondruš <mosra@centrum.cz>2019-01-03 10:32:17 (GMT)
commitd18b3eaf3486e224fa9de7e77b536883952b40b9 (patch)
tree045620bc9c59d68e2fb32bf035f0147e164a360b /testing
parent3b2198babbaf8edafe03e5298e7c194763a1f9fa (diff)
downloadDoxygen-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.xml110
-rw-r--r--testing/081_extract_private_virtual.cpp35
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();
+};