tools/qdoc3/helpprojectwriter.cpp
branchGCC_SURGE
changeset 31 5daf16870df6
parent 30 5dc02b23752f
child 33 3e2da88830cd
equal deleted inserted replaced
27:93b982ccede2 31:5daf16870df6
    37 **
    37 **
    38 ** $QT_END_LICENSE$
    38 ** $QT_END_LICENSE$
    39 **
    39 **
    40 ****************************************************************************/
    40 ****************************************************************************/
    41 
    41 
    42 #include <QtXml>
       
    43 #include <QHash>
    42 #include <QHash>
    44 #include <QMap>
    43 #include <QMap>
       
    44 #include <qdebug.h>
    45 
    45 
    46 #include "atom.h"
    46 #include "atom.h"
    47 #include "helpprojectwriter.h"
    47 #include "helpprojectwriter.h"
    48 #include "htmlgenerator.h"
    48 #include "htmlgenerator.h"
    49 #include "config.h"
    49 #include "config.h"
   115     typeHash["typedef"] = Node::Typedef;
   115     typeHash["typedef"] = Node::Typedef;
   116     typeHash["function"] = Node::Function;
   116     typeHash["function"] = Node::Function;
   117     typeHash["property"] = Node::Property;
   117     typeHash["property"] = Node::Property;
   118     typeHash["variable"] = Node::Variable;
   118     typeHash["variable"] = Node::Variable;
   119     typeHash["target"] = Node::Target;
   119     typeHash["target"] = Node::Target;
       
   120 #ifdef QDOC_QML
       
   121     typeHash["qmlproperty"] = Node::QmlProperty;
       
   122     typeHash["qmlsignal"] = Node::QmlSignal;
       
   123     typeHash["qmlmethod"] = Node::QmlMethod;
       
   124 #endif
   120 
   125 
   121     QHash<QString, Node::SubType> subTypeHash;
   126     QHash<QString, Node::SubType> subTypeHash;
   122     subTypeHash["example"] = Node::Example;
   127     subTypeHash["example"] = Node::Example;
   123     subTypeHash["headerfile"] = Node::HeaderFile;
   128     subTypeHash["headerfile"] = Node::HeaderFile;
   124     subTypeHash["file"] = Node::File;
   129     subTypeHash["file"] = Node::File;
   126     subTypeHash["module"] = Node::Module;
   131     subTypeHash["module"] = Node::Module;
   127     subTypeHash["page"] = Node::Page;
   132     subTypeHash["page"] = Node::Page;
   128     subTypeHash["externalpage"] = Node::ExternalPage;
   133     subTypeHash["externalpage"] = Node::ExternalPage;
   129 #ifdef QDOC_QML
   134 #ifdef QDOC_QML
   130     subTypeHash["qmlclass"] = Node::QmlClass;
   135     subTypeHash["qmlclass"] = Node::QmlClass;
       
   136     subTypeHash["qmlpropertygroup"] = Node::QmlPropertyGroup;
       
   137     subTypeHash["qmlbasictype"] = Node::QmlBasicType;
   131 #endif
   138 #endif
   132 
   139 
   133     QSet<Node::SubType> allSubTypes = QSet<Node::SubType>::fromList(subTypeHash.values());
   140     QSet<Node::SubType> allSubTypes = QSet<Node::SubType>::fromList(subTypeHash.values());
   134 
   141 
   135     foreach (const QString &selector, selectors) {
   142     foreach (const QString &selector, selectors) {
   175 */
   182 */
   176 QStringList HelpProjectWriter::keywordDetails(const Node *node) const
   183 QStringList HelpProjectWriter::keywordDetails(const Node *node) const
   177 {
   184 {
   178     QStringList details;
   185     QStringList details;
   179 
   186 
   180     if (node->parent() && !node->parent()->name().isEmpty()) {
   187     if (node->type() == Node::QmlProperty) {
       
   188         // "name"
       
   189         details << node->name();
       
   190         // "id"
       
   191         details << node->parent()->parent()->name()+"::"+node->name();
       
   192     }
       
   193     else if (node->parent() && !node->parent()->name().isEmpty()) {
   181         // "name"
   194         // "name"
   182         if (node->type() == Node::Enum || node->type() == Node::Typedef)
   195         if (node->type() == Node::Enum || node->type() == Node::Typedef)
   183             details << node->parent()->name()+"::"+node->name();
   196             details << node->parent()->name()+"::"+node->name();
   184         else
   197         else
   185             details << node->name();
   198             details << node->name();
   186         // "id"
   199         // "id"
   187         details << node->parent()->name()+"::"+node->name();
   200         details << node->parent()->name()+"::"+node->name();
   188     } else if (node->type() == Node::Fake) {
   201     }
       
   202     else if (node->type() == Node::Fake) {
   189         const FakeNode *fake = static_cast<const FakeNode *>(node);
   203         const FakeNode *fake = static_cast<const FakeNode *>(node);
   190 #ifdef QDOC_QML
       
   191         if (fake->subType() == Node::QmlClass) {
   204         if (fake->subType() == Node::QmlClass) {
   192             details << (QmlClassNode::qmlOnly ? fake->name() : fake->fullTitle());
   205             details << (QmlClassNode::qmlOnly ? fake->name() : fake->fullTitle());
   193             details << "QML." + fake->name();
   206             details << "QML." + fake->name();
   194         } else
   207         }
   195 #endif
   208         else {
   196         {
       
   197             details << fake->fullTitle();
   209             details << fake->fullTitle();
   198             details << fake->fullTitle();
   210             details << fake->fullTitle();
   199         }
   211         }
   200     } else {
   212     }
       
   213     else {
   201         details << node->name();
   214         details << node->name();
   202         details << node->name();
   215         details << node->name();
   203     }
   216     }
   204     details << tree->fullDocumentLocation(node);
   217     details << tree->fullDocumentLocation(node);
   205 
       
   206     return details;
   218     return details;
   207 }
   219 }
   208 
   220 
   209 bool HelpProjectWriter::generateSection(HelpProject &project,
   221 bool HelpProjectWriter::generateSection(HelpProject &project,
   210                         QXmlStreamWriter & /* writer */, const Node *node)
   222                                         QXmlStreamWriter & /* writer */,
       
   223                                         const Node *node)
   211 {
   224 {
   212     if (!node->url().isEmpty())
   225     if (!node->url().isEmpty())
   213         return false;
   226         return false;
   214 
   227 
   215     if (node->access() == Node::Private || node->status() == Node::Internal)
   228     if (node->access() == Node::Private || node->status() == Node::Internal)
   224 
   237 
   225     QString objName;
   238     QString objName;
   226     if (node->type() == Node::Fake) {
   239     if (node->type() == Node::Fake) {
   227         const FakeNode *fake = static_cast<const FakeNode *>(node);
   240         const FakeNode *fake = static_cast<const FakeNode *>(node);
   228         objName = fake->fullTitle();
   241         objName = fake->fullTitle();
   229     } else
   242     }
       
   243     else
   230         objName = tree->fullDocumentName(node);
   244         objName = tree->fullDocumentName(node);
   231 
   245     
   232     // Only add nodes to the set for each subproject if they match a selector.
   246     // Only add nodes to the set for each subproject if they match a selector.
   233     // Those that match will be listed in the table of contents.
   247     // Those that match will be listed in the table of contents.
   234 
   248 
   235     foreach (const QString &name, project.subprojects.keys()) {
   249     foreach (const QString &name, project.subprojects.keys()) {
   236         SubProject subproject = project.subprojects[name];
   250         SubProject subproject = project.subprojects[name];
   288                 }
   302                 }
   289             }
   303             }
   290             break;
   304             break;
   291 
   305 
   292         case Node::Property:
   306         case Node::Property:
       
   307         case Node::QmlProperty:
       
   308         case Node::QmlSignal:
       
   309         case Node::QmlMethod:
   293             project.keywords.append(keywordDetails(node));
   310             project.keywords.append(keywordDetails(node));
   294             break;
   311             break;
   295 
   312 
   296         case Node::Function:
   313         case Node::Function:
   297             {
   314             {
   398 void HelpProjectWriter::generateSections(HelpProject &project,
   415 void HelpProjectWriter::generateSections(HelpProject &project,
   399                         QXmlStreamWriter &writer, const Node *node)
   416                         QXmlStreamWriter &writer, const Node *node)
   400 {
   417 {
   401     if (!generateSection(project, writer, node))
   418     if (!generateSection(project, writer, node))
   402         return;
   419         return;
   403 
   420     
   404     if (node->isInnerNode()) {
   421     if (node->isInnerNode()) {
   405         const InnerNode *inner = static_cast<const InnerNode *>(node);
   422         const InnerNode *inner = static_cast<const InnerNode *>(node);
   406 
   423 
   407         // Ensure that we don't visit nodes more than once.
   424         // Ensure that we don't visit nodes more than once.
   408         QMap<QString, const Node*> childMap;
   425         QMap<QString, const Node*> childMap;
   409         foreach (const Node *node, inner->childNodes()) {
   426         foreach (const Node *node, inner->childNodes()) {
   410             if (node->access() == Node::Private)
   427             if (node->access() == Node::Private)
   411                 continue;
   428                 continue;
   412             if (node->type() == Node::Fake)
   429             if (node->type() == Node::Fake) {
   413                 childMap[static_cast<const FakeNode *>(node)->fullTitle()] = node;
   430                 /*
       
   431                   Don't visit QML property group nodes,
       
   432                   but visit their children, which are all
       
   433                   QML property nodes.
       
   434                  */
       
   435                 if (node->subType() == Node::QmlPropertyGroup) {
       
   436                     const InnerNode* inner = static_cast<const InnerNode*>(node);
       
   437                     foreach (const Node* n, inner->childNodes()) {
       
   438                         if (n->access() == Node::Private)
       
   439                             continue;
       
   440                         childMap[tree->fullDocumentName(n)] = n;
       
   441                     }
       
   442                 }
       
   443                 else
       
   444                     childMap[static_cast<const FakeNode *>(node)->fullTitle()] = node;
       
   445             }
   414             else {
   446             else {
   415                 if (node->type() == Node::Function) {
   447                 if (node->type() == Node::Function) {
   416                     const FunctionNode *funcNode = static_cast<const FunctionNode *>(node);
   448                     const FunctionNode *funcNode = static_cast<const FunctionNode *>(node);
   417                     if (funcNode->isOverload())
   449                     if (funcNode->isOverload())
   418                         continue;
   450                         continue;