23#include <QtCore/qobjectdefs.h>
24#include <QtCore/qset.h>
28using namespace Qt::StringLiterals;
35 {
"Namespaces"_L1,
"namespace"_L1,
"namespaces"_L1,
""_L1, Section::Summary },
36 {
"Classes"_L1,
"class"_L1,
"classes"_L1,
""_L1, Section::Summary },
37 {
"Types"_L1,
"type"_L1,
"types"_L1,
""_L1, Section::Summary },
38 {
"Variables"_L1,
"variable"_L1,
"variables"_L1,
""_L1, Section::Summary },
39 {
"Static Variables"_L1,
"static variable"_L1,
"static variables"_L1,
""_L1, Section::Summary },
40 {
"Functions"_L1,
"function"_L1,
"functions"_L1,
""_L1, Section::Summary },
41 {
"Macros"_L1,
"macro"_L1,
"macros"_L1,
""_L1, Section::Summary },
48 {
"Namespaces"_L1,
"namespace"_L1,
"namespaces"_L1,
"nmspace"_L1, Section::Details },
49 {
"Classes"_L1,
"class"_L1,
"classes"_L1,
"classes"_L1, Section::Details },
50 {
"Type Documentation"_L1,
"type"_L1,
"types"_L1,
"types"_L1, Section::Details },
51 {
"Variable Documentation"_L1,
"variable"_L1,
"variables"_L1,
"vars"_L1, Section::Details },
52 {
"Static Variables"_L1,
"static variable"_L1,
"static variables"_L1,
""_L1, Section::Details },
53 {
"Function Documentation"_L1,
"function"_L1,
"functions"_L1,
"func"_L1, Section::Details },
54 {
"Macro Documentation"_L1,
"macro"_L1,
"macros"_L1,
"macros"_L1, Section::Details },
61 {
"Public Types"_L1,
"public type"_L1,
"public types"_L1,
""_L1, Section::Summary },
62 {
"Properties"_L1,
"property"_L1,
"properties"_L1,
""_L1, Section::Summary },
63 {
"Public Functions"_L1,
"public function"_L1,
"public functions"_L1,
""_L1, Section::Summary },
64 {
"Public Slots"_L1,
"public slot"_L1,
"public slots"_L1,
""_L1, Section::Summary },
65 {
"Signals"_L1,
"signal"_L1,
"signals"_L1,
""_L1, Section::Summary },
66 {
"Public Variables"_L1,
"public variable"_L1,
"public variables"_L1,
""_L1, Section::Summary },
67 {
"Static Public Members"_L1,
"static public member"_L1,
"static public members"_L1,
""_L1, Section::Summary },
68 {
"Protected Types"_L1,
"protected type"_L1,
"protected types"_L1,
""_L1, Section::Summary },
69 {
"Protected Functions"_L1,
"protected function"_L1,
"protected functions"_L1,
""_L1, Section::Summary },
70 {
"Protected Slots"_L1,
"protected slot"_L1,
"protected slots"_L1,
""_L1, Section::Summary },
71 {
"Protected Variables"_L1,
"protected type"_L1,
"protected variables"_L1,
""_L1, Section::Summary },
72 {
"Static Protected Members"_L1,
"static protected member"_L1,
"static protected members"_L1,
""_L1, Section::Summary },
73 {
"Private Types"_L1,
"private type"_L1,
"private types"_L1,
""_L1, Section::Summary },
74 {
"Private Functions"_L1,
"private function"_L1,
"private functions"_L1,
""_L1, Section::Summary },
75 {
"Private Slots"_L1,
"private slot"_L1,
"private slots"_L1,
""_L1, Section::Summary },
76 {
"Private Variables"_L1,
"private variable"_L1,
"private variables"_L1,
""_L1, Section::Summary },
77 {
"Static Private Members"_L1,
"static private member"_L1,
"static private members"_L1,
""_L1, Section::Summary },
78 {
"Related Non-Members"_L1,
"related non-member"_L1,
"related non-members"_L1,
""_L1, Section::Summary },
79 {
"Macros"_L1,
"macro"_L1,
"macros"_L1,
""_L1, Section::Summary },
86 {
"Member Type Documentation"_L1,
"member"_L1,
"members"_L1,
"types"_L1, Section::Details },
87 {
"Property Documentation"_L1,
"member"_L1,
"members"_L1,
"prop"_L1, Section::Details },
88 {
"Member Function Documentation"_L1,
"member"_L1,
"members"_L1,
"func"_L1, Section::Details },
89 {
"Member Variable Documentation"_L1,
"member"_L1,
"members"_L1,
"vars"_L1, Section::Details },
90 {
"Related Non-Members"_L1,
"member"_L1,
"members"_L1,
"relnonmem"_L1, Section::Details },
91 {
"Macro Documentation"_L1,
"member"_L1,
"members"_L1,
"macros"_L1, Section::Details },
98 {
"Enumerations"_L1,
"enumeration"_L1,
"enumerations"_L1,
""_L1, Section::Summary },
99 {
"Properties"_L1,
"property"_L1,
"properties"_L1,
""_L1, Section::Summary },
100 {
"Attached Properties"_L1,
"attached property"_L1,
"attached properties"_L1,
""_L1, Section::Summary },
101 {
"Signals"_L1,
"signal"_L1,
"signals"_L1,
""_L1, Section::Summary },
102 {
"Signal Handlers"_L1,
"signal handler"_L1,
"signal handlers"_L1,
""_L1, Section::Summary },
103 {
"Attached Signals"_L1,
"attached signal"_L1,
"attached signals"_L1,
""_L1, Section::Summary },
104 {
"Methods"_L1,
"method"_L1,
"methods"_L1,
""_L1, Section::Summary },
105 {
"Attached Methods"_L1,
"attached method"_L1,
"attached methods"_L1,
""_L1, Section::Summary },
112 {
"Enumeration Documentation"_L1,
"member"_L1,
"members"_L1,
"qmlenum"_L1, Section::Details },
113 {
"Property Documentation"_L1,
"member"_L1,
"members"_L1,
"qmlprop"_L1, Section::Details },
114 {
"Attached Property Documentation"_L1,
"member"_L1,
"members"_L1,
"qmlattprop"_L1, Section::Details },
115 {
"Signal Documentation"_L1,
"signal"_L1,
"signals"_L1,
"qmlsig"_L1, Section::Details },
116 {
"Signal Handler Documentation"_L1,
"signal handler"_L1,
"signal handlers"_L1,
"qmlsighan"_L1, Section::Details },
117 {
"Attached Signal Documentation"_L1,
"signal"_L1,
"signals"_L1,
"qmlattsig"_L1, Section::Details },
118 {
"Method Documentation"_L1,
"member"_L1,
"members"_L1,
"qmlmeth"_L1, Section::Details },
119 {
"Attached Method Documentation"_L1,
"member"_L1,
"members"_L1,
"qmlattmeth"_L1, Section::Details },
126 {
"New Namespaces"_L1,
""_L1,
""_L1,
""_L1, Section::Details },
127 {
"New Classes"_L1,
""_L1,
""_L1,
""_L1, Section::Details },
128 {
"New Member Functions"_L1,
""_L1,
""_L1,
""_L1, Section::Details },
129 {
"New Functions in Namespaces"_L1,
""_L1,
""_L1,
""_L1, Section::Details },
130 {
"New Global Functions"_L1,
""_L1,
""_L1,
""_L1, Section::Details },
131 {
"New Macros"_L1,
""_L1,
""_L1,
""_L1, Section::Details },
132 {
"New Enum Types"_L1,
""_L1,
""_L1,
""_L1, Section::Details },
133 {
"New Enum Values"_L1,
""_L1,
""_L1,
""_L1, Section::Details },
134 {
"New Type Aliases"_L1,
""_L1,
""_L1,
""_L1, Section::Details },
135 {
"New Properties"_L1,
""_L1,
""_L1,
""_L1, Section::Details },
136 {
"New Variables"_L1,
""_L1,
""_L1,
""_L1, Section::Details },
137 {
"New QML Types"_L1,
""_L1,
""_L1,
""_L1, Section::Details },
138 {
"New QML Enumeration Types"_L1,
""_L1,
""_L1,
""_L1, Section::Details },
139 {
"New QML Properties"_L1,
""_L1,
""_L1,
""_L1, Section::Details },
140 {
"New QML Signals"_L1,
""_L1,
""_L1,
""_L1, Section::Details },
141 {
"New QML Signal Handlers"_L1,
""_L1,
""_L1,
""_L1, Section::Details },
142 {
"New QML Methods"_L1,
""_L1,
""_L1,
""_L1, Section::Details },
149
150
151
154
155
156
159 QString nodeName{node->name()};
162 for (qsizetype i = nodeName.size() - 1; i > 0; --i) {
163 if (nodeName.at(i).digitValue() == -1)
170 for (
int i = 0; i < 4 - numDigits; ++i)
171 nodeName.insert(nodeName.size() - numDigits - 1, QLatin1Char(
'0'));
175 return QLatin1Char(
'A') + nodeName;
178 const auto *fn =
static_cast<
const FunctionNode *>(node);
182 sortNo = QLatin1String(
"C");
183 else if (fn->isCCtor())
184 sortNo = QLatin1String(
"D");
185 else if (fn->isMCtor())
186 sortNo = QLatin1String(
"E");
187 else if (fn->isDtor())
188 sortNo = QLatin1String(
"F");
189 else if (nodeName.startsWith(QLatin1String(
"operator")) && nodeName.size() > 8
190 && !nodeName[8].isLetterOrNumber())
191 sortNo = QLatin1String(
"H");
193 sortNo = QLatin1String(
"G");
195 return sortNo + nodeName + QLatin1Char(
' ') + QString::number(fn->overloadNumber(), 36);
198 if (node->isFunction(Genus::QML))
199 return QLatin1Char(
'E') + nodeName + QLatin1Char(
' ') +
200 QString::number(
static_cast<
const FunctionNode*>(node)->overloadNumber(), 36);
203 return QLatin1Char(
'G') + nodeName;
205 return QLatin1Char(
'B') + nodeName;
209
210
211
214 bool irrelevant =
false;
215 bool inherited =
false;
224 const InclusionPolicy policy = Config::instance().createInclusionPolicy();
230 auto *func =
static_cast<FunctionNode *>(node);
231 irrelevant = (inherited && (func->isSomeCtor() || func->isDtor()));
234 irrelevant = (inherited && m_style !=
AllMembers);
236 const auto *tdn =
static_cast<
const TypedefNode *>(node);
237 if (tdn->associatedEnum())
243 QString key = sortName(node);
245 m_obsoleteMembers.push_back(node);
248 m_members.push_back(node);
251 if (m_inheritedMembers.isEmpty()
252 || m_inheritedMembers.last().first != node->parent()) {
254 m_inheritedMembers.append(p);
256 m_inheritedMembers.last().second++;
263
264
265
266
267
268
269
272 const InclusionPolicy policy = Config::instance().createInclusionPolicy();
277 const auto *fn =
static_cast<
const FunctionNode *>(node);
278 if (!fn->overridesThis().isEmpty()) {
279 if (fn->parent() == m_aggregate) {
280 QString key = sortName(fn);
281 if (!m_reimplementedMemberMap.contains(key)) {
282 m_reimplementedMemberMap.insert(key, node);
292
293
294
331 static auto node_less_than = [](
const Node* left,
const Node* right) {
335 if (left->isSharedCommentNode())
336 left =
static_cast<
const SharedCommentNode *>(left)->collective().first();
337 if (right->isSharedCommentNode())
338 right =
static_cast<
const SharedCommentNode *>(right)->collective().first();
339 return sortName(left) < sortName(right);
342 std::stable_sort(m_members.begin(), m_members.end(), node_less_than);
343 std::stable_sort(m_obsoleteMembers.begin(), m_obsoleteMembers.end(), node_less_than);
345 m_reimplementedMembers = m_reimplementedMemberMap.values().toVector();
347 for (
auto &cn : m_classNodesList) {
348 std::stable_sort(cn.second.begin(), cn.second.end(), node_less_than);
353
354
355
356
357
358
359
360
361
362
363
364
365
368
369
370
373 m_allMembers.setAggregate(m_aggregate);
378 m_summarySections = makeCppClassSummarySections();
379 m_detailsSections = makeCppClassDetailsSections();
380 initAggregate(m_summarySections, m_aggregate);
381 initAggregate(m_detailsSections, m_aggregate);
382 buildStdCppClassRefPageSections();
386 m_summarySections = makeQmlTypeSummarySections();
387 m_detailsSections = makeQmlTypeDetailsSections();
388 initAggregate(m_summarySections, m_aggregate);
389 initAggregate(m_detailsSections, m_aggregate);
390 buildStdQmlTypeRefPageSections();
396 m_summarySections = makeStdSummarySections();
397 m_detailsSections = makeStdDetailsSections();
398 initAggregate(m_summarySections, m_aggregate);
399 initAggregate(m_detailsSections, m_aggregate);
400 buildStdRefPageSections();
406
407
408
410 : m_aggregate(
nullptr), m_sinceSections(makeSinceSections())
414 for (
auto it = nsmap.constBegin(); it != nsmap.constEnd(); ++it) {
415 Node *node = it.value();
417 case NodeType::QmlType:
418 m_sinceSections[SinceQmlTypes].appendMember(node);
420 case NodeType::Namespace:
421 m_sinceSections[SinceNamespaces].appendMember(node);
423 case NodeType::Class:
424 case NodeType::Struct:
425 case NodeType::Union:
426 m_sinceSections[SinceClasses].appendMember(node);
432 if (!it.key().isEmpty())
433 m_sinceSections[SinceEnumTypes].appendMember(node);
435 m_sinceSections[SinceEnumValues].appendMember(node);
438 case NodeType::Typedef:
439 case NodeType::TypeAlias:
440 m_sinceSections[SinceTypeAliases].appendMember(node);
443 const auto *fn =
static_cast<
const FunctionNode *>(node);
444 switch (fn->metaness()) {
445 case FunctionNode::QmlSignal:
446 m_sinceSections[SinceQmlSignals].appendMember(node);
448 case FunctionNode::QmlSignalHandler:
449 m_sinceSections[SinceQmlSignalHandlers].appendMember(node);
451 case FunctionNode::QmlMethod:
452 m_sinceSections[SinceQmlMethods].appendMember(node);
456 m_sinceSections[SinceMacros].appendMember(node);
458 Node *p = fn->parent();
461 m_sinceSections[SinceMemberFunctions].appendMember(node);
463 if (p->name().isEmpty())
464 m_sinceSections[SinceGlobalFunctions].appendMember(node);
466 m_sinceSections[SinceNamespaceFunctions].appendMember(node);
468 m_sinceSections[SinceGlobalFunctions].appendMember(node);
470 m_sinceSections[SinceGlobalFunctions].appendMember(node);
476 case NodeType::Property:
477 m_sinceSections[SinceProperties].appendMember(node);
479 case NodeType::SharedComment:
480 if (node->isPropertyGroup())
481 m_sinceSections[SinceQmlProperties].appendMember(node);
483 case NodeType::Variable:
484 m_sinceSections[SinceVariables].appendMember(node);
486 case NodeType::QmlProperty:
487 m_sinceSections[SinceQmlProperties].appendMember(node);
489 case NodeType::QmlEnum:
490 m_sinceSections[SinceQmlEnumTypes].appendMember(node);
499
500
503 for (Section §ion : v)
504 section.setAggregate(aggregate);
508
509
510void Sections::reduce(QList<Section> &v)
512 for (Section §ion : v)
517
518
519
520
521
522
523
524
528 if (
auto *scn =
static_cast<SharedCommentNode *>(node); scn->collective().size())
529 return scn->collective().first();
535
536
541 case NodeType::Namespace:
542 v[StdNamespaces].insert(n);
544 case NodeType::Class:
545 case NodeType::Struct:
546 case NodeType::Union:
547 v[StdClasses].insert(n);
550 case NodeType::Typedef:
551 case NodeType::TypeAlias:
552 v[StdTypes].insert(n);
555 auto *func =
static_cast<FunctionNode *>(t);
557 v[StdMacros].insert(n);
559 v[StdFunctions].insert(n);
563 const auto *var =
static_cast<
const VariableNode *>(t);
564 if (!var->doc().isEmpty()) {
566 v[StdStaticVariables].insert(n);
568 v[StdVariables].insert(n);
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593void Sections::buildStdRefPageSections()
596 bool documentAll =
true;
598 ns =
static_cast<
const NamespaceNode *>(m_aggregate);
602 for (
auto it = m_aggregate->constBegin(); it != m_aggregate->constEnd(); ++it) {
605 stdRefPageSwitch(m_summarySections, n);
607 stdRefPageSwitch(m_detailsSections, n);
612 for (
const auto &node : relatedBy)
613 stdRefPageSwitch(m_summarySections, node);
616
617
618
619
622 for (
const auto &child : children) {
623 if (documentAll || child->hasDoc())
624 stdRefPageSwitch(m_summarySections, child);
627 reduce(m_summarySections);
628 reduce(m_detailsSections);
629 m_allMembers.reduce();
633
634
635
636
640 static_cast<SharedCommentNode *>(n)->sort();
644 auto *fn =
static_cast<FunctionNode *>(n);
645 if (fn->isRelatedNonmember()) {
647 sv[Macros].insert(n);
649 sv[RelatedNonmembers].insert(n);
656 sv[PublicSlots].insert(fn);
657 else if (fn->isPrivate())
658 sv[PrivateSlots].insert(fn);
660 sv[ProtectedSlots].insert(fn);
661 }
else if (fn->isSignal()) {
662 if (fn->isPublic() && fn->isInAPI())
663 sv[Signals].insert(fn);
664 }
else if (fn->isPublic()) {
665 if (fn->isStatic() && fn->isInAPI())
666 sv[StaticPublicMembers].insert(fn);
667 else if (!sv[PublicFunctions].insertReimplementedMember(fn) && fn->isInAPI())
668 sv[PublicFunctions].insert(fn);
669 }
else if (fn->isPrivate()) {
671 sv[StaticPrivateMembers].insert(fn);
672 else if (!sv[PrivateFunctions].insertReimplementedMember(fn))
673 sv[PrivateFunctions].insert(fn);
676 sv[StaticProtectedMembers].insert(fn);
677 else if (!sv[ProtectedFunctions].insertReimplementedMember(fn))
678 sv[ProtectedFunctions].insert(fn);
683 sv[RelatedNonmembers].insert(n);
689 sv[StaticPublicMembers].insert(n);
690 else if (n->isPrivate())
691 sv[StaticPrivateMembers].insert(n);
693 sv[StaticProtectedMembers].insert(n);
696 sv[PublicVariables].insert(n);
697 else if (n->isProtected())
698 sv[ProtectedVariables].insert(n);
699 else if (n->isPrivate())
700 sv[PrivateVariables].insert(n);
705
706
707
708 if (n
->isTypedef() && (n->name() == QLatin1String(
"QtGadgetHelper")))
711 sv[Properties].insert(n);
712 else if (n->isPublic() && n->isInAPI())
713 sv[PublicTypes].insert(n);
714 else if (n->isPrivate())
715 sv[PrivateTypes].insert(n);
716 else if (n->isProtected())
717 sv[ProtectedTypes].insert(n);
721
722
723
724
732 auto *fn =
static_cast<FunctionNode *>(t);
733 if (fn->isRelatedNonmember()) {
735 dv[DetailsMacros].insert(n);
737 dv[DetailsRelatedNonmembers].insert(n);
742 if (!fn->hasAssociatedProperties() || !fn->doc().isEmpty())
743 dv[DetailsMemberFunctions].insert(n);
747 dv[DetailsRelatedNonmembers].insert(n);
751 if (t->name() != QLatin1String(
"QtGadgetHelper"))
752 dv[DetailsMemberTypes].insert(n);
756 dv[DetailsProperties].insert(n);
757 else if (t->isVariable() && !t->doc().isEmpty())
758 dv[DetailsMemberVariables].insert(n);
768 dv[QmlProperties].insert(n);
773 auto *pn =
static_cast<QmlPropertyNode *>(t);
774 if (pn->isAttached())
775 dv[QmlAttachedProperties].insert(n);
777 dv[QmlProperties].insert(n);
779 dv[QmlEnumTypes].insert(n);
781 auto *fn =
static_cast<FunctionNode *>(t);
782 if (fn->isQmlSignal()) {
783 if (fn->isAttached())
784 dv[QmlAttachedSignals].insert(n);
786 dv[QmlSignals].insert(n);
787 }
else if (fn->isQmlSignalHandler()) {
788 dv[QmlSignalHandlers].insert(n);
789 }
else if (fn->isQmlMethod()) {
790 if (fn->isAttached())
791 dv[QmlAttachedMethods].insert(n);
793 dv[QmlMethods].insert(n);
799
800
801
802
808 auto *pn =
static_cast<QmlPropertyNode *>(n);
809 if (pn->isAttached())
810 sv[QmlAttachedProperties].insert(pn);
812 sv[QmlProperties].insert(pn);
814 sv[QmlEnumTypes].insert(n);
816 auto *fn =
static_cast<FunctionNode *>(n);
817 if (fn->isQmlSignal()) {
818 if (fn->isAttached())
819 sv[QmlAttachedSignals].insert(fn);
821 sv[QmlSignals].insert(fn);
822 }
else if (fn->isQmlSignalHandler()) {
823 sv[QmlSignalHandlers].insert(fn);
824 }
else if (fn->isQmlMethod()) {
825 if (fn->isAttached())
826 sv[QmlAttachedMethods].insert(fn);
828 sv[QmlMethods].insert(fn);
831 auto *scn =
static_cast<SharedCommentNode *>(n);
832 if (scn->isPropertyGroup()) {
833 sv[QmlProperties].insert(scn);
835 for (
const auto &child : scn->collective())
836 distributeQmlNodeInSummaryVector(sv, child,
true);
843 const QList<RelatedClass> baseClasses = cn->baseClasses();
844 for (
const auto &cls : baseClasses) {
846 stack.prepend(cls.m_node);
851
852
853
854void Sections::buildStdCppClassRefPageSections()
856 const InclusionPolicy policy = Config::instance().createInclusionPolicy();
858 for (
auto it = m_aggregate->constBegin(); it != m_aggregate->constEnd(); ++it) {
863 m_allMembers.insert(n);
865 distributeNodeInSummaryVector(m_summarySections, n);
866 distributeNodeInDetailsVector(m_detailsSections, n);
870 for (
const auto &node : relatedBy)
871 distributeNodeInSummaryVector(m_summarySections, node);
874 QStack<ClassNode *> stack;
875 QSet<ClassNode *> visited;
876 auto *cn =
static_cast<ClassNode *>(m_aggregate);
878 pushBaseClasses(stack, cn);
879 while (!stack.isEmpty()) {
881 if (visited.contains(cur))
884 for (Node *n : cur->childNodes()) {
885 const NodeContext context = n->createContext();
886 if (InclusionFilter::isIncluded(policy, context) && !n->isProperty()
887 && !n->isRelatedNonmember() && !n->isSharedCommentNode()) {
888 m_allMembers.insert(n);
891 pushBaseClasses(stack, cur);
893 reduce(m_summarySections);
894 reduce(m_detailsSections);
895 m_allMembers.reduce();
899
900
901
902void Sections::buildStdQmlTypeRefPageSections()
908 if (!qtn->isAbstract() || !classNodes)
909 classNodes = &m_allMembers.classNodesList().emplace_back(
static_cast<
const QmlTypeNode*>(qtn), NodeVector{});
910 const InclusionPolicy policy = Config::instance().createInclusionPolicy();
911 for (
const auto n : qtn->childNodes()) {
912 const NodeContext context = n->createContext();
913 if (!InclusionFilter::isIncluded(policy, context))
917 if (qtn != m_aggregate && qtn->isAbstract()) {
919 m_aggregate->findChildren(n->name(), candidates);
920 if (std::any_of(candidates.cbegin(), candidates.cend(), [&n](
const Node *c) {
921 if (c->nodeType() == n->nodeType()) {
922 if (!n->isFunction() ||
923 compare(
static_cast<
const FunctionNode *>(n),
924 static_cast<
const FunctionNode *>(c)) == 0)
933 if (!n->isSharedCommentNode() || n->isPropertyGroup()) {
934 m_allMembers.insert(n);
935 classNodes->second.push_back(n);
939 if (qtn == m_aggregate || qtn->isAbstract()) {
940 distributeQmlNodeInSummaryVector(m_summarySections, n);
941 distributeQmlNodeInDetailsVector(m_detailsSections, n);
945 qCDebug(lcQdoc,
"error: circular type definition: '%s' inherits itself",
946 qPrintable(qtn->name()));
952 reduce(m_summarySections);
953 reduce(m_detailsSections);
954 m_allMembers.reduce();
958
959
960
961
962
966 for (
const auto §ion : m_summarySections) {
967 if (!section.obsoleteMembers().isEmpty())
968 summary_spv->append(§ion);
970 for (
const auto §ion : m_detailsSections) {
971 if (!section.obsoleteMembers().isEmpty())
972 details_spv->append(§ion);
974 return !summary_spv->isEmpty();
virtual QmlTypeNode * qmlBaseNode() const
If this Aggregate is a QmlTypeNode, this function returns a pointer to the QmlTypeNode that is its ba...
NodeList & relatedByProxy()
Returns a reference to a list of node pointers where each element points to a node in an index file f...
The ClassNode represents a C++ class.
static bool isReimplementedMemberVisible(const InclusionPolicy &policy, const NodeContext &context)
static bool isIncluded(const InclusionPolicy &policy, const NodeContext &context)
This class represents a C++ namespace.
const NodeList & includedChildren() const
Returns a const reference to the namespace node's list of included children, which contains pointers ...
A class for containing the elements of one documentation section.
void insert(Node *node)
Inserts the node into this section if it is appropriate for this section.
void reduce()
If this section is not empty, convert its maps to sequential structures for better traversal during d...
bool insertReimplementedMember(Node *node)
Returns true if the node is a reimplemented member function of the current class.
A class for creating vectors of collections for documentation.
Sections(Aggregate *aggregate)
This constructor builds the section vectors based on the type of the aggregate node.
Sections(const NodeMultiMap &nsmap)
This constructor builds the since sections from the since node map, nsmap.
bool hasObsoleteMembers(SectionPtrVector *summary_spv, SectionPtrVector *details_spv) const
Returns true if any sections in this object contain obsolete members.
Combined button and popup list for selecting options.
QMultiMap< QString, Node * > NodeMultiMap
QString sortName(const Node *node)
Construct a name for the node that can be used for sorting a set of nodes into equivalence classes.
static Node * nodeToTestForDistribution(Node *node)
static void pushBaseClasses(QStack< ClassNode * > &stack, ClassNode *cn)
std::pair< const QmlTypeNode *, NodeVector > ClassNodes
QList< const Section * > SectionPtrVector
QList< Section > SectionVector
The Node class is the base class for all the nodes in QDoc's parse tree.
virtual bool isStatic() const
Returns true if the FunctionNode represents a static function.
bool isEnumType(Genus g) const
virtual bool isAbstract() const
Returns true if the ClassNode or QmlTypeNode is marked abstract.
bool isNamespace() const
Returns true if the node type is Namespace.
bool isTypedef() const
Returns true if the node type is Typedef.
bool isQmlType() const
Returns true if the node type is QmlType or QmlValueType.
bool isSharedCommentNode() const
Returns true if the node type is SharedComment.
NodeType nodeType() const override
Returns this node's type.
bool isEnumType() const
Returns true if the node type is Enum.
Aggregate * parent() const
Returns the node's parent pointer.
bool isVariable() const
Returns true if the node type is Variable.
virtual bool isDeprecated() const
Returns true if this node's status is Deprecated.
bool isFunction(Genus g=Genus::DontCare) const
Returns true if this is a FunctionNode and its Genus is set to g.
virtual bool isInAPI() const
Returns true if this node is considered to be part of the API as per the InclusionPolicy retrieved fr...
bool isProperty() const
Returns true if the node type is Property.
NodeContext createContext() const
virtual bool isPropertyGroup() const
Returns true if the node is a SharedCommentNode for documenting multiple C++ properties or multiple Q...
bool isSharingComment() const
This function returns true if the node is sharing a comment with other nodes.
bool hasDoc() const
Returns true if this node is documented, or it represents a documented node read from the index ('had...
bool isRelatedNonmember() const
Returns true if this is a related nonmember of something.
virtual bool isClassNode() const
Returns true if this is an instance of ClassNode.
bool isQmlProperty() const
Returns true if the node type is QmlProperty.