188 const InclusionPolicy policy = Config::instance().createInclusionPolicy();
190 if (!qcn->logicalModuleName().isEmpty()) {
191 bool includeImport =
true;
198 QStringList parts = QStringList()
199 <<
"import"_L1 << qcn->logicalModuleName() << qcn->logicalModuleVersion();
200 data.importStatement = parts.join(
' '_L1).trimmed();
220 inheritsInfo.name = base->name();
221 inheritsInfo.href = resolveHref(hrefResolver, base, qcn);
226 inheritsInfo.moduleName = base->logicalModuleName();
228 data.inherits = inheritsInfo;
231 if (!subs.isEmpty()) {
232 QList<IR::QmlTypeData::InheritedByEntry> filteredSubs;
233 for (
const auto *sub : std::as_const(subs)) {
234 const NodeContext context = sub->createContext();
235 if (InclusionFilter::isIncluded(policy, context))
236 filteredSubs.append({sub->name(), resolveHref(hrefResolver, sub, qcn)});
238 std::sort(filteredSubs.begin(), filteredSubs.end(),
241 return a.name < b.name;
243 data.inheritedBy = filteredSubs;
249 if (InclusionFilter::isIncluded(policy, context))
250 data.nativeType = IR::QmlTypeData::NativeTypeInfo{cn->name(), resolveHref(hrefResolver, cn, qcn)};
273 data.logicalModuleName = cn->logicalModuleName();
274 data.logicalModuleVersion = cn->logicalModuleVersion();
275 data.qtVariable = cn->qtVariable();
276 data.cmakePackage = cn->cmakePackage();
277 data.cmakeComponent = cn->cmakeComponent();
278 data.cmakeTargetItem = cn->cmakeTargetItem();
279 data.state = cn->state();
289 const InclusionPolicy policy = Config::instance().createInclusionPolicy();
292 return { node->name(), resolveHref(hrefResolver, node, cn), node->doc().briefText().toString() };
295 auto sortEntries = [](QList<IR::CollectionData::MemberEntry> &entries) {
296 std::sort(entries.begin(), entries.end(),
299 return a.name.compare(b.name, Qt::CaseInsensitive) < 0;
305 for (
auto *node : nsMap.values()) {
306 const NodeContext context = node->createContext();
307 if (InclusionFilter::isIncluded(policy, context) && !node->isDeprecated())
308 data.namespaces.append(makeMemberEntry(node));
310 sortEntries(data.namespaces);
313 for (
auto *node : classMap.values()) {
314 const NodeContext context = node->createContext();
315 if (InclusionFilter::isIncluded(policy, context) && !node->isDeprecated())
316 data.classes.append(makeMemberEntry(node));
318 sortEntries(data.classes);
320 for (
const auto *node : cn->members()) {
321 if (!node->isInAPI())
323 const NodeContext context = node->createContext();
324 if (InclusionFilter::isIncluded(policy, context) && !node->isDeprecated())
325 data.members.append(makeMemberEntry(node));
327 sortEntries(data.members);
357 data.typeWord = aggregate->typeWord(
false);
360 auto ancestors = aggregate->plainFullName().split(
"::"_L1);
361 ancestors.pop_back();
362 data.ancestorNames = ancestors;
364 if (aggregate->includeFile())
365 data.headerInclude = *aggregate->includeFile();
367 if (!aggregate->physicalModuleName().isEmpty()) {
370 if (cn && (!cn->cmakeComponent().isEmpty() || !cn->cmakePackage().isEmpty())) {
371 const QString package = cn->cmakePackage().isEmpty()
372 ?
"Qt"_L1 + QString::number(QT_VERSION_MAJOR)
373 : cn->cmakePackage();
375 if (cn->cmakeComponent().isEmpty())
376 findPkg =
"find_package("_L1 + package +
" REQUIRED)"_L1;
378 findPkg =
"find_package("_L1 + package +
" REQUIRED COMPONENTS "_L1
379 + cn->cmakeComponent() +
")"_L1;
382 if (!cn->cmakeTargetItem().isEmpty()) {
383 target = cn->cmakeTargetItem();
384 }
else if (cn->cmakeComponent().isEmpty()) {
385 target = package +
"::"_L1 + package;
387 target = package +
"::"_L1 + cn->cmakeComponent();
390 data.cmakeFindPackage = findPkg;
391 data.cmakeTargetLinkLibraries =
392 "target_link_libraries(mytarget PRIVATE "_L1 + target +
")"_L1;
394 if (cn && !cn->qtVariable().isEmpty())
395 data.qmakeVariable =
"QT += "_L1 + cn->qtVariable();
398 auto statusOpt = formatStatus(aggregate, qdb);
400 data.statusText = *statusOpt;
401 if (aggregate->status() == Status::Deprecated)
402 data.statusCssClass =
"deprecated"_L1;
403 else if (!aggregate->deprecatedSince().isEmpty())
404 data.statusCssClass =
"pending-deprecation"_L1;
405 else if (aggregate->status() == Status::Preliminary)
406 data.statusCssClass =
"preliminary"_L1;
408 data.statusCssClass =
"status"_L1;
412 auto *classNode =
const_cast<ClassNode *>(
static_cast<
const ClassNode *>(aggregate));
414 if (classNode->isQmlNativeType()) {
415 const InclusionPolicy policy = Config::instance().createInclusionPolicy();
416 const NodeContext context = classNode->createContext();
418 QList<QmlTypeNode *> nativeTypes{classNode->qmlNativeTypes().cbegin(),
419 classNode->qmlNativeTypes().cend()};
420 if (!nativeTypes.isEmpty()) {
422 data.qmlNativeType = IR::CppReferenceData::QmlNativeTypeLink{
423 nativeTypes.first()->name(),
424 resolveHref(hrefResolver, nativeTypes.first(), aggregate)
430 const auto *metaTags = classNode->doc().metaTagMap();
431 if (metaTags && metaTags->contains(u"qdoc-suppress-inheritance"_s))
435 const auto &baseClasses = classNode->baseClasses();
436 for (
const auto &bc : baseClasses) {
438 data.baseClasses.append({
439 bc.m_node->plainFullName(),
440 resolveHref(hrefResolver, bc.m_node, aggregate),
446 const auto &derivedClasses = classNode->derivedClasses();
447 for (
const auto &dc : derivedClasses) {
449 data.derivedClasses.append({
450 dc.m_node->plainFullName(),
451 resolveHref(hrefResolver, dc.m_node, aggregate)
455 std::sort(data.derivedClasses.begin(), data.derivedClasses.end(),
458 return a.name.compare(b.name, Qt::CaseInsensitive) < 0;
464 data.templateDeclSpans = buildTemplateDeclSpans(&*aggregate->templateDecl());
468 if (selfCategory != ComparisonCategory::None)
469 data.selfComparisonCategory = QString::fromStdString(comparisonCategoryAsString(selfCategory));
471 const auto *comparesMap = aggregate
->doc().comparesWithMap();
472 if (comparesMap && !comparesMap->isEmpty()) {
473 for (
auto [key, description] : comparesMap->asKeyValueRange()) {
474 IR::CppReferenceData::ComparisonEntry entry;
475 entry.category = QString::fromStdString(comparisonCategoryAsString(key));
477 const QStringList types{description.firstAtom()->string().split(
';'_L1)};
478 entry.comparableTypes = types;
480 if (description.firstAtom()->next() != description.lastAtom()) {
481 Text descText = Text::subText(description.firstAtom()->next(),
482 description.lastAtom());
483 entry.description = descText.toString();
485 data.comparisonEntries.append(entry);
493 case Node::NonReentrant:
494 tsInfo.level =
"non-reentrant"_L1;
496 case Node::Reentrant:
497 tsInfo.level =
"reentrant"_L1;
499 case Node::ThreadSafe:
500 tsInfo.level =
"thread-safe"_L1;
506 NodeList reentrant, threadsafe, nonreentrant;
507 bool hasExceptions =
false;
508 for (
const auto *child : aggregate->childNodes()) {
509 if (!child->isDeprecated()) {
510 switch (child->threadSafeness()) {
511 case Node::Reentrant:
512 reentrant.append(
const_cast<Node *>(child));
513 if (ts == Node::ThreadSafe) hasExceptions =
true;
515 case Node::ThreadSafe:
516 threadsafe.append(
const_cast<Node *>(child));
517 if (ts == Node::Reentrant) hasExceptions =
true;
519 case Node::NonReentrant:
520 nonreentrant.append(
const_cast<Node *>(child));
521 hasExceptions =
true;
529 for (
const auto *node : std::as_const(reentrant)) {
530 tsInfo.reentrantExceptions.append({
531 node->plainFullName(),
532 resolveHref(hrefResolver, node, aggregate)
535 for (
const auto *node : std::as_const(threadsafe)) {
536 tsInfo.threadSafeExceptions.append({
537 node->plainFullName(),
538 resolveHref(hrefResolver, node, aggregate)
541 for (
const auto *node : std::as_const(nonreentrant)) {
542 tsInfo.nonReentrantExceptions.append({
543 node->plainFullName(),
544 resolveHref(hrefResolver, node, aggregate)
548 data.threadSafety =
std::move(tsInfo);
551 const QStringList &groupNames = aggregate->groupNames();
552 if (!groupNames.isEmpty()) {
554 for (
const auto &groupName : groupNames) {
555 auto it = groupMap.find(groupName);
556 if (it == groupMap.end() || !*it)
558 CollectionNode *group = *it;
563 qdb->mergeCollections(group);
564 if (group->wasSeen()) {
567 resolveHref(hrefResolver, group, aggregate)
574 const auto *ns =
static_cast<
const NamespaceNode *>(aggregate);
575 if (!ns->hasDoc() && ns->docNode()) {
577 data.fullNamespaceHref = resolveHref(hrefResolver, ns->docNode(), aggregate);
578 data.fullNamespaceModuleName = ns->docNode()->tree()->camelCaseModuleName();
599 QList<IR::SectionIR> result;
600 for (
const auto §ion : sv) {
601 if (section.isEmpty())
604 IR::SectionIR irSection;
605 irSection.title = section.title();
606 irSection.id = Utilities::asAsciiPrintable(section.title());
607 irSection.singular = section.singular();
608 irSection.plural = section.plural();
614 for (
const auto *member : section.members()) {
615 if (member->isSharedCommentNode()) {
616 const auto *scn =
static_cast<
const SharedCommentNode *>(member);
617 for (
const auto *child : scn->collective()) {
618 IR::MemberIR irMember = extractMemberIR(child, hrefResolver, aggregate);
619 irMember.href =
"#"_L1 + hrefResolver->anchorForNode(child);
620 irSection.members.append(irMember);
623 IR::MemberIR irMember = extractMemberIR(member, hrefResolver, aggregate);
624 irMember.href =
"#"_L1 + hrefResolver->anchorForNode(member);
625 irSection.members.append(irMember);
629 for (
const auto *reimpl : section.reimplementedMembers())
630 irSection.reimplementedMembers.append(extractMemberIR(reimpl, hrefResolver, aggregate));
632 for (
const auto &[base, count] : section.inheritedMembers()) {
633 IR::InheritedMembersIR inherited;
634 inherited.className = base->plainFullName();
635 inherited.count = count;
636 inherited.href = resolveHref(hrefResolver, base, aggregate);
637 irSection.inheritedMembers.append(inherited);
640 result.append(irSection);
659 QList<IR::SectionIR> result;
660 for (
const auto §ion : sv) {
661 if (section.isEmpty())
664 IR::SectionIR irSection;
665 irSection.title = section.title();
666 irSection.id = Utilities::asAsciiPrintable(section.title());
667 irSection.singular = section.singular();
668 irSection.plural = section.plural();
670 for (
const auto *member : section.members()) {
671 if (member->isSharedCommentNode()) {
672 const auto *scn =
static_cast<
const SharedCommentNode *>(member);
674 QList<IR::ContentBlock> sharedBody;
675 const Text &bodyText = scn->doc().body();
676 if (
const Atom *firstAtom = bodyText.firstAtom()) {
677 IR::ContentBuilder contentBuilder(IR::BriefHandling::Include, 0,
678 diagnosticHandlerFor(scn));
679 sharedBody = contentBuilder.build(firstAtom);
682 QList<IR::ContentBlock> sharedAlso;
683 const QList<Text> &alsoTexts = scn->doc().alsoList();
684 for (
const Text &alsoText : alsoTexts) {
685 if (
const Atom *firstAtom = alsoText.firstAtom()) {
686 IR::ContentBuilder contentBuilder(IR::BriefHandling::Include, 0,
687 diagnosticHandlerFor(scn));
688 sharedAlso.append(contentBuilder.build(firstAtom));
692 for (
const auto *child : scn->collective()) {
693 IR::MemberIR irMember = extractMemberIR(child, hrefResolver, aggregate, MemberExtractionLevel::Detail);
694 irMember.body = sharedBody;
695 irMember.alsoList = sharedAlso;
696 irSection.members.append(irMember);
699 irSection.members.append(extractMemberIR(member, hrefResolver, aggregate, MemberExtractionLevel::Detail));
703 result.append(irSection);
739 member.name = node->name();
740 member.fullName = node->plainFullName();
741 member.href = resolveHref(hrefResolver, node, relative);
749 const auto *fn =
static_cast<
const FunctionNode *>(node);
750 member.signature = fn->signature(
761 for (
int i = 0; i < params
.count(); ++i) {
763 param.type = params
.at(i
).type();
764 param.name = params
.at(i
).name();
765 param.defaultValue = params
.at(i
).defaultValue();
766 member.parameters.append(param);
769 const auto *en =
static_cast<
const EnumNode *>(node);
770 member.signature = en->isScoped()
771 ? QStringLiteral(
"enum class %1").arg(en->name())
772 : QStringLiteral(
"enum %1").arg(en->name());
774 for (
const auto &item : en->items()) {
776 ev.name = item.name();
777 ev.value = item.value();
778 ev.since = item.since();
779 member.enumValues.append(ev);
782 const auto *qpn =
static_cast<
const QmlPropertyNode *>(node);
783 member.signature = qpn->name() +
" : "_L1 + qpn->dataType();
784 member.dataType = qpn->dataType();
790 const auto *pn =
static_cast<
const PropertyNode *>(node);
791 member.signature = pn->name() +
" : "_L1 + pn->qualifiedDataType();
793 const auto *td =
static_cast<
const TypedefNode *>(node);
794 member.signature = td->associatedEnum()
795 ?
"flags "_L1 + td->name()
798 const auto *vn =
static_cast<
const VariableNode *>(node);
799 member.signature = vn->leftType() + vn->name() + vn->rightType();
801 member.signature = node->name();
805 member.anchorId = hrefResolver->anchorForNode(node);
806 member.synopsis = member.signature;
807 member.since = node->since();
808 member.threadSafety = threadSafenessString(node->threadSafeness());
812 member.comparisonCategory = QString::fromStdString(catStr);
815 const auto *fn =
static_cast<
const FunctionNode *>(node);
816 const auto &noexcept_ = fn->getNoexcept();
819 member.noexceptNote = *noexcept_;
826 diagnosticHandlerFor(node));
827 member.body = contentBuilder.build(firstAtom);
830 const QList<Text> &alsoTexts = node
->doc().alsoList();
831 for (
const Text &alsoText : alsoTexts) {
832 if (
const Atom *firstAtom = alsoText.firstAtom()) {
833 IR::ContentBuilder contentBuilder(IR::BriefHandling::Include, 0,
834 diagnosticHandlerFor(node));
835 QList<IR::ContentBlock> blocks = contentBuilder.build(firstAtom);
836 member.alsoList.append(blocks);
842 member.signatureSpans = buildSignatureSpans(node, hrefResolver, relative, spanStyle);
936 declSpan.text =
"template"_L1;
941 declSpan.children.append(open);
944 for (
const auto ¶m : templateDecl->parameters) {
945 if (param.sfinae_constraint)
948 IR::SignatureSpan comma;
949 comma.role = IR::SpanRole::Text;
950 comma.text =
", "_L1;
951 declSpan.children.append(comma);
954 switch (param.kind) {
955 case RelaxedTemplateParameter::Kind::TypeTemplateParameter:
956 case RelaxedTemplateParameter::Kind::TemplateTemplateParameter: {
957 IR::SignatureSpan kw;
958 kw.role = IR::SpanRole::Text;
959 kw.text =
"typename"_L1;
960 declSpan.children.append(kw);
963 case RelaxedTemplateParameter::Kind::NonTypeTemplateParameter: {
964 if (!param.valued_declaration.type.empty()) {
965 auto typeSpans = buildTypeSpans(QString::fromStdString(param.valued_declaration.type));
966 declSpan.children.append(typeSpans);
972 if (param.is_parameter_pack) {
973 IR::SignatureSpan dots;
974 dots.role = IR::SpanRole::Text;
975 dots.text =
"..."_L1;
976 declSpan.children.append(dots);
979 if (!param.valued_declaration.name.empty()) {
980 IR::SignatureSpan space;
981 space.role = IR::SpanRole::Text;
983 declSpan.children.append(space);
985 IR::SignatureSpan nameSpan;
986 nameSpan.role = IR::SpanRole::Parameter;
987 nameSpan.text = QString::fromStdString(param.valued_declaration.name);
988 declSpan.children.append(nameSpan);
991 if (!param.valued_declaration.initializer.empty()) {
992 IR::SignatureSpan eq;
993 eq.role = IR::SpanRole::Text;
995 declSpan.children.append(eq);
997 if (param.kind == RelaxedTemplateParameter::Kind::TypeTemplateParameter
998 || param.kind == RelaxedTemplateParameter::Kind::TemplateTemplateParameter) {
999 auto typeSpans = buildTypeSpans(QString::fromStdString(param.valued_declaration.initializer));
1000 declSpan.children.append(typeSpans);
1002 IR::SignatureSpan val;
1003 val.role = IR::SpanRole::Text;
1004 val.text = QString::fromStdString(param.valued_declaration.initializer);
1005 declSpan.children.append(val);
1014 close.text =
">"_L1;
1015 declSpan.children.append(close);
1017 if (templateDecl->requires_clause && !templateDecl->requires_clause->empty()) {
1020 req.text =
" requires "_L1 + QString::fromStdString(*templateDecl->requires_clause);
1021 declSpan.children.append(req);
1024 return { declSpan };
1028 const HrefResolver *hrefResolver,
1029 const Node *relative,
1032 Q_UNUSED(hrefResolver);
1033 QList<IR::SignatureSpan> spans;
1035 auto appendText = [&spans](
const QString &text) {
1042 auto appendName = [&spans, node, hrefResolver, relative](
const QString &name) {
1046 span.href = resolveHref(hrefResolver, node, relative);
1050 auto appendTypeSpans = [&spans](
const QString &type,
bool trailingSpace) {
1051 auto typeSpans = buildTypeSpans(type);
1052 spans.append(typeSpans);
1053 if (trailingSpace && !type.isEmpty()
1054 && !type.endsWith(
'*'_L1) && !type.endsWith(
'&'_L1)) {
1057 space.text =
" "_L1;
1058 spans.append(space);
1064 auto extras = buildExtraSpans(node, style);
1065 if (!extras.isEmpty()) {
1066 spans.append(extras);
1072 QString nameText = node->name();
1079 nameText = node->parent()->name() +
"::"_L1 + nameText;
1088 appendText(Node::nodeTypeString(node->nodeType()) +
" "_L1);
1090 appendName(nameText);
1094 span.text = nameText;
1099 const auto *func =
static_cast<
const FunctionNode *>(node);
1102 if (
auto templateDecl = node->templateDecl()) {
1103 auto tmplSpans = buildTemplateDeclSpans(&*templateDecl);
1104 spans.append(tmplSpans);
1110 if (!func->isNonvirtual())
1111 appendText(
"virtual "_L1);
1115 appendTypeSpans(func->returnTypeString(),
true);
1118 appendName(nameText);
1122 span.text = nameText;
1126 if (!func->isMacroWithoutParams()) {
1128 if (!func->parameters().isEmpty()) {
1129 const Parameters ¶meters = func->parameters();
1130 for (
int i = 0; i < parameters
.count(); ++i) {
1132 appendText(
", "_L1);
1134 QString pName = param.name();
1135 QString type = param.type();
1136 QString value = param.defaultValue();
1137 qsizetype insertPos = param.nameInsertionPoint();
1139 appendTypeSpans(type.left(insertPos),
false);
1142 paramSpan.text = pName;
1143 spans.append(paramSpan);
1144 appendTypeSpans(type.mid(insertPos),
false);
1147 appendTypeSpans(type, trailingSpace);
1151 paramSpan.text = pName;
1152 spans.append(paramSpan);
1156 appendText(
" = "_L1 + value);
1162 if (func->isConst())
1163 appendText(
" const"_L1);
1166 if (func->isFinal())
1167 appendText(
" final"_L1);
1168 if (func->isOverride())
1169 appendText(
" override"_L1);
1170 if (func->isPureVirtual())
1171 appendText(
" = 0"_L1);
1173 appendText(
" &"_L1);
1174 else if (func->isRefRef())
1175 appendText(
" &&"_L1);
1177 if (!func->returnType().isEmpty() && func->returnType() !=
"void"_L1) {
1178 appendText(
" : "_L1);
1179 appendTypeSpans(func->returnTypeString(),
false);
1183 appendText(
" &"_L1);
1184 else if (func->isRefRef())
1185 appendText(
" &&"_L1);
1186 if (
const auto &req = func->trailingRequiresClause(); req && !req->isEmpty())
1187 appendText(
" requires "_L1 + *req);
1192 const auto *enume =
static_cast<
const EnumNode *>(node);
1193 appendText(
"enum"_L1);
1194 if (enume->isScoped())
1195 appendText(
" class"_L1);
1196 if (!enume->isAnonymous()) {
1199 appendName(nameText);
1203 span.text = nameText;
1208 appendText(
" { "_L1);
1209 const int MaxEnumValues = 6;
1210 QStringList documentedItems = enume->doc().enumItemNames();
1211 if (documentedItems.isEmpty()) {
1212 const auto &enumItems = enume->items();
1213 for (
const auto &item : enumItems)
1214 documentedItems << item.name();
1216 const QStringList omitItems = enume->doc().omitEnumItemNames();
1217 for (
const auto &item : omitItems)
1218 documentedItems.removeAll(item);
1220 if (documentedItems.size() > MaxEnumValues) {
1221 const QString last = documentedItems.last();
1222 documentedItems = documentedItems.mid(0, MaxEnumValues - 1);
1223 documentedItems +=
"..."_L1;
1224 documentedItems += last;
1226 appendText(documentedItems.join(
", "_L1));
1227 if (!documentedItems.isEmpty())
1235 if (
auto templateDecl = node->templateDecl()) {
1236 auto tmplSpans = buildTemplateDeclSpans(&*templateDecl);
1237 spans.append(tmplSpans);
1242 appendName(nameText);
1246 span.text = nameText;
1252 if (
static_cast<
const TypedefNode *>(node)->associatedEnum())
1253 appendText(
"flags "_L1);
1255 appendName(nameText);
1259 span.text = nameText;
1265 const auto *property =
static_cast<
const PropertyNode *>(node);
1267 appendName(nameText);
1271 span.text = nameText;
1274 appendText(
" : "_L1);
1275 appendTypeSpans(property->qualifiedDataType(),
false);
1279 const auto *property =
static_cast<
const QmlPropertyNode *>(node);
1281 appendName(nameText);
1285 span.text = nameText;
1288 appendText(
" : "_L1);
1289 appendTypeSpans(property->dataType(),
false);
1293 const auto *variable =
static_cast<
const VariableNode *>(node);
1296 appendName(nameText);
1300 span.text = nameText;
1303 appendText(
" : "_L1);
1304 appendTypeSpans(variable->dataType(),
false);
1306 appendTypeSpans(variable->leftType(),
true);
1308 appendName(nameText);
1312 span.text = nameText;
1315 appendText(variable->rightType());
1321 appendName(nameText);
1325 span.text = nameText;
1453 result.typeName = qcn->name();
1454 result.typeHref = resolveHref(hrefResolver, qcn, qcn);
1459 if (groupedMembers.isEmpty())
1462 const InclusionPolicy policy = Config::instance().createInclusionPolicy();
1465 IR::AllMemberEntry entry;
1466 entry.signatureSpans = buildQmlItemSpans(node, hrefResolver);
1467 entry.signature = plainTextFromSpans(entry.signatureSpans);
1468 entry.href = resolveHref(hrefResolver, node, qcn);
1470 if (node->isQmlProperty()) {
1471 auto *qpn =
static_cast<QmlPropertyNode *>(node);
1472 QStringList qmlHints = qpn->hints();
1473 if (qpn->isAttached() && !qmlHints.contains(
"attached"_L1))
1474 qmlHints <<
"attached"_L1;
1475 for (
const auto &h : std::as_const(qmlHints))
1476 entry.hints.append(h);
1477 }
else if (node->isAttached()) {
1478 entry.hints.append(
"attached"_L1);
1481 if (node->isPropertyGroup()) {
1482 entry.isPropertyGroup =
true;
1483 const auto *scn =
static_cast<SharedCommentNode *>(node);
1484 for (
auto *child : scn->collective()) {
1485 const NodeContext childContext = child->createContext();
1486 if (!InclusionFilter::isIncluded(policy, childContext))
1488 entry.children.append(buildEntry(child));
1495 auto isVisible = [&policy](
Node *node) {
1497 return InclusionFilter::isIncluded(policy, context)
1498 && !(node->isSharingComment() && node->sharedCommentNode()->isPropertyGroup());
1501 for (
const auto &[originType, nodes] : groupedMembers) {
1502 Q_ASSERT(originType);
1503 if (nodes.isEmpty())
1506 IR::MemberGroup group;
1507 if (originType != qcn) {
1508 group.typeName = originType->name();
1509 group.typeHref = resolveHref(hrefResolver, originType, qcn);
1512 for (
auto *node : nodes) {
1513 if (isVisible(node))
1514 group.members.append(buildEntry(node));
1517 result.memberGroups.append(group);