diff options
Diffstat (limited to 'src/tools')
-rw-r--r-- | src/tools/moc/outputrevision.h | 2 | ||||
-rw-r--r-- | src/tools/qdoc/codeparser.cpp | 18 | ||||
-rw-r--r-- | src/tools/qdoc/codeparser.h | 3 | ||||
-rw-r--r-- | src/tools/qdoc/cppcodeparser.cpp | 122 | ||||
-rw-r--r-- | src/tools/qdoc/cppcodeparser.h | 6 | ||||
-rw-r--r-- | src/tools/qdoc/ditaxmlgenerator.cpp | 34 | ||||
-rw-r--r-- | src/tools/qdoc/ditaxmlgenerator.h | 1 | ||||
-rw-r--r-- | src/tools/qdoc/doc.cpp | 55 | ||||
-rw-r--r-- | src/tools/qdoc/doc.h | 5 | ||||
-rw-r--r-- | src/tools/qdoc/doc/qdoc-manual.qdoc | 37 | ||||
-rw-r--r-- | src/tools/qdoc/htmlgenerator.cpp | 2 | ||||
-rw-r--r-- | src/tools/qdoc/node.cpp | 38 | ||||
-rw-r--r-- | src/tools/qdoc/node.h | 10 | ||||
-rw-r--r-- | src/tools/qdoc/qmlvisitor.cpp | 38 | ||||
-rw-r--r-- | src/tools/uic/qclass_lib_map.h | 12 |
15 files changed, 158 insertions, 225 deletions
diff --git a/src/tools/moc/outputrevision.h b/src/tools/moc/outputrevision.h index 590728db6c..faf913f849 100644 --- a/src/tools/moc/outputrevision.h +++ b/src/tools/moc/outputrevision.h @@ -43,6 +43,6 @@ #define OUTPUTREVISION_H // if the output revision changes, you MUST change it in qobjectdefs.h too -enum { mocOutputRevision = 66 }; // moc format output revision +enum { mocOutputRevision = 67 }; // moc format output revision #endif // OUTPUTREVISION_H diff --git a/src/tools/qdoc/codeparser.cpp b/src/tools/qdoc/codeparser.cpp index f06cc1f040..1d0c486763 100644 --- a/src/tools/qdoc/codeparser.cpp +++ b/src/tools/qdoc/codeparser.cpp @@ -229,7 +229,7 @@ QSet<QString> CodeParser::commonMetaCommands() */ void CodeParser::processCommonMetaCommand(const Location& location, const QString& command, - const QString& arg, + const ArgLocPair& arg, Node* node, Tree* tree) { @@ -241,13 +241,13 @@ void CodeParser::processCommonMetaCommand(const Location& location, node->setStatus(Node::Deprecated); } else if (command == COMMAND_INGROUP) { - tree->addToGroup(node, arg); + tree->addToGroup(node, arg.first); } else if (command == COMMAND_INPUBLICGROUP) { - tree->addToPublicGroup(node, arg); + tree->addToPublicGroup(node, arg.first); } else if (command == COMMAND_INMODULE) { - node->setModuleName(arg); + node->setModuleName(arg.first); } else if (command == COMMAND_INQMLMODULE) { node->setQmlModule(arg); @@ -280,15 +280,15 @@ void CodeParser::processCommonMetaCommand(const Location& location, node->setThreadSafeness(Node::Reentrant); } else if (command == COMMAND_SINCE) { - node->setSince(arg); + node->setSince(arg.first); } else if (command == COMMAND_PAGEKEYWORDS) { - node->addPageKeywords(arg); + node->addPageKeywords(arg.first); } else if (command == COMMAND_SUBTITLE) { if (node->type() == Node::Fake) { FakeNode *fake = static_cast<FakeNode *>(node); - fake->setSubTitle(arg); + fake->setSubTitle(arg.first); } else location.warning(tr("Ignored '\\%1'").arg(COMMAND_SUBTITLE)); @@ -299,11 +299,11 @@ void CodeParser::processCommonMetaCommand(const Location& location, else if (command == COMMAND_TITLE) { if (node->type() == Node::Fake) { FakeNode *fake = static_cast<FakeNode *>(node); - fake->setTitle(arg); + fake->setTitle(arg.first); if (fake->subType() == Node::Example) { ExampleNode::exampleNodeMap.insert(fake->title(),static_cast<ExampleNode*>(fake)); } - nameToTitle.insert(fake->name(),arg); + nameToTitle.insert(fake->name(),arg.first); } else location.warning(tr("Ignored '\\%1'").arg(COMMAND_TITLE)); diff --git a/src/tools/qdoc/codeparser.h b/src/tools/qdoc/codeparser.h index f522567ddb..c4429ff79a 100644 --- a/src/tools/qdoc/codeparser.h +++ b/src/tools/qdoc/codeparser.h @@ -89,7 +89,8 @@ public: protected: QSet<QString> commonMetaCommands(); void processCommonMetaCommand(const Location& location, - const QString& command, const QString& arg, + const QString& command, + const ArgLocPair& arg, Node *node, Tree *tree); static void extractPageLinkAndDesc(const QString& arg, QString* link, diff --git a/src/tools/qdoc/cppcodeparser.cpp b/src/tools/qdoc/cppcodeparser.cpp index 4e010fcb77..965455a3d5 100644 --- a/src/tools/qdoc/cppcodeparser.cpp +++ b/src/tools/qdoc/cppcodeparser.cpp @@ -537,16 +537,16 @@ QSet<QString> CppCodeParser::topicCommands() */ Node* CppCodeParser::processTopicCommand(const Doc& doc, const QString& command, - const QString& arg) + const ArgLocPair& arg) { if (command == COMMAND_FN) { QStringList parentPath; FunctionNode *func = 0; FunctionNode *clone = 0; - if (!makeFunctionNode(arg, &parentPath, &clone) && - !makeFunctionNode("void " + arg, &parentPath, &clone)) { - doc.location().warning(tr("Invalid syntax in '\\%1'").arg(COMMAND_FN)); + if (!makeFunctionNode(arg.first, &parentPath, &clone) && + !makeFunctionNode("void " + arg.first, &parentPath, &clone)) { + arg.second.warning(tr("Invalid syntax in '\\%1'").arg(COMMAND_FN)); } else { if (!activeNamespaces_.isEmpty()) { @@ -595,10 +595,9 @@ Node* CppCodeParser::processTopicCommand(const Doc& doc, QStringList parentPath; FunctionNode *func = 0; - if (makeFunctionNode(arg, &parentPath, &func, tree_->root())) { + if (makeFunctionNode(arg.first, &parentPath, &func, tree_->root())) { if (!parentPath.isEmpty()) { - doc.location().warning(tr("Invalid syntax in '\\%1'") - .arg(COMMAND_MACRO)); + arg.second.warning(tr("Invalid syntax in '\\%1'").arg(COMMAND_MACRO)); delete func; func = 0; } @@ -615,15 +614,14 @@ Node* CppCodeParser::processTopicCommand(const Doc& doc, } return func; } - else if (QRegExp("[A-Za-z_][A-Za-z0-9_]+").exactMatch(arg)) { - func = new FunctionNode(tree_->root(), arg); + else if (QRegExp("[A-Za-z_][A-Za-z0-9_]+").exactMatch(arg.first)) { + func = new FunctionNode(tree_->root(), arg.first); func->setAccess(Node::Public); - func->setLocation(doc.location()); + func->setLocation(arg.second); func->setMetaness(FunctionNode::MacroWithoutParams); } else { - doc.location().warning(tr("Invalid syntax in '\\%1'") - .arg(COMMAND_MACRO)); + doc.location().warning(tr("Invalid syntax in '\\%1'").arg(COMMAND_MACRO)); } return func; @@ -642,7 +640,7 @@ Node* CppCodeParser::processTopicCommand(const Doc& doc, if (type == Node::Fake) subtype = Node::QmlClass; - QStringList paths = arg.split(QLatin1Char(' ')); + QStringList paths = arg.first.split(QLatin1Char(' ')); QStringList path = paths[0].split("::"); Node *node = 0; @@ -672,7 +670,7 @@ Node* CppCodeParser::processTopicCommand(const Doc& doc, if (node == 0) { doc.location().warning(tr("Cannot find '%1' specified with '\\%2' in any header file") - .arg(arg).arg(command)); + .arg(arg.first).arg(command)); lastPath = path; } @@ -690,32 +688,33 @@ Node* CppCodeParser::processTopicCommand(const Doc& doc, } else if (command == COMMAND_EXAMPLE) { if (Config::generateExamples) { - ExampleNode* en = new ExampleNode(tree_->root(), arg); + ExampleNode* en = new ExampleNode(tree_->root(), arg.first); + en->setLocation(arg.second); createExampleFileNodes(en); return en; } } else if (command == COMMAND_EXTERNALPAGE) { - return new FakeNode(tree_->root(), arg, Node::ExternalPage, Node::ArticlePage); + return new FakeNode(tree_->root(), arg.first, Node::ExternalPage, Node::ArticlePage); } else if (command == COMMAND_FILE) { - return new FakeNode(tree_->root(), arg, Node::File, Node::NoPageType); + return new FakeNode(tree_->root(), arg.first, Node::File, Node::NoPageType); } else if (command == COMMAND_GROUP) { - return new FakeNode(tree_->root(), arg, Node::Group, Node::OverviewPage); + return new FakeNode(tree_->root(), arg.first, Node::Group, Node::OverviewPage); } else if (command == COMMAND_HEADERFILE) { - return new FakeNode(tree_->root(), arg, Node::HeaderFile, Node::ApiPage); + return new FakeNode(tree_->root(), arg.first, Node::HeaderFile, Node::ApiPage); } else if (command == COMMAND_MODULE) { - return new FakeNode(tree_->root(), arg, Node::Module, Node::OverviewPage); + return new FakeNode(tree_->root(), arg.first, Node::Module, Node::OverviewPage); } else if (command == COMMAND_QMLMODULE) { return FakeNode::lookupQmlModuleNode(tree_, arg); } else if (command == COMMAND_PAGE) { Node::PageType ptype = Node::ArticlePage; - QStringList args = arg.split(QLatin1Char(' ')); + QStringList args = arg.first.split(QLatin1Char(' ')); if (args.size() > 1) { QString t = args[1].toLower(); if (t == "howto") @@ -751,18 +750,19 @@ Node* CppCodeParser::processTopicCommand(const Doc& doc, fn = new DitaMapNode(tree_->root(), args[0]); else fn = new FakeNode(tree_->root(), args[0], Node::Page, ptype); + fn->setLocation(arg.second); if (ncn) { ncn->addCollision(fn); } return fn; } else if (command == COMMAND_DITAMAP) { - FakeNode* fn = new DitaMapNode(tree_->root(), arg); + FakeNode* fn = new DitaMapNode(tree_->root(), arg.first); return fn; } else if (command == COMMAND_QMLCLASS) { ClassNode* classNode = 0; - QStringList names = arg.split(QLatin1Char(' ')); + QStringList names = arg.first.split(QLatin1Char(' ')); if (names.size() > 1) classNode = tree_->findClassNode(names[1].split("::")); @@ -779,12 +779,13 @@ Node* CppCodeParser::processTopicCommand(const Doc& doc, */ NameCollisionNode* ncn = tree_->checkForCollision(names[0]); QmlClassNode* qcn = new QmlClassNode(tree_->root(), names[0], classNode); + qcn->setLocation(arg.second); if (ncn) ncn->addCollision(qcn); return qcn; } else if (command == COMMAND_QMLBASICTYPE) { - return new QmlBasicTypeNode(tree_->root(), arg); + return new QmlBasicTypeNode(tree_->root(), arg.first); } else if ((command == COMMAND_QMLSIGNAL) || (command == COMMAND_QMLMETHOD) || @@ -793,18 +794,39 @@ Node* CppCodeParser::processTopicCommand(const Doc& doc, QString module; QString element; QString type; - if (splitQmlMethodArg(doc,arg,type,module,element)) { + if (splitQmlMethodArg(doc,arg.first,type,module,element)) { QmlClassNode* qmlClass = tree_->findQmlClassNode(module,element); if (qmlClass) { if (command == COMMAND_QMLSIGNAL) - return makeFunctionNode(doc,arg,qmlClass,Node::QmlSignal,false,COMMAND_QMLSIGNAL); + return makeFunctionNode(doc, + arg.first, + qmlClass, + Node::QmlSignal, + false, + COMMAND_QMLSIGNAL); else if (command == COMMAND_QMLATTACHEDSIGNAL) - return makeFunctionNode(doc,arg,qmlClass,Node::QmlSignal,true,COMMAND_QMLATTACHEDSIGNAL); + return makeFunctionNode(doc, + arg.first, + qmlClass, + Node::QmlSignal, + true, + COMMAND_QMLATTACHEDSIGNAL); else if (command == COMMAND_QMLMETHOD) { - return makeFunctionNode(doc,arg,qmlClass,Node::QmlMethod,false,COMMAND_QMLMETHOD); + return makeFunctionNode(doc, + arg.first, + qmlClass, + Node::QmlMethod, + false, + COMMAND_QMLMETHOD); } else if (command == COMMAND_QMLATTACHEDMETHOD) - return makeFunctionNode(doc,arg,qmlClass,Node::QmlMethod,true,COMMAND_QMLATTACHEDMETHOD); + return makeFunctionNode(doc, + arg. + first, + qmlClass, + Node::QmlMethod, + true, + COMMAND_QMLATTACHEDMETHOD); else return 0; // never get here. } @@ -925,26 +947,31 @@ bool CppCodeParser::splitQmlMethodArg(const Doc& doc, */ Node *CppCodeParser::processTopicCommandGroup(const Doc& doc, const QString& command, - const QStringList& args) + const ArgList& args) { QmlPropGroupNode* qmlPropGroup = 0; if ((command == COMMAND_QMLPROPERTY) || (command == COMMAND_QMLATTACHEDPROPERTY)) { + QString arg; QString type; QString module; QString element; QString property; bool attached = (command == COMMAND_QMLATTACHEDPROPERTY); - QStringList::ConstIterator arg = args.begin(); - if (splitQmlPropertyArg(doc,(*arg),type,module,element,property)) { + ArgList::ConstIterator argsIter = args.begin(); + arg = argsIter->first; + if (splitQmlPropertyArg(doc,arg,type,module,element,property)) { QmlClassNode* qmlClass = tree_->findQmlClassNode(module,element); if (qmlClass) { qmlPropGroup = new QmlPropGroupNode(qmlClass,property); //,attached); + qmlPropGroup->setLocation(location()); } } if (qmlPropGroup) { ClassNode *correspondingClass = static_cast<QmlClassNode*>(qmlPropGroup->parent())->classNode(); QmlPropertyNode *qmlPropNode = new QmlPropertyNode(qmlPropGroup,property,type,attached); + qmlPropNode->setLocation(location()); + qmlPropNode->setQPropertyFlag(); const PropertyNode *correspondingProperty = 0; if (correspondingClass) { @@ -954,19 +981,22 @@ Node *CppCodeParser::processTopicCommandGroup(const Doc& doc, bool writableList = type.startsWith("list") && correspondingProperty->dataType().endsWith('*'); qmlPropNode->setReadOnly(!(writableList || correspondingProperty->isWritable())); } - ++arg; - while (arg != args.end()) { - if (splitQmlPropertyArg(doc,(*arg),type,module,element,property)) { + ++argsIter; + while (argsIter != args.end()) { + arg = argsIter->first; + if (splitQmlPropertyArg(doc,arg,type,module,element,property)) { QmlPropertyNode* qmlPropNode = new QmlPropertyNode(qmlPropGroup, property, type, attached); + qmlPropNode->setLocation(location()); + qmlPropNode->setQPropertyFlag(); if (correspondingProperty) { bool writableList = type.startsWith("list") && correspondingProperty->dataType().endsWith('*'); qmlPropNode->setReadOnly(!(writableList || correspondingProperty->isWritable())); } } - ++arg; + ++argsIter; } } } @@ -1001,9 +1031,10 @@ QSet<QString> CppCodeParser::otherMetaCommands() */ void CppCodeParser::processOtherMetaCommand(const Doc& doc, const QString& command, - const QString& arg, + const ArgLocPair& argLocPair, Node *node) { + QString arg = argLocPair.first; if (command == COMMAND_INHEADERFILE) { if (node != 0 && node->isInnerNode()) { ((InnerNode *) node)->addInclude(arg); @@ -1152,7 +1183,7 @@ void CppCodeParser::processOtherMetaCommand(const Doc& doc, } } else { - processCommonMetaCommand(doc.location(),command,arg,node,tree_); + processCommonMetaCommand(doc.location(),command,argLocPair,node,tree_); } } @@ -1166,8 +1197,8 @@ void CppCodeParser::processOtherMetaCommands(const Doc& doc, Node *node) const QSet<QString> metaCommands = doc.metaCommandsUsed(); QSet<QString>::ConstIterator cmd = metaCommands.begin(); while (cmd != metaCommands.end()) { - QStringList args = doc.metaCommandArgs(*cmd); - QStringList::ConstIterator arg = args.begin(); + ArgList args = doc.metaCommandArgs(*cmd); + ArgList::ConstIterator arg = args.begin(); while (arg != args.end()) { processOtherMetaCommand(doc, *cmd, *arg, node); ++arg; @@ -2209,10 +2240,9 @@ bool CppCodeParser::matchDocsAndStuff() Doc doc(start_loc,end_loc,comment,metacommandsAllowed); QString topic; - QStringList args; + ArgList args; - QSet<QString> topicCommandsUsed = topicCommandsAllowed & - doc.metaCommandsUsed(); + QSet<QString> topicCommandsUsed = topicCommandsAllowed & doc.metaCommandsUsed(); /* There should be one topic command in the set, @@ -2273,7 +2303,7 @@ bool CppCodeParser::matchDocsAndStuff() } } else { - QStringList::ConstIterator a = args.begin(); + ArgList::ConstIterator a = args.begin(); while (a != args.end()) { Doc nodeDoc = doc; Node *node = processTopicCommand(nodeDoc,topic,*a); @@ -2468,8 +2498,8 @@ void CppCodeParser::createExampleFileNodes(FakeNode *fake) proFileName, userFriendlyFilePath); if (fullPath.isEmpty()) { - fake->doc().location().warning(tr("Cannot find file '%1' or '%2'").arg(tmp).arg(proFileName)); - fake->doc().location().warning(tr("EXAMPLE PATH DOES NOT EXIST: %1").arg(examplePath)); + fake->location().warning(tr("Cannot find file '%1' or '%2'").arg(tmp).arg(proFileName)); + fake->location().warning(tr(" EXAMPLE PATH DOES NOT EXIST: %1").arg(examplePath)); return; } } diff --git a/src/tools/qdoc/cppcodeparser.h b/src/tools/qdoc/cppcodeparser.h index 74abb994d9..0f4b5119d6 100644 --- a/src/tools/qdoc/cppcodeparser.h +++ b/src/tools/qdoc/cppcodeparser.h @@ -88,12 +88,12 @@ protected: virtual QSet<QString> topicCommands(); virtual Node *processTopicCommand(const Doc& doc, const QString& command, - const QString& arg); + const ArgLocPair& arg); #ifdef QDOC_QML // might need to implement this in QsCodeParser as well. virtual Node *processTopicCommandGroup(const Doc& doc, const QString& command, - const QStringList& args); + const ArgList& args); bool splitQmlPropertyArg(const Doc& doc, const QString& arg, QString& type, @@ -109,7 +109,7 @@ protected: virtual QSet<QString> otherMetaCommands(); virtual void processOtherMetaCommand(const Doc& doc, const QString& command, - const QString& arg, + const ArgLocPair& argLocPair, Node *node); void processOtherMetaCommands(const Doc& doc, Node *node); diff --git a/src/tools/qdoc/ditaxmlgenerator.cpp b/src/tools/qdoc/ditaxmlgenerator.cpp index 0c88cbc529..b24a6af660 100644 --- a/src/tools/qdoc/ditaxmlgenerator.cpp +++ b/src/tools/qdoc/ditaxmlgenerator.cpp @@ -2548,7 +2548,10 @@ void DitaXmlGenerator::generateHeader(const Node* node, if (!outputclass.isEmpty()) xmlWriter().writeAttribute("outputclass",outputclass); writeStartTag(nameTag); // <title> or <apiName> - writeCharacters(name); + if (!name.isEmpty()) + writeCharacters(name); + else + writeCharacters(node->name()); writeEndTag(); // </title> or </apiName> } @@ -3295,7 +3298,7 @@ void DitaXmlGenerator::generateOverviewList(const Node* relative, CodeMarker* /* QString group; bool isGroupPage = false; if (fakeNode->doc().metaCommandsUsed().contains("group")) { - group = fakeNode->doc().metaCommandArgs("group")[0]; + group = fakeNode->doc().metaCommandArgs("group")[0].first; isGroupPage = true; } @@ -4493,7 +4496,7 @@ void DitaXmlGenerator::generateDetailedQmlMember(Node* node, if (qpgn->childNodes().size() == 1) { qpn = static_cast<QmlPropertyNode*>(*p); startQmlProperty(qpn,relative,marker); - writeQmlDesc(node, marker); + writeApiDesc(node, marker, node->title()); writeEndTag(); // </qmlPropertyDetail> writeEndTag(); // </qmlProperty> } @@ -4506,7 +4509,7 @@ void DitaXmlGenerator::generateDetailedQmlMember(Node* node, //writeCharacters("..."); writeEndTag(); // </apiName> writeStartTag(DT_qmlPropertyGroupDetail); - writeQmlDesc(node, marker); + writeApiDesc(node, marker, node->title()); writeEndTag(); // </qmlPropertyGroupDetail> while (p != qpgn->childNodes().end()) { if ((*p)->type() == Node::QmlProperty) { @@ -4524,7 +4527,7 @@ void DitaXmlGenerator::generateDetailedQmlMember(Node* node, qpn = static_cast<QmlPropertyNode*>(node); if (qpn->qmlPropNodes().isEmpty()) { startQmlProperty(qpn,relative,marker); - writeQmlDesc(node, marker); + writeApiDesc(node, marker, node->title()); writeEndTag(); // </qmlPropertyDetail> writeEndTag(); // </qmlProperty> } @@ -4533,7 +4536,7 @@ void DitaXmlGenerator::generateDetailedQmlMember(Node* node, if (n->type() == Node::QmlProperty) { qpn = static_cast<QmlPropertyNode*>(n); startQmlProperty(qpn,relative,marker); - writeQmlDesc(node, marker); + writeApiDesc(node, marker, node->title()); writeEndTag(); // </qmlPropertyDetail> writeEndTag(); // </qmlProperty> } @@ -4552,7 +4555,7 @@ void DitaXmlGenerator::generateDetailedQmlMember(Node* node, //writeCharacters("..."); writeEndTag(); // </apiName> writeStartTag(DT_qmlPropertyGroupDetail); - writeQmlDesc(node, marker); + writeApiDesc(node, marker, node->title()); writeEndTag(); // </qmlPropertyGroupDetail> NodeList::ConstIterator p = qpn->qmlPropNodes().begin(); while (p != qpn->qmlPropNodes().end()) { @@ -4603,27 +4606,12 @@ void DitaXmlGenerator::writeQmlRef(DitaTag tag, writeEndTag(); // </qmlAttached> } writeEndTag(); // </qmlXxxDef> - writeQmlDesc(node, marker); + writeApiDesc(node, marker, node->title()); writeEndTag(); // </qmlXxxDetail> writeEndTag(); // tag } /*! - Writes the <apiDesc> tag and its contents for the \a node. - The \a marker is used for markeing up the text body. - */ -void DitaXmlGenerator::writeQmlDesc(Node* node, CodeMarker* marker) -{ - writeStartTag(DT_apiDesc); - generateStatus(node, marker); - generateBody(node, marker); - generateThreadSafeness(node, marker); - generateSince(node, marker); - generateAlsoList(node, marker); - writeEndTag(); // </apiDesc> -} - -/*! This generates a <qmlTypeDef> in which the QML module name and version number are specified. */ diff --git a/src/tools/qdoc/ditaxmlgenerator.h b/src/tools/qdoc/ditaxmlgenerator.h index 538a667849..56cf48614c 100644 --- a/src/tools/qdoc/ditaxmlgenerator.h +++ b/src/tools/qdoc/ditaxmlgenerator.h @@ -418,7 +418,6 @@ private: Node* node, const InnerNode* relative, CodeMarker* marker); - void writeQmlDesc(Node* node, CodeMarker* marker); void generateDetailedQmlMember(Node* node, const InnerNode* relative, CodeMarker* marker); diff --git a/src/tools/qdoc/doc.cpp b/src/tools/qdoc/doc.cpp index 3c1bab17af..af7e26dd17 100644 --- a/src/tools/qdoc/doc.cpp +++ b/src/tools/qdoc/doc.cpp @@ -113,7 +113,6 @@ enum { CMD_ENDSIDEBAR, CMD_ENDTABLE, CMD_ENDTOPICREF, - CMD_EXPIRE, CMD_FOOTNOTE, CMD_GENERATELIST, CMD_GRANULARITY, @@ -231,7 +230,6 @@ static struct { { "endsidebar", CMD_ENDSIDEBAR, 0 }, { "endtable", CMD_ENDTABLE, 0 }, { "endtopicref", CMD_ENDTOPICREF, 0 }, - { "expire", CMD_EXPIRE, 0 }, { "footnote", CMD_FOOTNOTE, 0 }, { "generatelist", CMD_GENERATELIST, 0 }, { "granularity", CMD_GRANULARITY, 0 }, // ### don't document for now @@ -348,6 +346,8 @@ static QString cleanLink(const QString &link) return link.mid(colonPos + 1).simplified(); } +typedef QMap<QString, ArgList> CommandMap; + class DocPrivate : public Shared { public: @@ -370,7 +370,7 @@ public: QStringList enumItemList; QStringList omitEnumItemList; QSet<QString> metacommandsUsed; - QCommandMap metaCommandMap; + CommandMap metaCommandMap; bool hasLegalese : 1; bool hasSectioningUnits : 1; DocPrivateExtra *extra; @@ -462,7 +462,6 @@ private: Location& location(); QString detailsUnknownCommand(const QSet<QString>& metaCommandSet, const QString& str); - void checkExpiry(const QString& date); void insertBaseName(const QString &baseName); void insertTarget(const QString& target, bool keyword); void include(const QString& fileName, const QString& identifier); @@ -859,9 +858,6 @@ void DocParser::parse(const QString& source, append(Atom::TableRight); } break; - case CMD_EXPIRE: - checkExpiry(getArgument()); - break; case CMD_FOOTNOTE: if (openCommand(cmd)) { enterPara(); @@ -1392,13 +1388,13 @@ void DocParser::parse(const QString& source, append(Atom::ParaRight); p1 = getMetaCommandArgument(cmdStr); } - priv->metaCommandMap[cmdStr].append(p1); + priv->metaCommandMap[cmdStr].append(ArgLocPair(p1,location())); break; case NOT_A_CMD: if (metaCommandSet.contains(cmdStr)) { priv->metacommandsUsed.insert(cmdStr); QString arg = getMetaCommandArgument(cmdStr); - priv->metaCommandMap[cmdStr].append(arg); + priv->metaCommandMap[cmdStr].append(ArgLocPair(arg,location())); if (possibleTopics.contains(cmdStr)) { priv->topics.append(Topic(cmdStr,arg)); } @@ -1662,43 +1658,6 @@ QString DocParser::detailsUnknownCommand(const QSet<QString> &metaCommandSet, return tr("Maybe you meant '\\%1'?").arg(best); } -void DocParser::checkExpiry(const QString& date) -{ - QRegExp ymd("(\\d{4})(?:-(\\d{2})(?:-(\\d{2})))"); - - if (ymd.exactMatch(date)) { - int y = ymd.cap(1).toInt(); - int m = ymd.cap(2).toInt(); - int d = ymd.cap(3).toInt(); - - if (m == 0) - m = 1; - if (d == 0) - d = 1; - QDate expiryDate(y, m, d); - if (expiryDate.isValid()) { - int days = expiryDate.daysTo(QDate::currentDate()); - if (days == 0) { - location().warning(tr("Documentation expires today")); - } - else if (days == 1) { - location().warning(tr("Documentation expired yesterday")); - } - else if (days >= 2) { - location().warning(tr("Documentation expired %1 days ago") - .arg(days)); - } - } - else { - location().warning(tr("Date '%1' invalid").arg(date)); - } - } - else { - location().warning(tr("Date '%1' not in YYYY-MM-DD format") - .arg(date)); - } -} - void DocParser::insertBaseName(const QString &baseName) { priv->constructExtra(); @@ -3086,9 +3045,9 @@ const TopicList& Doc::topicsUsed() const return priv == 0 ? *nullTopicList() : priv->topics; } -QStringList Doc::metaCommandArgs(const QString& metacommand) const +ArgList Doc::metaCommandArgs(const QString& metacommand) const { - return priv == 0 ? QStringList() : priv->metaCommandMap.value(metacommand); + return priv == 0 ? ArgList() : priv->metaCommandMap.value(metacommand); } const QList<Text> &Doc::alsoList() const diff --git a/src/tools/qdoc/doc.h b/src/tools/qdoc/doc.h index d3fd2dbb4d..1f83f95362 100644 --- a/src/tools/qdoc/doc.h +++ b/src/tools/qdoc/doc.h @@ -63,7 +63,8 @@ class Text; class FakeNode; class DitaRef; -typedef QMap<QString, QStringList> QCommandMap; +typedef QPair<QString, Location> ArgLocPair; +typedef QList<ArgLocPair> ArgList; typedef QMap<QString, QString> QStringMap; typedef QMultiMap<QString, QString> QStringMultiMap; @@ -168,7 +169,7 @@ public: const QStringList &omitEnumItemNames() const; const QSet<QString> &metaCommandsUsed() const; const TopicList& topicsUsed() const; - QStringList metaCommandArgs( const QString& metaCommand ) const; + ArgList metaCommandArgs(const QString& metaCommand) const; const QList<Text> &alsoList() const; bool hasTableOfContents() const; bool hasKeywords() const; diff --git a/src/tools/qdoc/doc/qdoc-manual.qdoc b/src/tools/qdoc/doc/qdoc-manual.qdoc index fa3301e072..6983f6345f 100644 --- a/src/tools/qdoc/doc/qdoc-manual.qdoc +++ b/src/tools/qdoc/doc/qdoc-manual.qdoc @@ -256,7 +256,6 @@ \li \l {04-qdoc-commands-textmarkup.html#e-command} {\\e} \span {class="newStuff"} {(new 5/3/2012)} \li \l {12-0-qdoc-commands-miscellaneous.html#else-command} {\\else} \li \l {12-0-qdoc-commands-miscellaneous.html#endif-command} {\\endif} - \li \l {12-0-qdoc-commands-miscellaneous.html#expire-command} {\\expire} \li \l {11-qdoc-commands-specialcontent.html#footnote-command} {\\footnote} \li \l {12-0-qdoc-commands-miscellaneous.html#generatelist-command} {\\generatelist} \li \l {10-qdoc-commands-tablesandlists.html#header-command} {\\header} @@ -3506,41 +3505,6 @@ visual appearance of the documentation, and to the process of generating the documentation. - \target expire-command - \section1 \\expire - - The \\expire command allows you to define an expiration - date for your documentation. - - When using the \\expire command, QDoc will emit a warning when the - current date is larger than the specified date. The command - accepts one argument; the argument's format is yyyy-mm-dd. For - example: - - \code - / *! - \page porting.html - - \title Porting to Qt 3.x - - \expire 2004-12-31 - - This document describes porting applications from Qt - 2.x to Qt 3.x. - - The Qt 3.x series is not binary compatible with the - 2.x series. - ... - * / - \endcode - - If you run QDoc on 4 July 2005, it will emit the warning - - \quotation - porting.qdoc:6: Documentation expired 185 days ago - \endquotation - - \target annotatedlist-command \section1 \\annotatedlist @@ -8673,7 +8637,6 @@ \li \l {12-0-qdoc-commands-miscellaneous.html#endif-command} {\\endif} \li \l {13-qdoc-commands-topics.html#enum-command} {\\enum} \li \l {13-qdoc-commands-topics.html#example-command} {\\example} - \li \l {12-0-qdoc-commands-miscellaneous.html#expire-command} {\\expire} \li \l {13-qdoc-commands-topics.html#externalpage-command} {\\externalpage} \li \l {13-qdoc-commands-topics.html#fn-command} {\\fn} \li \l {11-qdoc-commands-specialcontent.html#footnote-command} {\\footnote} diff --git a/src/tools/qdoc/htmlgenerator.cpp b/src/tools/qdoc/htmlgenerator.cpp index ef3bf8db15..5755b9afb4 100644 --- a/src/tools/qdoc/htmlgenerator.cpp +++ b/src/tools/qdoc/htmlgenerator.cpp @@ -2683,7 +2683,7 @@ void HtmlGenerator::generateOverviewList(const Node *relative, CodeMarker * /* m QString group; bool isGroupPage = false; if (fakeNode->doc().metaCommandsUsed().contains("group")) { - group = fakeNode->doc().metaCommandArgs("group")[0]; + group = fakeNode->doc().metaCommandArgs("group")[0].first; isGroupPage = true; } diff --git a/src/tools/qdoc/node.cpp b/src/tools/qdoc/node.cpp index 30fa76ae02..f235753ccd 100644 --- a/src/tools/qdoc/node.cpp +++ b/src/tools/qdoc/node.cpp @@ -1478,7 +1478,6 @@ FakeNode::FakeNode(InnerNode* parent, const QString& name, SubType subtype, Node setPageType(OverviewPage); break; case QmlModule: - setQmlModule(name); setPageType(OverviewPage); break; case QmlClass: @@ -1574,10 +1573,10 @@ void FakeNode::insertQmlModuleNode(const QString& qmid, FakeNode* fn) and inserted into the QML module map mapped to the QML module identifier constructed from \a arg. */ -FakeNode* FakeNode::lookupQmlModuleNode(Tree* tree, const QString& arg) +FakeNode* FakeNode::lookupQmlModuleNode(Tree* tree, const ArgLocPair& arg) { QStringList dotSplit; - QStringList blankSplit = arg.split(QLatin1Char(' ')); + QStringList blankSplit = arg.first.split(QLatin1Char(' ')); QString qmid = blankSplit[0]; if (blankSplit.size() > 1) { dotSplit = blankSplit[1].split(QLatin1Char('.')); @@ -1587,7 +1586,8 @@ FakeNode* FakeNode::lookupQmlModuleNode(Tree* tree, const QString& arg) if (qmlModuleMap_.contains(qmid)) fn = qmlModuleMap_.value(qmid); if (!fn) { - fn = new FakeNode(tree->root(), arg, Node::QmlModule, Node::OverviewPage); + fn = new FakeNode(tree->root(), arg.first, Node::QmlModule, Node::OverviewPage); + fn->setQmlModule(arg); insertQmlModuleNode(qmid,fn); } return fn; @@ -2134,10 +2134,10 @@ void QmlClassNode::subclasses(const QString& base, NodeList& subs) true is returned. If any of the three is not found or is not correct, false is returned. */ -bool Node::setQmlModule(const QString& arg) +bool Node::setQmlModule(const ArgLocPair& arg) { QStringList dotSplit; - QStringList blankSplit = arg.split(QLatin1Char(' ')); + QStringList blankSplit = arg.first.split(QLatin1Char(' ')); qmlModuleName_ = blankSplit[0]; qmlModuleVersionMajor_ = "1"; qmlModuleVersionMinor_ = "0"; @@ -2149,10 +2149,10 @@ bool Node::setQmlModule(const QString& arg) return true; } else - doc().location().warning(tr("Minor version number missing for '\\qmlmodule' or '\\inqmlmodule'; 0 assumed.")); + arg.second.warning(tr("Minor version number missing for '\\qmlmodule' or '\\inqmlmodule'; 0 assumed.")); } else - doc().location().warning(tr("Module version number missing for '\\qmlmodule' or '\\inqmlmodule'; 1.0 assumed.")); + arg.second.warning(tr("Module version number missing for '\\qmlmodule' or '\\inqmlmodule'; 1.0 assumed.")); return false; } @@ -2294,6 +2294,7 @@ QmlPropertyNode::QmlPropertyNode(QmlPropGroupNode *parent, designable_(FlagValueDefault), isdefault_(false), attached_(attached), + qproperty_(false), readOnly_(FlagValueDefault) { setPageType(ApiPage); @@ -2313,6 +2314,7 @@ QmlPropertyNode::QmlPropertyNode(QmlClassNode *parent, designable_(FlagValueDefault), isdefault_(false), attached_(attached), + qproperty_(false), readOnly_(FlagValueDefault) { setPageType(ApiPage); @@ -2339,6 +2341,7 @@ QmlPropertyNode::QmlPropertyNode(QmlPropertyNode* parent, designable_(FlagValueDefault), isdefault_(false), attached_(attached), + qproperty_(false), readOnly_(FlagValueDefault) { setPageType(ApiPage); @@ -2353,18 +2356,19 @@ QmlPropertyNode::QmlPropertyNode(QmlPropertyNode* parent, */ bool QmlPropertyNode::isWritable(Tree* tree) { - if (readOnly_ != FlagValueDefault) { + if (readOnly_ != FlagValueDefault) return !fromFlagValue(readOnly_, false); - } - PropertyNode* pn = correspondingProperty(tree); - if (pn) { - return pn->isWritable(); - } - else { - location().warning(tr("Can't detect if QML property %1 is read-only; writable assumed.").arg(name())); - return true; + if (qproperty_) { + PropertyNode* pn = correspondingProperty(tree); + if (pn) + return pn->isWritable(); + + location().warning(tr("Can't detect if QML property %1::%2::%3 is read-only; " + "writable assumed.") + .arg(qmlModuleIdentifier()).arg(qmlTypeName()).arg(name())); } + return true; } PropertyNode* QmlPropertyNode::correspondingProperty(Tree *tree) diff --git a/src/tools/qdoc/node.h b/src/tools/qdoc/node.h index 8083f2c05d..0b8758d92f 100644 --- a/src/tools/qdoc/node.h +++ b/src/tools/qdoc/node.h @@ -230,10 +230,11 @@ public: QString guid() const; QString ditaXmlHref(); QString extractClassName(const QString &string) const; + virtual QString qmlTypeName() const { return name_; } virtual QString qmlModuleName() const { return qmlModuleName_; } virtual QString qmlModuleVersion() const { return qmlModuleVersionMajor_ + "." + qmlModuleVersionMinor_; } virtual QString qmlModuleIdentifier() const { return qmlModuleName_ + qmlModuleVersionMajor_; } - virtual bool setQmlModule(const QString& ); + virtual bool setQmlModule(const ArgLocPair& ); virtual ClassNode* classNode() { return 0; } virtual void clearCurrentChild() { } virtual const ImportList* importList() const { return 0; } @@ -476,7 +477,7 @@ public: virtual bool isQmlPropertyGroup() const { return (nodeSubtype_ == QmlPropertyGroup); } static void insertQmlModuleNode(const QString& qmid, FakeNode* fn); - static FakeNode* lookupQmlModuleNode(Tree* tree, const QString& arg); + static FakeNode* lookupQmlModuleNode(Tree* tree, const ArgLocPair& arg); protected: SubType nodeSubtype_; @@ -579,6 +580,7 @@ public: virtual ~QmlPropGroupNode() { } virtual bool isQmlNode() const { return true; } virtual bool isQtQuickNode() const { return parent()->isQtQuickNode(); } + virtual QString qmlTypeName() const { return parent()->qmlTypeName(); } virtual QString qmlModuleName() const { return parent()->qmlModuleName(); } virtual QString qmlModuleVersion() const { return parent()->qmlModuleVersion(); } virtual QString qmlModuleIdentifier() const { return parent()->qmlModuleIdentifier(); } @@ -626,6 +628,7 @@ public: virtual bool isAttached() const { return attached_; } virtual bool isQmlNode() const { return true; } virtual bool isQtQuickNode() const { return parent()->isQtQuickNode(); } + virtual QString qmlTypeName() const { return parent()->qmlTypeName(); } virtual QString qmlModuleName() const { return parent()->qmlModuleName(); } virtual QString qmlModuleVersion() const { return parent()->qmlModuleVersion(); } virtual QString qmlModuleIdentifier() const { return parent()->qmlModuleIdentifier(); } @@ -635,6 +638,7 @@ public: const QString& element() const { return static_cast<QmlPropGroupNode*>(parent())->element(); } void appendQmlPropNode(QmlPropertyNode* p) { qmlPropNodes_.append(p); } const NodeList& qmlPropNodes() const { return qmlPropNodes_; } + void setQPropertyFlag() { qproperty_ = true; } private: QString type_; @@ -642,6 +646,7 @@ private: FlagValue designable_; bool isdefault_; bool attached_; + bool qproperty_; FlagValue readOnly_; NodeList qmlPropNodes_; }; @@ -803,6 +808,7 @@ public: (type() == QmlSignalHandler)); } virtual bool isQtQuickNode() const { return parent()->isQtQuickNode(); } + virtual QString qmlTypeName() const { return parent()->qmlTypeName(); } virtual QString qmlModuleName() const { return parent()->qmlModuleName(); } virtual QString qmlModuleVersion() const { return parent()->qmlModuleVersion(); } virtual QString qmlModuleIdentifier() const { return parent()->qmlModuleIdentifier(); } diff --git a/src/tools/qdoc/qmlvisitor.cpp b/src/tools/qdoc/qmlvisitor.cpp index 1544227fc3..a1031f2e83 100644 --- a/src/tools/qdoc/qmlvisitor.cpp +++ b/src/tools/qdoc/qmlvisitor.cpp @@ -242,7 +242,11 @@ void QmlDocVisitor::applyMetacommands(QQmlJS::AST::SourceLocation, QmlPropArgs qpa; if (splitQmlPropertyArg(doc, topicsUsed.at(i).args, qpa)) { QmlPropertyNode* n = new QmlPropertyNode(qpn, qpa.name_, qpa.type_, false); + n->setLocation(doc.location()); qpn->appendQmlPropNode(n); + n->setReadOnly(qpn->isReadOnly()); + if (qpn->isDefault()) + n->setDefault(); } else qDebug() << " FAILED TO PARSE QML PROPERTY:" @@ -254,7 +258,7 @@ void QmlDocVisitor::applyMetacommands(QQmlJS::AST::SourceLocation, QSet<QString> metacommands = doc.metaCommandsUsed(); if (metacommands.count() > 0) { QString topic; - QStringList args; + ArgList args; QSet<QString>::iterator i = metacommands.begin(); while (i != metacommands.end()) { if (topics.contains(*i)) { @@ -273,7 +277,7 @@ void QmlDocVisitor::applyMetacommands(QQmlJS::AST::SourceLocation, QmlPropertyNode* qpn = static_cast<QmlPropertyNode*>(node); qpn->setReadOnly(0); if (qpn->dataType() == "alias") { - QStringList part = args[0].split(QLatin1Char(' ')); + QStringList part = args[0].first.split(QLatin1Char(' ')); qpn->setDataType(part[0]); } } @@ -319,12 +323,12 @@ void QmlDocVisitor::applyMetacommands(QQmlJS::AST::SourceLocation, QmlClassNode::insertQmlModuleMember(qmid, qcn); } else if (command == COMMAND_QMLINHERITS) { - if (node->name() == args[0]) - doc.location().warning(tr("%1 tries to inherit itself").arg(args[0])); + if (node->name() == args[0].first) + doc.location().warning(tr("%1 tries to inherit itself").arg(args[0].first)); else { - CodeParser::setLink(node, Node::InheritsLink, args[0]); + CodeParser::setLink(node, Node::InheritsLink, args[0].first); if (node->subType() == Node::QmlClass) { - QmlClassNode::addInheritedBy(args[0],node); + QmlClassNode::addInheritedBy(args[0].first,node); } } } @@ -341,10 +345,10 @@ void QmlDocVisitor::applyMetacommands(QQmlJS::AST::SourceLocation, } } else if ((command == COMMAND_INGROUP) && !args.isEmpty()) { - QStringList::ConstIterator arg = args.begin(); - while (arg != args.end()) { - tree->addToGroup(node, *arg); - ++arg; + ArgList::ConstIterator argsIter = args.begin(); + while (argsIter != args.end()) { + tree->addToGroup(node, argsIter->first); + ++argsIter; } } else if (command == COMMAND_INTERNAL) { @@ -362,7 +366,7 @@ void QmlDocVisitor::applyMetacommands(QQmlJS::AST::SourceLocation, node->setStatus(Node::Preliminary); } else if (command == COMMAND_SINCE) { - QString arg = args.join(" "); + QString arg = args[0].first; //.join(" "); node->setSince(arg); } else { @@ -484,22 +488,12 @@ bool QmlDocVisitor::visit(QQmlJS::AST::UiPublicMember *member) if (qmlClass) { QString name = member->name.toString(); QmlPropertyNode *qmlPropNode = new QmlPropertyNode(qmlClass, name, type, false); + //qmlPropNode->setLocation(doc.location()); qmlPropNode->setReadOnly(member->isReadonlyMember); if (member->isDefaultMember) qmlPropNode->setDefault(); applyDocumentation(member->firstSourceLocation(), qmlPropNode); } -#if 0 - if (qmlClass) { - QString name = member->name->asString(); - QmlPropGroupNode *qmlPropGroup = new QmlPropGroupNode(qmlClass, name, false); - if (member->isDefaultMember) - qmlPropGroup->setDefault(); - QmlPropertyNode *qmlPropNode = new QmlPropertyNode(qmlPropGroup, name, type, false); - qmlPropNode->setWritable(!member->isReadonlyMember); - applyDocumentation(member->firstSourceLocation(), qmlPropGroup); - } -#endif } break; } diff --git a/src/tools/uic/qclass_lib_map.h b/src/tools/uic/qclass_lib_map.h index 34ce374750..825813cc29 100644 --- a/src/tools/uic/qclass_lib_map.h +++ b/src/tools/uic/qclass_lib_map.h @@ -777,16 +777,6 @@ QT_CLASS_LIB(QWidgetItem, QtWidgets, qlayoutitem.h) QT_CLASS_LIB(QWidgetItemV2, QtWidgets, qlayoutitem.h) QT_CLASS_LIB(QPalette, QtGui, qpalette.h) QT_CLASS_LIB(QColorGroup, QtWidgets, qpalette.h) -QT_CLASS_LIB(QPlatformCursorImage, QtGui, qplatformcursor_qpa.h) -QT_CLASS_LIB(QPlatformCursorPrivate, QtGui, qplatformcursor_qpa.h) -QT_CLASS_LIB(QPlatformCursor, QtGui, qplatformcursor_qpa.h) -QT_CLASS_LIB(QPlatformOpenGLContext, QtGui, qplatformopenglcontext_qpa.h) -QT_CLASS_LIB(QPlatformIntegration, QtGui, qplatformintegration_qpa.h) -QT_CLASS_LIB(QPlatformIntegrationFactoryInterface, QtGui, qplatformintegrationplugin_qpa.h) -QT_CLASS_LIB(QPlatformIntegrationPlugin, QtGui, qplatformintegrationplugin_qpa.h) -QT_CLASS_LIB(QPlatformScreen, QtGui, qplatformscreen_qpa.h) -QT_CLASS_LIB(QPlatformWindow, QtGui, qplatformwindow_qpa.h) -QT_CLASS_LIB(QPlatformWindowFormat, QtGui, qplatformwindowformat_qpa.h) QT_CLASS_LIB(QSessionManager, QtGui, qsessionmanager.h) QT_CLASS_LIB(QShortcut, QtWidgets, qshortcut.h) QT_CLASS_LIB(QSizePolicy, QtWidgets, qsizepolicy.h) @@ -915,8 +905,6 @@ QT_CLASS_LIB(QFontInfo, QtGui, qfontinfo.h) QT_CLASS_LIB(QFontMetrics, QtGui, qfontmetrics.h) QT_CLASS_LIB(QFontMetricsF, QtGui, qfontmetrics.h) QT_CLASS_LIB(QGlyphs, QtGui, qglyphs.h) -QT_CLASS_LIB(QSupportedWritingSystems, QtGui, qplatformfontdatabase_qpa.h) -QT_CLASS_LIB(QPlatformFontDatabase, QtGui, qplatformfontdatabase_qpa.h) QT_CLASS_LIB(QStaticText, QtGui, qstatictext.h) QT_CLASS_LIB(QSyntaxHighlighter, QtGui, qsyntaxhighlighter.h) QT_CLASS_LIB(QTextCursor, QtGui, qtextcursor.h) |