From 14f7eb86ca2275d91f284279af5f77205d4ae3c0 Mon Sep 17 00:00:00 2001
From: Martin Smith
Date: Thu, 13 Sep 2012 11:38:45 +0200
Subject: qdoc: Refactoring of qdoc data structures
This commit is the beginning of a significant
overhaul of qdoc. A new class, QDocDatabase, is
added, which will eventually encapsulate all the
data structures used by qdoc. In this commit, the
Tree class is made private and only accessible
from QDocDatabase. Several maps structures are
also moved into QDocDatabase from other classes.
Much dead code and unused parameters were removed.
Further simplification will follow.
Change-Id: I237411c50f3ced0d2fc8d3b0fbfdf4e55880f8e9
Reviewed-by: Qt Doc Bot
Reviewed-by: Lars Knoll
Reviewed-by: Jerome Pasion
---
src/tools/qdoc/codemarker.cpp | 16 +-
src/tools/qdoc/codemarker.h | 10 +-
src/tools/qdoc/codeparser.cpp | 28 +-
src/tools/qdoc/codeparser.h | 20 +-
src/tools/qdoc/cppcodemarker.cpp | 66 ----
src/tools/qdoc/cppcodemarker.h | 9 +-
src/tools/qdoc/cppcodeparser.cpp | 336 ++++-------------
src/tools/qdoc/cppcodeparser.h | 29 +-
src/tools/qdoc/ditaxmlgenerator.cpp | 696 ++++++++++-------------------------
src/tools/qdoc/ditaxmlgenerator.h | 75 +---
src/tools/qdoc/doc.cpp | 33 +-
src/tools/qdoc/generator.cpp | 219 +++--------
src/tools/qdoc/generator.h | 57 +--
src/tools/qdoc/helpprojectwriter.cpp | 31 +-
src/tools/qdoc/helpprojectwriter.h | 6 +-
src/tools/qdoc/htmlgenerator.cpp | 610 ++++++++++--------------------
src/tools/qdoc/htmlgenerator.h | 63 +---
src/tools/qdoc/main.cpp | 51 +--
src/tools/qdoc/node.cpp | 335 +++++++++--------
src/tools/qdoc/node.h | 88 ++---
src/tools/qdoc/plaincodemarker.cpp | 10 -
src/tools/qdoc/plaincodemarker.h | 2 -
src/tools/qdoc/puredocparser.cpp | 26 +-
src/tools/qdoc/puredocparser.h | 2 +-
src/tools/qdoc/qdoc.pro | 2 +
src/tools/qdoc/qdocdatabase.cpp | 638 ++++++++++++++++++++++++++++++++
src/tools/qdoc/qdocdatabase.h | 198 ++++++++++
src/tools/qdoc/qmlcodemarker.cpp | 32 --
src/tools/qdoc/qmlcodemarker.h | 2 -
src/tools/qdoc/qmlcodeparser.cpp | 34 +-
src/tools/qdoc/qmlcodeparser.h | 5 +-
src/tools/qdoc/qmlvisitor.cpp | 24 +-
src/tools/qdoc/qmlvisitor.h | 1 -
src/tools/qdoc/tree.cpp | 147 +++-----
src/tools/qdoc/tree.h | 27 +-
35 files changed, 1817 insertions(+), 2111 deletions(-)
create mode 100644 src/tools/qdoc/qdocdatabase.cpp
create mode 100644 src/tools/qdoc/qdocdatabase.h
diff --git a/src/tools/qdoc/codemarker.cpp b/src/tools/qdoc/codemarker.cpp
index d40db411b1..4a9305de9e 100644
--- a/src/tools/qdoc/codemarker.cpp
+++ b/src/tools/qdoc/codemarker.cpp
@@ -625,26 +625,16 @@ QString CodeMarker::macName(const Node *node, const QString &name)
return QLatin1Char('/') + protect(myName);
}
else {
- return plainFullName(node) + QLatin1Char('/') + protect(myName);
+ return node->plainFullName() + QLatin1Char('/') + protect(myName);
}
}
/*!
- Get the list of documentation sections for the children of
- the specified QmlClassNode.
+ Returns an empty list of documentation sections.
*/
-QList CodeMarker::qmlSections(const QmlClassNode* ,
- SynopsisStyle )
+QList CodeMarker::qmlSections(const QmlClassNode* , SynopsisStyle )
{
return QList();
}
-const Node* CodeMarker::resolveTarget(const QString& /* target */,
- const Tree* ,
- const Node* ,
- const Node* )
-{
- return 0;
-}
-
QT_END_NAMESPACE
diff --git a/src/tools/qdoc/codemarker.h b/src/tools/qdoc/codemarker.h
index 894d838a3b..713d3a54d2 100644
--- a/src/tools/qdoc/codemarker.h
+++ b/src/tools/qdoc/codemarker.h
@@ -124,9 +124,6 @@ public:
virtual bool recognizeExtension(const QString& ext) = 0;
virtual bool recognizeLanguage(const QString& lang) = 0;
virtual Atom::Type atomType() const = 0;
- virtual QString plainName(const Node *node) = 0;
- virtual QString plainFullName(const Node *node,
- const Node *relative = 0) = 0;
virtual QString markedUpCode(const QString& code,
const Node *relative,
const Location &location) = 0;
@@ -145,12 +142,7 @@ public:
virtual QList sections(const InnerNode *inner,
SynopsisStyle style,
Status status) = 0;
- virtual QList qmlSections(const QmlClassNode* qmlClassNode,
- SynopsisStyle style);
- virtual const Node* resolveTarget(const QString& target,
- const Tree* tree,
- const Node* relative,
- const Node* self = 0);
+ virtual QList qmlSections(const QmlClassNode* qmlClassNode, SynopsisStyle style);
virtual QStringList macRefsForNode(Node* node);
static void initialize(const Config& config);
diff --git a/src/tools/qdoc/codeparser.cpp b/src/tools/qdoc/codeparser.cpp
index dbbb20ccfe..134b2f2616 100644
--- a/src/tools/qdoc/codeparser.cpp
+++ b/src/tools/qdoc/codeparser.cpp
@@ -48,6 +48,7 @@
#include "tree.h"
#include "config.h"
#include "generator.h"
+#include "qdocdatabase.h"
#include
QT_BEGIN_NAMESPACE
@@ -81,6 +82,7 @@ QMap CodeParser::nameToTitle;
*/
CodeParser::CodeParser()
{
+ qdb_ = QDocDatabase::qdocDB();
parsers.prepend(this);
}
@@ -114,16 +116,14 @@ QStringList CodeParser::headerFileNameFilter()
return sourceFileNameFilter();
}
-void CodeParser::parseHeaderFile(const Location& location,
- const QString& filePath,
- Tree *tree)
+void CodeParser::parseHeaderFile(const Location& location, const QString& filePath)
{
- parseSourceFile(location, filePath, tree);
+ parseSourceFile(location, filePath);
}
-void CodeParser::doneParsingHeaderFiles(Tree *tree)
+void CodeParser::doneParsingHeaderFiles()
{
- doneParsingSourceFiles(tree);
+ doneParsingSourceFiles();
}
/*!
@@ -230,8 +230,7 @@ QSet CodeParser::commonMetaCommands()
void CodeParser::processCommonMetaCommand(const Location& location,
const QString& command,
const ArgLocPair& arg,
- Node* node,
- Tree* tree)
+ Node* node)
{
if (command == COMMAND_COMPAT) {
location.warning(tr("\\compat command used, but Qt3 compatibility is no longer supported"));
@@ -241,21 +240,16 @@ void CodeParser::processCommonMetaCommand(const Location& location,
node->setStatus(Node::Deprecated);
}
else if (command == COMMAND_INGROUP) {
- tree->addToGroup(node, arg.first);
+ qdb_->addToGroup(node, arg.first);
}
else if (command == COMMAND_INPUBLICGROUP) {
- tree->addToPublicGroup(node, arg.first);
+ qdb_->addToPublicGroup(node, arg.first);
}
else if (command == COMMAND_INMODULE) {
- node->setModuleName(arg.first);
+ qdb_->addToModule(arg.first,node);
}
else if (command == COMMAND_INQMLMODULE) {
- node->setQmlModule(arg);
- DocNode* fn = DocNode::lookupQmlModuleNode(tree, arg);
- fn->addQmlModuleMember(node);
- QString qmid = node->qmlModuleIdentifier();
- QmlClassNode* qcn = static_cast(node);
- QmlClassNode::insertQmlModuleMember(qmid, qcn);
+ qdb_->addToQmlModule(arg.first,node);
}
else if (command == COMMAND_MAINCLASS) {
node->setStatus(Node::Main);
diff --git a/src/tools/qdoc/codeparser.h b/src/tools/qdoc/codeparser.h
index 94529338ad..7bca9e0c9b 100644
--- a/src/tools/qdoc/codeparser.h
+++ b/src/tools/qdoc/codeparser.h
@@ -39,15 +39,10 @@
**
****************************************************************************/
-/*
- codeparser.h
-*/
-
#ifndef CODEPARSER_H
#define CODEPARSER_H
#include
-
#include "node.h"
QT_BEGIN_NAMESPACE
@@ -55,7 +50,7 @@ QT_BEGIN_NAMESPACE
class Config;
class Node;
class QString;
-class Tree;
+class QDocDatabase;
class CodeParser
{
@@ -68,12 +63,10 @@ public:
virtual QString language() = 0;
virtual QStringList headerFileNameFilter();
virtual QStringList sourceFileNameFilter() = 0;
- virtual void parseHeaderFile(const Location& location,
- const QString& filePath, Tree *tree);
- virtual void parseSourceFile(const Location& location,
- const QString& filePath, Tree *tree) = 0;
- virtual void doneParsingHeaderFiles(Tree *tree);
- virtual void doneParsingSourceFiles(Tree *tree) = 0;
+ virtual void parseHeaderFile(const Location& location, const QString& filePath);
+ virtual void parseSourceFile(const Location& location, const QString& filePath) = 0;
+ virtual void doneParsingHeaderFiles();
+ virtual void doneParsingSourceFiles() = 0;
bool isParsingH() const;
bool isParsingCpp() const;
@@ -96,11 +89,12 @@ protected:
void processCommonMetaCommand(const Location& location,
const QString& command,
const ArgLocPair& arg,
- Node *node, Tree *tree);
+ Node *node);
static void extractPageLinkAndDesc(const QString& arg,
QString* link,
QString* desc);
QString currentFile_;
+ QDocDatabase* qdb_;
private:
static QString currentSubDir_;
diff --git a/src/tools/qdoc/cppcodemarker.cpp b/src/tools/qdoc/cppcodemarker.cpp
index 61f1b76ede..749f60d9cd 100644
--- a/src/tools/qdoc/cppcodemarker.cpp
+++ b/src/tools/qdoc/cppcodemarker.cpp
@@ -116,38 +116,6 @@ Atom::Type CppCodeMarker::atomType() const
return Atom::Code;
}
-/*!
- Returns the \a node name, or "()" if \a node is a
- Node::Function node.
- */
-QString CppCodeMarker::plainName(const Node *node)
-{
- QString name = node->name();
- if (node->type() == Node::Function)
- name += QLatin1String("()");
- return name;
-}
-
-QString CppCodeMarker::plainFullName(const Node *node, const Node *relative)
-{
- if (node->name().isEmpty()) {
- return QLatin1String("global");
- }
- else {
- QString fullName;
- while (node) {
- fullName.prepend(plainName(node));
- if (node->parent() == relative ||
- node->parent()->subType() == Node::Collision ||
- node->parent()->name().isEmpty())
- break;
- fullName.prepend(QLatin1String("::"));
- node = node->parent();
- }
- return fullName;
- }
-}
-
QString CppCodeMarker::markedUpCode(const QString &code,
const Node *relative,
const Location &location)
@@ -834,40 +802,6 @@ QList CppCodeMarker::sections(const InnerNode *inner,
return sections;
}
-/*!
- Search the \a tree for a node named \a target
- */
-const Node *CppCodeMarker::resolveTarget(const QString& target,
- const Tree* tree,
- const Node* relative,
- const Node* self)
-{
- const Node* node = 0;
- if (target.endsWith("()")) {
- QString funcName = target;
- funcName.chop(2);
- QStringList path = funcName.split("::");
- const FunctionNode* fn = tree->findFunctionNode(path, relative, Tree::SearchBaseClasses);
- if (fn) {
- /*
- Why is this case not accepted?
- */
- if (fn->metaness() != FunctionNode::MacroWithoutParams)
- node = fn;
- }
- }
- else if (target.contains(QLatin1Char('#'))) {
- // This error message is never printed; I think we can remove the case.
- qDebug() << "qdoc: target case not handled:" << target;
- }
- else {
- QStringList path = target.split("::");
- int flags = Tree::SearchBaseClasses | Tree::SearchEnumValues | Tree::NonFunction;
- node = tree->findNode(path, relative, flags, self);
- }
- return node;
-}
-
static const char * const typeTable[] = {
"bool", "char", "double", "float", "int", "long", "short",
"signed", "unsigned", "uint", "ulong", "ushort", "uchar", "void",
diff --git a/src/tools/qdoc/cppcodemarker.h b/src/tools/qdoc/cppcodemarker.h
index b898f9e3bd..066ed9679d 100644
--- a/src/tools/qdoc/cppcodemarker.h
+++ b/src/tools/qdoc/cppcodemarker.h
@@ -60,8 +60,6 @@ public:
virtual bool recognizeExtension(const QString& ext);
virtual bool recognizeLanguage(const QString& lang);
virtual Atom::Type atomType() const;
- virtual QString plainName(const Node *node);
- virtual QString plainFullName(const Node *node, const Node *relative);
virtual QString markedUpCode(const QString& code,
const Node *relative,
const Location &location);
@@ -78,12 +76,7 @@ public:
virtual QList sections(const InnerNode *innerNode,
SynopsisStyle style,
Status status);
- virtual QList qmlSections(const QmlClassNode* qmlClassNode,
- SynopsisStyle style);
- virtual const Node* resolveTarget(const QString& target,
- const Tree* tree,
- const Node* relative,
- const Node* self = 0);
+ virtual QList qmlSections(const QmlClassNode* qmlClassNode, SynopsisStyle style);
private:
QString addMarkUp(const QString& protectedCode,
diff --git a/src/tools/qdoc/cppcodeparser.cpp b/src/tools/qdoc/cppcodeparser.cpp
index b88fde18e0..b3a51d41a8 100644
--- a/src/tools/qdoc/cppcodeparser.cpp
+++ b/src/tools/qdoc/cppcodeparser.cpp
@@ -50,7 +50,7 @@
#include "config.h"
#include "cppcodeparser.h"
#include "tokenizer.h"
-#include "tree.h"
+#include "qdocdatabase.h"
#include
QT_BEGIN_NAMESPACE
@@ -60,54 +60,6 @@ QT_BEGIN_NAMESPACE
QStringList CppCodeParser::exampleFiles;
QStringList CppCodeParser::exampleDirs;
-/*
- This is used for fuzzy matching only, which in turn is only used
- for Qt Jambi.
-*/
-static QString cleanType(const QString &type, Tree* tree)
-{
- QString result = type;
- result.replace("qlonglong", "long long");
- result.replace("qulonglong", "unsigned long long");
- result.replace("qreal", "double");
- result.replace(QRegExp("\\bu(int|short|char|long)\\b"), "unsigned \\1");
- result.replace("QRgb", "unsigned int");
- result.replace(" >", ">");
- result.remove(" const[]");
- result.replace("QStringList", "QStringList");
- result.replace("qint8", "char");
- result.replace("qint16", "short");
- result.replace("qint32", "int");
- result.replace("qint64", "long long");
- result.replace("quint8", "unsigned char");
- result.replace("quint16", "unsigned short");
- result.replace("quint32", "unsigned int");
- result.replace("quint64", "unsigned long long");
-
- if (result.contains("QFlags")) {
- QRegExp regExp("QFlags<(((?:[^<>]+::)*)([^<>:]+))>");
- int pos = 0;
- while ((pos = result.indexOf(regExp, pos)) != -1) {
- // we assume that the path for the associated enum
- // is the same as for the flag typedef
- QStringList path = regExp.cap(2).split("::", QString::SkipEmptyParts);
- QStringList tmpPath = QStringList(path) << regExp.cap(3);
- EnumNode* en = tree->findEnumNode(tmpPath);
- if (en && en->flagsType()) {
- tmpPath = QStringList(path) << en->flagsType()->name();
- result.replace(pos, regExp.matchedLength(), tmpPath.join("::"));
- }
- ++pos;
- }
- }
- if (result.contains("::")) {
- // remove needless (and needful) class prefixes
- QRegExp regExp("[A-Za-z0-9_]+::");
- result.remove(regExp);
- }
- return result;
-}
-
/*!
The constructor initializes some regular expressions
and calls reset().
@@ -115,7 +67,7 @@ static QString cleanType(const QString &type, Tree* tree)
CppCodeParser::CppCodeParser()
: varComment("/\\*\\s*([a-zA-Z_0-9]+)\\s*\\*/"), sep("(?:<[^>]+>)?::")
{
- reset(0);
+ reset();
}
/*!
@@ -201,13 +153,11 @@ QStringList CppCodeParser::sourceFileNameFilter()
}
/*!
- Parse the C++ header file identified by \a filePath
- and add the parsed contents to the big \a tree. The
- \a location is used for reporting errors.
+ Parse the C++ header file identified by \a filePath and add
+ the parsed contents to the database. The \a location is used
+ for reporting errors.
*/
-void CppCodeParser::parseHeaderFile(const Location& location,
- const QString& filePath,
- Tree *tree)
+void CppCodeParser::parseHeaderFile(const Location& location, const QString& filePath)
{
QFile in(filePath);
currentFile_ = filePath;
@@ -218,14 +168,14 @@ void CppCodeParser::parseHeaderFile(const Location& location,
}
createOutputSubdirectory(location, filePath);
- reset(tree);
+ reset();
Location fileLocation(filePath);
Tokenizer fileTokenizer(fileLocation, in);
tokenizer = &fileTokenizer;
readToken();
- matchDeclList(tree->root());
+ matchDeclList(qdb_->treeRoot());
if (!fileTokenizer.version().isEmpty())
- tree->setVersion(fileTokenizer.version());
+ qdb_->setVersion(fileTokenizer.version());
in.close();
if (fileLocation.fileName() == "qiterator.h")
@@ -235,14 +185,12 @@ void CppCodeParser::parseHeaderFile(const Location& location,
/*!
Get ready to parse the C++ cpp file identified by \a filePath
- and add its parsed contents to the big \a tree. \a location is
+ and add its parsed contents to the database. \a location is
used for reporting errors.
Call matchDocsAndStuff() to do all the parsing and tree building.
*/
-void CppCodeParser::parseSourceFile(const Location& location,
- const QString& filePath,
- Tree *tree)
+void CppCodeParser::parseSourceFile(const Location& location, const QString& filePath)
{
QFile in(filePath);
currentFile_ = filePath;
@@ -253,7 +201,7 @@ void CppCodeParser::parseSourceFile(const Location& location,
}
createOutputSubdirectory(location, filePath);
- reset(tree);
+ reset();
Location fileLocation(filePath);
Tokenizer fileTokenizer(fileLocation, in);
tokenizer = &fileTokenizer;
@@ -276,41 +224,29 @@ void CppCodeParser::parseSourceFile(const Location& location,
inheritance links in the tree. But it also initializes a
bunch of stuff.
*/
-void CppCodeParser::doneParsingHeaderFiles(Tree *tree)
+void CppCodeParser::doneParsingHeaderFiles()
{
- tree->resolveInheritance();
+ qdb_->resolveInheritance();
QMapIterator i(sequentialIteratorClasses);
while (i.hasNext()) {
i.next();
- instantiateIteratorMacro(i.key(),
- i.value(),
- sequentialIteratorDefinition,
- tree);
+ instantiateIteratorMacro(i.key(), i.value(), sequentialIteratorDefinition);
}
i = mutableSequentialIteratorClasses;
while (i.hasNext()) {
i.next();
- instantiateIteratorMacro(i.key(),
- i.value(),
- mutableSequentialIteratorDefinition,
- tree);
+ instantiateIteratorMacro(i.key(), i.value(), mutableSequentialIteratorDefinition);
}
i = associativeIteratorClasses;
while (i.hasNext()) {
i.next();
- instantiateIteratorMacro(i.key(),
- i.value(),
- associativeIteratorDefinition,
- tree);
+ instantiateIteratorMacro(i.key(), i.value(), associativeIteratorDefinition);
}
i = mutableAssociativeIteratorClasses;
while (i.hasNext()) {
i.next();
- instantiateIteratorMacro(i.key(),
- i.value(),
- mutableAssociativeIteratorDefinition,
- tree);
+ instantiateIteratorMacro(i.key(), i.value(), mutableAssociativeIteratorDefinition);
}
sequentialIteratorDefinition.clear();
mutableSequentialIteratorDefinition.clear();
@@ -326,130 +262,15 @@ void CppCodeParser::doneParsingHeaderFiles(Tree *tree)
This is called after all the source files (i.e., not the
header files) have been parsed. It traverses the tree to
resolve property links, normalize overload signatures, and
- do other housekeeping of the tree.
+ do other housekeeping of the database.
*/
-void CppCodeParser::doneParsingSourceFiles(Tree *tree)
+void CppCodeParser::doneParsingSourceFiles()
{
- tree->root()->clearCurrentChildPointers();
- tree->root()->normalizeOverloads();
- tree->fixInheritance();
- tree->resolveProperties();
- tree->root()->makeUndocumentedChildrenInternal();
-}
-
-/*!
- This function searches the \a tree to find a FunctionNode
- for a function with the signature \a synopsis. If the
- \a relative node is provided, the search begins there. If
- \a fuzzy is true, base classes are searched. The function
- node is returned, if found.
- */
-const FunctionNode *CppCodeParser::findFunctionNode(const QString& synopsis,
- Tree *tree,
- Node *relative,
- bool fuzzy)
-{
- QStringList parentPath;
- FunctionNode *clone;
- FunctionNode *func = 0;
- int flags = fuzzy ? int(Tree::SearchBaseClasses) : 0;
-
- reset(tree);
- if (makeFunctionNode(synopsis, &parentPath, &clone)) {
- func = tree->findFunctionNode(parentPath, clone, relative, flags);
-
- /*
- This is necessary because Roberto's parser resolves typedefs.
- */
- if (!func && fuzzy) {
- func = tree_->findFunctionNode(parentPath +
- QStringList(clone->name()),
- relative,
- flags);
- if (!func && clone->name().contains('_')) {
- QStringList path = parentPath;
- path << clone->name().split('_');
- func = tree_->findFunctionNode(path, relative, flags);
- }
-
- if (func) {
- NodeList overloads = func->parent()->overloads(func->name());
- NodeList candidates;
- for (int i = 0; i < overloads.count(); ++i) {
- FunctionNode *overload = static_cast(overloads.at(i));
- if (overload->status() != Node::Compat
- && overload->parameters().count() == clone->parameters().count()
- && !overload->isConst() == !clone->isConst())
- candidates << overload;
- }
- if (candidates.count() == 0)
- return 0;
-
- /*
- There's only one function with the correct number
- of parameters. That must be the one.
- */
- if (candidates.count() == 1)
- return static_cast(candidates.first());
-
- overloads = candidates;
- candidates.clear();
- for (int i = 0; i < overloads.count(); ++i) {
- FunctionNode *overload = static_cast(overloads.at(i));
- QList params1 = overload->parameters();
- QList params2 = clone->parameters();
-
- int j;
- for (j = 0; j < params1.count(); ++j) {
- if (!params2.at(j).name().startsWith(params1.at(j).name()))
- break;
- }
- if (j == params1.count())
- candidates << overload;
- }
-
- /*
- There are several functions with the correct
- parameter count, but only one has the correct
- parameter names.
- */
- if (candidates.count() == 1)
- return static_cast(candidates.first());
-
- candidates.clear();
- for (int i = 0; i < overloads.count(); ++i) {
- FunctionNode *overload = static_cast(overloads.at(i));
- QList params1 = overload->parameters();
- QList params2 = clone->parameters();
-
- int j;
- for (j = 0; j < params1.count(); ++j) {
- if (params1.at(j).rightType() != params2.at(j).rightType())
- break;
-
- if (cleanType(params1.at(j).leftType(), tree)
- != cleanType(params2.at(j).leftType(), tree))
- break;
- }
- if (j == params1.count())
- candidates << overload;
- }
-
-
- /*
- There are several functions with the correct
- parameter count, but only one has the correct
- types, loosely compared.
- */
- if (candidates.count() == 1)
- return static_cast(candidates.first());
-
- return 0;
- }
- }
- delete clone;
- }
- return func;
+ qdb_->treeRoot()->clearCurrentChildPointers();
+ qdb_->treeRoot()->normalizeOverloads();
+ qdb_->fixInheritance();
+ qdb_->resolveProperties();
+ qdb_->treeRoot()->makeUndocumentedChildrenInternal();
}
/*!
@@ -505,18 +326,18 @@ Node* CppCodeParser::processTopicCommand(const Doc& doc,
if (!activeNamespaces_.isEmpty()) {
foreach (const QString& usedNamespace_, activeNamespaces_) {
QStringList newPath = usedNamespace_.split("::") + parentPath;
- func = tree_->findFunctionNode(newPath, clone);
+ func = qdb_->findFunctionNode(newPath, clone);
if (func)
break;
}
}
// Search the root namespace if no match was found.
if (func == 0)
- func = tree_->findFunctionNode(parentPath, clone);
+ func = qdb_->findFunctionNode(parentPath, clone);
if (func == 0) {
- if (parentPath.isEmpty() && !lastPath.isEmpty())
- func = tree_->findFunctionNode(lastPath, clone);
+ if (parentPath.isEmpty() && !lastPath_.isEmpty())
+ func = qdb_->findFunctionNode(lastPath_, clone);
if (func == 0) {
doc.location().warning(tr("Cannot find '%1' in '\\%2' %3")
.arg(clone->name() + "(...)")
@@ -529,13 +350,13 @@ Node* CppCodeParser::processTopicCommand(const Doc& doc,
}
else {
doc.location().warning(tr("Missing '%1::' for '%2' in '\\%3'")
- .arg(lastPath.join("::"))
+ .arg(lastPath_.join("::"))
.arg(clone->name() + "()")
.arg(COMMAND_FN));
}
}
else {
- lastPath = parentPath;
+ lastPath_ = parentPath;
}
if (func) {
func->borrowParameterNames(clone);
@@ -549,7 +370,7 @@ Node* CppCodeParser::processTopicCommand(const Doc& doc,
QStringList parentPath;
FunctionNode *func = 0;
- if (makeFunctionNode(arg.first, &parentPath, &func, tree_->root())) {
+ if (makeFunctionNode(arg.first, &parentPath, &func, qdb_->treeRoot())) {
if (!parentPath.isEmpty()) {
doc.startLocation().warning(tr("Invalid syntax in '\\%1'").arg(COMMAND_MACRO));
delete func;
@@ -569,7 +390,7 @@ Node* CppCodeParser::processTopicCommand(const Doc& doc,
return func;
}
else if (QRegExp("[A-Za-z_][A-Za-z0-9_]+").exactMatch(arg.first)) {
- func = new FunctionNode(tree_->root(), arg.first);
+ func = new FunctionNode(qdb_->treeRoot(), arg.first);
func->setAccess(Node::Public);
func->setLocation(doc.startLocation());
func->setMetaness(FunctionNode::MacroWithoutParams);
@@ -606,7 +427,7 @@ Node* CppCodeParser::processTopicCommand(const Doc& doc,
if (!activeNamespaces_.isEmpty()) {
foreach (const QString& usedNamespace_, activeNamespaces_) {
QStringList newPath = usedNamespace_.split("::") + path;
- node = tree_->findNodeByNameAndType(newPath, type, subtype, 0);
+ node = qdb_->findNodeByNameAndType(newPath, type, subtype);
if (node) {
path = newPath;
break;
@@ -619,13 +440,13 @@ Node* CppCodeParser::processTopicCommand(const Doc& doc,
for it in the root namespace.
*/
if (node == 0) {
- node = tree_->findNodeByNameAndType(path, type, subtype, 0);
+ node = qdb_->findNodeByNameAndType(path, type, subtype);
}
if (node == 0) {
doc.location().warning(tr("Cannot find '%1' specified with '\\%2' in any header file")
.arg(arg.first).arg(command));
- lastPath = path;
+ lastPath_ = path;
}
else if (node->isInnerNode()) {
@@ -642,39 +463,41 @@ Node* CppCodeParser::processTopicCommand(const Doc& doc,
}
else if (command == COMMAND_EXAMPLE) {
if (Config::generateExamples) {
- ExampleNode* en = new ExampleNode(tree_->root(), arg.first);
+ ExampleNode* en = new ExampleNode(qdb_->treeRoot(), arg.first);
en->setLocation(doc.startLocation());
createExampleFileNodes(en);
return en;
}
}
else if (command == COMMAND_EXTERNALPAGE) {
- DocNode* dn = new DocNode(tree_->root(), arg.first, Node::ExternalPage, Node::ArticlePage);
+ DocNode* dn = new DocNode(qdb_->treeRoot(), arg.first, Node::ExternalPage, Node::ArticlePage);
dn->setLocation(doc.startLocation());
return dn;
}
else if (command == COMMAND_FILE) {
- DocNode* dn = new DocNode(tree_->root(), arg.first, Node::File, Node::NoPageType);
+ DocNode* dn = new DocNode(qdb_->treeRoot(), arg.first, Node::File, Node::NoPageType);
dn->setLocation(doc.startLocation());
return dn;
}
else if (command == COMMAND_GROUP) {
- DocNode* dn = new DocNode(tree_->root(), arg.first, Node::Group, Node::OverviewPage);
+ DocNode* dn = new DocNode(qdb_->treeRoot(), arg.first, Node::Group, Node::OverviewPage);
dn->setLocation(doc.startLocation());
return dn;
}
else if (command == COMMAND_HEADERFILE) {
- DocNode* dn = new DocNode(tree_->root(), arg.first, Node::HeaderFile, Node::ApiPage);
+ DocNode* dn = new DocNode(qdb_->treeRoot(), arg.first, Node::HeaderFile, Node::ApiPage);
dn->setLocation(doc.startLocation());
return dn;
}
else if (command == COMMAND_MODULE) {
- DocNode* dn = new DocNode(tree_->root(), arg.first, Node::Module, Node::OverviewPage);
+ DocNode* dn = qdb_->addModule(arg.first);
+ //DocNode* dn = new DocNode(qdb_->treeRoot(), arg.first, Node::Module, Node::OverviewPage);
dn->setLocation(doc.startLocation());
return dn;
}
else if (command == COMMAND_QMLMODULE) {
- DocNode* dn = DocNode::lookupQmlModuleNode(tree_, arg);
+ DocNode* dn = qdb_->addQmlModule(arg.first);
+ //DocNode* dn = DocNode::lookupQmlModuleNode(qdb_->tree(), arg);
dn->setLocation(doc.startLocation());
return dn;
}
@@ -710,12 +533,12 @@ Node* CppCodeParser::processTopicCommand(const Doc& doc,
If there is no collision, just create a new Page
node and return that one.
*/
- NameCollisionNode* ncn = tree_->checkForCollision(args[0]);
+ NameCollisionNode* ncn = qdb_->checkForCollision(args[0]);
DocNode* dn = 0;
if (ptype == Node::DitaMapPage)
- dn = new DitaMapNode(tree_->root(), args[0]);
+ dn = new DitaMapNode(qdb_->treeRoot(), args[0]);
else
- dn = new DocNode(tree_->root(), args[0], Node::Page, ptype);
+ dn = new DocNode(qdb_->treeRoot(), args[0], Node::Page, ptype);
dn->setLocation(doc.startLocation());
if (ncn) {
ncn->addCollision(dn);
@@ -723,7 +546,7 @@ Node* CppCodeParser::processTopicCommand(const Doc& doc,
return dn;
}
else if (command == COMMAND_DITAMAP) {
- DocNode* dn = new DitaMapNode(tree_->root(), arg.first);
+ DocNode* dn = new DitaMapNode(qdb_->treeRoot(), arg.first);
dn->setLocation(doc.startLocation());
return dn;
}
@@ -748,7 +571,7 @@ Node* CppCodeParser::processTopicCommand(const Doc& doc,
QML in a .qdoc file.
*/
if (names[1] != "0")
- classNode = tree_->findClassNode(names[1].split("::"));
+ classNode = qdb_->findClassNode(names[1].split("::"));
}
/*
@@ -762,8 +585,8 @@ Node* CppCodeParser::processTopicCommand(const Doc& doc,
If there is no collision, just create a new QML class
node and return that one.
*/
- NameCollisionNode* ncn = tree_->checkForCollision(names[0]);
- QmlClassNode* qcn = new QmlClassNode(tree_->root(), names[0]);
+ NameCollisionNode* ncn = qdb_->checkForCollision(names[0]);
+ QmlClassNode* qcn = new QmlClassNode(qdb_->treeRoot(), names[0]);
qcn->setClassNode(classNode);
qcn->setLocation(doc.startLocation());
#if 0
@@ -787,7 +610,7 @@ Node* CppCodeParser::processTopicCommand(const Doc& doc,
return qcn;
}
else if (command == COMMAND_QMLBASICTYPE) {
- QmlBasicTypeNode* n = new QmlBasicTypeNode(tree_->root(), arg.first);
+ QmlBasicTypeNode* n = new QmlBasicTypeNode(qdb_->treeRoot(), arg.first);
n->setLocation(doc.startLocation());
return n;
}
@@ -799,7 +622,7 @@ Node* CppCodeParser::processTopicCommand(const Doc& doc,
QString element;
QString type;
if (splitQmlMethodArg(arg.first,type,module,element)) {
- QmlClassNode* qmlClass = tree_->findQmlClassNode(module,element);
+ QmlClassNode* qmlClass = qdb_->findQmlType(module,element);
if (qmlClass) {
bool attached = false;
Node::Type nodeType = Node::QmlMethod;
@@ -956,7 +779,7 @@ Node* CppCodeParser::processTopicCommandGroup(const Doc& doc,
ArgList::ConstIterator argsIter = args.constBegin();
arg = argsIter->first;
if (splitQmlPropertyArg(arg,type,module,element,property)) {
- qmlClass = tree_->findQmlClassNode(module,element);
+ qmlClass = qdb_->findQmlType(module,element);
if (qmlClass) {
qmlPropGroup = new QmlPropGroupNode(qmlClass,property); //,attached);
qmlPropGroup->setLocation(doc.startLocation());
@@ -1085,16 +908,16 @@ void CppCodeParser::processOtherMetaCommand(const Doc& doc,
/*
It should be a header file, I think.
*/
- n = tree_->findNodeByNameAndType(QStringList(arg), Node::Document, Node::NoSubType, 0);
+ n = qdb_->findNodeByNameAndType(QStringList(arg), Node::Document, Node::NoSubType);
}
else {
/*
If it wasn't a file, it should be either a class or a namespace.
*/
QStringList newPath = arg.split("::");
- n = tree_->findClassNode(newPath);
+ n = qdb_->findClassNode(newPath);
if (!n)
- n = tree_->findNamespaceNode(newPath);
+ n = qdb_->findNamespaceNode(newPath);
}
if (!n) {
@@ -1137,7 +960,7 @@ void CppCodeParser::processOtherMetaCommand(const Doc& doc,
}
else if (command == COMMAND_QMLINSTANTIATES) {
if ((node->type() == Node::Document) && (node->subType() == Node::QmlClass)) {
- ClassNode* classNode = tree_->findClassNode(arg.split("::"));
+ ClassNode* classNode = qdb_->findClassNode(arg.split("::"));
if (classNode)
node->setClassNode(classNode);
else
@@ -1186,7 +1009,7 @@ void CppCodeParser::processOtherMetaCommand(const Doc& doc,
}
}
else {
- processCommonMetaCommand(doc.location(),command,argLocPair,node,tree_);
+ processCommonMetaCommand(doc.location(),command,argLocPair,node);
}
}
@@ -1213,14 +1036,13 @@ void CppCodeParser::processOtherMetaCommands(const Doc& doc, Node *node)
/*!
Resets the C++ code parser to its default initialized state.
*/
-void CppCodeParser::reset(Tree *tree)
+void CppCodeParser::reset()
{
- tree_ = tree;
tokenizer = 0;
tok = 0;
access = Node::Public;
metaness = FunctionNode::Plain;
- lastPath.clear();
+ lastPath_.clear();
moduleName.clear();
}
@@ -1741,11 +1563,11 @@ bool CppCodeParser::matchBaseSpecifier(ClassNode *classe, bool isClass)
if (!matchDataType(&baseClass))
return false;
- tree_->addBaseClass(classe,
- access,
- baseClass.toPath(),
- baseClass.toString(),
- classe->parent());
+ qdb_->addBaseClass(classe,
+ access,
+ baseClass.toPath(),
+ baseClass.toString(),
+ classe->parent());
return true;
}
@@ -2026,9 +1848,9 @@ bool CppCodeParser::matchProperty(InnerNode *parent)
}
if (key == "READ")
- tree_->addPropertyFunction(property, value, PropertyNode::Getter);
+ qdb_->addPropertyFunction(property, value, PropertyNode::Getter);
else if (key == "WRITE") {
- tree_->addPropertyFunction(property, value, PropertyNode::Setter);
+ qdb_->addPropertyFunction(property, value, PropertyNode::Setter);
property->setWritable(true);
}
else if (key == "STORED")
@@ -2045,9 +1867,9 @@ bool CppCodeParser::matchProperty(InnerNode *parent)
}
}
else if (key == "RESET")
- tree_->addPropertyFunction(property, value, PropertyNode::Resetter);
+ qdb_->addPropertyFunction(property, value, PropertyNode::Resetter);
else if (key == "NOTIFY") {
- tree_->addPropertyFunction(property, value, PropertyNode::Notifier);
+ qdb_->addPropertyFunction(property, value, PropertyNode::Notifier);
} else if (key == "REVISION") {
int revision;
bool ok;
@@ -2267,13 +2089,13 @@ bool CppCodeParser::matchDocsAndStuff()
if (matchFunctionDecl(0, &parentPath, &clone)) {
foreach (const QString& usedNamespace_, activeNamespaces_) {
QStringList newPath = usedNamespace_.split("::") + parentPath;
- func = tree_->findFunctionNode(newPath, clone);
+ func = qdb_->findFunctionNode(newPath, clone);
if (func) {
break;
}
}
if (func == 0)
- func = tree_->findFunctionNode(parentPath, clone);
+ func = qdb_->findFunctionNode(parentPath, clone);
if (func) {
func->borrowParameterNames(clone);
@@ -2283,8 +2105,7 @@ bool CppCodeParser::matchDocsAndStuff()
delete clone;
}
else {
- doc.location().warning(
- tr("Cannot tie this documentation to anything"),
+ doc.location().warning(tr("Cannot tie this documentation to anything"),
tr("I found a /*! ... */ comment, but there was no "
"topic command (e.g., '\\%1', '\\%2') in the "
"comment and no function definition following "
@@ -2340,7 +2161,7 @@ bool CppCodeParser::matchDocsAndStuff()
if ((*n)->isInnerNode() &&
((InnerNode *)*n)->includes().isEmpty()) {
InnerNode *m = static_cast(*n);
- while (m->parent() != tree_->root())
+ while (m->parent() != qdb_->treeRoot())
m = m->parent();
if (m == *n)
((InnerNode *)*n)->addInclude((*n)->name());
@@ -2369,7 +2190,7 @@ bool CppCodeParser::matchDocsAndStuff()
Signals are implemented in uninteresting files
generated by moc.
*/
- node = tree_->findFunctionNode(parentPath, clone);
+ node = qdb_->findFunctionNode(parentPath, clone);
if (node != 0 && node->metaness() != FunctionNode::Signal)
node->setLocation(clone->location());
delete clone;
@@ -2469,8 +2290,7 @@ void CppCodeParser::parseQiteratorDotH(const Location &location,
void CppCodeParser::instantiateIteratorMacro(const QString &container,
const QString &includeFile,
- const QString ¯oDef,
- Tree * /* tree */)
+ const QString ¯oDef)
{
QString resultingCode = macroDef;
resultingCode.replace(QRegExp("\\bC\\b"), container);
@@ -2481,7 +2301,7 @@ void CppCodeParser::instantiateIteratorMacro(const QString &container,
Tokenizer stringTokenizer(loc, latin1);
tokenizer = &stringTokenizer;
readToken();
- matchDeclList(tree_->root());
+ matchDeclList(QDocDatabase::qdocDB()->treeRoot());
}
void CppCodeParser::createExampleFileNodes(DocNode *dn)
diff --git a/src/tools/qdoc/cppcodeparser.h b/src/tools/qdoc/cppcodeparser.h
index e67abb7b53..a6e78af5a1 100644
--- a/src/tools/qdoc/cppcodeparser.h
+++ b/src/tools/qdoc/cppcodeparser.h
@@ -39,10 +39,6 @@
**
****************************************************************************/
-/*
- cppcodeparser.h
-*/
-
#ifndef CPPCODEPARSER_H
#define CPPCODEPARSER_H
@@ -70,19 +66,10 @@ public:
virtual QString language();
virtual QStringList headerFileNameFilter();
virtual QStringList sourceFileNameFilter();
- virtual void parseHeaderFile(const Location& location,
- const QString& filePath,
- Tree *tree);
- virtual void parseSourceFile(const Location& location,
- const QString& filePath,
- Tree *tree);
- virtual void doneParsingHeaderFiles(Tree *tree);
- virtual void doneParsingSourceFiles(Tree *tree);
-
- const FunctionNode *findFunctionNode(const QString& synopsis,
- Tree *tree,
- Node *relative = 0,
- bool fuzzy = false);
+ virtual void parseHeaderFile(const Location& location, const QString& filePath);
+ virtual void parseSourceFile(const Location& location, const QString& filePath);
+ virtual void doneParsingHeaderFiles();
+ virtual void doneParsingSourceFiles();
protected:
virtual QSet topicCommands();
@@ -109,7 +96,7 @@ protected:
void processOtherMetaCommands(const Doc& doc, Node *node);
protected:
- void reset(Tree *tree);
+ void reset();
void readToken();
const Location& location();
QString previousLexeme();
@@ -157,19 +144,17 @@ protected:
void parseQiteratorDotH(const Location &location, const QString &filePath);
void instantiateIteratorMacro(const QString &container,
const QString &includeFile,
- const QString ¯oDef,
- Tree *tree);
+ const QString ¯oDef);
void createExampleFileNodes(DocNode *dn);
protected:
QMap nodeTypeMap;
- Tree* tree_;
Tokenizer *tokenizer;
int tok;
Node::Access access;
FunctionNode::Metaness metaness;
QString moduleName;
- QStringList lastPath;
+ QStringList lastPath_;
QRegExp varComment;
QRegExp sep;
QSet activeNamespaces_;
diff --git a/src/tools/qdoc/ditaxmlgenerator.cpp b/src/tools/qdoc/ditaxmlgenerator.cpp
index 8c945a2683..fa09cd3657 100644
--- a/src/tools/qdoc/ditaxmlgenerator.cpp
+++ b/src/tools/qdoc/ditaxmlgenerator.cpp
@@ -56,6 +56,7 @@
#include "separator.h"
#include "tree.h"
#include
+#include "qdocdatabase.h"
QT_BEGIN_NAMESPACE
@@ -463,23 +464,17 @@ int DitaXmlGenerator::leaveSection()
}
/*!
- The default constructor.
+ Constructs the DITA XML output generator.
*/
DitaXmlGenerator::DitaXmlGenerator()
- : inContents(false),
- inDetailedDescription(false),
+ : inDetailedDescription(false),
inLegaleseText(false),
- inLink(false),
inObsoleteLink(false),
- inSectionHeading(false),
- inTableHeader(false),
inTableBody(false),
noLinks(false),
obsoleteLinks(false),
offlineDocs(true),
- threeColumnEnumValueTable(true),
codeIndent(0),
- numTableRows(0),
divNestingLevel(0),
sectionNestingLevel(0),
tableColumnCount(0),
@@ -488,11 +483,10 @@ DitaXmlGenerator::DitaXmlGenerator()
nodeSubtypeMaps(Node::LastSubtype,0),
pageTypeMaps(Node::OnBeyondZebra,0)
{
- // nothing yet.
}
/*!
- The destructor has nothing to do.
+ Destroys the DITA XML output generator.
*/
DitaXmlGenerator::~DitaXmlGenerator()
{
@@ -504,7 +498,8 @@ DitaXmlGenerator::~DitaXmlGenerator()
}
/*!
- A lot of internal structures are initialized.
+ Initializes the DITA XML output generator's data structures
+ from the configuration class \a config.
*/
void DitaXmlGenerator::initializeGenerator(const Config &config)
{
@@ -583,7 +578,7 @@ void DitaXmlGenerator::initializeGenerator(const Config &config)
}
/*!
- All this does is call the same function in the base class.
+ Gracefully terminates the DITA XML output generator.
*/
void DitaXmlGenerator::terminateGenerator()
{
@@ -672,48 +667,17 @@ GuidMap* DitaXmlGenerator::lookupGuidMap(const QString& fileName)
}
/*!
- This is where the DITA XML files are written.
- \note The file is created in PageGenerator::generateTree().
+ Traverses the database generating all the DITA XML documentation.
*/
-void DitaXmlGenerator::generateTree(Tree *tree)
+void DitaXmlGenerator::generateTree()
{
- tree_ = tree;
- nonCompatClasses.clear();
- mainClasses.clear();
- compatClasses.clear();
- obsoleteClasses.clear();
- moduleClassMap.clear();
- moduleNamespaceMap.clear();
- funcIndex.clear();
- legaleseTexts.clear();
- serviceClasses.clear();
- qmlClasses.clear();
- findAllClasses(tree->root());
- findAllFunctions(tree->root());
- findAllLegaleseTexts(tree->root());
- findAllNamespaces(tree->root());
- findAllSince(tree->root());
-
- Generator::generateTree(tree);
+ qdb_->buildCollections();
+ Generator::generateTree();
generateCollisionPages();
QString fileBase = project.toLower().simplified().replace(QLatin1Char(' '), QLatin1Char('-'));
generateIndex(fileBase, projectUrl, projectDescription);
-
- writeDitaMap(tree);
-}
-
-void DitaXmlGenerator::startText(const Node* /* relative */,
- CodeMarker* /* marker */)
-{
- inLink = false;
- inContents = false;
- inSectionHeading = false;
- inTableHeader = false;
- numTableRows = 0;
- threeColumnEnumValueTable = true;
- link.clear();
- sectionNumber.clear();
+ writeDitaMap();
}
static int countTableColumns(const Atom* t)
@@ -785,12 +749,12 @@ int DitaXmlGenerator::generateAtom(const Atom *atom,
case Atom::AbstractRight:
break;
case Atom::AutoLink:
- if (!noLinks && !inLink && !inContents && !inSectionHeading) {
+ if (!noLinks && !inLink_ && !inContents_ && !inSectionHeading_) {
const Node* node = 0;
- QString link = getLink(atom, relative, marker, &node);
+ QString link = getLink(atom, relative, &node);
if (!link.isEmpty()) {
beginLink(link);
- generateLink(atom, relative, marker);
+ generateLink(atom, marker);
endLink();
}
else {
@@ -849,11 +813,11 @@ int DitaXmlGenerator::generateAtom(const Atom *atom,
break;
case Atom::C:
writeStartTag(DT_tt);
- if (inLink) {
+ if (inLink_) {
writeCharacters(protectEnc(plainCode(atom->string())));
}
else {
- writeText(atom->string(), marker, relative);
+ writeText(atom->string(), relative);
}
writeEndTag(); // see writeStartElement() above
break;
@@ -862,7 +826,7 @@ int DitaXmlGenerator::generateAtom(const Atom *atom,
writeStartTag(DT_codeblock);
xmlWriter().writeAttribute("outputclass","cpp");
writeCharacters("\n");
- writeText(trimmedTrailing(atom->string()), marker, relative);
+ writeText(trimmedTrailing(atom->string()), relative);
writeEndTag(); //
}
break;
@@ -870,7 +834,7 @@ int DitaXmlGenerator::generateAtom(const Atom *atom,
writeStartTag(DT_codeblock);
xmlWriter().writeAttribute("outputclass","qml");
writeCharacters("\n");
- writeText(trimmedTrailing(atom->string()), marker, relative);
+ writeText(trimmedTrailing(atom->string()), relative);
writeEndTag(); //
break;
case Atom::CodeNew:
@@ -879,7 +843,7 @@ int DitaXmlGenerator::generateAtom(const Atom *atom,
writeEndTag(); //
writeStartTag(DT_codeblock);
writeCharacters("\n");
- writeText(trimmedTrailing(atom->string()), marker, relative);
+ writeText(trimmedTrailing(atom->string()), relative);
writeEndTag(); //
break;
case Atom::CodeOld:
@@ -1034,53 +998,57 @@ int DitaXmlGenerator::generateAtom(const Atom *atom,
break;
case Atom::AnnotatedList:
{
- QList values = tree_->groups().values(atom->string());
NodeMap nodeMap;
- for (int i = 0; i < values.size(); ++i) {
- const Node* n = values.at(i);
- if ((n->status() != Node::Internal) && (n->access() != Node::Private)) {
- nodeMap.insert(n->nameForLists(),n);
- }
- }
+ qdb_->getGroup(atom->string(), nodeMap);
generateAnnotatedList(relative, marker, nodeMap);
}
break;
case Atom::GeneratedList:
if (atom->string() == "annotatedclasses") {
- generateAnnotatedList(relative, marker, nonCompatClasses);
+ generateAnnotatedList(relative, marker, qdb_->getCppClasses());
}
else if (atom->string() == "classes") {
- generateCompactList(relative, marker, nonCompatClasses, true);
+ generateCompactList(relative, qdb_->getCppClasses(), true);
}
else if (atom->string() == "qmlclasses") {
- generateCompactList(relative, marker, qmlClasses, true);
+ generateCompactList(relative, qdb_->getQmlTypes(), true);
}
else if (atom->string().contains("classesbymodule")) {
QString arg = atom->string().trimmed();
- QString moduleName = atom->string().mid(atom->string().indexOf(
- "classesbymodule") + 15).trimmed();
- if (moduleClassMap.contains(moduleName))
- generateAnnotatedList(relative, marker, moduleClassMap[moduleName]);
+ QString moduleName = atom->string().mid(atom->string().indexOf("classesbymodule") + 15).trimmed();
+ QDocDatabase* qdb = QDocDatabase::qdocDB();
+ DocNode* dn = qdb->findModule(moduleName);
+ if (dn) {
+ NodeMap m;
+ dn->getMemberClasses(m);
+ if (!m.isEmpty()) {
+ generateAnnotatedList(relative, marker, m);
+ }
+ }
}
else if (atom->string().contains("classesbyedition")) {
QString arg = atom->string().trimmed();
- QString editionName = atom->string().mid(atom->string().indexOf(
- "classesbyedition") + 16).trimmed();
-
+ QString editionName = atom->string().mid(atom->string().indexOf("classesbyedition") + 16).trimmed();
if (editionModuleMap.contains(editionName)) {
-
+ QDocDatabase* qdb = QDocDatabase::qdocDB();
// Add all classes in the modules listed for that edition.
NodeMap editionClasses;
- foreach (const QString &moduleName, editionModuleMap[editionName]) {
- if (moduleClassMap.contains(moduleName))
- editionClasses.unite(moduleClassMap[moduleName]);
+ DocNodeMap::const_iterator i = qdb->modules().begin();
+ while (i != qdb->modules().end()) {
+ NodeMap m;
+ DocNode* dn = i.value();
+ dn->getMemberClasses(m);
+ if (!m.isEmpty())
+ editionClasses.unite(m);
+ m.clear();
+ ++i;
}
// Add additional groups and remove groups of classes that
// should be excluded from the edition.
- QMultiMap groups = tree_->groups();
+ const NodeMultiMap& groups = qdb_->groups();
foreach (const QString &groupName, editionGroupMap[editionName]) {
QList groupClasses;
if (groupName.startsWith(QLatin1Char('-'))) {
@@ -1098,39 +1066,39 @@ int DitaXmlGenerator::generateAtom(const Atom *atom,
}
}
else if (atom->string() == "classhierarchy") {
- generateClassHierarchy(relative, marker, nonCompatClasses);
+ generateClassHierarchy(relative, qdb_->getCppClasses());
}
else if (atom->string() == "compatclasses") {
- generateCompactList(relative, marker, compatClasses, false);
+ generateCompactList(relative, qdb_->getCompatibilityClasses(), false);
}
else if (atom->string() == "obsoleteclasses") {
- generateCompactList(relative, marker, obsoleteClasses, false);
+ generateCompactList(relative, qdb_->getObsoleteClasses(), false);
}
else if (atom->string() == "functionindex") {
- generateFunctionIndex(relative, marker);
+ generateFunctionIndex(relative);
}
else if (atom->string() == "legalese") {
generateLegaleseList(relative, marker);
}
else if (atom->string() == "mainclasses") {
- generateCompactList(relative, marker, mainClasses, true);
+ generateCompactList(relative, qdb_->getMainClasses(), true);
}
else if (atom->string() == "services") {
- generateCompactList(relative, marker, serviceClasses, false);
+ generateCompactList(relative, qdb_->getServiceClasses(), false);
}
else if (atom->string() == "overviews") {
- generateOverviewList(relative, marker);
+ generateOverviewList(relative);
}
else if (atom->string() == "namespaces") {
- generateAnnotatedList(relative, marker, namespaceIndex);
+ generateAnnotatedList(relative, marker, qdb_->getNamespaces());
}
else if (atom->string() == "related") {
const DocNode *dn = static_cast(relative);
- if (dn && !dn->groupMembers().isEmpty()) {
+ if (dn && !dn->members().isEmpty()) {
NodeMap groupMembersMap;
- foreach (const Node *node, dn->groupMembers()) {
+ foreach (const Node *node, dn->members()) {
if (node->type() == Node::Document)
- groupMembersMap[fullName(node, relative, marker)] = node;
+ groupMembersMap[node->fullName(relative)] = node;
}
generateAnnotatedList(dn, marker, groupMembersMap);
}
@@ -1138,20 +1106,18 @@ int DitaXmlGenerator::generateAtom(const Atom *atom,
break;
case Atom::SinceList:
{
- NewSinceMaps::const_iterator nsmap;
- nsmap = newSinceMaps.constFind(atom->string());
- NewClassMaps::const_iterator ncmap;
- ncmap = newClassMaps.constFind(atom->string());
- NewClassMaps::const_iterator nqcmap;
- nqcmap = newQmlClassMaps.constFind(atom->string());
- if ((nsmap != newSinceMaps.constEnd()) && !nsmap.value().isEmpty()) {
+ const NodeMultiMap& nsmap = qdb_->getSinceMap(atom->string());
+ const NodeMap& ncmap = qdb_->getClassMap(atom->string());
+ const NodeMap& nqcmap = qdb_->getQmlTypeMap(atom->string());
+ if (!nsmap.isEmpty()) {
QList sections;
QList::ConstIterator s;
+
for (int i=0; itype()) {
case Node::Document:
@@ -1218,9 +1184,6 @@ int DitaXmlGenerator::generateAtom(const Atom *atom,
++n;
}
- /*
- First generate the table of contents.
- */
writeStartTag(DT_ul);
s = sections.constBegin();
while (s != sections.constEnd()) {
@@ -1242,9 +1205,9 @@ int DitaXmlGenerator::generateAtom(const Atom *atom,
writeCharacters(protectEnc((*s).name));
writeEndTag(); //
if (idx == Class)
- generateCompactList(0, marker, ncmap.value(), false, QString("Q"));
+ generateCompactList(0, ncmap, false, QString("Q"));
else if (idx == QmlClass)
- generateCompactList(0, marker, nqcmap.value(), false, QString("Q"));
+ generateCompactList(0, nqcmap, false, QString("Q"));
else if (idx == MemberFunction) {
ParentMaps parentmaps;
ParentMaps::iterator pmap;
@@ -1265,7 +1228,7 @@ int DitaXmlGenerator::generateAtom(const Atom *atom,
writeStartTag(DT_xref);
// formathtml
xmlWriter().writeAttribute("href",linkForNode(pmap.key(), 0));
- QStringList pieces = fullName(pmap.key(), 0, marker).split("::");
+ QStringList pieces = pmap.key()->fullName().split("::");
writeCharacters(protectEnc(pieces.last()));
writeEndTag(); //
xmlWriter().writeCharacters(":");
@@ -1365,12 +1328,12 @@ int DitaXmlGenerator::generateAtom(const Atom *atom,
case Atom::Link:
{
const Node *node = 0;
- QString myLink = getLink(atom, relative, marker, &node);
+ QString myLink = getLink(atom, relative, &node);
if (myLink.isEmpty())
myLink = getCollisionLink(atom);
if (myLink.isEmpty())
relative->doc().location().warning(tr("Can't link to '%1'").arg(atom->string()));
- else if (!inSectionHeading)
+ else if (!inSectionHeading_)
beginLink(myLink);
skipAhead = 1;
}
@@ -1400,8 +1363,8 @@ int DitaXmlGenerator::generateAtom(const Atom *atom,
writeStartTag(DT_dl);
}
else if (atom->string() == ATOM_LIST_VALUE) {
- threeColumnEnumValueTable = isThreeColumnEnumValueTable(atom);
- if (threeColumnEnumValueTable) {
+ threeColumnEnumValueTable_ = isThreeColumnEnumValueTable(atom);
+ if (threeColumnEnumValueTable_) {
writeStartTag(DT_simpletable);
xmlWriter().writeAttribute("outputclass","valuelist");
writeStartTag(DT_sthead);
@@ -1494,7 +1457,7 @@ int DitaXmlGenerator::generateAtom(const Atom *atom,
writeStartTag(DT_dd);
}
else if (atom->string() == ATOM_LIST_VALUE) {
- if (threeColumnEnumValueTable) {
+ if (threeColumnEnumValueTable_) {
writeEndTag(); //
writeStartTag(DT_stentry);
}
@@ -1590,12 +1553,12 @@ int DitaXmlGenerator::generateAtom(const Atom *atom,
writeGuidAttribute(id);
hx = QLatin1Char('h') + QString::number(atom->string().toInt() + hOffset(relative));
xmlWriter().writeAttribute("outputclass",hx);
- inSectionHeading = true;
+ inSectionHeading_ = true;
}
break;
case Atom::SectionHeadingRight:
writeEndTag(); // (see case Atom::SectionHeadingLeft)
- inSectionHeading = false;
+ inSectionHeading_ = false;
break;
case Atom::SidebarLeft:
// nothing
@@ -1604,8 +1567,8 @@ int DitaXmlGenerator::generateAtom(const Atom *atom,
// nothing
break;
case Atom::String:
- if (inLink && !inContents && !inSectionHeading) {
- generateLink(atom, relative, marker);
+ if (inLink_ && !inContents_ && !inSectionHeading_) {
+ generateLink(atom, marker);
}
else {
writeCharacters(atom->string());
@@ -1625,7 +1588,7 @@ int DitaXmlGenerator::generateAtom(const Atom *atom,
writeStartTag(DT_table);
if (!attr.isEmpty())
xmlWriter().writeAttribute("outputclass",attr);
- numTableRows = 0;
+ numTableRows_ = 0;
if (tableColumnCount != 0) {
qDebug() << "ERROR: Nested tables!";
tableColumnCount = 0;
@@ -1640,7 +1603,7 @@ int DitaXmlGenerator::generateAtom(const Atom *atom,
xmlWriter().writeAttribute("colwidth", QStringLiteral("1*"));
writeEndTag(); // DT_colspec
}
- inTableHeader = false;
+ inTableHeader_ = false;
inTableBody = false;
}
break;
@@ -1648,7 +1611,7 @@ int DitaXmlGenerator::generateAtom(const Atom *atom,
writeEndTag(); //
writeEndTag(); //
writeEndTag(); //
- inTableHeader = false;
+ inTableHeader_ = false;
inTableBody = false;
tableColumnCount = 0;
currentColumn = 0;
@@ -1658,11 +1621,11 @@ int DitaXmlGenerator::generateAtom(const Atom *atom,
writeEndTag(); //
writeEndTag(); //
writeEndTag(); //
- inTableHeader = false;
+ inTableHeader_ = false;
inTableBody = false;
tableColumnCount = 0;
writeStartTag(DT_table);
- numTableRows = 0;
+ numTableRows_ = 0;
tableColumnCount = countTableColumns(atom);
writeStartTag(DT_tgroup);
xmlWriter().writeAttribute("cols",QString::number(tableColumnCount));
@@ -1672,7 +1635,7 @@ int DitaXmlGenerator::generateAtom(const Atom *atom,
xmlWriter().writeAttribute("valign","top");
writeStartTag(DT_row);
xmlWriter().writeAttribute("valign","top");
- inTableHeader = true;
+ inTableHeader_ = true;
inTableBody = false;
break;
case Atom::TableHeaderRight:
@@ -1684,13 +1647,13 @@ int DitaXmlGenerator::generateAtom(const Atom *atom,
}
else {
writeEndTag(); //
- inTableHeader = false;
+ inTableHeader_ = false;
inTableBody = true;
writeStartTag(DT_tbody);
}
break;
case Atom::TableRowLeft:
- if (!inTableHeader && !inTableBody) {
+ if (!inTableHeader_ && !inTableBody) {
inTableBody = true;
writeStartTag(DT_tbody);
}
@@ -1770,7 +1733,7 @@ int DitaXmlGenerator::generateAtom(const Atom *atom,
}
break;
case Atom::TableItemRight:
- if (inTableHeader) {
+ if (inTableHeader_) {
writeEndTag(); //
}
else {
@@ -1792,8 +1755,10 @@ int DitaXmlGenerator::generateAtom(const Atom *atom,
columnText = pieces.at(0);
pieces.pop_front();
QString path = pieces.join(" ").trimmed();
- node = findNodeForTarget(path, relative, marker, atom);
- }
+ node = qdb_->findNodeForTarget(path, relative, atom);
+ if (!node)
+ relative->doc().location().warning(tr("Cannot link to '%1'").arg(path));
+ }
if (params.size() == 2) {
numColumns = qMax(columnText.toInt(), numColumns);
@@ -1857,8 +1822,8 @@ DitaXmlGenerator::generateClassLikeNode(InnerNode* inner, CodeMarker* marker)
QString fullTitle;
if (inner->type() == Node::Namespace) {
const NamespaceNode* nsn = const_cast(static_cast(inner));
- rawTitle = marker->plainName(inner);
- fullTitle = marker->plainFullName(inner);
+ rawTitle = inner->plainName();
+ fullTitle = inner->plainFullName();
title = rawTitle + " Namespace";
/*
@@ -1907,7 +1872,7 @@ DitaXmlGenerator::generateClassLikeNode(InnerNode* inner, CodeMarker* marker)
writeCharacters(protectEnc((*s).name));
writeEndTag(); //
generateSection(s->members, inner, marker, CodeMarker::Summary);
- generateSectionInheritedList(*s, inner, marker);
+ generateSectionInheritedList(*s, inner);
}
if (!s->reimpMembers.isEmpty()) {
QString name = QString("Reimplemented ") + (*s).name;
@@ -1917,7 +1882,7 @@ DitaXmlGenerator::generateClassLikeNode(InnerNode* inner, CodeMarker* marker)
writeCharacters(protectEnc(name));
writeEndTag(); //
generateSection(s->reimpMembers, inner, marker, CodeMarker::Summary);
- generateSectionInheritedList(*s, inner, marker);
+ generateSectionInheritedList(*s, inner);
}
}
++s;
@@ -1930,7 +1895,7 @@ DitaXmlGenerator::generateClassLikeNode(InnerNode* inner, CodeMarker* marker)
s = summarySections.constBegin();
while (s != summarySections.constEnd()) {
if (s->members.isEmpty())
- generateSectionInheritedList(*s, inner, marker);
+ generateSectionInheritedList(*s, inner);
++s;
}
}
@@ -1977,8 +1942,8 @@ DitaXmlGenerator::generateClassLikeNode(InnerNode* inner, CodeMarker* marker)
}
else if (inner->type() == Node::Class) {
const ClassNode* cn = const_cast(static_cast(inner));
- rawTitle = marker->plainName(inner);
- fullTitle = marker->plainFullName(inner);
+ rawTitle = inner->plainName();
+ fullTitle = inner->plainFullName();
title = rawTitle + " Class";
generateHeader(inner, fullTitle);
@@ -1996,7 +1961,7 @@ DitaXmlGenerator::generateClassLikeNode(InnerNode* inner, CodeMarker* marker)
xmlWriter().writeAttribute("value","abstract");
writeEndTag(); //
}
- writeDerivations(cn, marker); //
+ writeDerivations(cn); //
// not included:
@@ -2035,7 +2000,7 @@ DitaXmlGenerator::generateClassLikeNode(InnerNode* inner, CodeMarker* marker)
writeCharacters(protectEnc((*s).name));
writeEndTag(); //
generateSection(s->members, inner, marker, CodeMarker::Summary);
- generateSectionInheritedList(*s, inner, marker);
+ generateSectionInheritedList(*s, inner);
}
if (!s->reimpMembers.isEmpty()) {
QString name = QString("Reimplemented ") + (*s).name;
@@ -2045,7 +2010,7 @@ DitaXmlGenerator::generateClassLikeNode(InnerNode* inner, CodeMarker* marker)
writeCharacters(protectEnc(name));
writeEndTag(); //
generateSection(s->reimpMembers, inner, marker, CodeMarker::Summary);
- generateSectionInheritedList(*s, inner, marker);
+ generateSectionInheritedList(*s, inner);
}
}
++s;
@@ -2058,7 +2023,7 @@ DitaXmlGenerator::generateClassLikeNode(InnerNode* inner, CodeMarker* marker)
s = summarySections.constBegin();
while (s != summarySections.constEnd()) {
if (s->members.isEmpty())
- generateSectionInheritedList(*s, inner, marker);
+ generateSectionInheritedList(*s, inner);
++s;
}
}
@@ -2105,8 +2070,8 @@ DitaXmlGenerator::generateClassLikeNode(InnerNode* inner, CodeMarker* marker)
}
else if ((inner->type() == Node::Document) && (inner->subType() == Node::HeaderFile)) {
const DocNode* dn = const_cast(static_cast(inner));
- rawTitle = marker->plainName(inner);
- fullTitle = marker->plainFullName(inner);
+ rawTitle = inner->plainName();
+ fullTitle = inner->plainFullName();
title = rawTitle;
/*
@@ -2151,7 +2116,7 @@ DitaXmlGenerator::generateClassLikeNode(InnerNode* inner, CodeMarker* marker)
writeCharacters(protectEnc((*s).name));
writeEndTag(); //
generateSection(s->members, inner, marker, CodeMarker::Summary);
- generateSectionInheritedList(*s, inner, marker);
+ generateSectionInheritedList(*s, inner);
}
if (!s->reimpMembers.isEmpty()) {
QString name = QString("Reimplemented ") + (*s).name;
@@ -2161,7 +2126,7 @@ DitaXmlGenerator::generateClassLikeNode(InnerNode* inner, CodeMarker* marker)
writeCharacters(protectEnc(name));
writeEndTag(); //
generateSection(s->reimpMembers, inner, marker, CodeMarker::Summary);
- generateSectionInheritedList(*s, inner, marker);
+ generateSectionInheritedList(*s, inner);
}
}
++s;
@@ -2175,7 +2140,7 @@ DitaXmlGenerator::generateClassLikeNode(InnerNode* inner, CodeMarker* marker)
s = summarySections.constBegin();
while (s != summarySections.constEnd()) {
if (s->members.isEmpty())
- generateSectionInheritedList(*s, inner, marker);
+ generateSectionInheritedList(*s, inner);
++s;
}
}
@@ -2222,8 +2187,8 @@ DitaXmlGenerator::generateClassLikeNode(InnerNode* inner, CodeMarker* marker)
else if ((inner->type() == Node::Document) && (inner->subType() == Node::QmlClass)) {
QmlClassNode* qcn = const_cast(static_cast(inner));
ClassNode* cn = qcn->classNode();
- rawTitle = marker->plainName(inner);
- fullTitle = marker->plainFullName(inner);
+ rawTitle = inner->plainName();
+ fullTitle = inner->plainFullName();
title = rawTitle + " Type";
Node::clearPropertyGroupCount();
@@ -2317,16 +2282,21 @@ void DitaXmlGenerator::generateDocNode(DocNode* dn, CodeMarker* marker)
enterSection(QString(), QString());
if (dn->subType() == Node::Module) {
generateStatus(dn, marker);
- if (moduleNamespaceMap.contains(dn->name())) {
+ NodeMap nm;
+ dn->getMemberNamespaces(nm);
+ if (!nm.isEmpty()) {
enterSection("h2","Namespaces");
- generateAnnotatedList(dn, marker, moduleNamespaceMap[dn->name()]);
+ generateAnnotatedList(dn, marker, nm);
leaveSection();
}
- if (moduleClassMap.contains(dn->name())) {
+ nm.clear();
+ dn->getMemberClasses(nm);
+ if (!nm.isEmpty()) {
enterSection("h2","Classes");
- generateAnnotatedList(dn, marker, moduleClassMap[dn->name()]);
+ generateAnnotatedList(dn, marker, nm);
leaveSection();
}
+ nm.clear();
}
if (dn->doc().isEmpty()) {
@@ -2356,17 +2326,17 @@ void DitaXmlGenerator::generateDocNode(DocNode* dn, CodeMarker* marker)
}
generateAlsoList(dn, marker);
- if ((dn->subType() == Node::QmlModule) && !dn->qmlModuleMembers().isEmpty()) {
+ if ((dn->subType() == Node::QmlModule) && !dn->members().isEmpty()) {
NodeMap qmlModuleMembersMap;
- foreach (const Node* node, dn->qmlModuleMembers()) {
+ foreach (const Node* node, dn->members()) {
if (node->type() == Node::Document && node->subType() == Node::QmlClass)
qmlModuleMembersMap[node->name()] = node;
}
generateAnnotatedList(dn, marker, qmlModuleMembersMap);
}
- else if (!dn->groupMembers().isEmpty()) {
+ else if (!dn->members().isEmpty()) {
NodeMap groupMembersMap;
- foreach (const Node *node, dn->groupMembers()) {
+ foreach (const Node *node, dn->members()) {
if (node->type() == Node::Class || node->type() == Node::Namespace)
groupMembersMap[node->name()] = node;
}
@@ -2378,7 +2348,7 @@ void DitaXmlGenerator::generateDocNode(DocNode* dn, CodeMarker* marker)
dn->doc().location().warning(tr("Pop of empty XML tag stack; generating DITA for '%1'").arg(dn->name()));
return;
}
- writeRelatedLinks(dn, marker);
+ writeRelatedLinks(dn);
writeEndTag(); //
}
@@ -2413,7 +2383,7 @@ void DitaXmlGenerator::writeLink(const Node* node,
value of the \e role attribute is \c{parent} for the
\c{start} link.
*/
-void DitaXmlGenerator::writeRelatedLinks(const DocNode* node, CodeMarker* marker)
+void DitaXmlGenerator::writeRelatedLinks(const DocNode* node)
{
const Node* linkNode = 0;
QPair linkPair;
@@ -2421,7 +2391,9 @@ void DitaXmlGenerator::writeRelatedLinks(const DocNode* node, CodeMarker* marker
writeStartTag(DT_relatedLinks);
if (node->links().contains(Node::PreviousLink)) {
linkPair = node->links()[Node::PreviousLink];
- linkNode = findNodeForTarget(linkPair.first, node, marker);
+ linkNode = qdb_->findNodeForTarget(linkPair.first, node);
+ if (!linkNode)
+ node->doc().location().warning(tr("Cannot link to '%1'").arg(linkPair.first));
if (linkNode && linkNode->type() == Node::Document) {
const DocNode *docNode = static_cast(linkNode);
linkPair.second = docNode->title();
@@ -2430,7 +2402,9 @@ void DitaXmlGenerator::writeRelatedLinks(const DocNode* node, CodeMarker* marker
}
if (node->links().contains(Node::NextLink)) {
linkPair = node->links()[Node::NextLink];
- linkNode = findNodeForTarget(linkPair.first, node, marker);
+ linkNode = qdb_->findNodeForTarget(linkPair.first, node);
+ if (!linkNode)
+ node->doc().location().warning(tr("Cannot link to '%1'").arg(linkPair.first));
if (linkNode && linkNode->type() == Node::Document) {
const DocNode *docNode = static_cast(linkNode);
linkPair.second = docNode->title();
@@ -2439,7 +2413,9 @@ void DitaXmlGenerator::writeRelatedLinks(const DocNode* node, CodeMarker* marker
}
if (node->links().contains(Node::StartLink)) {
linkPair = node->links()[Node::StartLink];
- linkNode = findNodeForTarget(linkPair.first, node, marker);
+ linkNode = qdb_->findNodeForTarget(linkPair.first, node);
+ if (!linkNode)
+ node->doc().location().warning(tr("Cannot link to '%1'").arg(linkPair.first));
if (linkNode && linkNode->type() == Node::Document) {
const DocNode *docNode = static_cast(linkNode);
linkPair.second = docNode->title();
@@ -2617,8 +2593,8 @@ void DitaXmlGenerator::generateTableOfContents(const Node* node,
}
// disable nested links in table of contents
- inContents = true;
- inLink = true;
+ inContents_ = true;
+ inLink_ = true;
for (int i = 0; i < toc.size(); ++i) {
Atom *atom = toc.at(i);
@@ -2666,124 +2642,8 @@ void DitaXmlGenerator::generateTableOfContents(const Node* node,
if (numColumns > 1)
out() << "\n";
- inContents = false;
- inLink = false;
-}
-
-/*!
- zzz
- Revised for the new doc format.
- Generates a table of contents beginning at \a node.
- */
-void DitaXmlGenerator::generateTableOfContents(const Node* node,
- CodeMarker* marker,
- QList* sections)
-{
- QList toc;
- if (node->doc().hasTableOfContents())
- toc = node->doc().tableOfContents();
- if (toc.isEmpty() && !sections && (node->subType() != Node::Module))
- return;
-
- QStringList sectionNumber;
- int detailsBase = 0;
-
- // disable nested links in table of contents
- inContents = true;
- inLink = true;
-
- out() << "\n";
- out() << "
Contents
\n";
- sectionNumber.append("1");
- out() << "
\n";
-
- if (node->subType() == Node::Module) {
- if (moduleNamespaceMap.contains(node->name())) {
- out() << "- Namespaces
\n";
- }
- if (moduleClassMap.contains(node->name())) {
- out() << "- Classes
\n";
- }
- out() << "- Detailed Description
\n";
- for (int i = 0; i < toc.size(); ++i) {
- if (toc.at(i)->string().toInt() == 1) {
- detailsBase = 1;
- break;
- }
- }
- }
- else if (sections && (node->type() == Node::Class)) {
- QList::ConstIterator s = sections->constBegin();
- while (s != sections->constEnd()) {
- if (!s->members.isEmpty() || !s->reimpMembers.isEmpty()) {
- out() << "- " << (*s).name
- << "
\n";
- }
- ++s;
- }
- out() << "- Detailed Description
\n";
- for (int i = 0; i < toc.size(); ++i) {
- if (toc.at(i)->string().toInt() == 1) {
- detailsBase = 1;
- break;
- }
- }
- }
-
- for (int i = 0; i < toc.size(); ++i) {
- Atom *atom = toc.at(i);
- int nextLevel = atom->string().toInt() + detailsBase;
- if (sectionNumber.size() < nextLevel) {
- do {
- sectionNumber.append("1");
- } while (sectionNumber.size() < nextLevel);
- }
- else {
- while (sectionNumber.size() > nextLevel) {
- sectionNumber.removeLast();
- }
- sectionNumber.last() = QString::number(sectionNumber.last().toInt() + 1);
- }
- int numAtoms;
- Text headingText = Text::sectionHeading(atom);
- QString s = headingText.toString();
- out() << "- ";
- out() << "";
- generateAtomList(headingText.firstAtom(), node, marker, true, numAtoms);
- out() << "
\n";
- }
- while (!sectionNumber.isEmpty()) {
- sectionNumber.removeLast();
- }
- out() << "
\n";
- out() << "
\n";
- inContents = false;
- inLink = false;
+ inContents_ = false;
+ inLink_ = false;
}
void DitaXmlGenerator::generateLowStatusMembers(const InnerNode* inner,
@@ -2832,9 +2692,7 @@ void DitaXmlGenerator::generateLowStatusMembers(const InnerNode* inner,
/*!
Write the XML for the class hierarchy to the current XML stream.
*/
-void DitaXmlGenerator::generateClassHierarchy(const Node* relative,
- CodeMarker* marker,
- const QMap& classMap)
+void DitaXmlGenerator::generateClassHierarchy(const Node* relative, const NodeMap& classMap)
{
if (classMap.isEmpty())
return;
@@ -2863,7 +2721,7 @@ void DitaXmlGenerator::generateClassHierarchy(const Node* relative,
const ClassNode *child =
static_cast(*stack.top().constBegin());
writeStartTag(DT_li);
- generateFullName(child, relative, marker);
+ generateFullName(child, relative);
writeEndTag(); //
stack.top().erase(stack.top().begin());
@@ -2906,7 +2764,7 @@ void DitaXmlGenerator::generateAnnotatedList(const Node* relative,
writeStartTag(DT_row);
writeStartTag(DT_entry);
writeStartTag(DT_p);
- generateFullName(node, relative, marker);
+ generateFullName(node, relative);
writeEndTag(); //
writeEndTag(); //
@@ -2944,7 +2802,6 @@ void DitaXmlGenerator::generateAnnotatedList(const Node* relative,
the name of the first and last classes in \a classMap.
*/
void DitaXmlGenerator::generateCompactList(const Node* relative,
- CodeMarker* marker,
const NodeMap& classMap,
bool includeAlphabet,
QString commonPrefix)
@@ -3124,12 +2981,12 @@ void DitaXmlGenerator::generateCompactList(const Node* relative,
if (it.value()->subType() == Node::QmlClass)
pieces << it.value()->name();
else
- pieces = fullName(it.value(), relative, marker).split("::");
+ pieces = it.value()->fullName(relative).split("::");
xmlWriter().writeCharacters(protectEnc(pieces.last()));
writeEndTag(); //
if (pieces.size() > 1) {
xmlWriter().writeCharacters(" (");
- generateFullName(it.value()->parent(),relative,marker);
+ generateFullName(it.value()->parent(),relative);
xmlWriter().writeCharacters(")");
}
}
@@ -3144,8 +3001,7 @@ void DitaXmlGenerator::generateCompactList(const Node* relative,
/*!
Write XML for a function index to the current XML stream.
*/
-void DitaXmlGenerator::generateFunctionIndex(const Node* relative,
- CodeMarker* marker)
+void DitaXmlGenerator::generateFunctionIndex(const Node* relative)
{
writeStartTag(DT_p);
xmlWriter().writeAttribute("outputclass","alphabet");
@@ -3166,7 +3022,8 @@ void DitaXmlGenerator::generateFunctionIndex(const Node* relative,
char currentLetter;
writeStartTag(DT_ul);
- QMap::ConstIterator f = funcIndex.constBegin();
+ NodeMapMap& funcIndex = qdb_->getFunctionIndex();
+ NodeMapMap::ConstIterator f = funcIndex.constBegin();
while (f != funcIndex.constEnd()) {
writeStartTag(DT_li);
currentLetter = f.key()[0].unicode();
@@ -3183,7 +3040,7 @@ void DitaXmlGenerator::generateFunctionIndex(const Node* relative,
NodeMap::ConstIterator s = (*f).constBegin();
while (s != (*f).constEnd()) {
- generateFullName((*s)->parent(), relative, marker, *s);
+ generateFullName((*s)->parent(), relative, *s);
++s;
}
writeEndTag(); //
@@ -3195,17 +3052,17 @@ void DitaXmlGenerator::generateFunctionIndex(const Node* relative,
/*!
Write the legalese texts as XML to the current XML stream.
*/
-void DitaXmlGenerator::generateLegaleseList(const Node* relative,
- CodeMarker* marker)
+void DitaXmlGenerator::generateLegaleseList(const Node* relative, CodeMarker* marker)
{
- QMap::ConstIterator it = legaleseTexts.constBegin();
+ TextToNodeMap& legaleseTexts = qdb_->getLegaleseTexts();
+ TextToNodeMap::ConstIterator it = legaleseTexts.constBegin();
while (it != legaleseTexts.constEnd()) {
Text text = it.key();
generateText(text, relative, marker);
writeStartTag(DT_ul);
do {
writeStartTag(DT_li);
- generateFullName(it.value(), relative, marker);
+ generateFullName(it.value(), relative);
writeEndTag(); //
++it;
} while (it != legaleseTexts.constEnd() && it.key() == text);
@@ -3234,20 +3091,20 @@ void DitaXmlGenerator::generateQmlItem(const Node* node,
marked.remove("<@type>");
marked.remove("@type>");
}
- writeText(marked, marker, relative);
+ writeText(marked, relative);
}
/*!
Write the XML for the overview list to the current XML stream.
*/
-void DitaXmlGenerator::generateOverviewList(const Node* relative, CodeMarker* /* marker */)
+void DitaXmlGenerator::generateOverviewList(const Node* relative)
{
QMap > docNodeMap;
QMap groupTitlesMap;
QMap uncategorizedNodeMap;
QRegExp singleDigit("\\b([0-9])\\b");
- const NodeList children = tree_->root()->childNodes();
+ const NodeList children = qdb_->treeRoot()->childNodes();
foreach (Node* child, children) {
if (child->type() == Node::Document && child != relative) {
DocNode* docNode = static_cast(child);
@@ -3282,7 +3139,7 @@ void DitaXmlGenerator::generateOverviewList(const Node* relative, CodeMarker* /*
if (isGroupPage) {
// If we encounter a group definition page, we add all
// the pages in that group to the list for that group.
- foreach (Node* member, docNode->groupMembers()) {
+ foreach (Node* member, docNode->members()) {
if (member->type() != Node::Document)
continue;
DocNode* page = static_cast(member);
@@ -3299,7 +3156,7 @@ void DitaXmlGenerator::generateOverviewList(const Node* relative, CodeMarker* /*
else if (!isGroupPage) {
// If we encounter a page that belongs to a group then
// we add that page to the list for that group.
- const DocNode* gn = tree_->findGroupNode(QStringList(group));
+ const DocNode* gn = qdb_->findGroupNode(QStringList(group));
if (gn)
docNodeMap[gn].insert(sortKey, docNode);
}
@@ -3383,7 +3240,7 @@ void DitaXmlGenerator::generateSection(const NodeList& nl,
if ((*m)->access() != Node::Private) {
writeStartTag(DT_li);
QString marked = getMarkedUpSynopsis(*m, relative, marker, style);
- writeText(marked, marker, relative);
+ writeText(marked, relative);
writeEndTag(); //
}
++m;
@@ -3395,9 +3252,7 @@ void DitaXmlGenerator::generateSection(const NodeList& nl,
/*!
Writes the "inherited from" list to the current XML stream.
*/
-void DitaXmlGenerator::generateSectionInheritedList(const Section& section,
- const Node* relative,
- CodeMarker* marker)
+void DitaXmlGenerator::generateSectionInheritedList(const Section& section, const Node* relative)
{
if (section.inherited.isEmpty())
return;
@@ -3420,7 +3275,7 @@ void DitaXmlGenerator::generateSectionInheritedList(const Section& section,
text = fileName((*p).first) + QLatin1Char('#');
text += DitaXmlGenerator::cleanRef(section.name.toLower());
xmlWriter().writeAttribute("href",text);
- text = protectEnc(marker->plainFullName((*p).first, relative));
+ text = protectEnc((*p).first->plainFullName(relative));
writeCharacters(text);
writeEndTag(); //
writeEndTag(); //
@@ -3472,9 +3327,7 @@ QString DitaXmlGenerator::getMarkedUpSynopsis(const Node* node,
from \a markedCode , and then the text is written to the current XML
stream.
*/
-void DitaXmlGenerator::writeText(const QString& markedCode,
- CodeMarker* marker,
- const Node* relative)
+void DitaXmlGenerator::writeText(const QString& markedCode, const Node* relative)
{
QString src = markedCode;
QString text;
@@ -3587,7 +3440,7 @@ void DitaXmlGenerator::writeText(const QString& markedCode,
}
par1 = QStringRef();
QString link;
- n = marker->resolveTarget(arg.toString(), tree_, relative);
+ n = qdb_->resolveTarget(arg.toString(), relative);
if (n && n->subType() == Node::QmlBasicType) {
if (relative && relative->subType() == Node::QmlClass) {
link = linkForNode(n,relative);
@@ -3616,9 +3469,7 @@ void DitaXmlGenerator::writeText(const QString& markedCode,
}
}
-void DitaXmlGenerator::generateLink(const Atom* atom,
- const Node* /* relative */,
- CodeMarker* marker)
+void DitaXmlGenerator::generateLink(const Atom* atom, CodeMarker* marker)
{
static QRegExp camelCase("[A-Z][A-Z][a-z]|[a-z][A-Z0-9]|_");
@@ -3626,13 +3477,13 @@ void DitaXmlGenerator::generateLink(const Atom* atom,
// hack for C++: move () outside of link
int k = funcLeftParen.pos(1);
writeCharacters(protectEnc(atom->string().left(k)));
- if (link.isEmpty()) {
+ if (link_.isEmpty()) {
if (showBrokenLinks)
writeEndTag(); //
}
else
writeEndTag(); //
- inLink = false;
+ inLink_ = false;
writeCharacters(protectEnc(atom->string().mid(k)));
}
else if (marker->recognizeLanguage("Java")) {
@@ -3920,7 +3771,6 @@ QString DitaXmlGenerator::refForAtom(Atom* atom, const Node* /* node */)
void DitaXmlGenerator::generateFullName(const Node* apparentNode,
const Node* relative,
- CodeMarker* marker,
const Node* actualNode)
{
if (actualNode == 0)
@@ -3929,127 +3779,10 @@ void DitaXmlGenerator::generateFullName(const Node* apparentNode,
// formathtml
QString href = linkForNode(actualNode, relative);
writeHrefAttribute(href);
- writeCharacters(protectEnc(fullName(apparentNode, relative, marker)));
+ writeCharacters(protectEnc(apparentNode->fullName(relative)));
writeEndTag(); //
}
-void DitaXmlGenerator::findAllClasses(const InnerNode* node)
-{
- NodeList::const_iterator c = node->childNodes().constBegin();
- while (c != node->childNodes().constEnd()) {
- if ((*c)->access() != Node::Private && (*c)->url().isEmpty()) {
- if ((*c)->type() == Node::Class && !(*c)->doc().isEmpty()) {
- QString className = (*c)->name();
- if ((*c)->parent() &&
- (*c)->parent()->type() == Node::Namespace &&
- !(*c)->parent()->name().isEmpty())
- className = (*c)->parent()->name()+"::"+className;
-
- if (!(static_cast(*c))->hideFromMainList()) {
- if ((*c)->status() == Node::Compat) {
- compatClasses.insert(className, *c);
- }
- else if ((*c)->status() == Node::Obsolete) {
- obsoleteClasses.insert(className, *c);
- }
- else {
- nonCompatClasses.insert(className, *c);
- if ((*c)->status() == Node::Main)
- mainClasses.insert(className, *c);
- }
- }
-
- QString moduleName = (*c)->moduleName();
- if (moduleName == "Qt3SupportLight") {
- moduleClassMap[moduleName].insert((*c)->name(), *c);
- moduleName = "Qt3Support";
- }
- if (!moduleName.isEmpty())
- moduleClassMap[moduleName].insert((*c)->name(), *c);
-
- QString serviceName =
- (static_cast(*c))->serviceName();
- if (!serviceName.isEmpty())
- serviceClasses.insert(serviceName, *c);
- }
- else if ((*c)->type() == Node::Document &&
- (*c)->subType() == Node::QmlClass &&
- !(*c)->doc().isEmpty()) {
- QString qmlClassName = (*c)->name();
- qmlClasses.insert(qmlClassName,*c);
- }
- else if ((*c)->isInnerNode()) {
- findAllClasses(static_cast(*c));
- }
- }
- ++c;
- }
-}
-
-void DitaXmlGenerator::findAllFunctions(const InnerNode* node)
-{
- NodeList::ConstIterator c = node->childNodes().constBegin();
- while (c != node->childNodes().constEnd()) {
- if ((*c)->access() != Node::Private) {
- if ((*c)->isInnerNode() && (*c)->url().isEmpty()) {
- findAllFunctions(static_cast(*c));
- }
- else if ((*c)->type() == Node::Function) {
- const FunctionNode* func = static_cast(*c);
- if ((func->status() > Node::Obsolete) &&
- !func->isInternal() &&
- (func->metaness() != FunctionNode::Ctor) &&
- (func->metaness() != FunctionNode::Dtor)) {
- funcIndex[(*c)->name()].insert((*c)->parent()->fullDocumentName(), *c);
- }
- }
- }
- ++c;
- }
-}
-
-void DitaXmlGenerator::findAllLegaleseTexts(const InnerNode* node)
-{
- NodeList::ConstIterator c = node->childNodes().constBegin();
- while (c != node->childNodes().constEnd()) {
- if ((*c)->access() != Node::Private) {
- if (!(*c)->doc().legaleseText().isEmpty())
- legaleseTexts.insertMulti((*c)->doc().legaleseText(), *c);
- if ((*c)->isInnerNode())
- findAllLegaleseTexts(static_cast(*c));
- }
- ++c;
- }
-}
-
-void DitaXmlGenerator::findAllNamespaces(const InnerNode* node)
-{
- NodeList::ConstIterator c = node->childNodes().constBegin();
- while (c != node->childNodes().constEnd()) {
- if ((*c)->access() != Node::Private) {
- if ((*c)->isInnerNode() && (*c)->url().isEmpty()) {
- findAllNamespaces(static_cast(*c));
- if ((*c)->type() == Node::Namespace) {
- const NamespaceNode *nspace = static_cast(*c);
- // Ensure that the namespace's name is not empty (the root
- // namespace has no name).
- if (!nspace->name().isEmpty()) {
- namespaceIndex.insert(nspace->name(), *c);
- QString moduleName = (*c)->moduleName();
- if (moduleName == "Qt3SupportLight") {
- moduleNamespaceMap[moduleName].insert((*c)->name(), *c);
- moduleName = "Qt3Support";
- }
- if (!moduleName.isEmpty())
- moduleNamespaceMap[moduleName].insert((*c)->name(), *c);
- }
- }
- }
- }
- ++c;
- }
-}
-
/*!
We're writing an attribute that indicates that the text
data is a heading, hence, h1, h2, h3... etc, and we must
@@ -4082,34 +3815,6 @@ bool DitaXmlGenerator::isThreeColumnEnumValueTable(const Atom* atom)
return false;
}
-const Node* DitaXmlGenerator::findNodeForTarget(const QString& target,
- const Node* relative,
- CodeMarker* marker,
- const Atom* atom)
-{
- const Node* node = 0;
-
- if (target.isEmpty()) {
- node = relative;
- }
- else if (target.endsWith(".html")) {
- node = tree_->root()->findChildNodeByNameAndType(target, Node::Document);
- }
- else if (marker) {
- node = marker->resolveTarget(target, tree_, relative);
- if (!node)
- node = tree_->findDocNodeByTitle(target, relative);
- if (!node && atom) {
- node = tree_->findUnambiguousTarget(target, *const_cast(&atom), relative);
- }
- }
-
- if (!node)
- relative->doc().location().warning(tr("Cannot link to '%1'").arg(target));
-
- return node;
-}
-
const QPair DitaXmlGenerator::anchorForNode(const Node* node)
{
QPair anchorPair;
@@ -4122,10 +3827,7 @@ const QPair DitaXmlGenerator::anchorForNode(const Node* node)
return anchorPair;
}
-QString DitaXmlGenerator::getLink(const Atom* atom,
- const Node* relative,
- CodeMarker* marker,
- const Node** node)
+QString DitaXmlGenerator::getLink(const Atom* atom, const Node* relative, const Node** node)
{
QString link;
*node = 0;
@@ -4154,14 +3856,14 @@ QString DitaXmlGenerator::getLink(const Atom* atom,
*node = relative;
}
else if (first.endsWith(".html")) {
- *node = tree_->root()->findChildNodeByNameAndType(first, Node::Document);
+ *node = qdb_->treeRoot()->findChildNodeByNameAndType(first, Node::Document);
}
else {
- *node = marker->resolveTarget(first, tree_, relative);
+ *node = qdb_->resolveTarget(first, relative);
if (!*node)
- *node = tree_->findDocNodeByTitle(first, relative);
+ *node = qdb_->findDocNodeByTitle(first, relative);
if (!*node)
- *node = tree_->findUnambiguousTarget(first, targetAtom, relative);
+ *node = qdb_->findUnambiguousTarget(first, targetAtom, relative);
}
if (*node) {
@@ -4182,7 +3884,7 @@ QString DitaXmlGenerator::getLink(const Atom* atom,
if (fake->title().startsWith("Porting"))
porting = true;
}
- QString name = marker->plainFullName(relative);
+ QString name = relative->plainFullName();
if (!porting && !name.startsWith("Q3")) {
if (obsoleteLinks) {
relative->doc().location().warning(tr("Link to obsolete item '%1' in %2")
@@ -4195,7 +3897,7 @@ QString DitaXmlGenerator::getLink(const Atom* atom,
}
while (!path.isEmpty()) {
- targetAtom = tree_->findTarget(path.first(), *node);
+ targetAtom = qdb_->findTarget(path.first(), *node);
if (targetAtom == 0)
break;
path.removeFirst();
@@ -4211,8 +3913,7 @@ QString DitaXmlGenerator::getLink(const Atom* atom,
QString guid = lookupGuid(link,refForAtom(targetAtom,*node));
link += QLatin1Char('#') + guid;
}
- else if (!link.isEmpty() && *node &&
- (link.endsWith(".xml") || link.endsWith(".dita"))) {
+ else if (!link.isEmpty() && *node && (link.endsWith(".xml") || link.endsWith(".dita"))) {
link += QLatin1Char('#') + (*node)->guid();
}
}
@@ -4243,7 +3944,7 @@ void DitaXmlGenerator::generateIndex(const QString& fileBase,
const QString& url,
const QString& title)
{
- tree_->generateIndex(outputDir() + QLatin1Char('/') + fileBase + ".index", url, title, this);
+ qdb_->generateIndex(outputDir() + QLatin1Char('/') + fileBase + ".index", url, title, this);
}
void DitaXmlGenerator::generateStatus(const Node* node, CodeMarker* marker)
@@ -4267,12 +3968,12 @@ void DitaXmlGenerator::generateStatus(const Node* node, CodeMarker* marker)
<< "We strongly advise against "
<< "using it in new code. See ";
- const DocNode *docNode = tree_->findDocNodeByTitle("Porting To Qt 4");
+ const DocNode *docNode = qdb_->findDocNodeByTitle("Porting To Qt 4");
Atom *targetAtom = 0;
if (docNode && node->type() == Node::Class) {
QString oldName(node->name());
oldName.remove(QLatin1Char('3'));
- targetAtom = tree_->findTarget(oldName,docNode);
+ targetAtom = qdb_->findTarget(oldName,docNode);
}
if (targetAtom) {
@@ -4298,19 +3999,19 @@ void DitaXmlGenerator::generateStatus(const Node* node, CodeMarker* marker)
void DitaXmlGenerator::beginLink(const QString& link)
{
- this->link = link;
- if (link.isEmpty())
+ link_ = link;
+ if (link_.isEmpty())
return;
writeStartTag(DT_xref);
// formathtml
- writeHrefAttribute(link);
- inLink = true;
+ writeHrefAttribute(link_);
+ inLink_ = true;
}
void DitaXmlGenerator::endLink()
{
- if (inLink) {
- if (link.isEmpty()) {
+ if (inLink_) {
+ if (link_.isEmpty()) {
if (showBrokenLinks)
writeEndTag(); //
}
@@ -4323,7 +4024,7 @@ void DitaXmlGenerator::endLink()
writeEndTag(); //
}
}
- inLink = false;
+ inLink_ = false;
inObsoleteLink = false;
}
@@ -4370,7 +4071,7 @@ void DitaXmlGenerator::startQmlProperty(QmlPropertyNode* qpn,
writeStartTag(DT_qmlPropertyDetail);
writeStartTag(DT_qmlPropertyDef);
if (!qpn->isReadOnlySet())
- qpn->setReadOnly(!qpn->isWritable(tree_));
+ qpn->setReadOnly(!qpn->isWritable(qdb_));
if (qpn->isReadOnly()) {
writeStartTag(DT_qmlQualifier);
xmlWriter().writeAttribute("name","read-only");
@@ -4513,7 +4214,7 @@ void DitaXmlGenerator::writeQmlRef(DitaTag tag,
writeStartTag((DitaTag)((int)tag+1));
writeStartTag(DT_apiData);
QString marked = getMarkedUpSynopsis(n, relative, marker, CodeMarker::Detailed);
- writeText(marked, marker, relative);
+ writeText(marked, relative);
writeEndTag(); //
if (node->isAttached()) {
writeStartTag(DT_qmlAttached);
@@ -4583,7 +4284,7 @@ void DitaXmlGenerator::generateQmlInheritedBy(const QmlClassNode* qcn, CodeMarke
//xmlWriter().writeAttribute("outputclass","inherited-by");
writeStartTag(DT_apiData);
Text text;
- appendSortedQmlNames(text,qcn,subs,marker);
+ appendSortedQmlNames(text,qcn,subs);
text << Atom::ParaRight;
generateText(text, qcn, marker);
writeEndTag(); //
@@ -4714,7 +4415,7 @@ QString DitaXmlGenerator::fullQualification(const Node* n)
\endcode
*/
-void DitaXmlGenerator::writeDerivations(const ClassNode* cn, CodeMarker* marker)
+void DitaXmlGenerator::writeDerivations(const ClassNode* cn)
{
QList::ConstIterator r;
@@ -4732,7 +4433,7 @@ void DitaXmlGenerator::writeDerivations(const ClassNode* cn, CodeMarker* marker)
writeStartTag(DT_cxxClassBaseClass);
QString attr = fileName((*r).node) + QLatin1Char('#') + (*r).node->guid();
xmlWriter().writeAttribute("href",attr);
- writeCharacters(marker->plainFullName((*r).node));
+ writeCharacters((*r).node->plainFullName());
writeEndTag(); //
// not included: or
@@ -4901,7 +4602,7 @@ void DitaXmlGenerator::writeFunctions(const Section& s,
else {
writeStartTag(DT_cxxFunctionDeclaredType);
QString src = marker->typified(fn->returnType());
- replaceTypesWithLinks(fn,parent,marker,src);
+ replaceTypesWithLinks(fn,parent,src);
writeEndTag(); //
}
@@ -4933,7 +4634,7 @@ void DitaXmlGenerator::writeFunctions(const Section& s,
if (rfn && !rfn->isInternal()) {
writeStartTag(DT_cxxFunctionReimplemented);
xmlWriter().writeAttribute("href",ditaXmlHref(rfn));
- writeCharacters(marker->plainFullName(rfn));
+ writeCharacters(rfn->plainFullName());
writeEndTag(); //
}
}
@@ -4966,10 +4667,7 @@ static const QChar charAt = '@';
This function replaces class and enum names with
elements, i.e. links.
*/
-void DitaXmlGenerator::replaceTypesWithLinks(const Node* n,
- const InnerNode* parent,
- CodeMarker* marker,
- QString& src)
+void DitaXmlGenerator::replaceTypesWithLinks(const Node* n, const InnerNode* parent, QString& src)
{
QStringRef arg;
QStringRef par1;
@@ -4983,7 +4681,7 @@ void DitaXmlGenerator::replaceTypesWithLinks(const Node* n,
}
i += 2;
if (parseArg(src, typeTag, &i, srcSize, &arg, &par1)) {
- const Node* tn = marker->resolveTarget(arg.toString(), tree_, parent, n);
+ const Node* tn = qdb_->resolveTarget(arg.toString(), parent, n);
if (tn) {
//Do not generate a link from a C++ function to a QML Basic Type (such as int)
if (n->type() == Node::Function && tn->subType() == Node::QmlBasicType)
@@ -5023,7 +4721,7 @@ void DitaXmlGenerator::writeParameters(const FunctionNode* fn,
writeStartTag(DT_cxxFunctionParameter);
writeStartTag(DT_cxxFunctionParameterDeclaredType);
QString src = marker->typified((*p).leftType());
- replaceTypesWithLinks(fn,parent,marker,src);
+ replaceTypesWithLinks(fn,parent,src);
//writeCharacters((*p).leftType());
if (!(*p).rightType().isEmpty())
writeCharacters((*p).rightType());
@@ -5325,7 +5023,7 @@ void DitaXmlGenerator::writeProperties(const Section& s,
PropertyNode* opn = (PropertyNode*)pn->overriddenFrom();
writeStartTag(DT_cxxVariableReimplemented);
xmlWriter().writeAttribute("href",ditaXmlHref(opn));
- writeCharacters(marker->plainFullName(opn));
+ writeCharacters(opn->plainFullName());
writeEndTag(); //
}
@@ -5487,7 +5185,7 @@ void DitaXmlGenerator::writeMacros(const Section& s,
FunctionNode* rfn = (FunctionNode*)fn->reimplementedFrom();
writeStartTag(DT_cxxDefineReimplemented);
xmlWriter().writeAttribute("href",ditaXmlHref(rfn));
- writeCharacters(marker->plainFullName(rfn));
+ writeCharacters(rfn->plainFullName());
writeEndTag(); //
}
@@ -5861,7 +5559,7 @@ Node* DitaXmlGenerator::collectNodesByTypeAndSubtype(const InnerNode* parent)
Creates the DITA map for the qdoc run. The map is written
to the file \e{qt.ditamap" in the DITA XML output directory.
*/
-void DitaXmlGenerator::writeDitaMap(Tree *tree)
+void DitaXmlGenerator::writeDitaMap()
{
QString doctype;
@@ -5869,7 +5567,7 @@ void DitaXmlGenerator::writeDitaMap(Tree *tree)
Remove #if 0 to get a flat ditamap.
*/
#if 0
- beginSubPage(tree->root(),"qt.ditamap");
+ beginSubPage(qdb_->treeRoot(),"qt.ditamap");
doctype = "";
xmlWriter().writeDTD(doctype);
writeStartTag(DT_map);
@@ -5895,9 +5593,9 @@ void DitaXmlGenerator::writeDitaMap(Tree *tree)
nodeSubtypeMaps[i] = new NodeMultiMap;
for (unsigned i=0; iroot());
+ Node* rootPageNode = collectNodesByTypeAndSubtype(qdb_->treeRoot());
- beginSubPage(tree->root(),"qt.ditamap");
+ beginSubPage(qdb_->treeRoot(),"qt.ditamap");
doctype = "";
xmlWriter().writeDTD(doctype);
@@ -5987,7 +5685,7 @@ void DitaXmlGenerator::writeDitaRefs(const DitaRefList& ditarefs)
writeStartTag(DT_topicref);
xmlWriter().writeAttribute("navtitle",t->navtitle());
if (t->href().isEmpty()) {
- const DocNode* dn = tree_->findDocNodeByTitle(t->navtitle());
+ const DocNode* dn = qdb_->findDocNodeByTitle(t->navtitle());
if (dn)
xmlWriter().writeAttribute("href",fileName(dn));
}
diff --git a/src/tools/qdoc/ditaxmlgenerator.h b/src/tools/qdoc/ditaxmlgenerator.h
index f8a16b4e0b..9f82726ba8 100644
--- a/src/tools/qdoc/ditaxmlgenerator.h
+++ b/src/tools/qdoc/ditaxmlgenerator.h
@@ -301,7 +301,7 @@ public:
virtual void terminateGenerator();
virtual QString format();
virtual bool canHandleFormat(const QString& format);
- virtual void generateTree(Tree *tree);
+ virtual void generateTree();
void generateCollisionPages();
QString protectEnc(const QString& string);
@@ -310,7 +310,6 @@ public:
static QString sinceTitle(int i) { return sinceTitles[i]; }
protected:
- virtual void startText(const Node* relative, CodeMarker* marker);
virtual int generateAtom(const Atom* atom,
const Node* relative,
CodeMarker* marker);
@@ -325,17 +324,14 @@ protected:
QString fullQualification(const Node* n);
void writeCharacters(const QString& text);
- void writeDerivations(const ClassNode* cn, CodeMarker* marker);
+ void writeDerivations(const ClassNode* cn);
void writeLocation(const Node* n);
void writeFunctions(const Section& s,
const InnerNode* parent,
CodeMarker* marker,
const QString& attribute = QString());
void writeNestedClasses(const Section& s, const Node* n);
- void replaceTypesWithLinks(const Node* n,
- const InnerNode* parent,
- CodeMarker* marker,
- QString& src);
+ void replaceTypesWithLinks(const Node* n, const InnerNode* parent, QString& src);
void writeParameters(const FunctionNode* fn, const InnerNode* parent, CodeMarker* marker);
void writeEnumerations(const Section& s,
CodeMarker* marker,
@@ -353,7 +349,7 @@ protected:
CodeMarker* marker,
const QString& attribute = QString());
void writePropertyParameter(const QString& tag, const NodeList& nlist);
- void writeRelatedLinks(const DocNode* dn, CodeMarker* marker);
+ void writeRelatedLinks(const DocNode* dn);
void writeLink(const Node* node, const QString& tex, const QString& role);
void writeProlog(const InnerNode* inner);
bool writeMetadataElement(const InnerNode* inner,
@@ -368,10 +364,6 @@ private:
enum SubTitleSize { SmallSubTitle, LargeSubTitle };
const QPair anchorForNode(const Node* node);
- const Node* findNodeForTarget(const QString& target,
- const Node* relative,
- CodeMarker* marker,
- const Atom* atom = 0);
void generateHeader(const Node* node,
const QString& name,
bool subpage = false);
@@ -381,29 +373,23 @@ private:
Doc::Sections sectioningUnit,
int numColumns,
const Node* relative = 0);
- void generateTableOfContents(const Node* node,
- CodeMarker* marker,
- QList* sections = 0);
void generateLowStatusMembers(const InnerNode* inner,
CodeMarker* marker,
CodeMarker::Status status);
QString generateLowStatusMemberFile(const InnerNode* inner,
CodeMarker* marker,
CodeMarker::Status status);
- void generateClassHierarchy(const Node* relative,
- CodeMarker* marker,
- const NodeMap& classMap);
+ void generateClassHierarchy(const Node* relative, const NodeMap& classMap);
void generateAnnotatedList(const Node* relative,
CodeMarker* marker,
const NodeMap& nodeMap);
void generateCompactList(const Node* relative,
- CodeMarker* marker,
const NodeMap& classMap,
bool includeAlphabet,
QString commonPrefix = QString());
- void generateFunctionIndex(const Node* relative, CodeMarker* marker);
+ void generateFunctionIndex(const Node* relative);
void generateLegaleseList(const Node* relative, CodeMarker* marker);
- void generateOverviewList(const Node* relative, CodeMarker* marker);
+ void generateOverviewList(const Node* relative);
void generateQmlSummary(const Section& section,
const Node* relative,
@@ -437,35 +423,19 @@ private:
const Node* relative,
CodeMarker* marker,
CodeMarker::SynopsisStyle style);
- void generateSectionInheritedList(const Section& section,
- const Node* relative,
- CodeMarker* marker);
- void writeText(const QString& markedCode,
- CodeMarker* marker,
- const Node* relative);
+ void generateSectionInheritedList(const Section& section, const Node* relative);
+ void writeText(const QString& markedCode, const Node* relative);
- void generateFullName(const Node* apparentNode,
- const Node* relative,
- CodeMarker* marker,
- const Node* actualNode = 0);
- void generateLink(const Atom* atom,
- const Node* relative,
- CodeMarker* marker);
+ void generateFullName(const Node* apparentNode, const Node* relative, const Node* actualNode = 0);
+ void generateLink(const Atom* atom, CodeMarker* marker);
void generateStatus(const Node* node, CodeMarker* marker);
QString registerRef(const QString& ref);
virtual QString fileBase(const Node *node) const;
QString fileName(const Node *node);
- void findAllClasses(const InnerNode *node);
- void findAllFunctions(const InnerNode *node);
- void findAllLegaleseTexts(const InnerNode *node);
- void findAllNamespaces(const InnerNode *node);
static int hOffset(const Node *node);
static bool isThreeColumnEnumValueTable(const Atom *atom);
- QString getLink(const Atom *atom,
- const Node *relative,
- CodeMarker *marker,
- const Node **node);
+ QString getLink(const Atom *atom, const Node *relative, const Node **node);
virtual void generateIndex(const QString& fileBase,
const QString& url,
const QString& title);
@@ -485,7 +455,7 @@ private:
QXmlStreamWriter& xmlWriter();
void writeApiDesc(const Node* node, CodeMarker* marker, const QString& title);
void addLink(const QString& href, const QStringRef& text, DitaTag t = DT_xref);
- void writeDitaMap(Tree* tree);
+ void writeDitaMap();
void writeDitaMap(const DitaMapNode* node);
void writeStartTag(DitaTag t);
bool writeEndTag(DitaTag t=DT_NONE);
@@ -510,29 +480,21 @@ private:
These flags indicate which elements the generator
is currently outputting.
*/
- bool inContents;
bool inDetailedDescription;
bool inLegaleseText;
- bool inLink;
bool inObsoleteLink;
- bool inSectionHeading;
- bool inTableHeader;
bool inTableBody;
bool noLinks;
bool obsoleteLinks;
bool offlineDocs;
- bool threeColumnEnumValueTable;
int codeIndent;
- int numTableRows;
int divNestingLevel;
int sectionNestingLevel;
int tableColumnCount;
int currentColumn;
- QString link;
- QStringList sectionNumber;
QRegExp funcLeftParen;
QString style;
QString postHeader;
@@ -551,17 +513,6 @@ private:
QMap refMap;
QMap name2guidMap;
GuidMaps guidMaps;
- QMap moduleClassMap;
- QMap moduleNamespaceMap;
- NodeMap nonCompatClasses;
- NodeMap mainClasses;
- NodeMap compatClasses;
- NodeMap obsoleteClasses;
- NodeMap namespaceIndex;
- NodeMap serviceClasses;
- NodeMap qmlClasses;
- QMap funcIndex;
- QMap legaleseTexts;
static int id;
static QString ditaTags[];
QStack xmlWriterStack;
diff --git a/src/tools/qdoc/doc.cpp b/src/tools/qdoc/doc.cpp
index dd6fb1d1ff..3a8f15a39d 100644
--- a/src/tools/qdoc/doc.cpp
+++ b/src/tools/qdoc/doc.cpp
@@ -2918,8 +2918,6 @@ Text Doc::trimmedBriefText(const QString &className) const
if (atom) {
QString briefStr;
QString whats;
- bool standardWording = true;
-
/*
This code is really ugly. The entire \brief business
should be rethought.
@@ -2937,21 +2935,9 @@ Text Doc::trimmedBriefText(const QString &className) const
else {
if (!w.isEmpty() && w.first() == "The")
w.removeFirst();
- else {
- location().warning(
- tr("Nonstandard wording in '\\%1' text for '%2' (expected 'The')")
- .arg(COMMAND_BRIEF).arg(className));
- standardWording = false;
- }
if (!w.isEmpty() && (w.first() == className || w.first() == classNameOnly))
w.removeFirst();
- else {
- location().warning(
- tr("Nonstandard wording in '\\%1' text for '%2' (expected '%3')")
- .arg(COMMAND_BRIEF).arg(className).arg(className));
- standardWording = false;
- }
if (!w.isEmpty() && ((w.first() == "class") ||
(w.first() == "function") ||
@@ -2960,14 +2946,6 @@ Text Doc::trimmedBriefText(const QString &className) const
(w.first() == "namespace") ||
(w.first() == "header")))
w.removeFirst();
- else {
- location().warning(
- tr("Nonstandard wording in '\\%1' text for '%2' ("
- "expected 'class', 'function', 'macro', 'widget', "
- "'namespace' or 'header')")
- .arg(COMMAND_BRIEF).arg(className));
- standardWording = false;
- }
if (!w.isEmpty() && (w.first() == "is" || w.first() == "provides"))
w.removeFirst();
@@ -2981,18 +2959,11 @@ Text Doc::trimmedBriefText(const QString &className) const
if (whats.endsWith(QLatin1Char('.')))
whats.truncate(whats.length() - 1);
- if (whats.isEmpty()) {
- location().warning(
- tr("Nonstandard wording in '\\%1' text for '%2' (expected more text)")
- .arg(COMMAND_BRIEF).arg(className));
- standardWording = false;
- }
- else
+ if (!whats.isEmpty())
whats[0] = whats[0].toUpper();
// ### move this once \brief is abolished for properties
- if (standardWording)
- resultText << whats;
+ resultText << whats;
}
return resultText;
}
diff --git a/src/tools/qdoc/generator.cpp b/src/tools/qdoc/generator.cpp
index 9bde42bae2..23003de806 100644
--- a/src/tools/qdoc/generator.cpp
+++ b/src/tools/qdoc/generator.cpp
@@ -50,12 +50,11 @@
#include "doc.h"
#include "editdistance.h"
#include "generator.h"
-#include "node.h"
#include "openedlist.h"
#include "quoter.h"
#include "separator.h"
#include "tokenizer.h"
-#include "tree.h"
+#include "qdocdatabase.h"
QT_BEGIN_NAMESPACE
@@ -97,18 +96,33 @@ QString Generator::sinceTitles[] =
QStringList Generator::styleDirs;
QStringList Generator::styleFiles;
-
+/*!
+ Constructs the generator base class. Prepends the newly
+ constructed generator to the list of output generators.
+ Sets a pointer to the QDoc database singleton, which is
+ available to the generator subclasses.
+ */
Generator::Generator()
: amp("&"),
gt(">"),
lt("<"),
quot("""),
tag("?@[^>]*>"),
- tree_(0)
-{
+ inLink_(false),
+ inContents_(false),
+ inSectionHeading_(false),
+ inTableHeader_(false),
+ threeColumnEnumValueTable_(true),
+ numTableRows_(0)
+{
+ qdb_ = QDocDatabase::qdocDB();
generators.prepend(this);
}
+/*!
+ Destroys the generator after removing it from the list of
+ output generators.
+ */
Generator::~Generator()
{
generators.removeAll(this);
@@ -117,14 +131,13 @@ Generator::~Generator()
void Generator::appendFullName(Text& text,
const Node *apparentNode,
const Node *relative,
- CodeMarker *marker,
const Node *actualNode)
{
if (actualNode == 0)
actualNode = apparentNode;
text << Atom(Atom::LinkNode, CodeMarker::stringForNode(actualNode))
<< Atom(Atom::FormattingLeft, ATOM_FORMATTING_LINK)
- << Atom(Atom::String, marker->plainFullName(apparentNode, relative))
+ << Atom(Atom::String, apparentNode->plainFullName(relative))
<< Atom(Atom::FormattingRight, ATOM_FORMATTING_LINK);
}
@@ -141,24 +154,18 @@ void Generator::appendFullName(Text& text,
<< Atom(Atom::FormattingRight, ATOM_FORMATTING_LINK);
}
-void Generator::appendFullNames(Text& text,
- const NodeList& nodes,
- const Node* relative,
- CodeMarker* marker)
+void Generator::appendFullNames(Text& text, const NodeList& nodes, const Node* relative)
{
NodeList::ConstIterator n = nodes.constBegin();
int index = 0;
while (n != nodes.constEnd()) {
- appendFullName(text,*n,relative,marker);
+ appendFullName(text,*n,relative);
text << comma(index++,nodes.count());
++n;
}
}
-void Generator::appendSortedNames(Text& text,
- const ClassNode *classe,
- const QList &classes,
- CodeMarker *marker)
+void Generator::appendSortedNames(Text& text, const ClassNode *classe, const QList &classes)
{
QList::ConstIterator r;
QMap classMap;
@@ -170,7 +177,7 @@ void Generator::appendSortedNames(Text& text,
(*r).node->status() != Node::Internal
&& !(*r).node->doc().isEmpty()) {
Text className;
- appendFullName(className, (*r).node, classe, marker);
+ appendFullName(className, (*r).node, classe);
classMap[className.toString().toLower()] = className;
}
++r;
@@ -185,10 +192,7 @@ void Generator::appendSortedNames(Text& text,
}
}
-void Generator::appendSortedQmlNames(Text& text,
- const Node* base,
- const NodeList& subs,
- CodeMarker *marker)
+void Generator::appendSortedQmlNames(Text& text, const Node* base, const NodeList& subs)
{
QMap classMap;
int index = 0;
@@ -197,7 +201,7 @@ void Generator::appendSortedQmlNames(Text& text,
Text t;
if (!base->isQtQuickNode() || !subs[i]->isQtQuickNode() ||
(base->qmlModuleIdentifier() == subs[i]->qmlModuleIdentifier())) {
- appendFullName(t, subs[i], base, marker);
+ appendFullName(t, subs[i], base);
classMap[t.toString().toLower()] = t;
}
}
@@ -265,11 +269,6 @@ void Generator::endSubPage()
delete outStreamStack.pop();
}
-void Generator::endText(const Node * /* relative */,
- CodeMarker * /* marker */)
-{
-}
-
QString Generator::fileBase(const Node *node) const
{
if (node->relates())
@@ -371,93 +370,6 @@ QString Generator::fileName(const Node* node) const
return name;
}
-/*!
- For generating the "New Classes... in x.y" section on the
- What's New in Qt x.y" page.
- */
-void Generator::findAllSince(const InnerNode *node)
-{
- NodeList::const_iterator child = node->childNodes().constBegin();
-
- // Traverse the tree, starting at the node supplied.
-
- while (child != node->childNodes().constEnd()) {
-
- QString sinceString = (*child)->since();
-
- if (((*child)->access() != Node::Private) && !sinceString.isEmpty()) {
-
- // Insert a new entry into each map for each new since string found.
- NewSinceMaps::iterator nsmap = newSinceMaps.find(sinceString);
- if (nsmap == newSinceMaps.end())
- nsmap = newSinceMaps.insert(sinceString,NodeMultiMap());
-
- NewClassMaps::iterator ncmap = newClassMaps.find(sinceString);
- if (ncmap == newClassMaps.end())
- ncmap = newClassMaps.insert(sinceString,NodeMap());
-
- NewClassMaps::iterator nqcmap = newQmlClassMaps.find(sinceString);
- if (nqcmap == newQmlClassMaps.end())
- nqcmap = newQmlClassMaps.insert(sinceString,NodeMap());
-
- if ((*child)->type() == Node::Function) {
- // Insert functions into the general since map.
- FunctionNode *func = static_cast(*child);
- if ((func->status() > Node::Obsolete) &&
- (func->metaness() != FunctionNode::Ctor) &&
- (func->metaness() != FunctionNode::Dtor)) {
- nsmap.value().insert(func->name(),(*child));
- }
- }
- else if ((*child)->url().isEmpty()) {
- if ((*child)->type() == Node::Class && !(*child)->doc().isEmpty()) {
- // Insert classes into the since and class maps.
- QString className = (*child)->name();
- if ((*child)->parent() &&
- (*child)->parent()->type() == Node::Namespace &&
- !(*child)->parent()->name().isEmpty())
- className = (*child)->parent()->name()+"::"+className;
-
- nsmap.value().insert(className,(*child));
- ncmap.value().insert(className,(*child));
- }
- else if ((*child)->subType() == Node::QmlClass) {
- // Insert QML elements into the since and element maps.
- QString className = (*child)->name();
- if ((*child)->parent() &&
- (*child)->parent()->type() == Node::Namespace &&
- !(*child)->parent()->name().isEmpty())
- className = (*child)->parent()->name()+"::"+className;
-
- nsmap.value().insert(className,(*child));
- nqcmap.value().insert(className,(*child));
- }
- else if ((*child)->type() == Node::QmlProperty) {
- // Insert QML properties into the since map.
- QString propertyName = (*child)->name();
- nsmap.value().insert(propertyName,(*child));
- }
- }
- else {
- // Insert external documents into the general since map.
- QString name = (*child)->name();
- if ((*child)->parent() &&
- (*child)->parent()->type() == Node::Namespace &&
- !(*child)->parent()->name().isEmpty())
- name = (*child)->parent()->name()+"::"+name;
-
- nsmap.value().insert(name,(*child));
- }
-
- // Find child nodes with since commands.
- if ((*child)->isInnerNode()) {
- findAllSince(static_cast(*child));
- }
- }
- ++child;
- }
-}
-
QMap& Generator::formattingLeftMap()
{
return fmtLeftMaps[format()];
@@ -628,26 +540,6 @@ QString Generator::fullDocumentLocation(const Node *node, bool subdir)
return fdl + parentName.toLower() + anchorRef;
}
-QString Generator::fullName(const Node *node,
- const Node *relative,
- CodeMarker *marker) const
-{
- if (node->type() == Node::Document) {
- const DocNode* fn = static_cast(node);
-
- // Only print modulename::type on collision pages.
- if (!fn->qmlModuleIdentifier().isEmpty() && relative != 0 && relative->isCollisionNode())
- return fn->qmlModuleIdentifier() + "::" + fn->title();
-
- return fn->title();
- }
- else if (node->type() == Node::Class &&
- !(static_cast(node))->serviceName().isEmpty())
- return (static_cast(node))->serviceName();
- else
- return marker->plainFullName(node, relative);
-}
-
void Generator::generateAlsoList(const Node *node, CodeMarker *marker)
{
QList alsoList = node->doc().alsoList();
@@ -747,8 +639,7 @@ void Generator::generateBody(const Node *node, CodeMarker *marker)
}
if (node->doc().isEmpty()) {
if (!quiet && !node->isReimp()) { // ### might be unnecessary
- node->location().warning(tr("No documentation for '%1'")
- .arg(marker->plainFullName(node)));
+ node->location().warning(tr("No documentation for '%1'").arg(node->plainFullName()));
}
}
else {
@@ -785,15 +676,12 @@ void Generator::generateBody(const Node *node, CodeMarker *marker)
if (!best.isEmpty() && !documentedItems.contains(best))
details = tr("Maybe you meant '%1'?").arg(best);
- node->doc().location().warning(
- tr("No such enum item '%1' in %2").arg(*a).arg(marker->plainFullName(node)),
- details);
+ node->doc().location().warning(tr("No such enum item '%1' in %2").arg(*a).arg(node->plainFullName()), details);
if (*a == "Void")
qDebug() << "VOID:" << node->name() << definedItems;
}
else if (!documentedItems.contains(*a)) {
- node->doc().location().warning(
- tr("Undocumented enum item '%1' in %2").arg(*a).arg(marker->plainFullName(node)));
+ node->doc().location().warning(tr("Undocumented enum item '%1' in %2").arg(*a).arg(node->plainFullName()));
}
++a;
}
@@ -828,7 +716,7 @@ void Generator::generateBody(const Node *node, CodeMarker *marker)
details = tr("Maybe you meant '%1'?").arg(best);
node->doc().location().warning(
- tr("No such parameter '%1' in %2").arg(*a).arg(marker->plainFullName(node)),
+ tr("No such parameter '%1' in %2").arg(*a).arg(node->plainFullName()),
details);
}
else if (!(*a).isEmpty() && !documentedParams.contains(*a)) {
@@ -849,7 +737,7 @@ void Generator::generateBody(const Node *node, CodeMarker *marker)
if (needWarning && !func->isReimp())
node->doc().location().warning(
tr("Undocumented parameter '%1' in %2")
- .arg(*a).arg(marker->plainFullName(node)));
+ .arg(*a).arg(node->plainFullName()));
}
++a;
}
@@ -974,7 +862,7 @@ void Generator::generateInheritedBy(const ClassNode *classe, CodeMarker *marker)
<< "Inherited by: "
<< Atom(Atom::FormattingRight,ATOM_FORMATTING_BOLD);
- appendSortedNames(text, classe, classe->derivedClasses(), marker);
+ appendSortedNames(text, classe, classe->derivedClasses());
text << Atom::ParaRight;
generateText(text, classe, marker);
}
@@ -1111,7 +999,7 @@ void Generator::generateQmlInheritedBy(const QmlClassNode* qcn,
if (!subs.isEmpty()) {
Text text;
text << Atom::ParaLeft << "Inherited by ";
- appendSortedQmlNames(text,qcn,subs,marker);
+ appendSortedQmlNames(text,qcn,subs);
text << Atom::ParaRight;
generateText(text, qcn, marker);
}
@@ -1138,7 +1026,7 @@ bool Generator::generateQmlText(const Text& text,
bool result = false;
if (atom != 0) {
- startText(relative, marker);
+ initializeTextOutput();
while (atom) {
if (atom->type() != Atom::QmlText)
atom = atom->next();
@@ -1151,7 +1039,6 @@ bool Generator::generateQmlText(const Text& text,
}
}
}
- endText(relative, marker);
result = true;
}
return result;
@@ -1269,13 +1156,12 @@ bool Generator::generateText(const Text& text,
bool result = false;
if (text.firstAtom() != 0) {
int numAtoms = 0;
- startText(relative, marker);
+ initializeTextOutput();
generateAtomList(text.firstAtom(),
relative,
marker,
true,
numAtoms);
- endText(relative, marker);
result = true;
}
return result;
@@ -1366,7 +1252,7 @@ void Generator::generateThreadSafeness(const Node *node, CodeMarker *marker)
if (nonreentrant.isEmpty()) {
if (!threadsafe.isEmpty()) {
text << ", but ";
- appendFullNames(text,threadsafe,innerNode,marker);
+ appendFullNames(text,threadsafe,innerNode);
singularPlural(text,threadsafe);
text << " also " << tlink << ".";
}
@@ -1375,13 +1261,13 @@ void Generator::generateThreadSafeness(const Node *node, CodeMarker *marker)
}
else {
text << ", except for ";
- appendFullNames(text,nonreentrant,innerNode,marker);
+ appendFullNames(text,nonreentrant,innerNode);
text << ", which";
singularPlural(text,nonreentrant);
text << " nonreentrant.";
if (!threadsafe.isEmpty()) {
text << " ";
- appendFullNames(text,threadsafe,innerNode,marker);
+ appendFullNames(text,threadsafe,innerNode);
singularPlural(text,threadsafe);
text << " " << tlink << ".";
}
@@ -1391,7 +1277,7 @@ void Generator::generateThreadSafeness(const Node *node, CodeMarker *marker)
if (!nonreentrant.isEmpty() || !reentrant.isEmpty()) {
text << ", except for ";
if (!reentrant.isEmpty()) {
- appendFullNames(text,reentrant,innerNode,marker);
+ appendFullNames(text,reentrant,innerNode);
text << ", which";
singularPlural(text,reentrant);
text << " only " << rlink;
@@ -1399,7 +1285,7 @@ void Generator::generateThreadSafeness(const Node *node, CodeMarker *marker)
text << ", and ";
}
if (!nonreentrant.isEmpty()) {
- appendFullNames(text,nonreentrant,innerNode,marker);
+ appendFullNames(text,nonreentrant,innerNode);
text << ", which";
singularPlural(text,nonreentrant);
text << " nonreentrant.";
@@ -1422,12 +1308,11 @@ void Generator::generateThreadSafeness(const Node *node, CodeMarker *marker)
}
/*!
- This function is recursive.
+ Traverses the database recursivly to generate all the documentation.
*/
-void Generator::generateTree(Tree *tree)
+void Generator::generateTree()
{
- tree_ = tree;
- generateInnerNode(tree->root());
+ generateInnerNode(qdb_->treeRoot());
}
Generator *Generator::generatorForFormat(const QString& format)
@@ -1458,7 +1343,7 @@ QString Generator::getCollisionLink(const Atom* atom)
if (!atom->string().contains("::"))
return link;
QStringList path = atom->string().split("::");
- NameCollisionNode* ncn = tree_->findCollisionNode(path[0]);
+ NameCollisionNode* ncn = qdb_->findCollisionNode(path[0]);
if (ncn) {
QString label;
if (atom->next() && atom->next()->next()) {
@@ -1914,9 +1799,19 @@ int Generator::skipAtoms(const Atom *atom, Atom::Type type) const
return skipAhead;
}
-void Generator::startText(const Node * /* relative */,
- CodeMarker * /* marker */)
-{
+/*!
+ Resets the variables used during text output.
+ */
+void Generator::initializeTextOutput()
+{
+ inLink_ = false;
+ inContents_ = false;
+ inSectionHeading_ = false;
+ inTableHeader_ = false;
+ numTableRows_ = 0;
+ threeColumnEnumValueTable_ = true;
+ link_.clear();
+ sectionNumber_.clear();
}
void Generator::supplementAlsoList(const Node *node, QList &alsoList)
diff --git a/src/tools/qdoc/generator.h b/src/tools/qdoc/generator.h
index 3694c9c78d..11e842a7c7 100644
--- a/src/tools/qdoc/generator.h
+++ b/src/tools/qdoc/generator.h
@@ -39,10 +39,6 @@
**
****************************************************************************/
-/*
- generator.h
-*/
-
#ifndef GENERATOR_H
#define GENERATOR_H
@@ -60,22 +56,14 @@
QT_BEGIN_NAMESPACE
-typedef QMap NewClassMaps;
-typedef QMap NewSinceMaps;
typedef QMap NodeMap;
typedef QMultiMap NodeMultiMap;
typedef QMap ParentMaps;
-class ClassNode;
class Config;
class CodeMarker;
-class DocNode;
-class FunctionNode;
-class InnerNode;
class Location;
-class NamespaceNode;
-class Node;
-class Tree;
+class QDocDatabase;
class Generator
{
@@ -85,7 +73,7 @@ public:
virtual bool canHandleFormat(const QString &format) { return format == this->format(); }
virtual QString format() = 0;
- virtual void generateTree(Tree *tree);
+ virtual void generateTree();
virtual void initializeGenerator(const Config &config);
virtual void terminateGenerator();
@@ -102,12 +90,8 @@ public:
protected:
virtual void beginSubPage(const InnerNode* node, const QString& fileName);
virtual void endSubPage();
- virtual void endText(const Node *relative, CodeMarker *marker);
virtual QString fileBase(const Node* node) const;
virtual QString fileExtension() const = 0;
- virtual QString fullName(const Node *node,
- const Node *relative,
- CodeMarker *marker) const;
virtual void generateAlsoList(const Node *node, CodeMarker *marker);
virtual int generateAtom(const Atom *atom,
const Node *relative,
@@ -131,8 +115,7 @@ protected:
const Node *relative,
CodeMarker *marker);
virtual QString imageFileName(const Node *relative, const QString& fileBase);
- virtual int skipAtoms(const Atom *atom, Atom::Type type) const;
- virtual void startText(const Node *relative, CodeMarker *marker);
+ virtual int skipAtoms(const Atom *atom, Atom::Type type) const;
virtual QString typeString(const Node *node);
static bool matchAhead(const Atom *atom, Atom::Type expectedAtomType);
@@ -142,8 +125,8 @@ protected:
static QString trimmedTrailing(const QString &string);
static QString sinceTitles[];
+ void initializeTextOutput();
QString fileName(const Node* node) const;
- void findAllSince(const InnerNode *node);
QMap &formattingLeftMap();
QMap &formattingRightMap();
const Atom* generateAtomList(const Atom *atom,
@@ -175,10 +158,7 @@ protected:
QString plainCode(const QString& markedCode);
void setImageFileExtensions(const QStringList& extensions);
void unknownAtom(const Atom *atom);
- void appendSortedQmlNames(Text& text,
- const Node* base,
- const NodeList& subs,
- CodeMarker *marker);
+ void appendSortedQmlNames(Text& text, const Node* base, const NodeList& subs);
QList collisionNodes;
QMap editionGroupMap;
@@ -187,9 +167,6 @@ protected:
QTextCodec* outputCodec;
QString outputEncoding;
QStack outStreamStack;
- NewClassMaps newClassMaps;
- NewClassMaps newQmlClassMaps;
- NewSinceMaps newSinceMaps;
private:
static QString baseDir_;
@@ -214,22 +191,14 @@ private:
void appendFullName(Text& text,
const Node *apparentNode,
const Node *relative,
- CodeMarker *marker,
const Node *actualNode = 0);
void appendFullName(Text& text,
const Node *apparentNode,
const QString& fullName,
const Node *actualNode);
- void appendFullNames(Text& text,
- const NodeList& nodes,
- const Node* relative,
- CodeMarker* marker);
- void appendSortedNames(Text& text,
- const ClassNode *classe,
- const QList &classes,
- CodeMarker *marker);
- void generateReimplementedFrom(const FunctionNode *func,
- CodeMarker *marker);
+ void appendFullNames(Text& text, const NodeList& nodes, const Node* relative);
+ void appendSortedNames(Text& text, const ClassNode *classe, const QList &classes);
+ void generateReimplementedFrom(const FunctionNode *func, CodeMarker *marker);
QString amp;
QString gt;
@@ -238,7 +207,15 @@ private:
QRegExp tag;
protected:
- Tree* tree_;
+ QDocDatabase* qdb_;
+ bool inLink_;
+ bool inContents_;
+ bool inSectionHeading_;
+ bool inTableHeader_;
+ bool threeColumnEnumValueTable_;
+ int numTableRows_;
+ QString link_;
+ QString sectionNumber_;
};
QT_END_NAMESPACE
diff --git a/src/tools/qdoc/helpprojectwriter.cpp b/src/tools/qdoc/helpprojectwriter.cpp
index 98ebcd81c2..0a61bd62e4 100644
--- a/src/tools/qdoc/helpprojectwriter.cpp
+++ b/src/tools/qdoc/helpprojectwriter.cpp
@@ -49,7 +49,8 @@
#include "htmlgenerator.h"
#include "config.h"
#include "node.h"
-#include "tree.h"
+#include "qdocdatabase.h"
+#include
QT_BEGIN_NAMESPACE
@@ -58,6 +59,13 @@ HelpProjectWriter::HelpProjectWriter(const Config &config,
Generator* g)
: gen_(g)
{
+ /*
+ Get the pointer to the singleton for the qdoc database and
+ store it locally. This replaces all the local accesses to
+ the node tree, which are now private.
+ */
+ qdb_ = QDocDatabase::qdocDB();
+
// The output directory should already have been checked by the calling
// generator.
outputDir = config.getOutputDir();
@@ -455,9 +463,8 @@ void HelpProjectWriter::generateSections(HelpProject &project,
}
}
-void HelpProjectWriter::generate(const Tree *t)
+void HelpProjectWriter::generate()
{
- this->tree = t;
for (int i = 0; i < projects.size(); ++i)
generateProject(projects[i]);
}
@@ -581,9 +588,9 @@ void HelpProjectWriter::generateProject(HelpProject &project)
{
const Node *rootNode;
if (!project.indexRoot.isEmpty())
- rootNode = tree->findDocNodeByTitle(project.indexRoot);
+ rootNode = qdb_->findDocNodeByTitle(project.indexRoot);
else
- rootNode = tree->root();
+ rootNode = qdb_->treeRoot();
if (!rootNode)
return;
@@ -624,9 +631,9 @@ void HelpProjectWriter::generateProject(HelpProject &project)
writer.writeStartElement("toc");
writer.writeStartElement("section");
- const Node* node = tree->findDocNodeByTitle(project.indexTitle);
+ const Node* node = qdb_->findDocNodeByTitle(project.indexTitle);
if (node == 0)
- node = tree->findNode(QStringList("index.html"));
+ node = qdb_->findNode(QStringList("index.html"));
QString indexPath;
if (node)
indexPath = gen_->fullDocumentLocation(node,true);
@@ -643,7 +650,7 @@ void HelpProjectWriter::generateProject(HelpProject &project)
if (subproject.type == QLatin1String("manual")) {
- const DocNode *indexPage = tree->findDocNodeByTitle(subproject.indexTitle);
+ const DocNode *indexPage = qdb_->findDocNodeByTitle(subproject.indexTitle);
if (indexPage) {
Text indexBody = indexPage->doc().body();
const Atom *atom = indexBody.firstAtom();
@@ -670,7 +677,7 @@ void HelpProjectWriter::generateProject(HelpProject &project)
if (sectionStack.top() > 0)
writer.writeEndElement(); // section
- const DocNode *page = tree->findDocNodeByTitle(atom->string());
+ const DocNode *page = qdb_->findDocNodeByTitle(atom->string());
writer.writeStartElement("section");
QString indexPath = gen_->fullDocumentLocation(page,true);
writer.writeAttribute("ref", indexPath);
@@ -697,7 +704,7 @@ void HelpProjectWriter::generateProject(HelpProject &project)
if (!name.isEmpty()) {
writer.writeStartElement("section");
- QString indexPath = gen_->fullDocumentLocation(tree->findDocNodeByTitle(subproject.indexTitle),true);
+ QString indexPath = gen_->fullDocumentLocation(qdb_->findDocNodeByTitle(subproject.indexTitle),true);
writer.writeAttribute("ref", indexPath);
writer.writeAttribute("title", subproject.title);
project.files.insert(indexPath);
@@ -717,7 +724,7 @@ void HelpProjectWriter::generateProject(HelpProject &project)
if (!nextTitle.isEmpty() &&
node->links().value(Node::ContentsLink).first.isEmpty()) {
- DocNode *nextPage = const_cast(tree->findDocNodeByTitle(nextTitle));
+ DocNode *nextPage = const_cast(qdb_->findDocNodeByTitle(nextTitle));
// Write the contents node.
writeNode(project, writer, node);
@@ -727,7 +734,7 @@ void HelpProjectWriter::generateProject(HelpProject &project)
nextTitle = nextPage->links().value(Node::NextLink).first;
if (nextTitle.isEmpty() || visited.contains(nextTitle))
break;
- nextPage = const_cast(tree->findDocNodeByTitle(nextTitle));
+ nextPage = const_cast(qdb_->findDocNodeByTitle(nextTitle));
visited.insert(nextTitle);
}
break;
diff --git a/src/tools/qdoc/helpprojectwriter.h b/src/tools/qdoc/helpprojectwriter.h
index a628dbc016..c6c3871b2d 100644
--- a/src/tools/qdoc/helpprojectwriter.h
+++ b/src/tools/qdoc/helpprojectwriter.h
@@ -51,7 +51,7 @@
QT_BEGIN_NAMESPACE
-class Tree;
+class QDocDatabase;
class Generator;
typedef QPair QStringNodePair;
@@ -92,7 +92,7 @@ public:
Generator* g);
void addExtraFile(const QString &file);
void addExtraFiles(const QSet &files);
- void generate(const Tree *t);
+ void generate();
private:
void generateProject(HelpProject &project);
@@ -105,7 +105,7 @@ private:
void writeNode(HelpProject &project, QXmlStreamWriter &writer, const Node *node);
void readSelectors(SubProject &subproject, const QStringList &selectors);
- const Tree *tree;
+ QDocDatabase* qdb_;
Generator* gen_;
QString outputDir;
diff --git a/src/tools/qdoc/htmlgenerator.cpp b/src/tools/qdoc/htmlgenerator.cpp
index bd4dc79f05..558b0c6248 100644
--- a/src/tools/qdoc/htmlgenerator.cpp
+++ b/src/tools/qdoc/htmlgenerator.cpp
@@ -48,6 +48,7 @@
#include "helpprojectwriter.h"
#include "htmlgenerator.h"
#include "node.h"
+#include "qdocdatabase.h"
#include "separator.h"
#include "tree.h"
#include
@@ -89,23 +90,20 @@ static void addLink(const QString &linkTarget,
}
}
-
+/*!
+ Constructs the HTML output generator.
+ */
HtmlGenerator::HtmlGenerator()
: helpProjectWriter(0),
- inLink(false),
inObsoleteLink(false),
- inContents(false),
- inSectionHeading(false),
- inTableHeader(false),
- numTableRows(0),
- threeColumnEnumValueTable(true),
funcLeftParen("\\S(\\()"),
obsoleteLinks(false)
{
}
/*!
- The destructor deletes the instance of HelpProjectWriter.
+ Destroys the HTML output generator. Deletes the singleton
+ instance of HelpProjectWriter.
*/
HtmlGenerator::~HtmlGenerator()
{
@@ -113,6 +111,10 @@ HtmlGenerator::~HtmlGenerator()
delete helpProjectWriter;
}
+/*!
+ Initializes the HTML output generator's data structures
+ from the configuration class \a config.
+ */
void HtmlGenerator::initializeGenerator(const Config &config)
{
static const struct {
@@ -209,16 +211,11 @@ void HtmlGenerator::initializeGenerator(const Config &config)
codeIndent = config.getInt(CONFIG_CODEINDENT);
- helpProjectWriter = new HelpProjectWriter(config,
- project.toLower() + ".qhp",
- this);
+ helpProjectWriter = new HelpProjectWriter(config, project.toLower() + ".qhp", this);
// Documentation template handling
- headerScripts = config.getString(HtmlGenerator::format() + Config::dot +
- CONFIG_HEADERSCRIPTS);
- headerStyles = config.getString(HtmlGenerator::format() +
- Config::dot +
- CONFIG_HEADERSTYLES);
+ headerScripts = config.getString(HtmlGenerator::format() + Config::dot + CONFIG_HEADERSCRIPTS);
+ headerStyles = config.getString(HtmlGenerator::format() + Config::dot + CONFIG_HEADERSTYLES);
QString prefix = CONFIG_QHP + Config::dot + "Qt" + Config::dot;
manifestDir = "qthelp://" + config.getString(prefix + "namespace");
@@ -239,6 +236,9 @@ void HtmlGenerator::initializeGenerator(const Config &config)
}
}
+/*!
+ Gracefully terminates the HTML output generator.
+ */
void HtmlGenerator::terminateGenerator()
{
Generator::terminateGenerator();
@@ -250,60 +250,25 @@ QString HtmlGenerator::format()
}
/*!
- This is where the HTML files are written.
- \note The HTML file generation is done in the base class,
- PageGenerator::generateTree().
+ Traverses the database generating all the HTML documentation.
*/
-void HtmlGenerator::generateTree(Tree *tree)
+void HtmlGenerator::generateTree()
{
- tree_ = tree;
- nonCompatClasses.clear();
- mainClasses.clear();
- compatClasses.clear();
- obsoleteClasses.clear();
- moduleClassMap.clear();
- moduleNamespaceMap.clear();
- funcIndex.clear();
- legaleseTexts.clear();
- serviceClasses.clear();
- qmlClasses.clear();
-
- findAllClasses(tree->root());
- findAllFunctions(tree->root());
- findAllLegaleseTexts(tree->root());
- findAllNamespaces(tree->root());
- findAllSince(tree->root());
-
- Generator::generateTree(tree);
- //reportOrphans(tree->root());
+ qdb_->buildCollections();
+ Generator::generateTree();
generateCollisionPages();
QString fileBase = project.toLower().simplified().replace(QLatin1Char(' '), QLatin1Char('-'));
generateIndex(fileBase, projectUrl, projectDescription);
- helpProjectWriter->generate(tree_);
+ helpProjectWriter->generate();
generateManifestFiles();
}
-void HtmlGenerator::startText(const Node * /* relative */,
- CodeMarker * /* marker */)
-{
- inLink = false;
- inContents = false;
- inSectionHeading = false;
- inTableHeader = false;
- numTableRows = 0;
- threeColumnEnumValueTable = true;
- link.clear();
- sectionNumber.clear();
-}
-
/*!
Generate html from an instance of Atom.
*/
-int HtmlGenerator::generateAtom(const Atom *atom,
- const Node *relative,
- CodeMarker *marker)
+int HtmlGenerator::generateAtom(const Atom *atom, const Node *relative, CodeMarker *marker)
{
int skipAhead = 0;
static bool in_para = false;
@@ -318,12 +283,12 @@ int HtmlGenerator::generateAtom(const Atom *atom,
case Atom::AbstractRight:
break;
case Atom::AutoLink:
- if (!inLink && !inContents && !inSectionHeading) {
+ if (!inLink_ && !inContents_ && !inSectionHeading_) {
const Node *node = 0;
- QString link = getLink(atom, relative, marker, &node);
+ QString link = getLink(atom, relative, &node);
if (!link.isEmpty()) {
- beginLink(link, node, relative, marker);
- generateLink(atom, relative, marker);
+ beginLink(link, node, relative);
+ generateLink(atom, marker);
endLink();
}
else {
@@ -383,7 +348,7 @@ int HtmlGenerator::generateAtom(const Atom *atom,
// now widely used to write teletype text. As a result, text marked
// with the \c command is not passed to a code marker.
out() << formattingLeftMap()[ATOM_FORMATTING_TELETYPE];
- if (inLink) {
+ if (inLink_) {
out() << protectEnc(plainCode(atom->string()));
}
else {
@@ -404,27 +369,23 @@ int HtmlGenerator::generateAtom(const Atom *atom,
break;
case Atom::Code:
out() << ""
- << trimmedTrailing(highlightedCode(indent(codeIndent,atom->string()),
- marker,relative))
+ << trimmedTrailing(highlightedCode(indent(codeIndent,atom->string()),relative))
<< "
\n";
break;
case Atom::Qml:
out() << ""
- << trimmedTrailing(highlightedCode(indent(codeIndent,atom->string()),
- marker,relative))
+ << trimmedTrailing(highlightedCode(indent(codeIndent,atom->string()),relative))
<< "
\n";
break;
case Atom::JavaScript:
out() << ""
- << trimmedTrailing(highlightedCode(indent(codeIndent,atom->string()),
- marker,relative))
+ << trimmedTrailing(highlightedCode(indent(codeIndent,atom->string()),relative))
<< "
\n";
break;
case Atom::CodeNew:
out() << "you can rewrite it as
\n"
<< ""
- << trimmedTrailing(highlightedCode(indent(codeIndent,atom->string()),
- marker,relative))
+ << trimmedTrailing(highlightedCode(indent(codeIndent,atom->string()),relative))
<< "
\n";
break;
case Atom::CodeOld:
@@ -489,54 +450,57 @@ int HtmlGenerator::generateAtom(const Atom *atom,
}
break;
case Atom::AnnotatedList:
- {
- QList values = tree_->groups().values(atom->string());
- NodeMap nodeMap;
- for (int i = 0; i < values.size(); ++i) {
- const Node* n = values.at(i);
- if ((n->status() != Node::Internal) && (n->access() != Node::Private)) {
- nodeMap.insert(n->nameForLists(),n);
- }
+ {
+ NodeMap nodeMap;
+ qdb_->getGroup(atom->string(), nodeMap);
+ generateAnnotatedList(relative, marker, nodeMap);
}
- generateAnnotatedList(relative, marker, nodeMap);
- }
break;
case Atom::GeneratedList:
if (atom->string() == "annotatedclasses") {
- generateAnnotatedList(relative, marker, nonCompatClasses);
+ generateAnnotatedList(relative, marker, qdb_->getCppClasses());
}
else if (atom->string() == "classes") {
- generateCompactList(relative, marker, nonCompatClasses, true);
+ generateCompactList(relative, qdb_->getCppClasses(), true);
}
else if (atom->string() == "qmlclasses") {
- generateCompactList(relative, marker, qmlClasses, true);
+ generateCompactList(relative, qdb_->getQmlTypes(), true);
}
else if (atom->string().contains("classesbymodule")) {
QString arg = atom->string().trimmed();
- QString moduleName = atom->string().mid(atom->string().indexOf(
- "classesbymodule") + 15).trimmed();
- if (moduleClassMap.contains(moduleName))
- generateAnnotatedList(relative, marker, moduleClassMap[moduleName]);
+ QString moduleName = atom->string().mid(atom->string().indexOf("classesbymodule") + 15).trimmed();
+ QDocDatabase* qdb = QDocDatabase::qdocDB();
+ DocNode* dn = qdb->findModule(moduleName);
+ if (dn) {
+ NodeMap m;
+ dn->getMemberClasses(m);
+ if (!m.isEmpty()) {
+ generateAnnotatedList(relative, marker, m);
+ }
+ }
}
else if (atom->string().contains("classesbyedition")) {
-
QString arg = atom->string().trimmed();
- QString editionName = atom->string().mid(atom->string().indexOf(
- "classesbyedition") + 16).trimmed();
-
+ QString editionName = atom->string().mid(atom->string().indexOf("classesbyedition") + 16).trimmed();
if (editionModuleMap.contains(editionName)) {
-
+ QDocDatabase* qdb = QDocDatabase::qdocDB();
// Add all classes in the modules listed for that edition.
NodeMap editionClasses;
- foreach (const QString &moduleName, editionModuleMap[editionName]) {
- if (moduleClassMap.contains(moduleName))
- editionClasses.unite(moduleClassMap[moduleName]);
+ DocNodeMap::const_iterator i = qdb->modules().begin();
+ while (i != qdb->modules().end()) {
+ NodeMap m;
+ DocNode* dn = i.value();
+ dn->getMemberClasses(m);
+ if (!m.isEmpty())
+ editionClasses.unite(m);
+ m.clear();
+ ++i;
}
// Add additional groups and remove groups of classes that
// should be excluded from the edition.
- QMultiMap groups = tree_->groups();
+ const NodeMultiMap& groups = qdb_->groups();
foreach (const QString &groupName, editionGroupMap[editionName]) {
QList groupClasses;
if (groupName.startsWith(QLatin1Char('-'))) {
@@ -554,51 +518,51 @@ int HtmlGenerator::generateAtom(const Atom *atom,
}
}
else if (atom->string() == "classhierarchy") {
- generateClassHierarchy(relative, marker, nonCompatClasses);
+ generateClassHierarchy(relative, qdb_->getCppClasses());
}
else if (atom->string() == "compatclasses") {
- generateCompactList(relative, marker, compatClasses, false);
+ generateCompactList(relative, qdb_->getCompatibilityClasses(), false);
}
else if (atom->string() == "obsoleteclasses") {
- generateCompactList(relative, marker, obsoleteClasses, false);
+ generateCompactList(relative, qdb_->getObsoleteClasses(), false);
}
else if (atom->string() == "functionindex") {
- generateFunctionIndex(relative, marker);
+ generateFunctionIndex(relative);
}
else if (atom->string() == "legalese") {
generateLegaleseList(relative, marker);
}
else if (atom->string() == "mainclasses") {
- generateCompactList(relative, marker, mainClasses, true);
+ generateCompactList(relative, qdb_->getMainClasses(), true);
}
else if (atom->string() == "services") {
- generateCompactList(relative, marker, serviceClasses, false);
+ generateCompactList(relative, qdb_->getServiceClasses(), false);
}
else if (atom->string() == "overviews") {
- generateOverviewList(relative, marker);
+ generateOverviewList(relative);
}
else if (atom->string() == "namespaces") {
- generateAnnotatedList(relative, marker, namespaceIndex);
+ generateAnnotatedList(relative, marker, qdb_->getNamespaces());
}
else if (atom->string() == "related") {
const DocNode *dn = static_cast(relative);
- if (dn && !dn->groupMembers().isEmpty()) {
+ if (dn && !dn->members().isEmpty()) {
NodeMap groupMembersMap;
- foreach (const Node *node, dn->groupMembers()) {
+ foreach (const Node *node, dn->members()) {
if (node->type() == Node::Document)
- groupMembersMap[fullName(node, relative, marker)] = node;
+ groupMembersMap[node->fullName(relative)] = node;
}
generateAnnotatedList(dn, marker, groupMembersMap);
}
}
else if (atom->string() == "relatedinline") {
const DocNode *dn = static_cast(relative);
- if (dn && !dn->groupMembers().isEmpty()) {
+ if (dn && !dn->members().isEmpty()) {
// Reverse the list into the original scan order.
// Should be sorted. But on what? It may not be a
// regular class or page definition.
QList list;
- foreach (const Node *node, dn->groupMembers())
+ foreach (const Node *node, dn->members())
list.prepend(node);
foreach (const Node *node, list)
generateBody(node, marker);
@@ -607,24 +571,19 @@ int HtmlGenerator::generateAtom(const Atom *atom,
break;
case Atom::SinceList:
{
- NewSinceMaps::const_iterator nsmap;
- nsmap = newSinceMaps.constFind(atom->string());
- NewClassMaps::const_iterator ncmap;
- ncmap = newClassMaps.constFind(atom->string());
- NewClassMaps::const_iterator nqcmap;
- nqcmap = newQmlClassMaps.constFind(atom->string());
-
- if ((nsmap != newSinceMaps.constEnd()) && !nsmap.value().isEmpty()) {
+ const NodeMultiMap& nsmap = qdb_->getSinceMap(atom->string());
+ const NodeMap& ncmap = qdb_->getClassMap(atom->string());
+ const NodeMap& nqcmap = qdb_->getQmlTypeMap(atom->string());
+
+ if (!nsmap.isEmpty()) {
QList sections;
QList::ConstIterator s;
for (int i=0; itype()) {
case Node::Document:
@@ -691,9 +650,6 @@ int HtmlGenerator::generateAtom(const Atom *atom,
++n;
}
- /*
- First generate the table of contents.
- */
out() << "\n";
s = sections.constBegin();
while (s != sections.constEnd()) {
@@ -719,9 +675,9 @@ int HtmlGenerator::generateAtom(const Atom *atom,
<< "\">\n";
out() << "" << protectEnc((*s).name) << "
\n";
if (idx == Class)
- generateCompactList(0, marker, ncmap.value(), false, QString("Q"));
+ generateCompactList(0, ncmap, false, QString("Q"));
else if (idx == QmlClass)
- generateCompactList(0, marker, nqcmap.value(), false, QString("Q"));
+ generateCompactList(0, nqcmap, false, QString("Q"));
else if (idx == MemberFunction) {
ParentMaps parentmaps;
ParentMaps::iterator pmap;
@@ -742,7 +698,7 @@ int HtmlGenerator::generateAtom(const Atom *atom,
out() << "";
- QStringList pieces = fullName(pmap.key(), 0, marker).split("::");
+ QStringList pieces = pmap.key()->fullName().split("::");
out() << protectEnc(pieces.last());
out() << "" << ":\n";
@@ -836,7 +792,7 @@ int HtmlGenerator::generateAtom(const Atom *atom,
case Atom::Link:
{
const Node *node = 0;
- QString myLink = getLink(atom, relative, marker, &node);
+ QString myLink = getLink(atom, relative, &node);
if (myLink.isEmpty()) {
myLink = getCollisionLink(atom);
if (myLink.isEmpty()) {
@@ -846,14 +802,14 @@ int HtmlGenerator::generateAtom(const Atom *atom,
else
node = 0;
}
- beginLink(myLink, node, relative, marker);
+ beginLink(myLink, node, relative);
skipAhead = 1;
}
break;
case Atom::LinkNode:
{
const Node *node = CodeMarker::nodeForString(atom->string());
- beginLink(linkForNode(node, relative), node, relative, marker);
+ beginLink(linkForNode(node, relative), node, relative);
skipAhead = 1;
}
break;
@@ -869,10 +825,10 @@ int HtmlGenerator::generateAtom(const Atom *atom,
out() << "\n";
}
else if (atom->string() == ATOM_LIST_VALUE) {
- threeColumnEnumValueTable = isThreeColumnEnumValueTable(atom);
- if (threeColumnEnumValueTable) {
+ threeColumnEnumValueTable_ = isThreeColumnEnumValueTable(atom);
+ if (threeColumnEnumValueTable_) {
out() << "";
- if (++numTableRows % 2 == 1)
+ if (++numTableRows_ % 2 == 1)
out() << "";
else
out() << "
";
@@ -943,7 +899,7 @@ int HtmlGenerator::generateAtom(const Atom *atom,
out() << "- ";
}
else if (atom->string() == ATOM_LIST_VALUE) {
- if (threeColumnEnumValueTable) {
+ if (threeColumnEnumValueTable_) {
out() << "
";
if (matchAhead(atom, Atom::ListItemRight))
out() << " ";
@@ -1012,19 +968,19 @@ int HtmlGenerator::generateAtom(const Atom *atom,
break;
case Atom::SectionHeadingLeft:
out() << "string().toInt() + hOffset(relative)) + QLatin1Char('>');
- inSectionHeading = true;
+ inSectionHeading_ = true;
break;
case Atom::SectionHeadingRight:
out() << "string().toInt() + hOffset(relative)) + ">\n";
- inSectionHeading = false;
+ inSectionHeading_ = false;
break;
case Atom::SidebarLeft:
break;
case Atom::SidebarRight:
break;
case Atom::String:
- if (inLink && !inContents && !inSectionHeading) {
- generateLink(atom, relative, marker);
+ if (inLink_ && !inContents_ && !inSectionHeading_) {
+ generateLink(atom, marker);
}
else {
out() << protectEnc(atom->string());
@@ -1060,7 +1016,7 @@ int HtmlGenerator::generateAtom(const Atom *atom,
if (!width.isEmpty())
out() << " width=\"" << width << "\"";
out() << ">\n ";
- numTableRows = 0;
+ numTableRows_ = 0;
}
break;
case Atom::TableRight:
@@ -1068,7 +1024,7 @@ int HtmlGenerator::generateAtom(const Atom *atom,
break;
case Atom::TableHeaderLeft:
out() << "";
- inTableHeader = true;
+ inTableHeader_ = true;
break;
case Atom::TableHeaderRight:
out() << " ";
@@ -1078,13 +1034,13 @@ int HtmlGenerator::generateAtom(const Atom *atom,
}
else {
out() << "\n";
- inTableHeader = false;
+ inTableHeader_ = false;
}
break;
case Atom::TableRowLeft:
if (!atom->string().isEmpty())
out() << " | string() << '>';
- else if (++numTableRows % 2 == 1)
+ else if (++numTableRows_ % 2 == 1)
out() << "
";
else
out() << "
";
@@ -1094,7 +1050,7 @@ int HtmlGenerator::generateAtom(const Atom *atom,
break;
case Atom::TableItemLeft:
{
- if (inTableHeader)
+ if (inTableHeader_)
out() << "';
else {
out() << '>';
@@ -1127,7 +1083,7 @@ int HtmlGenerator::generateAtom(const Atom *atom,
}
break;
case Atom::TableItemRight:
- if (inTableHeader)
+ if (inTableHeader_)
out() << " | ";
else {
out() << "";
@@ -1172,21 +1128,20 @@ void HtmlGenerator::generateClassLikeNode(InnerNode* inner, CodeMarker* marker)
QString rawTitle;
QString fullTitle;
if (inner->type() == Node::Namespace) {
- rawTitle = marker->plainName(inner);
- fullTitle = marker->plainFullName(inner);
+ rawTitle = inner->plainName();
+ fullTitle = inner->plainFullName();
title = rawTitle + " Namespace";
}
else if (inner->type() == Node::Class) {
classe = static_cast(inner);
- rawTitle = marker->plainName(inner);
- fullTitle = marker->plainFullName(inner);
+ rawTitle = inner->plainName();
+ fullTitle = inner->plainFullName();
title = rawTitle + " Class";
}
Text subtitleText;
if (rawTitle != fullTitle)
- subtitleText << "(" << Atom(Atom::AutoLink, fullTitle) << ")"
- << Atom(Atom::LineBreak);
+ subtitleText << "(" << Atom(Atom::AutoLink, fullTitle) << ")" << Atom(Atom::LineBreak);
generateHeader(title, inner, marker);
sections = marker->sections(inner, CodeMarker::Summary, CodeMarker::Okay);
@@ -1259,7 +1214,7 @@ void HtmlGenerator::generateClassLikeNode(InnerNode* inner, CodeMarker* marker)
if (!s->inherited.isEmpty()) {
out() << "\n";
- generateSectionInheritedList(*s, inner, marker);
+ generateSectionInheritedList(*s, inner);
out() << "
\n";
}
}
@@ -1273,7 +1228,7 @@ void HtmlGenerator::generateClassLikeNode(InnerNode* inner, CodeMarker* marker)
s = sections.constBegin();
while (s != sections.constEnd()) {
if (s->members.isEmpty() && !s->inherited.isEmpty())
- generateSectionInheritedList(*s, inner, marker);
+ generateSectionInheritedList(*s, inner);
++s;
}
out() << "\n";
@@ -1308,7 +1263,7 @@ void HtmlGenerator::generateClassLikeNode(InnerNode* inner, CodeMarker* marker)
generateDetailedMember(*m, inner, marker);
else {
out() << " class ";
- generateFullName(*m, inner, marker);
+ generateFullName(*m, inner);
out() << "
";
generateBrief(*m, marker, inner);
}
@@ -1532,16 +1487,21 @@ void HtmlGenerator::generateDocNode(DocNode* dn, CodeMarker* marker)
generateStatus(dn, marker);
generateSince(dn, marker);
- if (moduleNamespaceMap.contains(dn->name())) {
+ NodeMap nm;
+ dn->getMemberNamespaces(nm);
+ if (!nm.isEmpty()) {
out() << "" << divNavTop << '\n';
out() << "Namespaces
\n";
- generateAnnotatedList(dn, marker, moduleNamespaceMap[dn->name()]);
+ generateAnnotatedList(dn, marker, nm);
}
- if (moduleClassMap.contains(dn->name())) {
+ nm.clear();
+ dn->getMemberClasses(nm);
+ if (!nm.isEmpty()) {
out() << "" << divNavTop << '\n';
out() << "Classes
\n";
- generateAnnotatedList(dn, marker, moduleClassMap[dn->name()]);
+ generateAnnotatedList(dn, marker, nm);
}
+ nm.clear();
}
else if (dn->subType() == Node::HeaderFile) {
// Generate brief text and status for modules.
@@ -1651,17 +1611,17 @@ void HtmlGenerator::generateDocNode(DocNode* dn, CodeMarker* marker)
generateAlsoList(dn, marker);
generateExtractionMark(dn, EndMark);
- if ((dn->subType() == Node::Group) && !dn->groupMembers().isEmpty()) {
+ if ((dn->subType() == Node::Group) && !dn->members().isEmpty()) {
NodeMap groupMembersMap;
- foreach (const Node *node, dn->groupMembers()) {
+ foreach (const Node *node, dn->members()) {
if (node->type() == Node::Class || node->type() == Node::Namespace)
groupMembersMap[node->name()] = node;
}
generateAnnotatedList(dn, marker, groupMembersMap);
}
- else if ((dn->subType() == Node::QmlModule) && !dn->qmlModuleMembers().isEmpty()) {
+ else if ((dn->subType() == Node::QmlModule) && !dn->members().isEmpty()) {
NodeMap qmlModuleMembersMap;
- foreach (const Node* node, dn->qmlModuleMembers()) {
+ foreach (const Node* node, dn->members()) {
if (node->type() == Node::Document && node->subType() == Node::QmlClass)
qmlModuleMembersMap[node->name()] = node;
}
@@ -1830,7 +1790,7 @@ void HtmlGenerator::generateHeader(const QString& title,
if (node && !node->doc().location().isEmpty())
out() << "\n";
- QString shortVersion = tree_->version();
+ QString shortVersion = qdb_->version();
if (shortVersion.count(QChar('.')) == 2)
shortVersion.truncate(shortVersion.lastIndexOf(QChar('.')));
if (!project.isEmpty())
@@ -1854,9 +1814,9 @@ void HtmlGenerator::generateHeader(const QString& title,
generateMacRef(node, marker);
#endif
- out() << QString(postHeader).replace("\\" + COMMAND_VERSION, tree_->version());
+ out() << QString(postHeader).replace("\\" + COMMAND_VERSION, qdb_->version());
generateBreadCrumbs(title,node,marker);
- out() << QString(postPostHeader).replace("\\" + COMMAND_VERSION, tree_->version());
+ out() << QString(postPostHeader).replace("\\" + COMMAND_VERSION, qdb_->version());
navigationLinks.clear();
@@ -1867,7 +1827,9 @@ void HtmlGenerator::generateHeader(const QString& title,
if (node->links().contains(Node::PreviousLink)) {
linkPair = node->links()[Node::PreviousLink];
- linkNode = findNodeForTarget(linkPair.first, node, marker);
+ linkNode = qdb_->findNodeForTarget(linkPair.first, node);
+ if (!linkNode)
+ node->doc().location().warning(tr("Cannot link to '%1'").arg(linkPair.first));
if (!linkNode || linkNode == node)
anchorPair = linkPair;
else
@@ -1885,7 +1847,9 @@ void HtmlGenerator::generateHeader(const QString& title,
}
if (node->links().contains(Node::NextLink)) {
linkPair = node->links()[Node::NextLink];
- linkNode = findNodeForTarget(linkPair.first, node, marker);
+ linkNode = qdb_->findNodeForTarget(linkPair.first, node);
+ if (!linkNode)
+ node->doc().location().warning(tr("Cannot link to '%1'").arg(linkPair.first));
if (!linkNode || linkNode == node)
anchorPair = linkPair;
else
@@ -1903,7 +1867,9 @@ void HtmlGenerator::generateHeader(const QString& title,
}
if (node->links().contains(Node::StartLink)) {
linkPair = node->links()[Node::StartLink];
- linkNode = findNodeForTarget(linkPair.first, node, marker);
+ linkNode = qdb_->findNodeForTarget(linkPair.first, node);
+ if (!linkNode)
+ node->doc().location().warning(tr("Cannot link to '%1'").arg(linkPair.first));
if (!linkNode || linkNode == node)
anchorPair = linkPair;
else
@@ -1941,8 +1907,8 @@ void HtmlGenerator::generateFooter(const Node *node)
if (node && !node->links().empty())
out() << "\n" << navigationLinks << "
\n";
- out() << QString(footer).replace("\\" + COMMAND_VERSION, tree_->version())
- << QString(address).replace("\\" + COMMAND_VERSION, tree_->version());
+ out() << QString(footer).replace("\\" + COMMAND_VERSION, qdb_->version())
+ << QString(address).replace("\\" + COMMAND_VERSION, qdb_->version());
out() << "