summaryrefslogtreecommitdiffstats
path: root/src/tools
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools')
-rw-r--r--src/tools/moc/generator.cpp4
-rw-r--r--src/tools/moc/moc.cpp5
-rw-r--r--src/tools/moc/parser.cpp4
-rw-r--r--src/tools/qdoc/codeparser.cpp7
-rw-r--r--src/tools/qdoc/config.cpp2
-rw-r--r--src/tools/qdoc/cppcodeparser.cpp18
-rw-r--r--src/tools/qdoc/ditaxmlgenerator.cpp13
-rw-r--r--src/tools/qdoc/doc/config/qdoc.qdocconf3
-rw-r--r--src/tools/qdoc/generator.cpp2
-rw-r--r--src/tools/qdoc/helpprojectwriter.cpp1
-rw-r--r--src/tools/qdoc/htmlgenerator.cpp17
-rw-r--r--src/tools/qdoc/node.cpp12
-rw-r--r--src/tools/qdoc/node.h11
-rw-r--r--src/tools/qdoc/qdocindexfiles.cpp19
-rw-r--r--src/tools/qdoc/qmlcodeparser.cpp5
-rw-r--r--src/tools/qdoc/qmlvisitor.cpp4
-rw-r--r--src/tools/qdoc/text.cpp5
17 files changed, 112 insertions, 20 deletions
diff --git a/src/tools/moc/generator.cpp b/src/tools/moc/generator.cpp
index e6ffbe157a..44eb4f65e8 100644
--- a/src/tools/moc/generator.cpp
+++ b/src/tools/moc/generator.cpp
@@ -172,12 +172,12 @@ bool Generator::registerableMetaType(const QByteArray &propertyType)
#undef STREAM_1ARG_TEMPLATE
;
foreach (const QByteArray &oneArgTemplateType, oneArgTemplates)
- if (propertyType.startsWith(oneArgTemplateType + "<") && !propertyType.endsWith("&")) {
+ if (propertyType.startsWith(oneArgTemplateType + "<") && propertyType.endsWith(">")) {
const int argumentSize = propertyType.size() - oneArgTemplateType.size() - 1
// The closing '>'
- 1
// templates inside templates have an extra whitespace char to strip.
- - (propertyType.at(propertyType.size() - 2) == '>' ? 1 : 0 );
+ - (propertyType.at(propertyType.size() - 2) == ' ' ? 1 : 0 );
const QByteArray templateArg = propertyType.mid(oneArgTemplateType.size() + 1, argumentSize);
return isBuiltinType(templateArg) || registerableMetaType(templateArg);
}
diff --git a/src/tools/moc/moc.cpp b/src/tools/moc/moc.cpp
index 1ebb82ffad..f3bfcc3144 100644
--- a/src/tools/moc/moc.cpp
+++ b/src/tools/moc/moc.cpp
@@ -1449,6 +1449,11 @@ bool Moc::until(Token target) {
--index;
break;
}
+
+ if (braceCount <= 0 && t == SEMIC) {
+ // Abort on semicolon. Allow recovering bad template parsing (QTBUG-31218)
+ break;
+ }
}
if(target == COMMA && angleCount != 0 && possible != -1) {
diff --git a/src/tools/moc/parser.cpp b/src/tools/moc/parser.cpp
index c0591b69c0..4c754786f7 100644
--- a/src/tools/moc/parser.cpp
+++ b/src/tools/moc/parser.cpp
@@ -64,10 +64,10 @@ void Parser::error(int rollback) {
}
void Parser::error(const char *msg) {
if (msg || error_msg)
- qWarning(ErrorFormatString "Error: %s",
+ fprintf(stderr, ErrorFormatString "Error: %s\n",
currentFilenames.top().constData(), symbol().lineNum, msg?msg:error_msg);
else
- qWarning(ErrorFormatString "Parse error at \"%s\"",
+ fprintf(stderr, ErrorFormatString "Parse error at \"%s\"\n",
currentFilenames.top().constData(), symbol().lineNum, symbol().lexem().data());
exit(EXIT_FAILURE);
}
diff --git a/src/tools/qdoc/codeparser.cpp b/src/tools/qdoc/codeparser.cpp
index 557a6f08fa..7b534a6c95 100644
--- a/src/tools/qdoc/codeparser.cpp
+++ b/src/tools/qdoc/codeparser.cpp
@@ -70,6 +70,7 @@ QT_BEGIN_NAMESPACE
#define COMMAND_SUBTITLE Doc::alias(QLatin1String("subtitle"))
#define COMMAND_THREADSAFE Doc::alias(QLatin1String("threadsafe"))
#define COMMAND_TITLE Doc::alias(QLatin1String("title"))
+#define COMMAND_WRAPPER Doc::alias(QLatin1String("wrapper"))
QString CodeParser::currentSubDir_;
QList<CodeParser *> CodeParser::parsers;
@@ -219,7 +220,8 @@ QSet<QString> CodeParser::commonMetaCommands()
<< COMMAND_SINCE
<< COMMAND_SUBTITLE
<< COMMAND_THREADSAFE
- << COMMAND_TITLE;
+ << COMMAND_TITLE
+ << COMMAND_WRAPPER;
}
/*!
@@ -286,6 +288,9 @@ void CodeParser::processCommonMetaCommand(const Location& location,
else if (command == COMMAND_SINCE) {
node->setSince(arg.first);
}
+ else if (command == COMMAND_WRAPPER) {
+ node->setWrapper();
+ }
else if (command == COMMAND_PAGEKEYWORDS) {
node->addPageKeywords(arg.first);
}
diff --git a/src/tools/qdoc/config.cpp b/src/tools/qdoc/config.cpp
index ce3b34841e..107af96607 100644
--- a/src/tools/qdoc/config.cpp
+++ b/src/tools/qdoc/config.cpp
@@ -310,7 +310,6 @@ QString Config::getString(const QString& var) const
{
QList<ConfigVar> configVars = configVars_.values(var);
QString value;
- int high = 0;
if (!configVars.empty()) {
int i = configVars.size() - 1;
while (i >= 0) {
@@ -324,7 +323,6 @@ QString Config::getString(const QString& var) const
if (!value.isEmpty() && !value.endsWith(QChar('\n')))
value.append(QChar(' '));
value.append(cv.values_[j]);
- high = j;
}
}
--i;
diff --git a/src/tools/qdoc/cppcodeparser.cpp b/src/tools/qdoc/cppcodeparser.cpp
index db7c637b53..dc086c853d 100644
--- a/src/tools/qdoc/cppcodeparser.cpp
+++ b/src/tools/qdoc/cppcodeparser.cpp
@@ -1598,7 +1598,11 @@ bool CppCodeParser::matchBaseList(ClassNode *classe, bool isClass)
}
/*!
- Parse a C++ class, union, or struct declarion.
+ Parse a C++ class, union, or struct declaration.
+
+ This function only handles one level of class nesting, but that is
+ sufficient for Qt because there are no cases of class nesting more
+ than one level deep.
*/
bool CppCodeParser::matchClassDecl(InnerNode *parent,
const QString &templateStuff)
@@ -1612,6 +1616,18 @@ bool CppCodeParser::matchClassDecl(InnerNode *parent,
return false;
while (tok == Tok_Ident)
readToken();
+ if (tok == Tok_Gulbrandsen) {
+ Node* n = parent->findChildNodeByNameAndType(previousLexeme(),Node::Class);
+ if (n) {
+ parent = static_cast<InnerNode*>(n);
+ if (parent) {
+ readToken();
+ if (tok != Tok_Ident)
+ return false;
+ readToken();
+ }
+ }
+ }
if (tok != Tok_Colon && tok != Tok_LeftBrace)
return false;
diff --git a/src/tools/qdoc/ditaxmlgenerator.cpp b/src/tools/qdoc/ditaxmlgenerator.cpp
index 314dda3a9d..eea1845e17 100644
--- a/src/tools/qdoc/ditaxmlgenerator.cpp
+++ b/src/tools/qdoc/ditaxmlgenerator.cpp
@@ -2763,11 +2763,22 @@ void DitaXmlGenerator::generateAnnotatedList(const Node* relative,
writeEndTag(); // </p>
writeEndTag(); // <entry>
}
+ else if (!node->reconstitutedBrief().isEmpty()) {
+ writeStartTag(DT_entry);
+ writeStartTag(DT_p);
+ writeCharacters(node->reconstitutedBrief());
+ writeEndTag(); // </p>
+ writeEndTag(); // <entry>
+ }
}
else {
writeStartTag(DT_entry);
writeStartTag(DT_p);
- writeCharacters(protectEnc(node->doc().briefText().toString())); // zzz
+ if (!node->reconstitutedBrief().isEmpty()) {
+ writeCharacters(node->reconstitutedBrief());
+ }
+ else
+ writeCharacters(protectEnc(node->doc().briefText().toString()));
writeEndTag(); // </p>
writeEndTag(); // <entry>
}
diff --git a/src/tools/qdoc/doc/config/qdoc.qdocconf b/src/tools/qdoc/doc/config/qdoc.qdocconf
index 84e9689f50..a7fbb38463 100644
--- a/src/tools/qdoc/doc/config/qdoc.qdocconf
+++ b/src/tools/qdoc/doc/config/qdoc.qdocconf
@@ -13,7 +13,8 @@ exampledirs = .. \
config
imagedirs = ../../../doc/src/templates/images \
- images
+ ../images \
+ ../../../../widgets/doc/images \
tagfile = ../html/qdoc.tags
diff --git a/src/tools/qdoc/generator.cpp b/src/tools/qdoc/generator.cpp
index d9ee0e42ee..11521fc554 100644
--- a/src/tools/qdoc/generator.cpp
+++ b/src/tools/qdoc/generator.cpp
@@ -656,7 +656,7 @@ void Generator::generateBody(const Node *node, CodeMarker *marker)
}
}
if (node->doc().isEmpty()) {
- if (!quiet && !node->isReimp()) { // ### might be unnecessary
+ if (!node->isWrapper() && !quiet && !node->isReimp()) { // ### might be unnecessary
node->location().warning(tr("No documentation for '%1'").arg(node->plainFullName()));
}
}
diff --git a/src/tools/qdoc/helpprojectwriter.cpp b/src/tools/qdoc/helpprojectwriter.cpp
index fdba15700f..0cdb2de776 100644
--- a/src/tools/qdoc/helpprojectwriter.cpp
+++ b/src/tools/qdoc/helpprojectwriter.cpp
@@ -375,6 +375,7 @@ bool HelpProjectWriter::generateSection(HelpProject &project,
case Node::Document: {
const DocNode *docNode = static_cast<const DocNode*>(node);
if (docNode->subType() != Node::ExternalPage &&
+ docNode->subType() != Node::Image &&
!docNode->fullTitle().isEmpty()) {
if (docNode->subType() != Node::File) {
diff --git a/src/tools/qdoc/htmlgenerator.cpp b/src/tools/qdoc/htmlgenerator.cpp
index d5e079d910..2dc4c1e6c6 100644
--- a/src/tools/qdoc/htmlgenerator.cpp
+++ b/src/tools/qdoc/htmlgenerator.cpp
@@ -2287,10 +2287,19 @@ void HtmlGenerator::generateAnnotatedList(const Node *relative,
generateText(brief, node, marker);
out() << "</p></td>";
}
+ else if (!node->reconstitutedBrief().isEmpty()) {
+ out() << "<td class=\"tblDescr\"><p>";
+ out() << node->reconstitutedBrief();
+ out() << "</p></td>";
+ }
}
else {
out() << "<td class=\"tblDescr\"><p>";
- out() << protectEnc(node->doc().briefText().toString());
+ if (!node->reconstitutedBrief().isEmpty()) {
+ out() << node->reconstitutedBrief();
+ }
+ else
+ out() << protectEnc(node->doc().briefText().toString());
out() << "</p></td>";
}
out() << "</tr>\n";
@@ -4117,8 +4126,6 @@ void HtmlGenerator::generateManifestFile(QString manifest, QString element)
if (child->subType() == Node::File) {
QString file = child->name();
if (file.endsWith(".pro") || file.endsWith(".qmlproject")) {
- if (file.startsWith("demos/"))
- file = file.mid(6);
proFiles << file;
}
}
@@ -4233,8 +4240,6 @@ void HtmlGenerator::generateManifestFile(QString manifest, QString element)
if (baseName.compare(ename, Qt::CaseInsensitive) == 0) {
if (!usedNames.contains(fileName)) {
writer.writeStartElement("fileToOpen");
- if (file.startsWith("demos/"))
- file = file.mid(6);
writer.writeCharacters(examplesPath + file);
writer.writeEndElement(); // fileToOpen
usedNames.insert(fileName);
@@ -4244,8 +4249,6 @@ void HtmlGenerator::generateManifestFile(QString manifest, QString element)
fileName.toLower().endsWith("main.qml")) {
if (!usedNames.contains(fileName)) {
writer.writeStartElement("fileToOpen");
- if (file.startsWith("demos/"))
- file = file.mid(6);
writer.writeCharacters(examplesPath + file);
writer.writeEndElement(); // fileToOpen
usedNames.insert(fileName);
diff --git a/src/tools/qdoc/node.cpp b/src/tools/qdoc/node.cpp
index 028c0a0b2a..e627cf859e 100644
--- a/src/tools/qdoc/node.cpp
+++ b/src/tools/qdoc/node.cpp
@@ -1079,6 +1079,16 @@ void InnerNode::deleteChildren()
*/
/*!
+ Returns true if the node is a class node or a QML type node
+ that is marked as being a wrapper class or QML type, or if
+ it is a member of a wrapper class or type.
+ */
+bool Node::isWrapper() const
+{
+ return (parent_ ? parent_->isWrapper() : false);
+}
+
+/*!
*/
const Node *InnerNode::findChildNodeByName(const QString& name) const
{
@@ -1441,6 +1451,7 @@ ClassNode::ClassNode(InnerNode *parent, const QString& name)
: InnerNode(Class, parent, name)
{
abstract_ = false;
+ wrapper_ = false;
qmlelement = 0;
setPageType(ApiPage);
}
@@ -2105,6 +2116,7 @@ QmlClassNode::QmlClassNode(InnerNode *parent, const QString& name)
: DocNode(parent, name, QmlClass, Node::ApiPage),
abstract_(false),
cnodeRequired_(false),
+ wrapper_(false),
cnode_(0),
baseNode_(0)
{
diff --git a/src/tools/qdoc/node.h b/src/tools/qdoc/node.h
index d1a95358f0..bc75df2992 100644
--- a/src/tools/qdoc/node.h
+++ b/src/tools/qdoc/node.h
@@ -179,6 +179,7 @@ public:
void setLink(LinkType linkType, const QString &link, const QString &desc);
void setUrl(const QString &url);
void setTemplateStuff(const QString &templateStuff) { templateStuff_ = templateStuff; }
+ void setReconstitutedBrief(const QString &t) { reconstitutedBrief_ = t; }
void setPageType(PageType t) { pageType_ = t; }
void setPageType(const QString& t);
void setParent(InnerNode* n) { parent_ = n; }
@@ -200,11 +201,13 @@ public:
virtual bool isCollisionNode() const { return false; }
virtual bool isAttached() const { return false; }
virtual bool isGroup() const { return false; }
+ virtual bool isWrapper() const;
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 QString title() const { return QString(); }
virtual bool hasProperty(const QString& ) const { return false; }
virtual void getMemberNamespaces(NodeMap& ) { }
@@ -235,6 +238,7 @@ public:
ThreadSafeness inheritedThreadSafeness() const;
QString since() const { return since_; }
QString templateStuff() const { return templateStuff_; }
+ const QString& reconstitutedBrief() const { return reconstitutedBrief_; }
PageType pageType() const { return pageType_; }
QString pageTypeString() const;
QString nodeTypeString() const;
@@ -296,6 +300,7 @@ private:
QString url_;
QString since_;
QString templateStuff_;
+ QString reconstitutedBrief_;
mutable QString uuid_;
QString outSubDir_;
QString qmlModuleName_;
@@ -437,8 +442,10 @@ public:
ClassNode(InnerNode* parent, const QString& name);
virtual ~ClassNode() { }
virtual bool isClass() const { return true; }
+ virtual bool isWrapper() const { return wrapper_; }
virtual QString obsoleteLink() const { return obsoleteLink_; }
virtual void setObsoleteLink(const QString& t) { obsoleteLink_ = t; };
+ virtual void setWrapper() { wrapper_ = true; }
void addBaseClass(Access access,
ClassNode* node,
@@ -463,6 +470,7 @@ private:
QList<RelatedClass> derived;
QList<RelatedClass> ignoredBases;
bool abstract_;
+ bool wrapper_;
QString sname;
QString obsoleteLink_;
QmlClassNode* qmlelement;
@@ -568,7 +576,9 @@ public:
virtual void setCurrentChild();
virtual void clearCurrentChild();
virtual bool isAbstract() const { return abstract_; }
+ virtual bool isWrapper() const { return wrapper_; }
virtual void setAbstract(bool b) { abstract_ = b; }
+ virtual void setWrapper() { wrapper_ = true; }
virtual bool isInternal() const { return (status() == Internal); }
virtual QString qmlFullBaseName() const;
virtual QString obsoleteLink() const { return obsoleteLink_; }
@@ -592,6 +602,7 @@ public:
private:
bool abstract_;
bool cnodeRequired_;
+ bool wrapper_;
ClassNode* cnode_;
QString baseName_;
QString obsoleteLink_;
diff --git a/src/tools/qdoc/qdocindexfiles.cpp b/src/tools/qdoc/qdocindexfiles.cpp
index 59adc63c9e..daba2cc78a 100644
--- a/src/tools/qdoc/qdocindexfiles.cpp
+++ b/src/tools/qdoc/qdocindexfiles.cpp
@@ -505,6 +505,10 @@ void QDocIndexFiles::readIndexSection(const QDomElement& element,
node->setDoc(doc);
node->setIndexNodeFlag();
node->setOutputSubdirectory(project_.toLower());
+ QString briefAttr = element.attribute("brief");
+ if (!briefAttr.isEmpty()) {
+ node->setReconstitutedBrief(briefAttr);
+ }
if (node->isInnerNode()) {
InnerNode* inner = static_cast<InnerNode*>(node);
@@ -754,6 +758,7 @@ bool QDocIndexFiles::generateIndexSection(QXmlStreamWriter& writer,
writer.writeAttribute("since", node->since());
}
+ QString brief = node->doc().briefText().toString();
switch (node->type()) {
case Node::Class:
{
@@ -769,6 +774,8 @@ bool QDocIndexFiles::generateIndexSection(QXmlStreamWriter& writer,
if (!node->moduleName().isEmpty())
writer.writeAttribute("module", node->moduleName());
writeMembersAttribute(writer, classNode, Node::Document, Node::Group, "groups");
+ if (!brief.isEmpty())
+ writer.writeAttribute("brief", brief);
}
break;
case Node::Namespace:
@@ -777,6 +784,8 @@ bool QDocIndexFiles::generateIndexSection(QXmlStreamWriter& writer,
if (!namespaceNode->moduleName().isEmpty())
writer.writeAttribute("module", namespaceNode->moduleName());
writeMembersAttribute(writer, namespaceNode, Node::Document, Node::Group, "groups");
+ if (!brief.isEmpty())
+ writer.writeAttribute("brief", brief);
}
break;
case Node::Document:
@@ -843,6 +852,8 @@ bool QDocIndexFiles::generateIndexSection(QXmlStreamWriter& writer,
writer.writeAttribute("module", node->moduleName());
}
writeMembersAttribute(writer, docNode, Node::Document, Node::Group, "groups");
+ if (!brief.isEmpty())
+ writer.writeAttribute("brief", brief);
}
break;
case Node::Function:
@@ -902,6 +913,8 @@ bool QDocIndexFiles::generateIndexSection(QXmlStreamWriter& writer,
if (propertyNode)
writer.writeAttribute("associated-property", propertyNode->name());
writer.writeAttribute("type", functionNode->returnType());
+ if (!brief.isEmpty())
+ writer.writeAttribute("brief", brief);
}
break;
case Node::QmlProperty:
@@ -910,12 +923,16 @@ bool QDocIndexFiles::generateIndexSection(QXmlStreamWriter& writer,
writer.writeAttribute("type", qpn->dataType());
writer.writeAttribute("attached", qpn->isAttached() ? "true" : "false");
writer.writeAttribute("writable", qpn->isWritable(qdb_) ? "true" : "false");
+ if (!brief.isEmpty())
+ writer.writeAttribute("brief", brief);
}
break;
case Node::Property:
{
const PropertyNode* propertyNode = static_cast<const PropertyNode*>(node);
writer.writeAttribute("type", propertyNode->dataType());
+ if (!brief.isEmpty())
+ writer.writeAttribute("brief", brief);
foreach (const Node* fnNode, propertyNode->getters()) {
if (fnNode) {
const FunctionNode* functionNode = static_cast<const FunctionNode*>(fnNode);
@@ -955,6 +972,8 @@ bool QDocIndexFiles::generateIndexSection(QXmlStreamWriter& writer,
const VariableNode* variableNode = static_cast<const VariableNode*>(node);
writer.writeAttribute("type", variableNode->dataType());
writer.writeAttribute("static", variableNode->isStatic() ? "true" : "false");
+ if (!brief.isEmpty())
+ writer.writeAttribute("brief", brief);
}
break;
default:
diff --git a/src/tools/qdoc/qmlcodeparser.cpp b/src/tools/qdoc/qmlcodeparser.cpp
index c86982eb95..b9c0ad9218 100644
--- a/src/tools/qdoc/qmlcodeparser.cpp
+++ b/src/tools/qdoc/qmlcodeparser.cpp
@@ -63,6 +63,7 @@ QT_BEGIN_NAMESPACE
#define COMMAND_PAGEKEYWORDS Doc::alias("pagekeywords")
#define COMMAND_PRELIMINARY Doc::alias("preliminary")
#define COMMAND_SINCE Doc::alias("since")
+#define COMMAND_WRAPPER Doc::alias("wrapper")
#define COMMAND_QMLABSTRACT Doc::alias("qmlabstract")
#define COMMAND_QMLCLASS Doc::alias("qmlclass")
@@ -228,8 +229,8 @@ QSet<QString> QmlCodeParser::otherMetaCommands()
<< COMMAND_PRELIMINARY
<< COMMAND_SINCE
<< COMMAND_QMLABSTRACT
- << COMMAND_INQMLMODULE;
-
+ << COMMAND_INQMLMODULE
+ << COMMAND_WRAPPER;
}
/*!
diff --git a/src/tools/qdoc/qmlvisitor.cpp b/src/tools/qdoc/qmlvisitor.cpp
index ac659720b2..86b86c8f34 100644
--- a/src/tools/qdoc/qmlvisitor.cpp
+++ b/src/tools/qdoc/qmlvisitor.cpp
@@ -60,6 +60,7 @@ QT_BEGIN_NAMESPACE
#define COMMAND_PAGEKEYWORDS Doc::alias(QLatin1String("pagekeywords"))
#define COMMAND_PRELIMINARY Doc::alias(QLatin1String("preliminary"))
#define COMMAND_SINCE Doc::alias(QLatin1String("since"))
+#define COMMAND_WRAPPER Doc::alias(QLatin1String("wrapper"))
#define COMMAND_QMLABSTRACT Doc::alias(QLatin1String("qmlabstract"))
#define COMMAND_QMLCLASS Doc::alias(QLatin1String("qmlclass"))
@@ -367,6 +368,9 @@ void QmlDocVisitor::applyMetacommands(QQmlJS::AST::SourceLocation,
QString arg = args[0].first; //.join(' ');
node->setSince(arg);
}
+ else if (command == COMMAND_WRAPPER) {
+ node->setWrapper();
+ }
else {
doc.location().warning(tr("The \\%1 command is ignored in QML files").arg(command));
}
diff --git a/src/tools/qdoc/text.cpp b/src/tools/qdoc/text.cpp
index 2d218bd469..e2f682726d 100644
--- a/src/tools/qdoc/text.cpp
+++ b/src/tools/qdoc/text.cpp
@@ -149,6 +149,11 @@ void Text::stripLastAtom()
}
}
+/*!
+ This function traverses the atom list of the Text object,
+ extracting all the string parts. It concatenates them to
+ a result string and returns it.
+ */
QString Text::toString() const
{
QString str;