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__)
200{
"template class",
"template struct",
"class",
"struct",
"union",
"interface",
"exception" };
236 stats.emplace_back(name,0);
237 startTime = std::chrono::steady_clock::now();
241 std::chrono::steady_clock::time_point endTime = std::chrono::steady_clock::now();
242 stats.back().elapsed =
static_cast<double>(std::chrono::duration_cast<
243 std::chrono::microseconds>(endTime -
startTime).count())/1000000.0;
254 msg(
"----------------------\n");
255 for (
const auto &s :
stats)
257 msg(
"Spent {:.6f} seconds in {}",s.elapsed,s.name);
320 scope+=
"::"+pd->
name();
363 ((!includeExternal && root->
tagInfo()==
nullptr) ||
364 ( includeExternal && root->
tagInfo()!=
nullptr))
367 AUTO_TRACE(
"additional={} includeExternal={}",additional,includeExternal);
383 "group {}: ignoring title \"{}\" that does not match old title \"{}\"",
403 std::unique_ptr<GroupDef>(
410 std::unique_ptr<GroupDef>(
460 scope+=
"::"+gd->
name();
512 bool save_ambig = ambig;
523 fn = fn.
left(newIndex)+
"/"+root->
name;
526 if (!fd) ambig = save_ambig;
557 "Found non-existing group '{}' for the command '{}', ignoring command",
566 text.
sprintf(
"the name '%s' supplied as "
567 "the argument in the \\file statement ",
571 text+=
"matches the following input files:\n";
574 text+=
"Please use a more specific name by "
575 "including a (larger) part of the path!";
579 text+=
"is not an input file";
587template<
class DefMutable>
601 if (!includeFile.
isEmpty() && includeFile.
at(0)==
'"')
604 includeFile=includeFile.
mid(1,includeFile.
length()-2);
606 else if (!includeFile.
isEmpty() && includeFile.
at(0)==
'<')
609 includeFile=includeFile.
mid(1,includeFile.
length()-2);
621 text.
sprintf(
"the name '%s' supplied as "
622 "the argument of the \\class, \\struct, \\union, or \\include command ",
627 text+=
"matches the following input files:\n";
630 text+=
"Please use a more specific name by "
631 "including a (larger) part of the path!";
635 text+=
"is not an input file";
639 else if (includeFile.
isEmpty() && ifd &&
653 if (iName.
at(0)==
'<') local=
FALSE;
654 else if (iName.
at(0)==
'"') local=
TRUE;
655 if (iName.
at(0)==
'"' || iName.
at(0)==
'<')
678 cd->setIncludeFile(
nullptr,iName,local,
TRUE);
691 for (
size_t i=0;i<l;i++)
695 else if (c==
')' && round>0) round--;
696 else if (c==
'<' && round==0) count++;
701 if (c==
'>' && round==0 && count>0) count--;
724 if (idx==-1)
return prevScope;
726 if (nsName.
isEmpty())
return prevScope;
727 if (!fullScope.
isEmpty()) fullScope+=
"::";
732 if (nd==
nullptr) cd =
getClass(fullScope);
733 if (nd==
nullptr && cd)
737 else if (nd==
nullptr && cd==
nullptr && fullScope.
find(
'<')==-1)
745 "[generated]",1,1,fullScope,
763 if (prevScopeMutable)
795 int p=i1+l1,l2=0,i2=0;
803 if (resultScope==
nullptr)
814 if (resultScope!=
nullptr)
break;
873 auto alIt = tArgLists.begin();
874 while ((i=name.
find(
"::",p))!=-1 && alIt!=tArgLists.end())
890 return alIt!=tArgLists.end() ?
891 std::make_unique<ArgumentList>(*alIt) :
892 std::unique_ptr<ArgumentList>();
900 if (specifier.isStruct())
902 else if (specifier.isUnion())
904 else if (specifier.isCategory())
906 else if (specifier.isInterface())
908 else if (specifier.isProtocol())
910 else if (specifier.isException())
912 else if (specifier.isService())
914 else if (specifier.isSingleton())
917 if (section.isUnionDoc())
919 else if (section.isStructDoc())
921 else if (section.isInterfaceDoc())
923 else if (section.isProtocolDoc())
925 else if (section.isCategoryDoc())
927 else if (section.isExceptionDoc())
929 else if (section.isServiceDoc())
931 else if (section.isSingletonDoc())
952 int idx=fullName.
find(
'>');
953 if (idx!=-1 && root->
lang==SrcLangExt::CSharp)
963 qualifiedName.
prepend(scName+
"::");
969 AUTO_TRACE_ADD(
"Found class with name '{}', qualifiedName '{}'", cd ? cd->
name() : root->
name, qualifiedName);
1024 AUTO_TRACE_ADD(
"New class: fullname '{}' namespace '{}' name='{}' brief='{}' docs='{}'",
1034 if (fullName.
find(
"::")!=-1)
1041 std::unique_ptr<ArgumentList> tArgList;
1043 if ((root->
lang==SrcLangExt::CSharp || root->
lang==SrcLangExt::Java) &&
1044 (i=fullName.
find(
'<'))!=-1)
1049 if (i!=-1 && root->
lang==SrcLangExt::CSharp)
1058 fullName=fullName.
left(i);
1069 fullName,sec,tagName,refFileName,
TRUE,root->
spec.isEnum()) ));
1072 AUTO_TRACE_ADD(
"New class '{}' type={} #tArgLists={} tagInfo={} hidden={} artificial={}",
1109 AUTO_TRACE_ADD(
"Class {} not added, already exists as alias", fullName);
1117 if (!root->
spec.isForwardDecl())
1179 qualifiedName.
prepend(scName+
"::");
1185 AUTO_TRACE_ADD(
"Found concept with name '{}' (qualifiedName='{}')", cd ? cd->
name() : root->
name, qualifiedName);
1189 qualifiedName=cd->
name();
1203 AUTO_TRACE_ADD(
"New concept: fullname '{}' namespace '{}' name='{}' brief='{}' docs='{}'",
1204 qualifiedName,namespaceName,className,root->
brief,root->
doc);
1213 if (qualifiedName.
find(
"::")!=-1)
1225 qualifiedName,tagName,refFileName)));
1229 qualifiedName,root->
tArgLists.size(),fmt::ptr(tagInfo));
1260 for (
const auto &ce : root->
children())
1263 if (ce->section.isConceptDocPart())
1268 if (!ce->brief.isEmpty())
1270 cd->
addDocPart(ce->brief,ce->startLine,ce->startColumn);
1273 if (!ce->doc.isEmpty())
1275 cd->
addDocPart(ce->doc,ce->startLine,ce->startColumn);
1279 else if (ce->section.isConceptCodePart())
1281 cd->
addCodePart(ce->initializer.str(),ce->startLine,ce->startColumn);
1288 AUTO_TRACE_ADD(
"Concept '{}' not added, already exists (as alias)", qualifiedName);
1295 for (
const auto &ce : root->
children())
1297 if (ce->section.isConceptDocPart())
1317 if (root->
section.isModuleDoc())
1327 if (root->
section.isConcept())
1337 if (root->
section.isConceptDoc())
1356 if (cd!=ocd && cd->groupId()==ocd->groupId() &&
1357 !cd->partOfGroups().empty() && ocd->partOfGroups().empty())
1362 for (
const auto &gd : cd->partOfGroups())
1368 gd->addConcept(ocd.get());
1393 aliasFullName(name),aliasCd(std::move(cd)), aliasContext(ctx) {}
1395 std::unique_ptr<ClassDef> aliasCd;
1398 std::vector<ClassAlias> aliases;
1402 if (cd && visitedClasses.find(icd.get())==visitedClasses.end())
1408 name,icd->getFileDef(),
nullptr);
1434 aliases.emplace_back(aliasFullName,std::move(aliasCd),dm);
1445 visitedClasses.insert(icd.get());
1455 for (
auto &alias : aliases)
1460 alias.aliasContext->addInnerCompound(aliasCd);
1469 if (cd && visitedClasses.find(icd.get())==visitedClasses.end())
1487 "Incomplete input: scope for class {} not found!{}",name,
1488 name.
startsWith(
"std::") ?
" Try enabling BUILTIN_STL_SUPPORT." :
""
1506 if (visitedClasses.find(cd.get())==visitedClasses.end() && !cd->partOfGroups().empty())
1510 for (
auto &ncd : cd->getClasses())
1521 visitedClasses.insert(cd.get());
1532 fullName+=
"."+fieldName;
1575 for (
const auto &md : *ml)
1578 auto newMd =
createMemberDef(md->getDefFileName(),md->getDefLine(),md->getDefColumn(),
1579 md->typeString(),md->name(),md->argsString(),md->excpString(),
1580 md->protection(),md->virtualness(),md->isStatic(),Relationship::Member,
1627 for (
const auto &md : *ml)
1630 if (type.
find(
"::@")!=-1)
1636 if (type.
find(icd->name())!=-1)
1639 if (md->isAnonymous()) name =
"__unnamed" +
QCString().
setNum(pos++)+
"__";
1659 for (
const auto &pmd : *pml)
1662 if (pmdm && pmd->
name()==md->name())
1682 if (icd->name().find(
"@")==-1)
1691 candidates.push_back(cdm);
1697 std::vector<ClassDefMutable *> candidates;
1709 for (
auto &cd : candidates)
1722 (root->
section.isNamespace() ||
1723 root->
section.isNamespaceDoc() ||
1732 if (root->
section.isPackageDoc())
1796 root->
type,root->
spec.isPublished())));
1863 QCString aliasName = aliasNd->name();
1892 for (
auto &und : unl)
1896 if (usingNd!=
nullptr)
break;
1903 if (root->
section.isUsingDir())
1921 (fd==
nullptr || fd->
getLanguage()!=SrcLangExt::Java)
1935 int scopeOffset =
static_cast<int>(nsName.
length());
1946 else if ((scopeOffset=nsName.
findRev(
"::",scopeOffset-1))==-1)
1950 }
while (scopeOffset>=0 && usingNd==
nullptr);
1952 if (usingNd==
nullptr && nd)
1956 while (pnd && usingNd==
nullptr)
1973 if (usingNd==
nullptr && fd)
2046 if (root->
section.isUsingDecl() &&
2059 if (root->
section.isUsingDecl() &&
2061 (!filterPythonPackages || (root->
lang==SrcLangExt::Python && root->
fileName.
endsWith(
"__init__.py")))
2064 AUTO_TRACE(
"Found using declaration '{}' at line {} of {} inside section {}",
2094 if (nd==
nullptr) scope = fd;
2164 AUTO_TRACE(
"creating new member {} for class {}",memName,cd->
name());
2175 newMmd->setMemberClass(cd);
2193 newMmd->addSectionsToDefinition(root->
anchors);
2199 newMmd->setMemberGroupId(root->
mGrpId);
2202 newMmd->setLanguage(root->
lang);
2203 newMmd->setId(root->
id);
2212 if (root->
section.isUsingDecl() &&
2239 for (
auto &mi : *mni)
2242 if (md && md->
protection()!=Protection::Private)
2257 for (
const auto ©Cd : it->second)
2270 else if (root->
section.isUsingDecl() &&
2272 root->
lang==SrcLangExt::Cpp
2305 memName = root->
name;
2327 newMmd->setNamespace(nd);
2332 newMmd->setFileDef(fd);
2351 newMmd->addSectionsToDefinition(root->
anchors);
2357 newMmd->setMemberGroupId(root->
mGrpId);
2360 newMmd->setLanguage(root->
lang);
2361 newMmd->setId(root->
id);
2369 if (nd && aliasMd.get())
2373 if (fd && aliasMd.get())
2402 if (nd) ncdm->
moveTo(nd);
2431 aliasFullName = aliasCd->localName();
2435 aliasFullName = nd->
qualifiedName()+
"::"+aliasCd->localName();
2467 for (
const auto &fd : *fn)
2470 fd->addIncludedUsingDirectives(visitedFiles);
2492 if (lang==SrcLangExt::Java || lang==SrcLangExt::CSharp)
2497 AUTO_TRACE(
"class variable: file='{}' type='{}' scope='{}' name='{}' args='{}' prot={} mtype={} lang={} ann={} init='{}'",
2505 if (root->
spec.isAlias())
2511 def=type+
" "+name+args;
2516 if (root->
spec.isAlias())
2518 def=
"using "+qualScope+scopeSeparator+name;
2522 def=type+
" "+qualScope+scopeSeparator+name+args;
2534 def=qualScope+scopeSeparator+name+args;
2545 for (
const auto &imd : *mn)
2557 if (root->
lang==SrcLangExt::ObjC &&
2558 root->
mtype==MethodTypes::Property &&
2582 prot,Specifier::Normal,root->
isStatic,related,
2586 mmd->setTagInfo(root->
tagInfo());
2587 mmd->setMemberClass(cd);
2591 mmd->setDefinition(def);
2593 mmd->addSectionsToDefinition(root->
anchors);
2594 mmd->setFromAnonymousScope(fromAnnScope);
2595 mmd->setFromAnonymousMember(fromAnnMemb);
2600 mmd->setMemberGroupId(root->
mGrpId);
2601 mmd->setMemberSpecifiers(root->
spec);
2602 mmd->setVhdlSpecifiers(root->
vhdlSpec);
2603 mmd->setReadAccessor(root->
read);
2604 mmd->setWriteAccessor(root->
write);
2606 mmd->setHidden(root->
hidden);
2608 mmd->setLanguage(root->
lang);
2609 mmd->setId(root->
id);
2612 mmd->setBodyDef(root->
fileDef());
2617 mmd->setRefItems(root->
sli);
2618 mmd->setRequirementReferences(root->
rqli);
2648 AUTO_TRACE(
"global variable: file='{}' type='{}' scope='{}' name='{}' args='{}' prot={} mtype={} lang={} init='{}'",
2660 static const reg::Ex re(R
"(\a\w*)");
2662 const std::string &typ = ttype.
str();
2684 if (scope.
find(
'@')!=-1)
return nullptr;
2700 if (root->
spec.isAlias())
2702 def=
"using "+nd->
name()+sep+name;
2706 def=type+
" "+nd->
name()+sep+name+args;
2711 def=nd->
name()+sep+name+args;
2718 if (name.
at(0)==
'@')
2724 if (root->
spec.isAlias())
2726 def=
"using "+root->
name;
2730 def=type+
" "+name+args;
2751 for (
const auto &imd : *mn)
2765 bool isPHPArray = md->
getLanguage()==SrcLangExt::PHP &&
2768 bool staticsInDifferentFiles =
2774 !staticsInDifferentFiles
2816 mmd->setTagInfo(root->
tagInfo());
2817 mmd->setMemberSpecifiers(root->
spec);
2818 mmd->setVhdlSpecifiers(root->
vhdlSpec);
2822 mmd->addSectionsToDefinition(root->
anchors);
2823 mmd->setFromAnonymousScope(fromAnnScope);
2824 mmd->setFromAnonymousMember(fromAnnMemb);
2827 mmd->setMemberGroupId(root->
mGrpId);
2828 mmd->setDefinition(def);
2829 mmd->setLanguage(root->
lang);
2830 mmd->setId(root->
id);
2838 mmd->setBodyDef(fd);
2843 mmd->setRefItems(root->
sli);
2844 mmd->setRequirementReferences(root->
rqli);
2847 mmd->setNamespace(nd);
2855 mmd->setFileDef(fd);
2883 if (lang == SrcLangExt::Fortran || lang == SrcLangExt::VHDL)
2888 static const reg::Ex re(R
"(\([^)]*[*&^][^)]*\))");
2890 size_t i=std::string::npos;
2894 i = match.position();
2897 if (i!=std::string::npos)
2899 size_t di = type.find(
"decltype(");
2900 if (di!=std::string::npos && di<i)
2902 i = std::string::npos;
2905 size_t bb=type.find(
'<');
2906 size_t be=type.rfind(
'>');
2907 bool templFp =
false;
2908 if (be!=std::string::npos) {
2909 size_t cc_ast = type.find(
"::*");
2910 size_t cc_amp = type.find(
"::&");
2911 templFp = (cc_ast != std::string::npos && cc_ast>be) || (cc_amp != std::string::npos && cc_amp>be);
2914 if (!type.empty() &&
2915 i!=std::string::npos &&
2916 type.find(
"operator")==std::string::npos &&
2917 (type.find(
")(")==std::string::npos || type.find(
"typedef ")!=std::string::npos) &&
2919 (!(bb<i && i<be) || templFp)
2922 if (pLength) *pLength=
static_cast<int>(l);
2925 return static_cast<int>(i);
2942 bool result =
false;
2943 bool typeIsClass =
false;
2944 bool typePtrType =
false;
2978 typePtrType = type.
find(
'*')!=-1 || type.
find(
'&')!=-1;
2981 typeIsClass = resolver.
resolveClass(ctx,type)!=
nullptr;
2983 if (!typeIsClass && (ti=type.
find(
'<'))!=-1)
3000 static const reg::Ex initChars(R
"([\d"'&*!^]+)");
3004 std::string name = a.
name.
str();
3005 if (
reg::search(name,match,initChars) && match.position()==0)
3037 std::string atype = a.
type.
str();
3038 if (
reg::search(atype,match,initChars) && match.position()==0)
3045 if (resType.empty()) resType=atype;
3046 static const reg::Ex idChars(R
"(\a\w*)");
3047 if (
reg::search(resType,match,idChars) && match.position()==0)
3049 resType=match.str();
3050 if (resType==
"int" || resType==
"long" ||
3051 resType==
"float" || resType==
"double" ||
3052 resType==
"char" || resType==
"void" ||
3053 resType==
"signed" || resType==
"unsigned" ||
3054 resType==
"const" || resType==
"volatile" )
3091 bool insideString=
FALSE;
3092 bool insideChar=
FALSE;
3094 while (e<len && brCount!=0)
3100 if (!insideString && !insideChar)
3102 if (e<len-1 && s.
at(e+1)==
'<')
3104 else if (roundCount==0)
3109 if (!insideString && !insideChar)
3111 if (e<len-1 && s.
at(e+1)==
'>')
3113 else if (roundCount==0)
3118 if (!insideString && !insideChar)
3122 if (!insideString && !insideChar)
3128 if (insideString && pc!=
'\\')
3137 if (insideChar && pc!=
'\\')
3147 return brCount==0 ?
static_cast<int>(e) : -1;
3156 AUTO_TRACE(
"VARIABLE_SEC: type='{}' name='{}' args='{}' bodyLine={} endBodyLine={} mGrpId={} relates='{}'",
3163 if (type.
isEmpty() && name.
find(
"operator")==-1 &&
3164 (name.
find(
'*')!=-1 || name.
find(
'&')!=-1))
3171 std::string sargs = args.
str();
3172 static const reg::Ex reName(R
"(\a\w*)");
3177 sargs = match.suffix().str();
3178 size_t j = sargs.find(
')');
3179 if (j!=std::string::npos) args=sargs.substr(0,j);
3189 int ai = type.
find(
'[',i);
3195 else if (type.
find(
')',i)!=-1)
3202 AUTO_TRACE_ADD(
"after correction: type='{}' name='{}' args='{}'",type,name,args);
3213 scope=name.
left(index);
3214 name=name.
mid(index+2);
3233 bool isRelated=
FALSE;
3234 bool isMemberOf=
FALSE;
3237 if (root->
lang==SrcLangExt::CSharp)
3250 for (
size_t i=0;i<name.
length()-1;i++)
3252 if (name[i]==
':' && name[i+1]==
':')
3254 p=
static_cast<int>(i);
3256 else if (name[i]==
'<')
3261 if (e!=-1) i=
static_cast<int>(e);
3267 if (type==
"friend class" || type==
"friend struct" ||
3268 type==
"friend union")
3282 Relationship::Member
3308 else if (root->
mtype==MethodTypes::Property)
3310 else if (root->
mtype==MethodTypes::Event)
3312 else if (type.
find(
"sequence<") != -1)
3314 else if (type.
find(
"dictionary<") != -1)
3320 isMemberOf=(root->
relatesType==RelatesType::MemberOf);
3338 int si=scope.
find(
'@');
3342 bool inlineSimpleStructs =
Config_getBool(INLINE_SIMPLE_STRUCTS);
3343 Relationship relationship = isMemberOf ? Relationship::Foreign :
3344 isRelated ? Relationship::Related :
3345 Relationship::Member ;
3346 if (si!=-1 && !inlineSimpleStructs)
3350 pScope = scope.
left(std::max(si-2,0));
3352 pScope.
prepend(annScopePrefix);
3353 else if (annScopePrefix.
length()>2)
3354 pScope=annScopePrefix.
left(annScopePrefix.
length()-2);
3355 if (name.
at(0)!=
'@')
3423 scope=rname.
left(index);
3424 rname=rname.
mid(index+2);
3436 for (
auto &imd : *mn)
3438 if (!imd->isTypedef())
3447 bool notBothGrouped = root->
groups.empty() || imd->getGroupDef()==
nullptr;
3448 bool bothSameScope = (!cd && !nd) || (cd && imd->getClassDef() == cd) || (nd && imd->getNamespaceDef() == nd);
3451 if (notBothGrouped && bothSameScope && imd->typeString()==rtype)
3499 for (
const auto &e : root->
children())
3500 if (!e->section.isEnum())
3517 for (
const auto &e : root->
children())
3518 if (!e->section.isEnum())
3535 for (
const auto &e : root->
children())
3536 if (!e->section.isEnum())
3551 (root->
section.isVariable() &&
3554 (root->
section.isFunction() &&
3557 (root->
section.isFunction() &&
3566 for (
const auto &e : root->
children())
3567 if (!e->section.isEnum())
3593 mmd->setTagInfo(root->
tagInfo());
3594 mmd->setMemberClass(cd);
3596 mmd->setDocsForDefinition(
false);
3600 mmd->setMemberSpecifiers(root->
spec);
3601 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3602 mmd->setMemberGroupId(root->
mGrpId);
3604 mmd->setLanguage(root->
lang);
3605 mmd->setBodyDef(fd);
3606 mmd->setFileDef(fd);
3607 mmd->addSectionsToDefinition(root->
anchors);
3609 mmd->setDefinition(def);
3613 AUTO_TRACE(
"Interface member: fileName='{}' type='{}' name='{}' mtype='{}' prot={} virt={} state={} proto={} def='{}'",
3621 root->
spec.isOptional() ? Protection::Protected : Protection::Public, Specifier::Normal);
3631 mmd->setRefItems(root->
sli);
3632 mmd->setRequirementReferences(root->
rqli);
3641 if (root->
section.isExportedInterface() || root->
section.isIncludedService())
3643 AUTO_TRACE(
"Exported interface/included service: type='{}' scope='{}' name='{}' args='{}'"
3644 " relates='{}' relatesType='{}' file='{}' line={} bodyLine={} #tArgLists={}"
3645 " mGrpId={} spec={} proto={} docFile='{}'",
3671 "Illegal member name found.");
3677 case SrcLangExt::Unknown:
3678 case SrcLangExt::IDL:
3715 if ((fd==
nullptr || fd->
getLanguage()==SrcLangExt::Cpp) &&
3717 (i=name.
find(
'<'))!=-1 &&
3718 (j=name.
find(
'>'))!=-1 &&
3719 (j!=i+2 || name.
at(i+1)!=
'=')
3737 root->
relatesType==RelatesType::MemberOf ? Relationship::Foreign :
3738 Relationship::Related ;
3748 mmd->setTagInfo(root->
tagInfo());
3749 mmd->setMemberClass(cd);
3751 mmd->setDocsForDefinition(!root->
proto);
3755 mmd->setMemberSpecifiers(spec);
3756 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3757 mmd->setMemberGroupId(root->
mGrpId);
3759 mmd->setLanguage(root->
lang);
3760 mmd->setRequiresClause(root->
req);
3761 mmd->setId(root->
id);
3762 mmd->setBodyDef(fd);
3763 mmd->setFileDef(fd);
3764 mmd->addSectionsToDefinition(root->
anchors);
3769 if (scopeSeparator!=
"::")
3771 qualScope =
substitute(qualScope,
"::",scopeSeparator);
3773 if (lang==SrcLangExt::PHP)
3776 scopeSeparator=
"::";
3793 def=type+
" "+qualScope+scopeSeparator+name;
3797 def=qualScope+scopeSeparator+name;
3801 mmd->setDefinition(def);
3805 AUTO_TRACE(
"function member: type='{}' scope='{}' name='{}' args='{}' proto={} def='{}'",
3806 type, qualScope, rname, args, root->
proto, def);
3816 mmd->setRefItems(root->
sli);
3817 mmd->setRequirementReferences(root->
rqli);
3841 mmd->setTagInfo(root->
tagInfo());
3842 mmd->setLanguage(root->
lang);
3843 mmd->setId(root->
id);
3848 mmd->setDocsForDefinition(!root->
proto);
3854 mmd->addSectionsToDefinition(root->
anchors);
3855 mmd->setMemberSpecifiers(root->
spec);
3856 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3857 mmd->setMemberGroupId(root->
mGrpId);
3858 mmd->setRequiresClause(root->
req);
3893 def=root->
type+
" "+scope+name;
3899 AUTO_TRACE(
"new non-member function type='{}' scope='{}' name='{}' args='{}' proto={} def='{}'",
3901 mmd->setDefinition(def);
3905 mmd->setRefItems(root->
sli);
3906 mmd->setRequirementReferences(root->
rqli);
3910 mmd->setNamespace(nd);
3917 mmd->setFileDef(fd);
3938 if (root->
section.isFunction())
3940 AUTO_TRACE(
"member function: type='{}' scope='{}' name='{}' args='{}' relates='{}' relatesType='{}'"
3941 " file='{}' line={} bodyLine={} #tArgLists={} mGrpId={}"
3942 " spec={} proto={} docFile='{}'",
3947 bool isFriend=root->
type==
"friend" || root->
type.
find(
"friend ")!=-1;
3957 scope=rname.
left(index);
3958 rname=rname.
mid(index+2);
3967 if (root->
lang==SrcLangExt::CSharp)
3978 int memIndex=rname.
findRev(
"::");
3981 if (cd && scope+
"::"==rname.
left(scope.
length()+2))
3987 bool isMember=
FALSE;
3990 int ts=rname.
find(
'<');
3991 int te=rname.
find(
'>');
3992 if (memIndex>0 && (ts==-1 || te==-1))
4009 isMember=memIndex<ts || memIndex>te;
4049 for (
const auto &imd : *mn)
4062 fullScope.
prepend(parentScope);
4068 if (mnd) nsName = mnd->
name();
4069 if (rnd) rnsName = rnd->
name();
4077 bool sameTemplateArgs =
TRUE;
4078 bool matchingReturnTypes =
TRUE;
4079 bool sameRequiresClause =
TRUE;
4085 matchingReturnTypes =
FALSE;
4089 sameRequiresClause =
FALSE;
4095 sameTemplateArgs =
FALSE;
4098 bool staticsInDifferentFiles =
4101 if (sameTemplateArgs &&
4102 matchingReturnTypes &&
4103 sameRequiresClause &&
4104 !staticsInDifferentFiles &&
4111 if (!root->
groups.empty() && !root->
groups.front().groupname.isEmpty())
4118 found=(mnd && rnd && nsName==rnsName) ||
4119 ((mnd==
nullptr && rnd==
nullptr && mfd!=
nullptr &&
4124 if (!found && gd && gd==md->
getGroupDef() && nsName==rnsName)
4130 AUTO_TRACE_ADD(
"combining function with prototype found={} in namespace '{}'",found,nsName);
4232 "Illegal member name found."
4250 for (
const auto &ifmd : *fn)
4254 for (
const auto &immd : *mn)
4270 AUTO_TRACE_ADD(
"Merging related global and member '{}' isFriend={} isRelated={} isFunction={}",
4347 for (
const auto &imdec : *mn)
4355 for (
const auto &imdef : *mn)
4358 if (mdef && mdec!=mdef &&
4378 for (
const auto &imd : *mn)
4394 if (mdef && mdec)
break;
4402 mdec->getOuterScope(),mdec->getFileDef(),mdec->typeString(),
const_cast<ArgumentList*
>(&mdecAl),
4409 mdec->mergeReferences(mdef);
4411 mdec->mergeReferencedBy(mdef);
4428 for (
const auto &imd : *mn)
4439 for (
const auto &irmd : *rmn)
4473 size_t i=qualifiedName.rfind(
"::");
4474 if (i!=std::string::npos)
4476 QCString scope = qualifiedName.substr(0,i);
4477 QCString name = qualifiedName.substr(i+2);
4481 for (
const auto &imd : *mn)
4507 std::map<std::string,int> templateNames;
4509 for (
const Argument &arg : templateArguments)
4511 static const reg::Ex re(R
"(\a[\w:]*)");
4514 for (; it!=
end ; ++it)
4516 const auto &match = *it;
4517 std::string n = match.str();
4518 if (n==arg.name.str())
4520 if (templateNames.find(n)==templateNames.end())
4522 templateNames.emplace(n,count);
4527 return templateNames;
4542 if (context && cd!=context)
4547 if (result==
nullptr)
4552 if (result==
nullptr)
4581 for (
auto &mi : *mni)
4591 type = typedefValue;
4610 usedClassName = typeCd->
name();
4620 if (templateNames.empty())
4624 BaseInfo bi(usedName,Protection::Public,Specifier::Normal);
4629 if (arg.name==usedName)
4633 if (usedCd==
nullptr)
4684 if (!found && !type.
isEmpty())
4743 if (templateNames.empty())
4781 AUTO_TRACE(
"Derived from template '{}' with parameters '{}' isArtificial={}",
4782 templateClass->
name(),templSpec,isArtificial);
4785 bool existingClass = templSpec==tempArgsStr;
4786 if (existingClass)
return;
4788 bool freshInstance=
FALSE;
4805 for (
auto it=it_pair.first ; it!=it_pair.second ; ++it)
4807 const Entry *templateRoot = it->second;
4808 AUTO_TRACE_ADD(
"template root found '{}' templSpec='{}'",templateRoot->
name,templSpec);
4814 isArtificial,templArgs.get(),templateNames);
4833 int ti=ttype.
find(
'<');
4839 templateClassName,
true,
true);
4840 AUTO_TRACE_ADD(
"templateClassName={} baseClass={}",templateClassName,baseClass?baseClass->
name():
"<none>");
4859 int index=n.
find(
'<');
4871 int l =
static_cast<int>(name.
length());
4877 while (count>0 && i>=0)
4882 case '>':
if (!insideQuote) count++;
break;
4883 case '<':
if (!insideQuote) count--;
break;
4884 case '\'':
if (!insideQuote) insideQuote=c;
4885 else if (insideQuote==c && (i<0 || name[i]!=
'\\')) insideQuote=0;
4887 case '"':
if (!insideQuote) insideQuote=c;
4888 else if (insideQuote==c && (i<0 || name[i]!=
'\\')) insideQuote=0;
4908 AUTO_TRACE(
"name={} base={} isArtificial={} mode={}",cd->
name(),bi->
name,isArtificial,(
int)mode);
4911 bool explicitGlobalScope=
FALSE;
4915 explicitGlobalScope=
TRUE;
4919 bool lastParent=
FALSE;
4924 int scopeOffset=explicitGlobalScope ? 0 :
static_cast<int>(scopeName.
length());
4933 baseClassName.
prepend(scopeName.
left(scopeOffset)+
"::");
4935 if (root->
lang==SrcLangExt::CSharp)
4962 || explicitGlobalScope
4965 || (root->
lang==SrcLangExt::IDL &&
4966 (root->
section.isExportedInterface() ||
4967 root->
section.isIncludedService()))
4970 AUTO_TRACE_ADD(
"class relation '{}' inherited/used by '{}' found prot={} virt={} templSpec='{}'",
4971 baseClassName, root->
name, bi->
prot, bi->
virt, templSpec);
4974 int si=baseClassName.
findRev(
"::",i);
4976 if (baseClass==
nullptr &&
static_cast<size_t>(i)!=baseClassName.
length())
4986 baseClassName = baseClassName.
left(i)+baseClassName.
right(baseClassName.
length()-e);
4997 else if (baseClass && !templSpec.
isEmpty())
5008 baseClass = templClass;
5016 if (!found && si!=-1)
5026 found=baseClass!=
nullptr && baseClass!=cd;
5036 found = baseClass!=
nullptr && baseClass!=cd;
5048 found = baseClass!=
nullptr && baseClass!=cd;
5051 bool isATemplateArgument = templateNames.find(biName.
str())!=templateNames.end();
5056 AUTO_TRACE_ADD(
"Documented base class '{}' templSpec='{}'",biName,templSpec);
5074 if (baseClassTypeDef==
nullptr)
5084 if (baseClassTypeDef)
5093 AUTO_TRACE_ADD(
"insertBaseClass name={} prot={} virt={} templSpec={}",usedName,prot,bi->
virt,templSpec);
5101 "Detected potential recursive class relation "
5102 "between class {} and base class {}!",
5109 else if (mode==
Undocumented && (scopeOffset==0 || isATemplateArgument))
5111 AUTO_TRACE_ADD(
"New undocumented base class '{}' baseClassName='{}' templSpec='{}' isArtificial={}",
5112 biName,baseClassName,templSpec,isArtificial);
5114 if (isATemplateArgument)
5117 if (baseClass==
nullptr)
5136 if (baseClass==
nullptr)
5147 si = baseClassName.
findRev(
"::");
5163 biName=
"<"+biName.
left(biName.
length()-2)+
">";
5167 AUTO_TRACE_ADD(
"insertBaseClass name={} prot={} virt={} templSpec={}",biName,bi->
prot,bi->
virt,templSpec);
5177 if (scope!=baseClass)
5203 "Detected potential recursive class relation "
5204 "between class {} and base class {}!",
5205 root->
name,baseClassName
5216 else if ((scopeOffset=scopeName.
findRev(
"::",scopeOffset-1))==-1)
5221 }
while (scopeOffset>=0);
5223 if (parentNode==
nullptr)
5229 parentNode=parentNode->
parent();
5231 }
while (lastParent);
5251 bool hasExtends = !root->
extends.empty();
5252 if (hasExtends)
return TRUE;
5276 if ((root->
lang==SrcLangExt::CSharp || root->
lang==SrcLangExt::Java) &&
5277 (i=bName.
find(
'<'))!=-1)
5281 if (root->
lang==SrcLangExt::CSharp)
5287 bName = bName.
left(i);
5319 if (i!=-1 && j!=-1 && k==-1 && root->
lang!=SrcLangExt::CSharp && root->
lang!=SrcLangExt::Java)
5352 if (!nd->hasDocumentation())
5355 nd->getLanguage() == SrcLangExt::Fortran) &&
5359 warn_undoc(nd->getDefFileName(),nd->getDefLine(),
"{} {} is not documented.",
5360 nd->getLanguage() == SrcLangExt::Fortran ?
"Module" :
"Namespace",
5424 for (
const auto &tn_kv : templateNames)
5426 size_t templIndex = tn_kv.second;
5428 bool hasActArg=
FALSE;
5429 if (templIndex<templArgs->size())
5431 actArg=templArgs->at(templIndex);
5435 baseClassNames.find(actArg.
type.
str())!=baseClassNames.end() &&
5436 actualTemplateNames.find(actArg.
type.
str())==actualTemplateNames.end()
5439 actualTemplateNames.emplace(actArg.
type.
str(),
static_cast<int>(templIndex));
5474 for (
const auto &fd : *fn)
5476 fd->computeAnchors();
5489 gd->computeAnchors();
5496template<
typename Func>
5519 for (
const auto &fd : *fn)
5592 if (md==
nullptr)
return;
5593 AUTO_TRACE(
"scope='{}' name='{}' args='{}' funcDecl='{}' mSpec={}",
5608 fullName = cd->
name();
5610 fullName = nd->
name();
5612 if (!fullName.
isEmpty()) fullName+=
"::";
5613 fullName+=md->
name();
5718 "member {} belongs to two different groups. The second one found here will be ignored.",
5756 return allowNoGroup;
5759 for (
const auto &g : root->
groups)
5761 if (g.groupname == gd->
name())
5784 AUTO_TRACE(
"namespace='{}' type='{}' name='{}' tempArg='{}' decl='{}'",namespaceName,type,name,tempArg,decl);
5798 for (
const auto &md : *mn)
5809 if (md->isAlias() && md->getOuterScope() &&
5816 nd = md->getNamespaceDef();
5821 if (nd && md->isEnumValue() && (enumNamePos=namespaceName.
findRev(
"::"))!=-1)
5823 QCString enumName = namespaceName.
mid(enumNamePos+2);
5824 if (namespaceName.
left(enumNamePos)==nd->
name())
5829 for (
const auto &emd : *enumMn)
5831 found = emd->isStrong() && md->getEnumScope()==emd.get();
5845 else if (nd==
nullptr && md->isEnumValue())
5850 for (
const auto &emd : *enumMn)
5852 found = emd->isStrong() && md->getEnumScope()==emd.get();
5875 if ((namespaceName.
isEmpty() && nd==
nullptr) ||
5876 (nd && nd->
name()==namespaceName) ||
5880 AUTO_TRACE_ADD(
"Try to add member '{}' to scope '{}'",md->name(),namespaceName);
5888 md->isVariable() || md->isTypedef() ||
5889 matchArguments2(md->getOuterScope(),md->getFileDef(),md->typeString(),&mdAl,
5896 if (matching && !root->
tArgLists.empty())
5915 if (matching && md->isStatic() &&
5916 md->getDefFileName()!=root->
fileName &&
5924 if (!md->templateArguments().empty() && !root->
tArgLists.empty())
5928 if (md->templateArguments().size()!=root->
tArgLists.back().size() ||
5929 md->typeString()!=type ||
5930 md->requiresClause()!=root->
req)
5946 if (!found && root->
relatesType!=RelatesType::Duplicate && root->
section.isFunction())
5950 QCString warnMsg =
"no matching file member found for \n"+fullFuncDecl;
5953 warnMsg+=
"\nPossible candidates:";
5954 for (
const auto &md : *mn)
5958 warnMsg+=
"' " +
warn_line(md->getDefFileName(),md->getDefLine());
5966 if (root->
type!=
"friend class" &&
5967 root->
type!=
"friend struct" &&
5968 root->
type!=
"friend union" &&
5969 root->
type!=
"friend" &&
5975 "documented symbol '{}' was not declared or defined.",
qPrint(decl)
5987 auto srcIt = srcTempArgLists.begin();
5988 auto dstIt = dstTempArgLists.begin();
5989 while (srcIt!=srcTempArgLists.end() && dstIt!=dstTempArgLists.end())
5991 if ((*srcIt).size()!=(*dstIt).size())
return TRUE;
6005 result = cd->templateArguments().hasParameters() || cd->templateMaster()!=
nullptr ||
6015 const std::string &src
6019 static const reg::Ex re(R
"(\a\w*)");
6024 for (; it!=
end ; ++it)
6026 const auto &match = *it;
6027 size_t i = match.position();
6028 size_t l = match.length();
6030 dst+=src.substr(p,i-p);
6031 std::string name=match.str();
6033 auto srcIt = srcTempArgLists.begin();
6034 auto dstIt = dstTempArgLists.begin();
6035 while (srcIt!=srcTempArgLists.end() && !found)
6038 std::vector<Argument>::const_iterator tdaIt;
6039 if (dstIt!=dstTempArgLists.end())
6042 tdaIt = tdAli->
begin();
6047 for (
auto tsaIt = tsaLi.
begin(); tsaIt!=tsaLi.
end() && !found; ++tsaIt)
6051 if (tdAli && tdaIt!=tdAli->
end())
6067 else if (tdaType.
startsWith(
"typename ")) vc=9;
6070 tdaName = tdaType.
mid(vc);
6103 auto dstIt = dst.
begin();
6108 if (dstIt == dst.
end())
6112 da.
array = dstArray;
6120 da.
array = dstArray;
6128 srcTempArgLists,dstTempArgLists,
6154 funcType,funcName,funcArgs,exceptions,
6158 mmd->setTagInfo(root->
tagInfo());
6159 mmd->setLanguage(root->
lang);
6160 mmd->setId(root->
id);
6161 mmd->makeImplementationDetail();
6162 mmd->setMemberClass(cd);
6163 mmd->setDefinition(funcDecl);
6169 mmd->setDocsForDefinition(!root->
proto);
6171 mmd->addSectionsToDefinition(root->
anchors);
6175 mmd->setMemberSpecifiers(spec);
6176 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6177 mmd->setMemberGroupId(root->
mGrpId);
6180 mmd->setRefItems(root->
sli);
6181 mmd->setRequirementReferences(root->
rqli);
6217 bool memFound=
FALSE;
6218 for (
const auto &imd : *mn)
6221 if (md==
nullptr)
continue;
6223 if (cd==
nullptr)
continue;
6240 if (!namespaceName.
isEmpty()) fullScope.
prepend(namespaceName+
"::");
6241 if (fullScope==cd->
name())
6247 for (
const auto &emd : *enumMn)
6249 memFound = emd->isStrong() && md->
getEnumScope()==emd.get();
6255 if (memFound)
break;
6260 if (memFound)
break;
6278 if (!templAl.
empty())
6280 declTemplArgs.push_back(templAl);
6288 bool substDone=
false;
6295 if (declTemplArgs.size()>0 && declTemplArgs.size()==defTemplArgs.size())
6318 AUTO_TRACE_ADD(
"matching '{}'<=>'{}' className='{}' namespaceName='{}' result={}",
6347 AUTO_TRACE_ADD(
"Comparing return types '{}'<->'{}' #args {}<->{}",
6355 else if (defTemplArgs.size()>declTemplArgs.size())
6357 AUTO_TRACE_ADD(
"Different number of template arguments {} vs {}",defTemplArgs.size(),declTemplArgs.size());
6363 bool rootIsUserDoc = root->
section.isMemberDoc();
6366 bool classOrMdIsTemplate = mdIsTemplate || classIsTemplate;
6367 bool rootIsTemplate = !root->
tArgLists.empty();
6369 if (!rootIsUserDoc &&
6370 (mdIsTemplate || rootIsTemplate) &&
6371 ((classOrMdIsTemplate && !rootIsTemplate) || (!classOrMdIsTemplate && rootIsTemplate))
6376 AUTO_TRACE_ADD(
"Comparing return types: template v.s. non-template");
6380 AUTO_TRACE_ADD(
"Match results of matchArguments2='{}' substDone='{}'",matching,substDone);
6391 if (!funcTempList.
isEmpty() &&
6411 else if (cd && cd!=tcd)
6417 if (memFound)
break;
6421 addLocalObjCMethod(root,scopeName,funcType,funcName,funcArgs,exceptions,funcDecl,spec);
6424 if (count==0 && !(isFriend && funcType==
"class"))
6427 const ClassDef *ecd =
nullptr, *ucd =
nullptr;
6428 MemberDef *emd =
nullptr, *umd =
nullptr;
6430 for (
const auto &md : *mn)
6452 AUTO_TRACE_ADD(
"new candidate className='{}' scope='{}' args='{}': exact match",
6453 className,ccd->
name(),md->argsString());
6459 AUTO_TRACE_ADD(
"new candidate className='{}' scope='{}' args='{}': no match",
6460 className,ccd->
name(),md->argsString());
6465 bool strictProtoMatching =
Config_getBool(STRICT_PROTO_MATCHING);
6466 if (!strictProtoMatching)
6468 if (candidates==1 && ucd && umd)
6475 else if (candidates>1 && ecd && emd)
6486 if (noMatchCount>1) warnMsg+=
"uniquely ";
6487 warnMsg+=
"matching class member found for \n";
6491 warnMsg+=
" template ";
6500 warnMsg+=fullFuncDecl;
6502 if (candidates>0 || noMatchCount>=1)
6504 warnMsg+=
"\nPossible candidates:";
6510 for (
const auto &md : *mn)
6512 const ClassDef *cd=md->getClassDef();
6526 warnMsg+=
"template ";
6531 if (!md->typeString().isEmpty())
6533 warnMsg+=md->typeString();
6538 warnMsg+=qScope+
"::"+md->name();
6539 warnMsg+=md->argsString();
6540 warnMsg+=
"' " +
warn_line(md->getDefFileName(),md->getDefLine());
6561 AUTO_TRACE(
"funcType={} funcName={} funcArgs={} funcDecl={} spec={}",funcType,funcName,funcArgs,funcDecl,spec);
6563 for (
const auto &md : *mn)
6565 if (md->getClassDef()==cd)
6577 funcType,funcName,funcArgs,exceptions,
6583 mmd->setTagInfo(root->
tagInfo());
6584 mmd->setLanguage(root->
lang);
6585 mmd->setId(root->
id);
6586 mmd->setMemberClass(cd);
6587 mmd->setTemplateSpecialization(
TRUE);
6589 mmd->setDefinition(funcDecl);
6595 mmd->setDocsForDefinition(!root->
proto);
6597 mmd->addSectionsToDefinition(root->
anchors);
6601 mmd->setMemberSpecifiers(spec);
6602 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6603 mmd->setMemberGroupId(root->
mGrpId);
6605 mmd->setRefItems(root->
sli);
6606 mmd->setRequirementReferences(root->
rqli);
6620 bool sameClass=
false;
6625 [](
const auto &md1,
const auto &md2)
6626 { return md1->getClassDef()->name()==md2->getClassDef()->name(); });
6632 if (cd==
nullptr)
return;
6640 std::unique_ptr<ArgumentList> tArgList =
6645 funcType,funcName,funcArgs,exceptions,
6649 mmd->setTagInfo(root->
tagInfo());
6650 mmd->setLanguage(root->
lang);
6651 mmd->setId(root->
id);
6653 mmd->setMemberClass(cd);
6654 mmd->setDefinition(funcDecl);
6663 mmd->setDocsForDefinition(!root->
proto);
6665 mmd->addSectionsToDefinition(root->
anchors);
6669 mmd->setMemberSpecifiers(spec);
6670 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6671 mmd->setMemberGroupId(root->
mGrpId);
6674 mmd->setRefItems(root->
sli);
6675 mmd->setRequirementReferences(root->
rqli);
6733 AUTO_TRACE(
"root='{}' funcDecl='{}' related='{}' overload={} isFunc={} mGrpId={} #tArgList={} spec={} lang={}",
6746 bool isRelated=
false;
6747 bool isMemberOf=
false;
6748 bool isFriend=
false;
6761 spec.setInline(
true);
6766 spec.setExplicit(
true);
6771 spec.setMutable(
true);
6776 spec.setThreadLocal(
true);
6787 while ((sep=funcDecl.
find(
';'))!=-1)
6793 if (!funcDecl.
isEmpty() && funcDecl[0]!=
' ') funcDecl.
prepend(
" ");
6805 if (isFriend && funcDecl.
startsWith(
"class "))
6809 funcName = funcDecl;
6811 else if (isFriend && funcDecl.
startsWith(
"struct "))
6814 funcName = funcDecl;
6820 funcArgs,funcTempList,exceptions
6828 AUTO_TRACE_ADD(
"scopeName='{}' className='{}' namespaceName='{}' funcType='{}' funcName='{}' funcArgs='{}'",
6829 scopeName,className,namespaceName,funcType,funcName,funcArgs);
6833 isMemberOf=(root->
relatesType == RelatesType::MemberOf);
6840 scopeName = relates;
6853 scopeName = joinedName;
6867 QCString joinedName = fnd->name()+
"::"+scopeName;
6870 scopeName=joinedName;
6897 AUTO_TRACE_ADD(
"scopeName='{}' className='{}' namespaceName='{}'",scopeName,className,namespaceName);
6906 scopeName=namespaceName;
6908 else if (!relates.
isEmpty() ||
6911 scopeName=namespaceName+
"::"+className;
6915 scopeName=className;
6918 else if (!className.
isEmpty())
6920 scopeName=className;
6930 uint32_t argListIndex=0;
6935 tempScopeName=scopeName+funcSpec;
6949 funcDecl=funcType+
" "+tempScopeName+
"::"+funcName+funcTempList;
6953 funcDecl=funcType+
" "+tempScopeName+
"::"+funcName+funcArgs;
6960 funcDecl=tempScopeName+
"::"+funcName+funcTempList;
6964 funcDecl=tempScopeName+
"::"+funcName+funcArgs;
6974 funcDecl=funcType+
" "+funcName+funcTempList;
6978 funcDecl=funcType+
" "+funcName+funcArgs;
6985 funcDecl=funcName+funcTempList;
6989 funcDecl=funcName+funcArgs;
6994 if (funcType==
"template class" && !funcTempList.
isEmpty())
6997 AUTO_TRACE_ADD(
"Parse results: namespaceName='{}' className=`{}` funcType='{}' funcSpec='{}' "
6998 " funcName='{}' funcArgs='{}' funcTempList='{}' funcDecl='{}' relates='{}'"
6999 " exceptions='{}' isRelated={} isMemberOf={} isFriend={} isFunc={}",
7000 namespaceName, className, funcType, funcSpec,
7001 funcName, funcArgs, funcTempList, funcDecl, relates,
7002 exceptions, isRelated, isMemberOf, isFriend, isFunc);
7008 bool strongEnum =
false;
7012 for (
const auto &imd : *mn)
7025 namespaceName+=
"::"+className;
7029 namespaceName=className;
7037 funcName =
substitute(funcName,className+
"::",
"");
7048 if (!isRelated && !strongEnum && mn)
7056 funcArgs,funcTempList,exceptions,
7057 type,args,isFriend,spec,relates,funcDecl,overloaded,isFunc);
7069 else if (overloaded)
7071 addOverloaded(root,mn,funcType,funcName,funcArgs,funcDecl,exceptions,spec);
7075 if (!
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec))
7080 "Cannot determine class for function\n{}",
7086 else if (isRelated && !relates.
isEmpty())
7088 AUTO_TRACE_ADD(
"related function scopeName='{}' className='{}'",scopeName,className);
7089 if (className.
isEmpty()) className=relates;
7093 bool newMember=
TRUE;
7099 for (
const auto &imd : *mn)
7133 mn->
push_back(std::move(mdDefineTaken));
7147 for (
const auto &irmd : *mn)
7168 addMemberDocs(root,rmd_found,funcDecl,
nullptr,overloaded,spec);
7176 switch (root->
mtype)
7197 funcType,funcName,funcArgs,exceptions,
7200 isMemberOf ? Relationship::Foreign : Relationship::Related,
7220 mmd->setDefinitionTemplateParameterLists(root->
tArgLists);
7222 mmd->setTagInfo(root->
tagInfo());
7236 for (
const auto &irmd : *rmn)
7267 mmd->setBodyDef(fd);
7274 mmd->setMemberClass(cd);
7275 mmd->setMemberSpecifiers(spec);
7276 mmd->setVhdlSpecifiers(root->
vhdlSpec);
7277 mmd->setDefinition(funcDecl);
7282 mmd->setDocsForDefinition(!root->
proto);
7285 mmd->addSectionsToDefinition(root->
anchors);
7286 mmd->setMemberGroupId(root->
mGrpId);
7287 mmd->setLanguage(root->
lang);
7288 mmd->setId(root->
id);
7292 mmd->setRefItems(root->
sli);
7293 mmd->setRequirementReferences(root->
rqli);
7294 if (root->
relatesType==RelatesType::Duplicate) mmd->setRelatedAlso(cd);
7302 if (!
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec))
7307 "Cannot determine file/namespace for relatedalso function\n{}",
7321 addLocalObjCMethod(root,scopeName,funcType,funcName,funcArgs,exceptions,funcDecl,spec);
7325 bool globMem =
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec);
7326 if (className.
isEmpty() && !globMem)
7330 else if (!className.
isEmpty() && !globMem)
7333 "member '{}' of class '{}' cannot be found",
7334 funcName,className);
7352 AUTO_TRACE(
"root->type='{}' root->inside='{}' root->name='{}' root->args='{}' section={} root->spec={} root->mGrpId={}",
7367 type=type.
left(i+l);
7378 if (root->
section.isMemberDoc())
7404 else if (root->
section.isOverloadDoc())
7418 (root->
section.isVariable() &&
7430 if (type==
"friend class" || type==
"friend struct" ||
7431 type==
"friend union")
7437 type+
" "+root->
name,
7470 else if (root->
section.isVariableDoc())
7482 else if (root->
section.isExportedInterface() ||
7483 root->
section.isIncludedService())
7489 type +
" " + root->
name,
7502 if (root->
section.isMemberDoc() ||
7503 root->
section.isOverloadDoc() ||
7506 root->
section.isVariableDoc() ||
7508 root->
section.isIncludedService() ||
7509 root->
section.isExportedInterface()
7519 for (
const auto &e : root->
children())
7521 if (!e->section.isEnum())
7533 for (
const auto &objCImpl : root->
children())
7535 if (objCImpl->section.isObjcImpl())
7537 for (
const auto &objCMethod : objCImpl->children())
7539 if (objCMethod->section.isFunction())
7543 objCMethod->relates,
7546 objCMethod->type+
" "+objCImpl->name+
"::"+objCMethod->name+
" "+objCMethod->args,
7548 objCMethod->section=EntryType::makeEmpty();
7567 bool isGlobal =
false;
7568 bool isRelated =
false;
7569 bool isMemberOf =
false;
7579 if (root->
lang==SrcLangExt::CSharp)
7602 isMemberOf=(root->
relatesType==RelatesType::MemberOf);
7637 isMemberOf ? Relationship::Foreign : isRelated ? Relationship::Related : Relationship::Member,
7641 mmd->setTagInfo(root->
tagInfo());
7642 mmd->setLanguage(root->
lang);
7643 mmd->setId(root->
id);
7644 if (!isGlobal) mmd->setMemberClass(cd);
else mmd->setFileDef(fd);
7646 mmd->setBodyDef(root->
fileDef());
7647 mmd->setMemberSpecifiers(root->
spec);
7648 mmd->setVhdlSpecifiers(root->
vhdlSpec);
7649 mmd->setEnumBaseType(root->
args);
7652 mmd->addSectionsToDefinition(root->
anchors);
7653 mmd->setMemberGroupId(root->
mGrpId);
7657 mmd->setRefItems(root->
sli);
7658 mmd->setRequirementReferences(root->
rqli);
7672 mmd->setDefinition(name+baseType);
7676 mmd->setDefinition(nd->
name()+
"::"+name+baseType);
7680 mmd->setNamespace(nd);
7687 if (isGlobal && (nd==
nullptr || !nd->
isAnonymous()))
7689 if (!defSet) mmd->setDefinition(name+baseType);
7690 if (fd==
nullptr && root->
parent())
7696 mmd->setFileDef(fd);
7704 mmd->setDefinition(name+baseType);
7708 mmd->setDefinition(cd->
name()+
"::"+name+baseType);
7714 mmd->setDocsForDefinition(!root->
proto);
7744 bool isGlobal =
false;
7745 bool isRelated =
false;
7755 if (root->
lang==SrcLangExt::CSharp)
7770 if (root->
lang==SrcLangExt::CSharp)
7816 struct EnumValueInfo
7818 EnumValueInfo(
const QCString &n,std::unique_ptr<MemberDef> &&md) :
7819 name(n), member(std::move(md)) {}
7821 std::unique_ptr<MemberDef> member;
7823 std::vector< EnumValueInfo > extraMembers;
7825 for (
const auto &imd : *mn)
7832 for (
const auto &e : root->
children())
7835 bool isJavaLike = sle==SrcLangExt::CSharp || sle==SrcLangExt::Java || sle==SrcLangExt::XML;
7836 if ( isJavaLike || root->
spec.isStrong())
7838 if (sle == SrcLangExt::Cpp && e->section.isDefine())
continue;
7845 i = qualifiedName.
findRev(
"::");
7846 if (i!=-1 && sle==SrcLangExt::CSharp)
7852 qualifiedName=
substitute(qualifiedName,
"::",
".");
7857 if (fileName.
isEmpty() && e->tagInfo())
7859 fileName = e->tagInfo()->tagName;
7863 fileName,e->startLine,e->startColumn,
7864 e->type,e->name,e->args,
QCString(),
7865 e->protection, Specifier::Normal,e->isStatic,Relationship::Member,
7872 fmmd->setNamespace(mnd);
7876 fmmd->setTagInfo(e->tagInfo());
7877 fmmd->setLanguage(e->lang);
7878 fmmd->setBodySegment(e->startLine,e->bodyLine,e->endBodyLine);
7879 fmmd->setBodyDef(e->fileDef());
7881 fmmd->setDocumentation(e->doc,e->docFile,e->docLine);
7882 fmmd->setBriefDescription(e->brief,e->briefFile,e->briefLine);
7883 fmmd->addSectionsToDefinition(e->anchors);
7884 fmmd->setInitializer(e->initializer.str());
7885 fmmd->setMaxInitLines(e->initLines);
7886 fmmd->setMemberGroupId(e->mGrpId);
7887 fmmd->setExplicitExternal(e->explicitExternal,fileName,e->startLine,e->startColumn);
7888 fmmd->setRefItems(e->sli);
7889 fmmd->setRequirementReferences(e->rqli);
7892 fmmd->setEnumScope(md,
TRUE);
7893 extraMembers.emplace_back(e->name,std::move(fmd));
7902 if (!e->name.isEmpty() && (fmn=emnsd->
find(e->name)))
7905 for (
const auto &ifmd : *fmn)
7936 else if (isRelated && cd)
7968 for (
auto &e : extraMembers)
8014 if (gd==
nullptr && !root->
groups.empty())
8028 for (
const auto &g : root->
groups)
8047 "Found non-existing group '{}' for the command '{}', ignoring command",
8061 if (root->
section.isEnumDoc() &&
8087 AUTO_TRACE(
"Found docs for enum with name '{}' and scope '{}' in context '{}' cd='{}', nd='{}' fd='{}'",
8101 for (
const auto &imd : *mn)
8116 else if (cd==
nullptr && mcd==
nullptr && nd!=
nullptr && mnd==nd)
8123 else if (cd==
nullptr && nd==
nullptr && mcd==
nullptr && mnd==
nullptr && fd==mfd)
8148 for (
const auto &mn : mnsd)
8151 for (
const auto &imd : *mn)
8156 int documentedEnumValues=0;
8160 if (fmd->isLinkableInProject()) documentedEnumValues++;
8186 for (
const auto &md : *mn)
8188 index.addClassMemberNameToIndex(md.get());
8189 if (md->getModuleDef())
8191 index.addModuleMemberNameToIndex(md.get());
8199 for (
const auto &md : *mn)
8201 if (md->getNamespaceDef())
8203 index.addNamespaceMemberNameToIndex(md.get());
8207 index.addFileMemberNameToIndex(md.get());
8209 if (md->getModuleDef())
8211 index.addModuleMemberNameToIndex(md.get());
8216 index.sortMemberIndexLists();
8225 if (cd->isLinkableInProject())
8238 if (cd->isLinkableInProject())
8251 if (nd->isLinkableInProject())
8264 for (
const auto &fd : *fn)
8280 std::string s = title.str();
8281 static const reg::Ex re(R
"(\a[\w-]*)");
8284 for (; it!=
end ; ++it)
8286 const auto &match = *it;
8287 std::string matchStr = match.str();
8295 if (gd->isLinkableInProject())
8297 addWordsForTitle(gd.get(),gd->anchor(),gd->groupTitle());
8303 if (pd->isLinkableInProject())
8305 addWordsForTitle(pd.get(),pd->anchor(),pd->title());
8325 if (md->getClassDef())
8329 if (md->getNamespaceDef())
8340 if (md->getGroupDef()) scope = md->getGroupDef();
8341 else if (md->getClassDef()) scope = md->getClassDef();
8342 else if (md->getNamespaceDef()) scope = md->getNamespaceDef();
8343 else if (md->getFileDef()) scope = md->getFileDef();
8349 if (md->isLinkableInProject())
8351 if (!(md->isEnumerate() && md->isAnonymous()))
8356 if (md->isEnumerate())
8358 for (
const auto &fmd : md->enumFieldList())
8371 for (
const auto &md : *mn)
8373 addMemberToIndices(md.get());
8380 for (
const auto &md : *mn)
8382 addMemberToIndices(md.get());
8395 for (
const auto &imd : *mn)
8408 for (
const auto &imd : *mn)
8425 for (
const auto &imd : *mn)
8434 const auto &bmni = bmn.
find(mn->memberName());
8437 for (
const auto &ibmd : *bmni)
8445 lang==SrcLangExt::Python ||
8446 lang==SrcLangExt::Java ||
8447 lang==SrcLangExt::PHP ||
8458 lang==SrcLangExt::Python ||
8465 if (lang==SrcLangExt::Python && md->
name().
startsWith(
"__"))
continue;
8505 if (cd->isLinkable())
8507 for (
const auto &bcd : cd->baseClasses())
8523 for (
const auto &ti : cd->getTemplateInstances())
8542 int i=cd->name().find(
'(');
8549 AUTO_TRACE_ADD(
"merging members of category {} into {}",cd->name(),baseClass->
name());
8564 cd->subClasses().empty() &&
8565 !cd->baseClasses().empty())
8596 msg(
"Generating code for file {}...\n",fd->
docName());
8601 else if (parseSources)
8603 msg(
"Parsing code for file {}...\n",fd->
docName());
8619 for (
const auto &fd : *fn)
8627 for (
const auto &fd : *fn)
8636 clangParser->parse();
8637 processSourceFile(fd.get(),*
g_outputList,clangParser.get());
8639 for (
auto incFile : clangParser->filesInSameTU())
8641 if (filesToProcess.find(incFile)!=filesToProcess.end() &&
8643 processedFiles.
find(incFile)==processedFiles.end())
8650 processSourceFile(ifd,*
g_outputList,clangParser.get());
8651 processedFiles.insert(incFile);
8662 for (
const auto &fd : *fn)
8664 if (processedFiles.find(fd->
absFilePath().
str())==processedFiles.end())
8669 clangParser->parse();
8670 processSourceFile(fd.get(),*
g_outputList,clangParser.get());
8683 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8686 msg(
"Generating code files using {} threads.\n",numThreads);
8687 struct SourceContext
8690 : fd(fd_), generateSourceFile(gen_), ol(ol_) {}
8692 bool generateSourceFile;
8696 std::vector< std::future< std::shared_ptr<SourceContext> > > results;
8699 for (
const auto &fd : *fn)
8702 auto ctx = std::make_shared<SourceContext>(fd.get(),generateSourceFile,*
g_outputList);
8703 auto processFile = [ctx]()
8705 if (ctx->generateSourceFile)
8707 msg(
"Generating code for file {}...\n",ctx->fd->docName());
8711 msg(
"Parsing code for file {}...\n",ctx->fd->docName());
8714 ctx->fd->getAllIncludeFilesRecursively(filesInSameTu);
8715 if (ctx->generateSourceFile)
8717 ctx->fd->writeSourceHeader(ctx->ol);
8718 ctx->fd->writeSourceBody(ctx->ol,
nullptr);
8719 ctx->fd->writeSourceFooter(ctx->ol);
8724 ctx->fd->parseSource(
nullptr);
8728 results.emplace_back(threadPool.
queue(processFile));
8731 for (
auto &f : results)
8740 for (
const auto &fd : *fn)
8760 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8766 : fd(fd_), ol(ol_) {}
8771 std::vector< std::future< std::shared_ptr<DocContext> > > results;
8774 for (
const auto &fd : *fn)
8776 bool doc = fd->isLinkableInProject();
8779 auto ctx = std::make_shared<DocContext>(fd.get(),*
g_outputList);
8780 auto processFile = [ctx]() {
8781 msg(
"Generating docs for file {}...\n",ctx->fd->docName());
8782 ctx->fd->writeDocumentation(ctx->ol);
8785 results.emplace_back(threadPool.
queue(processFile));
8789 for (
auto &f : results)
8798 for (
const auto &fd : *fn)
8800 bool doc = fd->isLinkableInProject();
8803 msg(
"Generating docs for file {}...\n",fd->docName());
8822 const_cast<FileDef*
>(fd)->addSourceRef(cd->getStartDefLine(),cd.get(),
nullptr);
8831 const_cast<FileDef*
>(fd)->addSourceRef(cd->getStartDefLine(),cd.get(),
nullptr);
8840 const_cast<FileDef*
>(fd)->addSourceRef(nd->getStartDefLine(),nd.get(),
nullptr);
8847 for (
const auto &md : *mn)
8856 md->isLinkableInProject() &&
8862 const_cast<FileDef*
>(fd)->addSourceRef(md->getStartDefLine(),md->getOuterScope(),md.get());
8868 for (
const auto &md : *mn)
8878 md->isLinkableInProject() &&
8884 const_cast<FileDef*
>(fd)->addSourceRef(md->getStartDefLine(),md->getOuterScope(),md.get());
8901 for (
const auto &def : it->second)
8904 def.fileName,def.lineNr,def.columnNr,
8905 "#define",def.name,def.args,
QCString(),
8910 if (!def.args.isEmpty())
8914 mmd->setInitializer(def.definition);
8915 mmd->setFileDef(def.fileDef);
8916 mmd->setDefinition(
"#define "+def.name);
8921 const MemberList *defMl = def.fileDef->getMemberList(MemberListType::DocDefineMembers());
8930 def.fileDef->insertMember(md.get());
8932 AUTO_TRACE_ADD(
"adding macro {} with definition {}",def.name,def.definition);
8966 for (
const auto &fd : *fn)
8968 fd->sortMemberLists();
8975 gd->sortMemberLists();
8992 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8996 std::vector < std::future< void > > results;
9000 for (
const auto &def : symList)
9003 if (dm && !
isSymbolHidden(def) && !def->isArtificial() && def->isLinkableInProject())
9005 auto processTooltip = [dm]() {
9008 results.emplace_back(threadPool.
queue(processTooltip));
9013 for (
auto &f : results)
9022 for (
const auto &def : symList)
9025 if (dm && !
isSymbolHidden(def) && !def->isArtificial() && def->isLinkableInProject())
9072 for (
const auto &fd : *fn)
9094 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
9100 : cd(cd_), ol(ol_) {}
9105 std::vector< std::future< std::shared_ptr<DocContext> > > results;
9106 for (
const auto &cd : classList)
9109 if (cd->getOuterScope()==
nullptr ||
9113 auto ctx = std::make_shared<DocContext>(cd,*
g_outputList);
9114 auto processFile = [ctx]()
9116 msg(
"Generating docs for compound {}...\n",ctx->cd->displayName());
9120 if (!ctx->cd->isHidden() && !ctx->cd->isEmbeddedInOuterScope() &&
9121 ctx->cd->isLinkableInProject() && !ctx->cd->isImplicitTemplateInstance())
9123 ctx->cd->writeDocumentation(ctx->ol);
9124 ctx->cd->writeMemberList(ctx->ol);
9128 ctx->cd->writeDocumentationForInnerClasses(ctx->ol);
9131 results.emplace_back(threadPool.
queue(processFile));
9134 for (
auto &f : results)
9141 for (
const auto &cd : classList)
9145 if (cd->getOuterScope()==
nullptr ||
9151 if ( !cd->isHidden() && !cd->isEmbeddedInOuterScope() &&
9152 cd->isLinkableInProject() && !cd->isImplicitTemplateInstance())
9154 msg(
"Generating docs for compound {}...\n",cd->displayName());
9169 for (
const auto &innerCdi : cd->
getClasses())
9174 AUTO_TRACE(
"innerCd={} isLinkable={} isImplicitTemplateInstance={} protectLevelVisible={} embeddedInOuterScope={}",
9183 list.push_back(innerCd);
9191 std::vector<ClassDefMutable*> classList;
9240 for (
const auto &imd : *mn)
9276 for (
const auto &fd : *fn)
9278 fd->combineUsingRelations();
9310 for (
const auto &fd : *fn)
9312 fd->addMembersToMemberGroup();
9327 gd->addMembersToMemberGroup();
9348 for (
const auto &fd : *fn)
9350 fd->distributeMemberGroupDocumentation();
9365 gd->distributeMemberGroupDocumentation();
9395 for (
const auto &fd : *fn)
9397 fd->findSectionsInDocumentation();
9412 gd->findSectionsInDocumentation();
9417 pd->findSectionsInDocumentation();
9422 dd->findSectionsInDocumentation();
9443 elementsToRemove.push_back(ci.first);
9446 for (
const auto &k : elementsToRemove)
9457 for (
const auto &ifmd : *fn)
9471 for (
const auto &imd : *nm)
9503 elementsToRemove.push_back(ci.first);
9506 for (
const auto &k : elementsToRemove)
9515 for (
const auto &ifmd : *fn)
9528 for (
const auto &imd : *nm)
9548 return fd->absFilePath() == root->
fileName;
9596 mmd->setTagInfo(root->
tagInfo());
9597 mmd->setLanguage(root->
lang);
9609 for (
const auto &md : *mn)
9615 for (
const auto &imd : *mn)
9633 for (
const auto &imd : *mn)
9660 warn(root->
fileName,root->
startLine,
"found documented #define {} but ignoring it because ENABLE_PREPROCESSING is NO.", root->
name);
9674 normalizedName =
substitute(normalizedName,
"\\",
"/");
9677 if (root->
docFile==normalizedName)
9679 int lastSlashPos=normalizedName.
findRev(
'/');
9680 if (lastSlashPos!=-1)
9682 normalizedName=normalizedName.
left(lastSlashPos);
9685 if (normalizedName.
at(normalizedName.
length()-1)!=
'/')
9687 normalizedName+=
'/';
9689 DirDef *matchingDir=
nullptr;
9693 if (dir->name().right(normalizedName.
length())==normalizedName)
9698 "\\dir command matches multiple directories.\n"
9699 " Applying the command for directory {}\n"
9700 " Ignoring the command for directory {}",
9701 matchingDir->
name(),dir->name()
9706 matchingDir=dir.get();
9723 warn(root->
fileName,root->
startLine,
"No matching directory found for command \\dir {}",normalizedName);
9732 if (root->
section.isRequirementDoc())
9744 if (root->
section.isPageDoc())
9751 else if (root->
section.isMainpageDoc())
9771 if (root->
section.isMainpageDoc())
9804 else if (si->
lineNr() != -1)
9806 warn(root->
fileName,root->
startLine,
"multiple use of section label '{}' for main page, (first occurrence: {}, line {})",
9811 warn(root->
fileName,root->
startLine,
"multiple use of section label '{}' for main page, (first occurrence: {})",
9828 else if (root->
tagInfo()==
nullptr)
9831 "found more than one \\mainpage comment block! (first occurrence: {}, line {}), Skipping current block!",
9841 if (root->
section.isMainpageDoc())
9865 term(
"page defined {} with label {} is a direct "
9866 "subpage of itself! Please remove this cyclic dependency.\n",
9890 term(
"page defined {} with label {} is a subpage "
9891 "of itself! Please remove this cyclic dependency.\n",
9892 warn_line(pd->docFile(),pd->docLine()),pd->name());
9918 if (si->label().left(label.
length())==label)
9920 si->setFileName(rl->listName());
9921 si->setGenerated(
TRUE);
9927 if (!si->generated())
9931 if (!si->fileName().isEmpty() &&
9938 if (si->definition())
9945 gd = (
toMemberDef(si->definition()))->getGroupDef();
9975 if (!pd->getGroupDef() && !pd->isReference())
9977 msg(
"Generating docs for page {}...\n",pd->name());
9992 warn(root->
fileName,root->
startLine,
"Example {} was already documented. Ignoring documentation found here.",root->
name);
10020 indentStr.
fill(
' ',indent);
10022 indentStr.
isEmpty()?
"":indentStr,
10027 for (
const auto &e : root->
children())
10045 si->label(),si->fileName(),si->title(),si->type().level(),si->ref());
10059 msg(
"Generating docs for example {}...\n",pd->name());
10061 if (lang != SrcLangExt::Unknown)
10065 intf->resetCodeParserState();
10067 QCString n=pd->getOutputFileBase();
10074 if (pd->showLineNo())
10076 lineNoOptStr=
"{lineno}";
10082 (pd->briefDescription().isEmpty()?
"":pd->briefDescription()+
"\n\n")+
10083 pd->documentation()+
"\n\n\\include"+lineNoOptStr+
" "+pd->name(),
10085 .setIndexWords(
true)
10086 .setExample(pd->name()));
10099 if (!gd->isReference())
10111 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10117 : cdm(cdm_), ol(ol_) {}
10122 std::vector< std::future< std::shared_ptr<DocContext> > > results;
10124 for (
const auto &cd : classList)
10129 auto ctx = std::make_shared<DocContext>(cdm,*
g_outputList);
10130 auto processFile = [ctx]()
10132 if ( ( ctx->cdm->isLinkableInProject() &&
10133 !ctx->cdm->isImplicitTemplateInstance()
10136 && !ctx->cdm->isHidden() && !ctx->cdm->isEmbeddedInOuterScope()
10139 msg(
"Generating docs for compound {}...\n",ctx->cdm->displayName());
10140 ctx->cdm->writeDocumentation(ctx->ol);
10141 ctx->cdm->writeMemberList(ctx->ol);
10143 ctx->cdm->writeDocumentationForInnerClasses(ctx->ol);
10146 results.emplace_back(threadPool.
queue(processFile));
10150 for (
auto &f : results)
10152 auto ctx = f.get();
10158 for (
const auto &cd : classList)
10163 if ( ( cd->isLinkableInProject() &&
10164 !cd->isImplicitTemplateInstance()
10167 && !cd->isHidden() && !cd->isEmbeddedInOuterScope()
10170 msg(
"Generating docs for compound {}...\n",cd->displayName());
10184 for (
const auto &cd : conceptList)
10189 msg(
"Generating docs for concept {}...\n",cd->name());
10204 if (nd->isLinkableInProject())
10209 msg(
"Generating docs for namespace {}\n",nd->displayName());
10247 QCString cmd=qhgLocation+
" -v 2>&1";
10252 err(
"could not execute {}\n",qhgLocation);
10256 const size_t bufSize = 1024;
10257 char inBuf[bufSize+1];
10258 size_t numRead=fread(inBuf,1,bufSize,f);
10259 inBuf[numRead] =
'\0';
10264 static const reg::Ex versionReg(R
"(Qt (\d+)\.(\d+)\.(\d+))");
10266 std::string s = inBuf;
10273 if (qtVersion>0 && (qtVersion<60000 || qtVersion >= 60205))
10282 err(
"could not execute {}\n",qhgLocation);
10286 std::string output;
10287 while ((numRead=fread(inBuf,1,bufSize,f))>0)
10289 inBuf[numRead] =
'\0';
10321 warn_uncond(
"the dot tool could not be found as '{}'\n",dotPath);
10327 size_t l=dotPath.
length();
10328 for (
size_t i=0;i<l;i++)
if (dotPath.
at(i)==
'/') dotPath.
at(i)=
'\\';
10347 bool updateOnly=
FALSE)
10351 bool writeToStdout=configFile==
"-";
10356 if (!writeToStdout)
10360 msg(
"\n\nConfiguration file '{}' created.\n\n",configFile);
10361 msg(
"Now edit the configuration file and enter\n\n");
10362 if (configFile!=
"Doxyfile" && configFile!=
"doxyfile")
10363 msg(
" doxygen {}\n\n",configFile);
10365 msg(
" doxygen\n\n");
10366 msg(
"to generate the documentation for your project\n\n");
10370 msg(
"\n\nConfiguration file '{}' updated.\n\n",configFile);
10376 term(
"Cannot open file {} for writing\n",configFile);
10391 term(
"Cannot open stdout for writing\n");
10402 int eqPos = tagLine.
find(
'=');
10412 fileName = tagLine;
10418 err(
"Tag file '{}' does not exist or is not a file. Skipping it...\n",fileName);
10429 msg(
"Reading tag file '{}', location '{}'...\n",fileName,destName);
10433 msg(
"Reading tag file '{}'...\n",fileName);
10443 for (
const auto &sheet : latexExtraStyleSheet)
10445 std::string fileName = sheet;
10446 if (!fileName.empty())
10451 err(
"Style sheet '{}' specified by LATEX_EXTRA_STYLESHEET does not exist!\n",fileName);
10453 else if (fi.
isDir())
10455 err(
"Style sheet '{}' specified by LATEX_EXTRA_STYLESHEET is a directory, it has to be a file!\n", fileName);
10474 if (!htmlStyleSheet.
isEmpty())
10481 err(
"Style sheet '{}' specified by HTML_STYLESHEET does not exist!\n",htmlStyleSheet);
10484 else if (fi.
isDir())
10486 err(
"Style sheet '{}' specified by HTML_STYLESHEET is a directory, it has to be a file!\n",htmlStyleSheet);
10492 copyFile(htmlStyleSheet,destFileName);
10497 for (
const auto &sheet : htmlExtraStyleSheet)
10505 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET does not exist!\n",fileName);
10509 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET is already a built-in stylesheet. Please use a different name\n",fi.
fileName());
10511 else if (fi.
isDir())
10513 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET is a directory, it has to be a file!\n",fileName);
10532 err(
"Project logo '{}' specified by PROJECT_LOGO does not exist!\n",projectLogo);
10535 else if (fi.
isDir())
10537 err(
"Project logo '{}' specified by PROJECT_LOGO is a directory, it has to be a file!\n",projectLogo);
10543 copyFile(projectLogo,destFileName);
10557 err(
"Project icon '{}' specified by PROJECT_ICON does not exist!\n",projectIcon);
10560 else if (fi.
isDir())
10562 err(
"Project icon '{}' specified by PROJECT_ICON is a directory, it has to be a file!\n",projectIcon);
10568 copyFile(projectIcon,destFileName);
10576 for (
const auto &fileName : files)
10578 if (!fileName.empty())
10583 err(
"Extra file '{}' specified in {} does not exist!\n", fileName,filesOption);
10585 else if (fi.
isDir())
10587 err(
"Extra file '{}' specified in {} is a directory, it has to be a file!\n", fileName,filesOption);
10613 std::vector<FileEntry> fileEntries;
10614 for (
const auto &fd : *fn)
10616 if (!fd->isReference())
10618 fileEntries.emplace_back(fd->getPath(),fd.get());
10622 size_t size = fileEntries.size();
10626 FileDef *fd = fileEntries[0].fileDef;
10632 std::stable_sort(fileEntries.begin(),
10634 [](
const FileEntry &fe1,
const FileEntry &fe2)
10635 { return qstricmp_sort(fe1.path,fe2.path)<0; }
10640 const FileEntry &first = fileEntries[0];
10641 const FileEntry &last = fileEntries[size-1];
10642 int first_path_size =
static_cast<int>(first.path.size())-1;
10643 int last_path_size =
static_cast<int>(last.path.size())-1;
10646 for (i=0;i<first_path_size && i<last_path_size;i++)
10648 if (first.path[i]==
'/') j=i;
10649 if (first.path[i]!=last.path[i])
break;
10651 if (i==first_path_size && i<last_path_size && last.path[i]==
'/')
10656 else if (i==last_path_size && i<first_path_size && first.path[i]==
'/')
10663 for (
auto &fileEntry : fileEntries)
10665 QCString prefix = fileEntry.path.right(fileEntry.path.length()-j-1);
10666 fileEntry.fileDef->setName(
prefix+fn->fileName());
10668 fileEntry.fileDef->setDiskName(
prefix+fn->fileName());
10682 int sep = fileName.
findRev(
'/');
10683 int ei = fileName.
findRev(
'.');
10684 if (ei!=-1 && (sep==-1 || ei>sep))
10690 extension =
".no_extension";
10703 int ei = fileName.
findRev(
'.');
10710 extension =
".no_extension";
10714 std::string preBuf;
10721 for (
const auto &s : includePath)
10727 msg(
"Preprocessing {}...\n",fn);
10734 msg(
"Reading {}...\n",fn);
10739 std::string convBuf;
10740 convBuf.reserve(preBuf.size()+1024);
10745 std::shared_ptr<Entry> fileRoot = std::make_shared<Entry>();
10749 if (newTU) clangParser->
parse();
10752 parser.
parseInput(fileName,convBuf.
data(),fileRoot,clangParser);
10753 fileRoot->setFileDef(fd);
10770 filesToProcess.insert(s);
10773 std::mutex processedFilesLock;
10775 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10776 msg(
"Processing input using {} threads.\n",numThreads);
10778 using FutureType = std::vector< std::shared_ptr<Entry> >;
10779 std::vector< std::future< FutureType > > results;
10782 bool ambig =
false;
10789 auto processFile = [qs,&filesToProcess,&processedFilesLock,&processedFiles]() {
10790 bool ambig_l =
false;
10791 std::vector< std::shared_ptr<Entry> > roots;
10795 auto fileRoot {
parseFile(*parser.get(),fd_l,qs,clangParser.get(),
true) };
10796 roots.push_back(fileRoot);
10800 for (
auto incFile : clangParser->filesInSameTU())
10803 if (filesToProcess.find(incFile)!=filesToProcess.end())
10805 bool needsToBeProcessed =
false;
10807 std::lock_guard<std::mutex> lock(processedFilesLock);
10808 needsToBeProcessed = processedFiles.find(incFile)==processedFiles.end();
10809 if (needsToBeProcessed) processedFiles.insert(incFile);
10811 if (qincFile!=qs && needsToBeProcessed)
10817 fileRoot =
parseFile(*parser.get(),ifd,qincFile,clangParser.get(),
false);
10818 roots.push_back(fileRoot);
10826 results.emplace_back(threadPool.
queue(processFile));
10830 for (
auto &f : results)
10835 root->moveToSubEntryAndKeep(e);
10842 if (processedFiles.find(s)==processedFiles.end())
10845 auto processFile = [s]() {
10846 bool ambig =
false;
10848 std::vector< std::shared_ptr<Entry> > roots;
10855 auto fileRoot =
parseFile(*parser.get(),fd,qs,clangParser.get(),
true);
10856 roots.push_back(fileRoot);
10860 auto fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
10861 roots.push_back(fileRoot);
10865 results.emplace_back(threadPool.
queue(processFile));
10869 for (
auto &f : results)
10874 root->moveToSubEntryAndKeep(e);
10881 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10882 msg(
"Processing input using {} threads.\n",numThreads);
10884 using FutureType = std::shared_ptr<Entry>;
10885 std::vector< std::future< FutureType > > results;
10889 auto processFile = [s]() {
10890 bool ambig =
false;
10894 auto fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
10898 results.emplace_back(threadPool.
queue(processFile));
10901 for (
auto &f : results)
10903 root->moveToSubEntryAndKeep(f.get());
10921 filesToProcess.insert(s);
10927 bool ambig =
false;
10935 auto fileRoot =
parseFile(*parser.get(),fd,qs,clangParser.get(),
true);
10936 root->moveToSubEntryAndKeep(fileRoot);
10937 processedFiles.insert(s);
10941 for (
auto incFile : clangParser->filesInSameTU())
10944 if (filesToProcess.find(incFile)!=filesToProcess.end() &&
10945 processedFiles.find(incFile)==processedFiles.end())
10951 fileRoot =
parseFile(*parser.get(),ifd,incFile,clangParser.get(),
false);
10952 root->moveToSubEntryAndKeep(fileRoot);
10953 processedFiles.insert(incFile);
10962 if (processedFiles.find(s)==processedFiles.end())
10964 bool ambig =
false;
10971 auto fileRoot =
parseFile(*parser.get(),fd,qs,clangParser.get(),
true);
10972 root->moveToSubEntryAndKeep(fileRoot);
10977 std::shared_ptr<Entry> fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
10978 root->moveToSubEntryAndKeep(fileRoot);
10980 processedFiles.insert(s);
10989 bool ambig =
false;
10994 std::shared_ptr<Entry> fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
10995 root->moveToSubEntryAndKeep(std::move(fileRoot));
11015 sepPos = result.
find(
'/',2);
11017 sepPos = result.
find(
'/',sepPos+1);
11019 sepPos = result.
find(
'/',sepPos+1);
11022 if (nonSymlinks.find(
prefix.str())==nonSymlinks.end())
11039 target+=result.
mid(sepPos);
11042 if (known.find(result.
str())!=known.end())
return std::string();
11043 known.insert(result.
str());
11056 nonSymlinks.insert(
prefix.str());
11062 while (sepPos!=-1);
11081 bool errorIfNotExist,
11088 if (paths && !dirName.empty())
11090 paths->insert(dirName);
11096 if (dirName.empty())
11111 msg(
"Searching for files in directory {}\n", fi->
absFilePath());
11116 for (
const auto &dirEntry : dir.
iterator())
11119 auto checkPatterns = [&]() ->
bool
11121 return (patList==
nullptr ||
patternMatch(cfi,*patList)) &&
11122 (exclPatList==
nullptr || !
patternMatch(cfi,*exclPatList)) &&
11123 (killSet==
nullptr || killSet->find(cfi.
absFilePath())==killSet->end());
11126 if (exclSet==
nullptr || exclSet->find(cfi.
absFilePath())==exclSet->end())
11134 if (errorIfNotExist && checkPatterns())
11139 else if (cfi.
isFile() && checkPatterns())
11142 std::string path=cfi.
dirPath()+
"/";
11143 std::string fullName=path+name;
11150 fn = fnMap->
add(name,fullName);
11151 fn->push_back(std::move(fd));
11154 dirResultList.push_back(fullName);
11155 if (resultSet) resultSet->insert(fullName);
11156 if (killSet) killSet->insert(fullName);
11158 else if (recursive &&
11160 (exclPatList==
nullptr || !
patternMatch(cfi,*exclPatList)) &&
11165 patList,exclPatList,&dirResultList,resultSet,errorIfNotExist,
11166 recursive,killSet,paths);
11170 if (resultList && !dirResultList.empty())
11173 std::stable_sort(dirResultList.begin(),
11174 dirResultList.end(),
11175 [](
const auto &f1,
const auto &f2) { return qstricmp_sort(f1.c_str(),f2.c_str())<0; });
11178 resultList->insert(resultList->end(), dirResultList.begin(), dirResultList.end());
11195 bool errorIfNotExist,
11209 if (exclSet==
nullptr || exclSet->find(fi.
absFilePath())==exclSet->end())
11216 if (errorIfNotExist)
11218 warn_uncond(
"source '{}' is not a readable file or directory... skipping.\n",s);
11223 std::string dirPath = fi.
dirPath(
true);
11225 if (paths && !dirPath.empty())
11227 paths->insert(dirPath);
11230 if (killSet==
nullptr || killSet->find(filePath)==killSet->end())
11239 fn->push_back(std::move(fd));
11242 if (resultList || resultSet)
11244 if (resultList) resultList->push_back(filePath);
11245 if (resultSet) resultSet->insert(filePath);
11251 else if (fi.
isDir())
11253 readDir(&fi,fnMap,exclSet,patList,
11254 exclPatList,resultList,resultSet,errorIfNotExist,
11255 recursive,killSet,paths);
11269 anchor=
":"+md->
anchor();
11278 t <<
"REPLACE INTO symbols (symbol_id,scope_id,name,file,line) VALUES('"
11279 << fn+anchor <<
"','"
11281 << d->
name() <<
"','"
11295 for (
const auto &def : symList)
11307 msg(
"Developer parameters:\n");
11308 msg(
" -m dump symbol map\n");
11309 msg(
" -b making messages output unbuffered\n");
11310 msg(
" -c <file> process input file as a comment block and produce HTML output\n");
11312 msg(
" -t [<file|stdout|stderr>] trace debug info to file, stdout, or stderr (default file stdout)\n");
11313 msg(
" -t_time [<file|stdout|stderr>] trace debug info to file, stdout, or stderr (default file stdout),\n"
11314 " and include time and thread information\n");
11316 msg(
" -d <level> enable a debug level, such as (multiple invocations of -d are possible):\n");
11327 QCString versionString = getFullVersion();
11328 msg(
"{}\n",versionString);
11332 if (!extVers.
isEmpty()) extVers+=
", ";
11333 extVers +=
"sqlite3 ";
11334 extVers += sqlite3_libversion();
11336 if (!extVers.
isEmpty()) extVers+=
", ";
11337 extVers +=
"clang support ";
11338 extVers += CLANG_VERSION_STRING;
11342 int lastComma = extVers.
findRev(
',');
11343 if (lastComma != -1) extVers = extVers.
replace(lastComma,1,
" and");
11344 msg(
" with {}.\n",extVers);
11355 msg(
"Doxygen version {0}\nCopyright Dimitri van Heesch 1997-2025\n\n"
11356 "You can use Doxygen in a number of ways:\n\n"
11357 "1) Use Doxygen to generate a template configuration file*:\n"
11358 " {1} [-s] -g [configName]\n\n"
11359 "2) Use Doxygen to update an old configuration file*:\n"
11360 " {1} [-s] -u [configName]\n\n"
11361 "3) Use Doxygen to generate documentation using an existing "
11362 "configuration file*:\n"
11363 " {1} [configName]\n\n"
11364 "4) Use Doxygen to generate a template file controlling the layout of the\n"
11365 " generated documentation:\n"
11366 " {1} -l [layoutFileName]\n\n"
11367 " In case layoutFileName is omitted DoxygenLayout.xml will be used as filename.\n"
11368 " If - is used for layoutFileName Doxygen will write to standard output.\n\n"
11369 "5) Use Doxygen to generate a template style sheet file for RTF, HTML or Latex.\n"
11370 " RTF: {1} -w rtf styleSheetFile\n"
11371 " HTML: {1} -w html headerFile footerFile styleSheetFile [configFile]\n"
11372 " LaTeX: {1} -w latex headerFile footerFile styleSheetFile [configFile]\n\n"
11373 "6) Use Doxygen to generate a rtf extensions file\n"
11374 " {1} -e rtf extensionsFile\n\n"
11375 " If - is used for extensionsFile Doxygen will write to standard output.\n\n"
11376 "7) Use Doxygen to compare the used configuration file with the template configuration file\n"
11377 " {1} -x [configFile]\n\n"
11378 " Use Doxygen to compare the used configuration file with the template configuration file\n"
11379 " without replacing the environment variables or CMake type replacement variables\n"
11380 " {1} -x_noenv [configFile]\n\n"
11381 "8) Use Doxygen to show a list of built-in emojis.\n"
11382 " {1} -f emoji outputFileName\n\n"
11383 " If - is used for outputFileName Doxygen will write to standard output.\n\n"
11384 "*) If -s is specified the comments of the configuration items in the config file will be omitted.\n"
11385 " If configName is omitted 'Doxyfile' will be used as a default.\n"
11386 " If - is used for configFile Doxygen will write / read the configuration to /from standard output / input.\n\n"
11387 "If -q is used for a Doxygen documentation run, Doxygen will see this as if QUIET=YES has been set.\n\n"
11388 "-v print version string, -V print extended version information\n"
11389 "-h,-? prints usage help information\n"
11390 "{1} -d prints additional usage flags for debugging purposes\n",versionString,name);
11397static const char *
getArg(
int argc,
char **argv,
int &optInd)
11400 if (
qstrlen(&argv[optInd][2])>0)
11401 s=&argv[optInd][2];
11402 else if (optInd+1<argc && argv[optInd+1][0]!=
'-')
11421 return []() {
return std::make_unique<T>(); };
11429 std::setlocale(LC_ALL,
"");
11430 std::setlocale(LC_CTYPE,
"C");
11431 std::setlocale(LC_NUMERIC,
"C");
11538 return std::max(0,std::min(r-16,9));
11543 QCString versionString = getFullVersion();
11546 auto writeFile = [](
const char *fileName,std::function<void(
TextStream&)> func) ->
bool
11566 bool genConfig=
false;
11567 bool shortList=
false;
11568 bool traceTiming=
false;
11570 bool updateConfig=
false;
11571 bool quiet =
false;
11572 while (optInd<argc && argv[optInd][0]==
'-' &&
11573 (isalpha(argv[optInd][1]) || argv[optInd][1]==
'?' ||
11574 argv[optInd][1]==
'-')
11577 switch(argv[optInd][1])
11587 if (optInd+1>=argc)
11589 layoutName=
"DoxygenLayout.xml";
11593 layoutName=argv[optInd+1];
11601 if (optInd+1>=argc)
11603 msg(
"option \"-c\" is missing the file name to read\n");
11628 msg(
"option \"-d\" has unknown debug specifier: \"{}\".\n",debugLabel);
11638 if (!strcmp(argv[optInd]+1,
"t_time"))
11640 traceTiming =
true;
11642 else if (!strcmp(argv[optInd]+1,
"t"))
11644 traceTiming =
false;
11648 err(
"option should be \"-t\" or \"-t_time\", found: \"{}\".\n",argv[optInd]);
11652 if (optInd+1>=argc || argv[optInd+1][0] ==
'-')
11654 traceName=
"stdout";
11658 traceName=argv[optInd+1];
11662 err(
"support for option \"-t\" has not been compiled in (use a debug build or a release build with tracing enabled).\n");
11673 err(
"option should be \"-x\" or \"-x_noenv\", found: \"{}\".\n",argv[optInd]);
11689 err(
"option \"-e\" is missing format specifier rtf.\n");
11695 if (optInd+1>=argc)
11697 err(
"option \"-e rtf\" is missing an extensions file name\n");
11705 err(
"option \"-e\" has invalid format specifier.\n");
11715 err(
"option \"-f\" is missing list specifier.\n");
11721 if (optInd+1>=argc)
11723 err(
"option \"-f emoji\" is missing an output file name\n");
11731 err(
"option \"-f\" has invalid list specifier.\n");
11741 err(
"option \"-w\" is missing format specifier rtf, html or latex\n");
11747 if (optInd+1>=argc)
11749 err(
"option \"-w rtf\" is missing a style sheet file name\n");
11755 err(
"error opening RTF style sheet file {}!\n",argv[optInd+1]);
11765 if (optInd+4<argc ||
FileInfo(
"Doxyfile").exists() ||
FileInfo(
"doxyfile").exists())
11771 err(
"error opening or reading configuration file {}!\n",argv[optInd+4]);
11776 if (optInd+3>=argc)
11778 err(
"option \"-w html\" does not have enough arguments\n");
11795 if (optInd+4<argc ||
FileInfo(
"Doxyfile").exists() ||
FileInfo(
"doxyfile").exists())
11800 err(
"error opening or reading configuration file {}!\n",argv[optInd+4]);
11805 if (optInd+3>=argc)
11807 err(
"option \"-w latex\" does not have enough arguments\n");
11823 err(
"Illegal format specifier \"{}\": should be one of rtf, html or latex\n",formatName);
11843 if (
qstrcmp(&argv[optInd][2],
"help")==0)
11845 usage(argv[0],versionString);
11848 else if (
qstrcmp(&argv[optInd][2],
"version")==0)
11854 else if ((
qstrcmp(&argv[optInd][2],
"Version")==0) ||
11855 (
qstrcmp(&argv[optInd][2],
"VERSION")==0))
11863 err(
"Unknown option \"-{}\"\n",&argv[optInd][1]);
11864 usage(argv[0],versionString);
11869 setvbuf(stdout,
nullptr,_IONBF,0);
11876 usage(argv[0],versionString);
11880 err(
"Unknown option \"-{:c}\"\n",argv[optInd][1]);
11881 usage(argv[0],versionString);
11892 TRACE(
"Doxygen version used: {}",getFullVersion());
11895 FileInfo configFileInfo1(
"Doxyfile"),configFileInfo2(
"doxyfile");
11898 if (configFileInfo1.exists())
11900 configName=
"Doxyfile";
11902 else if (configFileInfo2.
exists())
11904 configName=
"doxyfile";
11906 else if (genConfig)
11908 configName=
"Doxyfile";
11912 err(
"Doxyfile not found and no input file specified!\n");
11913 usage(argv[0],versionString);
11920 if (fi.
exists() ||
qstrcmp(argv[optInd],
"-")==0 || genConfig)
11922 configName=argv[optInd];
11926 err(
"configuration file {} not found!\n",argv[optInd]);
11927 usage(argv[0],versionString);
11941 err(
"could not open or read configuration file {}!\n",configName);
12012 for (
const auto &mapping : extMaps)
12015 int i=mapStr.
find(
'=');
12031 err(
"Failed to map file extension '{}' to unsupported language '{}'.\n"
12032 "Check the EXTENSION_MAPPING setting in the config file.\n",
12037 msg(
"Adding custom extension mapping: '{}' will be treated as language '{}'\n",
12046 if (cd==
reinterpret_cast<void *
>(-1))
12048 term(
"unsupported character conversion: '{}'->'UTF-8': {}\n"
12049 "Check the 'INPUT_ENCODING' setting in the config file!\n",
12059 for (
const auto &mapping : fileEncod)
12062 int i=mapStr.
find(
'=');
12076 if (cd==
reinterpret_cast<void *
>(-1))
12078 term(
"unsupported character conversion: '{}'->'UTF-8': {}\n"
12079 "Check the 'INPUT_FILE_ENCODING' setting in the config file!\n",
12080 encoding,strerror(errno));
12093 for (
const auto &s : expandAsDefinedList)
12111 signal(SIGINT,SIG_DFL);
12113 msg(
"Cleaning up...\n");
12128 if (generateTagFile.
isEmpty())
return;
12133 err(
"cannot open tag file {} for writing\n", generateTagFile);
12137 tagFile <<
"<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>\n";
12138 tagFile <<
"<tagfile doxygen_version=\"" << getDoxygenVersion() <<
"\"";
12139 std::string gitVersion = getGitVersion();
12140 if (!gitVersion.empty())
12142 tagFile <<
" doxygen_gitid=\"" << gitVersion <<
"\"";
12149 for (
const auto &fd : *fn)
12151 if (fd->isLinkableInProject()) fd->writeTagFile(tagFile);
12184 if (gd->isLinkableInProject()) gd->writeTagFile(tagFile);
12189 if (mod->isLinkableInProject()) mod->writeTagFile(tagFile);
12194 if (pd->isLinkableInProject()) pd->writeTagFile(tagFile);
12201 if (dd->isLinkableInProject()) dd->writeTagFile(tagFile);
12205 tagFile <<
"</tagfile>\n";
12213 msg(
"Exiting...\n");
12223 const char *defaultDirName)
12228 result = baseDirName + defaultDirName;
12230 else if (formatDirName[0]!=
'/' && (formatDirName.
length()==1 || formatDirName[1]!=
':'))
12232 result.
prepend(baseDirName+
"/");
12234 Dir formatDir(result.
str());
12237 term(
"Could not create output directory {}\n", result);
12251 g_s.begin(
"Searching for include files...\n");
12254 for (
const auto &s : includePathList)
12272 g_s.begin(
"Searching for example files...\n");
12275 for (
const auto &s : examplePathList)
12290 g_s.begin(
"Searching for images...\n");
12293 for (
const auto &s : imagePathList)
12308 g_s.begin(
"Searching for dot files...\n");
12311 for (
const auto &s : dotFileList)
12326 g_s.begin(
"Searching for msc files...\n");
12329 for (
const auto &s : mscFileList)
12344 g_s.begin(
"Searching for dia files...\n");
12347 for (
const auto &s : diaFileList)
12362 g_s.begin(
"Searching for plantuml files...\n");
12365 for (
const auto &s : plantUmlFileList)
12380 g_s.begin(
"Searching for files to exclude\n");
12382 for (
const auto &s : excludeList)
12400 g_s.begin(
"Searching INPUT for files to process...\n");
12404 for (
const auto &s : inputList)
12407 size_t l = path.
length();
12411 if (path.
at(l-1)==
'\\' || path.
at(l-1)==
'/') path=path.
left(l-1);
12431 [](
const auto &f1,
const auto &f2)
12437 if (fileName->size()>1)
12439 std::stable_sort(fileName->begin(),fileName->end(),[](
const auto &f1,
const auto &f2)
12441 return qstricmp_sort(f1->absFilePath(),f2->absFilePath())<0;
12447 warn_uncond(
"No files to be processed, please check your settings, in particular INPUT, FILE_PATTERNS, and RECURSIVE\n");
12458 if (mdfileAsMainPage.
isEmpty())
return;
12462 warn_uncond(
"Specified markdown mainpage '{}' does not exist\n",mdfileAsMainPage);
12465 bool ambig =
false;
12468 warn_uncond(
"Specified markdown mainpage '{}' has not been defined as input file\n",mdfileAsMainPage);
12487 QCString versionString = getFullVersion();
12488 msg(
"Doxygen version used: {}\n",versionString);
12498 if (outputDirectory.
isEmpty())
12504 Dir dir(outputDirectory.
str());
12508 if (!dir.
mkdir(outputDirectory.
str()))
12510 term(
"tag OUTPUT_DIRECTORY: Output directory '{}' does not "
12511 "exist and cannot be created\n",outputDirectory);
12515 msg(
"Notice: Output directory '{}' does not exist. "
12516 "I have created it for you.\n", outputDirectory);
12531 if (cacheSize<0) cacheSize=0;
12532 if (cacheSize>9) cacheSize=9;
12533 uint32_t lookupSize = 65536 << cacheSize;
12572 bool generateSitemap = !sitemapUrl.
isEmpty();
12573 if (generateSitemap && !sitemapUrl.
endsWith(
"/"))
12580 bool generateEclipseHelp =
Config_getBool(GENERATE_ECLIPSEHELP);
12594 if (generateDocbook)
12641 newFontPath+=curFontPath;
12657 bool defaultLayoutUsed =
FALSE;
12658 if (layoutFileName.
isEmpty())
12661 defaultLayoutUsed =
TRUE;
12663 AUTO_TRACE_ADD(
"defaultLayoutUsed={}, layoutFileName={}",defaultLayoutUsed,layoutFileName);
12668 msg(
"Parsing layout file {}...\n",layoutFileName);
12671 else if (!defaultLayoutUsed)
12673 warn_uncond(
"failed to open layout file '{}' for reading! Using default settings.\n",layoutFileName);
12683 if (generateHtml) exclPatterns.push_back(htmlOutput.
str());
12684 if (generateDocbook) exclPatterns.push_back(docbookOutput.
str());
12685 if (generateXml) exclPatterns.push_back(xmlOutput.
str());
12686 if (generateLatex) exclPatterns.push_back(latexOutput.
str());
12687 if (generateRtf) exclPatterns.push_back(rtfOutput.
str());
12688 if (generateMan) exclPatterns.push_back(manOutput.
str());
12708 if (generateDocbook)
12719 std::shared_ptr<Entry> root = std::make_shared<Entry>();
12723 msg(
"Reading and parsing tag files\n");
12725 for (
const auto &s : tagFileList)
12737 g_s.begin(
"Parsing files\n");
12777 g_s.begin(
"Building macro definition list...\n");
12781 g_s.begin(
"Building group list...\n");
12786 g_s.begin(
"Building directory list...\n");
12791 g_s.begin(
"Building namespace list...\n");
12796 g_s.begin(
"Building file list...\n");
12800 g_s.begin(
"Building class list...\n");
12804 g_s.begin(
"Building concept list...\n");
12812 g_s.begin(
"Computing nesting relations for classes...\n");
12825 g_s.begin(
"Associating documentation with classes...\n");
12829 g_s.begin(
"Associating documentation with concepts...\n");
12834 g_s.begin(
"Associating documentation with modules...\n");
12838 g_s.begin(
"Building example list...\n");
12842 g_s.begin(
"Searching for enumerations...\n");
12850 g_s.begin(
"Searching for documented typedefs...\n");
12856 g_s.begin(
"Searching for documented sequences...\n");
12860 g_s.begin(
"Searching for documented dictionaries...\n");
12865 g_s.begin(
"Searching for members imported via using declarations...\n");
12872 g_s.begin(
"Searching for included using directives...\n");
12876 g_s.begin(
"Searching for documented variables...\n");
12880 g_s.begin(
"Building interface member list...\n");
12883 g_s.begin(
"Building member list...\n");
12887 g_s.begin(
"Searching for friends...\n");
12891 g_s.begin(
"Searching for documented defines...\n");
12895 g_s.begin(
"Computing class inheritance relations...\n");
12900 g_s.begin(
"Computing class usage relations...\n");
12906 g_s.begin(
"Searching for tag less structs...\n");
12911 g_s.begin(
"Flushing cached template relations that have become invalid...\n");
12915 g_s.begin(
"Warn for undocumented namespaces...\n");
12919 g_s.begin(
"Computing class relations...\n");
12930 g_s.begin(
"Add enum values to enums...\n");
12935 g_s.begin(
"Searching for member function documentation...\n");
12947 g_s.begin(
"Creating members for template instances...\n");
12951 g_s.begin(
"Building page list...\n");
12955 g_s.begin(
"Building requirements list...\n");
12959 g_s.begin(
"Search for main page...\n");
12964 g_s.begin(
"Computing page relations...\n");
12969 g_s.begin(
"Determining the scope of groups...\n");
12973 g_s.begin(
"Computing module relations...\n");
12975 mm.resolvePartitions();
12976 mm.resolveImports();
12977 mm.collectExportedSymbols();
12996 return i==0 ?
qstricmp_sort(c1->name(), c2->name())<0 : i<0;
13010 g_s.begin(
"Sorting lists...\n");
13031 g_s.begin(
"Determining which enums are documented\n");
13035 g_s.begin(
"Computing member relations...\n");
13040 g_s.begin(
"Building full member lists recursively...\n");
13044 g_s.begin(
"Adding members to member groups.\n");
13050 g_s.begin(
"Distributing member group documentation.\n");
13055 g_s.begin(
"Computing member references...\n");
13061 g_s.begin(
"Inheriting documentation...\n");
13069 g_s.begin(
"Generating disk names...\n");
13073 g_s.begin(
"Adding source references...\n");
13077 g_s.begin(
"Adding xrefitems...\n");
13082 g_s.begin(
"Adding requirements...\n");
13087 g_s.begin(
"Sorting member lists...\n");
13091 g_s.begin(
"Setting anonymous enum type...\n");
13095 g_s.begin(
"Computing dependencies between directories...\n");
13099 g_s.begin(
"Generating citations page...\n");
13103 g_s.begin(
"Counting members...\n");
13107 g_s.begin(
"Counting data structures...\n");
13111 g_s.begin(
"Resolving user defined references...\n");
13115 g_s.begin(
"Finding anchors and sections in the documentation...\n");
13119 g_s.begin(
"Transferring function references...\n");
13123 g_s.begin(
"Combining using relations...\n");
13128 g_s.begin(
"Adding members to index pages...\n");
13133 g_s.begin(
"Correcting members for VHDL...\n");
13137 g_s.begin(
"Computing tooltip texts...\n");
13145 [](
const auto &g1,
const auto &g2)
13146 {
return g1->groupTitle() < g2->groupTitle(); });
13150 gd->sortSubGroups();
13194 if (generateDocbook)
13214 err(
"USE_HTAGS is YES but htags(1) failed. \n");
13216 err(
"htags(1) ended normally but failed to load the filemap. \n");
13223 g_s.begin(
"Generating style sheet...\n");
13231 g_s.begin(
"Generating search indices...\n");
13232 if (searchEngine && !serverBasedSearch && generateHtml)
13240 if (generateHtml && searchEngine)
13243 Dir searchDir(searchDirName.
str());
13244 if (!searchDir.
exists() && !searchDir.
mkdir(searchDirName.
str()))
13246 term(
"Could not create search results directory '{}' $PWD='{}'\n",
13250 if (!serverBasedSearch)
13272 if (generateDocbook)
13288 g_s.begin(
"Generating images for formulas in HTML...\n");
13295 g_s.begin(
"Generating images for formulas in RTF...\n");
13302 g_s.begin(
"Generating images for formulas in Docbook...\n");
13307 g_s.begin(
"Generating example documentation...\n");
13311 g_s.begin(
"Generating file sources...\n");
13315 g_s.begin(
"Generating file documentation...\n");
13319 g_s.begin(
"Generating page documentation...\n");
13323 g_s.begin(
"Generating group documentation...\n");
13327 g_s.begin(
"Generating class documentation...\n");
13331 g_s.begin(
"Generating concept documentation...\n");
13335 g_s.begin(
"Generating module documentation...\n");
13339 g_s.begin(
"Generating namespace documentation...\n");
13345 g_s.begin(
"Generating graph info page...\n");
13350 g_s.begin(
"Generating directory documentation...\n");
13359 g_s.begin(
"finalizing index lists...\n");
13363 g_s.begin(
"writing tag file...\n");
13369 g_s.begin(
"Generating XML output...\n");
13377 g_s.begin(
"Generating SQLITE3 output...\n");
13384 g_s.begin(
"Generating AutoGen DEF output...\n");
13390 g_s.begin(
"Generating Perl module output...\n");
13394 if (generateHtml && searchEngine && serverBasedSearch)
13396 g_s.begin(
"Generating search index\n");
13406 if (searchDataFile.
isEmpty())
13408 searchDataFile=
"searchdata.xml";
13421 g_s.begin(
"Combining RTF output...\n");
13424 err(
"An error occurred during post-processing the RTF files!\n");
13429 g_s.begin(
"Running plantuml with JAVA...\n");
13435 g_s.begin(
"Running dot...\n");
13440 if (generateHtml &&
13444 g_s.begin(
"Running html help compiler...\n");
13449 if ( generateHtml &&
13453 g_s.begin(
"Running qhelpgenerator...\n");
13461 msg(
"type lookup cache used {}/{} hits={} misses={}\n",
13466 msg(
"symbol lookup cache used {}/{} hits={} misses={}\n",
13473 int cacheParam = std::max(typeCacheParam,symbolCacheParam);
13476 msg(
"Note: based on cache misses the ideal setting for LOOKUP_CACHE_SIZE is {} at the cost of higher memory usage.\n",cacheParam);
13482 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
13483 if (numThreads<1) numThreads=1;
13484 msg(
"Total elapsed time: {:.6f} seconds\n(of which an average of {:.6f} seconds per thread waiting for external tools to finish)\n",
13491 msg(
"finished...\n");
13496 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 Cache< std::string, LookupInfo > * typeLookupCache
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 Cache< std::string, LookupInfo > * symbolLookupCache
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
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 int computeIdealCacheParam(size_t v)
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
const Definition * definition
const MemberDef * typeDef
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.