23#include <QtCore/quuid.h>
24#include <QtCore/qversionnumber.h>
30using namespace Qt::StringLiterals;
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
56#define LT_RETURN_IF_NOT_EQUAL(a, b)
61#define LT_RETURN_IF_NOT_EQUAL_QSTR(a, b)
63 return QString::compare(a, b) < 0
;
66
67
68
69
70
71
72
73
74
75
76
77
78
82 const auto *f1 =
static_cast<
const FunctionNode *>(n1);
83 const auto *f2 =
static_cast<
const FunctionNode *>(n2);
87 f2->signature(Node::SignatureReturnType));
101
102
103
104
105
106
107
108
109
110
119 const auto *f1 =
static_cast<
const FunctionNode *>(n1);
120 const auto *f2 =
static_cast<
const FunctionNode *>(n2);
139 const auto *f1 =
static_cast<
const FunctionNode *>(n1);
140 const auto *f2 =
static_cast<
const FunctionNode *>(n2);
149
150
151
152
153
154
155
156
157
158
159
160
163 const QString default_sortkey{QChar{QChar::LastValidCodePoint}};
166 if (
auto cmp = QString::compare(
167 n1_metamap ? n1_metamap->value(u"sortkey"_s, default_sortkey) : default_sortkey,
168 n2_metamap ? n2_metamap->value(u"sortkey"_s, default_sortkey) : default_sortkey); cmp != 0) {
189
190
191
192
193
194
195
198
199
200
201
202
203
204
207
208
209
210
211
212
213
214
217
218
219
220
221
222
223
224
225
226
227
230
231
232
233
234
235
236
237
238
241
242
243
244
245
246
247
248
249
252
253
254
255
256
257
258
259
260
261
262
265
266
267
268
269
272
273
276
277
280
281
284
285
288
289
292
293
296
297
300
301
304
305
308
309
312
313
316
317
320
321
324
325
328
329
332
333
336
337
340
341
344
345
348
349
352
353
356
357
360
361
364
365
368
369
372
373
376
377
380
381
384
385
388
389
392
393
396
397
400
401
404
405
408
409
412
413
414
417
418
421
422
425
426
429
430
433
434
437
438
441
442
443
446
447
448
449
452
453
454
455
458
459
460
461
464
465
466
469
470
473
474
477
478
479
480
483 if (isFunction() && !isMacro())
484 return m_name + QLatin1String(
"()");
489
490
491
492
493
494
497 if (m_name.isEmpty())
498 return QLatin1String(
"global");
503 const Node *node =
this;
505 parts.prepend(node->plainName());
510 return parts.join(QLatin1String(
"::"));
514
515
516
517
518
521 if (m_name.isEmpty())
522 return QLatin1String(
"global");
525 const Node *node =
this;
530 fullName.prepend(QLatin1String(
"::"));
537
538
539
540
543 if ((isTextPageNode() || isGroup()) && !title().isEmpty())
545 return plainFullName(relative);
549
550
551
552
553
554
555
556
560 doc
.location().warning(QStringLiteral(
"Overrides a previous doc"),
561 QStringLiteral(
"from here: %1").arg(m_doc
.location().toString()));
567
568
569
570
579 const InclusionPolicy policy = Config::instance().createInclusionPolicy();
584 case Status::DontDocument:
585 m_url = QStringLiteral(
"");
593
594
595
596
599 m_indexNodeFlag(
false),
600 m_relatedNonmember(
false),
612
613
614
615
616
617
618
619
651 return Genus::DontCare;
656
657
658
659
660
661
662
665
666
667
668
669
670
671
672
675
676
677
681 const auto *fn =
static_cast<
const FunctionNode *>(
this);
682 return fn->kindString();
684 return nodeTypeString(nodeType());
688
689
690
695 return QLatin1String(
"namespace");
697 return QLatin1String(
"class");
699 return QLatin1String(
"struct");
701 return QLatin1String(
"union");
703 return QLatin1String(
"header");
705 return QLatin1String(
"page");
707 return QLatin1String(
"enum");
709 return QLatin1String(
"example");
711 return QLatin1String(
"external page");
714 return QLatin1String(
"typedef");
716 return QLatin1String(
"function");
718 return QLatin1String(
"property");
720 return QLatin1String(
"proxy");
722 return QLatin1String(
"variable");
724 return QLatin1String(
"group");
726 return QLatin1String(
"module");
729 return QLatin1String(
"QML type");
731 return QLatin1String(
"QML value type");
733 return QLatin1String(
"QML module");
735 return QLatin1String(
"QML property");
738 return QLatin1String(
"shared comment");
740 return QLatin1String(
"collection");
748
749
750
757
758
759
760
761
775
776
777
778
779void Node::setLink(LinkType linkType,
const QString &link,
const QString &desc)
781 std::pair<QString, QString> linkPair;
782 linkPair.first =
std::move(link);
783 linkPair.second =
std::move(desc);
784 m_linkMap[linkType] = std::move(linkPair);
788
789
790
791
794 QStringList parts = since.split(QLatin1Char(
' '));
796 if (parts.size() > 1)
797 project = Config::dot + parts.first();
799 QVersionNumber cutoff =
800 QVersionNumber::fromString(Config::instance().get(
CONFIG_IGNORESINCE + project).asString())
803 if (!cutoff.isNull() && QVersionNumber::fromString(parts.last()).normalized() < cutoff)
806 m_since = parts.join(QLatin1Char(
' '));
810
811
815 for (
int i = 0; i <= string.size(); ++i) {
817 if (i != string.size())
820 QChar lower = ch.toLower();
821 if ((lower >= QLatin1Char(
'a') && lower <= QLatin1Char(
'z')) || ch.digitValue() >= 0
822 || ch == QLatin1Char(
'_') || ch == QLatin1Char(
':')) {
824 }
else if (!result.isEmpty()) {
825 if (result != QLatin1String(
"const"))
834
835
836
837
838
839
848
849
850
851
860
861
862
871
872
875
876
879 if (parent() ==
nullptr)
880 return (
this->isAggregate() ?
static_cast<Aggregate *>(
const_cast<Node *>(
this)) :
nullptr);
888
889
896
897
898
899
902 QString suffix = t.fileSuffix();
905 else if (suffix ==
"cpp")
914
915
916
917
920 const InclusionPolicy policy = Config::instance().createInclusionPolicy();
927
928
929
930
931
932
941 return (m_sharedCommentNode && m_sharedCommentNode
->hasDoc());
945
946
947
950 if (m_parent && m_parent->isNamespace() && !m_parent->name().isEmpty())
951 return m_parent->name() +
"::" + m_name;
956
957
958
961 if (m_parent && !m_parent->name().isEmpty())
962 return m_parent->name() +
"::" + m_name;
967
968
969
972 return logicalModuleName() +
"::" + m_name;
976
977
978
979
982 return m_parent !=
nullptr && m_parent
->isWrapper();
986
987
991 const Node *n =
this;
994 if (!n->name().isEmpty())
995 pieces.insert(0, n->name());
998 pieces.insert(0, n->logicalModuleName());
1013 QString concatenator =
"::";
1015 concatenator = QLatin1Char(
'.');
1018 concatenator = QLatin1Char(
'#');
1020 return pieces.join(concatenator);
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1038 if (!m_deprecatedSince.isEmpty())
1039 qCWarning(lcQdoc) << QStringLiteral(
1040 "Setting deprecated since version for %1 to %2 even though it "
1041 "was already set to %3. This is very unexpected.")
1042 .arg(
this->m_name, sinceVersion,
this->m_deprecatedSince);
1043 m_deprecatedSince = sinceVersion;
1045 if (!sinceVersion.isEmpty()) {
1046 QVersionNumber since = QVersionNumber::fromString(sinceVersion).normalized();
1047 QVersionNumber current = QVersionNumber::fromString(
1050 if (!current.isNull() && !since.isNull()) {
1051 if (current < since)
1059
1060
1061
1062
1063
1064
1065
1066
1069
1070
1071
1072
1075
1076
1077
1078
1081
1082
1085
1086
1087
1088
1089
1090
1091
1092
1095
1096
1097
1100
1101
1102
1103
1106
1107
1108
1111
1112
1113
1114
1117
1118
1119
1120
1123
1124
1127
1128
1129
1130
1133
1134
1135
1136
1137
1138
1141
1142
1143
1144
1145
1146
1147
1150
1151
1152
1155
1156
1157
1160
1161
1162
1165
1166
1167
1170
1171
1172
1175
1176
1177
1180
1181
1182
1183
1186
1187
1188
1189
1190
1193
1194
1195
1196
1197
1200
1201
1202
1203
1206
1207
1208
1209
1210
1211
1212
1213
1216
1217
1218
1219
1220
1223
1224
1225
1226
1227
1230
1231
1232
1233
1234
1235
1238
1239
1240
1241
1242
1243
1244
1247
1248
1249
1250
1251
1252
1253
1254
1257
1258
1259
1262
1263
1264
1267
1268
1271
1272
1275
1276
1277
1278
1281
1282
1283
1284
1287
1288
1289
1290
1293
1294
1295
1296
1297
1300
1301
1302
1305
1306
1307
1308
1309
1312
1313
1314
1315
1316
1317
1318
1321
1322
1323
1324
1325
1326
1329
1330
1331
1332
1335
1336
1337
1338
1341
1342
1345
1346
1347
1350
1351
1352
1353
1354
1357
1358
1359
1360
1363
1364
1365
1368
1369
1370
1373
1374
1375
1378
1379
1380
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1409
1410
1411
1412
1415
1416
1417
1420
1421
1422
1423
1426
1427
1428
1429
1432
1433
1434
1435
1436
1437
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...
virtual 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.