From ee634611d4d78d7ee66b79dc765abab231391eab Mon Sep 17 00:00:00 2001 From: Topi Reinio Date: Fri, 9 Oct 2015 16:06:36 +0200 Subject: qdoc: Insert targets for function and enum nodes read from the index QDoc wrote \target and \keyword information into the index file properly, but did not read them back in. This was because the code for handling enum and function elements read their own child elements (without handling targets), and marked the remaining children to be skipped. This commit fixes the issue by refactoring the code for inserting targets into a new function and calling it from relevant places. Change-Id: I85d7b26ce54620daec35b19e447d1a065515b863 Task-number: QTBUG-48687 Reviewed-by: Martin Smith --- src/tools/qdoc/qdocindexfiles.cpp | 46 ++++++++++++++++++++++++++++++++------- src/tools/qdoc/qdocindexfiles.h | 3 +++ 2 files changed, 41 insertions(+), 8 deletions(-) diff --git a/src/tools/qdoc/qdocindexfiles.cpp b/src/tools/qdoc/qdocindexfiles.cpp index 292a4de021..ef86d782c7 100644 --- a/src/tools/qdoc/qdocindexfiles.cpp +++ b/src/tools/qdoc/qdocindexfiles.cpp @@ -463,10 +463,15 @@ void QDocIndexFiles::readIndexSection(QXmlStreamReader& reader, location = Location(parent->name().toLower() + ".html"); while (reader.readNextStartElement()) { + QXmlStreamAttributes childAttributes = reader.attributes(); if (reader.name() == QLatin1String("value")) { - QXmlStreamAttributes childAttributes = reader.attributes(); + EnumItem item(childAttributes.value(QLatin1String("name")).toString(), childAttributes.value(QLatin1String("value")).toString()); enumNode->addItem(item); + } else if (reader.name() == QLatin1String("keyword")) { + insertTarget(TargetRec::Keyword, childAttributes, enumNode); + } else if (reader.name() == QLatin1String("target")) { + insertTarget(TargetRec::Target, childAttributes, enumNode); } reader.skipCurrentElement(); } @@ -552,8 +557,8 @@ void QDocIndexFiles::readIndexSection(QXmlStreamReader& reader, */ while (reader.readNextStartElement()) { + QXmlStreamAttributes childAttributes = reader.attributes(); if (reader.name() == QLatin1String("parameter")) { - QXmlStreamAttributes childAttributes = reader.attributes(); // Do not use the default value for the parameter; it is not // required, and has been known to cause problems. Parameter parameter(childAttributes.value(QLatin1String("left")).toString(), @@ -561,6 +566,10 @@ void QDocIndexFiles::readIndexSection(QXmlStreamReader& reader, childAttributes.value(QLatin1String("name")).toString(), QString()); // childAttributes.value(QLatin1String("default")) functionNode->addParameter(parameter); + } else if (reader.name() == QLatin1String("keyword")) { + insertTarget(TargetRec::Keyword, childAttributes, functionNode); + } else if (reader.name() == QLatin1String("target")) { + insertTarget(TargetRec::Target, childAttributes, functionNode); } reader.skipCurrentElement(); } @@ -581,18 +590,15 @@ void QDocIndexFiles::readIndexSection(QXmlStreamReader& reader, location = Location(parent->name().toLower() + ".html"); } else if (elementName == QLatin1String("keyword")) { - QString title = attributes.value(QLatin1String("title")).toString(); - qdb_->insertTarget(name, title, TargetRec::Keyword, current, 1); + insertTarget(TargetRec::Keyword, attributes, current); goto done; } else if (elementName == QLatin1String("target")) { - QString title = attributes.value(QLatin1String("title")).toString(); - qdb_->insertTarget(name, title, TargetRec::Target, current, 2); + insertTarget(TargetRec::Target, attributes, current); goto done; } else if (elementName == QLatin1String("contents")) { - QString title = attributes.value(QLatin1String("title")).toString(); - qdb_->insertTarget(name, title, TargetRec::Contents, current, 3); + insertTarget(TargetRec::Contents, attributes, current); goto done; } else @@ -702,6 +708,30 @@ void QDocIndexFiles::readIndexSection(QXmlStreamReader& reader, } } +void QDocIndexFiles::insertTarget(TargetRec::TargetType type, + const QXmlStreamAttributes &attributes, + Node *node) +{ + int priority; + switch (type) { + case TargetRec::Keyword: + priority = 1; + break; + case TargetRec::Target: + priority = 2; + break; + case TargetRec::Contents: + priority = 3; + break; + default: + return; + } + + QString name = attributes.value(QLatin1String("name")).toString(); + QString title = attributes.value(QLatin1String("title")).toString(); + qdb_->insertTarget(name, title, type, node, priority); +} + /*! This function tries to resolve class inheritance immediately after the index file is read. It is not always possible to diff --git a/src/tools/qdoc/qdocindexfiles.h b/src/tools/qdoc/qdocindexfiles.h index 67a7e7226e..9873322b3b 100644 --- a/src/tools/qdoc/qdocindexfiles.h +++ b/src/tools/qdoc/qdocindexfiles.h @@ -35,6 +35,7 @@ #define QDOCINDEXFILES_H #include "node.h" +#include "tree.h" QT_BEGIN_NAMESPACE @@ -43,6 +44,7 @@ class Generator; class QStringList; class QDocDatabase; class QXmlStreamWriter; +class QXmlStreamAttributes; class QDocIndexFiles { @@ -64,6 +66,7 @@ class QDocIndexFiles void readIndexFile(const QString& path); void readIndexSection(QXmlStreamReader &reader, Node* current, const QString& indexUrl); + void insertTarget(TargetRec::TargetType type, const QXmlStreamAttributes &attributes, Node *node); void resolveIndex(); void resolveRelates(); bool generateIndexSection(QXmlStreamWriter& writer, Node* node, bool generateInternalNodes = false); -- cgit v1.2.3