diff options
author | Topi Reinio <topi.reinio@qt.io> | 2018-11-14 12:53:31 +0100 |
---|---|---|
committer | Topi Reiniƶ <topi.reinio@qt.io> | 2018-11-15 23:01:55 +0000 |
commit | 4367cf318359a6a2a594252d51676aca7dd8f5e6 (patch) | |
tree | 9ebd490744f4f3ae6d962d5c882e2d617f469bfd | |
parent | 5a678ec9a8ae5159456e4af7b81968e4ea027d6b (diff) | |
download | qttools-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.cpp | 96 |
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 ? §ions.stdDetailsSections() : §ions.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; } |