From 391b2accd87f02c9c0b1a4e766e50377d5918887 Mon Sep 17 00:00:00 2001 From: Martin Smith Date: Thu, 3 Jul 2014 15:12:44 +0200 Subject: [PATCH] qdoc: ASSERT failure while writing index file An attempt was made to write an XML attribute after the atart tag had been closed. This has been fixed by moving some code around. Change-Id: I279d91c345f4217dab8fc47faabe3350258d9ece Task-number: Qt QTBUG-40039 Reviewed-by: Jerome Pasion Reviewed-by: Shawn Rutledge Reviewed-by: Mitch Curtis --- src/tools/qdoc/qdocindexfiles.cpp | 80 ++++++++++++++++--------------- 1 file changed, 41 insertions(+), 39 deletions(-) diff --git a/src/tools/qdoc/qdocindexfiles.cpp b/src/tools/qdoc/qdocindexfiles.cpp index 317209dd64..4531ce8eea 100644 --- a/src/tools/qdoc/qdocindexfiles.cpp +++ b/src/tools/qdoc/qdocindexfiles.cpp @@ -1070,6 +1070,25 @@ bool QDocIndexFiles::generateIndexSection(QXmlStreamWriter& writer, writer.writeAttribute("type", functionNode->returnType()); if (!brief.isEmpty()) writer.writeAttribute("brief", brief); + + /* + Note: The "signature" attribute is written to the + index file, but it is not read back in. Is that ok? + */ + QString signature = functionNode->signature(); + if (functionNode->isConst()) + signature += " const"; + writer.writeAttribute("signature", signature); + + for (int i = 0; i < functionNode->parameters().size(); ++i) { + Parameter parameter = functionNode->parameters()[i]; + writer.writeStartElement("parameter"); + writer.writeAttribute("left", parameter.leftType()); + writer.writeAttribute("right", parameter.rightType()); + writer.writeAttribute("name", parameter.name()); + writer.writeAttribute("default", parameter.defaultValue()); + writer.writeEndElement(); // parameter + } } break; case Node::QmlProperty: @@ -1137,6 +1156,28 @@ bool QDocIndexFiles::generateIndexSection(QXmlStreamWriter& writer, writer.writeAttribute("brief", brief); } break; + case Node::Enum: + { + const EnumNode* enumNode = static_cast(node); + if (enumNode->flagsType()) { + writer.writeAttribute("typedef",enumNode->flagsType()->fullDocumentName()); + } + foreach (const EnumItem& item, enumNode->items()) { + writer.writeStartElement("value"); + writer.writeAttribute("name", item.name()); + writer.writeAttribute("value", item.value()); + writer.writeEndElement(); // value + } + } + break; + case Node::Typedef: + { + const TypedefNode* typedefNode = static_cast(node); + if (typedefNode->associatedEnum()) { + writer.writeAttribute("enum",typedefNode->associatedEnum()->fullDocumentName()); + } + } + break; default: break; } @@ -1198,45 +1239,6 @@ bool QDocIndexFiles::generateIndexSection(QXmlStreamWriter& writer, } } } - else if (node->type() == Node::Function) { - const FunctionNode* functionNode = static_cast(node); - /* - Note: The "signature" attribute is written to the - index file, but it is not read back in. Is that ok? - */ - QString signature = functionNode->signature(); - if (functionNode->isConst()) - signature += " const"; - writer.writeAttribute("signature", signature); - - for (int i = 0; i < functionNode->parameters().size(); ++i) { - Parameter parameter = functionNode->parameters()[i]; - writer.writeStartElement("parameter"); - writer.writeAttribute("left", parameter.leftType()); - writer.writeAttribute("right", parameter.rightType()); - writer.writeAttribute("name", parameter.name()); - writer.writeAttribute("default", parameter.defaultValue()); - writer.writeEndElement(); // parameter - } - } - else if (node->type() == Node::Enum) { - const EnumNode* enumNode = static_cast(node); - if (enumNode->flagsType()) { - writer.writeAttribute("typedef",enumNode->flagsType()->fullDocumentName()); - } - foreach (const EnumItem& item, enumNode->items()) { - writer.writeStartElement("value"); - writer.writeAttribute("name", item.name()); - writer.writeAttribute("value", item.value()); - writer.writeEndElement(); // value - } - } - else if (node->type() == Node::Typedef) { - const TypedefNode* typedefNode = static_cast(node); - if (typedefNode->associatedEnum()) { - writer.writeAttribute("enum",typedefNode->associatedEnum()->fullDocumentName()); - } - } return true; }