22#include <QtCore/quuid.h>
23#include <QtCore/qversionnumber.h>
29using namespace Qt::StringLiterals;
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
55#define LT_RETURN_IF_NOT_EQUAL(a, b)
60#define LT_RETURN_IF_NOT_EQUAL_QSTR(a, b)
62 return QString::compare(a, b) < 0
;
65
66
67
68
69
70
71
72
73
74
75
76
77
81 const auto *f1 =
static_cast<
const FunctionNode *>(n1);
82 const auto *f2 =
static_cast<
const FunctionNode *>(n2);
86 f2->signature(Node::SignatureReturnType));
100
101
102
103
104
105
106
107
108
109
118 const auto *f1 =
static_cast<
const FunctionNode *>(n1);
119 const auto *f2 =
static_cast<
const FunctionNode *>(n2);
138 const auto *f1 =
static_cast<
const FunctionNode *>(n1);
139 const auto *f2 =
static_cast<
const FunctionNode *>(n2);
148
149
150
151
152
153
154
155
156
157
158
159
162 const QString default_sortkey{QChar{QChar::LastValidCodePoint}};
165 if (
auto cmp = QString::compare(
166 n1_metamap ? n1_metamap->value(u"sortkey"_s, default_sortkey) : default_sortkey,
167 n2_metamap ? n2_metamap->value(u"sortkey"_s, default_sortkey) : default_sortkey); cmp != 0) {
188
189
190
191
192
193
194
197
198
199
200
201
202
203
206
207
208
209
210
211
212
213
216
217
218
219
220
221
222
223
224
225
226
229
230
231
232
233
234
235
236
237
240
241
242
243
244
245
246
247
248
251
252
253
254
255
256
257
258
259
260
261
264
265
266
267
268
271
272
275
276
279
280
283
284
287
288
291
292
295
296
299
300
303
304
307
308
311
312
315
316
319
320
323
324
327
328
331
332
335
336
339
340
343
344
347
348
351
352
355
356
359
360
363
364
367
368
371
372
375
376
379
380
383
384
387
388
391
392
395
396
399
400
403
404
407
408
411
412
413
416
417
420
421
424
425
428
429
432
433
436
437
440
441
442
445
446
447
448
451
452
453
454
457
458
459
460
463
464
465
468
469
472
473
476
477
478
479
482 if (isFunction() && !isMacro())
483 return m_name + QLatin1String(
"()");
488
489
490
491
492
493
496 if (m_name.isEmpty())
497 return QLatin1String(
"global");
502 const Node *node =
this;
504 parts.prepend(node->plainName());
509 return parts.join(QLatin1String(
"::"));
513
514
515
516
517
520 if (m_name.isEmpty())
521 return QLatin1String(
"global");
524 const Node *node =
this;
529 fullName.prepend(QLatin1String(
"::"));
536
537
538
539
542 if ((isTextPageNode() || isGroup()) && !title().isEmpty())
544 return plainFullName(relative);
548
549
550
551
552
553
554
555
559 doc
.location().warning(QStringLiteral(
"Overrides a previous doc"),
560 QStringLiteral(
"from here: %1").arg(m_doc
.location().toString()));
566
567
568
569
578 const InclusionPolicy policy = Config::instance().createInclusionPolicy();
583 case Status::DontDocument:
584 m_url = QStringLiteral(
"");
592
593
594
595
598 m_indexNodeFlag(
false),
599 m_relatedNonmember(
false),
611
612
613
614
615
616
617
618
650 return Genus::DontCare;
655
656
657
658
659
660
661
664
665
666
667
668
669
670
671
674
675
676
680 const auto *fn =
static_cast<
const FunctionNode *>(
this);
681 return fn->kindString();
683 return nodeTypeString(nodeType());
687
688
689
694 return QLatin1String(
"namespace");
696 return QLatin1String(
"class");
698 return QLatin1String(
"struct");
700 return QLatin1String(
"union");
702 return QLatin1String(
"header");
704 return QLatin1String(
"page");
706 return QLatin1String(
"enum");
708 return QLatin1String(
"example");
710 return QLatin1String(
"external page");
713 return QLatin1String(
"typedef");
715 return QLatin1String(
"function");
717 return QLatin1String(
"property");
719 return QLatin1String(
"proxy");
721 return QLatin1String(
"variable");
723 return QLatin1String(
"group");
725 return QLatin1String(
"module");
728 return QLatin1String(
"QML type");
730 return QLatin1String(
"QML value type");
732 return QLatin1String(
"QML module");
734 return QLatin1String(
"QML property");
737 return QLatin1String(
"shared comment");
739 return QLatin1String(
"collection");
747
748
749
756
757
758
759
760
774
775
776
777
778void Node::setLink(LinkType linkType,
const QString &link,
const QString &desc)
780 std::pair<QString, QString> linkPair;
781 linkPair.first =
std::move(link);
782 linkPair.second =
std::move(desc);
783 m_linkMap[linkType] = std::move(linkPair);
787
788
789
790
793 QStringList parts = since.split(QLatin1Char(
' '));
795 if (parts.size() > 1)
796 project = Config::dot + parts.first();
798 QVersionNumber cutoff =
799 QVersionNumber::fromString(Config::instance().get(
CONFIG_IGNORESINCE + project).asString())
802 if (!cutoff.isNull() && QVersionNumber::fromString(parts.last()).normalized() < cutoff)
805 m_since = parts.join(QLatin1Char(
' '));
809
810
814 for (
int i = 0; i <= string.size(); ++i) {
816 if (i != string.size())
819 QChar lower = ch.toLower();
820 if ((lower >= QLatin1Char(
'a') && lower <= QLatin1Char(
'z')) || ch.digitValue() >= 0
821 || ch == QLatin1Char(
'_') || ch == QLatin1Char(
':')) {
823 }
else if (!result.isEmpty()) {
824 if (result != QLatin1String(
"const"))
833
834
835
836
837
838
847
848
849
850
859
860
861
870
871
874
875
878 if (parent() ==
nullptr)
879 return (
this->isAggregate() ?
static_cast<Aggregate *>(
const_cast<Node *>(
this)) :
nullptr);
887
888
895
896
897
898
901 QString suffix = t.fileSuffix();
904 else if (suffix ==
"cpp")
913
914
915
916
919 const InclusionPolicy policy = Config::instance().createInclusionPolicy();
926
927
928
929
930
931
940 return (m_sharedCommentNode && m_sharedCommentNode
->hasDoc());
944
945
946
949 if (m_parent && m_parent->isNamespace() && !m_parent->name().isEmpty())
950 return m_parent->name() +
"::" + m_name;
955
956
957
960 if (m_parent && !m_parent->name().isEmpty())
961 return m_parent->name() +
"::" + m_name;
966
967
968
971 return logicalModuleName() +
"::" + m_name;
975
976
977
978
981 return m_parent !=
nullptr && m_parent
->isWrapper();
985
986
990 const Node *n =
this;
993 if (!n->name().isEmpty())
994 pieces.insert(0, n->name());
997 pieces.insert(0, n->logicalModuleName());
1012 QString concatenator =
"::";
1014 concatenator = QLatin1Char(
'.');
1017 concatenator = QLatin1Char(
'#');
1019 return pieces.join(concatenator);
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1037 if (!m_deprecatedSince.isEmpty())
1038 qCWarning(lcQdoc) << QStringLiteral(
1039 "Setting deprecated since version for %1 to %2 even though it "
1040 "was already set to %3. This is very unexpected.")
1041 .arg(
this->m_name, sinceVersion,
this->m_deprecatedSince);
1042 m_deprecatedSince = sinceVersion;
1044 if (!sinceVersion.isEmpty()) {
1045 QVersionNumber since = QVersionNumber::fromString(sinceVersion).normalized();
1046 QVersionNumber current = QVersionNumber::fromString(
1049 if (!current.isNull() && !since.isNull()) {
1050 if (current < since)
1058
1059
1060
1061
1062
1063
1064
1065
1068
1069
1070
1071
1074
1075
1076
1077
1080
1081
1084
1085
1086
1087
1088
1089
1090
1091
1094
1095
1096
1099
1100
1101
1102
1105
1106
1107
1110
1111
1112
1113
1116
1117
1118
1119
1122
1123
1126
1127
1128
1129
1132
1133
1134
1135
1136
1137
1140
1141
1142
1143
1144
1145
1146
1149
1150
1151
1154
1155
1156
1159
1160
1161
1164
1165
1166
1169
1170
1171
1174
1175
1176
1179
1180
1181
1182
1185
1186
1187
1188
1189
1192
1193
1194
1195
1196
1199
1200
1201
1202
1205
1206
1207
1208
1209
1210
1211
1212
1215
1216
1217
1218
1219
1222
1223
1224
1225
1226
1229
1230
1231
1232
1233
1234
1237
1238
1239
1240
1241
1242
1243
1246
1247
1248
1249
1250
1251
1252
1253
1256
1257
1258
1261
1262
1263
1266
1267
1270
1271
1274
1275
1276
1277
1280
1281
1282
1283
1286
1287
1288
1289
1292
1293
1294
1295
1296
1299
1300
1301
1304
1305
1306
1307
1308
1311
1312
1313
1314
1315
1316
1317
1320
1321
1322
1323
1324
1325
1328
1329
1330
1331
1334
1335
1336
1337
1340
1341
1344
1345
1346
1349
1350
1351
1352
1353
1356
1357
1358
1359
1362
1363
1364
1367
1368
1369
1372
1373
1374
1377
1378
1379
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1408
1409
1410
1411
1414
1415
1416
1419
1420
1421
1422
1425
1426
1427
1428
1431
1432
1433
1434
1435
1436
void addChild(Node *child)
Adds the child to this node's child list and sets the child's parent pointer to this Aggregate.
const Location & location() const
Returns the starting location of a qdoc comment.
Doc & operator=(const Doc &doc)
bool isMarkedReimp() const
Returns true if the set of metacommands used in the doc comment contains {reimp}.
bool isAutoGenerated() const
Returns true if this documentation was auto-generated by QDoc rather than written by an author.
QStringMultiMap * metaTagMap() const
static bool processInternalDocs(const InclusionPolicy &policy)
static bool isIncluded(const InclusionPolicy &policy, const NodeContext &context)
The Location class provides a way to mark a location in a file.
int lineNo() const
Returns the current line number.
Status
Specifies the status of the QQmlIncubator.
This class constructs and maintains a tree of instances of the subclasses of Node.
#define CONFIG_IGNORESINCE
Combined button and popup list for selecting options.
#define LT_RETURN_IF_NOT_EQUAL(a, b)
#define LT_RETURN_IF_NOT_EQUAL_QSTR(a, b)
The Node class is the base class for all the nodes in QDoc's parse tree.
bool isDontDocument() const
Returns true if this node's status is DontDocument.
virtual QString plainName() const
Returns this node's name member.
const Doc & doc() const
Returns a reference to the node's Doc data member.
virtual bool isWrapper() const
Returns true if the node is a class node or a QML type node that is marked as being a wrapper class o...
bool isPrivate() const
Returns true if this node's access is Private.
virtual bool isAbstract() const
Returns true if the ClassNode or QmlTypeNode is marked abstract.
QString nodeTypeString() const
Returns this node's type as a string for use as an attribute value in XML or HTML.
bool isQmlType() const
Returns true if the node type is QmlType or QmlValueType.
virtual bool isInternal() const
Returns true if the node's status is Internal, or if its parent is a class with Internal status.
bool isHeader() const
Returns true if the node type is HeaderFile.
NodeType nodeType() const override
Returns this node's type.
virtual bool isPageNode() const
Returns true if this node represents something that generates a documentation page.
virtual Status status() const
Returns the node's status value.
virtual bool isTextPageNode() const
Returns true if the node is a PageNode but not an Aggregate.
Aggregate * parent() const
Returns the node's parent pointer.
static bool fromFlagValue(FlagValue fv, bool defaultValue)
Converts the enum fv back to a boolean value.
void setLocation(const Location &t)
Sets the node's declaration location, its definition location, or both, depending on the suffix of th...
QString plainFullName(const Node *relative=nullptr) const
Constructs and returns the node's fully qualified name by recursively ascending the parent links and ...
FlagValue
A value used in PropertyNode and QmlPropertyNode that can be -1, 0, or +1.
QString qualifyQmlName()
Returns the QML node's qualified name by prepending the logical module name.
static bool nodeNameLessThan(const Node *first, const Node *second)
Returns true if the node n1 is less than node n2.
QString qualifyCppName()
Returns the CPP node's qualified name by prepending the namespaces name + "::" if there isw a namespa...
ThreadSafeness inheritedThreadSafeness() const
If this node has a parent, the parent's thread safeness value is returned.
const Location & location() const
If this node's definition location is empty, this function returns this node's declaration location.
Access access() const
Returns the node's Access setting, which can be Public, Protected, or Private.
bool isFunction(Genus g=Genus::DontCare) const
Returns true if this is a FunctionNode and its Genus is set to g.
ThreadSafeness threadSafeness() const
Returns the thread safeness value for whatever this node represents.
virtual bool isInAPI() const
Returns true if this node is considered to be part of the API as per the InclusionPolicy retrieved fr...
QString fullDocumentName() const
Construct the full document name for this node and return it.
virtual Tree * tree() const
Returns a pointer to the Tree this node is in.
NodeContext createContext() const
void setDoc(const Doc &doc, bool replace=false)
Sets this Node's Doc to doc.
Node(NodeType type, Aggregate *parent, QString name)
Construct a node with the given type and having the given parent and name.
ThreadSafeness
An unsigned char that specifies the degree of thread-safeness of the element.
QString fullName(const Node *relative) const
Constructs and returns this node's full name.
virtual bool isPureVirtual() const
bool hasDoc() const
Returns true if this node is documented, or it represents a documented node read from the index ('had...
static Genus getGenus(NodeType t)
Determines the appropriate Genus value for the NodeType value t and returns that Genus value.
static FlagValue toFlagValue(bool b)
Converts the boolean value b to an enum representation of the boolean type, which includes an enum va...
bool isRelatedNonmember() const
Returns true if this is a related nonmember of something.
void setSince(const QString &since)
Sets the information about the project and version a node was introduced in, unless the version is lo...
void setStatus(Status t)
Sets the node's status to t.
QString extractClassName(const QString &string) const
Extract a class name from the type string and return it.
void setDeprecated(const QString &sinceVersion)
Sets the Node status to Node::Deprecated, unless sinceVersion represents a future version.
static bool nodeSortKeyOrNameLessThan(const Node *n1, const Node *n2)
Returns true if node n1 is less than node n2 when comparing the sort keys, defined with.
static bool nodeNameOverloadLessThan(const Node *first, const Node *second)
QString qualifyWithParentName()
Return the name of this node qualified with the parent name and "::" if there is a parent name.
QString plainSignature() const
Constructs and returns the node's fully qualified signature by recursively ascending the parent links...
static bool nodeLessThan(const Node *first, const Node *second)
Returns true if the node n1 is less than node n2.