From 255a1144166a1fa03c65fe3970dc77a5d081402c Mon Sep 17 00:00:00 2001
From: Martin Smith <martin.smith@nokia.com>
Date: Tue, 22 Jun 2010 13:29:32 +0200
Subject: doc: Added more DITA output to the XML generator

Some of the cxxVariable stuff for properties.

Task-number:  	 QTBUG-11391
---
 tools/qdoc3/ditaxmlgenerator.cpp | 69 +++++++++++++++++++++++++++++++++++++---
 tools/qdoc3/ditaxmlgenerator.h   |  2 +-
 tools/qdoc3/node.cpp             |  8 +++--
 3 files changed, 71 insertions(+), 8 deletions(-)

diff --git a/tools/qdoc3/ditaxmlgenerator.cpp b/tools/qdoc3/ditaxmlgenerator.cpp
index c7b236a..be734ac 100644
--- a/tools/qdoc3/ditaxmlgenerator.cpp
+++ b/tools/qdoc3/ditaxmlgenerator.cpp
@@ -1442,7 +1442,7 @@ DitaXmlGenerator::generateClassLikeNode(const InnerNode* inner, CodeMarker* mark
             writer.writeEndElement(); // </cxxClassAbstract>
         }
         writeDerivations(cn, marker);
-        writeLocation(cn, marker);
+        writeLocation(cn);
         writer.writeEndElement(); // <cxxClassDefinition>
         writer.writeStartElement(APIDESC);
 
@@ -4550,7 +4550,7 @@ void DitaXmlGenerator::writeDerivations(const ClassNode* cn, CodeMarker* marker)
      }
 }
 
