/**************************************************************************** ** ** 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$ ** ****************************************************************************/ #ifndef NODE_H #define NODE_H #include "doc.h" #include "parameters.h" #include #include #include #include #include QT_BEGIN_NAMESPACE class Node; class Tree; class EnumNode; class PageNode; class ClassNode; class Aggregate; class ExampleNode; class TypedefNode; class QmlTypeNode; class QDocDatabase; class FunctionNode; class PropertyNode; class CollectionNode; class QmlPropertyNode; class SharedCommentNode; typedef QMap FunctionMap; typedef QList NodeList; typedef QVector ClassList; typedef QVector NodeVector; typedef QMap NodeMap; typedef QMap NodeMapMap; typedef QMultiMap NodeMultiMap; typedef QMap NodeMultiMapMap; typedef QMap CNMap; typedef QMultiMap CNMultiMap; typedef QVector CollectionList; class Node { Q_DECLARE_TR_FUNCTIONS(QDoc::Node) public: enum NodeType : unsigned char { NoType, Namespace, Class, Struct, Union, HeaderFile, Page, Enum, Example, ExternalPage, Function, Typedef, Property, Variable, Group, Module, QmlType, QmlModule, QmlProperty, QmlBasicType, JsType, JsModule, JsProperty, JsBasicType, SharedComment, Collection, Proxy, LastType }; enum Genus : unsigned char { DontCare, CPP, JS, QML, DOC }; enum Access : unsigned char { Public, Protected, Private }; enum Status : unsigned char { Obsolete, Deprecated, Preliminary, Active, Internal, DontDocument }; // don't reorder this enum enum ThreadSafeness : unsigned char { UnspecifiedSafeness, NonReentrant, Reentrant, ThreadSafe }; enum LinkType : unsigned char { StartLink, NextLink, PreviousLink, ContentsLink }; enum PageType : unsigned char { NoPageType, AttributionPage, ApiPage, ArticlePage, ExamplePage, HowToPage, OverviewPage, TutorialPage, FAQPage, OnBeyondZebra }; enum FlagValue { FlagValueDefault = -1, FlagValueFalse = 0, FlagValueTrue = 1 }; virtual ~Node() { } virtual Node *clone(Aggregate *) { return nullptr; } // currently only FunctionNode virtual Tree *tree() const; Aggregate *root() const; NodeType nodeType() const { return nodeType_; } QString nodeTypeString() const; bool changeType(NodeType from, NodeType to); Genus genus() const { return genus_; } void setGenus(Genus t) { genus_ = t; } static Genus getGenus(NodeType t); PageType pageType() const { return pageType_; } QString pageTypeString() const; void setPageType(PageType t) { pageType_ = t; } void setPageType(const QString &t); static PageType getPageType(NodeType t); bool isActive() const { return status_ == Active; } bool isAnyType() const { return true; } bool isClass() const { return nodeType_ == Class; } bool isCppNode() const { return genus() == CPP; } bool isDeprecated() const { return (status_ == Deprecated); } bool isDontDocument() const { return (status_ == DontDocument); } bool isEnumType() const { return nodeType_ == Enum; } bool isExample() const { return nodeType_ == Example; } bool isExternalPage() const { return nodeType_ == ExternalPage; } bool isFunction(Genus g = DontCare) const { return (nodeType_ != Function ? false : (genus() == g ? true : g == DontCare)); } bool isGroup() const { return nodeType_ == Group; } bool isHeader() const { return nodeType_ == HeaderFile; } bool isIndexNode() const { return indexNodeFlag_; } bool isJsBasicType() const { return nodeType_ == JsBasicType; } bool isJsModule() const { return nodeType_ == JsModule; } bool isJsNode() const { return genus() == JS; } bool isJsProperty() const { return nodeType_ == JsProperty; } bool isJsType() const { return nodeType_ == JsType; } bool isModule() const { return nodeType_ == Module; } bool isNamespace() const { return nodeType_ == Namespace; } bool isObsolete() const { return (status_ == Obsolete); } bool isPage() const { return nodeType_ == Page; } bool isPreliminary() const { return (status_ == Preliminary); } bool isPrivate() const { return access_ == Private; } bool isProperty() const { return nodeType_ == Property; } bool isProxyNode() const { return nodeType_ == Proxy; } bool isPublic() const { return access_ == Public; } bool isProtected() const { return access_ == Protected; } bool isQmlBasicType() const { return nodeType_ == QmlBasicType; } bool isQmlModule() const { return nodeType_ == QmlModule; } bool isQmlNode() const { return genus() == QML; } bool isQmlProperty() const { return nodeType_ == QmlProperty; } bool isQmlType() const { return nodeType_ == QmlType; } bool isRelatedNonmember() const { return relatedNonmember_; } bool isStruct() const { return nodeType_ == Struct; } bool isSharedCommentNode() const { return nodeType_ == SharedComment; } bool isTypeAlias() const { return nodeType_ == Typedef; } bool isTypedef() const { return nodeType_ == Typedef; } bool isUnion() const { return nodeType_ == Union; } bool isVariable() const { return nodeType_ == Variable; } bool isGenericCollection() const { return (nodeType_ == Node::Collection); } virtual bool isAbstract() const { return false; } virtual bool isAggregate() const { return false; } // means "can have children" virtual bool isFirstClassAggregate() const { return false; } // Aggregate but not proxy or prop group" virtual bool isAlias() const { return false; } virtual bool isAttached() const { return false; } virtual bool isClassNode() const { return false; } virtual bool isCollectionNode() const { return false; } virtual bool isDefault() const { return false; } virtual bool isInternal() const; virtual bool isMacro() const { return false; } virtual bool isPageNode() const { return false; } // means "generates a doc page" virtual bool isQtQuickNode() const { return false; } virtual bool isReadOnly() const { return false; } virtual bool isRelatableType() const { return false; } virtual bool isMarkedReimp() const { return false; } virtual bool isPropertyGroup() const { return false; } virtual bool isStatic() const { return false; } virtual bool isTextPageNode() const { return false; } // means PageNode but not Aggregate virtual bool isWrapper() const; QString plainName() const; QString plainFullName(const Node *relative = nullptr) const; QString plainSignature() const; QString fullName(const Node *relative = nullptr) const; virtual QString signature(bool , bool ) const { return plainName(); } const QString &fileNameBase() const { return fileNameBase_; } bool hasFileNameBase() const { return !fileNameBase_.isEmpty(); } void setFileNameBase(const QString &t) { fileNameBase_ = t; } void setAccess(Access t) { access_ = t; } void setLocation(const Location &t); void setDoc(const Doc &doc, bool replace = false); void setStatus(Status t) { if (status_ == Obsolete && t == Deprecated) return; status_ = t; } void setThreadSafeness(ThreadSafeness t) { safeness_ = t; } void setSince(const QString &since); void setPhysicalModuleName(const QString &name) { physicalModuleName_ = name; } void setUrl(const QString &url) { url_ = url; } void setTemplateStuff(const QString &t) { templateStuff_ = t; } void setReconstitutedBrief(const QString &t) { reconstitutedBrief_ = t; } void setParent(Aggregate *n) { parent_ = n; } void setIndexNodeFlag(bool isIndexNode = true) { indexNodeFlag_ = isIndexNode; } void setHadDoc() { hadDoc_ = true; } virtual void setRelatedNonmember(bool b) { relatedNonmember_ = b; } virtual void setOutputFileName(const QString &) { } virtual void addMember(Node *) { } virtual bool hasMembers() const { return false; } virtual bool hasNamespaces() const { return false; } virtual bool hasClasses() const { return false; } virtual void setAbstract(bool ) { } virtual void setWrapper() { } virtual void getMemberNamespaces(NodeMap &) { } virtual void getMemberClasses(NodeMap &) const { } virtual void setDataType(const QString &) { } virtual bool wasSeen() const { return false; } virtual void appendGroupName(const QString &) { } virtual QString element() const { return QString(); } virtual void setNoAutoList(bool ) { } virtual bool docMustBeGenerated() const { return false; } virtual QString title() const { return name(); } virtual QString subtitle() const { return QString(); } virtual QString fullTitle() const { return name(); } virtual bool setTitle(const QString &) { return false; } virtual bool setSubtitle(const QString &) { return false; } void markInternal() { setAccess(Private); setStatus(Internal); } virtual void markDefault() { } virtual void markReadOnly(bool ) { } bool match(const QVector &types) const; Aggregate *parent() const { return parent_; } const QString &name() const { return name_; } QString physicalModuleName() const; QString url() const { return url_; } virtual QString nameForLists() const { return name_; } virtual QString outputFileName() const { return QString(); } virtual QString obsoleteLink() const { return QString(); } virtual void setObsoleteLink(const QString &) { } virtual void setQtVariable(const QString &) { } virtual QString qtVariable() const { return QString(); } virtual bool hasTag(const QString &) const { return false; } const QMap > &links() const { return linkMap_; } void setLink(LinkType linkType, const QString &link, const QString &desc); Access access() const { return access_; } QString accessString() const; const Location &declLocation() const { return declLocation_; } const Location &defLocation() const { return defLocation_; } const Location &location() const { return (defLocation_.isEmpty() ? declLocation_ : defLocation_); } const Doc &doc() const { return doc_; } bool isInAPI() const { return !isPrivate() && !isInternal() && hasDoc(); } bool hasDoc() const { return (hadDoc_ || !doc_.isEmpty()); } bool hadDoc() const { return hadDoc_; } Status status() const { return status_; } ThreadSafeness threadSafeness() const; ThreadSafeness inheritedThreadSafeness() const; QString since() const { return since_; } QString templateStuff() const { return templateStuff_; } const QString &reconstitutedBrief() const { return reconstitutedBrief_; } QString nodeSubtypeString() const; virtual void addPageKeywords(const QString &) { } bool isSharingComment() const { return (sharedCommentNode_ != nullptr); } bool hasSharedDoc() const; void setSharedCommentNode(SharedCommentNode *t) { sharedCommentNode_ = t; } SharedCommentNode *sharedCommentNode() { return sharedCommentNode_; } //QString guid() const; QString extractClassName(const QString &string) const; virtual QString qmlTypeName() const { return name_; } virtual QString qmlFullBaseName() const { return QString(); } virtual QString logicalModuleName() const { return QString(); } virtual QString logicalModuleVersion() const { return QString(); } virtual QString logicalModuleIdentifier() const { return QString(); } virtual void setLogicalModuleInfo(const QString &) { } virtual void setLogicalModuleInfo(const QStringList &) { } virtual CollectionNode *logicalModule() const { return nullptr; } virtual void setQmlModule(CollectionNode *) { } virtual ClassNode *classNode() { return nullptr; } virtual void setClassNode(ClassNode *) { } QmlTypeNode *qmlTypeNode(); ClassNode *declarativeCppNode(); const QString &outputSubdirectory() const { return outSubDir_; } virtual void setOutputSubdirectory(const QString &t) { outSubDir_ = t; } QString fullDocumentName() const; QString qualifyCppName(); QString qualifyQmlName(); QString unqualifyQmlName(); QString qualifyWithParentName(); static QString cleanId(const QString &str); static FlagValue toFlagValue(bool b); static bool fromFlagValue(FlagValue fv, bool defaultValue); static QString pageTypeString(PageType t); static QString nodeTypeString(NodeType t); static QString nodeSubtypeString(unsigned char t); static void initialize(); static NodeType goal(const QString &t) { return goals_.value(t); } static bool nodeNameLessThan(const Node *first, const Node *second); protected: Node(NodeType type, Aggregate *parent, const QString &name); private: NodeType nodeType_; Genus genus_; Access access_; ThreadSafeness safeness_; PageType pageType_; Status status_; bool indexNodeFlag_ : 1; bool relatedNonmember_ : 1; bool hadDoc_ : 1; Aggregate *parent_; SharedCommentNode *sharedCommentNode_; QString name_; Location declLocation_; Location defLocation_; Doc doc_; QMap > linkMap_; QString fileNameBase_; QString physicalModuleName_; QString url_; QString since_; QString templateStuff_; QString reconstitutedBrief_; //mutable QString uuid_; QString outSubDir_; static QStringMap operators_; static int propertyGroupCount_; static QMap goals_; }; class PageNode : public Node { public: PageNode(Aggregate *parent, const QString &name) : Node(Page, parent, name), noAutoList_(false) { } PageNode(NodeType type, Aggregate *parent, const QString &name) : Node(type, parent, name), noAutoList_(false) { } PageNode(Aggregate *parent, const QString &name, PageType ptype) : Node(Page, parent, name), noAutoList_(false) { setPageType(ptype); } bool isPageNode() const override { return true; } bool isTextPageNode() const override { return !isAggregate(); } // PageNode but not Aggregate QString title() const override { return title_; } QString subtitle() const override { return subtitle_; } QString fullTitle() const override; bool setTitle(const QString &title) override; bool setSubtitle(const QString &subtitle) override { subtitle_ = subtitle; return true; } QString nameForLists() const override { return title(); } virtual QString imageFileName() const { return QString(); } virtual void setImageFileName(const QString &) { } bool noAutoList() const { return noAutoList_; } void setNoAutoList(bool b) override { noAutoList_ = b; } const QStringList &groupNames() const { return groupNames_; } void appendGroupName(const QString &t) override { groupNames_.append(t); } const QStringList &pageKeywords() const { return pageKeywds_; } void addPageKeywords(const QString &t) override { pageKeywds_ << t; } void setOutputFileName(const QString &f) override { outputFileName_ = f; } QString outputFileName() const override { return outputFileName_; } protected: friend class Node; protected: bool noAutoList_; QString title_; QString subtitle_; QString outputFileName_; QStringList groupNames_; QStringList pageKeywds_; }; class ExternalPageNode : public PageNode { public: ExternalPageNode(Aggregate *parent, const QString &url) : PageNode(Node::ExternalPage, parent, url) { setPageType(Node::ArticlePage); setUrl(url); } }; class Aggregate : public PageNode { public: Node *findChildNode(const QString &name, Node::Genus genus, int findFlags = 0) const; Node *findNonfunctionChild(const QString &name, bool (Node:: *) () const); void findChildren(const QString &name, NodeVector &nodes) const; FunctionNode *findFunctionChild(const QString &name, const Parameters ¶meters); FunctionNode *findFunctionChild(const FunctionNode *clone); void normalizeOverloads(); void markUndocumentedChildrenInternal(); bool isAggregate() const override { return true; } const EnumNode *findEnumNodeForValue(const QString &enumValue) const; int count() const { return children_.size(); } const NodeList &childNodes() const { return children_; } const NodeList &nonfunctionList(); NodeList::ConstIterator constBegin() const { return children_.constBegin(); } NodeList::ConstIterator constEnd() const { return children_.constEnd(); } void addIncludeFile(const QString &includeFile); void setIncludeFiles(const QStringList &includeFiles); const QStringList &includeFiles() const { return includeFiles_; } QStringList primaryKeys(); QmlPropertyNode *hasQmlProperty(const QString &) const; QmlPropertyNode *hasQmlProperty(const QString &, bool attached) const; virtual QmlTypeNode *qmlBaseNode() const { return nullptr; } void addChildByTitle(Node *child, const QString &title); void printChildren(const QString &title); void addChild(Node *child); void adoptChild(Node *child); void setOutputSubdirectory(const QString &t) override; FunctionMap &functionMap() { return functionMap_; } void findAllFunctions(NodeMapMap &functionIndex); void findAllNamespaces(NodeMultiMap &namespaces); void findAllAttributions(NodeMultiMap &attributions); bool hasObsoleteMembers() const; void findAllObsoleteThings(); void findAllClasses(); void findAllSince(); void resolveQmlInheritance(); bool hasOverloads(const FunctionNode *fn) const; void appendToRelatedByProxy(const NodeList &t) { relatedByProxy_.append(t); } NodeList &relatedByProxy() { return relatedByProxy_; } QString typeWord(bool cap) const; protected: Aggregate(NodeType type, Aggregate *parent, const QString &name) : PageNode(type, parent, name), functionCount_(0) { } ~Aggregate() override; void removeFunctionNode(FunctionNode *fn); private: friend class Node; void addFunction(FunctionNode *fn); void adoptFunction(FunctionNode *fn); static bool isSameSignature(const FunctionNode *f1, const FunctionNode *f2); protected: NodeList children_; NodeList relatedByProxy_; private: QStringList includeFiles_; NodeList enumChildren_; NodeMap nonfunctionMap_; NodeList nonfunctionList_; protected: int functionCount_; FunctionMap functionMap_; }; class ProxyNode : public Aggregate { public: ProxyNode(Aggregate *parent, const QString &name); bool docMustBeGenerated() const override { return true; } bool isRelatableType() const override { return true; } }; class NamespaceNode : public Aggregate { public: NamespaceNode(Aggregate *parent, const QString &name) : Aggregate(Namespace, parent, name), seen_(false), tree_(nullptr), docNode_(nullptr) { } ~NamespaceNode() override; Tree *tree() const override { return (parent() ? parent()->tree() : tree_); } bool isFirstClassAggregate() const override { return true; } bool isRelatableType() const override { return true; } bool wasSeen() const override { return seen_; } void markSeen() { seen_ = true; } void markNotSeen() { seen_ = false; } void setTree(Tree *t) { tree_ = t; } const NodeList &includedChildren() const; void includeChild(Node *child); QString whereDocumented() const { return whereDocumented_; } void setWhereDocumented(const QString &t) { whereDocumented_ = t; } bool isDocumentedHere() const; bool hasDocumentedChildren() const; void reportDocumentedChildrenInUndocumentedNamespace() const; bool docMustBeGenerated() const override; void setDocNode(NamespaceNode *ns) { docNode_ = ns; } NamespaceNode *docNode() const { return docNode_; } private: bool seen_; Tree *tree_; QString whereDocumented_; NamespaceNode *docNode_; NodeList includedChildren_; }; struct RelatedClass { RelatedClass() { } // constructor for resolved base class RelatedClass(Node::Access access, ClassNode *node) : access_(access), node_(node) { } // constructor for unresolved base class RelatedClass(Node::Access access, const QStringList &path, const QString &signature) : access_(access), node_(nullptr), path_(path), signature_(signature) { } QString accessString() const; bool isPrivate() const { return (access_ == Node::Private); } Node::Access access_; ClassNode *node_; QStringList path_; QString signature_; }; struct UsingClause { UsingClause() { } UsingClause(const QString &signature) : node_(nullptr), signature_(signature) { } const QString &signature() const { return signature_; } const Node *node() { return node_; } void setNode(const Node *n) { node_ = n; } const Node *node_; QString signature_; }; class ClassNode : public Aggregate { public: ClassNode(NodeType type, Aggregate *parent, const QString &name) : Aggregate(type, parent, name), abstract_(false), wrapper_(false), qmlelement(nullptr) { } bool isFirstClassAggregate() const override { return true; } bool isClassNode() const override { return true; } bool isRelatableType() const override { return true; } bool isWrapper() const override { return wrapper_; } QString obsoleteLink() const override { return obsoleteLink_; } void setObsoleteLink(const QString &t) override { obsoleteLink_ = t; } void setWrapper() override { wrapper_ = true; } void addResolvedBaseClass(Access access, ClassNode *node); void addDerivedClass(Access access, ClassNode *node); void addUnresolvedBaseClass(Access access, const QStringList &path, const QString &signature); void addUnresolvedUsingClause(const QString &signature); void removePrivateAndInternalBases(); void resolvePropertyOverriddenFromPtrs(PropertyNode *pn); QVector &baseClasses() { return bases_; } QVector &derivedClasses() { return derived_; } QVector &ignoredBaseClasses() { return ignoredBases_; } QVector &usingClauses() { return usingClauses_; } const QVector &baseClasses() const { return bases_; } const QVector &derivedClasses() const { return derived_; } const QVector &ignoredBaseClasses() const { return ignoredBases_; } const QVector &usingClauses() const { return usingClauses_; } QmlTypeNode *qmlElement() { return qmlelement; } void setQmlElement(QmlTypeNode *qcn) { qmlelement = qcn; } bool isAbstract() const override { return abstract_; } void setAbstract(bool b) override { abstract_ = b; } PropertyNode *findPropertyNode(const QString &name); QmlTypeNode *findQmlBaseNode(); FunctionNode *findOverriddenFunction(const FunctionNode *fn); PropertyNode *findOverriddenProperty(const FunctionNode *fn); bool docMustBeGenerated() const override; private: void promotePublicBases(const QVector &bases); private: QVector bases_; QVector derived_; QVector ignoredBases_; QVector usingClauses_; bool abstract_; bool wrapper_; QString obsoleteLink_; QmlTypeNode *qmlelement; }; class HeaderNode : public Aggregate { public: HeaderNode(Aggregate *parent, const QString &name); bool docMustBeGenerated() const override; bool isFirstClassAggregate() const override { return true; } bool isRelatableType() const override { return true; } QString title() const override { return (title_.isEmpty() ? name() : title_); } QString subtitle() const override { return subtitle_; } QString fullTitle() const override { return (title_.isEmpty() ? name() : name() + " - " + title_); } bool setTitle(const QString &title) override { title_ = title; return true; } bool setSubtitle(const QString &subtitle) override { subtitle_ = subtitle; return true; } QString nameForLists() const override { return title(); } bool hasDocumentedChildren() const; private: QString title_; QString subtitle_; }; class ExampleNode : public PageNode { public: ExampleNode(Aggregate *parent, const QString &name) : PageNode(Node::Example, parent, name) { } QString imageFileName() const override { return imageFileName_; } void setImageFileName(const QString &ifn) override { imageFileName_ = ifn; } const QStringList &files() const { return files_; } const QStringList &images() const { return images_; } void setFiles(const QStringList files) { files_ = files; } void setImages(const QStringList images) { images_ = images; } void appendFile(QString &file) { files_.append(file); } void appendImage(QString &image) { images_.append(image); } private: QString imageFileName_; QStringList files_; QStringList images_; }; struct ImportRec { QString name_; // module name QString version_; // . QString importId_; // "as" name QString importUri_; // subdirectory of module directory ImportRec(const QString &name, const QString &version, const QString &importId, const QString &importUri) : name_(name), version_(version), importId_(importId), importUri_(importUri) { } QString &name() { return name_; } QString &version() { return version_; } QString &importId() { return importId_; } QString &importUri() { return importUri_; } bool isEmpty() const { return name_.isEmpty(); } }; typedef QVector ImportList; class QmlTypeNode : public Aggregate { public: QmlTypeNode(Aggregate *parent, const QString &name, NodeType type = QmlType); bool isFirstClassAggregate() const override { return true; } bool isQtQuickNode() const override { return (logicalModuleName() == QLatin1String("QtQuick")); } ClassNode *classNode() override { return cnode_; } void setClassNode(ClassNode *cn) override { cnode_ = cn; } bool isAbstract() const override { return abstract_; } bool isWrapper() const override { return wrapper_; } void setAbstract(bool b) override { abstract_ = b; } void setWrapper() override { wrapper_ = true; } bool isInternal() const override { return (status() == Internal); } QString qmlFullBaseName() const override; QString obsoleteLink() const override { return obsoleteLink_; } void setObsoleteLink(const QString &t) override { obsoleteLink_ = t; } QString logicalModuleName() const override; QString logicalModuleVersion() const override; QString logicalModuleIdentifier() const override; CollectionNode *logicalModule() const override { return logicalModule_; } void setQmlModule(CollectionNode *t) override { logicalModule_ = t; } const ImportList &importList() const { return importList_; } void setImportList(const ImportList &il) { importList_ = il; } const QString &qmlBaseName() const { return qmlBaseName_; } void setQmlBaseName(const QString &name) { qmlBaseName_ = name; } bool qmlBaseNodeNotSet() const { return (qmlBaseNode_ == nullptr); } QmlTypeNode *qmlBaseNode() const override { return qmlBaseNode_; } void setQmlBaseNode(QmlTypeNode *b) { qmlBaseNode_ = b; } void requireCppClass() { cnodeRequired_ = true; } bool cppClassRequired() const { return cnodeRequired_; } static void addInheritedBy(const Node *base, Node *sub); static void subclasses(const Node *base, NodeList &subs); static void terminate(); bool inherits(Aggregate *type); public: static bool qmlOnly; static QMultiMap inheritedBy; private: bool abstract_; bool cnodeRequired_; bool wrapper_; ClassNode *cnode_; QString qmlBaseName_; QString obsoleteLink_; CollectionNode *logicalModule_; QmlTypeNode *qmlBaseNode_; ImportList importList_; }; class QmlBasicTypeNode : public Aggregate { public: QmlBasicTypeNode(Aggregate *parent, const QString &name, NodeType type = QmlBasicType); bool isFirstClassAggregate() const override { return true; } }; class QmlPropertyNode : public Node { Q_DECLARE_TR_FUNCTIONS(QDoc::QmlPropertyNode) public: QmlPropertyNode(Aggregate *parent, const QString &name, const QString &type, bool attached); void setDataType(const QString &dataType) override { type_ = dataType; } void setStored(bool stored) { stored_ = toFlagValue(stored); } void setDesignable(bool designable) { designable_ = toFlagValue(designable); } const QString &dataType() const { return type_; } QString qualifiedDataType() const { return type_; } bool isReadOnlySet() const { return (readOnly_ != FlagValueDefault); } bool isStored() const { return fromFlagValue(stored_,true); } bool isDesignable() const { return fromFlagValue(designable_,false); } bool isWritable(); bool isDefault() const override { return isdefault_; } bool isReadOnly() const override { return fromFlagValue(readOnly_,false); } bool isAlias() const override { return isAlias_; } bool isAttached() const override { return attached_; } bool isQtQuickNode() const override { return parent()->isQtQuickNode(); } QString qmlTypeName() const override { return parent()->qmlTypeName(); } QString logicalModuleName() const override { return parent()->logicalModuleName(); } QString logicalModuleVersion() const override { return parent()->logicalModuleVersion(); } QString logicalModuleIdentifier() const override { return parent()->logicalModuleIdentifier(); } QString element() const override { return parent()->name(); } void markDefault() override { isdefault_ = true; } void markReadOnly(bool flag) override { readOnly_ = toFlagValue(flag); } private: PropertyNode *findCorrespondingCppProperty(); private: QString type_; FlagValue stored_; FlagValue designable_; bool isAlias_; bool isdefault_; bool attached_; FlagValue readOnly_; }; class EnumItem { public: EnumItem() { } EnumItem(const QString &name, const QString &value) : name_(name), value_(value) { } const QString &name() const { return name_; } const QString &value() const { return value_; } private: QString name_; QString value_; }; class EnumNode : public Node { public: EnumNode(Aggregate *parent, const QString &name) : Node(Enum, parent, name), flagsType_(nullptr) { } void addItem(const EnumItem &item); void setFlagsType(TypedefNode *typedeff); bool hasItem(const QString &name) const { return names_.contains(name); } const QVector &items() const { return items_; } Access itemAccess(const QString &name) const; const TypedefNode *flagsType() const { return flagsType_; } QString itemValue(const QString &name) const; Node *clone(Aggregate *parent) override; private: QVector items_; QSet names_; const TypedefNode *flagsType_; }; class TypedefNode : public Node { public: TypedefNode(Aggregate *parent, const QString &name) : Node(Typedef, parent, name), associatedEnum_(nullptr) { } bool hasAssociatedEnum() const { return associatedEnum_ != nullptr; } const EnumNode *associatedEnum() const { return associatedEnum_; } Node *clone(Aggregate *parent) override; private: void setAssociatedEnum(const EnumNode *t); friend class EnumNode; const EnumNode *associatedEnum_; }; class TypeAliasNode : public TypedefNode { public: TypeAliasNode(Aggregate *parent, const QString &name, const QString &aliasedType) : TypedefNode(parent, name), aliasedType_(aliasedType) { } QString aliasedType() { return aliasedType_; } Node *clone(Aggregate *parent) override; private: QString aliasedType_; }; inline void EnumNode::setFlagsType(TypedefNode *t) { flagsType_ = t; t->setAssociatedEnum(this); } class SharedCommentNode : public Node { public: SharedCommentNode(Node *n) : Node(Node::SharedComment, n->parent(), QString()) { collective_.reserve(1); append(n); } SharedCommentNode(QmlTypeNode *parent, int count, QString &group) : Node(Node::SharedComment, parent, group) { collective_.reserve(count); } ~SharedCommentNode() override { collective_.clear(); } bool isPropertyGroup() const override { return !name().isEmpty() && !collective_.isEmpty() && (collective_.at(0)->isQmlProperty() || collective_.at(0)->isJsProperty()); } int count() const { return collective_.size(); } void append(Node *n) { collective_.append(n); n->setSharedCommentNode(this); setGenus(n->genus()); } const QVector &collective() const { return collective_; } void setOverloadFlags(); void setRelatedNonmember(bool b) override; Node *clone(Aggregate *parent) override; private: QVector collective_; }; class FunctionNode : public Node { public: enum Virtualness { NonVirtual, NormalVirtual, PureVirtual }; enum Metaness { Plain, Signal, Slot, Ctor, Dtor, CCtor, // copy constructor MCtor, // move-copy constructor MacroWithParams, MacroWithoutParams, Native, CAssign, // copy-assignment operator MAssign, // move-assignment operator QmlSignal, QmlSignalHandler, QmlMethod, JsSignal, JsSignalHandler, JsMethod }; FunctionNode(Aggregate *parent, const QString &name); // C++ function (Plain) FunctionNode(Metaness type, Aggregate *parent, const QString &name, bool attached = false); Node *clone(Aggregate *parent) override; Metaness metaness() const { return metaness_; } QString metanessString() const; bool changeMetaness(Metaness from, Metaness to); void setMetaness(Metaness t) { metaness_ = t; } Metaness setMetaness(const QString &t); QString kindString() const; static Metaness getMetaness(const QString &t); static Metaness getMetanessFromTopic(const QString &t); static Genus getGenus(Metaness t); void setReturnType(const QString &t) { returnType_ = t; } void setParentPath(const QStringList &p) { parentPath_ = p; } void setVirtualness(const QString &t); void setVirtualness(Virtualness v) { virtualness_ = v; } void setVirtual() { virtualness_ = NormalVirtual; } void setConst(bool b) { const_ = b; } void setStatic(bool b) { static_ = b; } void setReimpFlag() { reimpFlag_ = true; } void setOverridesThis(const QString &path) { overridesThis_ = path; } const QString &returnType() const { return returnType_; } QString virtualness() const; bool isConst() const { return const_; } bool isStatic() const override { return static_; } bool isOverload() const { return overloadFlag_; } bool isMarkedReimp() const override { return reimpFlag_; } bool isSomeCtor() const { return isCtor() || isCCtor() || isMCtor(); } bool isMacroWithParams() const { return (metaness_ == MacroWithParams); } bool isMacroWithoutParams() const { return (metaness_ == MacroWithoutParams); } bool isMacro() const override { return (isMacroWithParams() || isMacroWithoutParams()); } bool isCppFunction() const { return metaness_ == Plain; } // Is this correct? bool isSignal() const { return (metaness_ == Signal); } bool isSlot() const { return (metaness_ == Slot); } bool isCtor() const { return (metaness_ == Ctor); } bool isDtor() const { return (metaness_ == Dtor); } bool isCCtor() const { return (metaness_ == CCtor); } bool isMCtor() const { return (metaness_ == MCtor); } bool isCAssign() const { return (metaness_ == CAssign); } bool isMAssign() const { return (metaness_ == MAssign); } bool isJsMethod() const { return (metaness_ == JsMethod); } bool isJsSignal() const { return (metaness_ == JsSignal); } bool isJsSignalHandler() const { return (metaness_ == JsSignalHandler); } bool isQmlMethod() const { return (metaness_ == QmlMethod); } bool isQmlSignal() const { return (metaness_ == QmlSignal); } bool isQmlSignalHandler() const { return (metaness_ == QmlSignalHandler); } bool isSpecialMemberFunction() const { return (isDtor() || isCCtor() || isMCtor() || isCAssign() || isMAssign()); } bool isNonvirtual() const { return (virtualness_ == NonVirtual); } bool isVirtual() const { return (virtualness_ == NormalVirtual); } bool isPureVirtual() const { return (virtualness_ == PureVirtual); } bool returnsBool() const { return (returnType_ == QLatin1String("bool")); } Parameters ¶meters() { return parameters_; } const Parameters ¶meters() const { return parameters_; } bool isPrivateSignal() const { return parameters_.isPrivateSignal(); } void setParameters(const QString &signature) { parameters_.set(signature); } QString signature(bool values, bool noReturnType) const override; const QString &overridesThis() const { return overridesThis_; } NodeList &associatedProperties() { return associatedProperties_; } const QStringList &parentPath() const { return parentPath_; } bool hasAssociatedProperties() const { return !associatedProperties_.isEmpty(); } bool hasOneAssociatedProperty() const { return (associatedProperties_.size() == 1); } Node *firstAssociatedProperty() const { return associatedProperties_[0]; } bool hasActiveAssociatedProperty() const; QString element() const override { return parent()->name(); } bool isAttached() const override { return attached_; } bool isQtQuickNode() const override { return parent()->isQtQuickNode(); } QString qmlTypeName() const override { return parent()->qmlTypeName(); } QString logicalModuleName() const override { return parent()->logicalModuleName(); } QString logicalModuleVersion() const override { return parent()->logicalModuleVersion(); } QString logicalModuleIdentifier() const override { return parent()->logicalModuleIdentifier(); } void debug() const; void setFinal(bool b) { isFinal_ = b; } bool isFinal() const { return isFinal_; } void setOverride(bool b) { isOverride_ = b; } bool isOverride() const { return isOverride_; } void setRef(bool b) { isRef_ = b; } bool isRef() const { return isRef_; } void setRefRef(bool b) { isRefRef_ = b; } bool isRefRef() const { return isRefRef_; } void setInvokable(bool b) { isInvokable_ = b; } bool isInvokable() const { return isInvokable_; } bool hasTag(const QString &t) const override { return (tag_ == t); } void setTag(const QString &t) { tag_ = t; } const QString &tag() const { return tag_; } bool compare(const FunctionNode *fn) const; bool isIgnored() const; bool hasOverloads() const; void clearOverloadFlag() { overloadFlag_ = false; } void setOverloadFlag() { overloadFlag_ = true; } void setOverloadNumber(signed short n); void appendOverload(FunctionNode *fn); signed short overloadNumber() const { return overloadNumber_; } FunctionNode *nextOverload() { return nextOverload_; } void setNextOverload(FunctionNode *fn) { nextOverload_ = fn; } FunctionNode *findPrimaryFunction(); private: void addAssociatedProperty(PropertyNode *property); friend class Aggregate; friend class PropertyNode; bool const_ : 1; bool static_ : 1; bool reimpFlag_: 1; bool attached_: 1; bool overloadFlag_ : 1; bool isFinal_ : 1; bool isOverride_ : 1; bool isRef_ : 1; bool isRefRef_ : 1; bool isInvokable_ : 1; Metaness metaness_; Virtualness virtualness_; signed short overloadNumber_; FunctionNode *nextOverload_; QString returnType_; QStringList parentPath_; QString overridesThis_; QString tag_; NodeList associatedProperties_; Parameters parameters_; }; class PropertyNode : public Node { public: enum FunctionRole { Getter, Setter, Resetter, Notifier }; enum { NumFunctionRoles = Notifier + 1 }; PropertyNode(Aggregate *parent, const QString &name); void setDataType(const QString &dataType) override { type_ = dataType; } void addFunction(FunctionNode *function, FunctionRole role); void addSignal(FunctionNode *function, FunctionRole role); void setStored(bool stored) { stored_ = toFlagValue(stored); } void setDesignable(bool designable) { designable_ = toFlagValue(designable); } void setScriptable(bool scriptable) { scriptable_ = toFlagValue(scriptable); } void setWritable(bool writable) { writable_ = toFlagValue(writable); } void setUser(bool user) { user_ = toFlagValue(user); } void setOverriddenFrom(const PropertyNode *baseProperty); void setRuntimeDesFunc(const QString &rdf) { runtimeDesFunc_ = rdf; } void setRuntimeScrFunc(const QString &scrf) { runtimeScrFunc_ = scrf; } void setConstant() { const_ = true; } void setFinal() { final_ = true; } void setRevision(int revision) { revision_ = revision; } const QString &dataType() const { return type_; } QString qualifiedDataType() const; NodeList functions() const; const NodeList &functions(FunctionRole role) const { return functions_[(int)role]; } const NodeList &getters() const { return functions(Getter); } const NodeList &setters() const { return functions(Setter); } const NodeList &resetters() const { return functions(Resetter); } const NodeList ¬ifiers() const { return functions(Notifier); } bool hasAccessFunction(const QString &name) const; FunctionRole role(const FunctionNode *fn) const; bool isStored() const { return fromFlagValue(stored_, storedDefault()); } bool isDesignable() const { return fromFlagValue(designable_, designableDefault()); } bool isScriptable() const { return fromFlagValue(scriptable_, scriptableDefault()); } const QString &runtimeDesignabilityFunction() const { return runtimeDesFunc_; } const QString &runtimeScriptabilityFunction() const { return runtimeScrFunc_; } bool isWritable() const { return fromFlagValue(writable_, writableDefault()); } bool isUser() const { return fromFlagValue(user_, userDefault()); } bool isConstant() const { return const_; } bool isFinal() const { return final_; } const PropertyNode *overriddenFrom() const { return overrides_; } bool storedDefault() const { return true; } bool userDefault() const { return false; } bool designableDefault() const { return !setters().isEmpty(); } bool scriptableDefault() const { return true; } bool writableDefault() const { return !setters().isEmpty(); } private: QString type_; QString runtimeDesFunc_; QString runtimeScrFunc_; NodeList functions_[NumFunctionRoles]; FlagValue stored_; FlagValue designable_; FlagValue scriptable_; FlagValue writable_; FlagValue user_; bool const_; bool final_; int revision_; const PropertyNode *overrides_; }; inline void PropertyNode::addFunction(FunctionNode *function, FunctionRole role) { functions_[(int)role].append(function); function->addAssociatedProperty(this); } inline void PropertyNode::addSignal(FunctionNode *function, FunctionRole role) { functions_[(int)role].append(function); function->addAssociatedProperty(this); } inline NodeList PropertyNode::functions() const { NodeList list; for (int i = 0; i < NumFunctionRoles; ++i) list += functions_[i]; return list; } class VariableNode : public Node { public: VariableNode(Aggregate *parent, const QString &name); void setLeftType(const QString &leftType) { leftType_ = leftType; } void setRightType(const QString &rightType) { rightType_ = rightType; } void setStatic(bool b) { static_ = b; } const QString &leftType() const { return leftType_; } const QString &rightType() const { return rightType_; } QString dataType() const { return leftType_ + rightType_; } bool isStatic() const override { return static_; } Node *clone(Aggregate *parent) override; private: QString leftType_; QString rightType_; bool static_; }; inline VariableNode::VariableNode(Aggregate *parent, const QString &name) : Node(Variable, parent, name), static_(false) { setGenus(Node::CPP); } class CollectionNode : public PageNode { public: CollectionNode(NodeType type, Aggregate *parent, const QString &name) : PageNode(type, parent, name), seen_(false) { } bool isCollectionNode() const override { return true; } QString qtVariable() const override { return qtVariable_; } void setQtVariable(const QString &v) override { qtVariable_ = v; } void addMember(Node *node) override; bool hasMembers() const override; bool hasNamespaces() const override; bool hasClasses() const override; void getMemberNamespaces(NodeMap &out) override; void getMemberClasses(NodeMap &out) const override; bool wasSeen() const override { return seen_; } QString fullTitle() const override { return title(); } QString logicalModuleName() const override { return logicalModuleName_; } QString logicalModuleVersion() const override { return logicalModuleVersionMajor_ + QLatin1Char('.') + logicalModuleVersionMinor_; } QString logicalModuleIdentifier() const override { return logicalModuleName_ + logicalModuleVersionMajor_; } void setLogicalModuleInfo(const QString &arg) override; void setLogicalModuleInfo(const QStringList &info) override; const NodeList &members() const { return members_; } void printMembers(const QString &title); void markSeen() { seen_ = true; } void markNotSeen() { seen_ = false; } private: bool seen_; NodeList members_; QString logicalModuleName_; QString logicalModuleVersionMajor_; QString logicalModuleVersionMinor_; QString qtVariable_; }; QT_END_NAMESPACE #endif