From c8e79294237260d735324663932a676d8084efcb Mon Sep 17 00:00:00 2001
From: Topi Reinio <topi.reinio@qt.io>
Date: Fri, 20 Sep 2019 00:19:45 +0200
Subject: [PATCH] qdoc: WebXML output: Fix output for \group and \annotatedlist

The WebXMLGenerator did not handle atoms of type AnnotatedList. Adding
this enables listing of grouped pages with the \annotatedlist command.

Similarly, empty output page was generated for the \group page itself.
This was because QDocIndexFiles::generateIndexSections() only handled
groups when processing the root node, which we must skip in this
generator.

Add explicit handling for group nodes, enabling us to receive
callbacks from QDocIndexFiles to add content for these pages.

Task-number: PYSIDE-1088
Change-Id: Id72d589a51fc7aae21ad5cdbb3c1dfa78d4c23ae
Reviewed-by: Venugopal Shivashankar <Venugopal.Shivashankar@qt.io>
Reviewed-by: Paul Wicking <paul.wicking@qt.io>
---
 src/qdoc/webxmlgenerator.cpp | 34 ++++++++++++++++++++++++++++------
 src/qdoc/webxmlgenerator.h   |  1 +
 2 files changed, 29 insertions(+), 6 deletions(-)

diff --git a/src/qdoc/webxmlgenerator.cpp b/src/qdoc/webxmlgenerator.cpp
index 20c655890..cc067b480 100644
--- a/src/qdoc/webxmlgenerator.cpp
+++ b/src/qdoc/webxmlgenerator.cpp
@@ -166,6 +166,9 @@ void WebXMLGenerator::generateIndexSections(QXmlStreamWriter &writer, Node *node
 {
     marker_ = CodeMarker::markerForFileName(node->location().filePath());
     QDocIndexFiles::qdocIndexFiles()->generateIndexSections(writer, node, this);
+    // generateIndexSections does nothing for groups, so handle them explicitly
+    if (node->isGroup())
+        QDocIndexFiles::qdocIndexFiles()->generateIndexSection(writer, node, this);
 }
 
 // Handles callbacks from QDocIndexFiles to add documentation to node
@@ -230,10 +233,15 @@ void WebXMLGenerator::append(QXmlStreamWriter &writer, Node *node)
         }
         writer.writeEndElement(); // see-also
     }
+
     if (node->isExample()) {
         supplement = true;
         generateRequiredLinks(node, marker_);
         supplement = false;
+    } else if (node->isGroup()) {
+        CollectionNode *cn = static_cast<CollectionNode *>(node);
+        if (!cn->noAutoList())
+            generateAnnotatedList(writer, node, cn->members());
     }
 
     writer.writeEndElement(); // description
@@ -281,6 +289,13 @@ const Atom *WebXMLGenerator::addAtomElements(QXmlStreamWriter &writer,
     bool keepQuoting = false;
 
     switch (atom->type()) {
+    case Atom::AnnotatedList:
+    {
+        const CollectionNode* cn = qdb_->getCollectionNode(atom->string(), Node::Group);
+        if (cn)
+            generateAnnotatedList(writer, relative, cn->members());
+    }
+        break;
     case Atom::AutoLink:
         if (!inLink && !inSectionHeading) {
             const Node *node = nullptr;
@@ -864,14 +879,17 @@ void WebXMLGenerator::generateRelations(QXmlStreamWriter &writer, const Node *no
 
 void WebXMLGenerator::generateAnnotatedList(QXmlStreamWriter &writer,
     const Node *relative, const NodeMap &nodeMap)
+{
+    generateAnnotatedList(writer, relative, nodeMap.values());
+}
+
+void WebXMLGenerator::generateAnnotatedList(QXmlStreamWriter &writer,
+    const Node *relative, const NodeList &nodeList)
 {
     writer.writeStartElement("table");
     writer.writeAttribute("width", "100%");
 
-    for (NodeMap::const_iterator it = nodeMap.cbegin(),
-         end = nodeMap.cend(); it != end; ++it) {
-        const Node *node = it.value();
-
+    for (const auto *node : nodeList) {
         writer.writeStartElement("row");
         writer.writeStartElement("heading");
         generateFullName(writer, node, relative);
@@ -888,10 +906,14 @@ void WebXMLGenerator::generateAnnotatedList(QXmlStreamWriter &writer,
 void WebXMLGenerator::generateFullName(QXmlStreamWriter &writer,
     const Node *node, const Node *relative)
 {
+    QString type = targetType(node);
+    QString name = node->fullName(relative);
     writer.writeStartElement("link");
     writer.writeAttribute("href", fullDocumentLocation(node));
-    writer.writeAttribute("type", targetType(node));
-    writer.writeCharacters(node->fullName(relative));
+    writer.writeAttribute("type", type);
+    if (type == QLatin1String("page"))
+        writer.writeAttribute("page", name);
+    writer.writeCharacters(name);
     writer.writeEndElement(); // link
 }
 
diff --git a/src/qdoc/webxmlgenerator.h b/src/qdoc/webxmlgenerator.h
index bdd28dd2f..cfb87382b 100644
--- a/src/qdoc/webxmlgenerator.h
+++ b/src/qdoc/webxmlgenerator.h
@@ -67,6 +67,7 @@ protected:
 private:
     const QPair<QString,QString> anchorForNode(const Node *node);
     void generateAnnotatedList(QXmlStreamWriter &writer, const Node *relative, const NodeMap &nodeMap);
+    void generateAnnotatedList(QXmlStreamWriter &writer, const Node *relative, const NodeList &nodeList);
     void generateFullName(QXmlStreamWriter &writer, const Node *node,
                           const Node *relative);
     void generateRelations(QXmlStreamWriter &writer, const Node *node);
-- 
GitLab