diff options
Diffstat (limited to 'src/tools/qdoc/generator.cpp')
-rw-r--r-- | src/tools/qdoc/generator.cpp | 151 |
1 files changed, 95 insertions, 56 deletions
diff --git a/src/tools/qdoc/generator.cpp b/src/tools/qdoc/generator.cpp index 9b82e80927..264e489942 100644 --- a/src/tools/qdoc/generator.cpp +++ b/src/tools/qdoc/generator.cpp @@ -97,23 +97,26 @@ QStringList Generator::styleDirs; QStringList Generator::styleFiles; bool Generator::debugging_ = false; bool Generator::noLinkErrors_ = false; +bool Generator::autolinkErrors_ = false; bool Generator::redirectDocumentationToDevNull_ = false; Generator::Passes Generator::qdocPass_ = Both; bool Generator::useOutputSubdirs_ = true; -void Generator::setDebugSegfaultFlag(bool b) +void Generator::setDebugFlag(bool b) { +#if 0 if (b) qDebug() << "DEBUG: Setting debug flag."; else qDebug() << "DEBUG: Clearing debug flag."; +#endif debugging_ = b; } /*! Prints \a message as an aid to debugging the release version. */ -void Generator::debugSegfault(const QString& message) +void Generator::debug(const QString& message) { if (debugging()) qDebug() << "DEBUG:" << message; @@ -189,19 +192,20 @@ void Generator::appendFullNames(Text& text, const NodeList& nodes, const Node* r } } -void Generator::appendSortedNames(Text& text, const ClassNode *classe, const QList<RelatedClass> &classes) +void Generator::appendSortedNames(Text& text, const ClassNode* cn, const QList<RelatedClass>& rc) { QList<RelatedClass>::ConstIterator r; QMap<QString,Text> classMap; int index = 0; - r = classes.constBegin(); - while (r != classes.constEnd()) { - if ((*r).node->access() == Node::Public && - (*r).node->status() != Node::Internal - && !(*r).node->doc().isEmpty()) { + r = rc.constBegin(); + while (r != rc.constEnd()) { + ClassNode* rcn = (*r).node_; + if (rcn && rcn->access() == Node::Public && + rcn->status() != Node::Internal && + !rcn->doc().isEmpty()) { Text className; - appendFullName(className, (*r).node, classe); + appendFullName(className, rcn, cn); classMap[className.toString().toLower()] = className; } ++r; @@ -274,7 +278,7 @@ void Generator::beginSubPage(const InnerNode* node, const QString& fileName) node->location().error(tr("HTML file already exists; overwriting %1").arg(outFile->fileName())); if (!outFile->open(QFile::WriteOnly)) node->location().fatal(tr("Cannot open output file '%1'").arg(outFile->fileName())); - Generator::debugSegfault("Writing: " + path); + Generator::debug("Writing: " + path); outFileNames.insert(fileName,fileName); QTextStream* out = new QTextStream(outFile); @@ -308,24 +312,14 @@ QString Generator::fileBase(const Node *node) const node = node->parent(); } - if (node->type() == Node::Document && node->subType() == Node::Collision) { - const NameCollisionNode* ncn = static_cast<const NameCollisionNode*>(node); - if (ncn->currentChild()) - return fileBase(ncn->currentChild()); - } - - if (node->hasBaseName()) - return node->baseName(); + if (node->hasFileNameBase()) + return node->fileNameBase(); QString base; - if (node->type() == Node::Document) { + if (node->isDocNode()) { base = node->name(); - if (node->subType() == Node::Collision) { - const NameCollisionNode* ncn = static_cast<const NameCollisionNode*>(node); - if (ncn->currentChild()) - return fileBase(ncn->currentChild()); + if (node->subType() == Node::Collision) base.prepend("collision-"); - } //Was QDOC2_COMPAT, required for index.html if (base.endsWith(".html")) base.truncate(base.length() - 5); @@ -343,12 +337,6 @@ QString Generator::fileBase(const Node *node) const base.prepend(outputPrefix(QLatin1String("QML"))); } } - else if (node->subType() == Node::QmlModule) { - base.append("-qmlmodule"); - } - else if (node->subType() == Node::Module) { - base.append("-module"); - } if (node->isExample() || node->isExampleFile()) { QString modPrefix(node->moduleName()); if (modPrefix.isEmpty()) { @@ -360,6 +348,19 @@ QString Generator::fileBase(const Node *node) const base.append(QLatin1String("-example")); } } + else if (node->isCollectionNode()) { + base = node->name(); + if (base.endsWith(".html")) + base.truncate(base.length() - 5); + + if (node->isQmlModule()) { + base.append("-qmlmodule"); + } + else if (node->isModule()) { + base.append("-module"); + } + // Why not add "-group" for gropup pages? + } else { const Node *p = node; forever { @@ -401,7 +402,7 @@ QString Generator::fileBase(const Node *node) const while (res.endsWith(QLatin1Char('-'))) res.chop(1); Node* n = const_cast<Node*>(node); - n->setBaseName(res); + n->setFileNameBase(res); return res; } @@ -455,7 +456,7 @@ QString Generator::fullDocumentLocation(const Node *node, bool useSubdir) if (!fdl.isEmpty()) fdl.append(QLatin1Char('/')); } - if (node->type() == Node::Namespace) { + if (node->isNamespace()) { // The root namespace has no name - check for this before creating // an attribute containing the location of any documentation. @@ -465,9 +466,8 @@ QString Generator::fullDocumentLocation(const Node *node, bool useSubdir) else return QString(); } - else if (node->type() == Node::Document) { - if ((node->subType() == Node::QmlClass) || - (node->subType() == Node::QmlBasicType)) { + else if (node->isDocNode() || node->isCollectionNode()) { + if (node->isQmlType() || node->isQmlBasicType()) { QString fb = fileBase(node); if (fb.startsWith(Generator::outputPrefix(QLatin1String("QML")))) return fb + QLatin1Char('.') + currentGenerator()->fileExtension(); @@ -562,6 +562,9 @@ QString Generator::fullDocumentLocation(const Node *node, bool useSubdir) anchorRef = QLatin1Char('#') + node->name() + "-var"; break; case Node::Document: + case Node::Group: + case Node::Module: + case Node::QmlModule: { parentName = fileBase(node); parentName.replace(QLatin1Char('/'), QLatin1Char('-')).replace(QLatin1Char('.'), QLatin1Char('-')); @@ -841,6 +844,10 @@ void Generator::generateDocNode(DocNode* /* dn */, CodeMarker* /* marker */) { } +void Generator::generateCollectionNode(CollectionNode* , CodeMarker* ) +{ +} + /*! This function is called when the documentation for an example is being formatted. It outputs the list of source @@ -936,18 +943,20 @@ void Generator::generateInherits(const ClassNode *classe, CodeMarker *marker) r = classe->baseClasses().constBegin(); index = 0; while (r != classe->baseClasses().constEnd()) { - text << Atom(Atom::LinkNode, CodeMarker::stringForNode((*r).node)) - << Atom(Atom::FormattingLeft, ATOM_FORMATTING_LINK) - << Atom(Atom::String, (*r).dataTypeWithTemplateArgs) - << Atom(Atom::FormattingRight, ATOM_FORMATTING_LINK); - - if ((*r).access == Node::Protected) { - text << " (protected)"; - } - else if ((*r).access == Node::Private) { - text << " (private)"; + if ((*r).node_) { + text << Atom(Atom::LinkNode, CodeMarker::stringForNode((*r).node_)) + << Atom(Atom::FormattingLeft, ATOM_FORMATTING_LINK) + << Atom(Atom::String, (*r).signature_) + << Atom(Atom::FormattingRight, ATOM_FORMATTING_LINK); + + if ((*r).access_ == Node::Protected) { + text << " (protected)"; + } + else if ((*r).access_ == Node::Private) { + text << " (private)"; + } + text << separator(index++, classe->baseClasses().count()); } - text << separator(index++, classe->baseClasses().count()); ++r; } text << Atom::ParaRight; @@ -996,19 +1005,49 @@ void Generator::generateInnerNode(InnerNode* node) later in generateCollisionPages(). Each one is appended to a list for later. */ - if ((node->type() == Node::Document) && (node->subType() == Node::Collision)) { + if (node->isCollisionNode()) { NameCollisionNode* ncn = static_cast<NameCollisionNode*>(node); collisionNodes.append(const_cast<NameCollisionNode*>(ncn)); } else { - beginSubPage(node, fileName(node)); - if (node->type() == Node::Namespace || node->type() == Node::Class) { + if (node->isNamespace() || node->isClass()) { + beginSubPage(node, fileName(node)); generateClassLikeNode(node, marker); + endSubPage(); } - else if (node->type() == Node::Document) { + else if (node->isDocNode()) { + beginSubPage(node, fileName(node)); generateDocNode(static_cast<DocNode*>(node), marker); + endSubPage(); + } + else if (node->isCollectionNode()) { + CollectionNode* cn = static_cast<CollectionNode*>(node); + /* + A collection node is one of: group, module, + or QML module. + + Don't output an HTML page for the collection + node unless the \group, \module, or \qmlmodule + command was actually seen by qdoc in the qdoc + comment for the node. + + A key prerequisite in this case is the call to + mergeCollections(cn). We don't know if this + collection (group, module, or QML module) has + members in other modules. We know at this point + that cn's members list contains only members in + the current module. Therefore, before outputting + the page for cn, we must search for members of + cn in the other modules and add them to the + members list. + */ + if (cn->wasSeen()) { + qdb_->mergeCollections(cn); + beginSubPage(node, fileName(node)); + generateCollectionNode(cn, marker); + endSubPage(); + } } - endSubPage(); } } @@ -1066,7 +1105,7 @@ void Generator::generateQmlInheritedBy(const QmlClassNode* qcn, /*! */ -void Generator::generateQmlInherits(const QmlClassNode* , CodeMarker* ) +void Generator::generateQmlInherits(QmlClassNode* , CodeMarker* ) { // stub. } @@ -1362,11 +1401,11 @@ void Generator::generateThreadSafeness(const Node *node, CodeMarker *marker) } /*! - Traverses the database recursivly to generate all the documentation. + Traverses the current tree to generate all the documentation. */ -void Generator::generateTree() +void Generator::generateDocs() { - generateInnerNode(qdb_->treeRoot()); + generateInnerNode(qdb_->primaryTreeRoot()); } Generator *Generator::generatorForFormat(const QString& format) @@ -1650,6 +1689,7 @@ void Generator::initialize(const Config &config) else outputPrefixes[QLatin1String("QML")] = QLatin1String("qml-"); noLinkErrors_ = config.getBool(CONFIG_NOLINKERRORS); + autolinkErrors_ = config.getBool(CONFIG_AUTOLINKERRORS); } /*! @@ -1916,7 +1956,6 @@ void Generator::terminate() imageDirs.clear(); outDir_.clear(); QmlClassNode::terminate(); - ExampleNode::terminate(); } void Generator::terminateGenerator() |