22#include <unordered_map>
120#pragma GCC diagnostic push
121#pragma GCC diagnostic ignored "-Wshadow"
123#include <clang/Basic/Version.h>
125#pragma GCC diagnostic pop
132#if !defined(_WIN32) || defined(__CYGWIN__)
200{
"template class",
"template struct",
"class",
"struct",
"union",
"interface",
"exception" };
237 stats.emplace_back(name,0);
238 startTime = std::chrono::steady_clock::now();
242 std::chrono::steady_clock::time_point endTime = std::chrono::steady_clock::now();
243 stats.back().elapsed =
static_cast<double>(std::chrono::duration_cast<
244 std::chrono::microseconds>(endTime -
startTime).count())/1000000.0;
255 msg(
"----------------------\n");
256 for (
const auto &s :
stats)
258 msg(
"Spent {:.6f} seconds in {}",s.elapsed,s.name);
321 scope+=
"::"+pd->
name();
364 ((!includeExternal && root->
tagInfo()==
nullptr) ||
365 ( includeExternal && root->
tagInfo()!=
nullptr))
368 AUTO_TRACE(
"additional={} includeExternal={}",additional,includeExternal);
384 "group {}: ignoring title \"{}\" that does not match old title \"{}\"",
404 std::unique_ptr<GroupDef>(
411 std::unique_ptr<GroupDef>(
461 scope+=
"::"+gd->
name();
513 bool save_ambig = ambig;
524 fn = fn.
left(newIndex)+
"/"+root->
name;
527 if (!fd) ambig = save_ambig;
558 "Found non-existing group '{}' for the command '{}', ignoring command",
567 text.
sprintf(
"the name '%s' supplied as "
568 "the argument in the \\file statement ",
572 text+=
"matches the following input files:\n";
575 text+=
"Please use a more specific name by "
576 "including a (larger) part of the path!";
580 text+=
"is not an input file";
588template<
class DefMutable>
602 if (!includeFile.
isEmpty() && includeFile.
at(0)==
'"')
605 includeFile=includeFile.
mid(1,includeFile.
length()-2);
607 else if (!includeFile.
isEmpty() && includeFile.
at(0)==
'<')
610 includeFile=includeFile.
mid(1,includeFile.
length()-2);
622 text.
sprintf(
"the name '%s' supplied as "
623 "the argument of the \\class, \\struct, \\union, or \\include command ",
628 text+=
"matches the following input files:\n";
631 text+=
"Please use a more specific name by "
632 "including a (larger) part of the path!";
636 text+=
"is not an input file";
640 else if (includeFile.
isEmpty() && ifd &&
654 if (iName.
at(0)==
'<') local=
FALSE;
655 else if (iName.
at(0)==
'"') local=
TRUE;
656 if (iName.
at(0)==
'"' || iName.
at(0)==
'<')
679 cd->setIncludeFile(
nullptr,iName,local,
TRUE);
692 for (
size_t i=0;i<l;i++)
696 else if (c==
')' && round>0) round--;
697 else if (c==
'<' && round==0) count++;
702 if (c==
'>' && round==0 && count>0) count--;
725 if (idx==-1)
return prevScope;
727 if (nsName.
isEmpty())
return prevScope;
728 if (!fullScope.
isEmpty()) fullScope+=
"::";
733 if (nd==
nullptr) cd =
getClass(fullScope);
734 if (nd==
nullptr && cd)
738 else if (nd==
nullptr && cd==
nullptr && fullScope.
find(
'<')==-1)
746 "[generated]",1,1,fullScope,
764 if (prevScopeMutable)
796 int p=i1+l1,l2=0,i2=0;
804 if (resultScope==
nullptr)
815 if (resultScope!=
nullptr)
break;
874 auto alIt = tArgLists.begin();
875 while ((i=name.
find(
"::",p))!=-1 && alIt!=tArgLists.end())
891 return alIt!=tArgLists.end() ?
892 std::make_unique<ArgumentList>(*alIt) :
893 std::unique_ptr<ArgumentList>();
901 if (specifier.isStruct())
903 else if (specifier.isUnion())
905 else if (specifier.isCategory())
907 else if (specifier.isInterface())
909 else if (specifier.isProtocol())
911 else if (specifier.isException())
913 else if (specifier.isService())
915 else if (specifier.isSingleton())
918 if (section.isUnionDoc())
920 else if (section.isStructDoc())
922 else if (section.isInterfaceDoc())
924 else if (section.isProtocolDoc())
926 else if (section.isCategoryDoc())
928 else if (section.isExceptionDoc())
930 else if (section.isServiceDoc())
932 else if (section.isSingletonDoc())
953 int idx=fullName.
find(
'>');
954 if (idx!=-1 && root->
lang==SrcLangExt::CSharp)
964 qualifiedName.
prepend(scName+
"::");
970 AUTO_TRACE_ADD(
"Found class with name '{}', qualifiedName '{}'", cd ? cd->
name() : root->
name, qualifiedName);
1025 AUTO_TRACE_ADD(
"New class: fullname '{}' namespace '{}' name='{}' brief='{}' docs='{}'",
1035 if (fullName.
find(
"::")!=-1)
1042 std::unique_ptr<ArgumentList> tArgList;
1044 if ((root->
lang==SrcLangExt::CSharp || root->
lang==SrcLangExt::Java) &&
1045 (i=fullName.
find(
'<'))!=-1)
1050 if (i!=-1 && root->
lang==SrcLangExt::CSharp)
1059 fullName=fullName.
left(i);
1070 fullName,sec,tagName,refFileName,
TRUE,root->
spec.isEnum()) ));
1073 AUTO_TRACE_ADD(
"New class '{}' type={} #tArgLists={} tagInfo={} hidden={} artificial={}",
1110 AUTO_TRACE_ADD(
"Class {} not added, already exists as alias", fullName);
1118 if (!root->
spec.isForwardDecl())
1180 qualifiedName.
prepend(scName+
"::");
1186 AUTO_TRACE_ADD(
"Found concept with name '{}' (qualifiedName='{}')", cd ? cd->
name() : root->
name, qualifiedName);
1190 qualifiedName=cd->
name();
1204 AUTO_TRACE_ADD(
"New concept: fullname '{}' namespace '{}' name='{}' brief='{}' docs='{}'",
1205 qualifiedName,namespaceName,className,root->
brief,root->
doc);
1214 if (qualifiedName.
find(
"::")!=-1)
1226 qualifiedName,tagName,refFileName)));
1230 qualifiedName,root->
tArgLists.size(),fmt::ptr(tagInfo));
1261 for (
const auto &ce : root->
children())
1264 if (ce->section.isConceptDocPart())
1269 if (!ce->brief.isEmpty())
1271 cd->
addDocPart(ce->brief,ce->startLine,ce->startColumn);
1274 if (!ce->doc.isEmpty())
1276 cd->
addDocPart(ce->doc,ce->startLine,ce->startColumn);
1280 else if (ce->section.isConceptCodePart())
1282 cd->
addCodePart(ce->initializer.str(),ce->startLine,ce->startColumn);
1289 AUTO_TRACE_ADD(
"Concept '{}' not added, already exists (as alias)", qualifiedName);
1296 for (
const auto &ce : root->
children())
1298 if (ce->section.isConceptDocPart())
1318 if (root->
section.isModuleDoc())
1328 if (root->
section.isConcept())
1338 if (root->
section.isConceptDoc())
1357 if (cd!=ocd && cd->groupId()==ocd->groupId() &&
1358 !cd->partOfGroups().empty() && ocd->partOfGroups().empty())
1363 for (
const auto &gd : cd->partOfGroups())
1369 gd->addConcept(ocd.get());
1394 aliasFullName(name),aliasCd(std::move(cd)), aliasContext(ctx) {}
1396 std::unique_ptr<ClassDef> aliasCd;
1399 std::vector<ClassAlias> aliases;
1403 if (cd && visitedClasses.find(icd.get())==visitedClasses.end())
1409 name,icd->getFileDef(),
nullptr);
1435 aliases.emplace_back(aliasFullName,std::move(aliasCd),dm);
1446 visitedClasses.insert(icd.get());
1456 for (
auto &alias : aliases)
1461 alias.aliasContext->addInnerCompound(aliasCd);
1470 if (cd && visitedClasses.find(icd.get())==visitedClasses.end())
1488 "Incomplete input: scope for class {} not found!{}",name,
1489 name.
startsWith(
"std::") ?
" Try enabling BUILTIN_STL_SUPPORT." :
""
1507 if (visitedClasses.find(cd.get())==visitedClasses.end() && !cd->partOfGroups().empty())
1511 for (
auto &ncd : cd->getClasses())
1522 visitedClasses.insert(cd.get());
1533 fullName+=
"."+fieldName;
1576 for (
const auto &md : *ml)
1579 auto newMd =
createMemberDef(md->getDefFileName(),md->getDefLine(),md->getDefColumn(),
1580 md->typeString(),md->name(),md->argsString(),md->excpString(),
1581 md->protection(),md->virtualness(),md->isStatic(),Relationship::Member,
1628 for (
const auto &md : *ml)
1631 if (type.
find(
"::@")!=-1)
1637 if (type.
find(icd->name())!=-1)
1640 if (md->isAnonymous()) name =
"__unnamed" +
QCString().
setNum(pos++)+
"__";
1660 for (
const auto &pmd : *pml)
1663 if (pmdm && pmd->
name()==md->name())
1683 if (icd->name().find(
"@")==-1)
1692 candidates.push_back(cdm);
1698 std::vector<ClassDefMutable *> candidates;
1710 for (
auto &cd : candidates)
1723 (root->
section.isNamespace() ||
1724 root->
section.isNamespaceDoc() ||
1733 if (root->
section.isPackageDoc())
1797 root->
type,root->
spec.isPublished())));
1864 QCString aliasName = aliasNd->name();
1893 for (
auto &und : unl)
1897 if (usingNd!=
nullptr)
break;
1904 if (root->
section.isUsingDir())
1922 (fd==
nullptr || fd->
getLanguage()!=SrcLangExt::Java)
1936 int scopeOffset =
static_cast<int>(nsName.
length());
1947 else if ((scopeOffset=nsName.
findRev(
"::",scopeOffset-1))==-1)
1951 }
while (scopeOffset>=0 && usingNd==
nullptr);
1953 if (usingNd==
nullptr && nd)
1957 while (pnd && usingNd==
nullptr)
1974 if (usingNd==
nullptr && fd)
2047 if (root->
section.isUsingDecl() &&
2060 if (root->
section.isUsingDecl() &&
2062 (!filterPythonPackages || (root->
lang==SrcLangExt::Python && root->
fileName.
endsWith(
"__init__.py")))
2065 AUTO_TRACE(
"Found using declaration '{}' at line {} of {} inside section {}",
2095 if (nd==
nullptr) scope = fd;
2165 AUTO_TRACE(
"creating new member {} for class {}",memName,cd->
name());
2176 newMmd->setMemberClass(cd);
2194 newMmd->addSectionsToDefinition(root->
anchors);
2200 newMmd->setMemberGroupId(root->
mGrpId);
2203 newMmd->setLanguage(root->
lang);
2204 newMmd->setId(root->
id);
2213 if (root->
section.isUsingDecl() &&
2240 for (
auto &mi : *mni)
2243 if (md && md->
protection()!=Protection::Private)
2258 for (
const auto ©Cd : it->second)
2271 else if (root->
section.isUsingDecl() &&
2273 root->
lang==SrcLangExt::Cpp
2306 memName = root->
name;
2328 newMmd->setNamespace(nd);
2333 newMmd->setFileDef(fd);
2352 newMmd->addSectionsToDefinition(root->
anchors);
2358 newMmd->setMemberGroupId(root->
mGrpId);
2361 newMmd->setLanguage(root->
lang);
2362 newMmd->setId(root->
id);
2370 if (nd && aliasMd.get())
2374 if (fd && aliasMd.get())
2403 if (nd) ncdm->
moveTo(nd);
2432 aliasFullName = aliasCd->localName();
2436 aliasFullName = nd->
qualifiedName()+
"::"+aliasCd->localName();
2468 for (
const auto &fd : *fn)
2471 fd->addIncludedUsingDirectives(visitedFiles);
2493 if (lang==SrcLangExt::Java || lang==SrcLangExt::CSharp)
2498 AUTO_TRACE(
"class variable: file='{}' type='{}' scope='{}' name='{}' args='{}' prot={} mtype={} lang={} ann={} init='{}'",
2506 if (root->
spec.isAlias())
2508 if (lang==SrcLangExt::Python)
2510 def=
"type "+name+args;
2519 def=type+
" "+name+args;
2524 if (root->
spec.isAlias())
2526 if (lang==SrcLangExt::Python)
2528 def=
"type "+qualScope+scopeSeparator+name+args;
2532 def=
"using "+qualScope+scopeSeparator+name;
2537 def=type+
" "+qualScope+scopeSeparator+name+args;
2549 def=qualScope+scopeSeparator+name+args;
2560 for (
const auto &imd : *mn)
2572 if (root->
lang==SrcLangExt::ObjC &&
2573 root->
mtype==MethodTypes::Property &&
2597 prot,Specifier::Normal,root->
isStatic,related,
2601 mmd->setTagInfo(root->
tagInfo());
2602 mmd->setMemberClass(cd);
2606 mmd->setDefinition(def);
2608 mmd->addSectionsToDefinition(root->
anchors);
2609 mmd->setFromAnonymousScope(fromAnnScope);
2610 mmd->setFromAnonymousMember(fromAnnMemb);
2615 mmd->setMemberGroupId(root->
mGrpId);
2616 mmd->setMemberSpecifiers(root->
spec);
2617 mmd->setVhdlSpecifiers(root->
vhdlSpec);
2618 mmd->setReadAccessor(root->
read);
2619 mmd->setWriteAccessor(root->
write);
2621 mmd->setHidden(root->
hidden);
2623 mmd->setLanguage(root->
lang);
2624 mmd->setId(root->
id);
2627 mmd->setBodyDef(root->
fileDef());
2632 mmd->setRefItems(root->
sli);
2633 mmd->setRequirementReferences(root->
rqli);
2663 AUTO_TRACE(
"global variable: file='{}' type='{}' scope='{}' name='{}' args='{}' prot={} mtype={} lang={} init='{}'",
2675 static const reg::Ex re(R
"(\a\w*)");
2677 const std::string &typ = ttype.
str();
2699 if (scope.
find(
'@')!=-1)
return nullptr;
2715 if (root->
spec.isAlias())
2717 if (lang==SrcLangExt::Python)
2719 def=
"type "+nd->
name()+sep+name+args;
2723 def=
"using "+nd->
name()+sep+name;
2728 def=type+
" "+nd->
name()+sep+name+args;
2733 def=nd->
name()+sep+name+args;
2740 if (name.
at(0)==
'@')
2746 if (root->
spec.isAlias())
2748 if (root->
lang==SrcLangExt::Python)
2750 def=
"type "+root->
name+args;
2754 def=
"using "+root->
name;
2759 def=type+
" "+name+args;
2780 for (
const auto &imd : *mn)
2794 bool isPHPArray = md->
getLanguage()==SrcLangExt::PHP &&
2797 bool staticsInDifferentFiles =
2803 !staticsInDifferentFiles
2845 mmd->setTagInfo(root->
tagInfo());
2846 mmd->setMemberSpecifiers(root->
spec);
2847 mmd->setVhdlSpecifiers(root->
vhdlSpec);
2851 mmd->addSectionsToDefinition(root->
anchors);
2852 mmd->setFromAnonymousScope(fromAnnScope);
2853 mmd->setFromAnonymousMember(fromAnnMemb);
2856 mmd->setMemberGroupId(root->
mGrpId);
2857 mmd->setDefinition(def);
2858 mmd->setLanguage(root->
lang);
2859 mmd->setId(root->
id);
2867 mmd->setBodyDef(fd);
2872 mmd->setRefItems(root->
sli);
2873 mmd->setRequirementReferences(root->
rqli);
2876 mmd->setNamespace(nd);
2884 mmd->setFileDef(fd);
2912 if (lang == SrcLangExt::Fortran || lang == SrcLangExt::VHDL)
2917 static const reg::Ex re(R
"(\([^)]*[*&^][^)]*\))");
2919 size_t i=std::string::npos;
2923 i = match.position();
2926 if (i!=std::string::npos)
2928 size_t di = type.find(
"decltype(");
2929 if (di!=std::string::npos && di<i)
2931 i = std::string::npos;
2934 size_t bb=type.find(
'<');
2935 size_t be=type.rfind(
'>');
2936 bool templFp =
false;
2937 if (be!=std::string::npos) {
2938 size_t cc_ast = type.find(
"::*");
2939 size_t cc_amp = type.find(
"::&");
2940 templFp = (cc_ast != std::string::npos && cc_ast>be) || (cc_amp != std::string::npos && cc_amp>be);
2943 if (!type.empty() &&
2944 i!=std::string::npos &&
2945 type.find(
"operator")==std::string::npos &&
2946 (type.find(
")(")==std::string::npos || type.find(
"typedef ")!=std::string::npos) &&
2948 (!(bb<i && i<be) || templFp)
2951 if (pLength) *pLength=
static_cast<int>(l);
2954 return static_cast<int>(i);
2971 bool result =
false;
2972 bool typeIsClass =
false;
2973 bool typePtrType =
false;
3007 typePtrType = type.
find(
'*')!=-1 || type.
find(
'&')!=-1;
3010 typeIsClass = resolver.
resolveClass(ctx,type)!=
nullptr;
3012 if (!typeIsClass && (ti=type.
find(
'<'))!=-1)
3029 static const reg::Ex initChars(R
"([\d"'&*!^]+)");
3033 std::string name = a.
name.
str();
3034 if (
reg::search(name,match,initChars) && match.position()==0)
3066 std::string atype = a.
type.
str();
3067 if (
reg::search(atype,match,initChars) && match.position()==0)
3074 if (resType.empty()) resType=atype;
3075 static const reg::Ex idChars(R
"(\a\w*)");
3076 if (
reg::search(resType,match,idChars) && match.position()==0)
3078 resType=match.str();
3079 if (resType==
"int" || resType==
"long" ||
3080 resType==
"float" || resType==
"double" ||
3081 resType==
"char" || resType==
"void" ||
3082 resType==
"signed" || resType==
"unsigned" ||
3083 resType==
"const" || resType==
"volatile" )
3120 bool insideString=
FALSE;
3121 bool insideChar=
FALSE;
3123 while (e<len && brCount!=0)
3129 if (!insideString && !insideChar)
3131 if (e<len-1 && s.
at(e+1)==
'<')
3133 else if (roundCount==0)
3138 if (!insideString && !insideChar)
3140 if (e<len-1 && s.
at(e+1)==
'>')
3142 else if (roundCount==0)
3147 if (!insideString && !insideChar)
3151 if (!insideString && !insideChar)
3157 if (insideString && pc!=
'\\')
3166 if (insideChar && pc!=
'\\')
3176 return brCount==0 ?
static_cast<int>(e) : -1;
3185 AUTO_TRACE(
"VARIABLE_SEC: type='{}' name='{}' args='{}' bodyLine={} endBodyLine={} mGrpId={} relates='{}'",
3192 if (type.
isEmpty() && name.
find(
"operator")==-1 &&
3193 (name.
find(
'*')!=-1 || name.
find(
'&')!=-1))
3200 std::string sargs = args.
str();
3201 static const reg::Ex reName(R
"(\a\w*)");
3206 sargs = match.suffix().str();
3207 size_t j = sargs.find(
')');
3208 if (j!=std::string::npos) args=sargs.substr(0,j);
3218 int ai = type.
find(
'[',i);
3224 else if (type.
find(
')',i)!=-1)
3231 AUTO_TRACE_ADD(
"after correction: type='{}' name='{}' args='{}'",type,name,args);
3242 scope=name.
left(index);
3243 name=name.
mid(index+2);
3263 bool isRelated=
FALSE;
3264 bool isMemberOf=
FALSE;
3267 if (root->
lang==SrcLangExt::CSharp)
3280 for (
size_t i=0;i<name.
length()-1;i++)
3282 if (name[i]==
':' && name[i+1]==
':')
3284 p=
static_cast<int>(i);
3286 else if (name[i]==
'<')
3291 if (e!=-1) i=
static_cast<int>(e);
3297 if (type==
"friend class" || type==
"friend struct" ||
3298 type==
"friend union")
3312 Relationship::Member
3338 else if (root->
mtype==MethodTypes::Property)
3340 else if (root->
mtype==MethodTypes::Event)
3342 else if (type.
find(
"sequence<") != -1)
3344 else if (type.
find(
"dictionary<") != -1)
3350 isMemberOf=(root->
relatesType==RelatesType::MemberOf);
3368 int si=scope.
find(
'@');
3372 bool inlineSimpleStructs =
Config_getBool(INLINE_SIMPLE_STRUCTS);
3373 Relationship relationship = isMemberOf ? Relationship::Foreign :
3374 isRelated ? Relationship::Related :
3375 Relationship::Member ;
3376 if (si!=-1 && !inlineSimpleStructs)
3380 pScope = scope.
left(std::max(si-2,0));
3382 pScope.
prepend(annScopePrefix);
3383 else if (annScopePrefix.
length()>2)
3384 pScope=annScopePrefix.
left(annScopePrefix.
length()-2);
3385 if (name.
at(0)!=
'@')
3453 scope=rname.
left(index);
3454 rname=rname.
mid(index+2);
3466 for (
auto &imd : *mn)
3468 if (!imd->isTypedef())
3477 bool notBothGrouped = root->
groups.empty() || imd->getGroupDef()==
nullptr;
3478 bool bothSameScope = (!cd && !nd) || (cd && imd->getClassDef() == cd) || (nd && imd->getNamespaceDef() == nd);
3481 if (notBothGrouped && bothSameScope && imd->typeString()==rtype)
3529 for (
const auto &e : root->
children())
3530 if (!e->section.isEnum())
3547 for (
const auto &e : root->
children())
3548 if (!e->section.isEnum())
3565 for (
const auto &e : root->
children())
3566 if (!e->section.isEnum())
3581 (root->
section.isVariable() &&
3584 (root->
section.isFunction() &&
3587 (root->
section.isFunction() &&
3596 for (
const auto &e : root->
children())
3597 if (!e->section.isEnum())
3623 mmd->setTagInfo(root->
tagInfo());
3624 mmd->setMemberClass(cd);
3626 mmd->setDocsForDefinition(
false);
3630 mmd->setMemberSpecifiers(root->
spec);
3631 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3632 mmd->setMemberGroupId(root->
mGrpId);
3634 mmd->setLanguage(root->
lang);
3635 mmd->setBodyDef(fd);
3636 mmd->setFileDef(fd);
3637 mmd->addSectionsToDefinition(root->
anchors);
3639 mmd->setDefinition(def);
3643 AUTO_TRACE(
"Interface member: fileName='{}' type='{}' name='{}' mtype='{}' prot={} virt={} state={} proto={} def='{}'",
3651 root->
spec.isOptional() ? Protection::Protected : Protection::Public, Specifier::Normal);
3661 mmd->setRefItems(root->
sli);
3662 mmd->setRequirementReferences(root->
rqli);
3671 if (root->
section.isExportedInterface() || root->
section.isIncludedService())
3673 AUTO_TRACE(
"Exported interface/included service: type='{}' scope='{}' name='{}' args='{}'"
3674 " relates='{}' relatesType='{}' file='{}' line={} bodyLine={} #tArgLists={}"
3675 " mGrpId={} spec={} proto={} docFile='{}'",
3701 "Illegal member name found.");
3707 case SrcLangExt::Unknown:
3708 case SrcLangExt::IDL:
3745 if ((fd==
nullptr || fd->
getLanguage()==SrcLangExt::Cpp) &&
3747 (i=name.
find(
'<'))!=-1 &&
3748 (j=name.
find(
'>'))!=-1 &&
3749 (j!=i+2 || name.
at(i+1)!=
'=')
3767 root->
relatesType==RelatesType::MemberOf ? Relationship::Foreign :
3768 Relationship::Related ;
3778 mmd->setTagInfo(root->
tagInfo());
3779 mmd->setMemberClass(cd);
3781 mmd->setDocsForDefinition(!root->
proto);
3785 mmd->setMemberSpecifiers(spec);
3786 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3787 mmd->setMemberGroupId(root->
mGrpId);
3789 mmd->setLanguage(root->
lang);
3790 mmd->setRequiresClause(root->
req);
3791 mmd->setId(root->
id);
3792 mmd->setBodyDef(fd);
3793 mmd->setFileDef(fd);
3794 mmd->addSectionsToDefinition(root->
anchors);
3799 if (scopeSeparator!=
"::")
3801 qualScope =
substitute(qualScope,
"::",scopeSeparator);
3803 if (lang==SrcLangExt::PHP)
3806 scopeSeparator=
"::";
3823 def=type+
" "+qualScope+scopeSeparator+name;
3827 def=qualScope+scopeSeparator+name;
3831 mmd->setDefinition(def);
3835 AUTO_TRACE(
"function member: type='{}' scope='{}' name='{}' args='{}' proto={} def='{}'",
3836 type, qualScope, rname, args, root->
proto, def);
3846 mmd->setRefItems(root->
sli);
3847 mmd->setRequirementReferences(root->
rqli);
3871 mmd->setTagInfo(root->
tagInfo());
3872 mmd->setLanguage(root->
lang);
3873 mmd->setId(root->
id);
3878 mmd->setDocsForDefinition(!root->
proto);
3884 mmd->addSectionsToDefinition(root->
anchors);
3885 mmd->setMemberSpecifiers(root->
spec);
3886 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3887 mmd->setMemberGroupId(root->
mGrpId);
3888 mmd->setRequiresClause(root->
req);
3923 def=root->
type+
" "+scope+name;
3929 AUTO_TRACE(
"new non-member function type='{}' scope='{}' name='{}' args='{}' proto={} def='{}'",
3931 mmd->setDefinition(def);
3935 mmd->setRefItems(root->
sli);
3936 mmd->setRequirementReferences(root->
rqli);
3940 mmd->setNamespace(nd);
3947 mmd->setFileDef(fd);
3968 if (root->
section.isFunction())
3970 AUTO_TRACE(
"member function: type='{}' scope='{}' name='{}' args='{}' relates='{}' relatesType='{}'"
3971 " file='{}' line={} bodyLine={} #tArgLists={} mGrpId={}"
3972 " spec={} proto={} docFile='{}'",
3977 bool isFriend=root->
type==
"friend" || root->
type.
find(
"friend ")!=-1;
3987 scope=rname.
left(index);
3988 rname=rname.
mid(index+2);
3997 if (root->
lang==SrcLangExt::CSharp)
4008 int memIndex=rname.
findRev(
"::");
4011 if (cd && scope+
"::"==rname.
left(scope.
length()+2))
4017 bool isMember=
FALSE;
4020 int ts=rname.
find(
'<');
4021 int te=rname.
find(
'>');
4022 if (memIndex>0 && (ts==-1 || te==-1))
4039 isMember=memIndex<ts || memIndex>te;
4079 for (
const auto &imd : *mn)
4092 fullScope.
prepend(parentScope);
4098 if (mnd) nsName = mnd->
name();
4099 if (rnd) rnsName = rnd->
name();
4107 bool sameTemplateArgs =
TRUE;
4108 bool matchingReturnTypes =
TRUE;
4109 bool sameRequiresClause =
TRUE;
4115 matchingReturnTypes =
FALSE;
4119 sameRequiresClause =
FALSE;
4125 sameTemplateArgs =
FALSE;
4128 bool staticsInDifferentFiles =
4131 if (sameTemplateArgs &&
4132 matchingReturnTypes &&
4133 sameRequiresClause &&
4134 !staticsInDifferentFiles &&
4141 if (!root->
groups.empty() && !root->
groups.front().groupname.isEmpty())
4148 found=(mnd && rnd && nsName==rnsName) ||
4149 ((mnd==
nullptr && rnd==
nullptr && mfd!=
nullptr &&
4154 if (!found && gd && gd==md->
getGroupDef() && nsName==rnsName)
4160 AUTO_TRACE_ADD(
"combining function with prototype found={} in namespace '{}'",found,nsName);
4262 "Illegal member name found."
4280 for (
const auto &ifmd : *fn)
4284 for (
const auto &immd : *mn)
4300 AUTO_TRACE_ADD(
"Merging related global and member '{}' isFriend={} isRelated={} isFunction={}",
4377 for (
const auto &imdec : *mn)
4385 for (
const auto &imdef : *mn)
4388 if (mdef && mdec!=mdef &&
4408 for (
const auto &imd : *mn)
4424 if (mdef && mdec)
break;
4432 mdec->getOuterScope(),mdec->getFileDef(),mdec->typeString(),
const_cast<ArgumentList*
>(&mdecAl),
4439 mdec->mergeReferences(mdef);
4441 mdec->mergeReferencedBy(mdef);
4458 for (
const auto &imd : *mn)
4469 for (
const auto &irmd : *rmn)
4503 size_t i=qualifiedName.rfind(
"::");
4504 if (i!=std::string::npos)
4506 QCString scope = qualifiedName.substr(0,i);
4507 QCString name = qualifiedName.substr(i+2);
4511 for (
const auto &imd : *mn)
4537 std::map<std::string,int> templateNames;
4539 for (
const Argument &arg : templateArguments)
4541 static const reg::Ex re(R
"(\a[\w:]*)");
4544 for (; it!=
end ; ++it)
4546 const auto &match = *it;
4547 std::string n = match.str();
4548 if (n==arg.name.str())
4550 if (templateNames.find(n)==templateNames.end())
4552 templateNames.emplace(n,count);
4557 return templateNames;
4572 if (context && cd!=context)
4577 if (result==
nullptr)
4582 if (result==
nullptr)
4611 for (
auto &mi : *mni)
4621 type = typedefValue;
4640 usedClassName = typeCd->
name();
4650 if (templateNames.empty())
4654 BaseInfo bi(usedName,Protection::Public,Specifier::Normal);
4659 if (arg.name==usedName)
4663 if (usedCd==
nullptr)
4714 if (!found && !type.
isEmpty())
4773 if (templateNames.empty())
4811 AUTO_TRACE(
"Derived from template '{}' with parameters '{}' isArtificial={}",
4812 templateClass->
name(),templSpec,isArtificial);
4815 bool existingClass = templSpec==tempArgsStr;
4816 if (existingClass)
return;
4818 bool freshInstance=
FALSE;
4835 for (
auto it=it_pair.first ; it!=it_pair.second ; ++it)
4837 const Entry *templateRoot = it->second;
4838 AUTO_TRACE_ADD(
"template root found '{}' templSpec='{}'",templateRoot->
name,templSpec);
4844 isArtificial,templArgs.get(),templateNames);
4863 int ti=ttype.
find(
'<');
4869 templateClassName,
true,
true);
4870 AUTO_TRACE_ADD(
"templateClassName={} baseClass={}",templateClassName,baseClass?baseClass->
name():
"<none>");
4889 int index=n.
find(
'<');
4901 int l =
static_cast<int>(name.
length());
4907 while (count>0 && i>=0)
4912 case '>':
if (!insideQuote) count++;
break;
4913 case '<':
if (!insideQuote) count--;
break;
4914 case '\'':
if (!insideQuote) insideQuote=c;
4915 else if (insideQuote==c && (i<0 || name[i]!=
'\\')) insideQuote=0;
4917 case '"':
if (!insideQuote) insideQuote=c;
4918 else if (insideQuote==c && (i<0 || name[i]!=
'\\')) insideQuote=0;
4938 AUTO_TRACE(
"name={} base={} isArtificial={} mode={}",cd->
name(),bi->
name,isArtificial,(
int)mode);
4941 bool explicitGlobalScope=
FALSE;
4945 explicitGlobalScope=
TRUE;
4949 bool lastParent=
FALSE;
4954 int scopeOffset=explicitGlobalScope ? 0 :
static_cast<int>(scopeName.
length());
4963 baseClassName.
prepend(scopeName.
left(scopeOffset)+
"::");
4965 if (root->
lang==SrcLangExt::CSharp)
4992 || explicitGlobalScope
4995 || (root->
lang==SrcLangExt::IDL &&
4996 (root->
section.isExportedInterface() ||
4997 root->
section.isIncludedService()))
5000 AUTO_TRACE_ADD(
"class relation '{}' inherited/used by '{}' found prot={} virt={} templSpec='{}'",
5001 baseClassName, root->
name, bi->
prot, bi->
virt, templSpec);
5004 int si=baseClassName.
findRev(
"::",i);
5006 if (baseClass==
nullptr &&
static_cast<size_t>(i)!=baseClassName.
length())
5016 baseClassName = baseClassName.
left(i)+baseClassName.
right(baseClassName.
length()-e);
5027 else if (baseClass && !templSpec.
isEmpty())
5038 baseClass = templClass;
5046 if (!found && si!=-1)
5056 found=baseClass!=
nullptr && baseClass!=cd;
5066 found = baseClass!=
nullptr && baseClass!=cd;
5078 found = baseClass!=
nullptr && baseClass!=cd;
5081 bool isATemplateArgument = templateNames.find(biName.
str())!=templateNames.end();
5086 AUTO_TRACE_ADD(
"Documented base class '{}' templSpec='{}'",biName,templSpec);
5104 if (baseClassTypeDef==
nullptr)
5114 if (baseClassTypeDef)
5123 AUTO_TRACE_ADD(
"insertBaseClass name={} prot={} virt={} templSpec={}",usedName,prot,bi->
virt,templSpec);
5131 "Detected potential recursive class relation "
5132 "between class {} and base class {}!",
5139 else if (mode==
Undocumented && (scopeOffset==0 || isATemplateArgument))
5141 AUTO_TRACE_ADD(
"New undocumented base class '{}' baseClassName='{}' templSpec='{}' isArtificial={}",
5142 biName,baseClassName,templSpec,isArtificial);
5144 if (isATemplateArgument)
5147 if (baseClass==
nullptr)
5166 if (baseClass==
nullptr)
5177 si = baseClassName.
findRev(
"::");
5193 biName=
"<"+biName.
left(biName.
length()-2)+
">";
5197 AUTO_TRACE_ADD(
"insertBaseClass name={} prot={} virt={} templSpec={}",biName,bi->
prot,bi->
virt,templSpec);
5207 if (scope!=baseClass)
5233 "Detected potential recursive class relation "
5234 "between class {} and base class {}!",
5235 root->
name,baseClassName
5246 else if ((scopeOffset=scopeName.
findRev(
"::",scopeOffset-1))==-1)
5251 }
while (scopeOffset>=0);
5253 if (parentNode==
nullptr)
5259 parentNode=parentNode->
parent();
5261 }
while (lastParent);
5281 bool hasExtends = !root->
extends.empty();
5282 if (hasExtends)
return TRUE;
5306 if ((root->
lang==SrcLangExt::CSharp || root->
lang==SrcLangExt::Java) &&
5307 (i=bName.
find(
'<'))!=-1)
5311 if (root->
lang==SrcLangExt::CSharp)
5317 bName = bName.
left(i);
5349 if (i!=-1 && j!=-1 && k==-1 && root->
lang!=SrcLangExt::CSharp && root->
lang!=SrcLangExt::Java)
5382 if (!nd->hasDocumentation())
5385 nd->getLanguage() == SrcLangExt::Fortran) &&
5389 warn_undoc(nd->getDefFileName(),nd->getDefLine(),
"{} {} is not documented.",
5390 nd->getLanguage() == SrcLangExt::Fortran ?
"Module" :
"Namespace",
5454 for (
const auto &tn_kv : templateNames)
5456 size_t templIndex = tn_kv.second;
5458 bool hasActArg=
FALSE;
5459 if (templIndex<templArgs->size())
5461 actArg=templArgs->at(templIndex);
5465 baseClassNames.find(actArg.
type.
str())!=baseClassNames.end() &&
5466 actualTemplateNames.find(actArg.
type.
str())==actualTemplateNames.end()
5469 actualTemplateNames.emplace(actArg.
type.
str(),
static_cast<int>(templIndex));
5504 for (
const auto &fd : *fn)
5506 fd->computeAnchors();
5519 gd->computeAnchors();
5526template<
typename Func>
5549 for (
const auto &fd : *fn)
5622 if (md==
nullptr)
return;
5623 AUTO_TRACE(
"scope='{}' name='{}' args='{}' funcDecl='{}' mSpec={}",
5638 fullName = cd->
name();
5640 fullName = nd->
name();
5642 if (!fullName.
isEmpty()) fullName+=
"::";
5643 fullName+=md->
name();
5748 "member {} belongs to two different groups. The second one found here will be ignored.",
5786 return allowNoGroup;
5789 for (
const auto &g : root->
groups)
5791 if (g.groupname == gd->
name())
5814 AUTO_TRACE(
"namespace='{}' type='{}' name='{}' tempArg='{}' decl='{}'",namespaceName,type,name,tempArg,decl);
5828 for (
const auto &md : *mn)
5839 if (md->isAlias() && md->getOuterScope() &&
5846 nd = md->getNamespaceDef();
5851 if (nd && md->isEnumValue() && (enumNamePos=namespaceName.
findRev(
"::"))!=-1)
5853 QCString enumName = namespaceName.
mid(enumNamePos+2);
5854 if (namespaceName.
left(enumNamePos)==nd->
name())
5859 for (
const auto &emd : *enumMn)
5861 found = emd->isStrong() && md->getEnumScope()==emd.get();
5875 else if (nd==
nullptr && md->isEnumValue())
5880 for (
const auto &emd : *enumMn)
5882 found = emd->isStrong() && md->getEnumScope()==emd.get();
5905 if ((namespaceName.
isEmpty() && nd==
nullptr) ||
5906 (nd && nd->
name()==namespaceName) ||
5910 AUTO_TRACE_ADD(
"Try to add member '{}' to scope '{}'",md->name(),namespaceName);
5918 md->isVariable() || md->isTypedef() ||
5919 matchArguments2(md->getOuterScope(),md->getFileDef(),md->typeString(),&mdAl,
5926 if (matching && !root->
tArgLists.empty())
5945 if (matching && md->isStatic() &&
5946 md->getDefFileName()!=root->
fileName &&
5954 if (!md->templateArguments().empty() && !root->
tArgLists.empty())
5959 if (md->templateArguments().size()!=root->
tArgLists.back().size() ||
5960 md->typeString()!=type ||
5961 md->requiresClause()!=root->
req)
5977 if (!found && root->
relatesType!=RelatesType::Duplicate && root->
section.isFunction())
5981 QCString warnMsg =
"no matching file member found for \n"+fullFuncDecl;
5984 warnMsg+=
"\nPossible candidates:";
5985 for (
const auto &md : *mn)
5989 warnMsg+=
"' " +
warn_line(md->getDefFileName(),md->getDefLine());
5997 if (root->
type!=
"friend class" &&
5998 root->
type!=
"friend struct" &&
5999 root->
type!=
"friend union" &&
6000 root->
type!=
"friend" &&
6006 "documented symbol '{}' was not declared or defined.",
qPrint(decl)
6018 auto srcIt = srcTempArgLists.begin();
6019 auto dstIt = dstTempArgLists.begin();
6020 while (srcIt!=srcTempArgLists.end() && dstIt!=dstTempArgLists.end())
6022 if ((*srcIt).size()!=(*dstIt).size())
return TRUE;
6036 result = cd->templateArguments().hasParameters() || cd->templateMaster()!=
nullptr ||
6046 const std::string &src
6050 static const reg::Ex re(R
"(\a\w*)");
6055 for (; it!=
end ; ++it)
6057 const auto &match = *it;
6058 size_t i = match.position();
6059 size_t l = match.length();
6061 dst+=src.substr(p,i-p);
6062 std::string name=match.str();
6064 auto srcIt = srcTempArgLists.begin();
6065 auto dstIt = dstTempArgLists.begin();
6066 while (srcIt!=srcTempArgLists.end() && !found)
6069 std::vector<Argument>::const_iterator tdaIt;
6070 if (dstIt!=dstTempArgLists.end())
6073 tdaIt = tdAli->
begin();
6078 for (
auto tsaIt = tsaLi.
begin(); tsaIt!=tsaLi.
end() && !found; ++tsaIt)
6082 if (tdAli && tdaIt!=tdAli->
end())
6098 else if (tdaType.
startsWith(
"typename ")) vc=9;
6101 tdaName = tdaType.
mid(vc);
6134 auto dstIt = dst.
begin();
6139 if (dstIt == dst.
end())
6143 da.
array = dstArray;
6151 da.
array = dstArray;
6159 srcTempArgLists,dstTempArgLists,
6185 funcType,funcName,funcArgs,exceptions,
6189 mmd->setTagInfo(root->
tagInfo());
6190 mmd->setLanguage(root->
lang);
6191 mmd->setId(root->
id);
6192 mmd->makeImplementationDetail();
6193 mmd->setMemberClass(cd);
6194 mmd->setDefinition(funcDecl);
6200 mmd->setDocsForDefinition(!root->
proto);
6202 mmd->addSectionsToDefinition(root->
anchors);
6206 mmd->setMemberSpecifiers(spec);
6207 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6208 mmd->setMemberGroupId(root->
mGrpId);
6211 mmd->setRefItems(root->
sli);
6212 mmd->setRequirementReferences(root->
rqli);
6248 bool memFound=
FALSE;
6249 for (
const auto &imd : *mn)
6252 if (md==
nullptr)
continue;
6254 if (cd==
nullptr)
continue;
6271 if (!namespaceName.
isEmpty()) fullScope.
prepend(namespaceName+
"::");
6272 if (fullScope==cd->
name())
6278 for (
const auto &emd : *enumMn)
6280 memFound = emd->isStrong() && md->
getEnumScope()==emd.get();
6286 if (memFound)
break;
6291 if (memFound)
break;
6309 if (!templAl.
empty())
6311 declTemplArgs.push_back(templAl);
6319 bool substDone=
false;
6326 if (declTemplArgs.size()>0 && declTemplArgs.size()==defTemplArgs.size())
6349 AUTO_TRACE_ADD(
"matching '{}'<=>'{}' className='{}' namespaceName='{}' result={}",
6378 AUTO_TRACE_ADD(
"Comparing return types '{}'<->'{}' #args {}<->{}",
6386 else if (defTemplArgs.size()>declTemplArgs.size())
6388 AUTO_TRACE_ADD(
"Different number of template arguments {} vs {}",defTemplArgs.size(),declTemplArgs.size());
6394 bool rootIsUserDoc = root->
section.isMemberDoc();
6397 bool classOrMdIsTemplate = mdIsTemplate || classIsTemplate;
6398 bool rootIsTemplate = !root->
tArgLists.empty();
6400 if (!rootIsUserDoc &&
6401 (mdIsTemplate || rootIsTemplate) &&
6402 ((classOrMdIsTemplate && !rootIsTemplate) || (!classOrMdIsTemplate && rootIsTemplate))
6407 AUTO_TRACE_ADD(
"Comparing return types: template v.s. non-template");
6411 AUTO_TRACE_ADD(
"Match results of matchArguments2='{}' substDone='{}'",matching,substDone);
6422 if (!funcTempList.
isEmpty() &&
6442 else if (cd && cd!=tcd)
6448 if (memFound)
break;
6452 addLocalObjCMethod(root,scopeName,funcType,funcName,funcArgs,exceptions,funcDecl,spec);
6455 if (count==0 && !(isFriend && funcType==
"class"))
6458 const ClassDef *ecd =
nullptr, *ucd =
nullptr;
6459 MemberDef *emd =
nullptr, *umd =
nullptr;
6461 for (
const auto &md : *mn)
6483 AUTO_TRACE_ADD(
"new candidate className='{}' scope='{}' args='{}': exact match",
6484 className,ccd->
name(),md->argsString());
6490 AUTO_TRACE_ADD(
"new candidate className='{}' scope='{}' args='{}': no match",
6491 className,ccd->
name(),md->argsString());
6496 bool strictProtoMatching =
Config_getBool(STRICT_PROTO_MATCHING);
6497 if (!strictProtoMatching)
6499 if (candidates==1 && ucd && umd)
6506 else if (candidates>1 && ecd && emd)
6517 if (noMatchCount>1) warnMsg+=
"uniquely ";
6518 warnMsg+=
"matching class member found for \n";
6522 warnMsg+=
" template ";
6531 warnMsg+=fullFuncDecl;
6533 if (candidates>0 || noMatchCount>=1)
6535 warnMsg+=
"\nPossible candidates:";
6541 for (
const auto &md : *mn)
6543 const ClassDef *cd=md->getClassDef();
6557 warnMsg+=
"template ";
6562 if (!md->typeString().isEmpty())
6564 warnMsg+=md->typeString();
6569 warnMsg+=qScope+
"::"+md->name();
6570 warnMsg+=md->argsString();
6571 warnMsg+=
"' " +
warn_line(md->getDefFileName(),md->getDefLine());
6592 AUTO_TRACE(
"funcType={} funcName={} funcArgs={} funcDecl={} spec={}",funcType,funcName,funcArgs,funcDecl,spec);
6594 for (
const auto &md : *mn)
6596 if (md->getClassDef()==cd)
6608 funcType,funcName,funcArgs,exceptions,
6614 mmd->setTagInfo(root->
tagInfo());
6615 mmd->setLanguage(root->
lang);
6616 mmd->setId(root->
id);
6617 mmd->setMemberClass(cd);
6618 mmd->setTemplateSpecialization(
TRUE);
6620 mmd->setDefinition(funcDecl);
6626 mmd->setDocsForDefinition(!root->
proto);
6628 mmd->addSectionsToDefinition(root->
anchors);
6632 mmd->setMemberSpecifiers(spec);
6633 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6634 mmd->setMemberGroupId(root->
mGrpId);
6636 mmd->setRefItems(root->
sli);
6637 mmd->setRequirementReferences(root->
rqli);
6651 bool sameClass=
false;
6656 [](
const auto &md1,
const auto &md2)
6657 { return md1->getClassDef()->name()==md2->getClassDef()->name(); });
6663 if (cd==
nullptr)
return;
6671 std::unique_ptr<ArgumentList> tArgList =
6676 funcType,funcName,funcArgs,exceptions,
6680 mmd->setTagInfo(root->
tagInfo());
6681 mmd->setLanguage(root->
lang);
6682 mmd->setId(root->
id);
6684 mmd->setMemberClass(cd);
6685 mmd->setDefinition(funcDecl);
6694 mmd->setDocsForDefinition(!root->
proto);
6696 mmd->addSectionsToDefinition(root->
anchors);
6700 mmd->setMemberSpecifiers(spec);
6701 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6702 mmd->setMemberGroupId(root->
mGrpId);
6705 mmd->setRefItems(root->
sli);
6706 mmd->setRequirementReferences(root->
rqli);
6764 AUTO_TRACE(
"root='{}' funcDecl='{}' related='{}' overload={} isFunc={} mGrpId={} #tArgList={} spec={} lang={}",
6777 bool isRelated=
false;
6778 bool isMemberOf=
false;
6779 bool isFriend=
false;
6792 spec.setInline(
true);
6797 spec.setExplicit(
true);
6802 spec.setMutable(
true);
6807 spec.setThreadLocal(
true);
6818 while ((sep=funcDecl.
find(
';'))!=-1)
6824 if (!funcDecl.
isEmpty() && funcDecl[0]!=
' ') funcDecl.
prepend(
" ");
6836 if (isFriend && funcDecl.
startsWith(
"class "))
6840 funcName = funcDecl;
6842 else if (isFriend && funcDecl.
startsWith(
"struct "))
6845 funcName = funcDecl;
6851 funcArgs,funcTempList,exceptions
6859 AUTO_TRACE_ADD(
"scopeName='{}' className='{}' namespaceName='{}' funcType='{}' funcName='{}' funcArgs='{}'",
6860 scopeName,className,namespaceName,funcType,funcName,funcArgs);
6864 isMemberOf=(root->
relatesType == RelatesType::MemberOf);
6871 scopeName = relates;
6884 scopeName = joinedName;
6898 QCString joinedName = fnd->name()+
"::"+scopeName;
6901 scopeName=joinedName;
6928 AUTO_TRACE_ADD(
"scopeName='{}' className='{}' namespaceName='{}'",scopeName,className,namespaceName);
6937 scopeName=namespaceName;
6939 else if (!relates.
isEmpty() ||
6942 scopeName=namespaceName+
"::"+className;
6946 scopeName=className;
6949 else if (!className.
isEmpty())
6951 scopeName=className;
6961 uint32_t argListIndex=0;
6966 tempScopeName=scopeName+funcSpec;
6974 if (!scopeName.
isEmpty() && !isRelated && !isFriend && !
Config_getBool(HIDE_SCOPE_NAMES) && root->
lang!=SrcLangExt::Python)
6980 funcDecl=funcType+
" "+tempScopeName+
"::"+funcName+funcTempList;
6984 funcDecl=funcType+
" "+tempScopeName+
"::"+funcName+funcArgs;
6991 funcDecl=tempScopeName+
"::"+funcName+funcTempList;
6995 funcDecl=tempScopeName+
"::"+funcName+funcArgs;
7005 funcDecl=funcType+
" "+funcName+funcTempList;
7009 funcDecl=funcType+
" "+funcName+funcArgs;
7016 funcDecl=funcName+funcTempList;
7020 funcDecl=funcName+funcArgs;
7025 if (funcType==
"template class" && !funcTempList.
isEmpty())
7028 AUTO_TRACE_ADD(
"Parse results: namespaceName='{}' className=`{}` funcType='{}' funcSpec='{}' "
7029 " funcName='{}' funcArgs='{}' funcTempList='{}' funcDecl='{}' relates='{}'"
7030 " exceptions='{}' isRelated={} isMemberOf={} isFriend={} isFunc={}",
7031 namespaceName, className, funcType, funcSpec,
7032 funcName, funcArgs, funcTempList, funcDecl, relates,
7033 exceptions, isRelated, isMemberOf, isFriend, isFunc);
7039 bool strongEnum =
false;
7043 for (
const auto &imd : *mn)
7056 namespaceName+=
"::"+className;
7060 namespaceName=className;
7068 funcName =
substitute(funcName,className+
"::",
"");
7079 if (!isRelated && !strongEnum && mn)
7087 funcArgs,funcTempList,exceptions,
7088 type,args,isFriend,spec,relates,funcDecl,overloaded,isFunc);
7100 else if (overloaded)
7102 addOverloaded(root,mn,funcType,funcName,funcArgs,funcDecl,exceptions,spec);
7106 if (!
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec))
7111 "Cannot determine class for function\n{}",
7117 else if (isRelated && !relates.
isEmpty())
7119 AUTO_TRACE_ADD(
"related function scopeName='{}' className='{}'",scopeName,className);
7120 if (className.
isEmpty()) className=relates;
7124 bool newMember=
TRUE;
7130 for (
const auto &imd : *mn)
7164 mn->
push_back(std::move(mdDefineTaken));
7178 for (
const auto &irmd : *mn)
7199 addMemberDocs(root,rmd_found,funcDecl,
nullptr,overloaded,spec);
7207 switch (root->
mtype)
7228 funcType,funcName,funcArgs,exceptions,
7231 isMemberOf ? Relationship::Foreign : Relationship::Related,
7251 mmd->setDefinitionTemplateParameterLists(root->
tArgLists);
7253 mmd->setTagInfo(root->
tagInfo());
7267 for (
const auto &irmd : *rmn)
7298 mmd->setBodyDef(fd);
7305 mmd->setMemberClass(cd);
7306 mmd->setMemberSpecifiers(spec);
7307 mmd->setVhdlSpecifiers(root->
vhdlSpec);
7308 mmd->setDefinition(funcDecl);
7313 mmd->setDocsForDefinition(!root->
proto);
7316 mmd->addSectionsToDefinition(root->
anchors);
7317 mmd->setMemberGroupId(root->
mGrpId);
7318 mmd->setLanguage(root->
lang);
7319 mmd->setId(root->
id);
7323 mmd->setRefItems(root->
sli);
7324 mmd->setRequirementReferences(root->
rqli);
7325 if (root->
relatesType==RelatesType::Duplicate) mmd->setRelatedAlso(cd);
7333 if (!
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec))
7338 "Cannot determine file/namespace for relatedalso function\n{}",
7352 addLocalObjCMethod(root,scopeName,funcType,funcName,funcArgs,exceptions,funcDecl,spec);
7356 bool globMem =
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec);
7357 if (className.
isEmpty() && !globMem)
7361 else if (!className.
isEmpty() && !globMem)
7364 "member '{}' of class '{}' cannot be found",
7365 funcName,className);
7383 AUTO_TRACE(
"root->type='{}' root->inside='{}' root->name='{}' root->args='{}' section={} root->spec={} root->mGrpId={}",
7398 type=type.
left(i+l);
7409 if (root->
section.isMemberDoc())
7435 else if (root->
section.isOverloadDoc())
7449 (root->
section.isVariable() &&
7461 if (type==
"friend class" || type==
"friend struct" ||
7462 type==
"friend union")
7468 type+
" "+root->
name,
7501 else if (root->
section.isVariableDoc())
7513 else if (root->
section.isExportedInterface() ||
7514 root->
section.isIncludedService())
7520 type +
" " + root->
name,
7533 if (root->
section.isMemberDoc() ||
7534 root->
section.isOverloadDoc() ||
7537 root->
section.isVariableDoc() ||
7539 root->
section.isIncludedService() ||
7540 root->
section.isExportedInterface()
7550 for (
const auto &e : root->
children())
7552 if (!e->section.isEnum())
7564 for (
const auto &objCImpl : root->
children())
7566 if (objCImpl->section.isObjcImpl())
7568 for (
const auto &objCMethod : objCImpl->children())
7570 if (objCMethod->section.isFunction())
7574 objCMethod->relates,
7577 objCMethod->type+
" "+objCImpl->name+
"::"+objCMethod->name+
" "+objCMethod->args,
7579 objCMethod->section=EntryType::makeEmpty();
7598 bool isGlobal =
false;
7599 bool isRelated =
false;
7600 bool isMemberOf =
false;
7610 if (root->
lang==SrcLangExt::CSharp)
7633 isMemberOf=(root->
relatesType==RelatesType::MemberOf);
7668 isMemberOf ? Relationship::Foreign : isRelated ? Relationship::Related : Relationship::Member,
7672 mmd->setTagInfo(root->
tagInfo());
7673 mmd->setLanguage(root->
lang);
7674 mmd->setId(root->
id);
7675 if (!isGlobal) mmd->setMemberClass(cd);
else mmd->setFileDef(fd);
7677 mmd->setBodyDef(root->
fileDef());
7678 mmd->setMemberSpecifiers(root->
spec);
7679 mmd->setVhdlSpecifiers(root->
vhdlSpec);
7680 mmd->setEnumBaseType(root->
args);
7683 mmd->addSectionsToDefinition(root->
anchors);
7684 mmd->setMemberGroupId(root->
mGrpId);
7688 mmd->setRefItems(root->
sli);
7689 mmd->setRequirementReferences(root->
rqli);
7703 mmd->setDefinition(name+baseType);
7707 mmd->setDefinition(nd->
name()+
"::"+name+baseType);
7711 mmd->setNamespace(nd);
7718 if (isGlobal && (nd==
nullptr || !nd->
isAnonymous()))
7720 if (!defSet) mmd->setDefinition(name+baseType);
7721 if (fd==
nullptr && root->
parent())
7727 mmd->setFileDef(fd);
7735 mmd->setDefinition(name+baseType);
7739 mmd->setDefinition(cd->
name()+
"::"+name+baseType);
7745 mmd->setDocsForDefinition(!root->
proto);
7775 bool isGlobal =
false;
7776 bool isRelated =
false;
7786 if (root->
lang==SrcLangExt::CSharp)
7801 if (root->
lang==SrcLangExt::CSharp)
7847 struct EnumValueInfo
7849 EnumValueInfo(
const QCString &n,std::unique_ptr<MemberDef> &&md) :
7850 name(n), member(std::move(md)) {}
7852 std::unique_ptr<MemberDef> member;
7854 std::vector< EnumValueInfo > extraMembers;
7856 for (
const auto &imd : *mn)
7863 for (
const auto &e : root->
children())
7866 bool isJavaLike = sle==SrcLangExt::CSharp || sle==SrcLangExt::Java || sle==SrcLangExt::XML;
7867 if ( isJavaLike || root->
spec.isStrong())
7869 if (sle == SrcLangExt::Cpp && e->section.isDefine())
continue;
7876 i = qualifiedName.
findRev(
"::");
7877 if (i!=-1 && sle==SrcLangExt::CSharp)
7883 qualifiedName=
substitute(qualifiedName,
"::",
".");
7888 if (fileName.
isEmpty() && e->tagInfo())
7890 fileName = e->tagInfo()->tagName;
7894 fileName,e->startLine,e->startColumn,
7895 e->type,e->name,e->args,
QCString(),
7896 e->protection, Specifier::Normal,e->isStatic,Relationship::Member,
7903 fmmd->setNamespace(mnd);
7907 fmmd->setTagInfo(e->tagInfo());
7908 fmmd->setLanguage(e->lang);
7909 fmmd->setBodySegment(e->startLine,e->bodyLine,e->endBodyLine);
7910 fmmd->setBodyDef(e->fileDef());
7912 fmmd->setDocumentation(e->doc,e->docFile,e->docLine);
7913 fmmd->setBriefDescription(e->brief,e->briefFile,e->briefLine);
7914 fmmd->addSectionsToDefinition(e->anchors);
7915 fmmd->setInitializer(e->initializer.str());
7916 fmmd->setMaxInitLines(e->initLines);
7917 fmmd->setMemberGroupId(e->mGrpId);
7918 fmmd->setExplicitExternal(e->explicitExternal,fileName,e->startLine,e->startColumn);
7919 fmmd->setRefItems(e->sli);
7920 fmmd->setRequirementReferences(e->rqli);
7923 fmmd->setEnumScope(md,
TRUE);
7924 extraMembers.emplace_back(e->name,std::move(fmd));
7933 if (!e->name.isEmpty() && (fmn=emnsd->
find(e->name)))
7936 for (
const auto &ifmd : *fmn)
7967 else if (isRelated && cd)
7999 for (
auto &e : extraMembers)
8045 if (gd==
nullptr && !root->
groups.empty())
8059 for (
const auto &g : root->
groups)
8078 "Found non-existing group '{}' for the command '{}', ignoring command",
8092 if (root->
section.isEnumDoc() &&
8118 AUTO_TRACE(
"Found docs for enum with name '{}' and scope '{}' in context '{}' cd='{}', nd='{}' fd='{}'",
8132 for (
const auto &imd : *mn)
8147 else if (cd==
nullptr && mcd==
nullptr && nd!=
nullptr && mnd==nd)
8154 else if (cd==
nullptr && nd==
nullptr && mcd==
nullptr && mnd==
nullptr && fd==mfd)
8179 for (
const auto &mn : mnsd)
8182 for (
const auto &imd : *mn)
8187 int documentedEnumValues=0;
8191 if (fmd->isLinkableInProject()) documentedEnumValues++;
8217 for (
const auto &md : *mn)
8219 index.addClassMemberNameToIndex(md.get());
8220 if (md->getModuleDef())
8222 index.addModuleMemberNameToIndex(md.get());
8230 for (
const auto &md : *mn)
8232 if (md->getNamespaceDef())
8234 index.addNamespaceMemberNameToIndex(md.get());
8238 index.addFileMemberNameToIndex(md.get());
8240 if (md->getModuleDef())
8242 index.addModuleMemberNameToIndex(md.get());
8247 index.sortMemberIndexLists();
8256 if (cd->isLinkableInProject())
8269 if (cd->isLinkableInProject())
8282 if (nd->isLinkableInProject())
8295 for (
const auto &fd : *fn)
8311 std::string s = title.str();
8312 static const reg::Ex re(R
"(\a[\w-]*)");
8315 for (; it!=
end ; ++it)
8317 const auto &match = *it;
8318 std::string matchStr = match.str();
8326 if (gd->isLinkableInProject())
8328 addWordsForTitle(gd.get(),gd->anchor(),gd->groupTitle());
8334 if (pd->isLinkableInProject())
8336 addWordsForTitle(pd.get(),pd->anchor(),pd->title());
8356 if (md->getClassDef())
8360 if (md->getNamespaceDef())
8371 if (md->getGroupDef()) scope = md->getGroupDef();
8372 else if (md->getClassDef()) scope = md->getClassDef();
8373 else if (md->getNamespaceDef()) scope = md->getNamespaceDef();
8374 else if (md->getFileDef()) scope = md->getFileDef();
8380 if (md->isLinkableInProject())
8382 if (!(md->isEnumerate() && md->isAnonymous()))
8387 if (md->isEnumerate())
8389 for (
const auto &fmd : md->enumFieldList())
8402 for (
const auto &md : *mn)
8404 addMemberToIndices(md.get());
8411 for (
const auto &md : *mn)
8413 addMemberToIndices(md.get());
8426 for (
const auto &imd : *mn)
8439 for (
const auto &imd : *mn)
8456 for (
const auto &imd : *mn)
8465 const auto &bmni = bmn.
find(mn->memberName());
8468 for (
const auto &ibmd : *bmni)
8476 lang==SrcLangExt::Python ||
8477 lang==SrcLangExt::Java ||
8478 lang==SrcLangExt::PHP ||
8489 lang==SrcLangExt::Python ||
8496 if (lang==SrcLangExt::Python && md->
name().
startsWith(
"__"))
continue;
8536 if (cd->isLinkable())
8538 for (
const auto &bcd : cd->baseClasses())
8554 for (
const auto &ti : cd->getTemplateInstances())
8573 int i=cd->name().find(
'(');
8580 AUTO_TRACE_ADD(
"merging members of category {} into {}",cd->name(),baseClass->
name());
8595 cd->subClasses().empty() &&
8596 !cd->baseClasses().empty())
8627 msg(
"Generating code for file {}...\n",fd->
docName());
8632 else if (parseSources)
8634 msg(
"Parsing code for file {}...\n",fd->
docName());
8650 for (
const auto &fd : *fn)
8658 for (
const auto &fd : *fn)
8667 clangParser->parse();
8668 processSourceFile(fd.get(),*
g_outputList,clangParser.get());
8670 for (
auto incFile : clangParser->filesInSameTU())
8672 if (filesToProcess.find(incFile)!=filesToProcess.end() &&
8674 processedFiles.
find(incFile)==processedFiles.end())
8681 processSourceFile(ifd,*
g_outputList,clangParser.get());
8682 processedFiles.insert(incFile);
8693 for (
const auto &fd : *fn)
8695 if (processedFiles.find(fd->
absFilePath().
str())==processedFiles.end())
8700 clangParser->parse();
8701 processSourceFile(fd.get(),*
g_outputList,clangParser.get());
8714 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8717 msg(
"Generating code files using {} threads.\n",numThreads);
8718 struct SourceContext
8721 : fd(fd_), generateSourceFile(gen_), ol(ol_) {}
8723 bool generateSourceFile;
8727 std::vector< std::future< std::shared_ptr<SourceContext> > > results;
8730 for (
const auto &fd : *fn)
8733 auto ctx = std::make_shared<SourceContext>(fd.get(),generateSourceFile,*
g_outputList);
8734 auto processFile = [ctx]()
8736 if (ctx->generateSourceFile)
8738 msg(
"Generating code for file {}...\n",ctx->fd->docName());
8742 msg(
"Parsing code for file {}...\n",ctx->fd->docName());
8745 ctx->fd->getAllIncludeFilesRecursively(filesInSameTu);
8746 if (ctx->generateSourceFile)
8748 ctx->fd->writeSourceHeader(ctx->ol);
8749 ctx->fd->writeSourceBody(ctx->ol,
nullptr);
8750 ctx->fd->writeSourceFooter(ctx->ol);
8755 ctx->fd->parseSource(
nullptr);
8759 results.emplace_back(threadPool.
queue(processFile));
8762 for (
auto &f : results)
8771 for (
const auto &fd : *fn)
8791 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8797 : fd(fd_), ol(ol_) {}
8802 std::vector< std::future< std::shared_ptr<DocContext> > > results;
8805 for (
const auto &fd : *fn)
8807 bool doc = fd->isLinkableInProject();
8810 auto ctx = std::make_shared<DocContext>(fd.get(),*
g_outputList);
8811 auto processFile = [ctx]() {
8812 msg(
"Generating docs for file {}...\n",ctx->fd->docName());
8813 ctx->fd->writeDocumentation(ctx->ol);
8816 results.emplace_back(threadPool.
queue(processFile));
8820 for (
auto &f : results)
8829 for (
const auto &fd : *fn)
8831 bool doc = fd->isLinkableInProject();
8834 msg(
"Generating docs for file {}...\n",fd->docName());
8853 const_cast<FileDef*
>(fd)->addSourceRef(cd->getStartDefLine(),cd.get(),
nullptr);
8862 const_cast<FileDef*
>(fd)->addSourceRef(cd->getStartDefLine(),cd.get(),
nullptr);
8871 const_cast<FileDef*
>(fd)->addSourceRef(nd->getStartDefLine(),nd.get(),
nullptr);
8878 for (
const auto &md : *mn)
8887 md->isLinkableInProject() &&
8893 const_cast<FileDef*
>(fd)->addSourceRef(md->getStartDefLine(),md->getOuterScope(),md.get());
8899 for (
const auto &md : *mn)
8909 md->isLinkableInProject() &&
8915 const_cast<FileDef*
>(fd)->addSourceRef(md->getStartDefLine(),md->getOuterScope(),md.get());
8932 for (
const auto &def : it->second)
8935 def.fileName,def.lineNr,def.columnNr,
8936 "#define",def.name,def.args,
QCString(),
8941 if (!def.args.isEmpty())
8945 mmd->setInitializer(def.definition);
8946 mmd->setFileDef(def.fileDef);
8947 mmd->setDefinition(
"#define "+def.name);
8952 const MemberList *defMl = def.fileDef->getMemberList(MemberListType::DocDefineMembers());
8961 def.fileDef->insertMember(md.get());
8963 AUTO_TRACE_ADD(
"adding macro {} with definition {}",def.name,def.definition);
8997 for (
const auto &fd : *fn)
8999 fd->sortMemberLists();
9006 gd->sortMemberLists();
9023 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
9027 std::vector < std::future< void > > results;
9031 for (
const auto &def : symList)
9034 if (dm && !
isSymbolHidden(def) && !def->isArtificial() && def->isLinkableInProject())
9036 auto processTooltip = [dm]() {
9039 results.emplace_back(threadPool.
queue(processTooltip));
9044 for (
auto &f : results)
9053 for (
const auto &def : symList)
9056 if (dm && !
isSymbolHidden(def) && !def->isArtificial() && def->isLinkableInProject())
9103 for (
const auto &fd : *fn)
9125 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
9131 : cd(cd_), ol(ol_) {}
9136 std::vector< std::future< std::shared_ptr<DocContext> > > results;
9137 for (
const auto &cd : classList)
9140 if (cd->getOuterScope()==
nullptr ||
9144 auto ctx = std::make_shared<DocContext>(cd,*
g_outputList);
9145 auto processFile = [ctx]()
9147 msg(
"Generating docs for compound {}...\n",ctx->cd->displayName());
9151 if (!ctx->cd->isHidden() && !ctx->cd->isEmbeddedInOuterScope() &&
9152 ctx->cd->isLinkableInProject() && !ctx->cd->isImplicitTemplateInstance())
9154 ctx->cd->writeDocumentation(ctx->ol);
9155 ctx->cd->writeMemberList(ctx->ol);
9159 ctx->cd->writeDocumentationForInnerClasses(ctx->ol);
9162 results.emplace_back(threadPool.
queue(processFile));
9165 for (
auto &f : results)
9172 for (
const auto &cd : classList)
9176 if (cd->getOuterScope()==
nullptr ||
9182 if ( !cd->isHidden() && !cd->isEmbeddedInOuterScope() &&
9183 cd->isLinkableInProject() && !cd->isImplicitTemplateInstance())
9185 msg(
"Generating docs for compound {}...\n",cd->displayName());
9200 for (
const auto &innerCdi : cd->
getClasses())
9205 AUTO_TRACE(
"innerCd={} isLinkable={} isImplicitTemplateInstance={} protectLevelVisible={} embeddedInOuterScope={}",
9214 list.push_back(innerCd);
9222 std::vector<ClassDefMutable*> classList;
9271 for (
const auto &imd : *mn)
9307 for (
const auto &fd : *fn)
9309 fd->combineUsingRelations();
9341 for (
const auto &fd : *fn)
9343 fd->addMembersToMemberGroup();
9358 gd->addMembersToMemberGroup();
9379 for (
const auto &fd : *fn)
9381 fd->distributeMemberGroupDocumentation();
9396 gd->distributeMemberGroupDocumentation();
9426 for (
const auto &fd : *fn)
9428 fd->findSectionsInDocumentation();
9443 gd->findSectionsInDocumentation();
9448 pd->findSectionsInDocumentation();
9453 dd->findSectionsInDocumentation();
9476 for (
const auto &ifmd : *fn)
9490 for (
const auto &imd : *nm)
9521 for (
const auto &imd : *nm)
9541 return fd->absFilePath() == root->
fileName;
9589 mmd->setTagInfo(root->
tagInfo());
9590 mmd->setLanguage(root->
lang);
9602 for (
const auto &md : *mn)
9608 for (
const auto &imd : *mn)
9626 for (
const auto &imd : *mn)
9653 warn(root->
fileName,root->
startLine,
"found documented #define {} but ignoring it because ENABLE_PREPROCESSING is NO.", root->
name);
9667 normalizedName =
substitute(normalizedName,
"\\",
"/");
9670 if (root->
docFile==normalizedName)
9672 int lastSlashPos=normalizedName.
findRev(
'/');
9673 if (lastSlashPos!=-1)
9675 normalizedName=normalizedName.
left(lastSlashPos);
9678 if (normalizedName.
at(normalizedName.
length()-1)!=
'/')
9680 normalizedName+=
'/';
9682 DirDef *matchingDir=
nullptr;
9686 if (dir->name().right(normalizedName.
length())==normalizedName)
9691 "\\dir command matches multiple directories.\n"
9692 " Applying the command for directory {}\n"
9693 " Ignoring the command for directory {}",
9694 matchingDir->
name(),dir->name()
9699 matchingDir=dir.get();
9716 warn(root->
fileName,root->
startLine,
"No matching directory found for command \\dir {}",normalizedName);
9725 if (root->
section.isRequirementDoc())
9737 if (root->
section.isPageDoc())
9744 else if (root->
section.isMainpageDoc())
9764 if (root->
section.isMainpageDoc())
9797 else if (si->
lineNr() != -1)
9799 warn(root->
fileName,root->
startLine,
"multiple use of section label '{}' for main page, (first occurrence: {}, line {})",
9804 warn(root->
fileName,root->
startLine,
"multiple use of section label '{}' for main page, (first occurrence: {})",
9821 else if (root->
tagInfo()==
nullptr)
9824 "found more than one \\mainpage comment block! (first occurrence: {}, line {}), Skipping current block!",
9834 if (root->
section.isMainpageDoc())
9858 term(
"page defined {} with label {} is a direct "
9859 "subpage of itself! Please remove this cyclic dependency.\n",
9883 term(
"page defined {} with label {} is a subpage "
9884 "of itself! Please remove this cyclic dependency.\n",
9885 warn_line(pd->docFile(),pd->docLine()),pd->name());
9911 if (si->label().left(label.
length())==label)
9913 si->setFileName(rl->listName());
9914 si->setGenerated(
TRUE);
9920 if (!si->generated())
9924 if (!si->fileName().isEmpty() &&
9931 if (si->definition())
9938 gd = (
toMemberDef(si->definition()))->getGroupDef();
9968 if (!pd->getGroupDef() && !pd->isReference())
9970 msg(
"Generating docs for page {}...\n",pd->name());
9985 warn(root->
fileName,root->
startLine,
"Example {} was already documented. Ignoring documentation found here.",root->
name);
10013 indentStr.
fill(
' ',indent);
10015 indentStr.
isEmpty()?
"":indentStr,
10020 for (
const auto &e : root->
children())
10038 si->label(),si->fileName(),si->title(),si->type().level(),si->ref());
10052 msg(
"Generating docs for example {}...\n",pd->name());
10054 if (lang != SrcLangExt::Unknown)
10058 intf->resetCodeParserState();
10060 QCString n=pd->getOutputFileBase();
10067 if (pd->showLineNo())
10069 lineNoOptStr=
"{lineno}";
10075 (pd->briefDescription().isEmpty()?
"":pd->briefDescription()+
"\n\n")+
10076 pd->documentation()+
"\n\n\\include"+lineNoOptStr+
" "+pd->name(),
10078 .setIndexWords(
true)
10079 .setExample(pd->name()));
10092 if (!gd->isReference())
10104 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10110 : cdm(cdm_), ol(ol_) {}
10115 std::vector< std::future< std::shared_ptr<DocContext> > > results;
10117 for (
const auto &cd : classList)
10122 auto ctx = std::make_shared<DocContext>(cdm,*
g_outputList);
10123 auto processFile = [ctx]()
10125 if ( ( ctx->cdm->isLinkableInProject() &&
10126 !ctx->cdm->isImplicitTemplateInstance()
10129 && !ctx->cdm->isHidden() && !ctx->cdm->isEmbeddedInOuterScope()
10132 msg(
"Generating docs for compound {}...\n",ctx->cdm->displayName());
10133 ctx->cdm->writeDocumentation(ctx->ol);
10134 ctx->cdm->writeMemberList(ctx->ol);
10136 ctx->cdm->writeDocumentationForInnerClasses(ctx->ol);
10139 results.emplace_back(threadPool.
queue(processFile));
10143 for (
auto &f : results)
10145 auto ctx = f.get();
10151 for (
const auto &cd : classList)
10156 if ( ( cd->isLinkableInProject() &&
10157 !cd->isImplicitTemplateInstance()
10160 && !cd->isHidden() && !cd->isEmbeddedInOuterScope()
10163 msg(
"Generating docs for compound {}...\n",cd->displayName());
10177 for (
const auto &cd : conceptList)
10182 msg(
"Generating docs for concept {}...\n",cd->name());
10197 if (nd->isLinkableInProject())
10202 msg(
"Generating docs for namespace {}\n",nd->displayName());
10240 QCString cmd=qhgLocation+
" -v 2>&1";
10245 err(
"could not execute {}\n",qhgLocation);
10249 const size_t bufSize = 1024;
10250 char inBuf[bufSize+1];
10251 size_t numRead=fread(inBuf,1,bufSize,f);
10252 inBuf[numRead] =
'\0';
10257 static const reg::Ex versionReg(R
"(Qt (\d+)\.(\d+)\.(\d+))");
10259 std::string s = inBuf;
10266 if (qtVersion>0 && (qtVersion<60000 || qtVersion >= 60205))
10275 err(
"could not execute {}\n",qhgLocation);
10279 std::string output;
10280 while ((numRead=fread(inBuf,1,bufSize,f))>0)
10282 inBuf[numRead] =
'\0';
10314 warn_uncond(
"the dot tool could not be found as '{}'\n",dotPath);
10320 size_t l=dotPath.
length();
10321 for (
size_t i=0;i<l;i++)
if (dotPath.
at(i)==
'/') dotPath.
at(i)=
'\\';
10340 bool updateOnly=
FALSE)
10344 bool writeToStdout=configFile==
"-";
10349 if (!writeToStdout)
10353 msg(
"\n\nConfiguration file '{}' created.\n\n",configFile);
10354 msg(
"Now edit the configuration file and enter\n\n");
10355 if (configFile!=
"Doxyfile" && configFile!=
"doxyfile")
10356 msg(
" doxygen {}\n\n",configFile);
10358 msg(
" doxygen\n\n");
10359 msg(
"to generate the documentation for your project\n\n");
10363 msg(
"\n\nConfiguration file '{}' updated.\n\n",configFile);
10369 term(
"Cannot open file {} for writing\n",configFile);
10384 term(
"Cannot open stdout for writing\n");
10395 int eqPos = tagLine.
find(
'=');
10405 fileName = tagLine;
10411 err(
"Tag file '{}' does not exist or is not a file. Skipping it...\n",fileName);
10422 msg(
"Reading tag file '{}', location '{}'...\n",fileName,destName);
10426 msg(
"Reading tag file '{}'...\n",fileName);
10436 for (
const auto &sheet : latexExtraStyleSheet)
10438 std::string fileName = sheet;
10439 if (!fileName.empty())
10444 err(
"Style sheet '{}' specified by LATEX_EXTRA_STYLESHEET does not exist!\n",fileName);
10446 else if (fi.
isDir())
10448 err(
"Style sheet '{}' specified by LATEX_EXTRA_STYLESHEET is a directory, it has to be a file!\n", fileName);
10467 if (!htmlStyleSheet.
isEmpty())
10474 err(
"Style sheet '{}' specified by HTML_STYLESHEET does not exist!\n",htmlStyleSheet);
10477 else if (fi.
isDir())
10479 err(
"Style sheet '{}' specified by HTML_STYLESHEET is a directory, it has to be a file!\n",htmlStyleSheet);
10485 copyFile(htmlStyleSheet,destFileName);
10490 for (
const auto &sheet : htmlExtraStyleSheet)
10498 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET does not exist!\n",fileName);
10502 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET is already a built-in stylesheet. Please use a different name\n",fi.
fileName());
10504 else if (fi.
isDir())
10506 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET is a directory, it has to be a file!\n",fileName);
10525 err(
"Project logo '{}' specified by PROJECT_LOGO does not exist!\n",projectLogo);
10528 else if (fi.
isDir())
10530 err(
"Project logo '{}' specified by PROJECT_LOGO is a directory, it has to be a file!\n",projectLogo);
10536 copyFile(projectLogo,destFileName);
10550 err(
"Project icon '{}' specified by PROJECT_ICON does not exist!\n",projectIcon);
10553 else if (fi.
isDir())
10555 err(
"Project icon '{}' specified by PROJECT_ICON is a directory, it has to be a file!\n",projectIcon);
10561 copyFile(projectIcon,destFileName);
10569 for (
const auto &fileName : files)
10571 if (!fileName.empty())
10576 err(
"Extra file '{}' specified in {} does not exist!\n", fileName,filesOption);
10578 else if (fi.
isDir())
10580 err(
"Extra file '{}' specified in {} is a directory, it has to be a file!\n", fileName,filesOption);
10606 std::vector<FileEntry> fileEntries;
10607 for (
const auto &fd : *fn)
10609 if (!fd->isReference())
10611 fileEntries.emplace_back(fd->getPath(),fd.get());
10615 size_t size = fileEntries.size();
10619 FileDef *fd = fileEntries[0].fileDef;
10625 std::stable_sort(fileEntries.begin(),
10627 [](
const FileEntry &fe1,
const FileEntry &fe2)
10628 { return qstricmp_sort(fe1.path,fe2.path)<0; }
10633 const FileEntry &first = fileEntries[0];
10634 const FileEntry &last = fileEntries[size-1];
10635 int first_path_size =
static_cast<int>(first.path.size())-1;
10636 int last_path_size =
static_cast<int>(last.path.size())-1;
10639 for (i=0;i<first_path_size && i<last_path_size;i++)
10641 if (first.path[i]==
'/') j=i;
10642 if (first.path[i]!=last.path[i])
break;
10644 if (i==first_path_size && i<last_path_size && last.path[i]==
'/')
10649 else if (i==last_path_size && i<first_path_size && first.path[i]==
'/')
10656 for (
auto &fileEntry : fileEntries)
10658 QCString prefix = fileEntry.path.right(fileEntry.path.length()-j-1);
10659 fileEntry.fileDef->setName(
prefix+fn->fileName());
10661 fileEntry.fileDef->setDiskName(
prefix+fn->fileName());
10675 int sep = fileName.
findRev(
'/');
10676 int ei = fileName.
findRev(
'.');
10677 if (ei!=-1 && (sep==-1 || ei>sep))
10683 extension =
".no_extension";
10696 int ei = fileName.
findRev(
'.');
10703 extension =
".no_extension";
10707 std::string preBuf;
10714 for (
const auto &s : includePath)
10720 msg(
"Preprocessing {}...\n",fn);
10727 msg(
"Reading {}...\n",fn);
10732 std::string convBuf;
10733 convBuf.reserve(preBuf.size()+1024);
10738 std::shared_ptr<Entry> fileRoot = std::make_shared<Entry>();
10742 if (newTU) clangParser->
parse();
10745 parser.
parseInput(fileName,convBuf.
data(),fileRoot,clangParser);
10746 fileRoot->setFileDef(fd);
10763 filesToProcess.insert(s);
10766 std::mutex processedFilesLock;
10768 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10769 msg(
"Processing input using {} threads.\n",numThreads);
10771 using FutureType = std::vector< std::shared_ptr<Entry> >;
10772 std::vector< std::future< FutureType > > results;
10775 bool ambig =
false;
10782 auto processFile = [qs,&filesToProcess,&processedFilesLock,&processedFiles]() {
10783 bool ambig_l =
false;
10784 std::vector< std::shared_ptr<Entry> > roots;
10788 auto fileRoot {
parseFile(*parser.get(),fd_l,qs,clangParser.get(),
true) };
10789 roots.push_back(fileRoot);
10793 for (
auto incFile : clangParser->filesInSameTU())
10796 if (filesToProcess.find(incFile)!=filesToProcess.end())
10798 bool needsToBeProcessed =
false;
10800 std::lock_guard<std::mutex> lock(processedFilesLock);
10801 needsToBeProcessed = processedFiles.find(incFile)==processedFiles.end();
10802 if (needsToBeProcessed) processedFiles.insert(incFile);
10804 if (qincFile!=qs && needsToBeProcessed)
10810 fileRoot =
parseFile(*parser.get(),ifd,qincFile,clangParser.get(),
false);
10811 roots.push_back(fileRoot);
10819 results.emplace_back(threadPool.
queue(processFile));
10823 for (
auto &f : results)
10828 root->moveToSubEntryAndKeep(e);
10835 if (processedFiles.find(s)==processedFiles.end())
10838 auto processFile = [s]() {
10839 bool ambig =
false;
10841 std::vector< std::shared_ptr<Entry> > roots;
10848 auto fileRoot =
parseFile(*parser.get(),fd,qs,clangParser.get(),
true);
10849 roots.push_back(fileRoot);
10853 auto fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
10854 roots.push_back(fileRoot);
10858 results.emplace_back(threadPool.
queue(processFile));
10862 for (
auto &f : results)
10867 root->moveToSubEntryAndKeep(e);
10874 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10875 msg(
"Processing input using {} threads.\n",numThreads);
10877 using FutureType = std::shared_ptr<Entry>;
10878 std::vector< std::future< FutureType > > results;
10882 auto processFile = [s]() {
10883 bool ambig =
false;
10887 auto fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
10891 results.emplace_back(threadPool.
queue(processFile));
10894 for (
auto &f : results)
10896 root->moveToSubEntryAndKeep(f.get());
10914 filesToProcess.insert(s);
10920 bool ambig =
false;
10928 auto fileRoot =
parseFile(*parser.get(),fd,qs,clangParser.get(),
true);
10929 root->moveToSubEntryAndKeep(fileRoot);
10930 processedFiles.insert(s);
10934 for (
auto incFile : clangParser->filesInSameTU())
10937 if (filesToProcess.find(incFile)!=filesToProcess.end() &&
10938 processedFiles.find(incFile)==processedFiles.end())
10944 fileRoot =
parseFile(*parser.get(),ifd,incFile,clangParser.get(),
false);
10945 root->moveToSubEntryAndKeep(fileRoot);
10946 processedFiles.insert(incFile);
10955 if (processedFiles.find(s)==processedFiles.end())
10957 bool ambig =
false;
10964 auto fileRoot =
parseFile(*parser.get(),fd,qs,clangParser.get(),
true);
10965 root->moveToSubEntryAndKeep(fileRoot);
10970 std::shared_ptr<Entry> fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
10971 root->moveToSubEntryAndKeep(fileRoot);
10973 processedFiles.insert(s);
10982 bool ambig =
false;
10987 std::shared_ptr<Entry> fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
10988 root->moveToSubEntryAndKeep(std::move(fileRoot));
11008 sepPos = result.
find(
'/',2);
11010 sepPos = result.
find(
'/',sepPos+1);
11012 sepPos = result.
find(
'/',sepPos+1);
11015 if (nonSymlinks.find(
prefix.str())==nonSymlinks.end())
11032 target+=result.
mid(sepPos);
11035 if (known.find(result.
str())!=known.end())
return std::string();
11036 known.insert(result.
str());
11049 nonSymlinks.insert(
prefix.str());
11055 while (sepPos!=-1);
11074 bool errorIfNotExist,
11081 if (paths && !dirName.empty())
11083 paths->insert(dirName);
11089 if (dirName.empty())
11104 msg(
"Searching for files in directory {}\n", fi->
absFilePath());
11109 for (
const auto &dirEntry : dir.
iterator())
11112 auto checkPatterns = [&]() ->
bool
11114 return (patList==
nullptr ||
patternMatch(cfi,*patList)) &&
11115 (exclPatList==
nullptr || !
patternMatch(cfi,*exclPatList)) &&
11116 (killSet==
nullptr || killSet->find(cfi.
absFilePath())==killSet->end());
11119 if (exclSet==
nullptr || exclSet->find(cfi.
absFilePath())==exclSet->end())
11127 if (errorIfNotExist && checkPatterns())
11132 else if (cfi.
isFile() && checkPatterns())
11135 std::string path=cfi.
dirPath()+
"/";
11136 std::string fullName=path+name;
11143 fn = fnMap->
add(name,fullName);
11144 fn->push_back(std::move(fd));
11147 dirResultList.push_back(fullName);
11148 if (resultSet) resultSet->insert(fullName);
11149 if (killSet) killSet->insert(fullName);
11151 else if (recursive &&
11153 (exclPatList==
nullptr || !
patternMatch(cfi,*exclPatList)) &&
11158 patList,exclPatList,&dirResultList,resultSet,errorIfNotExist,
11159 recursive,killSet,paths);
11163 if (resultList && !dirResultList.empty())
11166 std::stable_sort(dirResultList.begin(),
11167 dirResultList.end(),
11168 [](
const auto &f1,
const auto &f2) { return qstricmp_sort(f1.c_str(),f2.c_str())<0; });
11171 resultList->insert(resultList->end(), dirResultList.begin(), dirResultList.end());
11188 bool errorIfNotExist,
11202 if (exclSet==
nullptr || exclSet->find(fi.
absFilePath())==exclSet->end())
11209 if (errorIfNotExist)
11211 warn_uncond(
"source '{}' is not a readable file or directory... skipping.\n",s);
11216 std::string dirPath = fi.
dirPath(
true);
11218 if (paths && !dirPath.empty())
11220 paths->insert(dirPath);
11223 if (killSet==
nullptr || killSet->find(filePath)==killSet->end())
11232 fn->push_back(std::move(fd));
11235 if (resultList || resultSet)
11237 if (resultList) resultList->push_back(filePath);
11238 if (resultSet) resultSet->insert(filePath);
11244 else if (fi.
isDir())
11246 readDir(&fi,fnMap,exclSet,patList,
11247 exclPatList,resultList,resultSet,errorIfNotExist,
11248 recursive,killSet,paths);
11262 anchor=
":"+md->
anchor();
11271 t <<
"REPLACE INTO symbols (symbol_id,scope_id,name,file,line) VALUES('"
11272 << fn+anchor <<
"','"
11274 << d->
name() <<
"','"
11288 for (
const auto &def : symList)
11300 msg(
"Developer parameters:\n");
11301 msg(
" -m dump symbol map\n");
11302 msg(
" -b making messages output unbuffered\n");
11303 msg(
" -c <file> process input file as a comment block and produce HTML output\n");
11305 msg(
" -t [<file|stdout|stderr>] trace debug info to file, stdout, or stderr (default file stdout)\n");
11306 msg(
" -t_time [<file|stdout|stderr>] trace debug info to file, stdout, or stderr (default file stdout),\n"
11307 " and include time and thread information\n");
11309 msg(
" -d <level> enable a debug level, such as (multiple invocations of -d are possible):\n");
11320 QCString versionString = getFullVersion();
11321 msg(
"{}\n",versionString);
11325 if (!extVers.
isEmpty()) extVers+=
", ";
11326 extVers +=
"sqlite3 ";
11327 extVers += sqlite3_libversion();
11329 if (!extVers.
isEmpty()) extVers+=
", ";
11330 extVers +=
"clang support ";
11331 extVers += CLANG_VERSION_STRING;
11335 int lastComma = extVers.
findRev(
',');
11336 if (lastComma != -1) extVers = extVers.
replace(lastComma,1,
" and");
11337 msg(
" with {}.\n",extVers);
11348 msg(
"Doxygen version {0}\nCopyright Dimitri van Heesch 1997-2025\n\n"
11349 "You can use Doxygen in a number of ways:\n\n"
11350 "1) Use Doxygen to generate a template configuration file*:\n"
11351 " {1} [-s] -g [configName]\n\n"
11352 "2) Use Doxygen to update an old configuration file*:\n"
11353 " {1} [-s] -u [configName]\n\n"
11354 "3) Use Doxygen to generate documentation using an existing "
11355 "configuration file*:\n"
11356 " {1} [configName]\n\n"
11357 "4) Use Doxygen to generate a template file controlling the layout of the\n"
11358 " generated documentation:\n"
11359 " {1} -l [layoutFileName]\n\n"
11360 " In case layoutFileName is omitted DoxygenLayout.xml will be used as filename.\n"
11361 " If - is used for layoutFileName Doxygen will write to standard output.\n\n"
11362 "5) Use Doxygen to generate a template style sheet file for RTF, HTML or Latex.\n"
11363 " RTF: {1} -w rtf styleSheetFile\n"
11364 " HTML: {1} -w html headerFile footerFile styleSheetFile [configFile]\n"
11365 " LaTeX: {1} -w latex headerFile footerFile styleSheetFile [configFile]\n\n"
11366 "6) Use Doxygen to generate a rtf extensions file\n"
11367 " {1} -e rtf extensionsFile\n\n"
11368 " If - is used for extensionsFile Doxygen will write to standard output.\n\n"
11369 "7) Use Doxygen to compare the used configuration file with the template configuration file\n"
11370 " {1} -x [configFile]\n\n"
11371 " Use Doxygen to compare the used configuration file with the template configuration file\n"
11372 " without replacing the environment variables or CMake type replacement variables\n"
11373 " {1} -x_noenv [configFile]\n\n"
11374 "8) Use Doxygen to show a list of built-in emojis.\n"
11375 " {1} -f emoji outputFileName\n\n"
11376 " If - is used for outputFileName Doxygen will write to standard output.\n\n"
11377 "*) If -s is specified the comments of the configuration items in the config file will be omitted.\n"
11378 " If configName is omitted 'Doxyfile' will be used as a default.\n"
11379 " If - is used for configFile Doxygen will write / read the configuration to /from standard output / input.\n\n"
11380 "If -q is used for a Doxygen documentation run, Doxygen will see this as if QUIET=YES has been set.\n\n"
11381 "-v print version string, -V print extended version information\n"
11382 "-h,-? prints usage help information\n"
11383 "{1} -d prints additional usage flags for debugging purposes\n",versionString,name);
11390static const char *
getArg(
int argc,
char **argv,
int &optInd)
11393 if (
qstrlen(&argv[optInd][2])>0)
11394 s=&argv[optInd][2];
11395 else if (optInd+1<argc && argv[optInd+1][0]!=
'-')
11414 return []() {
return std::make_unique<T>(); };
11422 std::setlocale(LC_ALL,
"");
11423 std::setlocale(LC_CTYPE,
"C");
11424 std::setlocale(LC_NUMERIC,
"C");
11522 QCString versionString = getFullVersion();
11525 auto writeFile = [](
const char *fileName,std::function<void(
TextStream&)> func) ->
bool
11545 bool genConfig=
false;
11546 bool shortList=
false;
11547 bool traceTiming=
false;
11549 bool updateConfig=
false;
11550 bool quiet =
false;
11551 while (optInd<argc && argv[optInd][0]==
'-' &&
11552 (isalpha(argv[optInd][1]) || argv[optInd][1]==
'?' ||
11553 argv[optInd][1]==
'-')
11556 switch(argv[optInd][1])
11566 if (optInd+1>=argc)
11568 layoutName=
"DoxygenLayout.xml";
11572 layoutName=argv[optInd+1];
11580 if (optInd+1>=argc)
11582 msg(
"option \"-c\" is missing the file name to read\n");
11607 msg(
"option \"-d\" has unknown debug specifier: \"{}\".\n",debugLabel);
11617 if (!strcmp(argv[optInd]+1,
"t_time"))
11619 traceTiming =
true;
11621 else if (!strcmp(argv[optInd]+1,
"t"))
11623 traceTiming =
false;
11627 err(
"option should be \"-t\" or \"-t_time\", found: \"{}\".\n",argv[optInd]);
11631 if (optInd+1>=argc || argv[optInd+1][0] ==
'-')
11633 traceName=
"stdout";
11637 traceName=argv[optInd+1];
11641 err(
"support for option \"-t\" has not been compiled in (use a debug build or a release build with tracing enabled).\n");
11652 err(
"option should be \"-x\" or \"-x_noenv\", found: \"{}\".\n",argv[optInd]);
11668 err(
"option \"-e\" is missing format specifier rtf.\n");
11674 if (optInd+1>=argc)
11676 err(
"option \"-e rtf\" is missing an extensions file name\n");
11684 err(
"option \"-e\" has invalid format specifier.\n");
11694 err(
"option \"-f\" is missing list specifier.\n");
11700 if (optInd+1>=argc)
11702 err(
"option \"-f emoji\" is missing an output file name\n");
11710 err(
"option \"-f\" has invalid list specifier.\n");
11720 err(
"option \"-w\" is missing format specifier rtf, html or latex\n");
11726 if (optInd+1>=argc)
11728 err(
"option \"-w rtf\" is missing a style sheet file name\n");
11734 err(
"error opening RTF style sheet file {}!\n",argv[optInd+1]);
11744 if (optInd+4<argc ||
FileInfo(
"Doxyfile").exists() ||
FileInfo(
"doxyfile").exists())
11750 err(
"error opening or reading configuration file {}!\n",argv[optInd+4]);
11755 if (optInd+3>=argc)
11757 err(
"option \"-w html\" does not have enough arguments\n");
11774 if (optInd+4<argc ||
FileInfo(
"Doxyfile").exists() ||
FileInfo(
"doxyfile").exists())
11779 err(
"error opening or reading configuration file {}!\n",argv[optInd+4]);
11784 if (optInd+3>=argc)
11786 err(
"option \"-w latex\" does not have enough arguments\n");
11802 err(
"Illegal format specifier \"{}\": should be one of rtf, html or latex\n",formatName);
11822 if (
qstrcmp(&argv[optInd][2],
"help")==0)
11824 usage(argv[0],versionString);
11827 else if (
qstrcmp(&argv[optInd][2],
"version")==0)
11833 else if ((
qstrcmp(&argv[optInd][2],
"Version")==0) ||
11834 (
qstrcmp(&argv[optInd][2],
"VERSION")==0))
11842 err(
"Unknown option \"-{}\"\n",&argv[optInd][1]);
11843 usage(argv[0],versionString);
11848 setvbuf(stdout,
nullptr,_IONBF,0);
11855 usage(argv[0],versionString);
11859 err(
"Unknown option \"-{:c}\"\n",argv[optInd][1]);
11860 usage(argv[0],versionString);
11871 TRACE(
"Doxygen version used: {}",getFullVersion());
11874 FileInfo configFileInfo1(
"Doxyfile"),configFileInfo2(
"doxyfile");
11877 if (configFileInfo1.exists())
11879 configName=
"Doxyfile";
11881 else if (configFileInfo2.
exists())
11883 configName=
"doxyfile";
11885 else if (genConfig)
11887 configName=
"Doxyfile";
11891 err(
"Doxyfile not found and no input file specified!\n");
11892 usage(argv[0],versionString);
11899 if (fi.
exists() ||
qstrcmp(argv[optInd],
"-")==0 || genConfig)
11901 configName=argv[optInd];
11905 err(
"configuration file {} not found!\n",argv[optInd]);
11906 usage(argv[0],versionString);
11920 err(
"could not open or read configuration file {}!\n",configName);
11992 for (
const auto &mapping : extMaps)
11995 int i=mapStr.
find(
'=');
12011 err(
"Failed to map file extension '{}' to unsupported language '{}'.\n"
12012 "Check the EXTENSION_MAPPING setting in the config file.\n",
12017 msg(
"Adding custom extension mapping: '{}' will be treated as language '{}'\n",
12026 if (cd==
reinterpret_cast<void *
>(-1))
12028 term(
"unsupported character conversion: '{}'->'UTF-8': {}\n"
12029 "Check the 'INPUT_ENCODING' setting in the config file!\n",
12039 for (
const auto &mapping : fileEncod)
12042 int i=mapStr.
find(
'=');
12056 if (cd==
reinterpret_cast<void *
>(-1))
12058 term(
"unsupported character conversion: '{}'->'UTF-8': {}\n"
12059 "Check the 'INPUT_FILE_ENCODING' setting in the config file!\n",
12060 encoding,strerror(errno));
12073 for (
const auto &s : expandAsDefinedList)
12091 signal(SIGINT,SIG_DFL);
12093 msg(
"Cleaning up...\n");
12108 if (generateTagFile.
isEmpty())
return;
12113 err(
"cannot open tag file {} for writing\n", generateTagFile);
12117 tagFile <<
"<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>\n";
12118 tagFile <<
"<tagfile doxygen_version=\"" << getDoxygenVersion() <<
"\"";
12119 std::string gitVersion = getGitVersion();
12120 if (!gitVersion.empty())
12122 tagFile <<
" doxygen_gitid=\"" << gitVersion <<
"\"";
12129 for (
const auto &fd : *fn)
12131 if (fd->isLinkableInProject()) fd->writeTagFile(tagFile);
12164 if (gd->isLinkableInProject()) gd->writeTagFile(tagFile);
12169 if (mod->isLinkableInProject()) mod->writeTagFile(tagFile);
12174 if (pd->isLinkableInProject()) pd->writeTagFile(tagFile);
12181 if (dd->isLinkableInProject()) dd->writeTagFile(tagFile);
12185 tagFile <<
"</tagfile>\n";
12193 msg(
"Exiting...\n");
12203 const char *defaultDirName)
12208 result = baseDirName + defaultDirName;
12210 else if (formatDirName[0]!=
'/' && (formatDirName.
length()==1 || formatDirName[1]!=
':'))
12212 result.
prepend(baseDirName+
"/");
12214 Dir formatDir(result.
str());
12217 term(
"Could not create output directory {}\n", result);
12231 g_s.begin(
"Searching for include files...\n");
12234 for (
const auto &s : includePathList)
12252 g_s.begin(
"Searching for example files...\n");
12255 for (
const auto &s : examplePathList)
12270 g_s.begin(
"Searching for images...\n");
12273 for (
const auto &s : imagePathList)
12288 g_s.begin(
"Searching for dot files...\n");
12291 for (
const auto &s : dotFileList)
12306 g_s.begin(
"Searching for msc files...\n");
12309 for (
const auto &s : mscFileList)
12324 g_s.begin(
"Searching for dia files...\n");
12327 for (
const auto &s : diaFileList)
12342 g_s.begin(
"Searching for plantuml files...\n");
12345 for (
const auto &s : plantUmlFileList)
12360 g_s.begin(
"Searching for mermaid files...\n");
12363 for (
const auto &s : mermaidFileList)
12378 g_s.begin(
"Searching for files to exclude\n");
12380 for (
const auto &s : excludeList)
12398 g_s.begin(
"Searching INPUT for files to process...\n");
12402 for (
const auto &s : inputList)
12405 size_t l = path.
length();
12409 if (path.
at(l-1)==
'\\' || path.
at(l-1)==
'/') path=path.
left(l-1);
12429 [](
const auto &f1,
const auto &f2)
12435 if (fileName->size()>1)
12437 std::stable_sort(fileName->begin(),fileName->end(),[](
const auto &f1,
const auto &f2)
12439 return qstricmp_sort(f1->absFilePath(),f2->absFilePath())<0;
12445 warn_uncond(
"No files to be processed, please check your settings, in particular INPUT, FILE_PATTERNS, and RECURSIVE\n");
12456 if (mdfileAsMainPage.
isEmpty())
return;
12460 warn_uncond(
"Specified markdown mainpage '{}' does not exist\n",mdfileAsMainPage);
12463 bool ambig =
false;
12466 warn_uncond(
"Specified markdown mainpage '{}' has not been defined as input file\n",mdfileAsMainPage);
12485 QCString versionString = getFullVersion();
12486 msg(
"Doxygen version used: {}\n",versionString);
12496 if (outputDirectory.
isEmpty())
12502 Dir dir(outputDirectory.
str());
12506 if (!dir.
mkdir(outputDirectory.
str()))
12508 term(
"tag OUTPUT_DIRECTORY: Output directory '{}' does not "
12509 "exist and cannot be created\n",outputDirectory);
12513 msg(
"Notice: Output directory '{}' does not exist. "
12514 "I have created it for you.\n", outputDirectory);
12562 bool generateSitemap = !sitemapUrl.
isEmpty();
12563 if (generateSitemap && !sitemapUrl.
endsWith(
"/"))
12570 bool generateEclipseHelp =
Config_getBool(GENERATE_ECLIPSEHELP);
12584 if (generateDocbook)
12631 newFontPath+=curFontPath;
12647 bool defaultLayoutUsed =
FALSE;
12648 if (layoutFileName.
isEmpty())
12651 defaultLayoutUsed =
TRUE;
12653 AUTO_TRACE_ADD(
"defaultLayoutUsed={}, layoutFileName={}",defaultLayoutUsed,layoutFileName);
12658 msg(
"Parsing layout file {}...\n",layoutFileName);
12661 else if (!defaultLayoutUsed)
12663 warn_uncond(
"failed to open layout file '{}' for reading! Using default settings.\n",layoutFileName);
12673 if (generateHtml) exclPatterns.push_back(htmlOutput.
str());
12674 if (generateDocbook) exclPatterns.push_back(docbookOutput.
str());
12675 if (generateXml) exclPatterns.push_back(xmlOutput.
str());
12676 if (generateLatex) exclPatterns.push_back(latexOutput.
str());
12677 if (generateRtf) exclPatterns.push_back(rtfOutput.
str());
12678 if (generateMan) exclPatterns.push_back(manOutput.
str());
12698 if (generateDocbook)
12709 std::shared_ptr<Entry> root = std::make_shared<Entry>();
12713 msg(
"Reading and parsing tag files\n");
12715 for (
const auto &s : tagFileList)
12727 g_s.begin(
"Parsing files\n");
12767 g_s.begin(
"Building macro definition list...\n");
12771 g_s.begin(
"Building group list...\n");
12776 g_s.begin(
"Building directory list...\n");
12781 g_s.begin(
"Building namespace list...\n");
12786 g_s.begin(
"Building file list...\n");
12790 g_s.begin(
"Building class list...\n");
12794 g_s.begin(
"Building concept list...\n");
12802 g_s.begin(
"Computing nesting relations for classes...\n");
12815 g_s.begin(
"Associating documentation with classes...\n");
12819 g_s.begin(
"Associating documentation with concepts...\n");
12824 g_s.begin(
"Associating documentation with modules...\n");
12828 g_s.begin(
"Building example list...\n");
12832 g_s.begin(
"Searching for enumerations...\n");
12840 g_s.begin(
"Searching for documented typedefs...\n");
12846 g_s.begin(
"Searching for documented sequences...\n");
12850 g_s.begin(
"Searching for documented dictionaries...\n");
12855 g_s.begin(
"Searching for members imported via using declarations...\n");
12862 g_s.begin(
"Searching for included using directives...\n");
12866 g_s.begin(
"Searching for documented variables...\n");
12870 g_s.begin(
"Building interface member list...\n");
12873 g_s.begin(
"Building member list...\n");
12877 g_s.begin(
"Searching for friends...\n");
12881 g_s.begin(
"Searching for documented defines...\n");
12885 g_s.begin(
"Computing class inheritance relations...\n");
12890 g_s.begin(
"Computing class usage relations...\n");
12896 g_s.begin(
"Searching for tag less structs...\n");
12901 g_s.begin(
"Flushing cached template relations that have become invalid...\n");
12905 g_s.begin(
"Warn for undocumented namespaces...\n");
12909 g_s.begin(
"Computing class relations...\n");
12920 g_s.begin(
"Add enum values to enums...\n");
12925 g_s.begin(
"Searching for member function documentation...\n");
12937 g_s.begin(
"Creating members for template instances...\n");
12941 g_s.begin(
"Building page list...\n");
12945 g_s.begin(
"Building requirements list...\n");
12949 g_s.begin(
"Search for main page...\n");
12954 g_s.begin(
"Computing page relations...\n");
12959 g_s.begin(
"Determining the scope of groups...\n");
12963 g_s.begin(
"Computing module relations...\n");
12965 mm.resolvePartitions();
12966 mm.resolveImports();
12967 mm.collectExportedSymbols();
12986 return i==0 ?
qstricmp_sort(c1->name(), c2->name())<0 : i<0;
13000 g_s.begin(
"Sorting lists...\n");
13021 g_s.begin(
"Determining which enums are documented\n");
13025 g_s.begin(
"Computing member relations...\n");
13030 g_s.begin(
"Building full member lists recursively...\n");
13034 g_s.begin(
"Adding members to member groups.\n");
13040 g_s.begin(
"Distributing member group documentation.\n");
13045 g_s.begin(
"Computing member references...\n");
13051 g_s.begin(
"Inheriting documentation...\n");
13059 g_s.begin(
"Generating disk names...\n");
13063 g_s.begin(
"Adding source references...\n");
13067 g_s.begin(
"Adding xrefitems...\n");
13072 g_s.begin(
"Adding requirements...\n");
13077 g_s.begin(
"Sorting member lists...\n");
13081 g_s.begin(
"Setting anonymous enum type...\n");
13085 g_s.begin(
"Computing dependencies between directories...\n");
13089 g_s.begin(
"Generating citations page...\n");
13093 g_s.begin(
"Counting members...\n");
13097 g_s.begin(
"Counting data structures...\n");
13101 g_s.begin(
"Resolving user defined references...\n");
13105 g_s.begin(
"Finding anchors and sections in the documentation...\n");
13109 g_s.begin(
"Transferring function references...\n");
13113 g_s.begin(
"Combining using relations...\n");
13118 g_s.begin(
"Adding members to index pages...\n");
13123 g_s.begin(
"Correcting members for VHDL...\n");
13127 g_s.begin(
"Computing tooltip texts...\n");
13135 [](
const auto &g1,
const auto &g2)
13136 {
return g1->groupTitle() < g2->groupTitle(); });
13140 gd->sortSubGroups();
13184 if (generateDocbook)
13204 err(
"USE_HTAGS is YES but htags(1) failed. \n");
13206 err(
"htags(1) ended normally but failed to load the filemap. \n");
13213 g_s.begin(
"Generating style sheet...\n");
13221 g_s.begin(
"Generating search indices...\n");
13222 if (searchEngine && !serverBasedSearch && generateHtml)
13230 if (generateHtml && searchEngine)
13233 Dir searchDir(searchDirName.
str());
13234 if (!searchDir.
exists() && !searchDir.
mkdir(searchDirName.
str()))
13236 term(
"Could not create search results directory '{}' $PWD='{}'\n",
13240 if (!serverBasedSearch)
13262 if (generateDocbook)
13278 g_s.begin(
"Generating images for formulas in HTML...\n");
13285 g_s.begin(
"Generating images for formulas in RTF...\n");
13292 g_s.begin(
"Generating images for formulas in Docbook...\n");
13297 g_s.begin(
"Generating example documentation...\n");
13301 g_s.begin(
"Generating file sources...\n");
13305 g_s.begin(
"Generating file documentation...\n");
13309 g_s.begin(
"Generating page documentation...\n");
13313 g_s.begin(
"Generating group documentation...\n");
13317 g_s.begin(
"Generating class documentation...\n");
13321 g_s.begin(
"Generating concept documentation...\n");
13325 g_s.begin(
"Generating module documentation...\n");
13329 g_s.begin(
"Generating namespace documentation...\n");
13335 g_s.begin(
"Generating graph info page...\n");
13340 g_s.begin(
"Generating directory documentation...\n");
13349 g_s.begin(
"finalizing index lists...\n");
13353 g_s.begin(
"writing tag file...\n");
13359 g_s.begin(
"Generating XML output...\n");
13367 g_s.begin(
"Generating SQLITE3 output...\n");
13374 g_s.begin(
"Generating AutoGen DEF output...\n");
13380 g_s.begin(
"Generating Perl module output...\n");
13384 if (generateHtml && searchEngine && serverBasedSearch)
13386 g_s.begin(
"Generating search index\n");
13396 if (searchDataFile.
isEmpty())
13398 searchDataFile=
"searchdata.xml";
13411 g_s.begin(
"Combining RTF output...\n");
13414 err(
"An error occurred during post-processing the RTF files!\n");
13419 g_s.begin(
"Running plantuml with JAVA...\n");
13423 g_s.begin(
"Running mermaid (mmdc)...\n");
13429 g_s.begin(
"Running dot...\n");
13434 if (generateHtml &&
13438 g_s.begin(
"Running html help compiler...\n");
13443 if ( generateHtml &&
13447 g_s.begin(
"Running qhelpgenerator...\n");
13460 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
13461 if (numThreads<1) numThreads=1;
13462 msg(
"Total elapsed time: {:.6f} seconds\n(of which an average of {:.6f} seconds per thread waiting for external tools to finish)\n",
13469 msg(
"finished...\n");
13474 msg(
"finished...\n");
std::vector< ArgumentList > ArgumentLists
This class represents an function or template argument list.
RefQualifierType refQualifier() const
bool noParameters() const
bool pureSpecifier() const
void setTrailingReturnType(const QCString &s)
bool hasParameters() const
QCString trailingReturnType() const
void setPureSpecifier(bool b)
bool constSpecifier() const
void push_back(const Argument &a)
void setConstSpecifier(bool b)
void setRefQualifier(RefQualifierType t)
void setIsDeleted(bool b)
bool volatileSpecifier() const
void setNoParameters(bool b)
void setVolatileSpecifier(bool b)
static CitationManager & instance()
void clear()
clears the database
void generatePage()
Generate the citations page.
std::unique_ptr< ClangTUParser > createTUParser(const FileDef *fd) const
static ClangParser * instance()
Returns the one and only instance of the class.
Clang parser object for a single translation unit, which consists of a source file and the directly o...
void switchToFile(const FileDef *fd)
Switches to another file within the translation unit started with start().
void parse()
Parse the file given at construction time as a translation unit This file should already be preproces...
A abstract class representing of a compound symbol.
virtual const ArgumentList & templateArguments() const =0
Returns the template arguments of this class.
virtual QCString compoundTypeString() const =0
Returns the type of compound as a string.
virtual void writeDocumentation(OutputList &ol) const =0
virtual void writeMemberList(OutputList &ol) const =0
virtual bool isTemplate() const =0
Returns TRUE if this class is a template.
virtual const BaseClassList & baseClasses() const =0
Returns the list of base classes from which this class directly inherits.
virtual const MemberDef * getMemberByName(const QCString &) const =0
Returns the member with the given name.
virtual const TemplateInstanceList & getTemplateInstances() const =0
Returns a sorted dictionary with all template instances found for this template class.
virtual int isBaseClass(const ClassDef *bcd, bool followInstances, const QCString &templSpec=QCString()) const =0
Returns TRUE iff bcd is a direct or indirect base class of this class.
virtual ArgumentLists getTemplateParameterLists() const =0
Returns the template parameter lists that form the template declaration of this class.
virtual Protection protection() const =0
Return the protection level (Public,Protected,Private) in which this compound was found.
virtual MemberList * getMemberList(MemberListType lt) const =0
Returns the members in the list identified by lt.
virtual bool isForwardDeclared() const =0
Returns TRUE if this class represents a forward declaration of a template class.
virtual bool isSubClass(ClassDef *bcd, int level=0) const =0
Returns TRUE iff bcd is a direct or indirect sub class of this class.
virtual void moveTo(Definition *)=0
virtual const TemplateNameMap & getTemplateBaseClassNames() const =0
virtual bool isEmbeddedInOuterScope() const =0
virtual const MemberNameInfoLinkedMap & memberNameInfoLinkedMap() const =0
Returns a dictionary of all members.
virtual bool isImplicitTemplateInstance() const =0
virtual QCString qualifiedNameWithTemplateParameters(const ArgumentLists *actualParams=nullptr, uint32_t *actualParamIndex=nullptr) const =0
virtual std::unique_ptr< ClassDef > deepCopy(const QCString &name) const =0
virtual const ClassDef * templateMaster() const =0
Returns the template master of which this class is an instance.
CompoundType
The various compound types.
virtual CompoundType compoundType() const =0
Returns the type of compound this is, i.e.
virtual bool containsOverload(const MemberDef *md) const =0
virtual ClassLinkedRefMap getClasses() const =0
returns the classes nested into this class
virtual FileDef * getFileDef() const =0
Returns the namespace this compound is in, or 0 if it has a global scope.
virtual QCString requiresClause() const =0
virtual void writeTagFile(TextStream &) const =0
virtual void writeDocumentationForInnerClasses(OutputList &ol) const =0
virtual void computeAnchors()=0
virtual void addTypeConstraints()=0
virtual void overrideCollaborationGraph(bool e)=0
virtual void setClassName(const QCString &name)=0
virtual void countMembers()=0
virtual void addMembersToMemberGroup()=0
virtual void makeTemplateArgument(bool b=TRUE)=0
virtual void setPrimaryConstructorParams(const ArgumentList &list)=0
virtual void setTemplateBaseClassNames(const TemplateNameMap &templateNames)=0
virtual void insertExplicitTemplateInstance(ClassDef *instance, const QCString &spec)=0
virtual void setMetaData(const QCString &md)=0
virtual void setFileDef(FileDef *fd)=0
virtual void addUsedClass(ClassDef *cd, const QCString &accessName, Protection prot)=0
virtual void reclassifyMember(MemberDefMutable *md, MemberType t)=0
virtual ClassDef * insertTemplateInstance(const QCString &fileName, int startLine, int startColumn, const QCString &templSpec, bool &freshInstance)=0
virtual void insertBaseClass(ClassDef *, const QCString &name, Protection p, Specifier s, const QCString &t=QCString())=0
virtual void setTemplateArguments(const ArgumentList &al)=0
virtual void setTemplateMaster(const ClassDef *tm)=0
virtual void mergeCategory(ClassDef *category)=0
virtual void addQualifiers(const StringVector &qualifiers)=0
virtual void setClassSpecifier(TypeSpecifier spec)=0
virtual void insertSubClass(ClassDef *, Protection p, Specifier s, const QCString &t=QCString())=0
virtual void insertUsedFile(const FileDef *)=0
virtual void setRequiresClause(const QCString &req)=0
virtual void setTagLessReference(const ClassDef *cd)=0
virtual void setUsedOnly(bool b)=0
virtual void sortMemberLists()=0
virtual void setProtection(Protection p)=0
virtual void setTypeConstraints(const ArgumentList &al)=0
virtual void overrideInheritanceGraph(CLASS_GRAPH_t e)=0
virtual void setAnonymousEnumType()=0
virtual void setCompoundType(CompoundType t)=0
virtual void distributeMemberGroupDocumentation()=0
virtual void findSectionsInDocumentation()=0
virtual void addUsedByClass(ClassDef *cd, const QCString &accessName, Protection prot)=0
virtual void insertMember(MemberDef *)=0
virtual void sortAllMembersList()=0
virtual void addMembersToTemplateInstance(const ClassDef *cd, const ArgumentList &templateArguments, const QCString &templSpec)=0
virtual void mergeMembers()=0
virtual void setIsStatic(bool b)=0
virtual void setSubGrouping(bool enabled)=0
virtual void addCodePart(const QCString &code, int lineNr, int colNr)=0
virtual void setFileDef(FileDef *fd)=0
virtual void writeTagFile(TextStream &)=0
virtual void setInitializer(const QCString &init)=0
virtual void addDocPart(const QCString &doc, int lineNr, int colNr)=0
virtual void writeDocumentation(OutputList &ol)=0
virtual void setGroupId(int id)=0
virtual void findSectionsInDocumentation()=0
virtual void setTemplateArguments(const ArgumentList &al)=0
static void clearFlag(const DebugMask mask)
static bool isFlagSet(const DebugMask mask)
static void print(DebugMask mask, int prio, fmt::format_string< Args... > fmt, Args &&... args)
static double elapsedTime()
static bool setFlagStr(const QCString &label)
static void setFlag(const DebugMask mask)
The common base class of all entity definitions found in the sources.
virtual QCString docFile() const =0
virtual const QCString & localName() const =0
virtual int getEndBodyLine() const =0
virtual SrcLangExt getLanguage() const =0
Returns the programming language this definition was written in.
virtual int docLine() const =0
virtual QCString getDefFileName() const =0
virtual bool isLinkable() const =0
virtual int getDefLine() const =0
virtual DefType definitionType() const =0
virtual QCString anchor() const =0
virtual int inbodyLine() const =0
virtual const FileDef * getBodyDef() const =0
virtual int briefLine() const =0
virtual bool hasDocumentation() const =0
virtual bool isLinkableInProject() const =0
virtual QCString briefDescription(bool abbreviate=FALSE) const =0
virtual bool isAnonymous() const =0
virtual bool isHidden() const =0
virtual const Definition * findInnerCompound(const QCString &name) const =0
virtual int getStartDefLine() const =0
virtual const GroupList & partOfGroups() const =0
virtual QCString documentation() const =0
virtual QCString qualifiedName() const =0
virtual QCString displayName(bool includeScope=TRUE) const =0
virtual bool isArtificial() const =0
virtual QCString briefFile() const =0
virtual QCString getOutputFileBase() const =0
virtual Definition * getOuterScope() const =0
virtual int getStartBodyLine() const =0
virtual int getDefColumn() const =0
virtual bool isReference() const =0
virtual QCString inbodyDocumentation() const =0
virtual QCString inbodyFile() const =0
virtual const QCString & name() const =0
virtual void mergeReferencedBy(const Definition *other)=0
virtual void setExported(bool b)=0
virtual void setBodySegment(int defLine, int bls, int ble)=0
virtual void setName(const QCString &name)=0
virtual void setHidden(bool b)=0
virtual void mergeReferences(const Definition *other)=0
virtual void setDocumentation(const QCString &d, const QCString &docFile, int docLine, bool stripWhiteSpace=TRUE)=0
virtual void setDefFile(const QCString &df, int defLine, int defColumn)=0
virtual void addInnerCompound(Definition *d)=0
virtual void addSectionsToDefinition(const std::vector< const SectionInfo * > &anchorList)=0
virtual void setInbodyDocumentation(const QCString &d, const QCString &docFile, int docLine)=0
virtual void setLanguage(SrcLangExt lang)=0
virtual void setOuterScope(Definition *d)=0
virtual void setArtificial(bool b)=0
virtual void setId(const QCString &name)=0
virtual void makePartOfGroup(GroupDef *gd)=0
virtual void setBodyDef(const FileDef *fd)=0
virtual void setBriefDescription(const QCString &b, const QCString &briefFile, int briefLine)=0
virtual void setReference(const QCString &r)=0
virtual void setRequirementReferences(const RequirementRefs &rqli)=0
virtual void setRefItems(const RefItemVector &sli)=0
virtual void computeTooltip()=0
A model of a directory symbol.
virtual void overrideDirectoryGraph(bool e)=0
Class representing a directory in the file system.
static std::string currentDirPath()
std::string absPath() const
bool mkdir(const std::string &path, bool acceptsAbsPath=true) const
void setPath(const std::string &path)
bool remove(const std::string &path, bool acceptsAbsPath=true) const
DirIterator iterator() const
static std::string cleanDirPath(const std::string &path)
static bool setCurrent(const std::string &path)
A linked map of directories.
A class that generates docset files.
static DotManager * instance()
static NamespaceLinkedMap * namespaceLinkedMap
static ConceptLinkedMap * conceptLinkedMap
static bool suppressDocWarnings
static FileNameLinkedMap * plantUmlFileNameLinkedMap
static bool parseSourcesNeeded
static StringUnorderedSet inputPaths
static std::unique_ptr< PageDef > mainPage
static bool clangAssistedParsing
static StringUnorderedSet expandAsDefinedSet
static FileNameLinkedMap * inputNameLinkedMap
static ParserManager * parserManager
static InputFileEncodingList inputFileEncodingList
static ClassLinkedMap * classLinkedMap
static MemberNameLinkedMap * functionNameLinkedMap
static PageLinkedMap * exampleLinkedMap
static FileNameLinkedMap * dotFileNameLinkedMap
static NamespaceDefMutable * globalScope
static FileNameLinkedMap * imageNameLinkedMap
static FileNameLinkedMap * mscFileNameLinkedMap
static FileNameLinkedMap * mermaidFileNameLinkedMap
static QCString verifiedDotPath
static MemberGroupInfoMap memberGroupInfoMap
static IndexList * indexList
static StaticInitMap staticInitMap
static StringMap tagDestinationMap
static std::mutex countFlowKeywordsMutex
static ClassLinkedMap * hiddenClassLinkedMap
static FileNameLinkedMap * diaFileNameLinkedMap
static QCString htmlFileExtension
static QCString filterDBFileName
static PageLinkedMap * pageLinkedMap
static bool generatingXmlOutput
static std::unique_ptr< NamespaceDef > globalNamespaceDef
static DefinesPerFileList macroDefinitions
static DirLinkedMap * dirLinkedMap
static NamespaceAliasInfoMap namespaceAliasMap
static MemberNameLinkedMap * memberNameLinkedMap
static SymbolMap< Definition > * symbolMap
static StringUnorderedSet tagFileSet
static FileNameLinkedMap * includeNameLinkedMap
static FileNameLinkedMap * exampleNameLinkedMap
static SearchIndexIntf searchIndex
static DirRelationLinkedMap dirRelations
static std::mutex addExampleMutex
static ClangUsrMap * clangUsrMap
static GroupLinkedMap * groupLinkedMap
Generator for Eclipse help files.
static EmojiEntityMapper & instance()
Returns the one and only instance of the Emoji entity mapper.
void writeEmojiFile(TextStream &t)
Writes the list of supported emojis to the given file.
Represents an unstructured piece of information, about an entity found in the sources.
TextStream initializer
initial value (for variables)
VhdlSpecifier vhdlSpec
VHDL specifiers.
bool subGrouping
automatically group class members?
RequirementRefs rqli
references to requirements
const std::vector< std::shared_ptr< Entry > > & children() const
GroupDocType groupDocType
QCString metaData
Slice metadata.
int docLine
line number at which the documentation was found
QCString bitfields
member's bit fields
ArgumentList typeConstr
where clause (C#) for type constraints
void markAsProcessed() const
int endBodyLine
line number where the definition ends
bool exported
is the symbol exported from a C++20 module
const TagInfo * tagInfo() const
QCString includeName
include name (3 arg of \class)
ArgumentLists tArgLists
template argument declarations
MethodTypes mtype
signal, slot, (dcop) method, or property?
@ GROUPDOC_NORMAL
defgroup
SrcLangExt lang
programming language in which this entry was found
QCString inbodyDocs
documentation inside the body of a function
int startColumn
start column of entry in the source
QCString relates
related class (doc block)
bool explicitExternal
explicitly defined as external?
std::vector< const SectionInfo * > anchors
list of anchors defined in this entry
QCString fileName
file this entry was extracted from
RelatesType relatesType
how relates is handled
QCString write
property write accessor
QCString args
member argument string
std::vector< Grouping > groups
list of groups this entry belongs to
CommandOverrides commandOverrides
store info for commands whose default can be overridden
QCString exception
throw specification
int startLine
start line of entry in the source
QCString req
C++20 requires clause.
ArgumentList argList
member arguments as a list
QCString includeFile
include file (2 arg of \class, must be unique)
int inbodyLine
line number at which the body doc was found
EntryType section
entry type (see Sections);
QCString briefFile
file in which the brief desc. was found
int bodyLine
line number of the body in the source
int mGrpId
member group id
std::vector< BaseInfo > extends
list of base classes
Specifier virt
virtualness of the entry
std::vector< std::string > qualifiers
qualifiers specified with the qualifier command
QCString doc
documentation block (partly parsed)
QCString read
property read accessor
RefItemVector sli
special lists (test/todo/bug/deprecated/..) this entry is in
QCString docFile
file in which the documentation was found
Protection protection
class protection
bool artificial
Artificially introduced item.
bool hidden
does this represent an entity that is hidden from the output
QCString brief
brief description (doc block)
int briefLine
line number at which the brief desc. was found
FileDef * fileDef() const
int initLines
define/variable initializer lines to show
QCString inbodyFile
file in which the body doc was found
TypeSpecifier spec
class/member specifiers
QCString inside
name of the class in which documents are found
Wrapper class for the Entry type.
constexpr bool isCompoundDoc() const noexcept
constexpr bool isFile() const noexcept
constexpr bool isDoc() const noexcept
ENTRY_TYPES constexpr bool isCompound() const noexcept
std::string to_string() const
constexpr bool isScope() const noexcept
A class that generates a dynamic tree view side panel.
A model of a file symbol.
virtual void addUsingDeclaration(const Definition *d)=0
virtual void removeMember(MemberDef *md)=0
virtual void insertClass(ClassDef *cd)=0
virtual void insertConcept(ConceptDef *cd)=0
virtual void overrideIncludeGraph(bool e)=0
virtual void writeSourceHeader(OutputList &ol)=0
virtual bool generateSourceFile() const =0
virtual const LinkedRefMap< NamespaceDef > & getUsedNamespaces() const =0
virtual QCString absFilePath() const =0
virtual bool isSource() const =0
virtual void parseSource(ClangTUParser *clangParser)=0
virtual void getAllIncludeFilesRecursively(StringVector &incFiles) const =0
virtual void setDiskName(const QCString &name)=0
virtual void writeSourceFooter(OutputList &ol)=0
virtual void writeSourceBody(OutputList &ol, ClangTUParser *clangParser)=0
virtual void addUsingDirective(NamespaceDef *nd)=0
virtual void overrideIncludedByGraph(bool e)=0
virtual const QCString & docName() const =0
virtual void insertMember(MemberDef *md)=0
virtual void insertNamespace(NamespaceDef *nd)=0
Minimal replacement for QFileInfo.
std::string readLink() const
std::string fileName() const
std::string dirPath(bool absPath=true) const
std::string absFilePath() const
Class representing all files with a certain base name.
Ordered dictionary of FileName objects.
A model of a group of symbols.
virtual QCString groupTitle() const =0
virtual void overrideGroupGraph(bool e)=0
virtual bool addClass(ClassDef *def)=0
virtual bool containsFile(const FileDef *def) const =0
virtual bool addNamespace(NamespaceDef *def)=0
virtual void setGroupScope(Definition *d)=0
virtual void addFile(FileDef *def)=0
virtual MemberList * getMemberList(MemberListType lt) const =0
virtual void setGroupTitle(const QCString &newtitle)=0
virtual bool hasGroupTitle() const =0
Generator for HTML output.
static void writeSearchPage()
static void writeFooterFile(TextStream &t)
static void writeTabData()
Additional initialization after indices have been created.
static void writeSearchData(const QCString &dir)
static void writeExternalSearchPage()
static void writeStyleSheetFile(TextStream &t)
static void writeHeaderFile(TextStream &t, const QCString &cssname)
A class that generated the HTML Help specific files.
static const QCString hhpFileName
static Index & instance()
void countDataStructures()
A list of index interfaces.
Generator for LaTeX output.
static void writeFooterFile(TextStream &t)
static void writeStyleSheetFile(TextStream &t)
static void writeHeaderFile(TextStream &t)
static LayoutDocManager & instance()
Returns a reference to this singleton.
void parse(const QCString &fileName, const char *data=nullptr)
Parses a user provided layout.
std::unique_ptr< RefList > Ptr
T * add(const char *k, Args &&... args)
const T * find(const std::string &key) const
Container class representing a vector of objects with keys.
const T * find(const std::string &key) const
Generator for Man page output.
A model of a class/file/namespace member symbol.
virtual QCString typeString() const =0
virtual QCString requiresClause() const =0
virtual bool isFriend() const =0
virtual bool isForeign() const =0
virtual QCString definition() const =0
virtual bool isRelated() const =0
virtual const ClassDef * getCachedTypedefVal() const =0
virtual QCString excpString() const =0
virtual const ClassDef * getClassDef() const =0
virtual const ArgumentList & templateArguments() const =0
virtual GroupDef * getGroupDef()=0
virtual bool isCSharpProperty() const =0
virtual bool isTypedef() const =0
virtual const MemberVector & enumFieldList() const =0
virtual void moveTo(Definition *)=0
virtual const FileDef * getFileDef() const =0
virtual const ArgumentList & argumentList() const =0
virtual bool isStrongEnumValue() const =0
virtual VhdlSpecifier getVhdlSpecifiers() const =0
virtual bool isFunction() const =0
virtual bool isExternal() const =0
virtual int getMemberGroupId() const =0
virtual bool isStatic() const =0
virtual const MemberDef * reimplements() const =0
virtual StringVector getQualifiers() const =0
virtual QCString bitfieldString() const =0
virtual bool isTypedefValCached() const =0
virtual bool isDocsForDefinition() const =0
virtual bool isDefine() const =0
virtual const NamespaceDef * getNamespaceDef() const =0
virtual bool isObjCProperty() const =0
virtual Protection protection() const =0
virtual TypeSpecifier getMemberSpecifiers() const =0
virtual bool isEnumerate() const =0
virtual MemberType memberType() const =0
virtual ClassDef * relatedAlso() const =0
virtual bool isVariable() const =0
virtual bool isStrong() const =0
virtual QCString argsString() const =0
virtual Specifier virtualness(int count=0) const =0
virtual int redefineCount() const =0
virtual int initializerLines() const =0
virtual const MemberDef * getEnumScope() const =0
virtual bool isEnumValue() const =0
virtual bool isPrototype() const =0
virtual const QCString & initializer() const =0
virtual void setMemberClass(ClassDef *cd)=0
virtual void setProtection(Protection p)=0
virtual void setMemberGroupId(int id)=0
virtual void setDocumentedEnumValues(bool value)=0
virtual void setMemberSpecifiers(TypeSpecifier s)=0
virtual void setDefinition(const QCString &d)=0
virtual ClassDefMutable * getClassDefMutable()=0
virtual void setExplicitExternal(bool b, const QCString &df, int line, int column)=0
virtual void setAccessorType(ClassDef *cd, const QCString &t)=0
virtual void setDefinitionTemplateParameterLists(const ArgumentLists &lists)=0
virtual void invalidateTypedefValCache()=0
virtual void setBitfields(const QCString &s)=0
virtual void setVhdlSpecifiers(VhdlSpecifier s)=0
virtual void setEnumScope(MemberDef *md, bool livesInsideEnum=FALSE)=0
virtual void setEnumClassScope(ClassDef *cd)=0
virtual void setMaxInitLines(int lines)=0
virtual void setInheritsDocsFrom(const MemberDef *md)=0
virtual void setRelatedAlso(ClassDef *cd)=0
virtual void setPrototype(bool p, const QCString &df, int line, int column)=0
virtual void overrideReferencesRelation(bool e)=0
virtual void makeForeign()=0
virtual void overrideReferencedByRelation(bool e)=0
virtual void setDocsForDefinition(bool b)=0
virtual void setRequiresClause(const QCString &req)=0
virtual void overrideCallGraph(bool e)=0
virtual void overrideInlineSource(bool e)=0
virtual void setArgsString(const QCString &as)=0
virtual void setInitializer(const QCString &i)=0
virtual void copyArgumentNames(const MemberDef *bmd)=0
virtual void overrideEnumValues(bool e)=0
virtual void mergeMemberSpecifiers(TypeSpecifier s)=0
virtual void addQualifiers(const StringVector &qualifiers)=0
virtual void insertEnumField(MemberDef *md)=0
virtual void moveDeclArgumentList(std::unique_ptr< ArgumentList > al)=0
virtual void overrideCallerGraph(bool e)=0
virtual void setReimplements(MemberDef *md)=0
virtual void setDeclFile(const QCString &df, int line, int column)=0
virtual void invalidateCachedArgumentTypes()=0
virtual void moveArgumentList(std::unique_ptr< ArgumentList > al)=0
virtual void makeRelated()=0
virtual void insertReimplementedBy(MemberDef *md)=0
A list of MemberDef objects as shown in documentation sections.
Ordered dictionary of MemberName objects.
const MemberDef * find(const QCString &name) const
const MemberDef * findRev(const QCString &name) const
void run()
Run mmdc tool for all collected diagrams.
static MermaidManager & instance()
static ModuleManager & instance()
void addDocs(const Entry *root)
void addConceptToModule(const Entry *root, ConceptDef *cd)
void addClassToModule(const Entry *root, ClassDef *cd)
void addMemberToModule(const Entry *root, MemberDef *md)
void writeDocumentation(OutputList &ol)
void addMembersToMemberGroup()
void findSectionsInDocumentation()
void distributeMemberGroupDocumentation()
An abstract interface of a namespace symbol.
virtual const LinkedRefMap< NamespaceDef > & getUsedNamespaces() const =0
virtual bool isInline() const =0
virtual void insertUsedFile(FileDef *fd)=0
virtual void setMetaData(const QCString &m)=0
virtual void findSectionsInDocumentation()=0
virtual void countMembers()=0
virtual void addUsingDirective(NamespaceDef *nd)=0
virtual void insertMember(MemberDef *md)=0
virtual void addUsingDeclaration(const Definition *d)=0
virtual void distributeMemberGroupDocumentation()=0
virtual void writeTagFile(TextStream &)=0
virtual void writeDocumentation(OutputList &ol)=0
virtual void setInline(bool isInline)=0
virtual void computeAnchors()=0
virtual void combineUsingRelations(NamespaceDefSet &visitedNamespace)=0
virtual void setFileName(const QCString &fn)=0
virtual void sortMemberLists()=0
virtual void addMembersToMemberGroup()=0
bool needsPreprocessing(const QCString &) const override
Returns TRUE if the language identified by extension needs the C preprocessor to be run before feed t...
void parseInput(const QCString &, const char *, const std::shared_ptr< Entry > &, ClangTUParser *) override
Parses a single input file with the goal to build an Entry tree.
void parsePrototype(const QCString &) override
Callback function called by the comment block scanner.
Abstract interface for outline parsers.
virtual bool needsPreprocessing(const QCString &extension) const =0
Returns TRUE if the language identified by extension needs the C preprocessor to be run before feed t...
virtual void parseInput(const QCString &fileName, const char *fileBuf, const std::shared_ptr< Entry > &root, ClangTUParser *clangParser)=0
Parses a single input file with the goal to build an Entry tree.
Class representing a list of output generators that are written to in parallel.
A model of a page symbol.
virtual void setLocalToc(const LocalToc &tl)=0
virtual void setFileName(const QCString &name)=0
virtual void setShowLineNo(bool)=0
virtual void setPageScope(Definition *)=0
virtual const GroupDef * getGroupDef() const =0
Manages programming language parsers.
static PlantumlManager & instance()
void run()
Run plant UML tool for all images.
void processFile(const QCString &fileName, const std::string &input, std::string &output)
void addSearchDir(const QCString &dir)
This is an alternative implementation of QCString.
int find(char c, int index=0, bool cs=TRUE) const
QCString & prepend(const char *s)
int toInt(bool *ok=nullptr, int base=10) const
size_t length() const
Returns the length of the string, not counting the 0-terminator.
bool startsWith(const char *s) const
QCString mid(size_t index, size_t len=static_cast< size_t >(-1)) const
bool endsWith(const char *s) const
char & at(size_t i)
Returns a reference to the character at index i.
bool isEmpty() const
Returns TRUE iff the string is empty.
QCString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
QCString fill(char c, int len=-1)
Fills a string with a predefined character.
const std::string & str() const
QCString & setNum(short n)
QCString right(size_t len) const
size_t size() const
Returns the length of the string, not counting the 0-terminator.
QCString & sprintf(const char *format,...)
int findRev(char c, int index=-1, bool cs=TRUE) const
QCString & replace(size_t index, size_t len, const char *s)
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
QCString left(size_t len) const
int contains(char c, bool cs=TRUE) const
bool stripPrefix(const QCString &prefix)
static const QCString qhpFileName
static QCString getQchFileName()
Generator for RTF output.
static bool preProcessFileInplace(const QCString &path, const QCString &name)
This is an API to a VERY brittle RTF preprocessor that combines nested RTF files.
static void writeStyleSheetFile(TextStream &t)
static void writeExtensionsFile(TextStream &t)
static RefListManager & instance()
static RequirementManager & instance()
void writeTagFile(TextStream &tagFile)
void addRequirement(Entry *e)
Abstract proxy interface for non-javascript based search indices.
class that provide information about a section.
QCString fileName() const
SectionInfo * replace(const QCString &label, const QCString &fileName, int lineNr, const QCString &title, SectionType type, int level, const QCString &ref=QCString())
SectionInfo * add(const SectionInfo &si)
static SectionManager & instance()
returns a reference to the singleton
static constexpr int Page
std::vector< stat > stats
void begin(const char *name)
std::chrono::steady_clock::time_point startTime
static void showCacheUsage()
Show usage of the type lookup cache.
static void clearTypeLookupCache(ClearScope scope)
const Definition * resolveSymbol(const Definition *scope, const QCString &name, const QCString &args=QCString(), bool checkCV=false, bool insideCode=false, bool onlyLinkable=false)
Find the symbool definition matching name within the scope set.
const ClassDef * resolveClass(const Definition *scope, const QCString &name, bool maybeUnlinkable=false, bool mayBeHidden=false)
Find the class definition matching name within the scope set.
QCString getTemplateSpec() const
In case a call to resolveClass() points to a template specialization, the template part is return via...
ClassDefMutable * resolveClassMutable(const Definition *scope, const QCString &name, bool mayBeUnlinkable=false, bool mayBeHidden=false)
Wrapper around resolveClass that returns a mutable interface to the class object or a nullptr if the ...
const MemberDef * getTypedef() const
In case a call to resolveClass() resolves to a type member (e.g.
Text streaming class that buffers data.
std::string str() const
Return the contents of the buffer as a std::string object.
Class managing a pool of worker threads.
auto queue(F &&f, Args &&... args) -> std::future< decltype(f(args...))>
Queue the callable function f for the threads to execute.
Wrapper class for a number of boolean properties.
std::string to_string() const
static void correctMemberProperties(MemberDefMutable *md)
static void computeVhdlComponentRelations()
ClassDefMutable * toClassDefMutable(Definition *d)
ClassDef * getClass(const QCString &n)
std::unique_ptr< ClassDef > createClassDefAlias(const Definition *newScope, const ClassDef *cd)
std::unique_ptr< ClassDef > createClassDef(const QCString &fileName, int startLine, int startColumn, const QCString &name, ClassDef::CompoundType ct, const QCString &ref, const QCString &fName, bool isSymbol, bool isJavaEnum)
Factory method to create a new ClassDef object.
ClassDef * toClassDef(Definition *d)
std::unordered_set< const ClassDef * > ClassDefSet
std::map< std::string, int > TemplateNameMap
ClassDefMutable * getClassMutable(const QCString &key)
Class representing a regular expression.
Class to iterate through matches.
Object representing the matching results.
ConceptDefMutable * toConceptDefMutable(Definition *d)
std::unique_ptr< ConceptDef > createConceptDef(const QCString &fileName, int startLine, int startColumn, const QCString &name, const QCString &tagRef, const QCString &tagFile)
ConceptDefMutable * getConceptMutable(const QCString &key)
#define Config_getInt(name)
#define Config_getList(name)
#define Config_updateString(name, value)
#define Config_updateBool(name, value)
#define Config_getBool(name)
#define Config_getString(name)
#define Config_updateList(name,...)
#define Config_getEnum(name)
std::set< std::string > StringSet
std::unordered_set< std::string > StringUnorderedSet
std::map< std::string, std::string > StringMap
std::vector< std::string > StringVector
void parseFuncDecl(const QCString &decl, const SrcLangExt lang, QCString &clName, QCString &type, QCString &name, QCString &args, QCString &funcTempList, QCString &exceptions)
std::unique_ptr< ArgumentList > stringToArgumentList(SrcLangExt lang, const QCString &argsString, QCString *extraTypeChars=nullptr)
std::unordered_map< std::string, DefineList > DefinesPerFileList
Definition * toDefinition(DefinitionMutable *dm)
DefinitionMutable * toDefinitionMutable(Definition *d)
DirIterator begin(DirIterator it) noexcept
DirIterator end(const DirIterator &) noexcept
void computeDirDependencies()
void generateDirDocs(OutputList &ol)
#define AUTO_TRACE_ADD(...)
#define AUTO_TRACE_EXIT(...)
constexpr DocNodeVariant * parent(DocNodeVariant *n)
returns the parent node of a given node n or nullptr if the node has no parent.
static void findInheritedTemplateInstances()
void printNavTree(Entry *root, int indent)
static void addClassToContext(const Entry *root)
static void makeTemplateInstanceRelation(const Entry *root, ClassDefMutable *cd)
static StringUnorderedSet g_pathsVisited(1009)
static int findEndOfTemplate(const QCString &s, size_t startPos)
static void buildGroupList(const Entry *root)
static void insertMemberAlias(Definition *outerScope, const MemberDef *md)
static void findUsingDeclarations(const Entry *root, bool filterPythonPackages)
static void flushCachedTemplateRelations()
static bool isRecursiveBaseClass(const QCString &scope, const QCString &name)
static void copyLatexStyleSheet()
static void generateDocsForClassList(const std::vector< ClassDefMutable * > &classList)
static std::shared_ptr< Entry > parseFile(OutlineParserInterface &parser, FileDef *fd, const QCString &fn, ClangTUParser *clangParser, bool newTU)
static int findFunctionPtr(const std::string &type, SrcLangExt lang, int *pLength=nullptr)
static bool isSpecialization(const ArgumentLists &srcTempArgLists, const ArgumentLists &dstTempArgLists)
static MemberDef * addVariableToClass(const Entry *root, ClassDefMutable *cd, MemberType mtype, const QCString &type, const QCString &name, const QCString &args, bool fromAnnScope, MemberDef *fromAnnMemb, Protection prot, Relationship related)
static void computeTemplateClassRelations()
static std::string resolveSymlink(const std::string &path)
void adjustConfiguration()
adjust globals that depend on configuration settings.
static void findDEV(const MemberNameLinkedMap &mnsd)
static void runQHelpGenerator()
static void addConceptToContext(const Entry *root)
static void addRelatedPage(Entry *root)
static void addIncludeFile(DefMutable *cd, FileDef *ifd, const Entry *root)
static StringVector g_inputFiles
static void createUsingMemberImportForClass(const Entry *root, ClassDefMutable *cd, const MemberDef *md, const QCString &fileName, const QCString &memName)
static void generateXRefPages()
static void findUsingDeclImports(const Entry *root)
static void copyStyleSheet()
FindBaseClassRelation_Mode
void distributeClassGroupRelations()
static void generateGroupDocs()
static void findDirDocumentation(const Entry *root)
void checkConfiguration()
check and resolve config options
QCString stripTemplateSpecifiers(const QCString &s)
static bool findClassRelation(const Entry *root, Definition *context, ClassDefMutable *cd, const BaseInfo *bi, const TemplateNameMap &templateNames, FindBaseClassRelation_Mode mode, bool isArtificial)
static void resolveTemplateInstanceInType(const Entry *root, const Definition *scope, const MemberDef *md)
static void organizeSubGroupsFiltered(const Entry *root, bool additional)
static void warnUndocumentedNamespaces()
static TemplateNameMap getTemplateArgumentsInName(const ArgumentList &templateArguments, const std::string &name)
static NamespaceDef * findUsedNamespace(const LinkedRefMap< NamespaceDef > &unl, const QCString &name)
static void buildConceptList(const Entry *root)
static void resolveClassNestingRelations()
static void generateNamespaceConceptDocs(const ConceptLinkedRefMap &conceptList)
static void findMember(const Entry *root, const QCString &relates, const QCString &type, const QCString &args, QCString funcDecl, bool overloaded, bool isFunc)
static void findClassEntries(const Entry *root)
static void processTagLessClasses(const ClassDef *rootCd, const ClassDef *cd, ClassDefMutable *tagParentCd, const QCString &prefix, int count)
Look through the members of class cd and its public members.
static void addMemberFunction(const Entry *root, MemberName *mn, const QCString &scopeName, const QCString &namespaceName, const QCString &className, const QCString &funcTyp, const QCString &funcName, const QCString &funcArgs, const QCString &funcTempList, const QCString &exceptions, const QCString &type, const QCString &args, bool isFriend, TypeSpecifier spec, const QCString &relates, const QCString &funcDecl, bool overloaded, bool isFunc)
static void vhdlCorrectMemberProperties()
static void generateExampleDocs()
static void stopDoxygen(int)
static void findTemplateInstanceRelation(const Entry *root, Definition *context, ClassDefMutable *templateClass, const QCString &templSpec, const TemplateNameMap &templateNames, bool isArtificial)
static void substituteTemplatesInArgList(const ArgumentLists &srcTempArgLists, const ArgumentLists &dstTempArgLists, const ArgumentList &src, ArgumentList &dst)
static void computeMemberReferences()
static void generateConfigFile(const QCString &configFile, bool shortList, bool updateOnly=FALSE)
static void transferRelatedFunctionDocumentation()
static void addMembersToMemberGroup()
static bool tryAddEnumDocsToGroupMember(const Entry *root, const QCString &name)
static void addOverloaded(const Entry *root, MemberName *mn, const QCString &funcType, const QCString &funcName, const QCString &funcArgs, const QCString &funcDecl, const QCString &exceptions, TypeSpecifier spec)
static void findMainPageTagFiles(Entry *root)
static void distributeConceptGroups()
static void transferFunctionDocumentation()
static void setAnonymousEnumType()
static void sortMemberLists()
static void createTemplateInstanceMembers()
void transferStaticInstanceInitializers()
static void findObjCMethodDefinitions(const Entry *root)
static void dumpSymbolMap()
static void buildTypedefList(const Entry *root)
static void findGroupScope(const Entry *root)
static void generateFileDocs()
static void findDefineDocumentation(Entry *root)
static void findUsedClassesForClass(const Entry *root, Definition *context, ClassDefMutable *masterCd, ClassDefMutable *instanceCd, bool isArtificial, const ArgumentList *actualArgs=nullptr, const TemplateNameMap &templateNames=TemplateNameMap())
static void findMemberDocumentation(const Entry *root)
static void copyIcon(const QCString &outputOption)
static void addLocalObjCMethod(const Entry *root, const QCString &scopeName, const QCString &funcType, const QCString &funcName, const QCString &funcArgs, const QCString &exceptions, const QCString &funcDecl, TypeSpecifier spec)
static bool findGlobalMember(const Entry *root, const QCString &namespaceName, const QCString &type, const QCString &name, const QCString &tempArg, const QCString &, const QCString &decl, TypeSpecifier)
static void distributeMemberGroupDocumentation()
static void generateNamespaceClassDocs(const ClassLinkedRefMap &classList)
static void addEnumValuesToEnums(const Entry *root)
static void generatePageDocs()
static void resolveUserReferences()
static void buildRequirementsList(Entry *root)
static void compareDoxyfile(Config::CompareMode diffList)
static void addPageToContext(PageDef *pd, Entry *root)
static void buildVarList(const Entry *root)
static void buildSequenceList(const Entry *root)
static void generateFileSources()
static QCString substituteTemplatesInString(const ArgumentLists &srcTempArgLists, const ArgumentLists &dstTempArgLists, const std::string &src)
static void copyLogo(const QCString &outputOption)
static void usage(const QCString &name, const QCString &versionString)
static MemberDef * addVariableToFile(const Entry *root, MemberType mtype, const QCString &scope, const QCString &type, const QCString &name, const QCString &args, bool fromAnnScope, MemberDef *fromAnnMemb)
static void generateClassDocs()
static void buildNamespaceList(const Entry *root)
static void readTagFile(const std::shared_ptr< Entry > &root, const QCString &tagLine)
static void findIncludedUsingDirectives()
static void addDefineDoc(const Entry *root, MemberDefMutable *md)
static void addMemberDocs(const Entry *root, MemberDefMutable *md, const QCString &funcDecl, const ArgumentList *al, bool over_load, TypeSpecifier spec)
static void countMembers()
static void addInterfaceOrServiceToServiceOrSingleton(const Entry *root, ClassDefMutable *cd, QCString const &rname)
static void organizeSubGroups(const Entry *root)
static void applyMemberOverrideOptions(const Entry *root, MemberDefMutable *md)
static void findFriends()
static void findEnums(const Entry *root)
static void dumpSymbol(TextStream &t, Definition *d)
static void addClassAndNestedClasses(std::vector< ClassDefMutable * > &list, ClassDefMutable *cd)
static void addEnumDocs(const Entry *root, MemberDefMutable *md)
static void addListReferences()
static void exitDoxygen() noexcept
static void copyExtraFiles(const StringVector &files, const QCString &filesOption, const QCString &outputOption)
static bool isClassSection(const Entry *root)
static Definition * findScopeFromQualifiedName(NamespaceDefMutable *startScope, const QCString &n, FileDef *fileScope, const TagInfo *tagInfo)
static ClassDef * findClassWithinClassContext(Definition *context, ClassDef *cd, const QCString &name)
static void buildGroupListFiltered(const Entry *root, bool additional, bool includeExternal)
static void runHtmlHelpCompiler()
static QCString extractClassName(const Entry *root)
static void addMembersToIndex()
static bool g_dumpSymbolMap
static void version(const bool extended)
static void addGlobalFunction(const Entry *root, const QCString &rname, const QCString &sc)
static OutputList * g_outputList
static void findMainPage(Entry *root)
static ClassDef::CompoundType convertToCompoundType(EntryType section, TypeSpecifier specifier)
static void findUsingDirectives(const Entry *root)
std::unique_ptr< ArgumentList > getTemplateArgumentsFromName(const QCString &name, const ArgumentLists &tArgLists)
static bool g_successfulRun
static void addSourceReferences()
std::function< std::unique_ptr< T >() > make_parser_factory()
static void buildExampleList(Entry *root)
static void inheritDocumentation()
static void flushUnresolvedRelations()
static bool isSymbolHidden(const Definition *d)
void readConfiguration(int argc, char **argv)
static void readDir(FileInfo *fi, FileNameLinkedMap *fnMap, StringUnorderedSet *exclSet, const StringVector *patList, const StringVector *exclPatList, StringVector *resultList, StringUnorderedSet *resultSet, bool errorIfNotExist, bool recursive, StringUnorderedSet *killSet, StringUnorderedSet *paths)
static QCString g_commentFileName
static void findDocumentedEnumValues()
static void findTagLessClasses()
static void generateDiskNames()
static void addToIndices()
static void computeClassRelations()
static void buildFunctionList(const Entry *root)
static void checkPageRelations()
static void findModuleDocumentation(const Entry *root)
static void findEnumDocumentation(const Entry *root)
static void computePageRelations(Entry *root)
static void filterMemberDocumentation(const Entry *root, const QCString &relates)
static QCString createOutputDirectory(const QCString &baseDirName, const QCString &formatDirName, const char *defaultDirName)
static bool isVarWithConstructor(const Entry *root)
static StringSet g_usingDeclarations
static void buildDictionaryList(const Entry *root)
static bool haveEqualFileNames(const Entry *root, const MemberDef *md)
static void generateNamespaceDocs()
static void buildClassDocList(const Entry *root)
static void buildPageList(Entry *root)
static void writeTagFile()
static Definition * buildScopeFromQualifiedName(const QCString &name_, SrcLangExt lang, const TagInfo *tagInfo)
static void addRequirementReferences()
static void computeVerifiedDotPath()
static bool g_singleComment
static void findSectionsInDocumentation()
static void mergeCategories()
static const StringUnorderedSet g_compoundKeywords
static bool scopeIsTemplate(const Definition *d)
static void buildFileList(const Entry *root)
static ClassDefMutable * createTagLessInstance(const ClassDef *rootCd, const ClassDef *templ, const QCString &fieldName)
static void buildClassList(const Entry *root)
static void addMethodToClass(const Entry *root, ClassDefMutable *cd, const QCString &rtype, const QCString &rname, const QCString &rargs, bool isFriend, Protection protection, bool stat, Specifier virt, TypeSpecifier spec, const QCString &relates)
static std::unique_ptr< OutlineParserInterface > getParserForFile(const QCString &fn)
static void findUsedTemplateInstances()
static void computeTooltipTexts()
void readFileOrDirectory(const QCString &s, FileNameLinkedMap *fnMap, StringUnorderedSet *exclSet, const StringVector *patList, const StringVector *exclPatList, StringVector *resultList, StringUnorderedSet *resultSet, bool recursive, bool errorIfNotExist, StringUnorderedSet *killSet, StringUnorderedSet *paths)
static void addVariable(const Entry *root, int isFuncPtr=-1)
static void addMemberSpecialization(const Entry *root, MemberName *mn, ClassDefMutable *cd, const QCString &funcType, const QCString &funcName, const QCString &funcArgs, const QCString &funcDecl, const QCString &exceptions, TypeSpecifier spec)
static void findBaseClassesForClass(const Entry *root, Definition *context, ClassDefMutable *masterCd, ClassDefMutable *instanceCd, FindBaseClassRelation_Mode mode, bool isArtificial, const ArgumentList *actualArgs=nullptr, const TemplateNameMap &templateNames=TemplateNameMap())
static void parseFilesSingleThreading(const std::shared_ptr< Entry > &root)
parse the list of input files
static void buildCompleteMemberLists()
static void generateConceptDocs()
static void combineUsingRelations()
static const char * getArg(int argc, char **argv, int &optInd)
static const ClassDef * findClassDefinition(FileDef *fd, NamespaceDef *nd, const QCString &scopeName)
static void checkMarkdownMainfile()
static std::unordered_map< std::string, std::vector< ClassDefMutable * > > g_usingClassMap
static void buildConceptDocList(const Entry *root)
static int findTemplateSpecializationPosition(const QCString &name)
static bool isEntryInGroupOfMember(const Entry *root, const MemberDef *md, bool allowNoGroup=false)
static void applyToAllDefinitions(Func func)
static void parseFilesMultiThreading(const std::shared_ptr< Entry > &root)
parse the list of input files
static void transferFunctionReferences()
static void buildDefineList()
static void buildInterfaceAndServiceList(const Entry *root)
static void computeMemberRelations()
static void buildListOfUsingDecls(const Entry *root)
static void computeMemberRelationsForBaseClass(const ClassDef *cd, const BaseClassDef *bcd)
static std::multimap< std::string, const Entry * > g_classEntries
std::vector< InputFileEncoding > InputFileEncodingList
std::unordered_map< std::string, BodyInfo > StaticInitMap
std::unordered_map< std::string, NamespaceAliasInfo > NamespaceAliasInfoMap
std::unordered_map< std::string, const Definition * > ClangUsrMap
std::unique_ptr< FileDef > createFileDef(const QCString &p, const QCString &n, const QCString &ref, const QCString &dn)
FileDef * toFileDef(Definition *d)
std::unordered_set< const FileDef * > FileDefSet
static void startScope(yyscan_t yyscanner)
start scope
void addNamespaceToGroups(const Entry *root, NamespaceDef *nd)
void addGroupToGroups(const Entry *root, GroupDef *subGroup)
void addClassToGroups(const Entry *root, ClassDef *cd)
void addDirToGroups(const Entry *root, DirDef *dd)
std::unique_ptr< GroupDef > createGroupDef(const QCString &fileName, int line, const QCString &name, const QCString &title, const QCString &refFileName)
void addConceptToGroups(const Entry *root, ConceptDef *cd)
void addMemberToGroups(const Entry *root, MemberDef *md)
void startTitle(OutputList &ol, const QCString &fileName, const DefinitionMutable *def)
void endFile(OutputList &ol, bool skipNavIndex, bool skipEndContents, const QCString &navPath)
void writeGraphInfo(OutputList &ol)
void endTitle(OutputList &ol, const QCString &fileName, const QCString &name)
void startFile(OutputList &ol, const QCString &name, bool isSource, const QCString &manName, const QCString &title, HighlightedItem hli, bool additionalIndices, const QCString &altSidebarName, int hierarchyLevel, const QCString &allMembersFile)
void writeIndexHierarchy(OutputList &ol)
Translator * theTranslator
void setTranslator(OUTPUT_LANGUAGE_t langName)
#define LATEX_STYLE_EXTENSION
void writeDefaultLayoutFile(const QCString &fileName)
std::unique_ptr< MemberDef > createMemberDefAlias(const Definition *newScope, const MemberDef *aliasMd)
MemberDefMutable * toMemberDefMutable(Definition *d)
void combineDeclarationAndDefinition(MemberDefMutable *mdec, MemberDefMutable *mdef)
MemberDef * toMemberDef(Definition *d)
std::unique_ptr< MemberDef > createMemberDef(const QCString &defFileName, int defLine, int defColumn, const QCString &type, const QCString &name, const QCString &args, const QCString &excp, Protection prot, Specifier virt, bool stat, Relationship related, MemberType t, const ArgumentList &tal, const ArgumentList &al, const QCString &metaData)
Factory method to create a new instance of a MemberDef.
std::unordered_map< int, std::unique_ptr< MemberGroupInfo > > MemberGroupInfoMap
QCString warn_line(const QCString &file, int line)
#define warn_undoc(file, line, fmt,...)
#define warn_uncond(fmt,...)
#define warn(file, line, fmt,...)
void postProcess(bool clearHeaderAndFooter, CompareMode compareMode=CompareMode::Full)
void checkAndCorrect(bool quiet, const bool check)
void compareDoxyfile(TextStream &t, CompareMode compareMode)
bool parse(const QCString &fileName, bool update=FALSE, CompareMode compareMode=CompareMode::Full)
void writeTemplate(TextStream &t, bool shortList, bool updateOnly=FALSE)
void correctPath(const StringVector &list)
Correct a possible wrong PATH variable.
bool isAbsolutePath(const QCString &fileName)
FILE * popen(const QCString &name, const QCString &type)
std::ofstream openOutputStream(const QCString &name, bool append=false)
double getSysElapsedTime()
QCString pathListSeparator()
int system(const QCString &command, const QCString &args, bool commandHasConsole=true)
void setenv(const QCString &variable, const QCString &value)
const char * commandExtension()
QCString getenv(const QCString &variable)
QCString trunc(const QCString &s, size_t numChars=15)
void replaceNamespaceAliases(QCString &name)
std::unique_ptr< NamespaceDef > createNamespaceDefAlias(const Definition *newScope, const NamespaceDef *nd)
Factory method to create an alias of an existing namespace.
std::unique_ptr< NamespaceDef > createNamespaceDef(const QCString &defFileName, int defLine, int defColumn, const QCString &name, const QCString &ref, const QCString &refFile, const QCString &type, bool isPublished)
Factory method to create new NamespaceDef instance.
NamespaceDef * getResolvedNamespace(const QCString &name)
NamespaceDef * toNamespaceDef(Definition *d)
NamespaceDefMutable * toNamespaceDefMutable(Definition *d)
NamespaceDefMutable * getResolvedNamespaceMutable(const QCString &key)
std::unordered_set< const NamespaceDef * > NamespaceDefSet
bool search(std::string_view str, Match &match, const Ex &re, size_t pos)
Search in a given string str starting at position pos for a match against regular expression re.
std::unique_ptr< PageDef > createPageDef(const QCString &f, int l, const QCString &n, const QCString &d, const QCString &t)
void setPerlModDoxyfile(const QCString &qs)
Portable versions of functions that are platform dependent.
int portable_iconv_close(void *cd)
void * portable_iconv_open(const char *tocode, const char *fromcode)
int qstricmp(const char *s1, const char *s2)
QCString substitute(const QCString &s, const QCString &src, const QCString &dst)
substitute all occurrences of src in s by dst
int qstricmp_sort(const char *str1, const char *str2)
const char * qPrint(const char *s)
uint32_t qstrlen(const char *str)
Returns the length of string str, or 0 if a null pointer is passed.
int qstrcmp(const char *str1, const char *str2)
void finalizeSearchIndexer()
static void addMemberToSearchIndex(const MemberDef *md)
void createJavaScriptSearchIndex()
void writeJavaScriptSearchIndex()
Javascript based search engine.
void addSTLSupport(std::shared_ptr< Entry > &root)
Add stub entries for the most used classes in the standard template library.
Some helper functions for std::string.
void addTerminalCharIfMissing(std::string &s, char c)
This class contains the information about the argument of a function or template.
Class that contains information about an inheritance relation.
ClassDef * classDef
Class definition that this relation inherits from.
This class stores information about an inheritance relation.
Protection prot
inheritance type
Specifier virt
virtualness
QCString name
the name of the base class
Data associated with description found in the body.
QCString groupname
name of the group
static constexpr const char * getGroupPriName(GroupPri_t priority) noexcept
@ GROUPING_INGROUP
membership in group was defined by @ingroup
GroupPri_t pri
priority of this definition
stat(const char *n, double el)
This struct is used to capture the tag file information for an Entry.
void parseTagFile(const std::shared_ptr< Entry > &root, const char *fullName)
void initTracing(const QCString &logFile, bool timing)
bool matchArguments2(const Definition *srcScope, const FileDef *srcFileScope, const QCString &srcReturnType, const ArgumentList *srcAl, const Definition *dstScope, const FileDef *dstFileScope, const QCString &dstReturnType, const ArgumentList *dstAl, bool checkCV, SrcLangExt lang)
QCString removeRedundantWhiteSpace(const QCString &s)
QCString mergeScopes(const QCString &leftScope, const QCString &rightScope)
QCString normalizeNonTemplateArgumentsInString(const QCString &name, const Definition *context, const ArgumentList &formalArgs)
SrcLangExt getLanguageFromFileName(const QCString &fileName, SrcLangExt defLang)
bool protectionLevelVisible(Protection prot)
bool matchTemplateArguments(const ArgumentList &srcAl, const ArgumentList &dstAl)
void addCodeOnlyMappings()
QCString substituteTemplateArgumentsInString(const QCString &nm, const ArgumentList &formalArgs, const ArgumentList *actualArgs)
int extractClassNameFromType(const QCString &type, int &pos, QCString &name, QCString &templSpec, SrcLangExt lang)
bool leftScopeMatch(const QCString &scope, const QCString &name)
QCString stripAnonymousNamespaceScope(const QCString &s)
QCString stripFromIncludePath(const QCString &path)
bool checkIfTypedef(const Definition *scope, const FileDef *fileScope, const QCString &n)
bool readInputFile(const QCString &fileName, std::string &contents, bool filter, bool isSourceCode)
read a file name fileName and optionally filter and transcode it
bool patternMatch(const FileInfo &fi, const StringVector &patList)
bool openOutputFile(const QCString &outFile, std::ofstream &f)
QCString tempArgListToString(const ArgumentList &al, SrcLangExt lang, bool includeDefault)
void addRefItem(const RefItemVector &sli, const QCString &key, const QCString &prefix, const QCString &name, const QCString &title, const QCString &args, const Definition *scope)
QCString showFileDefMatches(const FileNameLinkedMap *fnMap, const QCString &n)
QCString fileToString(const QCString &name, bool filter, bool isSourceCode)
QCString filterTitle(const QCString &title)
QCString removeAnonymousScopes(const QCString &str)
QCString resolveTypeDef(const Definition *context, const QCString &qualifiedName, const Definition **typedefContext)
bool checkExtension(const QCString &fName, const QCString &ext)
int computeQualifiedIndex(const QCString &name)
Return the index of the last :: in the string name that is still before the first <.
void initDefaultExtensionMapping()
bool findAndRemoveWord(QCString &sentence, const char *word)
removes occurrences of whole word from sentence, while keeps internal spaces and reducing multiple se...
QCString convertNameToFile(const QCString &name, bool allowDots, bool allowUnderscore)
QCString langToString(SrcLangExt lang)
Returns a string representation of lang.
EntryType guessSection(const QCString &name)
void extractNamespaceName(const QCString &scopeName, QCString &className, QCString &namespaceName, bool allowEmptyClass)
QCString argListToString(const ArgumentList &al, bool useCanonicalType, bool showDefVals)
QCString getLanguageSpecificSeparator(SrcLangExt lang, bool classScope)
Returns the scope separator to use given the programming language lang.
void mergeMemberOverrideOptions(MemberDefMutable *md1, MemberDefMutable *md2)
QCString mangleCSharpGenericName(const QCString &name)
QCString projectLogoFile()
void mergeArguments(ArgumentList &srcAl, ArgumentList &dstAl, bool forceNameOverwrite)
bool copyFile(const QCString &src, const QCString &dest)
Copies the contents of file with name src to the newly created file with name dest.
QCString stripTemplateSpecifiersFromScope(const QCString &fullName, bool parentOnly, QCString *pLastScopeStripped, QCString scopeName, bool allowArtificial)
QCString getOverloadDocs()
void cleanupInlineGraph()
int getPrefixIndex(const QCString &name)
bool rightScopeMatch(const QCString &scope, const QCString &name)
bool updateLanguageMapping(const QCString &extension, const QCString &language)
QCString getFileNameExtension(const QCString &fn)
QCString replaceAnonymousScopes(const QCString &s, const QCString &replacement)
FileDef * findFileDef(const FileNameLinkedMap *fnMap, const QCString &n, bool &ambig)
int getScopeFragment(const QCString &s, int p, int *l)
void addHtmlExtensionIfMissing(QCString &fName)
A bunch of utility functions.