diff options
author | Frederik Gladhorn <frederik.gladhorn@digia.com> | 2013-04-22 16:35:41 +0200 |
---|---|---|
committer | Frederik Gladhorn <frederik.gladhorn@digia.com> | 2013-04-22 16:35:43 +0200 |
commit | 4c231d5df3040dbf4545a9a77145ee0e1f9c380c (patch) | |
tree | 2cc5b71a5d2b464214cf5372776913fbe4622e1e /src/tools | |
parent | 7df16fb4ccbe0476bc34274a77e98eec4e8d2d93 (diff) | |
parent | d672ef07681a959d9559dd1e11e70db1f448a7f1 (diff) |
Merge remote-tracking branch 'origin/stable' into dev
Change-Id: I059725e3b7d7ffd5a16a0931e6c17200917172b5
Diffstat (limited to 'src/tools')
-rw-r--r-- | src/tools/bootstrap/bootstrap.pro | 2 | ||||
-rw-r--r-- | src/tools/qdoc/codemarker.cpp | 33 | ||||
-rw-r--r-- | src/tools/qdoc/codemarker.h | 4 | ||||
-rw-r--r-- | src/tools/qdoc/codeparser.cpp | 2 | ||||
-rw-r--r-- | src/tools/qdoc/ditaxmlgenerator.cpp | 37 | ||||
-rw-r--r-- | src/tools/qdoc/ditaxmlgenerator.h | 13 | ||||
-rw-r--r-- | src/tools/qdoc/generator.cpp | 14 | ||||
-rw-r--r-- | src/tools/qdoc/generator.h | 7 | ||||
-rw-r--r-- | src/tools/qdoc/htmlgenerator.cpp | 71 | ||||
-rw-r--r-- | src/tools/qdoc/htmlgenerator.h | 5 | ||||
-rw-r--r-- | src/tools/qdoc/node.h | 15 | ||||
-rw-r--r-- | src/tools/qdoc/qdocdatabase.cpp | 96 | ||||
-rw-r--r-- | src/tools/qdoc/qdocdatabase.h | 7 | ||||
-rw-r--r-- | src/tools/qdoc/qdocindexfiles.cpp | 7 | ||||
-rw-r--r-- | src/tools/qdoc/qdocindexfiles.h | 1 | ||||
-rw-r--r-- | src/tools/qdoc/qmlvisitor.cpp | 2 |
16 files changed, 224 insertions, 92 deletions
diff --git a/src/tools/bootstrap/bootstrap.pro b/src/tools/bootstrap/bootstrap.pro index 4819dbdd07..972f57260e 100644 --- a/src/tools/bootstrap/bootstrap.pro +++ b/src/tools/bootstrap/bootstrap.pro @@ -28,6 +28,8 @@ DEFINES += \ QT_CRYPTOGRAPHICHASH_ONLY_SHA1 \ QT_NO_CAST_FROM_ASCII +DEFINES -= QT_EVAL + MODULE_PRIVATE_INCLUDES = \ \$\$QT_MODULE_INCLUDE_BASE \ \$\$QT_MODULE_INCLUDE_BASE/QtCore \ diff --git a/src/tools/qdoc/codemarker.cpp b/src/tools/qdoc/codemarker.cpp index 4e144d2f7d..e39ff203a5 100644 --- a/src/tools/qdoc/codemarker.cpp +++ b/src/tools/qdoc/codemarker.cpp @@ -455,39 +455,6 @@ void CodeMarker::insert(FastSection &fastSection, } } -void CodeMarker::insert(FastSection& fastSection, - Node* node, - SynopsisStyle style, - bool /* includeClassName */) -{ - if (node->status() == Node::Compat || node->status() == Node::Obsolete) - return; - - bool inheritedMember = false; - InnerNode* parent = node->parent(); - if (parent && (parent->type() == Node::Document) && - (parent->subType() == Node::QmlPropertyGroup)) { - parent = parent->parent(); - } - inheritedMember = (parent != fastSection.parent_); - - if (!inheritedMember || style == Subpage) { - QString key = sortName(node); - if (!fastSection.memberMap.contains(key)) - fastSection.memberMap.insert(key, node); - } - else { - if ((parent->type() == Node::Document) && (parent->subType() == Node::QmlClass)) { - if (fastSection.inherited.isEmpty() - || fastSection.inherited.last().first != parent) { - QPair<InnerNode*, int> p(parent, 0); - fastSection.inherited.append(p); - } - fastSection.inherited.last().second++; - } - } -} - /*! Returns true if \a node represents a reimplemented member function in the class of the FastSection \a fs. If it is diff --git a/src/tools/qdoc/codemarker.h b/src/tools/qdoc/codemarker.h index c31b43e875..02caedf9b8 100644 --- a/src/tools/qdoc/codemarker.h +++ b/src/tools/qdoc/codemarker.h @@ -178,10 +178,6 @@ protected: Node *node, SynopsisStyle style, Status status); - void insert(FastSection& fastSection, - Node* node, - SynopsisStyle style, - bool includeClassName = false); bool insertReimpFunc(FastSection& fs, Node* node, Status status); void append(QList<Section>& sectionList, const FastSection& fastSection, bool includeKeys = false); diff --git a/src/tools/qdoc/codeparser.cpp b/src/tools/qdoc/codeparser.cpp index 65eeda604f..557a6f08fa 100644 --- a/src/tools/qdoc/codeparser.cpp +++ b/src/tools/qdoc/codeparser.cpp @@ -237,7 +237,7 @@ void CodeParser::processCommonMetaCommand(const Location& location, node->setStatus(Node::Compat); } else if (command == COMMAND_DEPRECATED) { - node->setStatus(Node::Deprecated); + node->setStatus(Node::Obsolete); } else if ((command == COMMAND_INGROUP) || (command == COMMAND_INPUBLICGROUP)) { // Note: \ingroup and \inpublicgroup are now the same. diff --git a/src/tools/qdoc/ditaxmlgenerator.cpp b/src/tools/qdoc/ditaxmlgenerator.cpp index 21bbdafaf5..a828101551 100644 --- a/src/tools/qdoc/ditaxmlgenerator.cpp +++ b/src/tools/qdoc/ditaxmlgenerator.cpp @@ -473,8 +473,6 @@ DitaXmlGenerator::DitaXmlGenerator() inTableBody(false), noLinks(false), obsoleteLinks(false), - offlineDocs(true), - codeIndent(0), divNestingLevel(0), sectionNestingLevel(0), tableColumnCount(0), @@ -573,8 +571,6 @@ void DitaXmlGenerator::initializeGenerator(const Config &config) customHeadElements = config.getStringList(DitaXmlGenerator::format() + Config::dot + DITAXMLGENERATOR_CUSTOMHEADELEMENTS); - // The following line was changed to fix QTBUG-27798 - //codeIndent = config.getInt(CONFIG_CODEINDENT); version = config.getString(CONFIG_VERSION); vrm = version.split(QLatin1Char('.')); } @@ -1024,10 +1020,10 @@ int DitaXmlGenerator::generateAtom(const Atom *atom, generateAnnotatedList(relative, marker, qdb_->getCppClasses()); } else if (atom->string() == "classes") { - generateCompactList(relative, qdb_->getCppClasses(), true); + generateCompactList(Generic, relative, qdb_->getCppClasses(), true); } else if (atom->string() == "qmlclasses") { - generateCompactList(relative, qdb_->getQmlTypes(), true); + generateCompactList(Generic, relative, qdb_->getQmlTypes(), true); } else if (atom->string().contains("classesbymodule")) { QString arg = atom->string().trimmed(); @@ -1046,10 +1042,19 @@ int DitaXmlGenerator::generateAtom(const Atom *atom, generateClassHierarchy(relative, qdb_->getCppClasses()); } else if (atom->string() == "compatclasses") { - generateCompactList(relative, qdb_->getCompatibilityClasses(), false); + generateCompactList(Generic, relative, qdb_->getCompatibilityClasses(), false); } else if (atom->string() == "obsoleteclasses") { - generateCompactList(relative, qdb_->getObsoleteClasses(), false); + generateCompactList(Generic, relative, qdb_->getObsoleteClasses(), false); + } + else if (atom->string() == "obsoleteqmltypes") { + generateCompactList(Generic, relative, qdb_->getObsoleteQmlTypes(), false); + } + else if (atom->string() == "obsoletecppmembers") { + generateCompactList(Obsolete, relative, qdb_->getClassesWithObsoleteMembers(), false); + } + else if (atom->string() == "obsoleteqmlmembers") { + generateCompactList(Obsolete, relative, qdb_->getQmlTypesWithObsoleteMembers(), false); } else if (atom->string() == "functionindex") { generateFunctionIndex(relative); @@ -1058,10 +1063,10 @@ int DitaXmlGenerator::generateAtom(const Atom *atom, generateLegaleseList(relative, marker); } else if (atom->string() == "mainclasses") { - generateCompactList(relative, qdb_->getMainClasses(), true); + generateCompactList(Generic, relative, qdb_->getMainClasses(), true); } else if (atom->string() == "services") { - generateCompactList(relative, qdb_->getServiceClasses(), false); + generateCompactList(Generic, relative, qdb_->getServiceClasses(), false); } else if (atom->string() == "overviews") { generateOverviewList(relative); @@ -1176,9 +1181,9 @@ int DitaXmlGenerator::generateAtom(const Atom *atom, writeCharacters(protectEnc((*s).name)); writeEndTag(); // </p> if (idx == Class) - generateCompactList(0, ncmap, false, QString("Q")); + generateCompactList(Generic, 0, ncmap, false, QString("Q")); else if (idx == QmlClass) - generateCompactList(0, nqcmap, false, QString("Q")); + generateCompactList(Generic, 0, nqcmap, false, QString("Q")); else if (idx == MemberFunction) { ParentMaps parentmaps; ParentMaps::iterator pmap; @@ -2599,7 +2604,7 @@ void DitaXmlGenerator::generateTableOfContents(const Node* node, inLink_ = false; } -void DitaXmlGenerator::generateLowStatusMembers(const InnerNode* inner, +void DitaXmlGenerator::generateLowStatusMembers(InnerNode* inner, CodeMarker* marker, CodeMarker::Status status) { @@ -2620,6 +2625,9 @@ void DitaXmlGenerator::generateLowStatusMembers(const InnerNode* inner, if (sections.isEmpty()) return; + if (status == CodeMarker::Obsolete) + inner->setObsoleteLink(fileBase(inner) + "-obsolete." + fileExtension()); + QList<Section>::ConstIterator s = sections.constBegin(); while (s != sections.constEnd()) { if ((*s).name == "Member Function Documentation") { @@ -2779,7 +2787,8 @@ void DitaXmlGenerator::generateAnnotatedList(const Node* relative, normally you let it figure it out itself by looking at the name of the first and last classes in \a classMap. */ -void DitaXmlGenerator::generateCompactList(const Node* relative, +void DitaXmlGenerator::generateCompactList(ListType , // currently not needed for DITA + const Node* relative, const NodeMap& classMap, bool includeAlphabet, QString commonPrefix) diff --git a/src/tools/qdoc/ditaxmlgenerator.h b/src/tools/qdoc/ditaxmlgenerator.h index c096829cae..15ef4260b2 100644 --- a/src/tools/qdoc/ditaxmlgenerator.h +++ b/src/tools/qdoc/ditaxmlgenerator.h @@ -46,7 +46,6 @@ #include <qregexp.h> #include <qxmlstream.h> #include "codemarker.h" -#include "config.h" #include "generator.h" QT_BEGIN_NAMESPACE @@ -374,16 +373,12 @@ private: Doc::Sections sectioningUnit, int numColumns, const Node* relative = 0); - void generateLowStatusMembers(const InnerNode* inner, - CodeMarker* marker, - CodeMarker::Status status); - QString generateLowStatusMemberFile(const InnerNode* inner, - CodeMarker* marker, - CodeMarker::Status status); + void generateLowStatusMembers(InnerNode* inner, CodeMarker* marker, CodeMarker::Status status); void generateClassHierarchy(const Node* relative, NodeMap& classMap); void generateAnnotatedList(const Node* relative, CodeMarker* marker, const NodeMap& nodeMap); void generateAnnotatedList(const Node* relative, CodeMarker* marker, const NodeList& nodes); - void generateCompactList(const Node* relative, + void generateCompactList(ListType listType, + const Node* relative, const NodeMap& classMap, bool includeAlphabet, QString commonPrefix = QString()); @@ -484,9 +479,7 @@ private: bool noLinks; bool obsoleteLinks; - bool offlineDocs; - int codeIndent; int divNestingLevel; int sectionNestingLevel; int tableColumnCount; diff --git a/src/tools/qdoc/generator.cpp b/src/tools/qdoc/generator.cpp index e2ee660dd1..d9ee0e42ee 100644 --- a/src/tools/qdoc/generator.cpp +++ b/src/tools/qdoc/generator.cpp @@ -68,6 +68,7 @@ QStringList Generator::imageDirs; QStringList Generator::imageFiles; QMap<QString, QStringList> Generator::imgFileExts; QString Generator::outDir_; +QString Generator::outSubdir_; QSet<QString> Generator::outputFormats; QHash<QString, QString> Generator::outputPrefixes; QString Generator::project; @@ -1477,10 +1478,13 @@ void Generator::initialize(const Config &config) redirectDocumentationToDevNull_ = config.getBool(CONFIG_REDIRECTDOCUMENTATIONTODEVNULL); if (!outputFormats.isEmpty()) { outDir_ = config.getOutputDir(); - - if (outDir_.isEmpty()) + if (outDir_.isEmpty()) { config.lastLocation().fatal(tr("No output directory specified in " "configuration file or on the command line")); + } + else { + outSubdir_ = outDir_.mid(outDir_.lastIndexOf('/') + 1); + } QDir dirInfo; if (dirInfo.exists(outDir_)) { @@ -1625,8 +1629,12 @@ void Generator::augmentImageDirs(QSet<QString>& moreImageDirs) } } -void Generator::initializeGenerator(const Config & /* config */) +/*! + Sets the generator's pointer to the Config instance. + */ +void Generator::initializeGenerator(const Config& config) { + config_ = &config; } bool Generator::matchAhead(const Atom *atom, Atom::Type expectedAtomType) diff --git a/src/tools/qdoc/generator.h b/src/tools/qdoc/generator.h index ec1e49d2fb..08ee9b4e9b 100644 --- a/src/tools/qdoc/generator.h +++ b/src/tools/qdoc/generator.h @@ -50,7 +50,7 @@ #include <qstring.h> #include <qstringlist.h> #include <qtextstream.h> - +#include "config.h" #include "node.h" #include "text.h" @@ -70,6 +70,7 @@ class Generator public: enum Passes { Both, Prepare, Generate }; + enum ListType { Generic, Obsolete }; Generator(); virtual ~Generator(); @@ -81,11 +82,13 @@ public: virtual void terminateGenerator(); QString fullDocumentLocation(const Node *node, bool subdir = false); + const Config* config() { return config_; } static Generator *currentGenerator() { return currentGenerator_; } static Generator *generatorForFormat(const QString& format); static void initialize(const Config& config); static const QString& outputDir() { return outDir_; } + static const QString& outputSubdir() { return outSubdir_; } static void terminate(); static void writeOutFileNames(); static void augmentImageDirs(QSet<QString>& moreImageDirs); @@ -192,6 +195,7 @@ private: static QMap<QString, QStringList> imgFileExts; static QString project; static QString outDir_; + static QString outSubdir_; static QSet<QString> outputFormats; static QHash<QString, QString> outputPrefixes; static QStringList scriptDirs; @@ -222,6 +226,7 @@ private: QRegExp tag; protected: + const Config* config_; QDocDatabase* qdb_; bool inLink_; bool inContents_; diff --git a/src/tools/qdoc/htmlgenerator.cpp b/src/tools/qdoc/htmlgenerator.cpp index 7d7f9e811a..c5dc7d17c9 100644 --- a/src/tools/qdoc/htmlgenerator.cpp +++ b/src/tools/qdoc/htmlgenerator.cpp @@ -470,10 +470,10 @@ int HtmlGenerator::generateAtom(const Atom *atom, const Node *relative, CodeMark generateAnnotatedList(relative, marker, qdb_->getCppClasses()); } else if (atom->string() == "classes") { - generateCompactList(relative, qdb_->getCppClasses(), true); + generateCompactList(Generic, relative, qdb_->getCppClasses(), true); } else if (atom->string() == "qmlclasses") { - generateCompactList(relative, qdb_->getQmlTypes(), true); + generateCompactList(Generic, relative, qdb_->getQmlTypes(), true); } else if (atom->string().contains("classesbymodule")) { QString arg = atom->string().trimmed(); @@ -492,10 +492,19 @@ int HtmlGenerator::generateAtom(const Atom *atom, const Node *relative, CodeMark generateClassHierarchy(relative, qdb_->getCppClasses()); } else if (atom->string() == "compatclasses") { - generateCompactList(relative, qdb_->getCompatibilityClasses(), false); + generateCompactList(Generic, relative, qdb_->getCompatibilityClasses(), false); } else if (atom->string() == "obsoleteclasses") { - generateCompactList(relative, qdb_->getObsoleteClasses(), false); + generateCompactList(Generic, relative, qdb_->getObsoleteClasses(), false); + } + else if (atom->string() == "obsoleteqmltypes") { + generateCompactList(Generic, relative, qdb_->getObsoleteQmlTypes(), false); + } + else if (atom->string() == "obsoletecppmembers") { + generateCompactList(Obsolete, relative, qdb_->getClassesWithObsoleteMembers(), false); + } + else if (atom->string() == "obsoleteqmlmembers") { + generateCompactList(Obsolete, relative, qdb_->getQmlTypesWithObsoleteMembers(), false); } else if (atom->string() == "functionindex") { generateFunctionIndex(relative); @@ -504,10 +513,10 @@ int HtmlGenerator::generateAtom(const Atom *atom, const Node *relative, CodeMark generateLegaleseList(relative, marker); } else if (atom->string() == "mainclasses") { - generateCompactList(relative, qdb_->getMainClasses(), true); + generateCompactList(Generic, relative, qdb_->getMainClasses(), true); } else if (atom->string() == "services") { - generateCompactList(relative, qdb_->getServiceClasses(), false); + generateCompactList(Generic, relative, qdb_->getServiceClasses(), false); } else if (atom->string() == "overviews") { generateOverviewList(relative); @@ -640,9 +649,9 @@ int HtmlGenerator::generateAtom(const Atom *atom, const Node *relative, CodeMark << "\"></a>\n"; out() << "<h3>" << protectEnc((*s).name) << "</h3>\n"; if (idx == Class) - generateCompactList(0, ncmap, false, QString("Q")); + generateCompactList(Generic, 0, ncmap, false, QString("Q")); else if (idx == QmlClass) - generateCompactList(0, nqcmap, false, QString("Q")); + generateCompactList(Generic, 0, nqcmap, false, QString("Q")); else if (idx == MemberFunction) { ParentMaps parentmaps; ParentMaps::iterator pmap; @@ -1131,9 +1140,10 @@ void HtmlGenerator::generateClassLikeNode(InnerNode* inner, CodeMarker* marker) QString obsoleteLink = generateLowStatusMemberFile(inner, marker, CodeMarker::Obsolete); - if (!obsoleteLink.isEmpty()) + if (!obsoleteLink.isEmpty()) { out() << "<li><a href=\"" << obsoleteLink << "\">" << "Obsolete members</a></li>\n"; + } QString compatLink = generateLowStatusMemberFile(inner, marker, @@ -1481,9 +1491,10 @@ void HtmlGenerator::generateDocNode(DocNode* dn, CodeMarker* marker) QString obsoleteLink = generateLowStatusMemberFile(dn, marker, CodeMarker::Obsolete); - if (!obsoleteLink.isEmpty()) + if (!obsoleteLink.isEmpty()) { out() << "<li><a href=\"" << obsoleteLink << "\">" << "Obsolete members</a></li>\n"; + } QString compatLink = generateLowStatusMemberFile(dn, marker, @@ -2105,7 +2116,7 @@ QString HtmlGenerator::generateAllQmlMembersFile(const QmlClassNode* qml_cn, return fileName; } -QString HtmlGenerator::generateLowStatusMemberFile(const InnerNode *inner, +QString HtmlGenerator::generateLowStatusMemberFile(InnerNode *inner, CodeMarker *marker, CodeMarker::Status status) { @@ -2133,6 +2144,10 @@ QString HtmlGenerator::generateLowStatusMemberFile(const InnerNode *inner, title = "Obsolete Members for " + inner->name(); fileName = fileBase(inner) + "-obsolete." + fileExtension(); } + if (status == CodeMarker::Obsolete) { + QString link = QString("../" + Generator::outputSubdir() + QLatin1Char('/')) + fileName; + inner->setObsoleteLink(link); + } beginSubPage(inner, fileName); generateHeader(title, inner, marker); @@ -2292,7 +2307,8 @@ void HtmlGenerator::generateAnnotatedList(const Node *relative, normally you let it figure it out itself by looking at the name of the first and last classes in \a classMap. */ -void HtmlGenerator::generateCompactList(const Node *relative, +void HtmlGenerator::generateCompactList(ListType listType, + const Node *relative, const NodeMap &classMap, bool includeAlphabet, QString commonPrefix) @@ -2452,11 +2468,19 @@ void HtmlGenerator::generateCompactList(const Node *relative, for (int i=0; i<curParOffset; i++) ++it; - /* - Previously, we used generateFullName() for this, but we - require some special formatting. - */ - out() << "<a href=\"" << linkForNode(it.value(), relative) << "\">"; + if (listType == Generic) { + /* + Previously, we used generateFullName() for this, but we + require some special formatting. + */ + out() << "<a href=\"" << linkForNode(it.value(), relative) << "\">"; + } + else if (listType == Obsolete) { + QString fileName = fileBase(it.value()) + "-obsolete." + fileExtension(); + QString link = QString("../" + it.value()->outputSubdirectory() + + QLatin1Char('/')) + fileName; + out() << "<a href=\"" << link << "\">"; + } QStringList pieces; if (it.value()->subType() == Node::QmlClass) @@ -4158,15 +4182,28 @@ void HtmlGenerator::generateManifestFile(QString manifest, QString element) else writer.writeCDATA(QString("No description available")); writer.writeEndElement(); // description + + // Add words from module name as tags (QtQuickControls -> qt,quick,controls) + QRegExp re("([A-Z][a-z0-9]+)"); + int pos = 0; + while ((pos = re.indexIn(project, pos)) != -1) { + tags << re.cap(1).toLower(); + pos += re.matchedLength(); + } tags += QSet<QString>::fromList(en->title().toLower().split(QLatin1Char(' '))); if (!tags.isEmpty()) { writer.writeStartElement("tags"); bool wrote_one = false; + // Exclude invalid and common words foreach (QString tag, tags) { + if (tag.length() < 2) + continue; if (tag.at(0).isDigit()) continue; if (tag.at(0) == '-') continue; + if (tag == QStringLiteral("qt")) + continue; if (tag.startsWith("example")) continue; if (tag.startsWith("chapter")) diff --git a/src/tools/qdoc/htmlgenerator.h b/src/tools/qdoc/htmlgenerator.h index f2efab78a1..cdf296e783 100644 --- a/src/tools/qdoc/htmlgenerator.h +++ b/src/tools/qdoc/htmlgenerator.h @@ -150,13 +150,14 @@ private: CodeMarker *marker); QString generateAllQmlMembersFile(const QmlClassNode* qml_cn, CodeMarker* marker); - QString generateLowStatusMemberFile(const InnerNode *inner, + QString generateLowStatusMemberFile(InnerNode *inner, CodeMarker *marker, CodeMarker::Status status); void generateClassHierarchy(const Node *relative, NodeMap &classMap); void generateAnnotatedList(const Node* relative, CodeMarker* marker, const NodeMap& nodeMap); void generateAnnotatedList(const Node* relative, CodeMarker* marker, const NodeList& nodes); - void generateCompactList(const Node *relative, + void generateCompactList(ListType listType, + const Node *relative, const NodeMap &classMap, bool includeAlphabet, QString commonPrefix = QString()); diff --git a/src/tools/qdoc/node.h b/src/tools/qdoc/node.h index 642bcec06a..d1a95358f0 100644 --- a/src/tools/qdoc/node.h +++ b/src/tools/qdoc/node.h @@ -167,7 +167,11 @@ public: void setAccess(Access access) { access_ = access; } void setLocation(const Location& location) { loc = location; } void setDoc(const Doc& doc, bool replace = false); - void setStatus(Status status) { status_ = status; } + void setStatus(Status status) { + if (status_ == Obsolete && status == Deprecated) + return; + status_ = status; + } void setThreadSafeness(ThreadSafeness safeness) { safeness_ = safeness; } void setSince(const QString &since); void setRelates(InnerNode* pseudoParent); @@ -218,6 +222,8 @@ public: QString url() const; virtual QString nameForLists() const { return name_; } virtual QString outputFileName() const { return QString(); } + virtual QString obsoleteLink() const { return QString(); } + virtual void setObsoleteLink(const QString& ) { }; Access access() const { return access_; } QString accessString() const; @@ -253,6 +259,7 @@ public: QmlClassNode* qmlClassNode(); ClassNode* declarativeCppNode(); const QString& outputSubdirectory() const { return outSubDir_; } + void setOutputSubdirectory(const QString& t) { outSubDir_ = t; } QString fullDocumentName() const; static QString cleanId(QString str); QString idForNode() const; @@ -430,6 +437,8 @@ public: ClassNode(InnerNode* parent, const QString& name); virtual ~ClassNode() { } virtual bool isClass() const { return true; } + virtual QString obsoleteLink() const { return obsoleteLink_; } + virtual void setObsoleteLink(const QString& t) { obsoleteLink_ = t; }; void addBaseClass(Access access, ClassNode* node, @@ -455,6 +464,7 @@ private: QList<RelatedClass> ignoredBases; bool abstract_; QString sname; + QString obsoleteLink_; QmlClassNode* qmlelement; }; @@ -561,6 +571,8 @@ public: virtual void setAbstract(bool b) { abstract_ = b; } virtual bool isInternal() const { return (status() == Internal); } virtual QString qmlFullBaseName() const; + virtual QString obsoleteLink() const { return obsoleteLink_; } + virtual void setObsoleteLink(const QString& t) { obsoleteLink_ = t; }; const ImportList& importList() const { return importList_; } void setImportList(const ImportList& il) { importList_ = il; } const QString& qmlBaseName() const { return baseName_; } @@ -582,6 +594,7 @@ private: bool cnodeRequired_; ClassNode* cnode_; QString baseName_; + QString obsoleteLink_; QmlClassNode* baseNode_; ImportList importList_; }; diff --git a/src/tools/qdoc/qdocdatabase.cpp b/src/tools/qdoc/qdocdatabase.cpp index 30a9efaada..674917f6dc 100644 --- a/src/tools/qdoc/qdocdatabase.cpp +++ b/src/tools/qdoc/qdocdatabase.cpp @@ -430,6 +430,7 @@ void QDocDatabase::buildCollections() findAllLegaleseTexts(treeRoot()); findAllNamespaces(treeRoot()); findAllSince(treeRoot()); + findAllObsoleteThings(treeRoot()); } /*! @@ -451,9 +452,6 @@ void QDocDatabase::findAllClasses(const InnerNode* node) 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) @@ -548,6 +546,98 @@ void QDocDatabase::findAllNamespaces(const InnerNode* node) } /*! + Finds all nodes with status = Obsolete and sorts them into + maps. They can be C++ classes, QML types, or they can be + functions, enum types, typedefs, methods, etc. + */ +void QDocDatabase::findAllObsoleteThings(const InnerNode* node) +{ + NodeList::const_iterator c = node->childNodes().constBegin(); + while (c != node->childNodes().constEnd()) { + if ((*c)->access() != Node::Private) { + QString name = (*c)->name(); + if ((*c)->status() == Node::Obsolete) { + if ((*c)->type() == Node::Class) { + if ((*c)->parent() && (*c)->parent()->type() == Node::Namespace && + !(*c)->parent()->name().isEmpty()) + name = (*c)->parent()->name() + "::" + name; + obsoleteClasses_.insert(name, *c); + } + else if ((*c)->type() == Node::Document && (*c)->subType() == Node::QmlClass) { + if (name.startsWith(QLatin1String("QML:"))) + name = name.mid(4); + name = (*c)->qmlModuleIdentifier() + "::" + name; + obsoleteQmlTypes_.insert(name,*c); + } + } + else if ((*c)->type() == Node::Class) { + InnerNode* n = static_cast<InnerNode*>(*c); + bool inserted = false; + NodeList::const_iterator p = n->childNodes().constBegin(); + while (p != n->childNodes().constEnd()) { + if ((*p)->access() != Node::Private) { + switch ((*p)->type()) { + case Node::Enum: + case Node::Typedef: + case Node::Function: + case Node::Property: + case Node::Variable: + if ((*p)->status() == Node::Obsolete) { + if ((*c)->parent() && (*c)->parent()->type() == Node::Namespace && + !(*c)->parent()->name().isEmpty()) + name = (*c)->parent()->name() + "::" + name; + classesWithObsoleteMembers_.insert(name, *c); + inserted = true; + } + break; + default: + break; + } + } + if (inserted) + break; + ++p; + } + } + else if ((*c)->type() == Node::Document && (*c)->subType() == Node::QmlClass) { + InnerNode* n = static_cast<InnerNode*>(*c); + bool inserted = false; + NodeList::const_iterator p = n->childNodes().constBegin(); + while (p != n->childNodes().constEnd()) { + if ((*p)->access() != Node::Private) { + switch ((*c)->type()) { + case Node::QmlProperty: + case Node::QmlSignal: + case Node::QmlSignalHandler: + case Node::QmlMethod: + if ((*c)->parent()) { + Node* parent = (*c)->parent(); + if (parent->subType() == Node::QmlPropertyGroup && parent->parent()) + parent = parent->parent(); + if (parent && parent->subType() == Node::QmlClass && !parent->name().isEmpty()) + name = parent->name() + "::" + name; + } + qmlTypesWithObsoleteMembers_.insert(name,*c); + inserted = true; + break; + default: + break; + } + } + if (inserted) + break; + ++p; + } + } + else if ((*c)->isInnerNode()) { + findAllObsoleteThings(static_cast<InnerNode*>(*c)); + } + } + ++c; + } +} + +/*! Finds all the nodes where a \e{since} command appeared in the qdoc comment and sorts them into maps according to the kind of node. diff --git a/src/tools/qdoc/qdocdatabase.h b/src/tools/qdoc/qdocdatabase.h index 19dde361f8..d97fb3809a 100644 --- a/src/tools/qdoc/qdocdatabase.h +++ b/src/tools/qdoc/qdocdatabase.h @@ -113,6 +113,7 @@ class QDocDatabase void findAllFunctions(const InnerNode *node); void findAllLegaleseTexts(const InnerNode *node); void findAllNamespaces(const InnerNode *node); + void findAllObsoleteThings(const InnerNode* node); void findAllSince(const InnerNode *node); void buildCollections(); @@ -121,6 +122,9 @@ class QDocDatabase NodeMap& getMainClasses() { return mainClasses_; } NodeMap& getCompatibilityClasses() { return compatClasses_; } NodeMap& getObsoleteClasses() { return obsoleteClasses_; } + NodeMap& getClassesWithObsoleteMembers() { return classesWithObsoleteMembers_; } + NodeMap& getObsoleteQmlTypes() { return obsoleteQmlTypes_; } + NodeMap& getQmlTypesWithObsoleteMembers() { return qmlTypesWithObsoleteMembers_; } NodeMap& getNamespaces() { return namespaceIndex_; } NodeMap& getServiceClasses() { return serviceClasses_; } NodeMap& getQmlTypes() { return qmlClasses_; } @@ -223,6 +227,9 @@ class QDocDatabase NodeMap mainClasses_; NodeMap compatClasses_; NodeMap obsoleteClasses_; + NodeMap classesWithObsoleteMembers_; + NodeMap obsoleteQmlTypes_; + NodeMap qmlTypesWithObsoleteMembers_; NodeMap namespaceIndex_; NodeMap serviceClasses_; NodeMap qmlClasses_; diff --git a/src/tools/qdoc/qdocindexfiles.cpp b/src/tools/qdoc/qdocindexfiles.cpp index d7a51da952..59adc63c9e 100644 --- a/src/tools/qdoc/qdocindexfiles.cpp +++ b/src/tools/qdoc/qdocindexfiles.cpp @@ -136,6 +136,7 @@ void QDocIndexFiles::readIndexFile(const QString& path) QDir installDir(path.section('/', 0, -3) + "/outputdir"); indexUrl = installDir.relativeFilePath(path).section('/', 0, -2); } + project_ = indexElement.attribute("project", QString()); basesList_.clear(); relatedList_.clear(); @@ -459,7 +460,7 @@ void QDocIndexFiles::readIndexSection(const QDomElement& element, else if (status == "obsolete") node->setStatus(Node::Obsolete); else if (status == "deprecated") - node->setStatus(Node::Deprecated); + node->setStatus(Node::Obsolete); else if (status == "preliminary") node->setStatus(Node::Preliminary); else if (status == "commendable") @@ -503,6 +504,7 @@ void QDocIndexFiles::readIndexSection(const QDomElement& element, Doc doc(location, location, " ", emptySet); // placeholder node->setDoc(doc); node->setIndexNodeFlag(); + node->setOutputSubdirectory(project_.toLower()); if (node->isInnerNode()) { InnerNode* inner = static_cast<InnerNode*>(node); @@ -712,7 +714,7 @@ bool QDocIndexFiles::generateIndexSection(QXmlStreamWriter& writer, status = "obsolete"; break; case Node::Deprecated: - status = "deprecated"; + status = "obsolete"; break; case Node::Preliminary: status = "preliminary"; @@ -1203,6 +1205,7 @@ void QDocIndexFiles::generateIndex(const QString& fileName, writer.writeAttribute("url", url); writer.writeAttribute("title", title); writer.writeAttribute("version", qdb_->version()); + writer.writeAttribute("project", g->config()->getString(CONFIG_PROJECT)); generateIndexSections(writer, qdb_->treeRoot(), generateInternalNodes); diff --git a/src/tools/qdoc/qdocindexfiles.h b/src/tools/qdoc/qdocindexfiles.h index 2b1eb1951e..e4a83176a2 100644 --- a/src/tools/qdoc/qdocindexfiles.h +++ b/src/tools/qdoc/qdocindexfiles.h @@ -86,6 +86,7 @@ class QDocIndexFiles static QDocIndexFiles* qdocIndexFiles_; QDocDatabase* qdb_; Generator* gen_; + QString project_; QList<QPair<ClassNode*,QString> > basesList_; QList<QPair<FunctionNode*,QString> > relatedList_; diff --git a/src/tools/qdoc/qmlvisitor.cpp b/src/tools/qdoc/qmlvisitor.cpp index ffe1afe28b..ac659720b2 100644 --- a/src/tools/qdoc/qmlvisitor.cpp +++ b/src/tools/qdoc/qmlvisitor.cpp @@ -316,7 +316,7 @@ void QmlDocVisitor::applyMetacommands(QQmlJS::AST::SourceLocation, } } else if (command == COMMAND_DEPRECATED) { - node->setStatus(Node::Deprecated); + node->setStatus(Node::Obsolete); } else if (command == COMMAND_INQMLMODULE) { qdb->addToQmlModule(args[0].first,node); |