/**************************************************************************** ** ** Copyright (C) 2019 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the tools applications of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 as published by the Free Software ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ /* tree.h */ #ifndef TREE_H #define TREE_H #include "node.h" #include QT_BEGIN_NAMESPACE class QStringList; class QDocDatabase; struct TargetRec { public: enum TargetType { Unknown, Target, Keyword, Contents, Class, Function, Page, Subtitle }; TargetRec(const QString &name, const QString &title, TargetRec::TargetType type, Node *node, int priority) : node_(node), ref_(name), title_(title), priority_(priority), type_(type) { // Discard the dedicated ref for keywords - they always // link to the top of the QDoc comment they appear in if (type == Keyword) ref_.clear(); } bool isEmpty() const { return ref_.isEmpty(); } Node::Genus genus() { return (node_ ? node_->genus() : Node::DontCare); } Node *node_; QString ref_; QString title_; int priority_; TargetType type_; }; struct TargetLoc { public: TargetLoc(const Node *loc, const QString &t, const QString &fileName, const QString &text, bool broken) : loc_(loc), target_(t), fileName_(fileName), text_(text), broken_(broken) { } const Node *loc_; QString target_; QString fileName_; QString text_; bool broken_; }; typedef QMultiMap TargetMap; typedef QMultiMap PageNodeMultiMap; typedef QMap QmlTypeMap; typedef QMultiMap ExampleNodeMap; typedef QVector TargetList; typedef QMap TargetListMap; class Tree { friend class QDocForest; friend class QDocDatabase; private: // Note the constructor and destructor are private. typedef QMap RoleMap; typedef QMap PropertyMap; Tree(const QString &camelCaseModuleName, QDocDatabase *qdb); ~Tree(); public: // Of necessity, a few public functions remain. const QString &camelCaseModuleName() const { return camelCaseModuleName_; } const QString &physicalModuleName() const { return physicalModuleName_; } const QString &indexFileName() const { return indexFileName_; } long incrementLinkCount() { return --linkCount_; } void clearLinkCount() { linkCount_ = 0; } long linkCount() const { return linkCount_; } const QString &indexTitle() const { return indexTitle_; } void setIndexTitle(const QString &t) { indexTitle_ = t; } NodeList &proxies() { return proxies_; } void appendProxy(ProxyNode *t) { proxies_.append(t); } void addToDontDocumentMap(QString &arg); void markDontDocumentNodes(); private: // The rest of the class is private. Aggregate *findAggregate(const QString &name); Node *findNodeForInclude(const QStringList &path) const; ClassNode *findClassNode(const QStringList &path, const Node *start = nullptr) const; NamespaceNode *findNamespaceNode(const QStringList &path) const; const FunctionNode *findFunctionNode(const QStringList &path, const Parameters ¶meters, const Node *relative, Node::Genus genus) const; Node *findNodeRecursive(const QStringList &path, int pathIndex, const Node *start, bool (Node::*)() const) const; const Node *findNodeForTarget(const QStringList &path, const QString &target, const Node *node, int flags, Node::Genus genus, QString &ref) const; const Node *matchPathAndTarget(const QStringList &path, int idx, const QString &target, const Node *node, int flags, Node::Genus genus, QString &ref) const; const Node *findNode(const QStringList &path, const Node *relative, int flags, Node::Genus genus) const; QmlTypeNode *findQmlTypeNode(const QStringList &path); Node *findNodeByNameAndType(const QStringList &path, bool (Node::*isMatch)() const) const; Aggregate *findRelatesNode(const QStringList &path); QString getRef(const QString &target, const Node *node) const; void insertTarget(const QString &name, const QString &title, TargetRec::TargetType type, Node *node, int priority); void resolveTargets(Aggregate *root); const Node *findUnambiguousTarget(const QString &target, Node::Genus genus, QString &ref) const; const PageNode *findPageNodeByTitle(const QString &title) const; void addPropertyFunction(PropertyNode *property, const QString &funcName, PropertyNode::FunctionRole funcRole); void resolveBaseClasses(Aggregate *n); void resolveBaseClassesHelper(int pass, ClassNode *cn); void resolvePropertyOverriddenFromPtrs(Aggregate *n); void resolveProperties(); void resolveCppToQmlLinks(); void resolveUsingClauses(Aggregate *parent = nullptr); void removePrivateAndInternalBases(NamespaceNode *rootNode); NamespaceNode *root() { return &root_; } const NamespaceNode *root() const { return &root_; } ClassList allBaseClasses(const ClassNode *classe) const; QString refForAtom(const Atom *atom); CNMap *getCollectionMap(Node::NodeType type); const CNMap &groups() const { return groups_; } const CNMap &modules() const { return modules_; } const CNMap &qmlModules() const { return qmlModules_; } const CNMap &jsModules() const { return jsModules_; } CollectionNode *getCollection(const QString &name, Node::NodeType type); CollectionNode *findCollection(const QString &name, Node::NodeType type); CollectionNode *findGroup(const QString &name) { return findCollection(name, Node::Group); } CollectionNode *findModule(const QString &name) { return findCollection(name, Node::Module); } CollectionNode *findQmlModule(const QString &name) { return findCollection(name, Node::QmlModule); } CollectionNode *findJsModule(const QString &name) { return findCollection(name, Node::JsModule); } CollectionNode *addGroup(const QString &name) { return findGroup(name); } CollectionNode *addModule(const QString &name) { return findModule(name); } CollectionNode *addQmlModule(const QString &name) { return findQmlModule(name); } CollectionNode *addJsModule(const QString &name) { return findJsModule(name); } CollectionNode *addToGroup(const QString &name, Node *node); CollectionNode *addToModule(const QString &name, Node *node); CollectionNode *addToQmlModule(const QString &name, Node *node); CollectionNode *addToJsModule(const QString &name, Node *node); QmlTypeNode *lookupQmlType(const QString &name) const { return qmlTypeMap_.value(name); } Aggregate *lookupQmlBasicType(const QString &name) const { return qmlTypeMap_.value(name); } void insertQmlType(const QString &key, QmlTypeNode *n); void addExampleNode(ExampleNode *n) { exampleNodeMap_.insert(n->title(), n); } ExampleNodeMap &exampleNodeMap() { return exampleNodeMap_; } void setIndexFileName(const QString &t) { indexFileName_ = t; } bool treeHasBeenAnalyzed() const { return treeHasBeenAnalyzed_; } bool docsHaveBeenGenerated() const { return docsHaveBeenGenerated_; } void setTreeHasBeenAnalyzed() { treeHasBeenAnalyzed_ = true; } void setdocsHaveBeenGenerated() { docsHaveBeenGenerated_ = true; } QString getNewLinkTarget(const Node *locNode, const Node *t, const QString &fileName, QString &text, bool broken); TargetList *getTargetList(const QString &module); QStringList getTargetListKeys() { return targetListMap_->keys(); } FunctionNode *findFunctionNodeForTag(const QString &tag, Aggregate *parent = nullptr); FunctionNode *findMacroNode(const QString &t, const Aggregate *parent = nullptr); private: bool treeHasBeenAnalyzed_; bool docsHaveBeenGenerated_; long linkCount_; QString camelCaseModuleName_; QString physicalModuleName_; QString indexFileName_; QString indexTitle_; QDocDatabase *qdb_; NamespaceNode root_; PropertyMap unresolvedPropertyMap; PageNodeMultiMap pageNodesByTitle_; TargetMap nodesByTargetRef_; TargetMap nodesByTargetTitle_; CNMap groups_; CNMap modules_; CNMap qmlModules_; CNMap jsModules_; QmlTypeMap qmlTypeMap_; ExampleNodeMap exampleNodeMap_; TargetListMap *targetListMap_; NodeList proxies_; NodeMap dontDocumentMap_; }; QT_END_NAMESPACE #endif