diff options
Diffstat (limited to 'src/tools/qdoc/qdocindexfiles.cpp')
-rw-r--r-- | src/tools/qdoc/qdocindexfiles.cpp | 319 |
1 files changed, 230 insertions, 89 deletions
diff --git a/src/tools/qdoc/qdocindexfiles.cpp b/src/tools/qdoc/qdocindexfiles.cpp index efc0eb1e0f..026c64b587 100644 --- a/src/tools/qdoc/qdocindexfiles.cpp +++ b/src/tools/qdoc/qdocindexfiles.cpp @@ -229,6 +229,29 @@ void QDocIndexFiles::readIndexSection(const QDomElement& element, location = Location(name); node = qcn; } + else if (element.nodeName() == "jstype") { + QmlTypeNode* qcn = new QmlTypeNode(parent, name); + qcn->setGenus(Node::JS); + qcn->setTitle(element.attribute("title")); + QString logicalModuleName = element.attribute("js-module-name"); + if (!logicalModuleName.isEmpty()) + qdb_->addToQmlModule(logicalModuleName, qcn); + bool abstract = false; + if (element.attribute("abstract") == "true") + abstract = true; + qcn->setAbstract(abstract); + QString qmlFullBaseName = element.attribute("js-base-type"); + if (!qmlFullBaseName.isEmpty()) { + qcn->setQmlBaseName(qmlFullBaseName); + } + if (element.hasAttribute("location")) + name = element.attribute("location", QString()); + if (!indexUrl.isEmpty()) + location = Location(indexUrl + QLatin1Char('/') + name); + else if (!indexUrl.isNull()) + location = Location(name); + node = qcn; + } else if (element.nodeName() == "qmlbasictype") { QmlBasicTypeNode* qbtn = new QmlBasicTypeNode(parent, name); qbtn->setTitle(element.attribute("title")); @@ -240,6 +263,18 @@ void QDocIndexFiles::readIndexSection(const QDomElement& element, location = Location(name); node = qbtn; } + else if (element.nodeName() == "jsbasictype") { + QmlBasicTypeNode* qbtn = new QmlBasicTypeNode(parent, name); + qbtn->setGenus(Node::JS); + qbtn->setTitle(element.attribute("title")); + if (element.hasAttribute("location")) + name = element.attribute("location", QString()); + if (!indexUrl.isEmpty()) + location = Location(indexUrl + QLatin1Char('/') + name); + else if (!indexUrl.isNull()) + location = Location(name); + node = qbtn; + } else if (element.nodeName() == "qmlpropertygroup") { QmlTypeNode* qcn = static_cast<QmlTypeNode*>(parent); QmlPropertyGroupNode* qpgn = new QmlPropertyGroupNode(qcn, name); @@ -251,6 +286,18 @@ void QDocIndexFiles::readIndexSection(const QDomElement& element, location = Location(name); node = qpgn; } + else if (element.nodeName() == "jspropertygroup") { + QmlTypeNode* qcn = static_cast<QmlTypeNode*>(parent); + QmlPropertyGroupNode* qpgn = new QmlPropertyGroupNode(qcn, name); + qpgn->setGenus(Node::JS); + if (element.hasAttribute("location")) + name = element.attribute("location", QString()); + if (!indexUrl.isEmpty()) + location = Location(indexUrl + QLatin1Char('/') + name); + else if (!indexUrl.isNull()) + location = Location(name); + node = qpgn; + } else if (element.nodeName() == "qmlproperty") { QString type = element.attribute("type"); bool attached = false; @@ -271,6 +318,27 @@ void QDocIndexFiles::readIndexSection(const QDomElement& element, qpn->setReadOnly(readonly); node = qpn; } + else if (element.nodeName() == "jsproperty") { + QString type = element.attribute("type"); + bool attached = false; + if (element.attribute("attached") == "true") + attached = true; + bool readonly = false; + if (element.attribute("writable") == "false") + readonly = true; + QmlPropertyNode* qpn = 0; + if (parent->isJsType()) { + QmlTypeNode* qcn = static_cast<QmlTypeNode*>(parent); + qpn = new QmlPropertyNode(qcn, name, type, attached); + } + else if (parent->isJsPropertyGroup()) { + QmlPropertyGroupNode* qpgn = static_cast<QmlPropertyGroupNode*>(parent); + qpn = new QmlPropertyNode(qpgn, name, type, attached); + } + qpn->setGenus(Node::JS); + qpn->setReadOnly(readonly); + node = qpn; + } else if ((element.nodeName() == "qmlmethod") || (element.nodeName() == "qmlsignal") || (element.nodeName() == "qmlsignalhandler")) { @@ -283,30 +351,58 @@ void QDocIndexFiles::readIndexSection(const QDomElement& element, FunctionNode* fn = new FunctionNode(t, parent, name, attached); node = fn; } + else if ((element.nodeName() == "jsmethod") || + (element.nodeName() == "jssignal") || + (element.nodeName() == "jssignalhandler")) { + Node::Type t = Node::QmlMethod; + if (element.nodeName() == "jssignal") + t = Node::QmlSignal; + else if (element.nodeName() == "jssignalhandler") + t = Node::QmlSignalHandler; + bool attached = false; + FunctionNode* fn = new FunctionNode(t, parent, name, attached); + fn->setGenus(Node::JS); + node = fn; + } else if (element.nodeName() == "group") { - GroupNode* gn = qdb_->addGroup(name); - gn->setTitle(element.attribute("title")); - gn->setSubTitle(element.attribute("subtitle")); + CollectionNode* cn = qdb_->addGroup(name); + cn->setTitle(element.attribute("title")); + cn->setSubTitle(element.attribute("subtitle")); if (element.attribute("seen") == "true") - gn->markSeen(); - node = gn; + cn->markSeen(); + node = cn; } else if (element.nodeName() == "module") { - ModuleNode* mn = qdb_->addModule(name); - mn->setTitle(element.attribute("title")); - mn->setSubTitle(element.attribute("subtitle")); + CollectionNode* cn = qdb_->addModule(name); + cn->setTitle(element.attribute("title")); + cn->setSubTitle(element.attribute("subtitle")); if (element.attribute("seen") == "true") - mn->markSeen(); - node = mn; + cn->markSeen(); + node = cn; } else if (element.nodeName() == "qmlmodule") { - QString t = element.attribute("qml-module-name") + " " + element.attribute("qml-module-version"); - QmlModuleNode* qmn = qdb_->addQmlModule(t); - qmn->setTitle(element.attribute("title")); - qmn->setSubTitle(element.attribute("subtitle")); + QString t = element.attribute("qml-module-name"); + CollectionNode* cn = qdb_->addQmlModule(t); + QStringList info; + info << t << element.attribute("qml-module-version"); + cn->setLogicalModuleInfo(info); + cn->setTitle(element.attribute("title")); + cn->setSubTitle(element.attribute("subtitle")); if (element.attribute("seen") == "true") - qmn->markSeen(); - node = qmn; + cn->markSeen(); + node = cn; + } + else if (element.nodeName() == "jsmodule") { + QString t = element.attribute("js-module-name"); + CollectionNode* cn = qdb_->addJsModule(t); + QStringList info; + info << t << element.attribute("js-module-version"); + cn->setLogicalModuleInfo(info); + cn->setTitle(element.attribute("title")); + cn->setSubTitle(element.attribute("subtitle")); + if (element.attribute("seen") == "true") + cn->markSeen(); + node = cn; } else if (element.nodeName() == "page") { Node::SubType subtype; @@ -335,7 +431,7 @@ void QDocIndexFiles::readIndexSection(const QDomElement& element, else return; - DocNode* docNode = new DocNode(parent, name, subtype, ptype); + DocumentNode* docNode = new DocumentNode(parent, name, subtype, ptype); docNode->setTitle(element.attribute("title")); if (element.hasAttribute("location")) @@ -492,7 +588,9 @@ void QDocIndexFiles::readIndexSection(const QDomElement& element, if ((element.nodeName() != "page") && (element.nodeName() != "qmlclass") && - (element.nodeName() != "qmlbasictype")) { + (element.nodeName() != "qmlbasictype") && + (element.nodeName() != "jstype") && + (element.nodeName() != "jsbasictype")) { QString threadSafety = element.attribute("threadsafety"); if (threadSafety == "non-reentrant") node->setThreadSafeness(Node::NonReentrant); @@ -646,15 +744,21 @@ bool QDocIndexFiles::generateIndexSection(QXmlStreamWriter& writer, break; case Node::QmlType: { - nodeName = "qmlclass"; - QmlModuleNode* qmn = node->logicalModule(); - if (qmn) - logicalModuleName = qmn->logicalModuleName(); + if (node->isQmlNode()) + nodeName = "qmlclass"; + else + nodeName = "jstype"; + CollectionNode* cn = node->logicalModule(); + if (cn) + logicalModuleName = cn->logicalModuleName(); qmlFullBaseName = node->qmlFullBaseName(); } break; case Node::QmlBasicType: - nodeName = "qmlbasictype"; + if (node->isQmlNode()) + nodeName = "qmlbasictype"; + else + nodeName = "jsbasictype"; break; case Node::Document: nodeName = "page"; @@ -666,7 +770,10 @@ bool QDocIndexFiles::generateIndexSection(QXmlStreamWriter& writer, nodeName = "module"; break; case Node::QmlModule: - nodeName = "qmlmodule"; + if (node->isQmlNode()) + nodeName = "qmlmodule"; + else + nodeName = "jsmodule"; break; case Node::Enum: nodeName = "enum"; @@ -684,19 +791,34 @@ bool QDocIndexFiles::generateIndexSection(QXmlStreamWriter& writer, nodeName = "variable"; break; case Node::QmlProperty: - nodeName = "qmlproperty"; + if (node->isQmlNode()) + nodeName = "qmlproperty"; + else + nodeName = "jsProperty"; break; case Node::QmlPropertyGroup: - nodeName = "qmlpropertygroup"; + if (node->isQmlNode()) + nodeName = "qmlpropertygroup"; + else + nodeName = "jspropertygroup"; break; case Node::QmlSignal: - nodeName = "qmlsignal"; + if (node->isQmlNode()) + nodeName = "qmlsignal"; + else + nodeName = "jssignal"; break; case Node::QmlSignalHandler: - nodeName = "qmlsignalhandler"; + if (node->isQmlNode()) + nodeName = "qmlsignalhandler"; + else + nodeName = "jssignalhandler"; break; case Node::QmlMethod: - nodeName = "qmlmethod"; + if (node->isQmlNode()) + nodeName = "qmlmethod"; + else + nodeName = "jsmethod"; break; default: return false; @@ -711,16 +833,6 @@ bool QDocIndexFiles::generateIndexSection(QXmlStreamWriter& writer, access = "protected"; break; case Node::Private: -#if 0 - // Do not include private non-internal nodes in the index. - // (Internal public and protected nodes are marked as private - // by qdoc. We can check their internal status to determine - // whether they were really private to begin with.) - if (node->status() == Node::Internal && generateInternalNodes) - access = "internal"; - else - return false; -#endif { access = "private"; bool b = generateInternalNodes; @@ -741,7 +853,7 @@ bool QDocIndexFiles::generateIndexSection(QXmlStreamWriter& writer, QXmlStreamAttributes attributes; - if (!node->isDocNode() && !node->isGroup() && !node->isModule() && !node->isQmlModule()) { + if (!node->isDocumentNode() && !node->isCollectionNode()) { QString threadSafety; switch (node->threadSafeness()) { case Node::NonReentrant: @@ -791,13 +903,24 @@ bool QDocIndexFiles::generateIndexSection(QXmlStreamWriter& writer, if (node->isQmlModule()) { logicalModuleName = node->logicalModuleName(); logicalModuleVersion = node->logicalModuleVersion(); + if (!logicalModuleName.isEmpty()) { + writer.writeAttribute("qml-module-name", logicalModuleName); + if (node->isQmlModule()) + writer.writeAttribute("qml-module-version", logicalModuleVersion); + if (!qmlFullBaseName.isEmpty()) + writer.writeAttribute("qml-base-type", qmlFullBaseName); + } } - if (!logicalModuleName.isEmpty()) { - writer.writeAttribute("qml-module-name", logicalModuleName); - if (node->isQmlModule()) - writer.writeAttribute("qml-module-version", logicalModuleVersion); - if (!qmlFullBaseName.isEmpty()) - writer.writeAttribute("qml-base-type", qmlFullBaseName); + else if (node->isJsModule()) { + logicalModuleName = node->logicalModuleName(); + logicalModuleVersion = node->logicalModuleVersion(); + if (!logicalModuleName.isEmpty()) { + writer.writeAttribute("js-module-name", logicalModuleName); + if (node->isQmlModule()) + writer.writeAttribute("js-module-version", logicalModuleVersion); + if (!qmlFullBaseName.isEmpty()) + writer.writeAttribute("js-base-type", qmlFullBaseName); + } } QString href; @@ -816,12 +939,12 @@ bool QDocIndexFiles::generateIndexSection(QXmlStreamWriter& writer, } else href = node->name(); - if (node->isQmlNode()) { + if (node->isQmlNode() || node->isJsNode()) { InnerNode* p = node->parent(); if (p) { - if (p->isQmlPropertyGroup()) + if (p->isQmlPropertyGroup() || p->isJsPropertyGroup()) p = p->parent(); - if (p && p->isQmlType() && p->isAbstract()) + if (p && (p->isQmlType() || p->isJsType()) && p->isAbstract()) href.clear(); } } @@ -829,7 +952,7 @@ bool QDocIndexFiles::generateIndexSection(QXmlStreamWriter& writer, writer.writeAttribute("href", href); writer.writeAttribute("status", status); - if (!node->isDocNode() && !node->isGroup() && !node->isModule() && !node->isQmlModule()) { + if (!node->isDocumentNode() && !node->isCollectionNode()) { writer.writeAttribute("access", access); if (node->isAbstract()) writer.writeAttribute("abstract", "true"); @@ -898,7 +1021,7 @@ bool QDocIndexFiles::generateIndexSection(QXmlStreamWriter& writer, a title, and other attributes. */ bool writeModuleName = false; - const DocNode* docNode = static_cast<const DocNode*>(node); + const DocumentNode* docNode = static_cast<const DocumentNode*>(node); switch (docNode->subType()) { case Node::Example: writer.writeAttribute("subtype", "example"); @@ -935,22 +1058,22 @@ bool QDocIndexFiles::generateIndexSection(QXmlStreamWriter& writer, break; case Node::Group: { - const GroupNode* gn = static_cast<const GroupNode*>(node); - writer.writeAttribute("seen", gn->wasSeen() ? "true" : "false"); - writer.writeAttribute("title", gn->title()); - if (!gn->subTitle().isEmpty()) - writer.writeAttribute("subtitle", gn->subTitle()); - if (!gn->physicalModuleName().isEmpty()) - writer.writeAttribute("module", gn->physicalModuleName()); - if (!gn->groupNames().isEmpty()) - writer.writeAttribute("groups", gn->groupNames().join(",")); + const CollectionNode* cn = static_cast<const CollectionNode*>(node); + writer.writeAttribute("seen", cn->wasSeen() ? "true" : "false"); + writer.writeAttribute("title", cn->title()); + if (!cn->subTitle().isEmpty()) + writer.writeAttribute("subtitle", cn->subTitle()); + if (!cn->physicalModuleName().isEmpty()) + writer.writeAttribute("module", cn->physicalModuleName()); + if (!cn->groupNames().isEmpty()) + writer.writeAttribute("groups", cn->groupNames().join(",")); /* This is not read back in, so it probably shouldn't be written out in the first place. */ - if (!gn->members().isEmpty()) { + if (!cn->members().isEmpty()) { QStringList names; - foreach (const Node* member, gn->members()) + foreach (const Node* member, cn->members()) names.append(member->name()); writer.writeAttribute("members", names.join(",")); } @@ -960,22 +1083,22 @@ bool QDocIndexFiles::generateIndexSection(QXmlStreamWriter& writer, break; case Node::Module: { - const ModuleNode* mn = static_cast<const ModuleNode*>(node); - writer.writeAttribute("seen", mn->wasSeen() ? "true" : "false"); - writer.writeAttribute("title", mn->title()); - if (!mn->subTitle().isEmpty()) - writer.writeAttribute("subtitle", mn->subTitle()); - if (!mn->physicalModuleName().isEmpty()) - writer.writeAttribute("module", mn->physicalModuleName()); - if (!mn->groupNames().isEmpty()) - writer.writeAttribute("groups", mn->groupNames().join(",")); + const CollectionNode* cn = static_cast<const CollectionNode*>(node); + writer.writeAttribute("seen", cn->wasSeen() ? "true" : "false"); + writer.writeAttribute("title", cn->title()); + if (!cn->subTitle().isEmpty()) + writer.writeAttribute("subtitle", cn->subTitle()); + if (!cn->physicalModuleName().isEmpty()) + writer.writeAttribute("module", cn->physicalModuleName()); + if (!cn->groupNames().isEmpty()) + writer.writeAttribute("groups", cn->groupNames().join(",")); /* This is not read back in, so it probably shouldn't be written out in the first place. */ - if (!mn->members().isEmpty()) { + if (!cn->members().isEmpty()) { QStringList names; - foreach (const Node* member, mn->members()) + foreach (const Node* member, cn->members()) names.append(member->name()); writer.writeAttribute("members", names.join(",")); } @@ -985,22 +1108,22 @@ bool QDocIndexFiles::generateIndexSection(QXmlStreamWriter& writer, break; case Node::QmlModule: { - const QmlModuleNode* qmn = static_cast<const QmlModuleNode*>(node); - writer.writeAttribute("seen", qmn->wasSeen() ? "true" : "false"); - writer.writeAttribute("title", qmn->title()); - if (!qmn->subTitle().isEmpty()) - writer.writeAttribute("subtitle", qmn->subTitle()); - if (!qmn->physicalModuleName().isEmpty()) - writer.writeAttribute("module", qmn->physicalModuleName()); - if (!qmn->groupNames().isEmpty()) - writer.writeAttribute("groups", qmn->groupNames().join(",")); + const CollectionNode* cn = static_cast<const CollectionNode*>(node); + writer.writeAttribute("seen", cn->wasSeen() ? "true" : "false"); + writer.writeAttribute("title", cn->title()); + if (!cn->subTitle().isEmpty()) + writer.writeAttribute("subtitle", cn->subTitle()); + if (!cn->physicalModuleName().isEmpty()) + writer.writeAttribute("module", cn->physicalModuleName()); + if (!cn->groupNames().isEmpty()) + writer.writeAttribute("groups", cn->groupNames().join(",")); /* This is not read back in, so it probably shouldn't be written out in the first place. */ - if (!qmn->members().isEmpty()) { + if (!cn->members().isEmpty()) { QStringList names; - foreach (const Node* member, qmn->members()) + foreach (const Node* member, cn->members()) names.append(member->name()); writer.writeAttribute("members", names.join(",")); } @@ -1195,7 +1318,7 @@ bool QDocIndexFiles::generateIndexSection(QXmlStreamWriter& writer, if (node->doc().hasTargets()) { bool external = false; if (node->type() == Node::Document) { - const DocNode* docNode = static_cast<const DocNode*>(node); + const DocumentNode* docNode = static_cast<const DocumentNode*>(node); if (docNode->subType() == Node::ExternalPage) external = true; } @@ -1295,9 +1418,17 @@ bool compareNodes(const Node* n1, const Node* n2) return false; } - if (n1->isDocNode() && n2->isDocNode()) { - const DocNode* f1 = static_cast<const DocNode*>(n1); - const DocNode* f2 = static_cast<const DocNode*>(n2); + if (n1->isDocumentNode() && n2->isDocumentNode()) { + const DocumentNode* f1 = static_cast<const DocumentNode*>(n1); + const DocumentNode* f2 = static_cast<const DocumentNode*>(n2); + if (f1->fullTitle() < f2->fullTitle()) + return true; + else if (f1->fullTitle() > f2->fullTitle()) + return false; + } + else if (n1->isCollectionNode() && n2->isCollectionNode()) { + const CollectionNode* f1 = static_cast<const CollectionNode*>(n1); + const CollectionNode* f2 = static_cast<const CollectionNode*>(n2); if (f1->fullTitle() < f2->fullTitle()) return true; else if (f1->fullTitle() > f2->fullTitle()) @@ -1321,7 +1452,7 @@ void QDocIndexFiles::generateIndexSections(QXmlStreamWriter& writer, Note that groups, modules, and QML modules are written after all the other nodes. */ - if (node->isGroup() || node->isModule() || node->isQmlModule()) + if (node->isGroup() || node->isModule() || node->isQmlModule() || node->isJsModule()) return; if (generateIndexSection(writer, node, generateInternalNodes)) { @@ -1374,6 +1505,16 @@ void QDocIndexFiles::generateIndexSections(QXmlStreamWriter& writer, ++g; } } + + const CNMap& jsModules = qdb_->jsModules(); + if (!jsModules.isEmpty()) { + CNMap::ConstIterator g = jsModules.constBegin(); + while (g != jsModules.constEnd()) { + if (generateIndexSection(writer, g.value(), generateInternalNodes)) + writer.writeEndElement(); + ++g; + } + } } writer.writeEndElement(); |