22#include <unordered_map>
119#pragma GCC diagnostic push
120#pragma GCC diagnostic ignored "-Wshadow"
122#include <clang/Basic/Version.h>
124#pragma GCC diagnostic pop
131#if !defined(_WIN32) || defined(__CYGWIN__)
198{
"template class",
"template struct",
"class",
"struct",
"union",
"interface",
"exception" };
234 stats.emplace_back(name,0);
235 startTime = std::chrono::steady_clock::now();
239 std::chrono::steady_clock::time_point endTime = std::chrono::steady_clock::now();
240 stats.back().elapsed =
static_cast<double>(std::chrono::duration_cast<
241 std::chrono::microseconds>(endTime -
startTime).count())/1000000.0;
252 msg(
"----------------------\n");
253 for (
const auto &s :
stats)
255 msg(
"Spent {:.6f} seconds in {}",s.elapsed,s.name);
318 scope+=
"::"+pd->
name();
361 ((!includeExternal && root->
tagInfo()==
nullptr) ||
362 ( includeExternal && root->
tagInfo()!=
nullptr))
365 AUTO_TRACE(
"additional={} includeExternal={}",additional,includeExternal);
381 "group {}: ignoring title \"{}\" that does not match old title \"{}\"",
401 std::unique_ptr<GroupDef>(
408 std::unique_ptr<GroupDef>(
458 scope+=
"::"+gd->
name();
510 bool save_ambig = ambig;
521 fn = fn.
left(newIndex)+
"/"+root->
name;
524 if (!fd) ambig = save_ambig;
555 "Found non-existing group '{}' for the command '{}', ignoring command",
564 text.
sprintf(
"the name '%s' supplied as "
565 "the argument in the \\file statement ",
569 text+=
"matches the following input files:\n";
572 text+=
"Please use a more specific name by "
573 "including a (larger) part of the path!";
577 text+=
"is not an input file";
585template<
class DefMutable>
599 if (!includeFile.
isEmpty() && includeFile.
at(0)==
'"')
602 includeFile=includeFile.
mid(1,includeFile.
length()-2);
604 else if (!includeFile.
isEmpty() && includeFile.
at(0)==
'<')
607 includeFile=includeFile.
mid(1,includeFile.
length()-2);
619 text.
sprintf(
"the name '%s' supplied as "
620 "the argument of the \\class, \\struct, \\union, or \\include command ",
625 text+=
"matches the following input files:\n";
628 text+=
"Please use a more specific name by "
629 "including a (larger) part of the path!";
633 text+=
"is not an input file";
637 else if (includeFile.
isEmpty() && ifd &&
651 if (iName.
at(0)==
'<') local=
FALSE;
652 else if (iName.
at(0)==
'"') local=
TRUE;
653 if (iName.
at(0)==
'"' || iName.
at(0)==
'<')
676 cd->setIncludeFile(
nullptr,iName,local,
TRUE);
689 for (
size_t i=0;i<l;i++)
693 else if (c==
')' && round>0) round--;
694 else if (c==
'<' && round==0) count++;
699 if (c==
'>' && round==0 && count>0) count--;
722 if (idx==-1)
return prevScope;
724 if (nsName.
isEmpty())
return prevScope;
725 if (!fullScope.
isEmpty()) fullScope+=
"::";
730 if (nd==
nullptr) cd =
getClass(fullScope);
731 if (nd==
nullptr && cd)
735 else if (nd==
nullptr && cd==
nullptr && fullScope.
find(
'<')==-1)
743 "[generated]",1,1,fullScope,
761 if (prevScopeMutable)
793 int p=i1+l1,l2=0,i2=0;
801 if (resultScope==
nullptr)
812 if (resultScope!=
nullptr)
break;
871 auto alIt = tArgLists.begin();
872 while ((i=name.
find(
"::",p))!=-1 && alIt!=tArgLists.end())
888 return alIt!=tArgLists.end() ?
889 std::make_unique<ArgumentList>(*alIt) :
890 std::unique_ptr<ArgumentList>();
898 if (specifier.isStruct())
900 else if (specifier.isUnion())
902 else if (specifier.isCategory())
904 else if (specifier.isInterface())
906 else if (specifier.isProtocol())
908 else if (specifier.isException())
910 else if (specifier.isService())
912 else if (specifier.isSingleton())
915 if (section.isUnionDoc())
917 else if (section.isStructDoc())
919 else if (section.isInterfaceDoc())
921 else if (section.isProtocolDoc())
923 else if (section.isCategoryDoc())
925 else if (section.isExceptionDoc())
927 else if (section.isServiceDoc())
929 else if (section.isSingletonDoc())
950 int idx=fullName.
find(
'>');
951 if (idx!=-1 && root->
lang==SrcLangExt::CSharp)
961 qualifiedName.
prepend(scName+
"::");
967 AUTO_TRACE_ADD(
"Found class with name '{}', qualifiedName '{}'", cd ? cd->
name() : root->
name, qualifiedName);
1022 AUTO_TRACE_ADD(
"New class: fullname '{}' namespace '{}' name='{}' brief='{}' docs='{}'",
1032 if (fullName.
find(
"::")!=-1)
1039 std::unique_ptr<ArgumentList> tArgList;
1041 if ((root->
lang==SrcLangExt::CSharp || root->
lang==SrcLangExt::Java) &&
1042 (i=fullName.
find(
'<'))!=-1)
1047 if (i!=-1 && root->
lang==SrcLangExt::CSharp)
1056 fullName=fullName.
left(i);
1067 fullName,sec,tagName,refFileName,
TRUE,root->
spec.isEnum()) ));
1070 AUTO_TRACE_ADD(
"New class '{}' type={} #tArgLists={} tagInfo={} hidden={} artificial={}",
1107 AUTO_TRACE_ADD(
"Class {} not added, already exists as alias", fullName);
1115 if (!root->
spec.isForwardDecl())
1177 qualifiedName.
prepend(scName+
"::");
1183 AUTO_TRACE_ADD(
"Found concept with name '{}' (qualifiedName='{}')", cd ? cd->
name() : root->
name, qualifiedName);
1187 qualifiedName=cd->
name();
1201 AUTO_TRACE_ADD(
"New concept: fullname '{}' namespace '{}' name='{}' brief='{}' docs='{}'",
1202 qualifiedName,namespaceName,className,root->
brief,root->
doc);
1211 if (qualifiedName.
find(
"::")!=-1)
1223 qualifiedName,tagName,refFileName)));
1227 qualifiedName,root->
tArgLists.size(),fmt::ptr(tagInfo));
1258 for (
const auto &ce : root->
children())
1261 if (ce->section.isConceptDocPart())
1266 if (!ce->brief.isEmpty())
1268 cd->
addDocPart(ce->brief,ce->startLine,ce->startColumn);
1271 if (!ce->doc.isEmpty())
1273 cd->
addDocPart(ce->doc,ce->startLine,ce->startColumn);
1277 else if (ce->section.isConceptCodePart())
1279 cd->
addCodePart(ce->initializer.str(),ce->startLine,ce->startColumn);
1286 AUTO_TRACE_ADD(
"Concept '{}' not added, already exists (as alias)", qualifiedName);
1293 for (
const auto &ce : root->
children())
1295 if (ce->section.isConceptDocPart())
1315 if (root->
section.isModuleDoc())
1325 if (root->
section.isConcept())
1335 if (root->
section.isConceptDoc())
1354 if (cd!=ocd && cd->groupId()==ocd->groupId() &&
1355 !cd->partOfGroups().empty() && ocd->partOfGroups().empty())
1360 for (
const auto &gd : cd->partOfGroups())
1366 gd->addConcept(ocd.get());
1391 aliasFullName(name),aliasCd(std::move(cd)), aliasContext(ctx) {}
1393 std::unique_ptr<ClassDef> aliasCd;
1396 std::vector<ClassAlias> aliases;
1400 if (cd && visitedClasses.find(icd.get())==visitedClasses.end())
1406 name,icd->getFileDef(),
nullptr);
1432 aliases.emplace_back(aliasFullName,std::move(aliasCd),dm);
1443 visitedClasses.insert(icd.get());
1453 for (
auto &alias : aliases)
1458 alias.aliasContext->addInnerCompound(aliasCd);
1467 if (cd && visitedClasses.find(icd.get())==visitedClasses.end())
1485 "Incomplete input: scope for class {} not found!{}",name,
1486 name.
startsWith(
"std::") ?
" Try enabling BUILTIN_STL_SUPPORT." :
""
1504 if (visitedClasses.find(cd.get())==visitedClasses.end() && !cd->partOfGroups().empty())
1508 for (
auto &ncd : cd->getClasses())
1519 visitedClasses.insert(cd.get());
1530 fullName+=
"."+fieldName;
1573 for (
const auto &md : *ml)
1576 auto newMd =
createMemberDef(md->getDefFileName(),md->getDefLine(),md->getDefColumn(),
1577 md->typeString(),md->name(),md->argsString(),md->excpString(),
1578 md->protection(),md->virtualness(),md->isStatic(),Relationship::Member,
1625 for (
const auto &md : *ml)
1628 if (type.
find(
"::@")!=-1)
1634 if (type.
find(icd->name())!=-1)
1637 if (md->isAnonymous()) name =
"__unnamed" +
QCString().
setNum(pos++)+
"__";
1657 for (
const auto &pmd : *pml)
1660 if (pmdm && pmd->
name()==md->name())
1680 if (icd->name().find(
"@")==-1)
1689 candidates.push_back(cdm);
1695 std::vector<ClassDefMutable *> candidates;
1707 for (
auto &cd : candidates)
1720 (root->
section.isNamespace() ||
1721 root->
section.isNamespaceDoc() ||
1730 if (root->
section.isPackageDoc())
1794 root->
type,root->
spec.isPublished())));
1861 QCString aliasName = aliasNd->name();
1890 for (
auto &und : unl)
1894 if (usingNd!=
nullptr)
break;
1901 if (root->
section.isUsingDir())
1919 (fd==
nullptr || fd->
getLanguage()!=SrcLangExt::Java)
1933 int scopeOffset =
static_cast<int>(nsName.
length());
1944 else if ((scopeOffset=nsName.
findRev(
"::",scopeOffset-1))==-1)
1948 }
while (scopeOffset>=0 && usingNd==
nullptr);
1950 if (usingNd==
nullptr && nd)
1954 while (pnd && usingNd==
nullptr)
1971 if (usingNd==
nullptr && fd)
2044 if (root->
section.isUsingDecl() &&
2057 if (root->
section.isUsingDecl() &&
2059 (!filterPythonPackages || (root->
lang==SrcLangExt::Python && root->
fileName.
endsWith(
"__init__.py")))
2062 AUTO_TRACE(
"Found using declaration '{}' at line {} of {} inside section {}",
2092 if (nd==
nullptr) scope = fd;
2162 AUTO_TRACE(
"creating new member {} for class {}",memName,cd->
name());
2173 newMmd->setMemberClass(cd);
2191 newMmd->addSectionsToDefinition(root->
anchors);
2197 newMmd->setMemberGroupId(root->
mGrpId);
2200 newMmd->setLanguage(root->
lang);
2201 newMmd->setId(root->
id);
2210 if (root->
section.isUsingDecl() &&
2237 for (
auto &mi : *mni)
2240 if (md && md->
protection()!=Protection::Private)
2255 for (
const auto ©Cd : it->second)
2268 else if (root->
section.isUsingDecl() &&
2270 root->
lang==SrcLangExt::Cpp
2303 memName = root->
name;
2325 newMmd->setNamespace(nd);
2330 newMmd->setFileDef(fd);
2349 newMmd->addSectionsToDefinition(root->
anchors);
2355 newMmd->setMemberGroupId(root->
mGrpId);
2358 newMmd->setLanguage(root->
lang);
2359 newMmd->setId(root->
id);
2367 if (nd && aliasMd.get())
2371 if (fd && aliasMd.get())
2400 if (nd) ncdm->
moveTo(nd);
2429 aliasFullName = aliasCd->localName();
2433 aliasFullName = nd->
qualifiedName()+
"::"+aliasCd->localName();
2465 for (
const auto &fd : *fn)
2468 fd->addIncludedUsingDirectives(visitedFiles);
2490 if (lang==SrcLangExt::Java || lang==SrcLangExt::CSharp)
2495 AUTO_TRACE(
"class variable: file='{}' type='{}' scope='{}' name='{}' args='{}' prot={} mtype={} lang={} ann={} init='{}'",
2503 if (root->
spec.isAlias())
2505 if (lang==SrcLangExt::Python)
2507 def=
"type "+name+args;
2516 def=type+
" "+name+args;
2521 if (root->
spec.isAlias())
2523 if (lang==SrcLangExt::Python)
2525 def=
"type "+qualScope+scopeSeparator+name+args;
2529 def=
"using "+qualScope+scopeSeparator+name;
2534 def=type+
" "+qualScope+scopeSeparator+name+args;
2546 def=qualScope+scopeSeparator+name+args;
2557 for (
const auto &imd : *mn)
2569 if (root->
lang==SrcLangExt::ObjC &&
2570 root->
mtype==MethodTypes::Property &&
2594 prot,Specifier::Normal,root->
isStatic,related,
2598 mmd->setTagInfo(root->
tagInfo());
2599 mmd->setMemberClass(cd);
2603 mmd->setDefinition(def);
2605 mmd->addSectionsToDefinition(root->
anchors);
2606 mmd->setFromAnonymousScope(fromAnnScope);
2607 mmd->setFromAnonymousMember(fromAnnMemb);
2612 mmd->setMemberGroupId(root->
mGrpId);
2613 mmd->setMemberSpecifiers(root->
spec);
2614 mmd->setVhdlSpecifiers(root->
vhdlSpec);
2615 mmd->setReadAccessor(root->
read);
2616 mmd->setWriteAccessor(root->
write);
2618 mmd->setHidden(root->
hidden);
2620 mmd->setLanguage(root->
lang);
2621 mmd->setId(root->
id);
2624 mmd->setBodyDef(root->
fileDef());
2629 mmd->setRefItems(root->
sli);
2630 mmd->setRequirementReferences(root->
rqli);
2660 AUTO_TRACE(
"global variable: file='{}' type='{}' scope='{}' name='{}' args='{}' prot={} mtype={} lang={} init='{}'",
2672 static const reg::Ex re(R
"(\a\w*)");
2674 const std::string &typ = ttype.
str();
2696 if (scope.
find(
'@')!=-1)
return nullptr;
2712 if (root->
spec.isAlias())
2714 if (lang==SrcLangExt::Python)
2716 def=
"type "+nd->
name()+sep+name+args;
2720 def=
"using "+nd->
name()+sep+name;
2725 def=type+
" "+nd->
name()+sep+name+args;
2730 def=nd->
name()+sep+name+args;
2737 if (name.
at(0)==
'@')
2743 if (root->
spec.isAlias())
2745 if (root->
lang==SrcLangExt::Python)
2747 def=
"type "+root->
name+args;
2751 def=
"using "+root->
name;
2756 def=type+
" "+name+args;
2777 for (
const auto &imd : *mn)
2791 bool isPHPArray = md->
getLanguage()==SrcLangExt::PHP &&
2794 bool staticsInDifferentFiles =
2800 !staticsInDifferentFiles
2842 mmd->setTagInfo(root->
tagInfo());
2843 mmd->setMemberSpecifiers(root->
spec);
2844 mmd->setVhdlSpecifiers(root->
vhdlSpec);
2848 mmd->addSectionsToDefinition(root->
anchors);
2849 mmd->setFromAnonymousScope(fromAnnScope);
2850 mmd->setFromAnonymousMember(fromAnnMemb);
2853 mmd->setMemberGroupId(root->
mGrpId);
2854 mmd->setDefinition(def);
2855 mmd->setLanguage(root->
lang);
2856 mmd->setId(root->
id);
2864 mmd->setBodyDef(fd);
2869 mmd->setRefItems(root->
sli);
2870 mmd->setRequirementReferences(root->
rqli);
2873 mmd->setNamespace(nd);
2881 mmd->setFileDef(fd);
2909 if (lang == SrcLangExt::Fortran || lang == SrcLangExt::VHDL)
2914 static const reg::Ex re(R
"(\([^)]*[*&^][^)]*\))");
2916 size_t i=std::string::npos;
2920 i = match.position();
2923 if (i!=std::string::npos)
2925 size_t di = type.find(
"decltype(");
2926 if (di!=std::string::npos && di<i)
2928 i = std::string::npos;
2931 size_t bb=type.find(
'<');
2932 size_t be=type.rfind(
'>');
2933 bool templFp =
false;
2934 if (be!=std::string::npos) {
2935 size_t cc_ast = type.find(
"::*");
2936 size_t cc_amp = type.find(
"::&");
2937 templFp = (cc_ast != std::string::npos && cc_ast>be) || (cc_amp != std::string::npos && cc_amp>be);
2940 if (!type.empty() &&
2941 i!=std::string::npos &&
2942 type.find(
"operator")==std::string::npos &&
2943 (type.find(
")(")==std::string::npos || type.find(
"typedef ")!=std::string::npos) &&
2945 (!(bb<i && i<be) || templFp)
2948 if (pLength) *pLength=
static_cast<int>(l);
2951 return static_cast<int>(i);
2968 bool result =
false;
2969 bool typeIsClass =
false;
2970 bool typePtrType =
false;
3004 typePtrType = type.
find(
'*')!=-1 || type.
find(
'&')!=-1;
3007 typeIsClass = resolver.
resolveClass(ctx,type)!=
nullptr;
3009 if (!typeIsClass && (ti=type.
find(
'<'))!=-1)
3026 static const reg::Ex initChars(R
"([\d"'&*!^]+)");
3030 std::string name = a.
name.
str();
3031 if (
reg::search(name,match,initChars) && match.position()==0)
3063 std::string atype = a.
type.
str();
3064 if (
reg::search(atype,match,initChars) && match.position()==0)
3071 if (resType.empty()) resType=atype;
3072 static const reg::Ex idChars(R
"(\a\w*)");
3073 if (
reg::search(resType,match,idChars) && match.position()==0)
3075 resType=match.str();
3076 if (resType==
"int" || resType==
"long" ||
3077 resType==
"float" || resType==
"double" ||
3078 resType==
"char" || resType==
"void" ||
3079 resType==
"signed" || resType==
"unsigned" ||
3080 resType==
"const" || resType==
"volatile" )
3117 bool insideString=
FALSE;
3118 bool insideChar=
FALSE;
3120 while (e<len && brCount!=0)
3126 if (!insideString && !insideChar)
3128 if (e<len-1 && s.
at(e+1)==
'<')
3130 else if (roundCount==0)
3135 if (!insideString && !insideChar)
3137 if (e<len-1 && s.
at(e+1)==
'>')
3139 else if (roundCount==0)
3144 if (!insideString && !insideChar)
3148 if (!insideString && !insideChar)
3154 if (insideString && pc!=
'\\')
3163 if (insideChar && pc!=
'\\')
3173 return brCount==0 ?
static_cast<int>(e) : -1;
3182 AUTO_TRACE(
"VARIABLE_SEC: type='{}' name='{}' args='{}' bodyLine={} endBodyLine={} mGrpId={} relates='{}'",
3189 if (type.
isEmpty() && name.
find(
"operator")==-1 &&
3190 (name.
find(
'*')!=-1 || name.
find(
'&')!=-1))
3197 std::string sargs = args.
str();
3198 static const reg::Ex reName(R
"(\a\w*)");
3203 sargs = match.suffix().str();
3204 size_t j = sargs.find(
')');
3205 if (j!=std::string::npos) args=sargs.substr(0,j);
3215 int ai = type.
find(
'[',i);
3221 else if (type.
find(
')',i)!=-1)
3228 AUTO_TRACE_ADD(
"after correction: type='{}' name='{}' args='{}'",type,name,args);
3239 scope=name.
left(index);
3240 name=name.
mid(index+2);
3260 bool isRelated=
FALSE;
3261 bool isMemberOf=
FALSE;
3264 if (root->
lang==SrcLangExt::CSharp)
3277 for (
size_t i=0;i<name.
length()-1;i++)
3279 if (name[i]==
':' && name[i+1]==
':')
3281 p=
static_cast<int>(i);
3283 else if (name[i]==
'<')
3288 if (e!=-1) i=
static_cast<int>(e);
3294 if (type==
"friend class" || type==
"friend struct" ||
3295 type==
"friend union")
3309 Relationship::Member
3335 else if (root->
mtype==MethodTypes::Property)
3337 else if (root->
mtype==MethodTypes::Event)
3339 else if (type.
find(
"sequence<") != -1)
3341 else if (type.
find(
"dictionary<") != -1)
3347 isMemberOf=(root->
relatesType==RelatesType::MemberOf);
3365 int si=scope.
find(
'@');
3369 bool inlineSimpleStructs =
Config_getBool(INLINE_SIMPLE_STRUCTS);
3370 Relationship relationship = isMemberOf ? Relationship::Foreign :
3371 isRelated ? Relationship::Related :
3372 Relationship::Member ;
3373 if (si!=-1 && !inlineSimpleStructs)
3377 pScope = scope.
left(std::max(si-2,0));
3379 pScope.
prepend(annScopePrefix);
3380 else if (annScopePrefix.
length()>2)
3381 pScope=annScopePrefix.
left(annScopePrefix.
length()-2);
3382 if (name.
at(0)!=
'@')
3450 scope=rname.
left(index);
3451 rname=rname.
mid(index+2);
3463 for (
auto &imd : *mn)
3465 if (!imd->isTypedef())
3474 bool notBothGrouped = root->
groups.empty() || imd->getGroupDef()==
nullptr;
3475 bool bothSameScope = (!cd && !nd) || (cd && imd->getClassDef() == cd) || (nd && imd->getNamespaceDef() == nd);
3478 if (notBothGrouped && bothSameScope && imd->typeString()==rtype)
3526 for (
const auto &e : root->
children())
3527 if (!e->section.isEnum())
3544 for (
const auto &e : root->
children())
3545 if (!e->section.isEnum())
3562 for (
const auto &e : root->
children())
3563 if (!e->section.isEnum())
3578 (root->
section.isVariable() &&
3581 (root->
section.isFunction() &&
3584 (root->
section.isFunction() &&
3593 for (
const auto &e : root->
children())
3594 if (!e->section.isEnum())
3620 mmd->setTagInfo(root->
tagInfo());
3621 mmd->setMemberClass(cd);
3623 mmd->setDocsForDefinition(
false);
3627 mmd->setMemberSpecifiers(root->
spec);
3628 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3629 mmd->setMemberGroupId(root->
mGrpId);
3631 mmd->setLanguage(root->
lang);
3632 mmd->setBodyDef(fd);
3633 mmd->setFileDef(fd);
3634 mmd->addSectionsToDefinition(root->
anchors);
3636 mmd->setDefinition(def);
3640 AUTO_TRACE(
"Interface member: fileName='{}' type='{}' name='{}' mtype='{}' prot={} virt={} state={} proto={} def='{}'",
3648 root->
spec.isOptional() ? Protection::Protected : Protection::Public, Specifier::Normal);
3658 mmd->setRefItems(root->
sli);
3659 mmd->setRequirementReferences(root->
rqli);
3668 if (root->
section.isExportedInterface() || root->
section.isIncludedService())
3670 AUTO_TRACE(
"Exported interface/included service: type='{}' scope='{}' name='{}' args='{}'"
3671 " relates='{}' relatesType='{}' file='{}' line={} bodyLine={} #tArgLists={}"
3672 " mGrpId={} spec={} proto={} docFile='{}'",
3698 "Illegal member name found.");
3704 case SrcLangExt::Unknown:
3705 case SrcLangExt::IDL:
3742 if ((fd==
nullptr || fd->
getLanguage()==SrcLangExt::Cpp) &&
3744 (i=name.
find(
'<'))!=-1 &&
3745 (j=name.
find(
'>'))!=-1 &&
3746 (j!=i+2 || name.
at(i+1)!=
'=')
3764 root->
relatesType==RelatesType::MemberOf ? Relationship::Foreign :
3765 Relationship::Related ;
3775 mmd->setTagInfo(root->
tagInfo());
3776 mmd->setMemberClass(cd);
3778 mmd->setDocsForDefinition(!root->
proto);
3782 mmd->setMemberSpecifiers(spec);
3783 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3784 mmd->setMemberGroupId(root->
mGrpId);
3786 mmd->setLanguage(root->
lang);
3787 mmd->setRequiresClause(root->
req);
3788 mmd->setId(root->
id);
3789 mmd->setBodyDef(fd);
3790 mmd->setFileDef(fd);
3791 mmd->addSectionsToDefinition(root->
anchors);
3796 if (scopeSeparator!=
"::")
3798 qualScope =
substitute(qualScope,
"::",scopeSeparator);
3800 if (lang==SrcLangExt::PHP)
3803 scopeSeparator=
"::";
3820 def=type+
" "+qualScope+scopeSeparator+name;
3824 def=qualScope+scopeSeparator+name;
3828 mmd->setDefinition(def);
3832 AUTO_TRACE(
"function member: type='{}' scope='{}' name='{}' args='{}' proto={} def='{}'",
3833 type, qualScope, rname, args, root->
proto, def);
3843 mmd->setRefItems(root->
sli);
3844 mmd->setRequirementReferences(root->
rqli);
3868 mmd->setTagInfo(root->
tagInfo());
3869 mmd->setLanguage(root->
lang);
3870 mmd->setId(root->
id);
3875 mmd->setDocsForDefinition(!root->
proto);
3881 mmd->addSectionsToDefinition(root->
anchors);
3882 mmd->setMemberSpecifiers(root->
spec);
3883 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3884 mmd->setMemberGroupId(root->
mGrpId);
3885 mmd->setRequiresClause(root->
req);
3920 def=root->
type+
" "+scope+name;
3926 AUTO_TRACE(
"new non-member function type='{}' scope='{}' name='{}' args='{}' proto={} def='{}'",
3928 mmd->setDefinition(def);
3932 mmd->setRefItems(root->
sli);
3933 mmd->setRequirementReferences(root->
rqli);
3937 mmd->setNamespace(nd);
3944 mmd->setFileDef(fd);
3965 if (root->
section.isFunction())
3967 AUTO_TRACE(
"member function: type='{}' scope='{}' name='{}' args='{}' relates='{}' relatesType='{}'"
3968 " file='{}' line={} bodyLine={} #tArgLists={} mGrpId={}"
3969 " spec={} proto={} docFile='{}'",
3974 bool isFriend=root->
type==
"friend" || root->
type.
find(
"friend ")!=-1;
3984 scope=rname.
left(index);
3985 rname=rname.
mid(index+2);
3994 if (root->
lang==SrcLangExt::CSharp)
4005 int memIndex=rname.
findRev(
"::");
4008 if (cd && scope+
"::"==rname.
left(scope.
length()+2))
4014 bool isMember=
FALSE;
4017 int ts=rname.
find(
'<');
4018 int te=rname.
find(
'>');
4019 if (memIndex>0 && (ts==-1 || te==-1))
4036 isMember=memIndex<ts || memIndex>te;
4076 for (
const auto &imd : *mn)
4089 fullScope.
prepend(parentScope);
4095 if (mnd) nsName = mnd->
name();
4096 if (rnd) rnsName = rnd->
name();
4104 bool sameTemplateArgs =
TRUE;
4105 bool matchingReturnTypes =
TRUE;
4106 bool sameRequiresClause =
TRUE;
4112 matchingReturnTypes =
FALSE;
4116 sameRequiresClause =
FALSE;
4122 sameTemplateArgs =
FALSE;
4125 bool staticsInDifferentFiles =
4128 if (sameTemplateArgs &&
4129 matchingReturnTypes &&
4130 sameRequiresClause &&
4131 !staticsInDifferentFiles &&
4138 if (!root->
groups.empty() && !root->
groups.front().groupname.isEmpty())
4145 found=(mnd && rnd && nsName==rnsName) ||
4146 ((mnd==
nullptr && rnd==
nullptr && mfd!=
nullptr &&
4151 if (!found && gd && gd==md->
getGroupDef() && nsName==rnsName)
4157 AUTO_TRACE_ADD(
"combining function with prototype found={} in namespace '{}'",found,nsName);
4259 "Illegal member name found."
4277 for (
const auto &ifmd : *fn)
4281 for (
const auto &immd : *mn)
4297 AUTO_TRACE_ADD(
"Merging related global and member '{}' isFriend={} isRelated={} isFunction={}",
4374 for (
const auto &imdec : *mn)
4382 for (
const auto &imdef : *mn)
4385 if (mdef && mdec!=mdef &&
4405 for (
const auto &imd : *mn)
4421 if (mdef && mdec)
break;
4429 mdec->getOuterScope(),mdec->getFileDef(),mdec->typeString(),
const_cast<ArgumentList*
>(&mdecAl),
4436 mdec->mergeReferences(mdef);
4438 mdec->mergeReferencedBy(mdef);
4455 for (
const auto &imd : *mn)
4466 for (
const auto &irmd : *rmn)
4500 size_t i=qualifiedName.rfind(
"::");
4501 if (i!=std::string::npos)
4503 QCString scope = qualifiedName.substr(0,i);
4504 QCString name = qualifiedName.substr(i+2);
4508 for (
const auto &imd : *mn)
4534 std::map<std::string,int> templateNames;
4536 for (
const Argument &arg : templateArguments)
4538 static const reg::Ex re(R
"(\a[\w:]*)");
4541 for (; it!=
end ; ++it)
4543 const auto &match = *it;
4544 std::string n = match.str();
4545 if (n==arg.name.str())
4547 if (templateNames.find(n)==templateNames.end())
4549 templateNames.emplace(n,count);
4554 return templateNames;
4569 if (context && cd!=context)
4574 if (result==
nullptr)
4579 if (result==
nullptr)
4608 for (
auto &mi : *mni)
4618 type = typedefValue;
4637 usedClassName = typeCd->
name();
4647 if (templateNames.empty())
4651 BaseInfo bi(usedName,Protection::Public,Specifier::Normal);
4656 if (arg.name==usedName)
4660 if (usedCd==
nullptr)
4711 if (!found && !type.
isEmpty())
4770 if (templateNames.empty())
4808 AUTO_TRACE(
"Derived from template '{}' with parameters '{}' isArtificial={}",
4809 templateClass->
name(),templSpec,isArtificial);
4812 bool existingClass = templSpec==tempArgsStr;
4813 if (existingClass)
return;
4815 bool freshInstance=
FALSE;
4832 for (
auto it=it_pair.first ; it!=it_pair.second ; ++it)
4834 const Entry *templateRoot = it->second;
4835 AUTO_TRACE_ADD(
"template root found '{}' templSpec='{}'",templateRoot->
name,templSpec);
4841 isArtificial,templArgs.get(),templateNames);
4860 int ti=ttype.
find(
'<');
4866 templateClassName,
true,
true);
4867 AUTO_TRACE_ADD(
"templateClassName={} baseClass={}",templateClassName,baseClass?baseClass->
name():
"<none>");
4886 int index=n.
find(
'<');
4898 int l =
static_cast<int>(name.
length());
4904 while (count>0 && i>=0)
4909 case '>':
if (!insideQuote) count++;
break;
4910 case '<':
if (!insideQuote) count--;
break;
4911 case '\'':
if (!insideQuote) insideQuote=c;
4912 else if (insideQuote==c && (i<0 || name[i]!=
'\\')) insideQuote=0;
4914 case '"':
if (!insideQuote) insideQuote=c;
4915 else if (insideQuote==c && (i<0 || name[i]!=
'\\')) insideQuote=0;
4935 AUTO_TRACE(
"name={} base={} isArtificial={} mode={}",cd->
name(),bi->
name,isArtificial,(
int)mode);
4938 bool explicitGlobalScope=
FALSE;
4942 explicitGlobalScope=
TRUE;
4946 bool lastParent=
FALSE;
4951 int scopeOffset=explicitGlobalScope ? 0 :
static_cast<int>(scopeName.
length());
4960 baseClassName.
prepend(scopeName.
left(scopeOffset)+
"::");
4962 if (root->
lang==SrcLangExt::CSharp)
4989 || explicitGlobalScope
4992 || (root->
lang==SrcLangExt::IDL &&
4993 (root->
section.isExportedInterface() ||
4994 root->
section.isIncludedService()))
4997 AUTO_TRACE_ADD(
"class relation '{}' inherited/used by '{}' found prot={} virt={} templSpec='{}'",
4998 baseClassName, root->
name, bi->
prot, bi->
virt, templSpec);
5001 int si=baseClassName.
findRev(
"::",i);
5003 if (baseClass==
nullptr &&
static_cast<size_t>(i)!=baseClassName.
length())
5013 baseClassName = baseClassName.
left(i)+baseClassName.
right(baseClassName.
length()-e);
5024 else if (baseClass && !templSpec.
isEmpty())
5035 baseClass = templClass;
5043 if (!found && si!=-1)
5053 found=baseClass!=
nullptr && baseClass!=cd;
5063 found = baseClass!=
nullptr && baseClass!=cd;
5075 found = baseClass!=
nullptr && baseClass!=cd;
5078 bool isATemplateArgument = templateNames.find(biName.
str())!=templateNames.end();
5083 AUTO_TRACE_ADD(
"Documented base class '{}' templSpec='{}'",biName,templSpec);
5101 if (baseClassTypeDef==
nullptr)
5111 if (baseClassTypeDef)
5120 AUTO_TRACE_ADD(
"insertBaseClass name={} prot={} virt={} templSpec={}",usedName,prot,bi->
virt,templSpec);
5128 "Detected potential recursive class relation "
5129 "between class {} and base class {}!",
5136 else if (mode==
Undocumented && (scopeOffset==0 || isATemplateArgument))
5138 AUTO_TRACE_ADD(
"New undocumented base class '{}' baseClassName='{}' templSpec='{}' isArtificial={}",
5139 biName,baseClassName,templSpec,isArtificial);
5141 if (isATemplateArgument)
5144 if (baseClass==
nullptr)
5163 if (baseClass==
nullptr)
5174 si = baseClassName.
findRev(
"::");
5190 biName=
"<"+biName.
left(biName.
length()-2)+
">";
5194 AUTO_TRACE_ADD(
"insertBaseClass name={} prot={} virt={} templSpec={}",biName,bi->
prot,bi->
virt,templSpec);
5204 if (scope!=baseClass)
5230 "Detected potential recursive class relation "
5231 "between class {} and base class {}!",
5232 root->
name,baseClassName
5243 else if ((scopeOffset=scopeName.
findRev(
"::",scopeOffset-1))==-1)
5248 }
while (scopeOffset>=0);
5250 if (parentNode==
nullptr)
5256 parentNode=parentNode->
parent();
5258 }
while (lastParent);
5278 bool hasExtends = !root->
extends.empty();
5279 if (hasExtends)
return TRUE;
5303 if ((root->
lang==SrcLangExt::CSharp || root->
lang==SrcLangExt::Java) &&
5304 (i=bName.
find(
'<'))!=-1)
5308 if (root->
lang==SrcLangExt::CSharp)
5314 bName = bName.
left(i);
5346 if (i!=-1 && j!=-1 && k==-1 && root->
lang!=SrcLangExt::CSharp && root->
lang!=SrcLangExt::Java)
5379 if (!nd->hasDocumentation())
5382 nd->getLanguage() == SrcLangExt::Fortran) &&
5386 warn_undoc(nd->getDefFileName(),nd->getDefLine(),
"{} {} is not documented.",
5387 nd->getLanguage() == SrcLangExt::Fortran ?
"Module" :
"Namespace",
5451 for (
const auto &tn_kv : templateNames)
5453 size_t templIndex = tn_kv.second;
5455 bool hasActArg=
FALSE;
5456 if (templIndex<templArgs->size())
5458 actArg=templArgs->at(templIndex);
5462 baseClassNames.find(actArg.
type.
str())!=baseClassNames.end() &&
5463 actualTemplateNames.find(actArg.
type.
str())==actualTemplateNames.end()
5466 actualTemplateNames.emplace(actArg.
type.
str(),
static_cast<int>(templIndex));
5501 for (
const auto &fd : *fn)
5503 fd->computeAnchors();
5516 gd->computeAnchors();
5523template<
typename Func>
5546 for (
const auto &fd : *fn)
5619 if (md==
nullptr)
return;
5620 AUTO_TRACE(
"scope='{}' name='{}' args='{}' funcDecl='{}' mSpec={}",
5635 fullName = cd->
name();
5637 fullName = nd->
name();
5639 if (!fullName.
isEmpty()) fullName+=
"::";
5640 fullName+=md->
name();
5745 "member {} belongs to two different groups. The second one found here will be ignored.",
5783 return allowNoGroup;
5786 for (
const auto &g : root->
groups)
5788 if (g.groupname == gd->
name())
5811 AUTO_TRACE(
"namespace='{}' type='{}' name='{}' tempArg='{}' decl='{}'",namespaceName,type,name,tempArg,decl);
5825 for (
const auto &md : *mn)
5836 if (md->isAlias() && md->getOuterScope() &&
5843 nd = md->getNamespaceDef();
5848 if (nd && md->isEnumValue() && (enumNamePos=namespaceName.
findRev(
"::"))!=-1)
5850 QCString enumName = namespaceName.
mid(enumNamePos+2);
5851 if (namespaceName.
left(enumNamePos)==nd->
name())
5856 for (
const auto &emd : *enumMn)
5858 found = emd->isStrong() && md->getEnumScope()==emd.get();
5872 else if (nd==
nullptr && md->isEnumValue())
5877 for (
const auto &emd : *enumMn)
5879 found = emd->isStrong() && md->getEnumScope()==emd.get();
5902 if ((namespaceName.
isEmpty() && nd==
nullptr) ||
5903 (nd && nd->
name()==namespaceName) ||
5907 AUTO_TRACE_ADD(
"Try to add member '{}' to scope '{}'",md->name(),namespaceName);
5915 md->isVariable() || md->isTypedef() ||
5916 matchArguments2(md->getOuterScope(),md->getFileDef(),md->typeString(),&mdAl,
5923 if (matching && !root->
tArgLists.empty())
5942 if (matching && md->isStatic() &&
5943 md->getDefFileName()!=root->
fileName &&
5951 if (!md->templateArguments().empty() && !root->
tArgLists.empty())
5956 if (md->templateArguments().size()!=root->
tArgLists.back().size() ||
5957 md->typeString()!=type ||
5958 md->requiresClause()!=root->
req)
5974 if (!found && root->
relatesType!=RelatesType::Duplicate && root->
section.isFunction())
5978 QCString warnMsg =
"no matching file member found for \n"+fullFuncDecl;
5981 warnMsg+=
"\nPossible candidates:";
5982 for (
const auto &md : *mn)
5986 warnMsg+=
"' " +
warn_line(md->getDefFileName(),md->getDefLine());
5994 if (root->
type!=
"friend class" &&
5995 root->
type!=
"friend struct" &&
5996 root->
type!=
"friend union" &&
5997 root->
type!=
"friend" &&
6003 "documented symbol '{}' was not declared or defined.",
qPrint(decl)
6015 auto srcIt = srcTempArgLists.begin();
6016 auto dstIt = dstTempArgLists.begin();
6017 while (srcIt!=srcTempArgLists.end() && dstIt!=dstTempArgLists.end())
6019 if ((*srcIt).size()!=(*dstIt).size())
return TRUE;
6033 result = cd->templateArguments().hasParameters() || cd->templateMaster()!=
nullptr ||
6043 const std::string &src
6047 static const reg::Ex re(R
"(\a\w*)");
6052 for (; it!=
end ; ++it)
6054 const auto &match = *it;
6055 size_t i = match.position();
6056 size_t l = match.length();
6058 dst+=src.substr(p,i-p);
6059 std::string name=match.str();
6061 auto srcIt = srcTempArgLists.begin();
6062 auto dstIt = dstTempArgLists.begin();
6063 while (srcIt!=srcTempArgLists.end() && !found)
6066 std::vector<Argument>::const_iterator tdaIt;
6067 if (dstIt!=dstTempArgLists.end())
6070 tdaIt = tdAli->
begin();
6075 for (
auto tsaIt = tsaLi.
begin(); tsaIt!=tsaLi.
end() && !found; ++tsaIt)
6079 if (tdAli && tdaIt!=tdAli->
end())
6095 else if (tdaType.
startsWith(
"typename ")) vc=9;
6098 tdaName = tdaType.
mid(vc);
6131 auto dstIt = dst.
begin();
6136 if (dstIt == dst.
end())
6140 da.
array = dstArray;
6148 da.
array = dstArray;
6156 srcTempArgLists,dstTempArgLists,
6182 funcType,funcName,funcArgs,exceptions,
6186 mmd->setTagInfo(root->
tagInfo());
6187 mmd->setLanguage(root->
lang);
6188 mmd->setId(root->
id);
6189 mmd->makeImplementationDetail();
6190 mmd->setMemberClass(cd);
6191 mmd->setDefinition(funcDecl);
6197 mmd->setDocsForDefinition(!root->
proto);
6199 mmd->addSectionsToDefinition(root->
anchors);
6203 mmd->setMemberSpecifiers(spec);
6204 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6205 mmd->setMemberGroupId(root->
mGrpId);
6208 mmd->setRefItems(root->
sli);
6209 mmd->setRequirementReferences(root->
rqli);
6245 bool memFound=
FALSE;
6246 for (
const auto &imd : *mn)
6249 if (md==
nullptr)
continue;
6251 if (cd==
nullptr)
continue;
6268 if (!namespaceName.
isEmpty()) fullScope.
prepend(namespaceName+
"::");
6269 if (fullScope==cd->
name())
6275 for (
const auto &emd : *enumMn)
6277 memFound = emd->isStrong() && md->
getEnumScope()==emd.get();
6283 if (memFound)
break;
6288 if (memFound)
break;
6306 if (!templAl.
empty())
6308 declTemplArgs.push_back(templAl);
6316 bool substDone=
false;
6323 if (declTemplArgs.size()>0 && declTemplArgs.size()==defTemplArgs.size())
6346 AUTO_TRACE_ADD(
"matching '{}'<=>'{}' className='{}' namespaceName='{}' result={}",
6375 AUTO_TRACE_ADD(
"Comparing return types '{}'<->'{}' #args {}<->{}",
6383 else if (defTemplArgs.size()>declTemplArgs.size())
6385 AUTO_TRACE_ADD(
"Different number of template arguments {} vs {}",defTemplArgs.size(),declTemplArgs.size());
6391 bool rootIsUserDoc = root->
section.isMemberDoc();
6394 bool classOrMdIsTemplate = mdIsTemplate || classIsTemplate;
6395 bool rootIsTemplate = !root->
tArgLists.empty();
6397 if (!rootIsUserDoc &&
6398 (mdIsTemplate || rootIsTemplate) &&
6399 ((classOrMdIsTemplate && !rootIsTemplate) || (!classOrMdIsTemplate && rootIsTemplate))
6404 AUTO_TRACE_ADD(
"Comparing return types: template v.s. non-template");
6408 AUTO_TRACE_ADD(
"Match results of matchArguments2='{}' substDone='{}'",matching,substDone);
6419 if (!funcTempList.
isEmpty() &&
6439 else if (cd && cd!=tcd)
6445 if (memFound)
break;
6449 addLocalObjCMethod(root,scopeName,funcType,funcName,funcArgs,exceptions,funcDecl,spec);
6452 if (count==0 && !(isFriend && funcType==
"class"))
6455 const ClassDef *ecd =
nullptr, *ucd =
nullptr;
6456 MemberDef *emd =
nullptr, *umd =
nullptr;
6458 for (
const auto &md : *mn)
6480 AUTO_TRACE_ADD(
"new candidate className='{}' scope='{}' args='{}': exact match",
6481 className,ccd->
name(),md->argsString());
6487 AUTO_TRACE_ADD(
"new candidate className='{}' scope='{}' args='{}': no match",
6488 className,ccd->
name(),md->argsString());
6493 bool strictProtoMatching =
Config_getBool(STRICT_PROTO_MATCHING);
6494 if (!strictProtoMatching)
6496 if (candidates==1 && ucd && umd)
6503 else if (candidates>1 && ecd && emd)
6514 if (noMatchCount>1) warnMsg+=
"uniquely ";
6515 warnMsg+=
"matching class member found for \n";
6519 warnMsg+=
" template ";
6528 warnMsg+=fullFuncDecl;
6530 if (candidates>0 || noMatchCount>=1)
6532 warnMsg+=
"\nPossible candidates:";
6538 for (
const auto &md : *mn)
6540 const ClassDef *cd=md->getClassDef();
6554 warnMsg+=
"template ";
6559 if (!md->typeString().isEmpty())
6561 warnMsg+=md->typeString();
6566 warnMsg+=qScope+
"::"+md->name();
6567 warnMsg+=md->argsString();
6568 warnMsg+=
"' " +
warn_line(md->getDefFileName(),md->getDefLine());
6589 AUTO_TRACE(
"funcType={} funcName={} funcArgs={} funcDecl={} spec={}",funcType,funcName,funcArgs,funcDecl,spec);
6591 for (
const auto &md : *mn)
6593 if (md->getClassDef()==cd)
6605 funcType,funcName,funcArgs,exceptions,
6611 mmd->setTagInfo(root->
tagInfo());
6612 mmd->setLanguage(root->
lang);
6613 mmd->setId(root->
id);
6614 mmd->setMemberClass(cd);
6615 mmd->setTemplateSpecialization(
TRUE);
6617 mmd->setDefinition(funcDecl);
6623 mmd->setDocsForDefinition(!root->
proto);
6625 mmd->addSectionsToDefinition(root->
anchors);
6629 mmd->setMemberSpecifiers(spec);
6630 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6631 mmd->setMemberGroupId(root->
mGrpId);
6633 mmd->setRefItems(root->
sli);
6634 mmd->setRequirementReferences(root->
rqli);
6648 bool sameClass=
false;
6653 [](
const auto &md1,
const auto &md2)
6654 { return md1->getClassDef()->name()==md2->getClassDef()->name(); });
6660 if (cd==
nullptr)
return;
6668 std::unique_ptr<ArgumentList> tArgList =
6673 funcType,funcName,funcArgs,exceptions,
6677 mmd->setTagInfo(root->
tagInfo());
6678 mmd->setLanguage(root->
lang);
6679 mmd->setId(root->
id);
6681 mmd->setMemberClass(cd);
6682 mmd->setDefinition(funcDecl);
6691 mmd->setDocsForDefinition(!root->
proto);
6693 mmd->addSectionsToDefinition(root->
anchors);
6697 mmd->setMemberSpecifiers(spec);
6698 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6699 mmd->setMemberGroupId(root->
mGrpId);
6702 mmd->setRefItems(root->
sli);
6703 mmd->setRequirementReferences(root->
rqli);
6761 AUTO_TRACE(
"root='{}' funcDecl='{}' related='{}' overload={} isFunc={} mGrpId={} #tArgList={} spec={} lang={}",
6774 bool isRelated=
false;
6775 bool isMemberOf=
false;
6776 bool isFriend=
false;
6789 spec.setInline(
true);
6794 spec.setExplicit(
true);
6799 spec.setMutable(
true);
6804 spec.setThreadLocal(
true);
6815 while ((sep=funcDecl.
find(
';'))!=-1)
6821 if (!funcDecl.
isEmpty() && funcDecl[0]!=
' ') funcDecl.
prepend(
" ");
6833 if (isFriend && funcDecl.
startsWith(
"class "))
6837 funcName = funcDecl;
6839 else if (isFriend && funcDecl.
startsWith(
"struct "))
6842 funcName = funcDecl;
6848 funcArgs,funcTempList,exceptions
6856 AUTO_TRACE_ADD(
"scopeName='{}' className='{}' namespaceName='{}' funcType='{}' funcName='{}' funcArgs='{}'",
6857 scopeName,className,namespaceName,funcType,funcName,funcArgs);
6861 isMemberOf=(root->
relatesType == RelatesType::MemberOf);
6868 scopeName = relates;
6881 scopeName = joinedName;
6895 QCString joinedName = fnd->name()+
"::"+scopeName;
6898 scopeName=joinedName;
6925 AUTO_TRACE_ADD(
"scopeName='{}' className='{}' namespaceName='{}'",scopeName,className,namespaceName);
6934 scopeName=namespaceName;
6936 else if (!relates.
isEmpty() ||
6939 scopeName=namespaceName+
"::"+className;
6943 scopeName=className;
6946 else if (!className.
isEmpty())
6948 scopeName=className;
6958 uint32_t argListIndex=0;
6963 tempScopeName=scopeName+funcSpec;
6971 if (!scopeName.
isEmpty() && !isRelated && !isFriend && !
Config_getBool(HIDE_SCOPE_NAMES) && root->
lang!=SrcLangExt::Python)
6977 funcDecl=funcType+
" "+tempScopeName+
"::"+funcName+funcTempList;
6981 funcDecl=funcType+
" "+tempScopeName+
"::"+funcName+funcArgs;
6988 funcDecl=tempScopeName+
"::"+funcName+funcTempList;
6992 funcDecl=tempScopeName+
"::"+funcName+funcArgs;
7002 funcDecl=funcType+
" "+funcName+funcTempList;
7006 funcDecl=funcType+
" "+funcName+funcArgs;
7013 funcDecl=funcName+funcTempList;
7017 funcDecl=funcName+funcArgs;
7022 if (funcType==
"template class" && !funcTempList.
isEmpty())
7025 AUTO_TRACE_ADD(
"Parse results: namespaceName='{}' className=`{}` funcType='{}' funcSpec='{}' "
7026 " funcName='{}' funcArgs='{}' funcTempList='{}' funcDecl='{}' relates='{}'"
7027 " exceptions='{}' isRelated={} isMemberOf={} isFriend={} isFunc={}",
7028 namespaceName, className, funcType, funcSpec,
7029 funcName, funcArgs, funcTempList, funcDecl, relates,
7030 exceptions, isRelated, isMemberOf, isFriend, isFunc);
7036 bool strongEnum =
false;
7040 for (
const auto &imd : *mn)
7053 namespaceName+=
"::"+className;
7057 namespaceName=className;
7065 funcName =
substitute(funcName,className+
"::",
"");
7076 if (!isRelated && !strongEnum && mn)
7084 funcArgs,funcTempList,exceptions,
7085 type,args,isFriend,spec,relates,funcDecl,overloaded,isFunc);
7097 else if (overloaded)
7099 addOverloaded(root,mn,funcType,funcName,funcArgs,funcDecl,exceptions,spec);
7103 if (!
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec))
7108 "Cannot determine class for function\n{}",
7114 else if (isRelated && !relates.
isEmpty())
7116 AUTO_TRACE_ADD(
"related function scopeName='{}' className='{}'",scopeName,className);
7117 if (className.
isEmpty()) className=relates;
7121 bool newMember=
TRUE;
7127 for (
const auto &imd : *mn)
7161 mn->
push_back(std::move(mdDefineTaken));
7175 for (
const auto &irmd : *mn)
7196 addMemberDocs(root,rmd_found,funcDecl,
nullptr,overloaded,spec);
7204 switch (root->
mtype)
7225 funcType,funcName,funcArgs,exceptions,
7228 isMemberOf ? Relationship::Foreign : Relationship::Related,
7248 mmd->setDefinitionTemplateParameterLists(root->
tArgLists);
7250 mmd->setTagInfo(root->
tagInfo());
7264 for (
const auto &irmd : *rmn)
7295 mmd->setBodyDef(fd);
7302 mmd->setMemberClass(cd);
7303 mmd->setMemberSpecifiers(spec);
7304 mmd->setVhdlSpecifiers(root->
vhdlSpec);
7305 mmd->setDefinition(funcDecl);
7310 mmd->setDocsForDefinition(!root->
proto);
7313 mmd->addSectionsToDefinition(root->
anchors);
7314 mmd->setMemberGroupId(root->
mGrpId);
7315 mmd->setLanguage(root->
lang);
7316 mmd->setId(root->
id);
7320 mmd->setRefItems(root->
sli);
7321 mmd->setRequirementReferences(root->
rqli);
7322 if (root->
relatesType==RelatesType::Duplicate) mmd->setRelatedAlso(cd);
7330 if (!
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec))
7335 "Cannot determine file/namespace for relatedalso function\n{}",
7349 addLocalObjCMethod(root,scopeName,funcType,funcName,funcArgs,exceptions,funcDecl,spec);
7353 bool globMem =
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec);
7354 if (className.
isEmpty() && !globMem)
7358 else if (!className.
isEmpty() && !globMem)
7361 "member '{}' of class '{}' cannot be found",
7362 funcName,className);
7380 AUTO_TRACE(
"root->type='{}' root->inside='{}' root->name='{}' root->args='{}' section={} root->spec={} root->mGrpId={}",
7395 type=type.
left(i+l);
7406 if (root->
section.isMemberDoc())
7432 else if (root->
section.isOverloadDoc())
7446 (root->
section.isVariable() &&
7458 if (type==
"friend class" || type==
"friend struct" ||
7459 type==
"friend union")
7465 type+
" "+root->
name,
7498 else if (root->
section.isVariableDoc())
7510 else if (root->
section.isExportedInterface() ||
7511 root->
section.isIncludedService())
7517 type +
" " + root->
name,
7530 if (root->
section.isMemberDoc() ||
7531 root->
section.isOverloadDoc() ||
7534 root->
section.isVariableDoc() ||
7536 root->
section.isIncludedService() ||
7537 root->
section.isExportedInterface()
7547 for (
const auto &e : root->
children())
7549 if (!e->section.isEnum())
7561 for (
const auto &objCImpl : root->
children())
7563 if (objCImpl->section.isObjcImpl())
7565 for (
const auto &objCMethod : objCImpl->children())
7567 if (objCMethod->section.isFunction())
7571 objCMethod->relates,
7574 objCMethod->type+
" "+objCImpl->name+
"::"+objCMethod->name+
" "+objCMethod->args,
7576 objCMethod->section=EntryType::makeEmpty();
7595 bool isGlobal =
false;
7596 bool isRelated =
false;
7597 bool isMemberOf =
false;
7607 if (root->
lang==SrcLangExt::CSharp)
7630 isMemberOf=(root->
relatesType==RelatesType::MemberOf);
7665 isMemberOf ? Relationship::Foreign : isRelated ? Relationship::Related : Relationship::Member,
7669 mmd->setTagInfo(root->
tagInfo());
7670 mmd->setLanguage(root->
lang);
7671 mmd->setId(root->
id);
7672 if (!isGlobal) mmd->setMemberClass(cd);
else mmd->setFileDef(fd);
7674 mmd->setBodyDef(root->
fileDef());
7675 mmd->setMemberSpecifiers(root->
spec);
7676 mmd->setVhdlSpecifiers(root->
vhdlSpec);
7677 mmd->setEnumBaseType(root->
args);
7680 mmd->addSectionsToDefinition(root->
anchors);
7681 mmd->setMemberGroupId(root->
mGrpId);
7685 mmd->setRefItems(root->
sli);
7686 mmd->setRequirementReferences(root->
rqli);
7700 mmd->setDefinition(name+baseType);
7704 mmd->setDefinition(nd->
name()+
"::"+name+baseType);
7708 mmd->setNamespace(nd);
7715 if (isGlobal && (nd==
nullptr || !nd->
isAnonymous()))
7717 if (!defSet) mmd->setDefinition(name+baseType);
7718 if (fd==
nullptr && root->
parent())
7724 mmd->setFileDef(fd);
7732 mmd->setDefinition(name+baseType);
7736 mmd->setDefinition(cd->
name()+
"::"+name+baseType);
7742 mmd->setDocsForDefinition(!root->
proto);
7772 bool isGlobal =
false;
7773 bool isRelated =
false;
7783 if (root->
lang==SrcLangExt::CSharp)
7798 if (root->
lang==SrcLangExt::CSharp)
7844 struct EnumValueInfo
7846 EnumValueInfo(
const QCString &n,std::unique_ptr<MemberDef> &&md) :
7847 name(n), member(std::move(md)) {}
7849 std::unique_ptr<MemberDef> member;
7851 std::vector< EnumValueInfo > extraMembers;
7853 for (
const auto &imd : *mn)
7860 for (
const auto &e : root->
children())
7863 bool isJavaLike = sle==SrcLangExt::CSharp || sle==SrcLangExt::Java || sle==SrcLangExt::XML;
7864 if ( isJavaLike || root->
spec.isStrong())
7866 if (sle == SrcLangExt::Cpp && e->section.isDefine())
continue;
7873 i = qualifiedName.
findRev(
"::");
7874 if (i!=-1 && sle==SrcLangExt::CSharp)
7880 qualifiedName=
substitute(qualifiedName,
"::",
".");
7885 if (fileName.
isEmpty() && e->tagInfo())
7887 fileName = e->tagInfo()->tagName;
7891 fileName,e->startLine,e->startColumn,
7892 e->type,e->name,e->args,
QCString(),
7893 e->protection, Specifier::Normal,e->isStatic,Relationship::Member,
7900 fmmd->setNamespace(mnd);
7904 fmmd->setTagInfo(e->tagInfo());
7905 fmmd->setLanguage(e->lang);
7906 fmmd->setBodySegment(e->startLine,e->bodyLine,e->endBodyLine);
7907 fmmd->setBodyDef(e->fileDef());
7909 fmmd->setDocumentation(e->doc,e->docFile,e->docLine);
7910 fmmd->setBriefDescription(e->brief,e->briefFile,e->briefLine);
7911 fmmd->addSectionsToDefinition(e->anchors);
7912 fmmd->setInitializer(e->initializer.str());
7913 fmmd->setMaxInitLines(e->initLines);
7914 fmmd->setMemberGroupId(e->mGrpId);
7915 fmmd->setExplicitExternal(e->explicitExternal,fileName,e->startLine,e->startColumn);
7916 fmmd->setRefItems(e->sli);
7917 fmmd->setRequirementReferences(e->rqli);
7920 fmmd->setEnumScope(md,
TRUE);
7921 extraMembers.emplace_back(e->name,std::move(fmd));
7930 if (!e->name.isEmpty() && (fmn=emnsd->
find(e->name)))
7933 for (
const auto &ifmd : *fmn)
7964 else if (isRelated && cd)
7996 for (
auto &e : extraMembers)
8042 if (gd==
nullptr && !root->
groups.empty())
8056 for (
const auto &g : root->
groups)
8075 "Found non-existing group '{}' for the command '{}', ignoring command",
8089 if (root->
section.isEnumDoc() &&
8115 AUTO_TRACE(
"Found docs for enum with name '{}' and scope '{}' in context '{}' cd='{}', nd='{}' fd='{}'",
8129 for (
const auto &imd : *mn)
8144 else if (cd==
nullptr && mcd==
nullptr && nd!=
nullptr && mnd==nd)
8151 else if (cd==
nullptr && nd==
nullptr && mcd==
nullptr && mnd==
nullptr && fd==mfd)
8176 for (
const auto &mn : mnsd)
8179 for (
const auto &imd : *mn)
8184 int documentedEnumValues=0;
8188 if (fmd->isLinkableInProject()) documentedEnumValues++;
8214 for (
const auto &md : *mn)
8216 index.addClassMemberNameToIndex(md.get());
8217 if (md->getModuleDef())
8219 index.addModuleMemberNameToIndex(md.get());
8227 for (
const auto &md : *mn)
8229 if (md->getNamespaceDef())
8231 index.addNamespaceMemberNameToIndex(md.get());
8235 index.addFileMemberNameToIndex(md.get());
8237 if (md->getModuleDef())
8239 index.addModuleMemberNameToIndex(md.get());
8244 index.sortMemberIndexLists();
8253 if (cd->isLinkableInProject())
8266 if (cd->isLinkableInProject())
8279 if (nd->isLinkableInProject())
8292 for (
const auto &fd : *fn)
8308 std::string s = title.str();
8309 static const reg::Ex re(R
"(\a[\w-]*)");
8312 for (; it!=
end ; ++it)
8314 const auto &match = *it;
8315 std::string matchStr = match.str();
8323 if (gd->isLinkableInProject())
8325 addWordsForTitle(gd.get(),gd->anchor(),gd->groupTitle());
8331 if (pd->isLinkableInProject())
8333 addWordsForTitle(pd.get(),pd->anchor(),pd->title());
8353 if (md->getClassDef())
8357 if (md->getNamespaceDef())
8368 if (md->getGroupDef()) scope = md->getGroupDef();
8369 else if (md->getClassDef()) scope = md->getClassDef();
8370 else if (md->getNamespaceDef()) scope = md->getNamespaceDef();
8371 else if (md->getFileDef()) scope = md->getFileDef();
8377 if (md->isLinkableInProject())
8379 if (!(md->isEnumerate() && md->isAnonymous()))
8384 if (md->isEnumerate())
8386 for (
const auto &fmd : md->enumFieldList())
8399 for (
const auto &md : *mn)
8401 addMemberToIndices(md.get());
8408 for (
const auto &md : *mn)
8410 addMemberToIndices(md.get());
8423 for (
const auto &imd : *mn)
8436 for (
const auto &imd : *mn)
8453 for (
const auto &imd : *mn)
8462 const auto &bmni = bmn.
find(mn->memberName());
8465 for (
const auto &ibmd : *bmni)
8473 lang==SrcLangExt::Python ||
8474 lang==SrcLangExt::Java ||
8475 lang==SrcLangExt::PHP ||
8486 lang==SrcLangExt::Python ||
8493 if (lang==SrcLangExt::Python && md->
name().
startsWith(
"__"))
continue;
8533 if (cd->isLinkable())
8535 for (
const auto &bcd : cd->baseClasses())
8551 for (
const auto &ti : cd->getTemplateInstances())
8570 int i=cd->name().find(
'(');
8577 AUTO_TRACE_ADD(
"merging members of category {} into {}",cd->name(),baseClass->
name());
8592 cd->subClasses().empty() &&
8593 !cd->baseClasses().empty())
8624 msg(
"Generating code for file {}...\n",fd->
docName());
8629 else if (parseSources)
8631 msg(
"Parsing code for file {}...\n",fd->
docName());
8647 for (
const auto &fd : *fn)
8655 for (
const auto &fd : *fn)
8664 clangParser->parse();
8665 processSourceFile(fd.get(),*
g_outputList,clangParser.get());
8667 for (
auto incFile : clangParser->filesInSameTU())
8669 if (filesToProcess.find(incFile)!=filesToProcess.end() &&
8671 processedFiles.
find(incFile)==processedFiles.end())
8678 processSourceFile(ifd,*
g_outputList,clangParser.get());
8679 processedFiles.insert(incFile);
8690 for (
const auto &fd : *fn)
8692 if (processedFiles.find(fd->
absFilePath().
str())==processedFiles.end())
8697 clangParser->parse();
8698 processSourceFile(fd.get(),*
g_outputList,clangParser.get());
8711 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8714 msg(
"Generating code files using {} threads.\n",numThreads);
8715 struct SourceContext
8718 : fd(fd_), generateSourceFile(gen_), ol(ol_) {}
8720 bool generateSourceFile;
8724 std::vector< std::future< std::shared_ptr<SourceContext> > > results;
8727 for (
const auto &fd : *fn)
8730 auto ctx = std::make_shared<SourceContext>(fd.get(),generateSourceFile,*
g_outputList);
8731 auto processFile = [ctx]()
8733 if (ctx->generateSourceFile)
8735 msg(
"Generating code for file {}...\n",ctx->fd->docName());
8739 msg(
"Parsing code for file {}...\n",ctx->fd->docName());
8742 ctx->fd->getAllIncludeFilesRecursively(filesInSameTu);
8743 if (ctx->generateSourceFile)
8745 ctx->fd->writeSourceHeader(ctx->ol);
8746 ctx->fd->writeSourceBody(ctx->ol,
nullptr);
8747 ctx->fd->writeSourceFooter(ctx->ol);
8752 ctx->fd->parseSource(
nullptr);
8756 results.emplace_back(threadPool.
queue(processFile));
8759 for (
auto &f : results)
8768 for (
const auto &fd : *fn)
8788 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8794 : fd(fd_), ol(ol_) {}
8799 std::vector< std::future< std::shared_ptr<DocContext> > > results;
8802 for (
const auto &fd : *fn)
8804 bool doc = fd->isLinkableInProject();
8807 auto ctx = std::make_shared<DocContext>(fd.get(),*
g_outputList);
8808 auto processFile = [ctx]() {
8809 msg(
"Generating docs for file {}...\n",ctx->fd->docName());
8810 ctx->fd->writeDocumentation(ctx->ol);
8813 results.emplace_back(threadPool.
queue(processFile));
8817 for (
auto &f : results)
8826 for (
const auto &fd : *fn)
8828 bool doc = fd->isLinkableInProject();
8831 msg(
"Generating docs for file {}...\n",fd->docName());
8850 const_cast<FileDef*
>(fd)->addSourceRef(cd->getStartDefLine(),cd.get(),
nullptr);
8859 const_cast<FileDef*
>(fd)->addSourceRef(cd->getStartDefLine(),cd.get(),
nullptr);
8868 const_cast<FileDef*
>(fd)->addSourceRef(nd->getStartDefLine(),nd.get(),
nullptr);
8875 for (
const auto &md : *mn)
8884 md->isLinkableInProject() &&
8890 const_cast<FileDef*
>(fd)->addSourceRef(md->getStartDefLine(),md->getOuterScope(),md.get());
8896 for (
const auto &md : *mn)
8906 md->isLinkableInProject() &&
8912 const_cast<FileDef*
>(fd)->addSourceRef(md->getStartDefLine(),md->getOuterScope(),md.get());
8929 for (
const auto &def : it->second)
8932 def.fileName,def.lineNr,def.columnNr,
8933 "#define",def.name,def.args,
QCString(),
8938 if (!def.args.isEmpty())
8942 mmd->setInitializer(def.definition);
8943 mmd->setFileDef(def.fileDef);
8944 mmd->setDefinition(
"#define "+def.name);
8949 const MemberList *defMl = def.fileDef->getMemberList(MemberListType::DocDefineMembers());
8958 def.fileDef->insertMember(md.get());
8960 AUTO_TRACE_ADD(
"adding macro {} with definition {}",def.name,def.definition);
8994 for (
const auto &fd : *fn)
8996 fd->sortMemberLists();
9003 gd->sortMemberLists();
9020 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
9024 std::vector < std::future< void > > results;
9028 for (
const auto &def : symList)
9031 if (dm && !
isSymbolHidden(def) && !def->isArtificial() && def->isLinkableInProject())
9033 auto processTooltip = [dm]() {
9036 results.emplace_back(threadPool.
queue(processTooltip));
9041 for (
auto &f : results)
9050 for (
const auto &def : symList)
9053 if (dm && !
isSymbolHidden(def) && !def->isArtificial() && def->isLinkableInProject())
9100 for (
const auto &fd : *fn)
9122 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
9128 : cd(cd_), ol(ol_) {}
9133 std::vector< std::future< std::shared_ptr<DocContext> > > results;
9134 for (
const auto &cd : classList)
9137 if (cd->getOuterScope()==
nullptr ||
9141 auto ctx = std::make_shared<DocContext>(cd,*
g_outputList);
9142 auto processFile = [ctx]()
9144 msg(
"Generating docs for compound {}...\n",ctx->cd->displayName());
9148 if (!ctx->cd->isHidden() && !ctx->cd->isEmbeddedInOuterScope() &&
9149 ctx->cd->isLinkableInProject() && !ctx->cd->isImplicitTemplateInstance())
9151 ctx->cd->writeDocumentation(ctx->ol);
9152 ctx->cd->writeMemberList(ctx->ol);
9156 ctx->cd->writeDocumentationForInnerClasses(ctx->ol);
9159 results.emplace_back(threadPool.
queue(processFile));
9162 for (
auto &f : results)
9169 for (
const auto &cd : classList)
9173 if (cd->getOuterScope()==
nullptr ||
9179 if ( !cd->isHidden() && !cd->isEmbeddedInOuterScope() &&
9180 cd->isLinkableInProject() && !cd->isImplicitTemplateInstance())
9182 msg(
"Generating docs for compound {}...\n",cd->displayName());
9197 for (
const auto &innerCdi : cd->
getClasses())
9202 AUTO_TRACE(
"innerCd={} isLinkable={} isImplicitTemplateInstance={} protectLevelVisible={} embeddedInOuterScope={}",
9211 list.push_back(innerCd);
9219 std::vector<ClassDefMutable*> classList;
9268 for (
const auto &imd : *mn)
9304 for (
const auto &fd : *fn)
9306 fd->combineUsingRelations();
9338 for (
const auto &fd : *fn)
9340 fd->addMembersToMemberGroup();
9355 gd->addMembersToMemberGroup();
9376 for (
const auto &fd : *fn)
9378 fd->distributeMemberGroupDocumentation();
9393 gd->distributeMemberGroupDocumentation();
9423 for (
const auto &fd : *fn)
9425 fd->findSectionsInDocumentation();
9440 gd->findSectionsInDocumentation();
9445 pd->findSectionsInDocumentation();
9450 dd->findSectionsInDocumentation();
9473 for (
const auto &ifmd : *fn)
9487 for (
const auto &imd : *nm)
9518 for (
const auto &imd : *nm)
9538 return fd->absFilePath() == root->
fileName;
9586 mmd->setTagInfo(root->
tagInfo());
9587 mmd->setLanguage(root->
lang);
9599 for (
const auto &md : *mn)
9605 for (
const auto &imd : *mn)
9623 for (
const auto &imd : *mn)
9650 warn(root->
fileName,root->
startLine,
"found documented #define {} but ignoring it because ENABLE_PREPROCESSING is NO.", root->
name);
9664 normalizedName =
substitute(normalizedName,
"\\",
"/");
9667 if (root->
docFile==normalizedName)
9669 int lastSlashPos=normalizedName.
findRev(
'/');
9670 if (lastSlashPos!=-1)
9672 normalizedName=normalizedName.
left(lastSlashPos);
9675 if (normalizedName.
at(normalizedName.
length()-1)!=
'/')
9677 normalizedName+=
'/';
9679 DirDef *matchingDir=
nullptr;
9683 if (dir->name().right(normalizedName.
length())==normalizedName)
9688 "\\dir command matches multiple directories.\n"
9689 " Applying the command for directory {}\n"
9690 " Ignoring the command for directory {}",
9691 matchingDir->
name(),dir->name()
9696 matchingDir=dir.get();
9713 warn(root->
fileName,root->
startLine,
"No matching directory found for command \\dir {}",normalizedName);
9722 if (root->
section.isRequirementDoc())
9734 if (root->
section.isPageDoc())
9741 else if (root->
section.isMainpageDoc())
9761 if (root->
section.isMainpageDoc())
9794 else if (si->
lineNr() != -1)
9796 warn(root->
fileName,root->
startLine,
"multiple use of section label '{}' for main page, (first occurrence: {}, line {})",
9801 warn(root->
fileName,root->
startLine,
"multiple use of section label '{}' for main page, (first occurrence: {})",
9818 else if (root->
tagInfo()==
nullptr)
9821 "found more than one \\mainpage comment block! (first occurrence: {}, line {}), Skipping current block!",
9831 if (root->
section.isMainpageDoc())
9855 term(
"page defined {} with label {} is a direct "
9856 "subpage of itself! Please remove this cyclic dependency.\n",
9880 term(
"page defined {} with label {} is a subpage "
9881 "of itself! Please remove this cyclic dependency.\n",
9882 warn_line(pd->docFile(),pd->docLine()),pd->name());
9908 if (si->label().left(label.
length())==label)
9910 si->setFileName(rl->listName());
9911 si->setGenerated(
TRUE);
9917 if (!si->generated())
9921 if (!si->fileName().isEmpty() &&
9928 if (si->definition())
9935 gd = (
toMemberDef(si->definition()))->getGroupDef();
9965 if (!pd->getGroupDef() && !pd->isReference())
9967 msg(
"Generating docs for page {}...\n",pd->name());
9982 warn(root->
fileName,root->
startLine,
"Example {} was already documented. Ignoring documentation found here.",root->
name);
10010 indentStr.
fill(
' ',indent);
10012 indentStr.
isEmpty()?
"":indentStr,
10017 for (
const auto &e : root->
children())
10035 si->label(),si->fileName(),si->title(),si->type().level(),si->ref());
10049 msg(
"Generating docs for example {}...\n",pd->name());
10051 if (lang != SrcLangExt::Unknown)
10055 intf->resetCodeParserState();
10057 QCString n=pd->getOutputFileBase();
10064 if (pd->showLineNo())
10066 lineNoOptStr=
"{lineno}";
10072 (pd->briefDescription().isEmpty()?
"":pd->briefDescription()+
"\n\n")+
10073 pd->documentation()+
"\n\n\\include"+lineNoOptStr+
" "+pd->name(),
10075 .setIndexWords(
true)
10076 .setExample(pd->name()));
10089 if (!gd->isReference())
10101 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10107 : cdm(cdm_), ol(ol_) {}
10112 std::vector< std::future< std::shared_ptr<DocContext> > > results;
10114 for (
const auto &cd : classList)
10119 auto ctx = std::make_shared<DocContext>(cdm,*
g_outputList);
10120 auto processFile = [ctx]()
10122 if ( ( ctx->cdm->isLinkableInProject() &&
10123 !ctx->cdm->isImplicitTemplateInstance()
10126 && !ctx->cdm->isHidden() && !ctx->cdm->isEmbeddedInOuterScope()
10129 msg(
"Generating docs for compound {}...\n",ctx->cdm->displayName());
10130 ctx->cdm->writeDocumentation(ctx->ol);
10131 ctx->cdm->writeMemberList(ctx->ol);
10133 ctx->cdm->writeDocumentationForInnerClasses(ctx->ol);
10136 results.emplace_back(threadPool.
queue(processFile));
10140 for (
auto &f : results)
10142 auto ctx = f.get();
10148 for (
const auto &cd : classList)
10153 if ( ( cd->isLinkableInProject() &&
10154 !cd->isImplicitTemplateInstance()
10157 && !cd->isHidden() && !cd->isEmbeddedInOuterScope()
10160 msg(
"Generating docs for compound {}...\n",cd->displayName());
10174 for (
const auto &cd : conceptList)
10179 msg(
"Generating docs for concept {}...\n",cd->name());
10194 if (nd->isLinkableInProject())
10199 msg(
"Generating docs for namespace {}\n",nd->displayName());
10237 QCString cmd=qhgLocation+
" -v 2>&1";
10242 err(
"could not execute {}\n",qhgLocation);
10246 const size_t bufSize = 1024;
10247 char inBuf[bufSize+1];
10248 size_t numRead=fread(inBuf,1,bufSize,f);
10249 inBuf[numRead] =
'\0';
10254 static const reg::Ex versionReg(R
"(Qt (\d+)\.(\d+)\.(\d+))");
10256 std::string s = inBuf;
10263 if (qtVersion>0 && (qtVersion<60000 || qtVersion >= 60205))
10272 err(
"could not execute {}\n",qhgLocation);
10276 std::string output;
10277 while ((numRead=fread(inBuf,1,bufSize,f))>0)
10279 inBuf[numRead] =
'\0';
10311 warn_uncond(
"the dot tool could not be found as '{}'\n",dotPath);
10317 size_t l=dotPath.
length();
10318 for (
size_t i=0;i<l;i++)
if (dotPath.
at(i)==
'/') dotPath.
at(i)=
'\\';
10337 bool updateOnly=
FALSE)
10341 bool writeToStdout=configFile==
"-";
10346 if (!writeToStdout)
10350 msg(
"\n\nConfiguration file '{}' created.\n\n",configFile);
10351 msg(
"Now edit the configuration file and enter\n\n");
10352 if (configFile!=
"Doxyfile" && configFile!=
"doxyfile")
10353 msg(
" doxygen {}\n\n",configFile);
10355 msg(
" doxygen\n\n");
10356 msg(
"to generate the documentation for your project\n\n");
10360 msg(
"\n\nConfiguration file '{}' updated.\n\n",configFile);
10366 term(
"Cannot open file {} for writing\n",configFile);
10381 term(
"Cannot open stdout for writing\n");
10392 int eqPos = tagLine.
find(
'=');
10402 fileName = tagLine;
10408 err(
"Tag file '{}' does not exist or is not a file. Skipping it...\n",fileName);
10419 msg(
"Reading tag file '{}', location '{}'...\n",fileName,destName);
10423 msg(
"Reading tag file '{}'...\n",fileName);
10433 for (
const auto &sheet : latexExtraStyleSheet)
10435 std::string fileName = sheet;
10436 if (!fileName.empty())
10441 err(
"Style sheet '{}' specified by LATEX_EXTRA_STYLESHEET does not exist!\n",fileName);
10443 else if (fi.
isDir())
10445 err(
"Style sheet '{}' specified by LATEX_EXTRA_STYLESHEET is a directory, it has to be a file!\n", fileName);
10464 if (!htmlStyleSheet.
isEmpty())
10471 err(
"Style sheet '{}' specified by HTML_STYLESHEET does not exist!\n",htmlStyleSheet);
10474 else if (fi.
isDir())
10476 err(
"Style sheet '{}' specified by HTML_STYLESHEET is a directory, it has to be a file!\n",htmlStyleSheet);
10482 copyFile(htmlStyleSheet,destFileName);
10487 for (
const auto &sheet : htmlExtraStyleSheet)
10495 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET does not exist!\n",fileName);
10499 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET is already a built-in stylesheet. Please use a different name\n",fi.
fileName());
10501 else if (fi.
isDir())
10503 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET is a directory, it has to be a file!\n",fileName);
10522 err(
"Project logo '{}' specified by PROJECT_LOGO does not exist!\n",projectLogo);
10525 else if (fi.
isDir())
10527 err(
"Project logo '{}' specified by PROJECT_LOGO is a directory, it has to be a file!\n",projectLogo);
10533 copyFile(projectLogo,destFileName);
10547 err(
"Project icon '{}' specified by PROJECT_ICON does not exist!\n",projectIcon);
10550 else if (fi.
isDir())
10552 err(
"Project icon '{}' specified by PROJECT_ICON is a directory, it has to be a file!\n",projectIcon);
10558 copyFile(projectIcon,destFileName);
10566 for (
const auto &fileName : files)
10568 if (!fileName.empty())
10573 err(
"Extra file '{}' specified in {} does not exist!\n", fileName,filesOption);
10575 else if (fi.
isDir())
10577 err(
"Extra file '{}' specified in {} is a directory, it has to be a file!\n", fileName,filesOption);
10603 std::vector<FileEntry> fileEntries;
10604 for (
const auto &fd : *fn)
10606 if (!fd->isReference())
10608 fileEntries.emplace_back(fd->getPath(),fd.get());
10612 size_t size = fileEntries.size();
10616 FileDef *fd = fileEntries[0].fileDef;
10622 std::stable_sort(fileEntries.begin(),
10624 [](
const FileEntry &fe1,
const FileEntry &fe2)
10625 { return qstricmp_sort(fe1.path,fe2.path)<0; }
10630 const FileEntry &first = fileEntries[0];
10631 const FileEntry &last = fileEntries[size-1];
10632 int first_path_size =
static_cast<int>(first.path.size())-1;
10633 int last_path_size =
static_cast<int>(last.path.size())-1;
10636 for (i=0;i<first_path_size && i<last_path_size;i++)
10638 if (first.path[i]==
'/') j=i;
10639 if (first.path[i]!=last.path[i])
break;
10641 if (i==first_path_size && i<last_path_size && last.path[i]==
'/')
10646 else if (i==last_path_size && i<first_path_size && first.path[i]==
'/')
10653 for (
auto &fileEntry : fileEntries)
10655 QCString prefix = fileEntry.path.right(fileEntry.path.length()-j-1);
10656 fileEntry.fileDef->setName(
prefix+fn->fileName());
10658 fileEntry.fileDef->setDiskName(
prefix+fn->fileName());
10672 int sep = fileName.
findRev(
'/');
10673 int ei = fileName.
findRev(
'.');
10674 if (ei!=-1 && (sep==-1 || ei>sep))
10680 extension =
".no_extension";
10693 int ei = fileName.
findRev(
'.');
10700 extension =
".no_extension";
10704 std::string preBuf;
10711 for (
const auto &s : includePath)
10717 msg(
"Preprocessing {}...\n",fn);
10724 msg(
"Reading {}...\n",fn);
10729 std::string convBuf;
10730 convBuf.reserve(preBuf.size()+1024);
10735 std::shared_ptr<Entry> fileRoot = std::make_shared<Entry>();
10739 if (newTU) clangParser->
parse();
10742 parser.
parseInput(fileName,convBuf.
data(),fileRoot,clangParser);
10743 fileRoot->setFileDef(fd);
10760 filesToProcess.insert(s);
10763 std::mutex processedFilesLock;
10765 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10766 msg(
"Processing input using {} threads.\n",numThreads);
10768 using FutureType = std::vector< std::shared_ptr<Entry> >;
10769 std::vector< std::future< FutureType > > results;
10772 bool ambig =
false;
10779 auto processFile = [qs,&filesToProcess,&processedFilesLock,&processedFiles]() {
10780 bool ambig_l =
false;
10781 std::vector< std::shared_ptr<Entry> > roots;
10785 auto fileRoot {
parseFile(*parser.get(),fd_l,qs,clangParser.get(),
true) };
10786 roots.push_back(fileRoot);
10790 for (
auto incFile : clangParser->filesInSameTU())
10793 if (filesToProcess.find(incFile)!=filesToProcess.end())
10795 bool needsToBeProcessed =
false;
10797 std::lock_guard<std::mutex> lock(processedFilesLock);
10798 needsToBeProcessed = processedFiles.find(incFile)==processedFiles.end();
10799 if (needsToBeProcessed) processedFiles.insert(incFile);
10801 if (qincFile!=qs && needsToBeProcessed)
10807 fileRoot =
parseFile(*parser.get(),ifd,qincFile,clangParser.get(),
false);
10808 roots.push_back(fileRoot);
10816 results.emplace_back(threadPool.
queue(processFile));
10820 for (
auto &f : results)
10825 root->moveToSubEntryAndKeep(e);
10832 if (processedFiles.find(s)==processedFiles.end())
10835 auto processFile = [s]() {
10836 bool ambig =
false;
10838 std::vector< std::shared_ptr<Entry> > roots;
10845 auto fileRoot =
parseFile(*parser.get(),fd,qs,clangParser.get(),
true);
10846 roots.push_back(fileRoot);
10850 auto fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
10851 roots.push_back(fileRoot);
10855 results.emplace_back(threadPool.
queue(processFile));
10859 for (
auto &f : results)
10864 root->moveToSubEntryAndKeep(e);
10871 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10872 msg(
"Processing input using {} threads.\n",numThreads);
10874 using FutureType = std::shared_ptr<Entry>;
10875 std::vector< std::future< FutureType > > results;
10879 auto processFile = [s]() {
10880 bool ambig =
false;
10884 auto fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
10888 results.emplace_back(threadPool.
queue(processFile));
10891 for (
auto &f : results)
10893 root->moveToSubEntryAndKeep(f.get());
10911 filesToProcess.insert(s);
10917 bool ambig =
false;
10925 auto fileRoot =
parseFile(*parser.get(),fd,qs,clangParser.get(),
true);
10926 root->moveToSubEntryAndKeep(fileRoot);
10927 processedFiles.insert(s);
10931 for (
auto incFile : clangParser->filesInSameTU())
10934 if (filesToProcess.find(incFile)!=filesToProcess.end() &&
10935 processedFiles.find(incFile)==processedFiles.end())
10941 fileRoot =
parseFile(*parser.get(),ifd,incFile,clangParser.get(),
false);
10942 root->moveToSubEntryAndKeep(fileRoot);
10943 processedFiles.insert(incFile);
10952 if (processedFiles.find(s)==processedFiles.end())
10954 bool ambig =
false;
10961 auto fileRoot =
parseFile(*parser.get(),fd,qs,clangParser.get(),
true);
10962 root->moveToSubEntryAndKeep(fileRoot);
10967 std::shared_ptr<Entry> fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
10968 root->moveToSubEntryAndKeep(fileRoot);
10970 processedFiles.insert(s);
10979 bool ambig =
false;
10984 std::shared_ptr<Entry> fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
10985 root->moveToSubEntryAndKeep(std::move(fileRoot));
11005 sepPos = result.
find(
'/',2);
11007 sepPos = result.
find(
'/',sepPos+1);
11009 sepPos = result.
find(
'/',sepPos+1);
11012 if (nonSymlinks.find(
prefix.str())==nonSymlinks.end())
11029 target+=result.
mid(sepPos);
11032 if (known.find(result.
str())!=known.end())
return std::string();
11033 known.insert(result.
str());
11046 nonSymlinks.insert(
prefix.str());
11052 while (sepPos!=-1);
11071 bool errorIfNotExist,
11078 if (paths && !dirName.empty())
11080 paths->insert(dirName);
11086 if (dirName.empty())
11101 msg(
"Searching for files in directory {}\n", fi->
absFilePath());
11106 for (
const auto &dirEntry : dir.
iterator())
11109 auto checkPatterns = [&]() ->
bool
11111 return (patList==
nullptr ||
patternMatch(cfi,*patList)) &&
11112 (exclPatList==
nullptr || !
patternMatch(cfi,*exclPatList)) &&
11113 (killSet==
nullptr || killSet->find(cfi.
absFilePath())==killSet->end());
11116 if (exclSet==
nullptr || exclSet->find(cfi.
absFilePath())==exclSet->end())
11124 if (errorIfNotExist && checkPatterns())
11129 else if (cfi.
isFile() && checkPatterns())
11132 std::string path=cfi.
dirPath()+
"/";
11133 std::string fullName=path+name;
11140 fn = fnMap->
add(name,fullName);
11141 fn->push_back(std::move(fd));
11144 dirResultList.push_back(fullName);
11145 if (resultSet) resultSet->insert(fullName);
11146 if (killSet) killSet->insert(fullName);
11148 else if (recursive &&
11150 (exclPatList==
nullptr || !
patternMatch(cfi,*exclPatList)) &&
11155 patList,exclPatList,&dirResultList,resultSet,errorIfNotExist,
11156 recursive,killSet,paths);
11160 if (resultList && !dirResultList.empty())
11163 std::stable_sort(dirResultList.begin(),
11164 dirResultList.end(),
11165 [](
const auto &f1,
const auto &f2) { return qstricmp_sort(f1.c_str(),f2.c_str())<0; });
11168 resultList->insert(resultList->end(), dirResultList.begin(), dirResultList.end());
11185 bool errorIfNotExist,
11199 if (exclSet==
nullptr || exclSet->find(fi.
absFilePath())==exclSet->end())
11206 if (errorIfNotExist)
11208 warn_uncond(
"source '{}' is not a readable file or directory... skipping.\n",s);
11213 std::string dirPath = fi.
dirPath(
true);
11215 if (paths && !dirPath.empty())
11217 paths->insert(dirPath);
11220 if (killSet==
nullptr || killSet->find(filePath)==killSet->end())
11229 fn->push_back(std::move(fd));
11232 if (resultList || resultSet)
11234 if (resultList) resultList->push_back(filePath);
11235 if (resultSet) resultSet->insert(filePath);
11241 else if (fi.
isDir())
11243 readDir(&fi,fnMap,exclSet,patList,
11244 exclPatList,resultList,resultSet,errorIfNotExist,
11245 recursive,killSet,paths);
11259 anchor=
":"+md->
anchor();
11268 t <<
"REPLACE INTO symbols (symbol_id,scope_id,name,file,line) VALUES('"
11269 << fn+anchor <<
"','"
11271 << d->
name() <<
"','"
11285 for (
const auto &def : symList)
11297 msg(
"Developer parameters:\n");
11298 msg(
" -m dump symbol map\n");
11299 msg(
" -b making messages output unbuffered\n");
11300 msg(
" -c <file> process input file as a comment block and produce HTML output\n");
11302 msg(
" -t [<file|stdout|stderr>] trace debug info to file, stdout, or stderr (default file stdout)\n");
11303 msg(
" -t_time [<file|stdout|stderr>] trace debug info to file, stdout, or stderr (default file stdout),\n"
11304 " and include time and thread information\n");
11306 msg(
" -d <level> enable a debug level, such as (multiple invocations of -d are possible):\n");
11317 QCString versionString = getFullVersion();
11318 msg(
"{}\n",versionString);
11322 if (!extVers.
isEmpty()) extVers+=
", ";
11323 extVers +=
"sqlite3 ";
11324 extVers += sqlite3_libversion();
11326 if (!extVers.
isEmpty()) extVers+=
", ";
11327 extVers +=
"clang support ";
11328 extVers += CLANG_VERSION_STRING;
11332 int lastComma = extVers.
findRev(
',');
11333 if (lastComma != -1) extVers = extVers.
replace(lastComma,1,
" and");
11334 msg(
" with {}.\n",extVers);
11345 msg(
"Doxygen version {0}\nCopyright Dimitri van Heesch 1997-2025\n\n"
11346 "You can use Doxygen in a number of ways:\n\n"
11347 "1) Use Doxygen to generate a template configuration file*:\n"
11348 " {1} [-s] -g [configName]\n\n"
11349 "2) Use Doxygen to update an old configuration file*:\n"
11350 " {1} [-s] -u [configName]\n\n"
11351 "3) Use Doxygen to generate documentation using an existing "
11352 "configuration file*:\n"
11353 " {1} [configName]\n\n"
11354 "4) Use Doxygen to generate a template file controlling the layout of the\n"
11355 " generated documentation:\n"
11356 " {1} -l [layoutFileName]\n\n"
11357 " In case layoutFileName is omitted DoxygenLayout.xml will be used as filename.\n"
11358 " If - is used for layoutFileName Doxygen will write to standard output.\n\n"
11359 "5) Use Doxygen to generate a template style sheet file for RTF, HTML or Latex.\n"
11360 " RTF: {1} -w rtf styleSheetFile\n"
11361 " HTML: {1} -w html headerFile footerFile styleSheetFile [configFile]\n"
11362 " LaTeX: {1} -w latex headerFile footerFile styleSheetFile [configFile]\n\n"
11363 "6) Use Doxygen to generate a rtf extensions file\n"
11364 " {1} -e rtf extensionsFile\n\n"
11365 " If - is used for extensionsFile Doxygen will write to standard output.\n\n"
11366 "7) Use Doxygen to compare the used configuration file with the template configuration file\n"
11367 " {1} -x [configFile]\n\n"
11368 " Use Doxygen to compare the used configuration file with the template configuration file\n"
11369 " without replacing the environment variables or CMake type replacement variables\n"
11370 " {1} -x_noenv [configFile]\n\n"
11371 "8) Use Doxygen to show a list of built-in emojis.\n"
11372 " {1} -f emoji outputFileName\n\n"
11373 " If - is used for outputFileName Doxygen will write to standard output.\n\n"
11374 "*) If -s is specified the comments of the configuration items in the config file will be omitted.\n"
11375 " If configName is omitted 'Doxyfile' will be used as a default.\n"
11376 " If - is used for configFile Doxygen will write / read the configuration to /from standard output / input.\n\n"
11377 "If -q is used for a Doxygen documentation run, Doxygen will see this as if QUIET=YES has been set.\n\n"
11378 "-v print version string, -V print extended version information\n"
11379 "-h,-? prints usage help information\n"
11380 "{1} -d prints additional usage flags for debugging purposes\n",versionString,name);
11387static const char *
getArg(
int argc,
char **argv,
int &optInd)
11390 if (
qstrlen(&argv[optInd][2])>0)
11391 s=&argv[optInd][2];
11392 else if (optInd+1<argc && argv[optInd+1][0]!=
'-')
11411 return []() {
return std::make_unique<T>(); };
11419 std::setlocale(LC_ALL,
"");
11420 std::setlocale(LC_CTYPE,
"C");
11421 std::setlocale(LC_NUMERIC,
"C");
11517 QCString versionString = getFullVersion();
11520 auto writeFile = [](
const char *fileName,std::function<void(
TextStream&)> func) ->
bool
11540 bool genConfig=
false;
11541 bool shortList=
false;
11542 bool traceTiming=
false;
11544 bool updateConfig=
false;
11545 bool quiet =
false;
11546 while (optInd<argc && argv[optInd][0]==
'-' &&
11547 (isalpha(argv[optInd][1]) || argv[optInd][1]==
'?' ||
11548 argv[optInd][1]==
'-')
11551 switch(argv[optInd][1])
11561 if (optInd+1>=argc)
11563 layoutName=
"DoxygenLayout.xml";
11567 layoutName=argv[optInd+1];
11575 if (optInd+1>=argc)
11577 msg(
"option \"-c\" is missing the file name to read\n");
11602 msg(
"option \"-d\" has unknown debug specifier: \"{}\".\n",debugLabel);
11612 if (!strcmp(argv[optInd]+1,
"t_time"))
11614 traceTiming =
true;
11616 else if (!strcmp(argv[optInd]+1,
"t"))
11618 traceTiming =
false;
11622 err(
"option should be \"-t\" or \"-t_time\", found: \"{}\".\n",argv[optInd]);
11626 if (optInd+1>=argc || argv[optInd+1][0] ==
'-')
11628 traceName=
"stdout";
11632 traceName=argv[optInd+1];
11636 err(
"support for option \"-t\" has not been compiled in (use a debug build or a release build with tracing enabled).\n");
11647 err(
"option should be \"-x\" or \"-x_noenv\", found: \"{}\".\n",argv[optInd]);
11663 err(
"option \"-e\" is missing format specifier rtf.\n");
11669 if (optInd+1>=argc)
11671 err(
"option \"-e rtf\" is missing an extensions file name\n");
11679 err(
"option \"-e\" has invalid format specifier.\n");
11689 err(
"option \"-f\" is missing list specifier.\n");
11695 if (optInd+1>=argc)
11697 err(
"option \"-f emoji\" is missing an output file name\n");
11705 err(
"option \"-f\" has invalid list specifier.\n");
11715 err(
"option \"-w\" is missing format specifier rtf, html or latex\n");
11721 if (optInd+1>=argc)
11723 err(
"option \"-w rtf\" is missing a style sheet file name\n");
11729 err(
"error opening RTF style sheet file {}!\n",argv[optInd+1]);
11739 if (optInd+4<argc ||
FileInfo(
"Doxyfile").exists() ||
FileInfo(
"doxyfile").exists())
11745 err(
"error opening or reading configuration file {}!\n",argv[optInd+4]);
11750 if (optInd+3>=argc)
11752 err(
"option \"-w html\" does not have enough arguments\n");
11769 if (optInd+4<argc ||
FileInfo(
"Doxyfile").exists() ||
FileInfo(
"doxyfile").exists())
11774 err(
"error opening or reading configuration file {}!\n",argv[optInd+4]);
11779 if (optInd+3>=argc)
11781 err(
"option \"-w latex\" does not have enough arguments\n");
11797 err(
"Illegal format specifier \"{}\": should be one of rtf, html or latex\n",formatName);
11817 if (
qstrcmp(&argv[optInd][2],
"help")==0)
11819 usage(argv[0],versionString);
11822 else if (
qstrcmp(&argv[optInd][2],
"version")==0)
11828 else if ((
qstrcmp(&argv[optInd][2],
"Version")==0) ||
11829 (
qstrcmp(&argv[optInd][2],
"VERSION")==0))
11837 err(
"Unknown option \"-{}\"\n",&argv[optInd][1]);
11838 usage(argv[0],versionString);
11843 setvbuf(stdout,
nullptr,_IONBF,0);
11850 usage(argv[0],versionString);
11854 err(
"Unknown option \"-{:c}\"\n",argv[optInd][1]);
11855 usage(argv[0],versionString);
11866 TRACE(
"Doxygen version used: {}",getFullVersion());
11869 FileInfo configFileInfo1(
"Doxyfile"),configFileInfo2(
"doxyfile");
11872 if (configFileInfo1.exists())
11874 configName=
"Doxyfile";
11876 else if (configFileInfo2.
exists())
11878 configName=
"doxyfile";
11880 else if (genConfig)
11882 configName=
"Doxyfile";
11886 err(
"Doxyfile not found and no input file specified!\n");
11887 usage(argv[0],versionString);
11894 if (fi.
exists() ||
qstrcmp(argv[optInd],
"-")==0 || genConfig)
11896 configName=argv[optInd];
11900 err(
"configuration file {} not found!\n",argv[optInd]);
11901 usage(argv[0],versionString);
11915 err(
"could not open or read configuration file {}!\n",configName);
11986 for (
const auto &mapping : extMaps)
11989 int i=mapStr.
find(
'=');
12005 err(
"Failed to map file extension '{}' to unsupported language '{}'.\n"
12006 "Check the EXTENSION_MAPPING setting in the config file.\n",
12011 msg(
"Adding custom extension mapping: '{}' will be treated as language '{}'\n",
12020 if (cd==
reinterpret_cast<void *
>(-1))
12022 term(
"unsupported character conversion: '{}'->'UTF-8': {}\n"
12023 "Check the 'INPUT_ENCODING' setting in the config file!\n",
12033 for (
const auto &mapping : fileEncod)
12036 int i=mapStr.
find(
'=');
12050 if (cd==
reinterpret_cast<void *
>(-1))
12052 term(
"unsupported character conversion: '{}'->'UTF-8': {}\n"
12053 "Check the 'INPUT_FILE_ENCODING' setting in the config file!\n",
12054 encoding,strerror(errno));
12067 for (
const auto &s : expandAsDefinedList)
12085 signal(SIGINT,SIG_DFL);
12087 msg(
"Cleaning up...\n");
12102 if (generateTagFile.
isEmpty())
return;
12107 err(
"cannot open tag file {} for writing\n", generateTagFile);
12111 tagFile <<
"<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>\n";
12112 tagFile <<
"<tagfile doxygen_version=\"" << getDoxygenVersion() <<
"\"";
12113 std::string gitVersion = getGitVersion();
12114 if (!gitVersion.empty())
12116 tagFile <<
" doxygen_gitid=\"" << gitVersion <<
"\"";
12123 for (
const auto &fd : *fn)
12125 if (fd->isLinkableInProject()) fd->writeTagFile(tagFile);
12158 if (gd->isLinkableInProject()) gd->writeTagFile(tagFile);
12163 if (mod->isLinkableInProject()) mod->writeTagFile(tagFile);
12168 if (pd->isLinkableInProject()) pd->writeTagFile(tagFile);
12175 if (dd->isLinkableInProject()) dd->writeTagFile(tagFile);
12179 tagFile <<
"</tagfile>\n";
12187 msg(
"Exiting...\n");
12197 const char *defaultDirName)
12202 result = baseDirName + defaultDirName;
12204 else if (formatDirName[0]!=
'/' && (formatDirName.
length()==1 || formatDirName[1]!=
':'))
12206 result.
prepend(baseDirName+
"/");
12208 Dir formatDir(result.
str());
12211 term(
"Could not create output directory {}\n", result);
12225 g_s.begin(
"Searching for include files...\n");
12228 for (
const auto &s : includePathList)
12246 g_s.begin(
"Searching for example files...\n");
12249 for (
const auto &s : examplePathList)
12264 g_s.begin(
"Searching for images...\n");
12267 for (
const auto &s : imagePathList)
12282 g_s.begin(
"Searching for dot files...\n");
12285 for (
const auto &s : dotFileList)
12300 g_s.begin(
"Searching for msc files...\n");
12303 for (
const auto &s : mscFileList)
12318 g_s.begin(
"Searching for dia files...\n");
12321 for (
const auto &s : diaFileList)
12336 g_s.begin(
"Searching for plantuml files...\n");
12339 for (
const auto &s : plantUmlFileList)
12354 g_s.begin(
"Searching for files to exclude\n");
12356 for (
const auto &s : excludeList)
12374 g_s.begin(
"Searching INPUT for files to process...\n");
12378 for (
const auto &s : inputList)
12381 size_t l = path.
length();
12385 if (path.
at(l-1)==
'\\' || path.
at(l-1)==
'/') path=path.
left(l-1);
12405 [](
const auto &f1,
const auto &f2)
12411 if (fileName->size()>1)
12413 std::stable_sort(fileName->begin(),fileName->end(),[](
const auto &f1,
const auto &f2)
12415 return qstricmp_sort(f1->absFilePath(),f2->absFilePath())<0;
12421 warn_uncond(
"No files to be processed, please check your settings, in particular INPUT, FILE_PATTERNS, and RECURSIVE\n");
12432 if (mdfileAsMainPage.
isEmpty())
return;
12436 warn_uncond(
"Specified markdown mainpage '{}' does not exist\n",mdfileAsMainPage);
12439 bool ambig =
false;
12442 warn_uncond(
"Specified markdown mainpage '{}' has not been defined as input file\n",mdfileAsMainPage);
12461 QCString versionString = getFullVersion();
12462 msg(
"Doxygen version used: {}\n",versionString);
12472 if (outputDirectory.
isEmpty())
12478 Dir dir(outputDirectory.
str());
12482 if (!dir.
mkdir(outputDirectory.
str()))
12484 term(
"tag OUTPUT_DIRECTORY: Output directory '{}' does not "
12485 "exist and cannot be created\n",outputDirectory);
12489 msg(
"Notice: Output directory '{}' does not exist. "
12490 "I have created it for you.\n", outputDirectory);
12538 bool generateSitemap = !sitemapUrl.
isEmpty();
12539 if (generateSitemap && !sitemapUrl.
endsWith(
"/"))
12546 bool generateEclipseHelp =
Config_getBool(GENERATE_ECLIPSEHELP);
12560 if (generateDocbook)
12607 newFontPath+=curFontPath;
12623 bool defaultLayoutUsed =
FALSE;
12624 if (layoutFileName.
isEmpty())
12627 defaultLayoutUsed =
TRUE;
12629 AUTO_TRACE_ADD(
"defaultLayoutUsed={}, layoutFileName={}",defaultLayoutUsed,layoutFileName);
12634 msg(
"Parsing layout file {}...\n",layoutFileName);
12637 else if (!defaultLayoutUsed)
12639 warn_uncond(
"failed to open layout file '{}' for reading! Using default settings.\n",layoutFileName);
12649 if (generateHtml) exclPatterns.push_back(htmlOutput.
str());
12650 if (generateDocbook) exclPatterns.push_back(docbookOutput.
str());
12651 if (generateXml) exclPatterns.push_back(xmlOutput.
str());
12652 if (generateLatex) exclPatterns.push_back(latexOutput.
str());
12653 if (generateRtf) exclPatterns.push_back(rtfOutput.
str());
12654 if (generateMan) exclPatterns.push_back(manOutput.
str());
12674 if (generateDocbook)
12685 std::shared_ptr<Entry> root = std::make_shared<Entry>();
12689 msg(
"Reading and parsing tag files\n");
12691 for (
const auto &s : tagFileList)
12703 g_s.begin(
"Parsing files\n");
12743 g_s.begin(
"Building macro definition list...\n");
12747 g_s.begin(
"Building group list...\n");
12752 g_s.begin(
"Building directory list...\n");
12757 g_s.begin(
"Building namespace list...\n");
12762 g_s.begin(
"Building file list...\n");
12766 g_s.begin(
"Building class list...\n");
12770 g_s.begin(
"Building concept list...\n");
12778 g_s.begin(
"Computing nesting relations for classes...\n");
12791 g_s.begin(
"Associating documentation with classes...\n");
12795 g_s.begin(
"Associating documentation with concepts...\n");
12800 g_s.begin(
"Associating documentation with modules...\n");
12804 g_s.begin(
"Building example list...\n");
12808 g_s.begin(
"Searching for enumerations...\n");
12816 g_s.begin(
"Searching for documented typedefs...\n");
12822 g_s.begin(
"Searching for documented sequences...\n");
12826 g_s.begin(
"Searching for documented dictionaries...\n");
12831 g_s.begin(
"Searching for members imported via using declarations...\n");
12838 g_s.begin(
"Searching for included using directives...\n");
12842 g_s.begin(
"Searching for documented variables...\n");
12846 g_s.begin(
"Building interface member list...\n");
12849 g_s.begin(
"Building member list...\n");
12853 g_s.begin(
"Searching for friends...\n");
12857 g_s.begin(
"Searching for documented defines...\n");
12861 g_s.begin(
"Computing class inheritance relations...\n");
12866 g_s.begin(
"Computing class usage relations...\n");
12872 g_s.begin(
"Searching for tag less structs...\n");
12877 g_s.begin(
"Flushing cached template relations that have become invalid...\n");
12881 g_s.begin(
"Warn for undocumented namespaces...\n");
12885 g_s.begin(
"Computing class relations...\n");
12896 g_s.begin(
"Add enum values to enums...\n");
12901 g_s.begin(
"Searching for member function documentation...\n");
12913 g_s.begin(
"Creating members for template instances...\n");
12917 g_s.begin(
"Building page list...\n");
12921 g_s.begin(
"Building requirements list...\n");
12925 g_s.begin(
"Search for main page...\n");
12930 g_s.begin(
"Computing page relations...\n");
12935 g_s.begin(
"Determining the scope of groups...\n");
12939 g_s.begin(
"Computing module relations...\n");
12941 mm.resolvePartitions();
12942 mm.resolveImports();
12943 mm.collectExportedSymbols();
12962 return i==0 ?
qstricmp_sort(c1->name(), c2->name())<0 : i<0;
12976 g_s.begin(
"Sorting lists...\n");
12997 g_s.begin(
"Determining which enums are documented\n");
13001 g_s.begin(
"Computing member relations...\n");
13006 g_s.begin(
"Building full member lists recursively...\n");
13010 g_s.begin(
"Adding members to member groups.\n");
13016 g_s.begin(
"Distributing member group documentation.\n");
13021 g_s.begin(
"Computing member references...\n");
13027 g_s.begin(
"Inheriting documentation...\n");
13035 g_s.begin(
"Generating disk names...\n");
13039 g_s.begin(
"Adding source references...\n");
13043 g_s.begin(
"Adding xrefitems...\n");
13048 g_s.begin(
"Adding requirements...\n");
13053 g_s.begin(
"Sorting member lists...\n");
13057 g_s.begin(
"Setting anonymous enum type...\n");
13061 g_s.begin(
"Computing dependencies between directories...\n");
13065 g_s.begin(
"Generating citations page...\n");
13069 g_s.begin(
"Counting members...\n");
13073 g_s.begin(
"Counting data structures...\n");
13077 g_s.begin(
"Resolving user defined references...\n");
13081 g_s.begin(
"Finding anchors and sections in the documentation...\n");
13085 g_s.begin(
"Transferring function references...\n");
13089 g_s.begin(
"Combining using relations...\n");
13094 g_s.begin(
"Adding members to index pages...\n");
13099 g_s.begin(
"Correcting members for VHDL...\n");
13103 g_s.begin(
"Computing tooltip texts...\n");
13111 [](
const auto &g1,
const auto &g2)
13112 {
return g1->groupTitle() < g2->groupTitle(); });
13116 gd->sortSubGroups();
13160 if (generateDocbook)
13180 err(
"USE_HTAGS is YES but htags(1) failed. \n");
13182 err(
"htags(1) ended normally but failed to load the filemap. \n");
13189 g_s.begin(
"Generating style sheet...\n");
13197 g_s.begin(
"Generating search indices...\n");
13198 if (searchEngine && !serverBasedSearch && generateHtml)
13206 if (generateHtml && searchEngine)
13209 Dir searchDir(searchDirName.
str());
13210 if (!searchDir.
exists() && !searchDir.
mkdir(searchDirName.
str()))
13212 term(
"Could not create search results directory '{}' $PWD='{}'\n",
13216 if (!serverBasedSearch)
13238 if (generateDocbook)
13254 g_s.begin(
"Generating images for formulas in HTML...\n");
13261 g_s.begin(
"Generating images for formulas in RTF...\n");
13268 g_s.begin(
"Generating images for formulas in Docbook...\n");
13273 g_s.begin(
"Generating example documentation...\n");
13277 g_s.begin(
"Generating file sources...\n");
13281 g_s.begin(
"Generating file documentation...\n");
13285 g_s.begin(
"Generating page documentation...\n");
13289 g_s.begin(
"Generating group documentation...\n");
13293 g_s.begin(
"Generating class documentation...\n");
13297 g_s.begin(
"Generating concept documentation...\n");
13301 g_s.begin(
"Generating module documentation...\n");
13305 g_s.begin(
"Generating namespace documentation...\n");
13311 g_s.begin(
"Generating graph info page...\n");
13316 g_s.begin(
"Generating directory documentation...\n");
13325 g_s.begin(
"finalizing index lists...\n");
13329 g_s.begin(
"writing tag file...\n");
13335 g_s.begin(
"Generating XML output...\n");
13343 g_s.begin(
"Generating SQLITE3 output...\n");
13350 g_s.begin(
"Generating AutoGen DEF output...\n");
13356 g_s.begin(
"Generating Perl module output...\n");
13360 if (generateHtml && searchEngine && serverBasedSearch)
13362 g_s.begin(
"Generating search index\n");
13372 if (searchDataFile.
isEmpty())
13374 searchDataFile=
"searchdata.xml";
13387 g_s.begin(
"Combining RTF output...\n");
13390 err(
"An error occurred during post-processing the RTF files!\n");
13395 g_s.begin(
"Running plantuml with JAVA...\n");
13401 g_s.begin(
"Running dot...\n");
13406 if (generateHtml &&
13410 g_s.begin(
"Running html help compiler...\n");
13415 if ( generateHtml &&
13419 g_s.begin(
"Running qhelpgenerator...\n");
13432 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
13433 if (numThreads<1) numThreads=1;
13434 msg(
"Total elapsed time: {:.6f} seconds\n(of which an average of {:.6f} seconds per thread waiting for external tools to finish)\n",
13441 msg(
"finished...\n");
13446 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 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
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.