summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTopi Reinio <topi.reinio@qt.io>2018-11-14 12:53:31 +0100
committerTopi Reiniƶ <topi.reinio@qt.io>2018-11-15 23:01:55 +0000
commit4367cf318359a6a2a594252d51676aca7dd8f5e6 (patch)
tree9ebd490744f4f3ae6d962d5c882e2d617f469bfd
parent5a678ec9a8ae5159456e4af7b81968e4ea027d6b (diff)
downloadqttools-4367cf318359a6a2a594252d51676aca7dd8f5e6.tar.gz
qdoc: Skip section headers with no content on C++ reference pages
Since the section-related refactoring, QDoc sometimes produced section headers (e.g. '<h2>Property Documentation</h2>', even though the class didn't have any properties. Output the section header only once we know there is something to generate under that section. Task-number: QTBUG-71792 Change-Id: I09948798883468c4bca15b3cdcf6703f05cf183f Reviewed-by: Martin Smith <martin.smith@qt.io>
-rw-r--r--src/qdoc/htmlgenerator.cpp96
1 files changed, 47 insertions, 49 deletions
diff --git a/src/qdoc/htmlgenerator.cpp b/src/qdoc/htmlgenerator.cpp
index c9f44863f..633ebfa0f 100644
--- a/src/qdoc/htmlgenerator.cpp
+++ b/src/qdoc/htmlgenerator.cpp
@@ -1399,7 +1399,6 @@ void HtmlGenerator::generateCppReferencePage(Node* node, CodeMarker* marker)
}
else {
if (!s->members().isEmpty()) {
- // out() << "<hr />\n";
QString ref = registerRef(s->title().toLower());
out() << "<a name=\"" << ref << "\"></a>" << divNavTop << "\n";
out() << "<h2 id=\"" << ref << "\">" << protectEnc(s->title()) << "</h2>\n";
@@ -1408,7 +1407,6 @@ void HtmlGenerator::generateCppReferencePage(Node* node, CodeMarker* marker)
if (!s->reimplementedMembers().isEmpty()) {
QString name = QString("Reimplemented ") + s->title();
QString ref = registerRef(name.toLower());
- // out() << "<hr />\n";
out() << "<a name=\"" << ref << "\"></a>" << divNavTop << "\n";
out() << "<h2 id=\"" << ref << "\">" << protectEnc(name) << "</h2>\n";
generateSection(s->reimplementedMembers(), aggregate, marker);
@@ -1441,7 +1439,6 @@ void HtmlGenerator::generateCppReferencePage(Node* node, CodeMarker* marker)
if (!aggregate->doc().isEmpty()) {
generateExtractionMark(aggregate, DetailedDescriptionMark);
- //out() << "<hr />\n"
out() << "<div class=\"descr\">\n" // QTBUG-9504
<< "<h2 id=\"" << detailsRef << "\">" << "Detailed Description" << "</h2>\n";
generateBody(aggregate, marker);
@@ -1454,57 +1451,58 @@ void HtmlGenerator::generateCppReferencePage(Node* node, CodeMarker* marker)
sectionVector = ns ? &sections.stdDetailsSections() : &sections.stdCppClassDetailsSections();
s = sectionVector->constBegin();
while (s != sectionVector->constEnd()) {
- //out() << "<hr />\n";
- if (!s->divClass().isEmpty())
- out() << "<div class=\"" << s->divClass() << "\">\n"; // QTBUG-9504
- out() << "<h2>" << protectEnc(s->title()) << "</h2>\n";
-
+ bool headerGenerated = false;
NodeVector::ConstIterator m = s->members().constBegin();
while (m != s->members().constEnd()) {
- if ((*m)->access() != Node::Private) { // ### check necessary?
- if ((*m)->type() != Node::Class)
- generateDetailedMember(*m, aggregate, marker);
- else {
- out() << "<h3> class ";
- generateFullName(*m, aggregate);
- out() << "</h3>";
- generateBrief(*m, marker, aggregate);
- }
-
- QStringList names;
- names << (*m)->name();
- if ((*m)->type() == Node::Function) {
- const FunctionNode *func = reinterpret_cast<const FunctionNode *>(*m);
- if (func->isSomeCtor() || func->isDtor() || func->overloadNumber() != 0)
- names.clear();
- }
- else if ((*m)->type() == Node::Property) {
- const PropertyNode *prop = reinterpret_cast<const PropertyNode *>(*m);
- if (!prop->getters().isEmpty() &&
- !names.contains(prop->getters().first()->name()))
- names << prop->getters().first()->name();
- if (!prop->setters().isEmpty())
- names << prop->setters().first()->name();
- if (!prop->resetters().isEmpty())
- names << prop->resetters().first()->name();
- if (!prop->notifiers().isEmpty())
- names << prop->notifiers().first()->name();
- }
- else if ((*m)->type() == Node::Enum) {
- const EnumNode *enume = reinterpret_cast<const EnumNode*>(*m);
- if (enume->flagsType())
- names << enume->flagsType()->name();
-
- foreach (const QString &enumName,
- enume->doc().enumItemNames().toSet() -
- enume->doc().omitEnumItemNames().toSet())
- names << plainCode(marker->markedUpEnumValue(enumName,
- enume));
- }
+ if ((*m)->access() == Node::Private) { // ### check necessary?
+ ++m;
+ continue;
+ }
+ if (!headerGenerated) {
+ if (!s->divClass().isEmpty())
+ out() << "<div class=\"" << s->divClass() << "\">\n"; // QTBUG-9504
+ out() << "<h2>" << protectEnc(s->title()) << "</h2>\n";
+ headerGenerated = true;
+ }
+ if ((*m)->type() != Node::Class)
+ generateDetailedMember(*m, aggregate, marker);
+ else {
+ out() << "<h3> class ";
+ generateFullName(*m, aggregate);
+ out() << "</h3>";
+ generateBrief(*m, marker, aggregate);
+ }
+ QStringList names;
+ names << (*m)->name();
+ if ((*m)->type() == Node::Function) {
+ const FunctionNode *func = reinterpret_cast<const FunctionNode *>(*m);
+ if (func->isSomeCtor() || func->isDtor() || func->overloadNumber() != 0)
+ names.clear();
+ } else if ((*m)->type() == Node::Property) {
+ const PropertyNode *prop = reinterpret_cast<const PropertyNode *>(*m);
+ if (!prop->getters().isEmpty() &&
+ !names.contains(prop->getters().first()->name()))
+ names << prop->getters().first()->name();
+ if (!prop->setters().isEmpty())
+ names << prop->setters().first()->name();
+ if (!prop->resetters().isEmpty())
+ names << prop->resetters().first()->name();
+ if (!prop->notifiers().isEmpty())
+ names << prop->notifiers().first()->name();
+ } else if ((*m)->type() == Node::Enum) {
+ const EnumNode *enume = reinterpret_cast<const EnumNode*>(*m);
+ if (enume->flagsType())
+ names << enume->flagsType()->name();
+
+ foreach (const QString &enumName,
+ enume->doc().enumItemNames().toSet() -
+ enume->doc().omitEnumItemNames().toSet())
+ names << plainCode(marker->markedUpEnumValue(enumName,
+ enume));
}
++m;
}
- if (!s->divClass().isEmpty())
+ if (headerGenerated && !s->divClass().isEmpty())
out() << "</div>\n"; // QTBUG-9504
++s;
}