24
25
26
27
30
31
32
33
34TagFileWriter::TagFileWriter() : m_qdb(QDocDatabase::qdocDB()) { }
37
38
39
43 std::sort(nonFunctionChildren.begin(), nonFunctionChildren.end(),
45 for (
const auto *node : nonFunctionChildren) {
46 if (!node->url().isNull() || node->isPrivate())
50 switch (node->nodeType()) {
51 case NodeType::Namespace:
55 case NodeType::Struct:
57 case NodeType::QmlType:
63 const auto *aggregate =
static_cast<
const Aggregate *>(node);
65 QString access =
"public";
66 if (node->isProtected())
69 QString objName = node->name();
72 if (objName.isEmpty() && node != m_qdb->primaryTreeRoot())
76 writer.writeStartElement(
"compound");
77 writer.writeAttribute(
"kind", kind);
79 if (node->isClassNode()) {
80 writer.writeTextElement(
"name", node->fullDocumentName());
81 writer.writeTextElement(
"filename", m_generator->fullDocumentLocation(node));
84 const auto *classNode =
static_cast<
const ClassNode *>(node);
85 const QList<RelatedClass> &bases = classNode->baseClasses();
86 for (
const auto &related : bases) {
87 ClassNode *n = related.m_node;
89 writer.writeTextElement(
"base", n->name());
93 generateTagFileMembers(writer, aggregate);
94 writer.writeEndElement();
97 generateTagFileCompounds(writer, aggregate);
99 writer.writeTextElement(
"name", node->fullDocumentName());
100 writer.writeTextElement(
"filename", m_generator->fullDocumentLocation(node));
103 generateTagFileMembers(writer, aggregate);
104 writer.writeEndElement();
107 generateTagFileCompounds(writer, aggregate);
113
114
115
120 for (
const auto *node : childNodes) {
121 if (!node->url().isNull())
126 switch (node->nodeType()) {
128 case NodeType::QmlEnum:
130 kind =
"enumeration";
132 case NodeType::TypeAlias:
133 case NodeType::Typedef:
137 case NodeType::Property:
141 case NodeType::Function:
145 case NodeType::Namespace:
146 nodeName =
"namespace";
148 case NodeType::Class:
149 case NodeType::Struct:
150 case NodeType::Union:
153 case NodeType::Variable:
159 switch (node->access()) {
163 case Access::Protected:
164 access =
"protected";
166 case Access::Private:
171 QString objName = node->name();
174 if (objName.isEmpty() && node != m_qdb->primaryTreeRoot())
178 writer.writeStartElement(nodeName);
180 writer.writeAttribute(
"kind", kind);
182 switch (node->nodeType()) {
183 case NodeType::Class:
184 case NodeType::Struct:
185 case NodeType::Union:
186 writer.writeCharacters(node->fullDocumentName());
187 writer.writeEndElement();
189 case NodeType::Namespace:
190 writer.writeCharacters(node->fullDocumentName());
191 writer.writeEndElement();
193 case NodeType::Function: {
195
196
197
199 const auto *functionNode =
static_cast<
const FunctionNode *>(node);
200 writer.writeAttribute(
"protection", access);
201 writer.writeAttribute(
"virtualness", functionNode->virtualness());
202 writer.writeAttribute(
"static", functionNode->isStatic() ?
"yes" :
"no");
204 if (functionNode->isNonvirtual())
205 writer.writeTextElement(
"type", functionNode->returnType());
207 writer.writeTextElement(
"type",
"virtual " + functionNode->returnType());
209 writer.writeTextElement(
"name", objName);
210 const QStringList pieces =
211 m_generator->fullDocumentLocation(node).split(QLatin1Char(
'#'));
212 writer.writeTextElement(
"anchorfile", pieces[0]);
213 writer.writeTextElement(
"anchor", pieces[1]);
214 QString signature = functionNode->signature(Node::SignatureReturnType);
215 signature = signature.mid(signature.indexOf(QChar(
'('))).trimmed();
216 if (functionNode->isConst())
217 signature +=
" const";
218 if (functionNode->isFinal())
219 signature +=
" final";
220 if (functionNode->isOverride())
221 signature +=
" override";
222 if (functionNode->isPureVirtual())
224 writer.writeTextElement(
"arglist", signature);
226 writer.writeEndElement();
228 case NodeType::Property: {
229 const auto *propertyNode =
static_cast<
const PropertyNode *>(node);
230 writer.writeAttribute(
"type", propertyNode->dataType());
231 writer.writeTextElement(
"name", objName);
232 const QStringList pieces =
233 m_generator->fullDocumentLocation(node).split(QLatin1Char(
'#'));
234 writer.writeTextElement(
"anchorfile", pieces[0]);
235 writer.writeTextElement(
"anchor", pieces[1]);
236 writer.writeTextElement(
"arglist", QString());
238 writer.writeEndElement();
240 case NodeType::QmlEnum:
241 case NodeType::Enum: {
242 const auto *enumNode =
static_cast<
const EnumNode *>(node);
243 writer.writeTextElement(
"name", objName);
244 const QStringList pieces =
245 m_generator->fullDocumentLocation(node).split(QLatin1Char(
'#'));
246 writer.writeTextElement(
"anchorfile", pieces[0]);
247 writer.writeTextElement(
"anchor", pieces[1]);
248 writer.writeEndElement();
250 for (
const auto &item : enumNode->items()) {
251 writer.writeStartElement(
"member");
252 writer.writeAttribute(
"kind",
"enumvalue");
253 writer.writeTextElement(
"name", item.name());
254 writer.writeTextElement(
"anchorfile", pieces[0]);
255 writer.writeTextElement(
"anchor", pieces[1]);
256 writer.writeTextElement(
"arglist", QString());
257 writer.writeEndElement();
260 case NodeType::TypeAlias:
261 case NodeType::Typedef: {
262 const auto *typedefNode =
static_cast<
const TypedefNode *>(node);
263 if (typedefNode->associatedEnum())
264 writer.writeAttribute(
"type", typedefNode->associatedEnum()->fullDocumentName());
266 writer.writeAttribute(
"type", QString());
267 writer.writeTextElement(
"name", objName);
268 const QStringList pieces =
269 m_generator->fullDocumentLocation(node).split(QLatin1Char(
'#'));
270 writer.writeTextElement(
"anchorfile", pieces[0]);
271 writer.writeTextElement(
"anchor", pieces[1]);
272 writer.writeTextElement(
"arglist", QString());
274 writer.writeEndElement();
277 case NodeType::Variable:
285
286
289 QFile file(fileName);
290 QFileInfo fileInfo(fileName);
294 if (fileInfo.fileName() == fileName || !fileInfo.dir().exists())
295 file.setFileName(m_generator->outputDir() + QLatin1Char(
'/') + fileInfo.fileName());
297 if (!file.open(QFile::WriteOnly | QFile::Text)) {
298 Location().warning(QString(
"Failed to open %1 for writing.").arg(file.fileName()));
303 QXmlStreamWriter writer(&file);
304 writer.setAutoFormatting(
true);
305 writer.writeStartDocument();
306 writer.writeStartElement(
"tagfile");
307 generateTagFileCompounds(writer, m_qdb->primaryTreeRoot());
308 writer.writeEndElement();
309 writer.writeEndDocument();
NodeList nonFunctionChildren() const
Returns a copy of the child nodes of this aggregate that are not function nodes, in the order they ap...
const NodeList & childNodes() const
Returns a const reference to the child list.
The Location class provides a way to mark a location in a file.
Location()
Constructs an empty location.
This class handles the generation of the QDoc tag files.
Combined button and popup list for selecting options.
The Node class is the base class for all the nodes in QDoc's parse tree.
static bool nodeNameLessThan(const Node *first, const Node *second)
Returns true if the node n1 is less than node n2.
static bool nodeLessThan(const Node *first, const Node *second)
Returns true if the node n1 is less than node n2.