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 Concepts"_L1,
""_L1,
""_L1,
""_L1, Section::Details },
138 {
"New QML Types"_L1,
""_L1,
""_L1,
""_L1, Section::Details },
139 {
"New QML Enumeration Types"_L1,
""_L1,
""_L1,
""_L1, Section::Details },
140 {
"New QML Properties"_L1,
""_L1,
""_L1,
""_L1, Section::Details },
141 {
"New QML Signals"_L1,
""_L1,
""_L1,
""_L1, Section::Details },
142 {
"New QML Signal Handlers"_L1,
""_L1,
""_L1,
""_L1, Section::Details },
143 {
"New QML Methods"_L1,
""_L1,
""_L1,
""_L1, Section::Details },
150
151
152
155
156
157
160 QString nodeName{node->name()};
163 for (qsizetype i = nodeName.size() - 1; i > 0; --i) {
164 if (nodeName.at(i).digitValue() == -1)
171 for (
int i = 0; i < 4 - numDigits; ++i)
172 nodeName.insert(nodeName.size() - numDigits - 1, QLatin1Char(
'0'));
176 return QLatin1Char(
'A') + nodeName;
179 const auto *fn =
static_cast<
const FunctionNode *>(node);
183 sortNo = QLatin1String(
"C");
184 else if (fn->isCCtor())
185 sortNo = QLatin1String(
"D");
186 else if (fn->isMCtor())
187 sortNo = QLatin1String(
"E");
188 else if (fn->isDtor())
189 sortNo = QLatin1String(
"F");
190 else if (nodeName.startsWith(QLatin1String(
"operator")) && nodeName.size() > 8
191 && !nodeName[8].isLetterOrNumber())
192 sortNo = QLatin1String(
"H");
194 sortNo = QLatin1String(
"G");
196 return sortNo + nodeName + QLatin1Char(
' ') + QString::number(fn->overloadNumber(), 36);
199 if (node->isFunction(Genus::QML))
200 return QLatin1Char(
'E') + nodeName + QLatin1Char(
' ') +
201 QString::number(
static_cast<
const FunctionNode*>(node)->overloadNumber(), 36);
204 return QLatin1Char(
'G') + nodeName;
206 return QLatin1Char(
'B') + nodeName;
210
211
212
215 bool irrelevant =
false;
216 bool inherited =
false;
225 const InclusionPolicy policy = Config::instance().createInclusionPolicy();
231 auto *func =
static_cast<FunctionNode *>(node);
232 irrelevant = (inherited && (func->isSomeCtor() || func->isDtor()));
235 irrelevant = (inherited && m_style !=
AllMembers);
237 const auto *tdn =
static_cast<
const TypedefNode *>(node);
238 if (tdn->associatedEnum())
244 QString key = sortName(node);
246 m_obsoleteMembers.push_back(node);
249 m_members.push_back(node);
252 if (m_inheritedMembers.isEmpty()
253 || m_inheritedMembers.last().first != node->parent()) {
255 m_inheritedMembers.append(p);
257 m_inheritedMembers.last().second++;
264
265
266
267
268
269
270
273 const InclusionPolicy policy = Config::instance().createInclusionPolicy();
278 const auto *fn =
static_cast<
const FunctionNode *>(node);
279 if (!fn->overridesThis().isEmpty()) {
280 if (fn->parent() == m_aggregate) {
281 QString key = sortName(fn);
282 if (!m_reimplementedMemberMap.contains(key)) {
283 m_reimplementedMemberMap.insert(key, node);
293
294
295
332 static auto node_less_than = [](
const Node* left,
const Node* right) {
336 if (left->isSharedCommentNode())
337 left =
static_cast<
const SharedCommentNode *>(left)->collective().first();
338 if (right->isSharedCommentNode())
339 right =
static_cast<
const SharedCommentNode *>(right)->collective().first();
340 return sortName(left) < sortName(right);
343 std::stable_sort(m_members.begin(), m_members.end(), node_less_than);
344 std::stable_sort(m_obsoleteMembers.begin(), m_obsoleteMembers.end(), node_less_than);
346 m_reimplementedMembers = m_reimplementedMemberMap.values().toVector();
348 for (
auto &cn : m_classNodesList) {
349 std::stable_sort(cn.second.begin(), cn.second.end(), node_less_than);
354
355
356
357
358
359
360
361
362
363
364
365
366
369
370
371
374 m_allMembers.setAggregate(m_aggregate);
379 m_summarySections = makeCppClassSummarySections();
380 m_detailsSections = makeCppClassDetailsSections();
381 initAggregate(m_summarySections, m_aggregate);
382 initAggregate(m_detailsSections, m_aggregate);
383 buildStdCppClassRefPageSections();
387 m_summarySections = makeQmlTypeSummarySections();
388 m_detailsSections = makeQmlTypeDetailsSections();
389 initAggregate(m_summarySections, m_aggregate);
390 initAggregate(m_detailsSections, m_aggregate);
391 buildStdQmlTypeRefPageSections();
397 m_summarySections = makeStdSummarySections();
398 m_detailsSections = makeStdDetailsSections();
399 initAggregate(m_summarySections, m_aggregate);
400 initAggregate(m_detailsSections, m_aggregate);
401 buildStdRefPageSections();
407
408
409
411 : m_aggregate(
nullptr), m_sinceSections(makeSinceSections())
415 for (
auto it = nsmap.constBegin(); it != nsmap.constEnd(); ++it) {
416 Node *node = it.value();
418 case NodeType::QmlType:
419 m_sinceSections[SinceQmlTypes].appendMember(node);
421 case NodeType::Namespace:
422 m_sinceSections[SinceNamespaces].appendMember(node);
424 case NodeType::Class:
425 case NodeType::Struct:
426 case NodeType::Union:
427 m_sinceSections[SinceClasses].appendMember(node);
433 if (!it.key().isEmpty())
434 m_sinceSections[SinceEnumTypes].appendMember(node);
436 m_sinceSections[SinceEnumValues].appendMember(node);
439 case NodeType::Typedef:
440 case NodeType::TypeAlias:
441 m_sinceSections[SinceTypeAliases].appendMember(node);
444 const auto *fn =
static_cast<
const FunctionNode *>(node);
445 switch (fn->metaness()) {
446 case Metaness::QmlSignal:
447 m_sinceSections[SinceQmlSignals].appendMember(node);
449 case Metaness::QmlSignalHandler:
450 m_sinceSections[SinceQmlSignalHandlers].appendMember(node);
452 case Metaness::QmlMethod:
453 m_sinceSections[SinceQmlMethods].appendMember(node);
457 m_sinceSections[SinceMacros].appendMember(node);
459 Node *p = fn->parent();
462 m_sinceSections[SinceMemberFunctions].appendMember(node);
464 if (p->name().isEmpty())
465 m_sinceSections[SinceGlobalFunctions].appendMember(node);
467 m_sinceSections[SinceNamespaceFunctions].appendMember(node);
469 m_sinceSections[SinceGlobalFunctions].appendMember(node);
471 m_sinceSections[SinceGlobalFunctions].appendMember(node);
477 case NodeType::Property:
478 m_sinceSections[SinceProperties].appendMember(node);
480 case NodeType::SharedComment:
481 if (node->isPropertyGroup())
482 m_sinceSections[SinceQmlProperties].appendMember(node);
484 case NodeType::Variable:
485 m_sinceSections[SinceVariables].appendMember(node);
487 case NodeType::QmlProperty:
488 m_sinceSections[SinceQmlProperties].appendMember(node);
490 case NodeType::QmlEnum:
491 m_sinceSections[SinceQmlEnumTypes].appendMember(node);
493 case NodeType::Concept:
494 m_sinceSections[SinceConcepts].appendMember(node);
503
504
507 for (Section §ion : v)
508 section.setAggregate(aggregate);
512
513
514void Sections::reduce(QList<Section> &v)
516 for (Section §ion : v)
521
522
523
524
525
526
527
528
532 if (
auto *scn =
static_cast<SharedCommentNode *>(node); scn->collective().size())
533 return scn->collective().first();
539
540
545 case NodeType::Namespace:
546 v[StdNamespaces].insert(n);
548 case NodeType::Class:
549 case NodeType::Struct:
550 case NodeType::Union:
551 v[StdClasses].insert(n);
554 case NodeType::Typedef:
555 case NodeType::TypeAlias:
556 v[StdTypes].insert(n);
559 auto *func =
static_cast<FunctionNode *>(t);
561 v[StdMacros].insert(n);
563 v[StdFunctions].insert(n);
567 const auto *var =
static_cast<
const VariableNode *>(t);
568 if (!var->doc().isEmpty()) {
570 v[StdStaticVariables].insert(n);
572 v[StdVariables].insert(n);
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597void Sections::buildStdRefPageSections()
600 bool documentAll =
true;
602 ns =
static_cast<
const NamespaceNode *>(m_aggregate);
606 for (
auto it = m_aggregate->constBegin(); it != m_aggregate->constEnd(); ++it) {
609 stdRefPageSwitch(m_summarySections, n);
611 stdRefPageSwitch(m_detailsSections, n);
616 for (
const auto &node : relatedBy)
617 stdRefPageSwitch(m_summarySections, node);
620
621
622
623
626 for (
const auto &child : children) {
627 if (documentAll || child->hasDoc())
628 stdRefPageSwitch(m_summarySections, child);
631 reduce(m_summarySections);
632 reduce(m_detailsSections);
633 m_allMembers.reduce();
637
638
639
640
644 static_cast<SharedCommentNode *>(n)->sort();
648 auto *fn =
static_cast<FunctionNode *>(n);
649 if (fn->isRelatedNonmember()) {
651 sv[Macros].insert(n);
653 sv[RelatedNonmembers].insert(n);
660 sv[PublicSlots].insert(fn);
661 else if (fn->isPrivate())
662 sv[PrivateSlots].insert(fn);
664 sv[ProtectedSlots].insert(fn);
665 }
else if (fn->isSignal()) {
666 if (fn->isPublic() && fn->isInAPI())
667 sv[Signals].insert(fn);
668 }
else if (fn->isPublic()) {
669 if (fn->isStatic() && fn->isInAPI())
670 sv[StaticPublicMembers].insert(fn);
671 else if (!sv[PublicFunctions].insertReimplementedMember(fn) && fn->isInAPI())
672 sv[PublicFunctions].insert(fn);
673 }
else if (fn->isPrivate()) {
675 sv[StaticPrivateMembers].insert(fn);
676 else if (!sv[PrivateFunctions].insertReimplementedMember(fn))
677 sv[PrivateFunctions].insert(fn);
680 sv[StaticProtectedMembers].insert(fn);
681 else if (!sv[ProtectedFunctions].insertReimplementedMember(fn))
682 sv[ProtectedFunctions].insert(fn);
687 sv[RelatedNonmembers].insert(n);
693 sv[StaticPublicMembers].insert(n);
694 else if (n->isPrivate())
695 sv[StaticPrivateMembers].insert(n);
697 sv[StaticProtectedMembers].insert(n);
700 sv[PublicVariables].insert(n);
701 else if (n->isProtected())
702 sv[ProtectedVariables].insert(n);
703 else if (n->isPrivate())
704 sv[PrivateVariables].insert(n);
709
710
711
712 if (n
->isTypedef() && (n->name() == QLatin1String(
"QtGadgetHelper")))
715 sv[Properties].insert(n);
716 else if (n->isPublic() && n->isInAPI())
717 sv[PublicTypes].insert(n);
718 else if (n->isPrivate())
719 sv[PrivateTypes].insert(n);
720 else if (n->isProtected())
721 sv[ProtectedTypes].insert(n);
725
726
727
728
736 auto *fn =
static_cast<FunctionNode *>(t);
737 if (fn->isRelatedNonmember()) {
739 dv[DetailsMacros].insert(n);
741 dv[DetailsRelatedNonmembers].insert(n);
746 if (!fn->hasAssociatedProperties() || !fn->doc().isEmpty())
747 dv[DetailsMemberFunctions].insert(n);
751 dv[DetailsRelatedNonmembers].insert(n);
755 if (t->name() != QLatin1String(
"QtGadgetHelper"))
756 dv[DetailsMemberTypes].insert(n);
760 dv[DetailsProperties].insert(n);
761 else if (t->isVariable() && !t->doc().isEmpty())
762 dv[DetailsMemberVariables].insert(n);
772 dv[QmlProperties].insert(n);
777 auto *pn =
static_cast<QmlPropertyNode *>(t);
778 if (pn->isAttached())
779 dv[QmlAttachedProperties].insert(n);
781 dv[QmlProperties].insert(n);
783 dv[QmlEnumTypes].insert(n);
785 auto *fn =
static_cast<FunctionNode *>(t);
786 if (fn->isQmlSignal()) {
787 if (fn->isAttached())
788 dv[QmlAttachedSignals].insert(n);
790 dv[QmlSignals].insert(n);
791 }
else if (fn->isQmlSignalHandler()) {
792 dv[QmlSignalHandlers].insert(n);
793 }
else if (fn->isQmlMethod()) {
794 if (fn->isAttached())
795 dv[QmlAttachedMethods].insert(n);
797 dv[QmlMethods].insert(n);
803
804
805
806
812 auto *pn =
static_cast<QmlPropertyNode *>(n);
813 if (pn->isAttached())
814 sv[QmlAttachedProperties].insert(pn);
816 sv[QmlProperties].insert(pn);
818 sv[QmlEnumTypes].insert(n);
820 auto *fn =
static_cast<FunctionNode *>(n);
821 if (fn->isQmlSignal()) {
822 if (fn->isAttached())
823 sv[QmlAttachedSignals].insert(fn);
825 sv[QmlSignals].insert(fn);
826 }
else if (fn->isQmlSignalHandler()) {
827 sv[QmlSignalHandlers].insert(fn);
828 }
else if (fn->isQmlMethod()) {
829 if (fn->isAttached())
830 sv[QmlAttachedMethods].insert(fn);
832 sv[QmlMethods].insert(fn);
835 auto *scn =
static_cast<SharedCommentNode *>(n);
836 if (scn->isPropertyGroup()) {
837 sv[QmlProperties].insert(scn);
839 for (
const auto &child : scn->collective())
840 distributeQmlNodeInSummaryVector(sv, child,
true);
847 const QList<RelatedClass> baseClasses = cn->baseClasses();
848 for (
const auto &cls : baseClasses) {
850 stack.prepend(cls.m_node);
855
856
857
858void Sections::buildStdCppClassRefPageSections()
860 const InclusionPolicy policy = Config::instance().createInclusionPolicy();
862 for (
auto it = m_aggregate->constBegin(); it != m_aggregate->constEnd(); ++it) {
867 m_allMembers.insert(n);
869 distributeNodeInSummaryVector(m_summarySections, n);
870 distributeNodeInDetailsVector(m_detailsSections, n);
874 for (
const auto &node : relatedBy)
875 distributeNodeInSummaryVector(m_summarySections, node);
878 QStack<
const ClassNode *> stack;
879 QSet<
const ClassNode *> visited;
880 auto *cn =
static_cast<
const ClassNode *>(m_aggregate);
882 pushBaseClasses(stack, cn);
883 while (!stack.isEmpty()) {
885 if (visited.contains(cur))
888 for (Node *n : cur->childNodes()) {
889 const NodeContext context = n->createContext();
890 if (InclusionFilter::isIncluded(policy, context) && !n->isProperty()
891 && !n->isRelatedNonmember() && !n->isSharedCommentNode()) {
892 m_allMembers.insert(n);
895 pushBaseClasses(stack, cur);
897 reduce(m_summarySections);
898 reduce(m_detailsSections);
899 m_allMembers.reduce();
903
904
905
906void Sections::buildStdQmlTypeRefPageSections()
912 if (!qtn->isAbstract() || !classNodes)
913 classNodes = &m_allMembers.classNodesList().emplace_back(
static_cast<
const QmlTypeNode*>(qtn), NodeVector{});
914 const InclusionPolicy policy = Config::instance().createInclusionPolicy();
915 for (
const auto n : qtn->childNodes()) {
916 const NodeContext context = n->createContext();
917 if (!InclusionFilter::isIncluded(policy, context))
921 if (qtn != m_aggregate && qtn->isAbstract()) {
923 m_aggregate->findChildren(n->name(), candidates);
924 if (std::any_of(candidates.cbegin(), candidates.cend(), [&n](
const Node *c) {
925 if (c->nodeType() == n->nodeType()) {
926 if (!n->isFunction() ||
927 compare(
static_cast<
const FunctionNode *>(n),
928 static_cast<
const FunctionNode *>(c)) == 0)
937 if (!n->isSharedCommentNode() || n->isPropertyGroup()) {
938 m_allMembers.insert(n);
939 classNodes->second.push_back(n);
943 if (qtn == m_aggregate || qtn->isAbstract()) {
944 distributeQmlNodeInSummaryVector(m_summarySections, n);
945 distributeQmlNodeInDetailsVector(m_detailsSections, n);
949 qCDebug(lcQdoc,
"error: circular type definition: '%s' inherits itself",
950 qPrintable(qtn->name()));
956 reduce(m_summarySections);
957 reduce(m_detailsSections);
958 m_allMembers.reduce();
962
963
964
965
966
970 for (
const auto §ion : m_summarySections) {
971 if (!section.obsoleteMembers().isEmpty())
972 summary_spv->append(§ion);
974 for (
const auto §ion : m_detailsSections) {
975 if (!section.obsoleteMembers().isEmpty())
976 details_spv->append(§ion);
978 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...
const NodeList & relatedByProxy() const
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(const 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< const ClassNode * > &stack, const 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.