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())
2507 if (lang==SrcLangExt::Python)
2509 def=
"type "+name+args;
2518 def=type+
" "+name+args;
2523 if (root->
spec.isAlias())
2525 if (lang==SrcLangExt::Python)
2527 def=
"type "+qualScope+scopeSeparator+name+args;
2531 def=
"using "+qualScope+scopeSeparator+name;
2536 def=type+
" "+qualScope+scopeSeparator+name+args;
2548 def=qualScope+scopeSeparator+name+args;
2559 for (
const auto &imd : *mn)
2571 if (root->
lang==SrcLangExt::ObjC &&
2572 root->
mtype==MethodTypes::Property &&
2596 prot,Specifier::Normal,root->
isStatic,related,
2600 mmd->setTagInfo(root->
tagInfo());
2601 mmd->setMemberClass(cd);
2605 mmd->setDefinition(def);
2607 mmd->addSectionsToDefinition(root->
anchors);
2608 mmd->setFromAnonymousScope(fromAnnScope);
2609 mmd->setFromAnonymousMember(fromAnnMemb);
2614 mmd->setMemberGroupId(root->
mGrpId);
2615 mmd->setMemberSpecifiers(root->
spec);
2616 mmd->setVhdlSpecifiers(root->
vhdlSpec);
2617 mmd->setReadAccessor(root->
read);
2618 mmd->setWriteAccessor(root->
write);
2620 mmd->setHidden(root->
hidden);
2622 mmd->setLanguage(root->
lang);
2623 mmd->setId(root->
id);
2626 mmd->setBodyDef(root->
fileDef());
2631 mmd->setRefItems(root->
sli);
2632 mmd->setRequirementReferences(root->
rqli);
2662 AUTO_TRACE(
"global variable: file='{}' type='{}' scope='{}' name='{}' args='{}' prot={} mtype={} lang={} init='{}'",
2674 static const reg::Ex re(R
"(\a\w*)");
2676 const std::string &typ = ttype.
str();
2698 if (scope.
find(
'@')!=-1)
return nullptr;
2714 if (root->
spec.isAlias())
2716 if (lang==SrcLangExt::Python)
2718 def=
"type "+nd->
name()+sep+name+args;
2722 def=
"using "+nd->
name()+sep+name;
2727 def=type+
" "+nd->
name()+sep+name+args;
2732 def=nd->
name()+sep+name+args;
2739 if (name.
at(0)==
'@')
2745 if (root->
spec.isAlias())
2747 if (root->
lang==SrcLangExt::Python)
2749 def=
"type "+root->
name+args;
2753 def=
"using "+root->
name;
2758 def=type+
" "+name+args;
2779 for (
const auto &imd : *mn)
2793 bool isPHPArray = md->
getLanguage()==SrcLangExt::PHP &&
2796 bool staticsInDifferentFiles =
2802 !staticsInDifferentFiles
2844 mmd->setTagInfo(root->
tagInfo());
2845 mmd->setMemberSpecifiers(root->
spec);
2846 mmd->setVhdlSpecifiers(root->
vhdlSpec);
2850 mmd->addSectionsToDefinition(root->
anchors);
2851 mmd->setFromAnonymousScope(fromAnnScope);
2852 mmd->setFromAnonymousMember(fromAnnMemb);
2855 mmd->setMemberGroupId(root->
mGrpId);
2856 mmd->setDefinition(def);
2857 mmd->setLanguage(root->
lang);
2858 mmd->setId(root->
id);
2866 mmd->setBodyDef(fd);
2871 mmd->setRefItems(root->
sli);
2872 mmd->setRequirementReferences(root->
rqli);
2875 mmd->setNamespace(nd);
2883 mmd->setFileDef(fd);
2911 if (lang == SrcLangExt::Fortran || lang == SrcLangExt::VHDL)
2916 static const reg::Ex re(R
"(\([^)]*[*&^][^)]*\))");
2918 size_t i=std::string::npos;
2922 i = match.position();
2925 if (i!=std::string::npos)
2927 size_t di = type.find(
"decltype(");
2928 if (di!=std::string::npos && di<i)
2930 i = std::string::npos;
2933 size_t bb=type.find(
'<');
2934 size_t be=type.rfind(
'>');
2935 bool templFp =
false;
2936 if (be!=std::string::npos) {
2937 size_t cc_ast = type.find(
"::*");
2938 size_t cc_amp = type.find(
"::&");
2939 templFp = (cc_ast != std::string::npos && cc_ast>be) || (cc_amp != std::string::npos && cc_amp>be);
2942 if (!type.empty() &&
2943 i!=std::string::npos &&
2944 type.find(
"operator")==std::string::npos &&
2945 (type.find(
")(")==std::string::npos || type.find(
"typedef ")!=std::string::npos) &&
2947 (!(bb<i && i<be) || templFp)
2950 if (pLength) *pLength=
static_cast<int>(l);
2953 return static_cast<int>(i);
2970 bool result =
false;
2971 bool typeIsClass =
false;
2972 bool typePtrType =
false;
3006 typePtrType = type.
find(
'*')!=-1 || type.
find(
'&')!=-1;
3009 typeIsClass = resolver.
resolveClass(ctx,type)!=
nullptr;
3011 if (!typeIsClass && (ti=type.
find(
'<'))!=-1)
3028 static const reg::Ex initChars(R
"([\d"'&*!^]+)");
3032 std::string name = a.
name.
str();
3033 if (
reg::search(name,match,initChars) && match.position()==0)
3065 std::string atype = a.
type.
str();
3066 if (
reg::search(atype,match,initChars) && match.position()==0)
3073 if (resType.empty()) resType=atype;
3074 static const reg::Ex idChars(R
"(\a\w*)");
3075 if (
reg::search(resType,match,idChars) && match.position()==0)
3077 resType=match.str();
3078 if (resType==
"int" || resType==
"long" ||
3079 resType==
"float" || resType==
"double" ||
3080 resType==
"char" || resType==
"void" ||
3081 resType==
"signed" || resType==
"unsigned" ||
3082 resType==
"const" || resType==
"volatile" )
3119 bool insideString=
FALSE;
3120 bool insideChar=
FALSE;
3122 while (e<len && brCount!=0)
3128 if (!insideString && !insideChar)
3130 if (e<len-1 && s.
at(e+1)==
'<')
3132 else if (roundCount==0)
3137 if (!insideString && !insideChar)
3139 if (e<len-1 && s.
at(e+1)==
'>')
3141 else if (roundCount==0)
3146 if (!insideString && !insideChar)
3150 if (!insideString && !insideChar)
3156 if (insideString && pc!=
'\\')
3165 if (insideChar && pc!=
'\\')
3175 return brCount==0 ?
static_cast<int>(e) : -1;
3184 AUTO_TRACE(
"VARIABLE_SEC: type='{}' name='{}' args='{}' bodyLine={} endBodyLine={} mGrpId={} relates='{}'",
3191 if (type.
isEmpty() && name.
find(
"operator")==-1 &&
3192 (name.
find(
'*')!=-1 || name.
find(
'&')!=-1))
3199 std::string sargs = args.
str();
3200 static const reg::Ex reName(R
"(\a\w*)");
3205 sargs = match.suffix().str();
3206 size_t j = sargs.find(
')');
3207 if (j!=std::string::npos) args=sargs.substr(0,j);
3217 int ai = type.
find(
'[',i);
3223 else if (type.
find(
')',i)!=-1)
3230 AUTO_TRACE_ADD(
"after correction: type='{}' name='{}' args='{}'",type,name,args);
3241 scope=name.
left(index);
3242 name=name.
mid(index+2);
3262 bool isRelated=
FALSE;
3263 bool isMemberOf=
FALSE;
3266 if (root->
lang==SrcLangExt::CSharp)
3279 for (
size_t i=0;i<name.
length()-1;i++)
3281 if (name[i]==
':' && name[i+1]==
':')
3283 p=
static_cast<int>(i);
3285 else if (name[i]==
'<')
3290 if (e!=-1) i=
static_cast<int>(e);
3296 if (type==
"friend class" || type==
"friend struct" ||
3297 type==
"friend union")
3311 Relationship::Member
3337 else if (root->
mtype==MethodTypes::Property)
3339 else if (root->
mtype==MethodTypes::Event)
3341 else if (type.
find(
"sequence<") != -1)
3343 else if (type.
find(
"dictionary<") != -1)
3349 isMemberOf=(root->
relatesType==RelatesType::MemberOf);
3367 int si=scope.
find(
'@');
3371 bool inlineSimpleStructs =
Config_getBool(INLINE_SIMPLE_STRUCTS);
3372 Relationship relationship = isMemberOf ? Relationship::Foreign :
3373 isRelated ? Relationship::Related :
3374 Relationship::Member ;
3375 if (si!=-1 && !inlineSimpleStructs)
3379 pScope = scope.
left(std::max(si-2,0));
3381 pScope.
prepend(annScopePrefix);
3382 else if (annScopePrefix.
length()>2)
3383 pScope=annScopePrefix.
left(annScopePrefix.
length()-2);
3384 if (name.
at(0)!=
'@')
3452 scope=rname.
left(index);
3453 rname=rname.
mid(index+2);
3465 for (
auto &imd : *mn)
3467 if (!imd->isTypedef())
3476 bool notBothGrouped = root->
groups.empty() || imd->getGroupDef()==
nullptr;
3477 bool bothSameScope = (!cd && !nd) || (cd && imd->getClassDef() == cd) || (nd && imd->getNamespaceDef() == nd);
3480 if (notBothGrouped && bothSameScope && imd->typeString()==rtype)
3528 for (
const auto &e : root->
children())
3529 if (!e->section.isEnum())
3546 for (
const auto &e : root->
children())
3547 if (!e->section.isEnum())
3564 for (
const auto &e : root->
children())
3565 if (!e->section.isEnum())
3580 (root->
section.isVariable() &&
3583 (root->
section.isFunction() &&
3586 (root->
section.isFunction() &&
3595 for (
const auto &e : root->
children())
3596 if (!e->section.isEnum())
3622 mmd->setTagInfo(root->
tagInfo());
3623 mmd->setMemberClass(cd);
3625 mmd->setDocsForDefinition(
false);
3629 mmd->setMemberSpecifiers(root->
spec);
3630 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3631 mmd->setMemberGroupId(root->
mGrpId);
3633 mmd->setLanguage(root->
lang);
3634 mmd->setBodyDef(fd);
3635 mmd->setFileDef(fd);
3636 mmd->addSectionsToDefinition(root->
anchors);
3638 mmd->setDefinition(def);
3642 AUTO_TRACE(
"Interface member: fileName='{}' type='{}' name='{}' mtype='{}' prot={} virt={} state={} proto={} def='{}'",
3650 root->
spec.isOptional() ? Protection::Protected : Protection::Public, Specifier::Normal);
3660 mmd->setRefItems(root->
sli);
3661 mmd->setRequirementReferences(root->
rqli);
3670 if (root->
section.isExportedInterface() || root->
section.isIncludedService())
3672 AUTO_TRACE(
"Exported interface/included service: type='{}' scope='{}' name='{}' args='{}'"
3673 " relates='{}' relatesType='{}' file='{}' line={} bodyLine={} #tArgLists={}"
3674 " mGrpId={} spec={} proto={} docFile='{}'",
3700 "Illegal member name found.");
3706 case SrcLangExt::Unknown:
3707 case SrcLangExt::IDL:
3744 if ((fd==
nullptr || fd->
getLanguage()==SrcLangExt::Cpp) &&
3746 (i=name.
find(
'<'))!=-1 &&
3747 (j=name.
find(
'>'))!=-1 &&
3748 (j!=i+2 || name.
at(i+1)!=
'=')
3766 root->
relatesType==RelatesType::MemberOf ? Relationship::Foreign :
3767 Relationship::Related ;
3777 mmd->setTagInfo(root->
tagInfo());
3778 mmd->setMemberClass(cd);
3780 mmd->setDocsForDefinition(!root->
proto);
3784 mmd->setMemberSpecifiers(spec);
3785 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3786 mmd->setMemberGroupId(root->
mGrpId);
3788 mmd->setLanguage(root->
lang);
3789 mmd->setRequiresClause(root->
req);
3790 mmd->setId(root->
id);
3791 mmd->setBodyDef(fd);
3792 mmd->setFileDef(fd);
3793 mmd->addSectionsToDefinition(root->
anchors);
3798 if (scopeSeparator!=
"::")
3800 qualScope =
substitute(qualScope,
"::",scopeSeparator);
3802 if (lang==SrcLangExt::PHP)
3805 scopeSeparator=
"::";
3822 def=type+
" "+qualScope+scopeSeparator+name;
3826 def=qualScope+scopeSeparator+name;
3830 mmd->setDefinition(def);
3834 AUTO_TRACE(
"function member: type='{}' scope='{}' name='{}' args='{}' proto={} def='{}'",
3835 type, qualScope, rname, args, root->
proto, def);
3845 mmd->setRefItems(root->
sli);
3846 mmd->setRequirementReferences(root->
rqli);
3870 mmd->setTagInfo(root->
tagInfo());
3871 mmd->setLanguage(root->
lang);
3872 mmd->setId(root->
id);
3877 mmd->setDocsForDefinition(!root->
proto);
3883 mmd->addSectionsToDefinition(root->
anchors);
3884 mmd->setMemberSpecifiers(root->
spec);
3885 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3886 mmd->setMemberGroupId(root->
mGrpId);
3887 mmd->setRequiresClause(root->
req);
3922 def=root->
type+
" "+scope+name;
3928 AUTO_TRACE(
"new non-member function type='{}' scope='{}' name='{}' args='{}' proto={} def='{}'",
3930 mmd->setDefinition(def);
3934 mmd->setRefItems(root->
sli);
3935 mmd->setRequirementReferences(root->
rqli);
3939 mmd->setNamespace(nd);
3946 mmd->setFileDef(fd);
3967 if (root->
section.isFunction())
3969 AUTO_TRACE(
"member function: type='{}' scope='{}' name='{}' args='{}' relates='{}' relatesType='{}'"
3970 " file='{}' line={} bodyLine={} #tArgLists={} mGrpId={}"
3971 " spec={} proto={} docFile='{}'",
3976 bool isFriend=root->
type==
"friend" || root->
type.
find(
"friend ")!=-1;
3986 scope=rname.
left(index);
3987 rname=rname.
mid(index+2);
3996 if (root->
lang==SrcLangExt::CSharp)
4007 int memIndex=rname.
findRev(
"::");
4010 if (cd && scope+
"::"==rname.
left(scope.
length()+2))
4016 bool isMember=
FALSE;
4019 int ts=rname.
find(
'<');
4020 int te=rname.
find(
'>');
4021 if (memIndex>0 && (ts==-1 || te==-1))
4038 isMember=memIndex<ts || memIndex>te;
4078 for (
const auto &imd : *mn)
4091 fullScope.
prepend(parentScope);
4097 if (mnd) nsName = mnd->
name();
4098 if (rnd) rnsName = rnd->
name();
4106 bool sameTemplateArgs =
TRUE;
4107 bool matchingReturnTypes =
TRUE;
4108 bool sameRequiresClause =
TRUE;
4114 matchingReturnTypes =
FALSE;
4118 sameRequiresClause =
FALSE;
4124 sameTemplateArgs =
FALSE;
4127 bool staticsInDifferentFiles =
4130 if (sameTemplateArgs &&
4131 matchingReturnTypes &&
4132 sameRequiresClause &&
4133 !staticsInDifferentFiles &&
4140 if (!root->
groups.empty() && !root->
groups.front().groupname.isEmpty())
4147 found=(mnd && rnd && nsName==rnsName) ||
4148 ((mnd==
nullptr && rnd==
nullptr && mfd!=
nullptr &&
4153 if (!found && gd && gd==md->
getGroupDef() && nsName==rnsName)
4159 AUTO_TRACE_ADD(
"combining function with prototype found={} in namespace '{}'",found,nsName);
4261 "Illegal member name found."
4279 for (
const auto &ifmd : *fn)
4283 for (
const auto &immd : *mn)
4299 AUTO_TRACE_ADD(
"Merging related global and member '{}' isFriend={} isRelated={} isFunction={}",
4376 for (
const auto &imdec : *mn)
4384 for (
const auto &imdef : *mn)
4387 if (mdef && mdec!=mdef &&
4407 for (
const auto &imd : *mn)
4423 if (mdef && mdec)
break;
4431 mdec->getOuterScope(),mdec->getFileDef(),mdec->typeString(),
const_cast<ArgumentList*
>(&mdecAl),
4438 mdec->mergeReferences(mdef);
4440 mdec->mergeReferencedBy(mdef);
4457 for (
const auto &imd : *mn)
4468 for (
const auto &irmd : *rmn)
4502 size_t i=qualifiedName.rfind(
"::");
4503 if (i!=std::string::npos)
4505 QCString scope = qualifiedName.substr(0,i);
4506 QCString name = qualifiedName.substr(i+2);
4510 for (
const auto &imd : *mn)
4536 std::map<std::string,int> templateNames;
4538 for (
const Argument &arg : templateArguments)
4540 static const reg::Ex re(R
"(\a[\w:]*)");
4543 for (; it!=
end ; ++it)
4545 const auto &match = *it;
4546 std::string n = match.str();
4547 if (n==arg.name.str())
4549 if (templateNames.find(n)==templateNames.end())
4551 templateNames.emplace(n,count);
4556 return templateNames;
4571 if (context && cd!=context)
4576 if (result==
nullptr)
4581 if (result==
nullptr)
4610 for (
auto &mi : *mni)
4620 type = typedefValue;
4639 usedClassName = typeCd->
name();
4649 if (templateNames.empty())
4653 BaseInfo bi(usedName,Protection::Public,Specifier::Normal);
4658 if (arg.name==usedName)
4662 if (usedCd==
nullptr)
4713 if (!found && !type.
isEmpty())
4772 if (templateNames.empty())
4810 AUTO_TRACE(
"Derived from template '{}' with parameters '{}' isArtificial={}",
4811 templateClass->
name(),templSpec,isArtificial);
4814 bool existingClass = templSpec==tempArgsStr;
4815 if (existingClass)
return;
4817 bool freshInstance=
FALSE;
4834 for (
auto it=it_pair.first ; it!=it_pair.second ; ++it)
4836 const Entry *templateRoot = it->second;
4837 AUTO_TRACE_ADD(
"template root found '{}' templSpec='{}'",templateRoot->
name,templSpec);
4843 isArtificial,templArgs.get(),templateNames);
4862 int ti=ttype.
find(
'<');
4868 templateClassName,
true,
true);
4869 AUTO_TRACE_ADD(
"templateClassName={} baseClass={}",templateClassName,baseClass?baseClass->
name():
"<none>");
4888 int index=n.
find(
'<');
4900 int l =
static_cast<int>(name.
length());
4906 while (count>0 && i>=0)
4911 case '>':
if (!insideQuote) count++;
break;
4912 case '<':
if (!insideQuote) count--;
break;
4913 case '\'':
if (!insideQuote) insideQuote=c;
4914 else if (insideQuote==c && (i<0 || name[i]!=
'\\')) insideQuote=0;
4916 case '"':
if (!insideQuote) insideQuote=c;
4917 else if (insideQuote==c && (i<0 || name[i]!=
'\\')) insideQuote=0;
4937 AUTO_TRACE(
"name={} base={} isArtificial={} mode={}",cd->
name(),bi->
name,isArtificial,(
int)mode);
4940 bool explicitGlobalScope=
FALSE;
4944 explicitGlobalScope=
TRUE;
4948 bool lastParent=
FALSE;
4953 int scopeOffset=explicitGlobalScope ? 0 :
static_cast<int>(scopeName.
length());
4962 baseClassName.
prepend(scopeName.
left(scopeOffset)+
"::");
4964 if (root->
lang==SrcLangExt::CSharp)
4991 || explicitGlobalScope
4994 || (root->
lang==SrcLangExt::IDL &&
4995 (root->
section.isExportedInterface() ||
4996 root->
section.isIncludedService()))
4999 AUTO_TRACE_ADD(
"class relation '{}' inherited/used by '{}' found prot={} virt={} templSpec='{}'",
5000 baseClassName, root->
name, bi->
prot, bi->
virt, templSpec);
5003 int si=baseClassName.
findRev(
"::",i);
5005 if (baseClass==
nullptr &&
static_cast<size_t>(i)!=baseClassName.
length())
5015 baseClassName = baseClassName.
left(i)+baseClassName.
right(baseClassName.
length()-e);
5026 else if (baseClass && !templSpec.
isEmpty())
5037 baseClass = templClass;
5045 if (!found && si!=-1)
5055 found=baseClass!=
nullptr && baseClass!=cd;
5065 found = baseClass!=
nullptr && baseClass!=cd;
5077 found = baseClass!=
nullptr && baseClass!=cd;
5080 bool isATemplateArgument = templateNames.find(biName.
str())!=templateNames.end();
5085 AUTO_TRACE_ADD(
"Documented base class '{}' templSpec='{}'",biName,templSpec);
5103 if (baseClassTypeDef==
nullptr)
5113 if (baseClassTypeDef)
5122 AUTO_TRACE_ADD(
"insertBaseClass name={} prot={} virt={} templSpec={}",usedName,prot,bi->
virt,templSpec);
5130 "Detected potential recursive class relation "
5131 "between class {} and base class {}!",
5138 else if (mode==
Undocumented && (scopeOffset==0 || isATemplateArgument))
5140 AUTO_TRACE_ADD(
"New undocumented base class '{}' baseClassName='{}' templSpec='{}' isArtificial={}",
5141 biName,baseClassName,templSpec,isArtificial);
5143 if (isATemplateArgument)
5146 if (baseClass==
nullptr)
5165 if (baseClass==
nullptr)
5176 si = baseClassName.
findRev(
"::");
5192 biName=
"<"+biName.
left(biName.
length()-2)+
">";
5196 AUTO_TRACE_ADD(
"insertBaseClass name={} prot={} virt={} templSpec={}",biName,bi->
prot,bi->
virt,templSpec);
5206 if (scope!=baseClass)
5232 "Detected potential recursive class relation "
5233 "between class {} and base class {}!",
5234 root->
name,baseClassName
5245 else if ((scopeOffset=scopeName.
findRev(
"::",scopeOffset-1))==-1)
5250 }
while (scopeOffset>=0);
5252 if (parentNode==
nullptr)
5258 parentNode=parentNode->
parent();
5260 }
while (lastParent);
5280 bool hasExtends = !root->
extends.empty();
5281 if (hasExtends)
return TRUE;
5305 if ((root->
lang==SrcLangExt::CSharp || root->
lang==SrcLangExt::Java) &&
5306 (i=bName.
find(
'<'))!=-1)
5310 if (root->
lang==SrcLangExt::CSharp)
5316 bName = bName.
left(i);
5348 if (i!=-1 && j!=-1 && k==-1 && root->
lang!=SrcLangExt::CSharp && root->
lang!=SrcLangExt::Java)
5381 if (!nd->hasDocumentation())
5384 nd->getLanguage() == SrcLangExt::Fortran) &&
5388 warn_undoc(nd->getDefFileName(),nd->getDefLine(),
"{} {} is not documented.",
5389 nd->getLanguage() == SrcLangExt::Fortran ?
"Module" :
"Namespace",
5453 for (
const auto &tn_kv : templateNames)
5455 size_t templIndex = tn_kv.second;
5457 bool hasActArg=
FALSE;
5458 if (templIndex<templArgs->size())
5460 actArg=templArgs->at(templIndex);
5464 baseClassNames.find(actArg.
type.
str())!=baseClassNames.end() &&
5465 actualTemplateNames.find(actArg.
type.
str())==actualTemplateNames.end()
5468 actualTemplateNames.emplace(actArg.
type.
str(),
static_cast<int>(templIndex));
5503 for (
const auto &fd : *fn)
5505 fd->computeAnchors();
5518 gd->computeAnchors();
5525template<
typename Func>
5548 for (
const auto &fd : *fn)
5621 if (md==
nullptr)
return;
5622 AUTO_TRACE(
"scope='{}' name='{}' args='{}' funcDecl='{}' mSpec={}",
5637 fullName = cd->
name();
5639 fullName = nd->
name();
5641 if (!fullName.
isEmpty()) fullName+=
"::";
5642 fullName+=md->
name();
5747 "member {} belongs to two different groups. The second one found here will be ignored.",
5785 return allowNoGroup;
5788 for (
const auto &g : root->
groups)
5790 if (g.groupname == gd->
name())
5813 AUTO_TRACE(
"namespace='{}' type='{}' name='{}' tempArg='{}' decl='{}'",namespaceName,type,name,tempArg,decl);
5827 for (
const auto &md : *mn)
5838 if (md->isAlias() && md->getOuterScope() &&
5845 nd = md->getNamespaceDef();
5850 if (nd && md->isEnumValue() && (enumNamePos=namespaceName.
findRev(
"::"))!=-1)
5852 QCString enumName = namespaceName.
mid(enumNamePos+2);
5853 if (namespaceName.
left(enumNamePos)==nd->
name())
5858 for (
const auto &emd : *enumMn)
5860 found = emd->isStrong() && md->getEnumScope()==emd.get();
5874 else if (nd==
nullptr && md->isEnumValue())
5879 for (
const auto &emd : *enumMn)
5881 found = emd->isStrong() && md->getEnumScope()==emd.get();
5904 if ((namespaceName.
isEmpty() && nd==
nullptr) ||
5905 (nd && nd->
name()==namespaceName) ||
5909 AUTO_TRACE_ADD(
"Try to add member '{}' to scope '{}'",md->name(),namespaceName);
5917 md->isVariable() || md->isTypedef() ||
5918 matchArguments2(md->getOuterScope(),md->getFileDef(),md->typeString(),&mdAl,
5925 if (matching && !root->
tArgLists.empty())
5944 if (matching && md->isStatic() &&
5945 md->getDefFileName()!=root->
fileName &&
5953 if (!md->templateArguments().empty() && !root->
tArgLists.empty())
5958 if (md->templateArguments().size()!=root->
tArgLists.back().size() ||
5959 md->typeString()!=type ||
5960 md->requiresClause()!=root->
req)
5976 if (!found && root->
relatesType!=RelatesType::Duplicate && root->
section.isFunction())
5980 QCString warnMsg =
"no matching file member found for \n"+fullFuncDecl;
5983 warnMsg+=
"\nPossible candidates:";
5984 for (
const auto &md : *mn)
5988 warnMsg+=
"' " +
warn_line(md->getDefFileName(),md->getDefLine());
5996 if (root->
type!=
"friend class" &&
5997 root->
type!=
"friend struct" &&
5998 root->
type!=
"friend union" &&
5999 root->
type!=
"friend" &&
6005 "documented symbol '{}' was not declared or defined.",
qPrint(decl)
6017 auto srcIt = srcTempArgLists.begin();
6018 auto dstIt = dstTempArgLists.begin();
6019 while (srcIt!=srcTempArgLists.end() && dstIt!=dstTempArgLists.end())
6021 if ((*srcIt).size()!=(*dstIt).size())
return TRUE;
6035 result = cd->templateArguments().hasParameters() || cd->templateMaster()!=
nullptr ||
6045 const std::string &src
6049 static const reg::Ex re(R
"(\a\w*)");
6054 for (; it!=
end ; ++it)
6056 const auto &match = *it;
6057 size_t i = match.position();
6058 size_t l = match.length();
6060 dst+=src.substr(p,i-p);
6061 std::string name=match.str();
6063 auto srcIt = srcTempArgLists.begin();
6064 auto dstIt = dstTempArgLists.begin();
6065 while (srcIt!=srcTempArgLists.end() && !found)
6068 std::vector<Argument>::const_iterator tdaIt;
6069 if (dstIt!=dstTempArgLists.end())
6072 tdaIt = tdAli->
begin();
6077 for (
auto tsaIt = tsaLi.
begin(); tsaIt!=tsaLi.
end() && !found; ++tsaIt)
6081 if (tdAli && tdaIt!=tdAli->
end())
6097 else if (tdaType.
startsWith(
"typename ")) vc=9;
6100 tdaName = tdaType.
mid(vc);
6133 auto dstIt = dst.
begin();
6138 if (dstIt == dst.
end())
6142 da.
array = dstArray;
6150 da.
array = dstArray;
6158 srcTempArgLists,dstTempArgLists,
6184 funcType,funcName,funcArgs,exceptions,
6188 mmd->setTagInfo(root->
tagInfo());
6189 mmd->setLanguage(root->
lang);
6190 mmd->setId(root->
id);
6191 mmd->makeImplementationDetail();
6192 mmd->setMemberClass(cd);
6193 mmd->setDefinition(funcDecl);
6199 mmd->setDocsForDefinition(!root->
proto);
6201 mmd->addSectionsToDefinition(root->
anchors);
6205 mmd->setMemberSpecifiers(spec);
6206 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6207 mmd->setMemberGroupId(root->
mGrpId);
6210 mmd->setRefItems(root->
sli);
6211 mmd->setRequirementReferences(root->
rqli);
6247 bool memFound=
FALSE;
6248 for (
const auto &imd : *mn)
6251 if (md==
nullptr)
continue;
6253 if (cd==
nullptr)
continue;
6270 if (!namespaceName.
isEmpty()) fullScope.
prepend(namespaceName+
"::");
6271 if (fullScope==cd->
name())
6277 for (
const auto &emd : *enumMn)
6279 memFound = emd->isStrong() && md->
getEnumScope()==emd.get();
6285 if (memFound)
break;
6290 if (memFound)
break;
6308 if (!templAl.
empty())
6310 declTemplArgs.push_back(templAl);
6318 bool substDone=
false;
6325 if (declTemplArgs.size()>0 && declTemplArgs.size()==defTemplArgs.size())
6348 AUTO_TRACE_ADD(
"matching '{}'<=>'{}' className='{}' namespaceName='{}' result={}",
6377 AUTO_TRACE_ADD(
"Comparing return types '{}'<->'{}' #args {}<->{}",
6385 else if (defTemplArgs.size()>declTemplArgs.size())
6387 AUTO_TRACE_ADD(
"Different number of template arguments {} vs {}",defTemplArgs.size(),declTemplArgs.size());
6393 bool rootIsUserDoc = root->
section.isMemberDoc();
6396 bool classOrMdIsTemplate = mdIsTemplate || classIsTemplate;
6397 bool rootIsTemplate = !root->
tArgLists.empty();
6399 if (!rootIsUserDoc &&
6400 (mdIsTemplate || rootIsTemplate) &&
6401 ((classOrMdIsTemplate && !rootIsTemplate) || (!classOrMdIsTemplate && rootIsTemplate))
6406 AUTO_TRACE_ADD(
"Comparing return types: template v.s. non-template");
6410 AUTO_TRACE_ADD(
"Match results of matchArguments2='{}' substDone='{}'",matching,substDone);
6421 if (!funcTempList.
isEmpty() &&
6441 else if (cd && cd!=tcd)
6447 if (memFound)
break;
6451 addLocalObjCMethod(root,scopeName,funcType,funcName,funcArgs,exceptions,funcDecl,spec);
6454 if (count==0 && !(isFriend && funcType==
"class"))
6457 const ClassDef *ecd =
nullptr, *ucd =
nullptr;
6458 MemberDef *emd =
nullptr, *umd =
nullptr;
6460 for (
const auto &md : *mn)
6482 AUTO_TRACE_ADD(
"new candidate className='{}' scope='{}' args='{}': exact match",
6483 className,ccd->
name(),md->argsString());
6489 AUTO_TRACE_ADD(
"new candidate className='{}' scope='{}' args='{}': no match",
6490 className,ccd->
name(),md->argsString());
6495 bool strictProtoMatching =
Config_getBool(STRICT_PROTO_MATCHING);
6496 if (!strictProtoMatching)
6498 if (candidates==1 && ucd && umd)
6505 else if (candidates>1 && ecd && emd)
6516 if (noMatchCount>1) warnMsg+=
"uniquely ";
6517 warnMsg+=
"matching class member found for \n";
6521 warnMsg+=
" template ";
6530 warnMsg+=fullFuncDecl;
6532 if (candidates>0 || noMatchCount>=1)
6534 warnMsg+=
"\nPossible candidates:";
6540 for (
const auto &md : *mn)
6542 const ClassDef *cd=md->getClassDef();
6556 warnMsg+=
"template ";
6561 if (!md->typeString().isEmpty())
6563 warnMsg+=md->typeString();
6568 warnMsg+=qScope+
"::"+md->name();
6569 warnMsg+=md->argsString();
6570 warnMsg+=
"' " +
warn_line(md->getDefFileName(),md->getDefLine());
6591 AUTO_TRACE(
"funcType={} funcName={} funcArgs={} funcDecl={} spec={}",funcType,funcName,funcArgs,funcDecl,spec);
6593 for (
const auto &md : *mn)
6595 if (md->getClassDef()==cd)
6607 funcType,funcName,funcArgs,exceptions,
6613 mmd->setTagInfo(root->
tagInfo());
6614 mmd->setLanguage(root->
lang);
6615 mmd->setId(root->
id);
6616 mmd->setMemberClass(cd);
6617 mmd->setTemplateSpecialization(
TRUE);
6619 mmd->setDefinition(funcDecl);
6625 mmd->setDocsForDefinition(!root->
proto);
6627 mmd->addSectionsToDefinition(root->
anchors);
6631 mmd->setMemberSpecifiers(spec);
6632 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6633 mmd->setMemberGroupId(root->
mGrpId);
6635 mmd->setRefItems(root->
sli);
6636 mmd->setRequirementReferences(root->
rqli);
6650 bool sameClass=
false;
6655 [](
const auto &md1,
const auto &md2)
6656 { return md1->getClassDef()->name()==md2->getClassDef()->name(); });
6662 if (cd==
nullptr)
return;
6670 std::unique_ptr<ArgumentList> tArgList =
6675 funcType,funcName,funcArgs,exceptions,
6679 mmd->setTagInfo(root->
tagInfo());
6680 mmd->setLanguage(root->
lang);
6681 mmd->setId(root->
id);
6683 mmd->setMemberClass(cd);
6684 mmd->setDefinition(funcDecl);
6693 mmd->setDocsForDefinition(!root->
proto);
6695 mmd->addSectionsToDefinition(root->
anchors);
6699 mmd->setMemberSpecifiers(spec);
6700 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6701 mmd->setMemberGroupId(root->
mGrpId);
6704 mmd->setRefItems(root->
sli);
6705 mmd->setRequirementReferences(root->
rqli);
6763 AUTO_TRACE(
"root='{}' funcDecl='{}' related='{}' overload={} isFunc={} mGrpId={} #tArgList={} spec={} lang={}",
6776 bool isRelated=
false;
6777 bool isMemberOf=
false;
6778 bool isFriend=
false;
6791 spec.setInline(
true);
6796 spec.setExplicit(
true);
6801 spec.setMutable(
true);
6806 spec.setThreadLocal(
true);
6817 while ((sep=funcDecl.
find(
';'))!=-1)
6823 if (!funcDecl.
isEmpty() && funcDecl[0]!=
' ') funcDecl.
prepend(
" ");
6835 if (isFriend && funcDecl.
startsWith(
"class "))
6839 funcName = funcDecl;
6841 else if (isFriend && funcDecl.
startsWith(
"struct "))
6844 funcName = funcDecl;
6850 funcArgs,funcTempList,exceptions
6858 AUTO_TRACE_ADD(
"scopeName='{}' className='{}' namespaceName='{}' funcType='{}' funcName='{}' funcArgs='{}'",
6859 scopeName,className,namespaceName,funcType,funcName,funcArgs);
6863 isMemberOf=(root->
relatesType == RelatesType::MemberOf);
6870 scopeName = relates;
6883 scopeName = joinedName;
6897 QCString joinedName = fnd->name()+
"::"+scopeName;
6900 scopeName=joinedName;
6927 AUTO_TRACE_ADD(
"scopeName='{}' className='{}' namespaceName='{}'",scopeName,className,namespaceName);
6936 scopeName=namespaceName;
6938 else if (!relates.
isEmpty() ||
6941 scopeName=namespaceName+
"::"+className;
6945 scopeName=className;
6948 else if (!className.
isEmpty())
6950 scopeName=className;
6960 uint32_t argListIndex=0;
6965 tempScopeName=scopeName+funcSpec;
6973 if (!scopeName.
isEmpty() && !isRelated && !isFriend && !
Config_getBool(HIDE_SCOPE_NAMES) && root->
lang!=SrcLangExt::Python)
6979 funcDecl=funcType+
" "+tempScopeName+
"::"+funcName+funcTempList;
6983 funcDecl=funcType+
" "+tempScopeName+
"::"+funcName+funcArgs;
6990 funcDecl=tempScopeName+
"::"+funcName+funcTempList;
6994 funcDecl=tempScopeName+
"::"+funcName+funcArgs;
7004 funcDecl=funcType+
" "+funcName+funcTempList;
7008 funcDecl=funcType+
" "+funcName+funcArgs;
7015 funcDecl=funcName+funcTempList;
7019 funcDecl=funcName+funcArgs;
7024 if (funcType==
"template class" && !funcTempList.
isEmpty())
7027 AUTO_TRACE_ADD(
"Parse results: namespaceName='{}' className=`{}` funcType='{}' funcSpec='{}' "
7028 " funcName='{}' funcArgs='{}' funcTempList='{}' funcDecl='{}' relates='{}'"
7029 " exceptions='{}' isRelated={} isMemberOf={} isFriend={} isFunc={}",
7030 namespaceName, className, funcType, funcSpec,
7031 funcName, funcArgs, funcTempList, funcDecl, relates,
7032 exceptions, isRelated, isMemberOf, isFriend, isFunc);
7038 bool strongEnum =
false;
7042 for (
const auto &imd : *mn)
7055 namespaceName+=
"::"+className;
7059 namespaceName=className;
7067 funcName =
substitute(funcName,className+
"::",
"");
7078 if (!isRelated && !strongEnum && mn)
7086 funcArgs,funcTempList,exceptions,
7087 type,args,isFriend,spec,relates,funcDecl,overloaded,isFunc);
7099 else if (overloaded)
7101 addOverloaded(root,mn,funcType,funcName,funcArgs,funcDecl,exceptions,spec);
7105 if (!
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec))
7110 "Cannot determine class for function\n{}",
7116 else if (isRelated && !relates.
isEmpty())
7118 AUTO_TRACE_ADD(
"related function scopeName='{}' className='{}'",scopeName,className);
7119 if (className.
isEmpty()) className=relates;
7123 bool newMember=
TRUE;
7129 for (
const auto &imd : *mn)
7163 mn->
push_back(std::move(mdDefineTaken));
7177 for (
const auto &irmd : *mn)
7198 addMemberDocs(root,rmd_found,funcDecl,
nullptr,overloaded,spec);
7206 switch (root->
mtype)
7227 funcType,funcName,funcArgs,exceptions,
7230 isMemberOf ? Relationship::Foreign : Relationship::Related,
7250 mmd->setDefinitionTemplateParameterLists(root->
tArgLists);
7252 mmd->setTagInfo(root->
tagInfo());
7266 for (
const auto &irmd : *rmn)
7297 mmd->setBodyDef(fd);
7304 mmd->setMemberClass(cd);
7305 mmd->setMemberSpecifiers(spec);
7306 mmd->setVhdlSpecifiers(root->
vhdlSpec);
7307 mmd->setDefinition(funcDecl);
7312 mmd->setDocsForDefinition(!root->
proto);
7315 mmd->addSectionsToDefinition(root->
anchors);
7316 mmd->setMemberGroupId(root->
mGrpId);
7317 mmd->setLanguage(root->
lang);
7318 mmd->setId(root->
id);
7322 mmd->setRefItems(root->
sli);
7323 mmd->setRequirementReferences(root->
rqli);
7324 if (root->
relatesType==RelatesType::Duplicate) mmd->setRelatedAlso(cd);
7332 if (!
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec))
7337 "Cannot determine file/namespace for relatedalso function\n{}",
7351 addLocalObjCMethod(root,scopeName,funcType,funcName,funcArgs,exceptions,funcDecl,spec);
7355 bool globMem =
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec);
7356 if (className.
isEmpty() && !globMem)
7360 else if (!className.
isEmpty() && !globMem)
7363 "member '{}' of class '{}' cannot be found",
7364 funcName,className);
7382 AUTO_TRACE(
"root->type='{}' root->inside='{}' root->name='{}' root->args='{}' section={} root->spec={} root->mGrpId={}",
7397 type=type.
left(i+l);
7408 if (root->
section.isMemberDoc())
7434 else if (root->
section.isOverloadDoc())
7448 (root->
section.isVariable() &&
7460 if (type==
"friend class" || type==
"friend struct" ||
7461 type==
"friend union")
7467 type+
" "+root->
name,
7500 else if (root->
section.isVariableDoc())
7512 else if (root->
section.isExportedInterface() ||
7513 root->
section.isIncludedService())
7519 type +
" " + root->
name,
7532 if (root->
section.isMemberDoc() ||
7533 root->
section.isOverloadDoc() ||
7536 root->
section.isVariableDoc() ||
7538 root->
section.isIncludedService() ||
7539 root->
section.isExportedInterface()
7549 for (
const auto &e : root->
children())
7551 if (!e->section.isEnum())
7563 for (
const auto &objCImpl : root->
children())
7565 if (objCImpl->section.isObjcImpl())
7567 for (
const auto &objCMethod : objCImpl->children())
7569 if (objCMethod->section.isFunction())
7573 objCMethod->relates,
7576 objCMethod->type+
" "+objCImpl->name+
"::"+objCMethod->name+
" "+objCMethod->args,
7578 objCMethod->section=EntryType::makeEmpty();
7597 bool isGlobal =
false;
7598 bool isRelated =
false;
7599 bool isMemberOf =
false;
7609 if (root->
lang==SrcLangExt::CSharp)
7632 isMemberOf=(root->
relatesType==RelatesType::MemberOf);
7667 isMemberOf ? Relationship::Foreign : isRelated ? Relationship::Related : Relationship::Member,
7671 mmd->setTagInfo(root->
tagInfo());
7672 mmd->setLanguage(root->
lang);
7673 mmd->setId(root->
id);
7674 if (!isGlobal) mmd->setMemberClass(cd);
else mmd->setFileDef(fd);
7676 mmd->setBodyDef(root->
fileDef());
7677 mmd->setMemberSpecifiers(root->
spec);
7678 mmd->setVhdlSpecifiers(root->
vhdlSpec);
7679 mmd->setEnumBaseType(root->
args);
7682 mmd->addSectionsToDefinition(root->
anchors);
7683 mmd->setMemberGroupId(root->
mGrpId);
7687 mmd->setRefItems(root->
sli);
7688 mmd->setRequirementReferences(root->
rqli);
7702 mmd->setDefinition(name+baseType);
7706 mmd->setDefinition(nd->
name()+
"::"+name+baseType);
7710 mmd->setNamespace(nd);
7717 if (isGlobal && (nd==
nullptr || !nd->
isAnonymous()))
7719 if (!defSet) mmd->setDefinition(name+baseType);
7720 if (fd==
nullptr && root->
parent())
7726 mmd->setFileDef(fd);
7734 mmd->setDefinition(name+baseType);
7738 mmd->setDefinition(cd->
name()+
"::"+name+baseType);
7744 mmd->setDocsForDefinition(!root->
proto);
7774 bool isGlobal =
false;
7775 bool isRelated =
false;
7785 if (root->
lang==SrcLangExt::CSharp)
7800 if (root->
lang==SrcLangExt::CSharp)
7846 struct EnumValueInfo
7848 EnumValueInfo(
const QCString &n,std::unique_ptr<MemberDef> &&md) :
7849 name(n), member(std::move(md)) {}
7851 std::unique_ptr<MemberDef> member;
7853 std::vector< EnumValueInfo > extraMembers;
7855 for (
const auto &imd : *mn)
7862 for (
const auto &e : root->
children())
7865 bool isJavaLike = sle==SrcLangExt::CSharp || sle==SrcLangExt::Java || sle==SrcLangExt::XML;
7866 if ( isJavaLike || root->
spec.isStrong())
7868 if (sle == SrcLangExt::Cpp && e->section.isDefine())
continue;
7875 i = qualifiedName.
findRev(
"::");
7876 if (i!=-1 && sle==SrcLangExt::CSharp)
7882 qualifiedName=
substitute(qualifiedName,
"::",
".");
7887 if (fileName.
isEmpty() && e->tagInfo())
7889 fileName = e->tagInfo()->tagName;
7893 fileName,e->startLine,e->startColumn,
7894 e->type,e->name,e->args,
QCString(),
7895 e->protection, Specifier::Normal,e->isStatic,Relationship::Member,
7902 fmmd->setNamespace(mnd);
7906 fmmd->setTagInfo(e->tagInfo());
7907 fmmd->setLanguage(e->lang);
7908 fmmd->setBodySegment(e->startLine,e->bodyLine,e->endBodyLine);
7909 fmmd->setBodyDef(e->fileDef());
7911 fmmd->setDocumentation(e->doc,e->docFile,e->docLine);
7912 fmmd->setBriefDescription(e->brief,e->briefFile,e->briefLine);
7913 fmmd->addSectionsToDefinition(e->anchors);
7914 fmmd->setInitializer(e->initializer.str());
7915 fmmd->setMaxInitLines(e->initLines);
7916 fmmd->setMemberGroupId(e->mGrpId);
7917 fmmd->setExplicitExternal(e->explicitExternal,fileName,e->startLine,e->startColumn);
7918 fmmd->setRefItems(e->sli);
7919 fmmd->setRequirementReferences(e->rqli);
7922 fmmd->setEnumScope(md,
TRUE);
7923 extraMembers.emplace_back(e->name,std::move(fmd));
7932 if (!e->name.isEmpty() && (fmn=emnsd->
find(e->name)))
7935 for (
const auto &ifmd : *fmn)
7966 else if (isRelated && cd)
7998 for (
auto &e : extraMembers)
8044 if (gd==
nullptr && !root->
groups.empty())
8058 for (
const auto &g : root->
groups)
8077 "Found non-existing group '{}' for the command '{}', ignoring command",
8091 if (root->
section.isEnumDoc() &&
8117 AUTO_TRACE(
"Found docs for enum with name '{}' and scope '{}' in context '{}' cd='{}', nd='{}' fd='{}'",
8131 for (
const auto &imd : *mn)
8146 else if (cd==
nullptr && mcd==
nullptr && nd!=
nullptr && mnd==nd)
8153 else if (cd==
nullptr && nd==
nullptr && mcd==
nullptr && mnd==
nullptr && fd==mfd)
8178 for (
const auto &mn : mnsd)
8181 for (
const auto &imd : *mn)
8186 int documentedEnumValues=0;
8190 if (fmd->isLinkableInProject()) documentedEnumValues++;
8216 for (
const auto &md : *mn)
8218 index.addClassMemberNameToIndex(md.get());
8219 if (md->getModuleDef())
8221 index.addModuleMemberNameToIndex(md.get());
8229 for (
const auto &md : *mn)
8231 if (md->getNamespaceDef())
8233 index.addNamespaceMemberNameToIndex(md.get());
8237 index.addFileMemberNameToIndex(md.get());
8239 if (md->getModuleDef())
8241 index.addModuleMemberNameToIndex(md.get());
8246 index.sortMemberIndexLists();
8255 if (cd->isLinkableInProject())
8268 if (cd->isLinkableInProject())
8281 if (nd->isLinkableInProject())
8294 for (
const auto &fd : *fn)
8310 std::string s = title.str();
8311 static const reg::Ex re(R
"(\a[\w-]*)");
8314 for (; it!=
end ; ++it)
8316 const auto &match = *it;
8317 std::string matchStr = match.str();
8325 if (gd->isLinkableInProject())
8327 addWordsForTitle(gd.get(),gd->anchor(),gd->groupTitle());
8333 if (pd->isLinkableInProject())
8335 addWordsForTitle(pd.get(),pd->anchor(),pd->title());
8355 if (md->getClassDef())
8359 if (md->getNamespaceDef())
8370 if (md->getGroupDef()) scope = md->getGroupDef();
8371 else if (md->getClassDef()) scope = md->getClassDef();
8372 else if (md->getNamespaceDef()) scope = md->getNamespaceDef();
8373 else if (md->getFileDef()) scope = md->getFileDef();
8379 if (md->isLinkableInProject())
8381 if (!(md->isEnumerate() && md->isAnonymous()))
8386 if (md->isEnumerate())
8388 for (
const auto &fmd : md->enumFieldList())
8401 for (
const auto &md : *mn)
8403 addMemberToIndices(md.get());
8410 for (
const auto &md : *mn)
8412 addMemberToIndices(md.get());
8425 for (
const auto &imd : *mn)
8438 for (
const auto &imd : *mn)
8455 for (
const auto &imd : *mn)
8464 const auto &bmni = bmn.
find(mn->memberName());
8467 for (
const auto &ibmd : *bmni)
8475 lang==SrcLangExt::Python ||
8476 lang==SrcLangExt::Java ||
8477 lang==SrcLangExt::PHP ||
8488 lang==SrcLangExt::Python ||
8495 if (lang==SrcLangExt::Python && md->
name().
startsWith(
"__"))
continue;
8535 if (cd->isLinkable())
8537 for (
const auto &bcd : cd->baseClasses())
8553 for (
const auto &ti : cd->getTemplateInstances())
8572 int i=cd->name().find(
'(');
8579 AUTO_TRACE_ADD(
"merging members of category {} into {}",cd->name(),baseClass->
name());
8594 cd->subClasses().empty() &&
8595 !cd->baseClasses().empty())
8626 msg(
"Generating code for file {}...\n",fd->
docName());
8631 else if (parseSources)
8633 msg(
"Parsing code for file {}...\n",fd->
docName());
8649 for (
const auto &fd : *fn)
8657 for (
const auto &fd : *fn)
8666 clangParser->parse();
8667 processSourceFile(fd.get(),*
g_outputList,clangParser.get());
8669 for (
auto incFile : clangParser->filesInSameTU())
8671 if (filesToProcess.find(incFile)!=filesToProcess.end() &&
8673 processedFiles.
find(incFile)==processedFiles.end())
8680 processSourceFile(ifd,*
g_outputList,clangParser.get());
8681 processedFiles.insert(incFile);
8692 for (
const auto &fd : *fn)
8694 if (processedFiles.find(fd->
absFilePath().
str())==processedFiles.end())
8699 clangParser->parse();
8700 processSourceFile(fd.get(),*
g_outputList,clangParser.get());
8713 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8716 msg(
"Generating code files using {} threads.\n",numThreads);
8717 struct SourceContext
8720 : fd(fd_), generateSourceFile(gen_), ol(ol_) {}
8722 bool generateSourceFile;
8726 std::vector< std::future< std::shared_ptr<SourceContext> > > results;
8729 for (
const auto &fd : *fn)
8732 auto ctx = std::make_shared<SourceContext>(fd.get(),generateSourceFile,*
g_outputList);
8733 auto processFile = [ctx]()
8735 if (ctx->generateSourceFile)
8737 msg(
"Generating code for file {}...\n",ctx->fd->docName());
8741 msg(
"Parsing code for file {}...\n",ctx->fd->docName());
8744 ctx->fd->getAllIncludeFilesRecursively(filesInSameTu);
8745 if (ctx->generateSourceFile)
8747 ctx->fd->writeSourceHeader(ctx->ol);
8748 ctx->fd->writeSourceBody(ctx->ol,
nullptr);
8749 ctx->fd->writeSourceFooter(ctx->ol);
8754 ctx->fd->parseSource(
nullptr);
8758 results.emplace_back(threadPool.
queue(processFile));
8761 for (
auto &f : results)
8770 for (
const auto &fd : *fn)
8790 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8796 : fd(fd_), ol(ol_) {}
8801 std::vector< std::future< std::shared_ptr<DocContext> > > results;
8804 for (
const auto &fd : *fn)
8806 bool doc = fd->isLinkableInProject();
8809 auto ctx = std::make_shared<DocContext>(fd.get(),*
g_outputList);
8810 auto processFile = [ctx]() {
8811 msg(
"Generating docs for file {}...\n",ctx->fd->docName());
8812 ctx->fd->writeDocumentation(ctx->ol);
8815 results.emplace_back(threadPool.
queue(processFile));
8819 for (
auto &f : results)
8828 for (
const auto &fd : *fn)
8830 bool doc = fd->isLinkableInProject();
8833 msg(
"Generating docs for file {}...\n",fd->docName());
8852 const_cast<FileDef*
>(fd)->addSourceRef(cd->getStartDefLine(),cd.get(),
nullptr);
8861 const_cast<FileDef*
>(fd)->addSourceRef(cd->getStartDefLine(),cd.get(),
nullptr);
8870 const_cast<FileDef*
>(fd)->addSourceRef(nd->getStartDefLine(),nd.get(),
nullptr);
8877 for (
const auto &md : *mn)
8886 md->isLinkableInProject() &&
8892 const_cast<FileDef*
>(fd)->addSourceRef(md->getStartDefLine(),md->getOuterScope(),md.get());
8898 for (
const auto &md : *mn)
8908 md->isLinkableInProject() &&
8914 const_cast<FileDef*
>(fd)->addSourceRef(md->getStartDefLine(),md->getOuterScope(),md.get());
8931 for (
const auto &def : it->second)
8934 def.fileName,def.lineNr,def.columnNr,
8935 "#define",def.name,def.args,
QCString(),
8940 if (!def.args.isEmpty())
8944 mmd->setInitializer(def.definition);
8945 mmd->setFileDef(def.fileDef);
8946 mmd->setDefinition(
"#define "+def.name);
8951 const MemberList *defMl = def.fileDef->getMemberList(MemberListType::DocDefineMembers());
8960 def.fileDef->insertMember(md.get());
8962 AUTO_TRACE_ADD(
"adding macro {} with definition {}",def.name,def.definition);
8996 for (
const auto &fd : *fn)
8998 fd->sortMemberLists();
9005 gd->sortMemberLists();
9022 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
9026 std::vector < std::future< void > > results;
9030 for (
const auto &def : symList)
9033 if (dm && !
isSymbolHidden(def) && !def->isArtificial() && def->isLinkableInProject())
9035 auto processTooltip = [dm]() {
9038 results.emplace_back(threadPool.
queue(processTooltip));
9043 for (
auto &f : results)
9052 for (
const auto &def : symList)
9055 if (dm && !
isSymbolHidden(def) && !def->isArtificial() && def->isLinkableInProject())
9102 for (
const auto &fd : *fn)
9124 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
9130 : cd(cd_), ol(ol_) {}
9135 std::vector< std::future< std::shared_ptr<DocContext> > > results;
9136 for (
const auto &cd : classList)
9139 if (cd->getOuterScope()==
nullptr ||
9143 auto ctx = std::make_shared<DocContext>(cd,*
g_outputList);
9144 auto processFile = [ctx]()
9146 msg(
"Generating docs for compound {}...\n",ctx->cd->displayName());
9150 if (!ctx->cd->isHidden() && !ctx->cd->isEmbeddedInOuterScope() &&
9151 ctx->cd->isLinkableInProject() && !ctx->cd->isImplicitTemplateInstance())
9153 ctx->cd->writeDocumentation(ctx->ol);
9154 ctx->cd->writeMemberList(ctx->ol);
9158 ctx->cd->writeDocumentationForInnerClasses(ctx->ol);
9161 results.emplace_back(threadPool.
queue(processFile));
9164 for (
auto &f : results)
9171 for (
const auto &cd : classList)
9175 if (cd->getOuterScope()==
nullptr ||
9181 if ( !cd->isHidden() && !cd->isEmbeddedInOuterScope() &&
9182 cd->isLinkableInProject() && !cd->isImplicitTemplateInstance())
9184 msg(
"Generating docs for compound {}...\n",cd->displayName());
9199 for (
const auto &innerCdi : cd->
getClasses())
9204 AUTO_TRACE(
"innerCd={} isLinkable={} isImplicitTemplateInstance={} protectLevelVisible={} embeddedInOuterScope={}",
9213 list.push_back(innerCd);
9221 std::vector<ClassDefMutable*> classList;
9270 for (
const auto &imd : *mn)
9306 for (
const auto &fd : *fn)
9308 fd->combineUsingRelations();
9340 for (
const auto &fd : *fn)
9342 fd->addMembersToMemberGroup();
9357 gd->addMembersToMemberGroup();
9378 for (
const auto &fd : *fn)
9380 fd->distributeMemberGroupDocumentation();
9395 gd->distributeMemberGroupDocumentation();
9425 for (
const auto &fd : *fn)
9427 fd->findSectionsInDocumentation();
9442 gd->findSectionsInDocumentation();
9447 pd->findSectionsInDocumentation();
9452 dd->findSectionsInDocumentation();
9473 elementsToRemove.push_back(ci.first);
9476 for (
const auto &k : elementsToRemove)
9487 for (
const auto &ifmd : *fn)
9501 for (
const auto &imd : *nm)
9533 elementsToRemove.push_back(ci.first);
9536 for (
const auto &k : elementsToRemove)
9545 for (
const auto &ifmd : *fn)
9558 for (
const auto &imd : *nm)
9578 return fd->absFilePath() == root->
fileName;
9626 mmd->setTagInfo(root->
tagInfo());
9627 mmd->setLanguage(root->
lang);
9639 for (
const auto &md : *mn)
9645 for (
const auto &imd : *mn)
9663 for (
const auto &imd : *mn)
9690 warn(root->
fileName,root->
startLine,
"found documented #define {} but ignoring it because ENABLE_PREPROCESSING is NO.", root->
name);
9704 normalizedName =
substitute(normalizedName,
"\\",
"/");
9707 if (root->
docFile==normalizedName)
9709 int lastSlashPos=normalizedName.
findRev(
'/');
9710 if (lastSlashPos!=-1)
9712 normalizedName=normalizedName.
left(lastSlashPos);
9715 if (normalizedName.
at(normalizedName.
length()-1)!=
'/')
9717 normalizedName+=
'/';
9719 DirDef *matchingDir=
nullptr;
9723 if (dir->name().right(normalizedName.
length())==normalizedName)
9728 "\\dir command matches multiple directories.\n"
9729 " Applying the command for directory {}\n"
9730 " Ignoring the command for directory {}",
9731 matchingDir->
name(),dir->name()
9736 matchingDir=dir.get();
9753 warn(root->
fileName,root->
startLine,
"No matching directory found for command \\dir {}",normalizedName);
9762 if (root->
section.isRequirementDoc())
9774 if (root->
section.isPageDoc())
9781 else if (root->
section.isMainpageDoc())
9801 if (root->
section.isMainpageDoc())
9834 else if (si->
lineNr() != -1)
9836 warn(root->
fileName,root->
startLine,
"multiple use of section label '{}' for main page, (first occurrence: {}, line {})",
9841 warn(root->
fileName,root->
startLine,
"multiple use of section label '{}' for main page, (first occurrence: {})",
9858 else if (root->
tagInfo()==
nullptr)
9861 "found more than one \\mainpage comment block! (first occurrence: {}, line {}), Skipping current block!",
9871 if (root->
section.isMainpageDoc())
9895 term(
"page defined {} with label {} is a direct "
9896 "subpage of itself! Please remove this cyclic dependency.\n",
9920 term(
"page defined {} with label {} is a subpage "
9921 "of itself! Please remove this cyclic dependency.\n",
9922 warn_line(pd->docFile(),pd->docLine()),pd->name());
9948 if (si->label().left(label.
length())==label)
9950 si->setFileName(rl->listName());
9951 si->setGenerated(
TRUE);
9957 if (!si->generated())
9961 if (!si->fileName().isEmpty() &&
9968 if (si->definition())
9975 gd = (
toMemberDef(si->definition()))->getGroupDef();
10005 if (!pd->getGroupDef() && !pd->isReference())
10007 msg(
"Generating docs for page {}...\n",pd->name());
10022 warn(root->
fileName,root->
startLine,
"Example {} was already documented. Ignoring documentation found here.",root->
name);
10050 indentStr.
fill(
' ',indent);
10052 indentStr.
isEmpty()?
"":indentStr,
10057 for (
const auto &e : root->
children())
10075 si->label(),si->fileName(),si->title(),si->type().level(),si->ref());
10089 msg(
"Generating docs for example {}...\n",pd->name());
10091 if (lang != SrcLangExt::Unknown)
10095 intf->resetCodeParserState();
10097 QCString n=pd->getOutputFileBase();
10104 if (pd->showLineNo())
10106 lineNoOptStr=
"{lineno}";
10112 (pd->briefDescription().isEmpty()?
"":pd->briefDescription()+
"\n\n")+
10113 pd->documentation()+
"\n\n\\include"+lineNoOptStr+
" "+pd->name(),
10115 .setIndexWords(
true)
10116 .setExample(pd->name()));
10129 if (!gd->isReference())
10141 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10147 : cdm(cdm_), ol(ol_) {}
10152 std::vector< std::future< std::shared_ptr<DocContext> > > results;
10154 for (
const auto &cd : classList)
10159 auto ctx = std::make_shared<DocContext>(cdm,*
g_outputList);
10160 auto processFile = [ctx]()
10162 if ( ( ctx->cdm->isLinkableInProject() &&
10163 !ctx->cdm->isImplicitTemplateInstance()
10166 && !ctx->cdm->isHidden() && !ctx->cdm->isEmbeddedInOuterScope()
10169 msg(
"Generating docs for compound {}...\n",ctx->cdm->displayName());
10170 ctx->cdm->writeDocumentation(ctx->ol);
10171 ctx->cdm->writeMemberList(ctx->ol);
10173 ctx->cdm->writeDocumentationForInnerClasses(ctx->ol);
10176 results.emplace_back(threadPool.
queue(processFile));
10180 for (
auto &f : results)
10182 auto ctx = f.get();
10188 for (
const auto &cd : classList)
10193 if ( ( cd->isLinkableInProject() &&
10194 !cd->isImplicitTemplateInstance()
10197 && !cd->isHidden() && !cd->isEmbeddedInOuterScope()
10200 msg(
"Generating docs for compound {}...\n",cd->displayName());
10214 for (
const auto &cd : conceptList)
10219 msg(
"Generating docs for concept {}...\n",cd->name());
10234 if (nd->isLinkableInProject())
10239 msg(
"Generating docs for namespace {}\n",nd->displayName());
10277 QCString cmd=qhgLocation+
" -v 2>&1";
10282 err(
"could not execute {}\n",qhgLocation);
10286 const size_t bufSize = 1024;
10287 char inBuf[bufSize+1];
10288 size_t numRead=fread(inBuf,1,bufSize,f);
10289 inBuf[numRead] =
'\0';
10294 static const reg::Ex versionReg(R
"(Qt (\d+)\.(\d+)\.(\d+))");
10296 std::string s = inBuf;
10303 if (qtVersion>0 && (qtVersion<60000 || qtVersion >= 60205))
10312 err(
"could not execute {}\n",qhgLocation);
10316 std::string output;
10317 while ((numRead=fread(inBuf,1,bufSize,f))>0)
10319 inBuf[numRead] =
'\0';
10351 warn_uncond(
"the dot tool could not be found as '{}'\n",dotPath);
10357 size_t l=dotPath.
length();
10358 for (
size_t i=0;i<l;i++)
if (dotPath.
at(i)==
'/') dotPath.
at(i)=
'\\';
10377 bool updateOnly=
FALSE)
10381 bool writeToStdout=configFile==
"-";
10386 if (!writeToStdout)
10390 msg(
"\n\nConfiguration file '{}' created.\n\n",configFile);
10391 msg(
"Now edit the configuration file and enter\n\n");
10392 if (configFile!=
"Doxyfile" && configFile!=
"doxyfile")
10393 msg(
" doxygen {}\n\n",configFile);
10395 msg(
" doxygen\n\n");
10396 msg(
"to generate the documentation for your project\n\n");
10400 msg(
"\n\nConfiguration file '{}' updated.\n\n",configFile);
10406 term(
"Cannot open file {} for writing\n",configFile);
10421 term(
"Cannot open stdout for writing\n");
10432 int eqPos = tagLine.
find(
'=');
10442 fileName = tagLine;
10448 err(
"Tag file '{}' does not exist or is not a file. Skipping it...\n",fileName);
10459 msg(
"Reading tag file '{}', location '{}'...\n",fileName,destName);
10463 msg(
"Reading tag file '{}'...\n",fileName);
10473 for (
const auto &sheet : latexExtraStyleSheet)
10475 std::string fileName = sheet;
10476 if (!fileName.empty())
10481 err(
"Style sheet '{}' specified by LATEX_EXTRA_STYLESHEET does not exist!\n",fileName);
10483 else if (fi.
isDir())
10485 err(
"Style sheet '{}' specified by LATEX_EXTRA_STYLESHEET is a directory, it has to be a file!\n", fileName);
10504 if (!htmlStyleSheet.
isEmpty())
10511 err(
"Style sheet '{}' specified by HTML_STYLESHEET does not exist!\n",htmlStyleSheet);
10514 else if (fi.
isDir())
10516 err(
"Style sheet '{}' specified by HTML_STYLESHEET is a directory, it has to be a file!\n",htmlStyleSheet);
10522 copyFile(htmlStyleSheet,destFileName);
10527 for (
const auto &sheet : htmlExtraStyleSheet)
10535 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET does not exist!\n",fileName);
10539 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET is already a built-in stylesheet. Please use a different name\n",fi.
fileName());
10541 else if (fi.
isDir())
10543 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET is a directory, it has to be a file!\n",fileName);
10562 err(
"Project logo '{}' specified by PROJECT_LOGO does not exist!\n",projectLogo);
10565 else if (fi.
isDir())
10567 err(
"Project logo '{}' specified by PROJECT_LOGO is a directory, it has to be a file!\n",projectLogo);
10573 copyFile(projectLogo,destFileName);
10587 err(
"Project icon '{}' specified by PROJECT_ICON does not exist!\n",projectIcon);
10590 else if (fi.
isDir())
10592 err(
"Project icon '{}' specified by PROJECT_ICON is a directory, it has to be a file!\n",projectIcon);
10598 copyFile(projectIcon,destFileName);
10606 for (
const auto &fileName : files)
10608 if (!fileName.empty())
10613 err(
"Extra file '{}' specified in {} does not exist!\n", fileName,filesOption);
10615 else if (fi.
isDir())
10617 err(
"Extra file '{}' specified in {} is a directory, it has to be a file!\n", fileName,filesOption);
10643 std::vector<FileEntry> fileEntries;
10644 for (
const auto &fd : *fn)
10646 if (!fd->isReference())
10648 fileEntries.emplace_back(fd->getPath(),fd.get());
10652 size_t size = fileEntries.size();
10656 FileDef *fd = fileEntries[0].fileDef;
10662 std::stable_sort(fileEntries.begin(),
10664 [](
const FileEntry &fe1,
const FileEntry &fe2)
10665 { return qstricmp_sort(fe1.path,fe2.path)<0; }
10670 const FileEntry &first = fileEntries[0];
10671 const FileEntry &last = fileEntries[size-1];
10672 int first_path_size =
static_cast<int>(first.path.size())-1;
10673 int last_path_size =
static_cast<int>(last.path.size())-1;
10676 for (i=0;i<first_path_size && i<last_path_size;i++)
10678 if (first.path[i]==
'/') j=i;
10679 if (first.path[i]!=last.path[i])
break;
10681 if (i==first_path_size && i<last_path_size && last.path[i]==
'/')
10686 else if (i==last_path_size && i<first_path_size && first.path[i]==
'/')
10693 for (
auto &fileEntry : fileEntries)
10695 QCString prefix = fileEntry.path.right(fileEntry.path.length()-j-1);
10696 fileEntry.fileDef->setName(
prefix+fn->fileName());
10698 fileEntry.fileDef->setDiskName(
prefix+fn->fileName());
10712 int sep = fileName.
findRev(
'/');
10713 int ei = fileName.
findRev(
'.');
10714 if (ei!=-1 && (sep==-1 || ei>sep))
10720 extension =
".no_extension";
10733 int ei = fileName.
findRev(
'.');
10740 extension =
".no_extension";
10744 std::string preBuf;
10751 for (
const auto &s : includePath)
10757 msg(
"Preprocessing {}...\n",fn);
10764 msg(
"Reading {}...\n",fn);
10769 std::string convBuf;
10770 convBuf.reserve(preBuf.size()+1024);
10775 std::shared_ptr<Entry> fileRoot = std::make_shared<Entry>();
10779 if (newTU) clangParser->
parse();
10782 parser.
parseInput(fileName,convBuf.
data(),fileRoot,clangParser);
10783 fileRoot->setFileDef(fd);
10800 filesToProcess.insert(s);
10803 std::mutex processedFilesLock;
10805 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10806 msg(
"Processing input using {} threads.\n",numThreads);
10808 using FutureType = std::vector< std::shared_ptr<Entry> >;
10809 std::vector< std::future< FutureType > > results;
10812 bool ambig =
false;
10819 auto processFile = [qs,&filesToProcess,&processedFilesLock,&processedFiles]() {
10820 bool ambig_l =
false;
10821 std::vector< std::shared_ptr<Entry> > roots;
10825 auto fileRoot {
parseFile(*parser.get(),fd_l,qs,clangParser.get(),
true) };
10826 roots.push_back(fileRoot);
10830 for (
auto incFile : clangParser->filesInSameTU())
10833 if (filesToProcess.find(incFile)!=filesToProcess.end())
10835 bool needsToBeProcessed =
false;
10837 std::lock_guard<std::mutex> lock(processedFilesLock);
10838 needsToBeProcessed = processedFiles.find(incFile)==processedFiles.end();
10839 if (needsToBeProcessed) processedFiles.insert(incFile);
10841 if (qincFile!=qs && needsToBeProcessed)
10847 fileRoot =
parseFile(*parser.get(),ifd,qincFile,clangParser.get(),
false);
10848 roots.push_back(fileRoot);
10856 results.emplace_back(threadPool.
queue(processFile));
10860 for (
auto &f : results)
10865 root->moveToSubEntryAndKeep(e);
10872 if (processedFiles.find(s)==processedFiles.end())
10875 auto processFile = [s]() {
10876 bool ambig =
false;
10878 std::vector< std::shared_ptr<Entry> > roots;
10885 auto fileRoot =
parseFile(*parser.get(),fd,qs,clangParser.get(),
true);
10886 roots.push_back(fileRoot);
10890 auto fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
10891 roots.push_back(fileRoot);
10895 results.emplace_back(threadPool.
queue(processFile));
10899 for (
auto &f : results)
10904 root->moveToSubEntryAndKeep(e);
10911 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10912 msg(
"Processing input using {} threads.\n",numThreads);
10914 using FutureType = std::shared_ptr<Entry>;
10915 std::vector< std::future< FutureType > > results;
10919 auto processFile = [s]() {
10920 bool ambig =
false;
10924 auto fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
10928 results.emplace_back(threadPool.
queue(processFile));
10931 for (
auto &f : results)
10933 root->moveToSubEntryAndKeep(f.get());
10951 filesToProcess.insert(s);
10957 bool ambig =
false;
10965 auto fileRoot =
parseFile(*parser.get(),fd,qs,clangParser.get(),
true);
10966 root->moveToSubEntryAndKeep(fileRoot);
10967 processedFiles.insert(s);
10971 for (
auto incFile : clangParser->filesInSameTU())
10974 if (filesToProcess.find(incFile)!=filesToProcess.end() &&
10975 processedFiles.find(incFile)==processedFiles.end())
10981 fileRoot =
parseFile(*parser.get(),ifd,incFile,clangParser.get(),
false);
10982 root->moveToSubEntryAndKeep(fileRoot);
10983 processedFiles.insert(incFile);
10992 if (processedFiles.find(s)==processedFiles.end())
10994 bool ambig =
false;
11001 auto fileRoot =
parseFile(*parser.get(),fd,qs,clangParser.get(),
true);
11002 root->moveToSubEntryAndKeep(fileRoot);
11007 std::shared_ptr<Entry> fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
11008 root->moveToSubEntryAndKeep(fileRoot);
11010 processedFiles.insert(s);
11019 bool ambig =
false;
11024 std::shared_ptr<Entry> fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
11025 root->moveToSubEntryAndKeep(std::move(fileRoot));
11045 sepPos = result.
find(
'/',2);
11047 sepPos = result.
find(
'/',sepPos+1);
11049 sepPos = result.
find(
'/',sepPos+1);
11052 if (nonSymlinks.find(
prefix.str())==nonSymlinks.end())
11069 target+=result.
mid(sepPos);
11072 if (known.find(result.
str())!=known.end())
return std::string();
11073 known.insert(result.
str());
11086 nonSymlinks.insert(
prefix.str());
11092 while (sepPos!=-1);
11111 bool errorIfNotExist,
11118 if (paths && !dirName.empty())
11120 paths->insert(dirName);
11126 if (dirName.empty())
11141 msg(
"Searching for files in directory {}\n", fi->
absFilePath());
11146 for (
const auto &dirEntry : dir.
iterator())
11149 auto checkPatterns = [&]() ->
bool
11151 return (patList==
nullptr ||
patternMatch(cfi,*patList)) &&
11152 (exclPatList==
nullptr || !
patternMatch(cfi,*exclPatList)) &&
11153 (killSet==
nullptr || killSet->find(cfi.
absFilePath())==killSet->end());
11156 if (exclSet==
nullptr || exclSet->find(cfi.
absFilePath())==exclSet->end())
11164 if (errorIfNotExist && checkPatterns())
11169 else if (cfi.
isFile() && checkPatterns())
11172 std::string path=cfi.
dirPath()+
"/";
11173 std::string fullName=path+name;
11180 fn = fnMap->
add(name,fullName);
11181 fn->push_back(std::move(fd));
11184 dirResultList.push_back(fullName);
11185 if (resultSet) resultSet->insert(fullName);
11186 if (killSet) killSet->insert(fullName);
11188 else if (recursive &&
11190 (exclPatList==
nullptr || !
patternMatch(cfi,*exclPatList)) &&
11195 patList,exclPatList,&dirResultList,resultSet,errorIfNotExist,
11196 recursive,killSet,paths);
11200 if (resultList && !dirResultList.empty())
11203 std::stable_sort(dirResultList.begin(),
11204 dirResultList.end(),
11205 [](
const auto &f1,
const auto &f2) { return qstricmp_sort(f1.c_str(),f2.c_str())<0; });
11208 resultList->insert(resultList->end(), dirResultList.begin(), dirResultList.end());
11225 bool errorIfNotExist,
11239 if (exclSet==
nullptr || exclSet->find(fi.
absFilePath())==exclSet->end())
11246 if (errorIfNotExist)
11248 warn_uncond(
"source '{}' is not a readable file or directory... skipping.\n",s);
11253 std::string dirPath = fi.
dirPath(
true);
11255 if (paths && !dirPath.empty())
11257 paths->insert(dirPath);
11260 if (killSet==
nullptr || killSet->find(filePath)==killSet->end())
11269 fn->push_back(std::move(fd));
11272 if (resultList || resultSet)
11274 if (resultList) resultList->push_back(filePath);
11275 if (resultSet) resultSet->insert(filePath);
11281 else if (fi.
isDir())
11283 readDir(&fi,fnMap,exclSet,patList,
11284 exclPatList,resultList,resultSet,errorIfNotExist,
11285 recursive,killSet,paths);
11299 anchor=
":"+md->
anchor();
11308 t <<
"REPLACE INTO symbols (symbol_id,scope_id,name,file,line) VALUES('"
11309 << fn+anchor <<
"','"
11311 << d->
name() <<
"','"
11325 for (
const auto &def : symList)
11337 msg(
"Developer parameters:\n");
11338 msg(
" -m dump symbol map\n");
11339 msg(
" -b making messages output unbuffered\n");
11340 msg(
" -c <file> process input file as a comment block and produce HTML output\n");
11342 msg(
" -t [<file|stdout|stderr>] trace debug info to file, stdout, or stderr (default file stdout)\n");
11343 msg(
" -t_time [<file|stdout|stderr>] trace debug info to file, stdout, or stderr (default file stdout),\n"
11344 " and include time and thread information\n");
11346 msg(
" -d <level> enable a debug level, such as (multiple invocations of -d are possible):\n");
11357 QCString versionString = getFullVersion();
11358 msg(
"{}\n",versionString);
11362 if (!extVers.
isEmpty()) extVers+=
", ";
11363 extVers +=
"sqlite3 ";
11364 extVers += sqlite3_libversion();
11366 if (!extVers.
isEmpty()) extVers+=
", ";
11367 extVers +=
"clang support ";
11368 extVers += CLANG_VERSION_STRING;
11372 int lastComma = extVers.
findRev(
',');
11373 if (lastComma != -1) extVers = extVers.
replace(lastComma,1,
" and");
11374 msg(
" with {}.\n",extVers);
11385 msg(
"Doxygen version {0}\nCopyright Dimitri van Heesch 1997-2025\n\n"
11386 "You can use Doxygen in a number of ways:\n\n"
11387 "1) Use Doxygen to generate a template configuration file*:\n"
11388 " {1} [-s] -g [configName]\n\n"
11389 "2) Use Doxygen to update an old configuration file*:\n"
11390 " {1} [-s] -u [configName]\n\n"
11391 "3) Use Doxygen to generate documentation using an existing "
11392 "configuration file*:\n"
11393 " {1} [configName]\n\n"
11394 "4) Use Doxygen to generate a template file controlling the layout of the\n"
11395 " generated documentation:\n"
11396 " {1} -l [layoutFileName]\n\n"
11397 " In case layoutFileName is omitted DoxygenLayout.xml will be used as filename.\n"
11398 " If - is used for layoutFileName Doxygen will write to standard output.\n\n"
11399 "5) Use Doxygen to generate a template style sheet file for RTF, HTML or Latex.\n"
11400 " RTF: {1} -w rtf styleSheetFile\n"
11401 " HTML: {1} -w html headerFile footerFile styleSheetFile [configFile]\n"
11402 " LaTeX: {1} -w latex headerFile footerFile styleSheetFile [configFile]\n\n"
11403 "6) Use Doxygen to generate a rtf extensions file\n"
11404 " {1} -e rtf extensionsFile\n\n"
11405 " If - is used for extensionsFile Doxygen will write to standard output.\n\n"
11406 "7) Use Doxygen to compare the used configuration file with the template configuration file\n"
11407 " {1} -x [configFile]\n\n"
11408 " Use Doxygen to compare the used configuration file with the template configuration file\n"
11409 " without replacing the environment variables or CMake type replacement variables\n"
11410 " {1} -x_noenv [configFile]\n\n"
11411 "8) Use Doxygen to show a list of built-in emojis.\n"
11412 " {1} -f emoji outputFileName\n\n"
11413 " If - is used for outputFileName Doxygen will write to standard output.\n\n"
11414 "*) If -s is specified the comments of the configuration items in the config file will be omitted.\n"
11415 " If configName is omitted 'Doxyfile' will be used as a default.\n"
11416 " If - is used for configFile Doxygen will write / read the configuration to /from standard output / input.\n\n"
11417 "If -q is used for a Doxygen documentation run, Doxygen will see this as if QUIET=YES has been set.\n\n"
11418 "-v print version string, -V print extended version information\n"
11419 "-h,-? prints usage help information\n"
11420 "{1} -d prints additional usage flags for debugging purposes\n",versionString,name);
11427static const char *
getArg(
int argc,
char **argv,
int &optInd)
11430 if (
qstrlen(&argv[optInd][2])>0)
11431 s=&argv[optInd][2];
11432 else if (optInd+1<argc && argv[optInd+1][0]!=
'-')
11451 return []() {
return std::make_unique<T>(); };
11459 std::setlocale(LC_ALL,
"");
11460 std::setlocale(LC_CTYPE,
"C");
11461 std::setlocale(LC_NUMERIC,
"C");
11568 return std::max(0,std::min(r-16,9));
11573 QCString versionString = getFullVersion();
11576 auto writeFile = [](
const char *fileName,std::function<void(
TextStream&)> func) ->
bool
11596 bool genConfig=
false;
11597 bool shortList=
false;
11598 bool traceTiming=
false;
11600 bool updateConfig=
false;
11601 bool quiet =
false;
11602 while (optInd<argc && argv[optInd][0]==
'-' &&
11603 (isalpha(argv[optInd][1]) || argv[optInd][1]==
'?' ||
11604 argv[optInd][1]==
'-')
11607 switch(argv[optInd][1])
11617 if (optInd+1>=argc)
11619 layoutName=
"DoxygenLayout.xml";
11623 layoutName=argv[optInd+1];
11631 if (optInd+1>=argc)
11633 msg(
"option \"-c\" is missing the file name to read\n");
11658 msg(
"option \"-d\" has unknown debug specifier: \"{}\".\n",debugLabel);
11668 if (!strcmp(argv[optInd]+1,
"t_time"))
11670 traceTiming =
true;
11672 else if (!strcmp(argv[optInd]+1,
"t"))
11674 traceTiming =
false;
11678 err(
"option should be \"-t\" or \"-t_time\", found: \"{}\".\n",argv[optInd]);
11682 if (optInd+1>=argc || argv[optInd+1][0] ==
'-')
11684 traceName=
"stdout";
11688 traceName=argv[optInd+1];
11692 err(
"support for option \"-t\" has not been compiled in (use a debug build or a release build with tracing enabled).\n");
11703 err(
"option should be \"-x\" or \"-x_noenv\", found: \"{}\".\n",argv[optInd]);
11719 err(
"option \"-e\" is missing format specifier rtf.\n");
11725 if (optInd+1>=argc)
11727 err(
"option \"-e rtf\" is missing an extensions file name\n");
11735 err(
"option \"-e\" has invalid format specifier.\n");
11745 err(
"option \"-f\" is missing list specifier.\n");
11751 if (optInd+1>=argc)
11753 err(
"option \"-f emoji\" is missing an output file name\n");
11761 err(
"option \"-f\" has invalid list specifier.\n");
11771 err(
"option \"-w\" is missing format specifier rtf, html or latex\n");
11777 if (optInd+1>=argc)
11779 err(
"option \"-w rtf\" is missing a style sheet file name\n");
11785 err(
"error opening RTF style sheet file {}!\n",argv[optInd+1]);
11795 if (optInd+4<argc ||
FileInfo(
"Doxyfile").exists() ||
FileInfo(
"doxyfile").exists())
11801 err(
"error opening or reading configuration file {}!\n",argv[optInd+4]);
11806 if (optInd+3>=argc)
11808 err(
"option \"-w html\" does not have enough arguments\n");
11825 if (optInd+4<argc ||
FileInfo(
"Doxyfile").exists() ||
FileInfo(
"doxyfile").exists())
11830 err(
"error opening or reading configuration file {}!\n",argv[optInd+4]);
11835 if (optInd+3>=argc)
11837 err(
"option \"-w latex\" does not have enough arguments\n");
11853 err(
"Illegal format specifier \"{}\": should be one of rtf, html or latex\n",formatName);
11873 if (
qstrcmp(&argv[optInd][2],
"help")==0)
11875 usage(argv[0],versionString);
11878 else if (
qstrcmp(&argv[optInd][2],
"version")==0)
11884 else if ((
qstrcmp(&argv[optInd][2],
"Version")==0) ||
11885 (
qstrcmp(&argv[optInd][2],
"VERSION")==0))
11893 err(
"Unknown option \"-{}\"\n",&argv[optInd][1]);
11894 usage(argv[0],versionString);
11899 setvbuf(stdout,
nullptr,_IONBF,0);
11906 usage(argv[0],versionString);
11910 err(
"Unknown option \"-{:c}\"\n",argv[optInd][1]);
11911 usage(argv[0],versionString);
11922 TRACE(
"Doxygen version used: {}",getFullVersion());
11925 FileInfo configFileInfo1(
"Doxyfile"),configFileInfo2(
"doxyfile");
11928 if (configFileInfo1.exists())
11930 configName=
"Doxyfile";
11932 else if (configFileInfo2.
exists())
11934 configName=
"doxyfile";
11936 else if (genConfig)
11938 configName=
"Doxyfile";
11942 err(
"Doxyfile not found and no input file specified!\n");
11943 usage(argv[0],versionString);
11950 if (fi.
exists() ||
qstrcmp(argv[optInd],
"-")==0 || genConfig)
11952 configName=argv[optInd];
11956 err(
"configuration file {} not found!\n",argv[optInd]);
11957 usage(argv[0],versionString);
11971 err(
"could not open or read configuration file {}!\n",configName);
12042 for (
const auto &mapping : extMaps)
12045 int i=mapStr.
find(
'=');
12061 err(
"Failed to map file extension '{}' to unsupported language '{}'.\n"
12062 "Check the EXTENSION_MAPPING setting in the config file.\n",
12067 msg(
"Adding custom extension mapping: '{}' will be treated as language '{}'\n",
12076 if (cd==
reinterpret_cast<void *
>(-1))
12078 term(
"unsupported character conversion: '{}'->'UTF-8': {}\n"
12079 "Check the 'INPUT_ENCODING' setting in the config file!\n",
12089 for (
const auto &mapping : fileEncod)
12092 int i=mapStr.
find(
'=');
12106 if (cd==
reinterpret_cast<void *
>(-1))
12108 term(
"unsupported character conversion: '{}'->'UTF-8': {}\n"
12109 "Check the 'INPUT_FILE_ENCODING' setting in the config file!\n",
12110 encoding,strerror(errno));
12123 for (
const auto &s : expandAsDefinedList)
12141 signal(SIGINT,SIG_DFL);
12143 msg(
"Cleaning up...\n");
12158 if (generateTagFile.
isEmpty())
return;
12163 err(
"cannot open tag file {} for writing\n", generateTagFile);
12167 tagFile <<
"<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>\n";
12168 tagFile <<
"<tagfile doxygen_version=\"" << getDoxygenVersion() <<
"\"";
12169 std::string gitVersion = getGitVersion();
12170 if (!gitVersion.empty())
12172 tagFile <<
" doxygen_gitid=\"" << gitVersion <<
"\"";
12179 for (
const auto &fd : *fn)
12181 if (fd->isLinkableInProject()) fd->writeTagFile(tagFile);
12214 if (gd->isLinkableInProject()) gd->writeTagFile(tagFile);
12219 if (mod->isLinkableInProject()) mod->writeTagFile(tagFile);
12224 if (pd->isLinkableInProject()) pd->writeTagFile(tagFile);
12231 if (dd->isLinkableInProject()) dd->writeTagFile(tagFile);
12235 tagFile <<
"</tagfile>\n";
12243 msg(
"Exiting...\n");
12253 const char *defaultDirName)
12258 result = baseDirName + defaultDirName;
12260 else if (formatDirName[0]!=
'/' && (formatDirName.
length()==1 || formatDirName[1]!=
':'))
12262 result.
prepend(baseDirName+
"/");
12264 Dir formatDir(result.
str());
12267 term(
"Could not create output directory {}\n", result);
12281 g_s.begin(
"Searching for include files...\n");
12284 for (
const auto &s : includePathList)
12302 g_s.begin(
"Searching for example files...\n");
12305 for (
const auto &s : examplePathList)
12320 g_s.begin(
"Searching for images...\n");
12323 for (
const auto &s : imagePathList)
12338 g_s.begin(
"Searching for dot files...\n");
12341 for (
const auto &s : dotFileList)
12356 g_s.begin(
"Searching for msc files...\n");
12359 for (
const auto &s : mscFileList)
12374 g_s.begin(
"Searching for dia files...\n");
12377 for (
const auto &s : diaFileList)
12392 g_s.begin(
"Searching for plantuml files...\n");
12395 for (
const auto &s : plantUmlFileList)
12410 g_s.begin(
"Searching for files to exclude\n");
12412 for (
const auto &s : excludeList)
12430 g_s.begin(
"Searching INPUT for files to process...\n");
12434 for (
const auto &s : inputList)
12437 size_t l = path.
length();
12441 if (path.
at(l-1)==
'\\' || path.
at(l-1)==
'/') path=path.
left(l-1);
12461 [](
const auto &f1,
const auto &f2)
12467 if (fileName->size()>1)
12469 std::stable_sort(fileName->begin(),fileName->end(),[](
const auto &f1,
const auto &f2)
12471 return qstricmp_sort(f1->absFilePath(),f2->absFilePath())<0;
12477 warn_uncond(
"No files to be processed, please check your settings, in particular INPUT, FILE_PATTERNS, and RECURSIVE\n");
12488 if (mdfileAsMainPage.
isEmpty())
return;
12492 warn_uncond(
"Specified markdown mainpage '{}' does not exist\n",mdfileAsMainPage);
12495 bool ambig =
false;
12498 warn_uncond(
"Specified markdown mainpage '{}' has not been defined as input file\n",mdfileAsMainPage);
12517 QCString versionString = getFullVersion();
12518 msg(
"Doxygen version used: {}\n",versionString);
12528 if (outputDirectory.
isEmpty())
12534 Dir dir(outputDirectory.
str());
12538 if (!dir.
mkdir(outputDirectory.
str()))
12540 term(
"tag OUTPUT_DIRECTORY: Output directory '{}' does not "
12541 "exist and cannot be created\n",outputDirectory);
12545 msg(
"Notice: Output directory '{}' does not exist. "
12546 "I have created it for you.\n", outputDirectory);
12561 if (cacheSize<0) cacheSize=0;
12562 if (cacheSize>9) cacheSize=9;
12563 uint32_t lookupSize = 65536 << cacheSize;
12602 bool generateSitemap = !sitemapUrl.
isEmpty();
12603 if (generateSitemap && !sitemapUrl.
endsWith(
"/"))
12610 bool generateEclipseHelp =
Config_getBool(GENERATE_ECLIPSEHELP);
12624 if (generateDocbook)
12671 newFontPath+=curFontPath;
12687 bool defaultLayoutUsed =
FALSE;
12688 if (layoutFileName.
isEmpty())
12691 defaultLayoutUsed =
TRUE;
12693 AUTO_TRACE_ADD(
"defaultLayoutUsed={}, layoutFileName={}",defaultLayoutUsed,layoutFileName);
12698 msg(
"Parsing layout file {}...\n",layoutFileName);
12701 else if (!defaultLayoutUsed)
12703 warn_uncond(
"failed to open layout file '{}' for reading! Using default settings.\n",layoutFileName);
12713 if (generateHtml) exclPatterns.push_back(htmlOutput.
str());
12714 if (generateDocbook) exclPatterns.push_back(docbookOutput.
str());
12715 if (generateXml) exclPatterns.push_back(xmlOutput.
str());
12716 if (generateLatex) exclPatterns.push_back(latexOutput.
str());
12717 if (generateRtf) exclPatterns.push_back(rtfOutput.
str());
12718 if (generateMan) exclPatterns.push_back(manOutput.
str());
12738 if (generateDocbook)
12749 std::shared_ptr<Entry> root = std::make_shared<Entry>();
12753 msg(
"Reading and parsing tag files\n");
12755 for (
const auto &s : tagFileList)
12767 g_s.begin(
"Parsing files\n");
12807 g_s.begin(
"Building macro definition list...\n");
12811 g_s.begin(
"Building group list...\n");
12816 g_s.begin(
"Building directory list...\n");
12821 g_s.begin(
"Building namespace list...\n");
12826 g_s.begin(
"Building file list...\n");
12830 g_s.begin(
"Building class list...\n");
12834 g_s.begin(
"Building concept list...\n");
12842 g_s.begin(
"Computing nesting relations for classes...\n");
12855 g_s.begin(
"Associating documentation with classes...\n");
12859 g_s.begin(
"Associating documentation with concepts...\n");
12864 g_s.begin(
"Associating documentation with modules...\n");
12868 g_s.begin(
"Building example list...\n");
12872 g_s.begin(
"Searching for enumerations...\n");
12880 g_s.begin(
"Searching for documented typedefs...\n");
12886 g_s.begin(
"Searching for documented sequences...\n");
12890 g_s.begin(
"Searching for documented dictionaries...\n");
12895 g_s.begin(
"Searching for members imported via using declarations...\n");
12902 g_s.begin(
"Searching for included using directives...\n");
12906 g_s.begin(
"Searching for documented variables...\n");
12910 g_s.begin(
"Building interface member list...\n");
12913 g_s.begin(
"Building member list...\n");
12917 g_s.begin(
"Searching for friends...\n");
12921 g_s.begin(
"Searching for documented defines...\n");
12925 g_s.begin(
"Computing class inheritance relations...\n");
12930 g_s.begin(
"Computing class usage relations...\n");
12936 g_s.begin(
"Searching for tag less structs...\n");
12941 g_s.begin(
"Flushing cached template relations that have become invalid...\n");
12945 g_s.begin(
"Warn for undocumented namespaces...\n");
12949 g_s.begin(
"Computing class relations...\n");
12960 g_s.begin(
"Add enum values to enums...\n");
12965 g_s.begin(
"Searching for member function documentation...\n");
12977 g_s.begin(
"Creating members for template instances...\n");
12981 g_s.begin(
"Building page list...\n");
12985 g_s.begin(
"Building requirements list...\n");
12989 g_s.begin(
"Search for main page...\n");
12994 g_s.begin(
"Computing page relations...\n");
12999 g_s.begin(
"Determining the scope of groups...\n");
13003 g_s.begin(
"Computing module relations...\n");
13005 mm.resolvePartitions();
13006 mm.resolveImports();
13007 mm.collectExportedSymbols();
13026 return i==0 ?
qstricmp_sort(c1->name(), c2->name())<0 : i<0;
13040 g_s.begin(
"Sorting lists...\n");
13061 g_s.begin(
"Determining which enums are documented\n");
13065 g_s.begin(
"Computing member relations...\n");
13070 g_s.begin(
"Building full member lists recursively...\n");
13074 g_s.begin(
"Adding members to member groups.\n");
13080 g_s.begin(
"Distributing member group documentation.\n");
13085 g_s.begin(
"Computing member references...\n");
13091 g_s.begin(
"Inheriting documentation...\n");
13099 g_s.begin(
"Generating disk names...\n");
13103 g_s.begin(
"Adding source references...\n");
13107 g_s.begin(
"Adding xrefitems...\n");
13112 g_s.begin(
"Adding requirements...\n");
13117 g_s.begin(
"Sorting member lists...\n");
13121 g_s.begin(
"Setting anonymous enum type...\n");
13125 g_s.begin(
"Computing dependencies between directories...\n");
13129 g_s.begin(
"Generating citations page...\n");
13133 g_s.begin(
"Counting members...\n");
13137 g_s.begin(
"Counting data structures...\n");
13141 g_s.begin(
"Resolving user defined references...\n");
13145 g_s.begin(
"Finding anchors and sections in the documentation...\n");
13149 g_s.begin(
"Transferring function references...\n");
13153 g_s.begin(
"Combining using relations...\n");
13158 g_s.begin(
"Adding members to index pages...\n");
13163 g_s.begin(
"Correcting members for VHDL...\n");
13167 g_s.begin(
"Computing tooltip texts...\n");
13175 [](
const auto &g1,
const auto &g2)
13176 {
return g1->groupTitle() < g2->groupTitle(); });
13180 gd->sortSubGroups();
13224 if (generateDocbook)
13244 err(
"USE_HTAGS is YES but htags(1) failed. \n");
13246 err(
"htags(1) ended normally but failed to load the filemap. \n");
13253 g_s.begin(
"Generating style sheet...\n");
13261 g_s.begin(
"Generating search indices...\n");
13262 if (searchEngine && !serverBasedSearch && generateHtml)
13270 if (generateHtml && searchEngine)
13273 Dir searchDir(searchDirName.
str());
13274 if (!searchDir.
exists() && !searchDir.
mkdir(searchDirName.
str()))
13276 term(
"Could not create search results directory '{}' $PWD='{}'\n",
13280 if (!serverBasedSearch)
13302 if (generateDocbook)
13318 g_s.begin(
"Generating images for formulas in HTML...\n");
13325 g_s.begin(
"Generating images for formulas in RTF...\n");
13332 g_s.begin(
"Generating images for formulas in Docbook...\n");
13337 g_s.begin(
"Generating example documentation...\n");
13341 g_s.begin(
"Generating file sources...\n");
13345 g_s.begin(
"Generating file documentation...\n");
13349 g_s.begin(
"Generating page documentation...\n");
13353 g_s.begin(
"Generating group documentation...\n");
13357 g_s.begin(
"Generating class documentation...\n");
13361 g_s.begin(
"Generating concept documentation...\n");
13365 g_s.begin(
"Generating module documentation...\n");
13369 g_s.begin(
"Generating namespace documentation...\n");
13375 g_s.begin(
"Generating graph info page...\n");
13380 g_s.begin(
"Generating directory documentation...\n");
13389 g_s.begin(
"finalizing index lists...\n");
13393 g_s.begin(
"writing tag file...\n");
13399 g_s.begin(
"Generating XML output...\n");
13407 g_s.begin(
"Generating SQLITE3 output...\n");
13414 g_s.begin(
"Generating AutoGen DEF output...\n");
13420 g_s.begin(
"Generating Perl module output...\n");
13424 if (generateHtml && searchEngine && serverBasedSearch)
13426 g_s.begin(
"Generating search index\n");
13436 if (searchDataFile.
isEmpty())
13438 searchDataFile=
"searchdata.xml";
13451 g_s.begin(
"Combining RTF output...\n");
13454 err(
"An error occurred during post-processing the RTF files!\n");
13459 g_s.begin(
"Running plantuml with JAVA...\n");
13465 g_s.begin(
"Running dot...\n");
13470 if (generateHtml &&
13474 g_s.begin(
"Running html help compiler...\n");
13479 if ( generateHtml &&
13483 g_s.begin(
"Running qhelpgenerator...\n");
13491 msg(
"type lookup cache used {}/{} hits={} misses={}\n",
13496 msg(
"symbol lookup cache used {}/{} hits={} misses={}\n",
13503 int cacheParam = std::max(typeCacheParam,symbolCacheParam);
13506 msg(
"Note: based on cache misses the ideal setting for LOOKUP_CACHE_SIZE is {} at the cost of higher memory usage.\n",cacheParam);
13512 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
13513 if (numThreads<1) numThreads=1;
13514 msg(
"Total elapsed time: {:.6f} seconds\n(of which an average of {:.6f} seconds per thread waiting for external tools to finish)\n",
13521 msg(
"finished...\n");
13526 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.