-void DitaXmlGenerator::writeLocation(const Node* n, CodeMarker* marker)
+void DitaXmlGenerator::writeLocation(const Node* n)
 {
     QString s1, s2, s3;
     if (n->type() == Node::Class) {
@@ -4573,6 +4573,11 @@ void DitaXmlGenerator::writeLocation(const Node* n, CodeMarker* marker)
         s2 = CXXTYPEDEFDECLARATIONFILE;
         s3 = CXXTYPEDEFDECLARATIONFILELINE;
     }
+    else if (n->type() == Node::Property) {
+        s1 = CXXVARIABLEAPIITEMLOCATION;
+        s2 = CXXVARIABLEDECLARATIONFILE;
+        s3 = CXXVARIABLEDECLARATIONFILELINE;
+    }
     writer.writeStartElement(s1);
     writer.writeStartElement(s2);
     writer.writeAttribute("name","filePath");
@@ -4679,7 +4684,7 @@ void DitaXmlGenerator::writeFunctions(const Section& s,
                 writer.writeEndElement(); // </cxxFunctionReimplemented>
             }
             writeParameters(fn,marker);
-            writeLocation(fn, marker);
+            writeLocation(fn);
             writer.writeEndElement(); // <cxxFunctionDefinition>
             writer.writeStartElement(APIDESC);
 
@@ -4821,7 +4826,7 @@ void DitaXmlGenerator::writeEnumerations(const Section& s,
                 writer.writeEndElement(); // <cxxEnumerators>
             }
             
-            writeLocation(en, marker);
+            writeLocation(en);
             writer.writeEndElement(); // <cxxEnumerationDefinition>
             writer.writeStartElement(APIDESC);
 
@@ -4867,7 +4872,7 @@ void DitaXmlGenerator::writeTypedefs(const Section& s,
             writer.writeCharacters(tn->parent()->name() + "::" + tn->name());
             writer.writeEndElement(); // <cxxTypedefNameLookup>
             
-            writeLocation(tn, marker);
+            writeLocation(tn);
             writer.writeEndElement(); // <cxxTypedefDefinition>
             writer.writeStartElement(APIDESC);
 
@@ -4893,6 +4898,60 @@ void DitaXmlGenerator::writeProperties(const Section& s,
                                        const ClassNode* cn, 
                                        CodeMarker* marker)
 {
+    NodeList::ConstIterator m = s.members.begin();
+    while (m != s.members.end()) {
+        if ((*m)->type() == Node::Property) {
+            const PropertyNode* pn = static_cast<const PropertyNode*>(*m);
+            writer.writeStartElement(CXXVARIABLE);
+            writer.writeAttribute("id",pn->guid());
+            writer.writeStartElement(APINAME);
+            writer.writeCharacters(pn->name());
+            writer.writeEndElement(); // </apiName>
+            generateBrief(pn,marker);
+            writer.writeStartElement(CXXVARIABLEDETAIL);
+            writer.writeStartElement(CXXVARIABLEDEFINITION);
+            writer.writeStartElement(CXXVARIABLEACCESSSPECIFIER);
+            writer.writeAttribute("value",pn->accessString());
+            writer.writeEndElement(); // <cxxVariableAccessSpecifier>
+
+            if (!pn->dataType().isEmpty()) {
+                writer.writeStartElement(CXXVARIABLEDECLAREDTYPE);
+                writer.writeCharacters(pn->dataType());
+                writer.writeEndElement(); // <cxxVariableDeclaredType>
+            }
+            QString fq = fullQualification(pn);
+            if (!fq.isEmpty()) {
+                writer.writeStartElement(CXXVARIABLESCOPEDNAME);
+                writer.writeCharacters(fq);
+                writer.writeEndElement(); // <cxxVariableScopedName>
+            }
+            writer.writeStartElement(CXXVARIABLENAMELOOKUP);
+            writer.writeCharacters(pn->parent()->name() + "::" + pn->name());
+            writer.writeEndElement(); // <cxxVariableNameLookup>
+
+
+            if (pn->overriddenFrom() != 0) {
+                PropertyNode* opn = (PropertyNode*)pn->overriddenFrom();
+                writer.writeStartElement(CXXVARIABLEREIMPLEMENTED);
+                writer.writeAttribute("href",opn->ditaXmlHref());
+                writer.writeCharacters(marker->plainFullName(opn));
+                writer.writeEndElement(); // </cxxVariableReimplemented>
+            }
+
+            writeLocation(pn);
+            writer.writeEndElement(); // <cxxVariableDefinition>
+            writer.writeStartElement(APIDESC);
+
+            if (!pn->doc().isEmpty()) {
+                generateBody(pn, marker);
+            }
+
+            writer.writeEndElement(); // </apiDesc>
+            writer.writeEndElement(); // </cxxVariableDetail>
+            writer.writeEndElement(); // </cxxVariable>
+        }
+        ++m;
+    }
 }
 
 QT_END_NAMESPACE
diff --git a/tools/qdoc3/ditaxmlgenerator.h b/tools/qdoc3/ditaxmlgenerator.h
index fb9498c..8c7e439 100644
--- a/tools/qdoc3/ditaxmlgenerator.h
+++ b/tools/qdoc3/ditaxmlgenerator.h
@@ -113,7 +113,7 @@ class DitaXmlGenerator : public PageGenerator
     QString fullQualification(const Node* n);
 
     void writeDerivations(const ClassNode* cn, CodeMarker* marker);
-    void writeLocation(const Node* n, CodeMarker* marker);
+    void writeLocation(const Node* n);
     void writeFunctions(const Section& s, 
                         const ClassNode* cn, 
                         CodeMarker* marker);
diff --git a/tools/qdoc3/node.cpp b/tools/qdoc3/node.cpp
index 2586733..26957ac 100644
--- a/tools/qdoc3/node.cpp
+++ b/tools/qdoc3/node.cpp
@@ -263,10 +263,14 @@ QUuid Node::guid() const
 QString Node::ditaXmlHref()
 {
     QString href;
-    if (type() == Function)
+    if ((type() == Function) ||
+        (type() == Property) ||
+        (type() == Variable)) {
         href = parent()->fileBase();
-    else
+    }
+    else {
         href = fileBase();
+    }
     if (!href.endsWith(".xml"))
         href += ".xml";
     return href + "#" + guid();
-- 
cgit v0.12