diff options
author | David Boddie <dboddie@trolltech.com> | 2010-06-18 15:38:40 (GMT) |
---|---|---|
committer | David Boddie <dboddie@trolltech.com> | 2010-06-18 15:38:40 (GMT) |
commit | fc0e74d5661da0a678a60082dae60d4564da94b0 (patch) | |
tree | 512256a8bfc49ed4a17a821b8e683662b65e6ddc /tools/qdoc3 | |
parent | e5302035d91f4337db25cf805c6b13339c552cbf (diff) | |
parent | b82466a64e305af8c557b2b7fdbb4a386e3d9cd7 (diff) | |
download | Qt-fc0e74d5661da0a678a60082dae60d4564da94b0.zip Qt-fc0e74d5661da0a678a60082dae60d4564da94b0.tar.gz Qt-fc0e74d5661da0a678a60082dae60d4564da94b0.tar.bz2 |
Merge branch '4.7' of scm.dev.nokia.troll.no:qt/oslo-staging-1 into 4.7
Diffstat (limited to 'tools/qdoc3')
-rw-r--r-- | tools/qdoc3/ditaxmlgenerator.cpp | 240 | ||||
-rw-r--r-- | tools/qdoc3/ditaxmlgenerator.h | 22 | ||||
-rw-r--r-- | tools/qdoc3/node.cpp | 49 | ||||
-rw-r--r-- | tools/qdoc3/node.h | 11 |
4 files changed, 301 insertions, 21 deletions
diff --git a/tools/qdoc3/ditaxmlgenerator.cpp b/tools/qdoc3/ditaxmlgenerator.cpp index 197bc13..e80f948 100644 --- a/tools/qdoc3/ditaxmlgenerator.cpp +++ b/tools/qdoc3/ditaxmlgenerator.cpp @@ -501,19 +501,18 @@ QString DitaXmlGenerator::format() } /*! - Create a new GUID, write it to the XML stream - as an "id" attribute, and return it. + Calls lookupGuid() to get a GUID for \a text, then writes + it to the XML stream as an "id" attribute, and returns it. */ QString DitaXmlGenerator::writeGuidAttribute(QString text) { - QString guid = QUuid::createUuid().toString(); - name2guidMap.insert(text,guid); + QString guid = lookupGuid(text); writer.writeAttribute("id",guid); return guid; } /*! - Looks up \a text in the GUID map. It it finds \a text, + Looks up \a text in the GUID map. If it finds \a text, it returns the associated GUID. Otherwise it inserts \a text into the map with a new GUID, and it returns the new GUID. @@ -1424,7 +1423,7 @@ DitaXmlGenerator::generateClassLikeNode(const InnerNode* inner, CodeMarker* mark generateHeader(inner); writer.writeStartElement(CXXCLASS); - writeGuidAttribute(fullTitle); + writer.writeAttribute("id",cn->guid()); writer.writeStartElement(APINAME); writer.writeCharacters(fullTitle); writer.writeEndElement(); // </apiName> @@ -1436,6 +1435,12 @@ DitaXmlGenerator::generateClassLikeNode(const InnerNode* inner, CodeMarker* mark writer.writeStartElement(CXXCLASSACCESSSPECIFIER); writer.writeAttribute("value",inner->accessString()); writer.writeEndElement(); // <cxxClassAccessSpecifier> + if (cn->isAbstract()) { + writer.writeStartElement(CXXCLASSABSTRACT); + writer.writeAttribute("name","abstract"); + writer.writeAttribute("value","abstract"); + writer.writeEndElement(); // </cxxClassAbstract> + } writeDerivations(cn, marker); writeLocation(cn, marker); writer.writeEndElement(); // <cxxClassDefinition> @@ -1452,6 +1457,26 @@ DitaXmlGenerator::generateClassLikeNode(const InnerNode* inner, CodeMarker* mark writer.writeEndElement(); // </apiDesc> writer.writeEndElement(); // </cxxClassDetail> + + sections = marker->sections(inner, CodeMarker::Detailed, CodeMarker::Okay); + s = sections.begin(); + while (s != sections.end()) { + if ((*s).name == "Member Function Documentation") { + writeFunctions((*s),cn,marker); + } + else if ((*s).name == "Member Type Documentation") { + writeNestedClasses((*s),cn,marker); + writeEnumerations((*s),cn,marker); + writeTypedefs((*s),cn,marker); + } + else if ((*s).name == "Member Variable Documentation") { + writeDataMembers((*s),cn,marker); + } + else if ((*s).name == "Property Documentation") { + writeProperties((*s),cn,marker); + } + ++s; + } writer.writeEndElement(); // </cxxClass> } @@ -4475,6 +4500,31 @@ void DitaXmlGenerator::generatePageIndex(const QString& fileName, CodeMarker* ma #endif +/*! + Return the full qualification of the node \a n, but without + the name of \a n itself. e.g. A::B::C + */ +QString DitaXmlGenerator::fullQualification(const Node* n) +{ + QString fq; + InnerNode* in = n->parent(); + while (in) { + if ((in->type() == Node::Class) || + (in->type() == Node::Namespace)) { + if (in->name().isEmpty()) + break; + if (fq.isEmpty()) + fq = in->name(); + else + fq = in->name() + "::" + fq; + } + else + break; + in = in->parent(); + } + return fq; +} + void DitaXmlGenerator::writeDerivations(const ClassNode* cn, CodeMarker* marker) { QList<RelatedClass>::ConstIterator r; @@ -4490,10 +4540,8 @@ void DitaXmlGenerator::writeDerivations(const ClassNode* cn, CodeMarker* marker) writer.writeAttribute("value",(*r).accessString()); writer.writeEndElement(); // </cxxClassDerivationAccessSpecifier> writer.writeStartElement(CXXCLASSBASECLASS); - QString fullTitle = marker->plainFullName((*r).node); - QString guid = lookupGuid(fullTitle); - writer.writeAttribute("href",guid); - writer.writeCharacters(fullTitle); + writer.writeAttribute("href",(*r).node->ditaXmlHref()); + writer.writeCharacters(marker->plainFullName((*r).node)); writer.writeEndElement(); // </cxxClassBaseClass> writer.writeEndElement(); // </cxxClassDerivation> ++r; @@ -4502,19 +4550,173 @@ void DitaXmlGenerator::writeDerivations(const ClassNode* cn, CodeMarker* marker) } } -void DitaXmlGenerator::writeLocation(const ClassNode* cn, CodeMarker* marker) +void DitaXmlGenerator::writeLocation(const Node* n, CodeMarker* marker) { - writer.writeStartElement(CXXCLASSAPIITEMLOCATION); - writer.writeStartElement(CXXCLASSDECLARATIONFILE); + QString s1, s2, s3; + if (n->type() == Node::Class) { + s1 = CXXCLASSAPIITEMLOCATION; + s2 = CXXCLASSDECLARATIONFILE; + s3 = CXXCLASSDECLARATIONFILELINE; + } + else if (n->type() == Node::Function) { + s1 = CXXFUNCTIONAPIITEMLOCATION; + s2 = CXXFUNCTIONDECLARATIONFILE; + s3 = CXXFUNCTIONDECLARATIONFILELINE; + } + writer.writeStartElement(s1); + writer.writeStartElement(s2); writer.writeAttribute("name","filePath"); - writer.writeAttribute("value",cn->location().filePath()); - writer.writeEndElement(); // </cxxClassDeclarationFile> - writer.writeStartElement(CXXCLASSDECLARATIONFILELINE); + writer.writeAttribute("value",n->location().filePath()); + writer.writeEndElement(); // </cxx<s2>DeclarationFile> + writer.writeStartElement(s3); writer.writeAttribute("name","lineNumber"); QString lineNr; - writer.writeAttribute("value",lineNr.setNum(cn->location().lineNo())); - writer.writeEndElement(); // </cxxClassDeclarationFileLine> - writer.writeEndElement(); // </cxxClassApiItemLocation> + writer.writeAttribute("value",lineNr.setNum(n->location().lineNo())); + writer.writeEndElement(); // </cxx<s3>DeclarationFileLine> + writer.writeEndElement(); // </cxx<s1>ApiItemLocation> +} + +void DitaXmlGenerator::writeFunctions(const Section& s, + const ClassNode* cn, + CodeMarker* marker) +{ + NodeList::ConstIterator m = s.members.begin(); + while (m != s.members.end()) { + if ((*m)->type() == Node::Function) { + const FunctionNode* fn = reinterpret_cast<const FunctionNode*>(*m); + QString name = fn->name(); + writer.writeStartElement(CXXFUNCTION); + writeGuidAttribute(name); + writer.writeStartElement(APINAME); + writer.writeCharacters(name); + writer.writeEndElement(); // </apiName> + generateBrief(fn,marker); + writer.writeStartElement(CXXFUNCTIONDETAIL); + writer.writeStartElement(CXXFUNCTIONDEFINITION); + writer.writeStartElement(CXXFUNCTIONACCESSSPECIFIER); + writer.writeAttribute("value",fn->accessString()); + writer.writeEndElement(); // <cxxFunctionAccessSpecifier> + + if (fn->isStatic()) { + writer.writeStartElement(CXXFUNCTIONSTORAGECLASSSPECIFIERSTATIC); + writer.writeAttribute("name","static"); + writer.writeAttribute("value","static"); + writer.writeEndElement(); // <cxxFunctionStorageClassSpecifierStatic> + } + + if (fn->isConst()) { + writer.writeStartElement(CXXFUNCTIONCONST); + writer.writeAttribute("name","const"); + writer.writeAttribute("value","const"); + writer.writeEndElement(); // <cxxFunctionConst> + } + + if (fn->virtualness() != FunctionNode::NonVirtual) { + writer.writeStartElement(CXXFUNCTIONVIRTUAL); + writer.writeAttribute("name","virtual"); + writer.writeAttribute("value","virtual"); + writer.writeEndElement(); // <cxxFunctionVirtual> + if (fn->virtualness() == FunctionNode::PureVirtual) { + writer.writeStartElement(CXXFUNCTIONPUREVIRTUAL); + writer.writeAttribute("name","pure virtual"); + writer.writeAttribute("value","pure virtual"); + writer.writeEndElement(); // <cxxFunctionPureVirtual> + } + } + + if (fn->name() == cn->name()) { + writer.writeStartElement(CXXFUNCTIONCONSTRUCTOR); + writer.writeAttribute("name","constructor"); + writer.writeAttribute("value","constructor"); + writer.writeEndElement(); // <cxxFunctionConstructor> + } + else if (fn->name()[0] == QChar('~')) { + writer.writeStartElement(CXXFUNCTIONDESTRUCTOR); + writer.writeAttribute("name","destructor"); + writer.writeAttribute("value","destructor"); + writer.writeEndElement(); // <cxxFunctionDestructor> + } + else { + writer.writeStartElement(CXXFUNCTIONDECLAREDTYPE); + writer.writeCharacters(fn->returnType()); + writer.writeEndElement(); // <cxxFunctionDeclaredType> + } + QString fq = fullQualification(fn); + if (!fq.isEmpty()) { + writer.writeStartElement(CXXFUNCTIONSCOPEDNAME); + writer.writeCharacters(fq); + writer.writeEndElement(); // <cxxFunctionScopedName> + } + writer.writeStartElement(CXXFUNCTIONPROTOTYPE); + writer.writeCharacters(fn->signature(true)); + writer.writeEndElement(); // <cxxFunctionPrototype> + + QString fnl = fn->signature(false); + int idx = fnl.indexOf(' '); + if (idx < 0) + idx = 0; + else + ++idx; + fnl = fn->parent()->name() + "::" + fnl.mid(idx); + writer.writeStartElement(CXXFUNCTIONNAMELOOKUP); + writer.writeCharacters(fnl); + writer.writeEndElement(); // <cxxFunctionNameLookup> + + //writer.writeStartElement(CXXFUNCTIONREIMPLEMENTED); + //writer.writeAttribute("href", zzz); + //writer.writeCharacters(); + //writer.writeEndElement(); // </cxxFunctionReimplemented> + + writeLocation(fn, marker); + writer.writeEndElement(); // <cxxFunctionDefinition> + writer.writeStartElement(APIDESC); + + if (!fn->doc().isEmpty()) { + generateBody(fn, marker); + // generateAlsoList(inner, marker); + } + + writer.writeEndElement(); // </apiDesc> + writer.writeEndElement(); // </cxxFunctionDetail> + writer.writeEndElement(); // </cxxFunction> + + if (fn->metaness() == FunctionNode::Ctor || + fn->metaness() == FunctionNode::Dtor || + fn->overloadNumber() != 1) { + } + } + ++m; + } +} + +void DitaXmlGenerator::writeNestedClasses(const Section& s, + const ClassNode* cn, + CodeMarker* marker) +{ +} + +void DitaXmlGenerator::writeEnumerations(const Section& s, + const ClassNode* cn, + CodeMarker* marker) +{ +} + +void DitaXmlGenerator::writeTypedefs(const Section& s, + const ClassNode* cn, + CodeMarker* marker) +{ +} + +void DitaXmlGenerator::writeDataMembers(const Section& s, + const ClassNode* cn, + CodeMarker* marker) +{ +} + +void DitaXmlGenerator::writeProperties(const Section& s, + const ClassNode* cn, + CodeMarker* marker) +{ } QT_END_NAMESPACE diff --git a/tools/qdoc3/ditaxmlgenerator.h b/tools/qdoc3/ditaxmlgenerator.h index 070329b..71304b3 100644 --- a/tools/qdoc3/ditaxmlgenerator.h +++ b/tools/qdoc3/ditaxmlgenerator.h @@ -110,8 +110,28 @@ class DitaXmlGenerator : public PageGenerator virtual QString linkForNode(const Node *node, const Node *relative); virtual QString refForAtom(Atom *atom, const Node *node); + QString fullQualification(const Node* n); + void writeDerivations(const ClassNode* cn, CodeMarker* marker); - void writeLocation(const ClassNode* cn, CodeMarker* marker); + void writeLocation(const Node* n, CodeMarker* marker); + void writeFunctions(const Section& s, + const ClassNode* cn, + CodeMarker* marker); + void writeNestedClasses(const Section& s, + const ClassNode* cn, + CodeMarker* marker); + void writeEnumerations(const Section& s, + const ClassNode* cn, + CodeMarker* marker); + void writeTypedefs(const Section& s, + const ClassNode* cn, + CodeMarker* marker); + void writeDataMembers(const Section& s, + const ClassNode* cn, + CodeMarker* marker); + void writeProperties(const Section& s, + const ClassNode* cn, + CodeMarker* marker); private: enum SubTitleSize { SmallSubTitle, LargeSubTitle }; diff --git a/tools/qdoc3/node.cpp b/tools/qdoc3/node.cpp index 4664e9d..2a03fd2 100644 --- a/tools/qdoc3/node.cpp +++ b/tools/qdoc3/node.cpp @@ -101,6 +101,7 @@ Node::Node(Type type, InnerNode *parent, const QString& name) { if (par) par->addChild(this); + uuid = QUuid::createUuid(); } /*! @@ -199,6 +200,11 @@ Node::Status Node::inheritedStatus() const } /*! + Returns the thread safeness value for whatever this node + represents. But if this node has a parent and the thread + safeness value of the parent is the same as the thread + safeness value of this node, what is returned is the + value \c{UnspecifiedSafeness}. Why? */ Node::ThreadSafeness Node::threadSafeness() const { @@ -208,6 +214,9 @@ Node::ThreadSafeness Node::threadSafeness() const } /*! + If this node has a parent, the parent's thread safeness + value is returned. Otherwise, this node's thread safeness + value is returned. Why? */ Node::ThreadSafeness Node::inheritedThreadSafeness() const { @@ -217,6 +226,9 @@ Node::ThreadSafeness Node::inheritedThreadSafeness() const } /*! + Returns the sanitized file name without the path. + If the the file is an html file, the html suffix + is removed. Why? */ QString Node::fileBase() const { @@ -229,11 +241,32 @@ QString Node::fileBase() const return base.toLower(); } +/*! \fnQUuid Node::guid() const + Returns this node's Universally Unique IDentifier. + If its UUID has not yet been created, it is created + first. + */ + +/*! + Composes a string to be used as an href attribute in DITA + XML. It is composed of the file name and the UUID separated + by a '#' + */ +QString Node::ditaXmlHref() +{ + QString href = fileBase(); + if (!href.endsWith(".xml")) + href += ".xml"; + return href + "#" + guid(); +} + /*! \class InnerNode */ /*! + The inner node destructor deletes the children and removes + this node from its related nodes. */ InnerNode::~InnerNode() { @@ -577,6 +610,7 @@ InnerNode::InnerNode(Type type, InnerNode *parent, const QString& name) } /*! + Appends an \a include file to the list of include files. */ void InnerNode::addInclude(const QString& include) { @@ -584,6 +618,7 @@ void InnerNode::addInclude(const QString& include) } /*! + Sets the list of include files to \a includes. */ void InnerNode::setIncludes(const QStringList& includes) { @@ -789,6 +824,7 @@ ClassNode::ClassNode(InnerNode *parent, const QString& name) : InnerNode(Class, parent, name) { hidden = false; + abstract = false; setPageType(ApiPage); } @@ -1078,6 +1114,19 @@ FunctionNode::FunctionNode(Type type, InnerNode *parent, const QString& name, bo } /*! + Sets the \a virtualness of this function. If the \a virtualness + is PureVirtual, and if the parent() is a ClassNode, set the parent's + \e abstract flag to true. + */ +void FunctionNode::setVirtualness(Virtualness virtualness) +{ + vir = virtualness; + if ((virtualness == PureVirtual) && parent() && + (parent()->type() == Node::Class)) + parent()->setAbstract(true); +} + +/*! */ void FunctionNode::setOverload(bool overlode) { diff --git a/tools/qdoc3/node.h b/tools/qdoc3/node.h index 523394d..44cdac2 100644 --- a/tools/qdoc3/node.h +++ b/tools/qdoc3/node.h @@ -55,6 +55,7 @@ #include "doc.h" #include "location.h" #include "text.h" +#include <QUuid> QT_BEGIN_NAMESPACE @@ -190,6 +191,8 @@ class Node void clearRelated() { rel = 0; } virtual QString fileBase() const; + QUuid guid() const { return uuid; } + QString ditaXmlHref(); protected: Node(Type type, InnerNode *parent, const QString& name); @@ -219,6 +222,7 @@ class Node QString u; QString sinc; QString tpl; + QUuid uuid; }; class FunctionNode; @@ -261,6 +265,8 @@ class InnerNode : public Node QStringList secondaryKeys(); const QStringList& pageKeywords() const { return pageKeywds; } virtual void addPageKeywords(const QString& t) { pageKeywds << t; } + virtual bool isAbstract() const { return false; } + virtual void setAbstract(bool ) { } protected: InnerNode(Type type, InnerNode *parent, const QString& name); @@ -341,11 +347,14 @@ class ClassNode : public InnerNode void setServiceName(const QString& value) { sname = value; } QString qmlElement() const { return qmlelement; } void setQmlElement(const QString& value) { qmlelement = value; } + virtual bool isAbstract() const { return abstract; } + virtual void setAbstract(bool b) { abstract = b; } private: QList<RelatedClass> bas; QList<RelatedClass> der; bool hidden; + bool abstract; QString sname; QString qmlelement; }; @@ -582,7 +591,7 @@ class FunctionNode : public LeafNode void setReturnType(const QString& returnType) { rt = returnType; } void setParentPath(const QStringList& parentPath) { pp = parentPath; } void setMetaness(Metaness metaness) { met = metaness; } - void setVirtualness(Virtualness virtualness) { vir = virtualness; } + void setVirtualness(Virtualness virtualness); void setConst(bool conste) { con = conste; } void setStatic(bool statique) { sta = statique; } void setOverload(bool overlode); |