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={}",
1105 AUTO_TRACE_ADD(
"Class {} not added, already exists as alias", fullName);
1113 if (!root->
spec.isForwardDecl())
1175 qualifiedName.
prepend(scName+
"::");
1181 AUTO_TRACE_ADD(
"Found concept with name '{}' (qualifiedName='{}')", cd ? cd->
name() : root->
name, qualifiedName);
1185 qualifiedName=cd->
name();
1199 AUTO_TRACE_ADD(
"New concept: fullname '{}' namespace '{}' name='{}' brief='{}' docs='{}'",
1200 qualifiedName,namespaceName,className,root->
brief,root->
doc);
1209 if (qualifiedName.
find(
"::")!=-1)
1221 qualifiedName,tagName,refFileName)));
1225 qualifiedName,root->
tArgLists.size(),fmt::ptr(tagInfo));
1256 for (
const auto &ce : root->
children())
1259 if (ce->section.isConceptDocPart())
1264 if (!ce->brief.isEmpty())
1266 cd->
addDocPart(ce->brief,ce->startLine,ce->startColumn);
1269 if (!ce->doc.isEmpty())
1271 cd->
addDocPart(ce->doc,ce->startLine,ce->startColumn);
1275 else if (ce->section.isConceptCodePart())
1277 cd->
addCodePart(ce->initializer.str(),ce->startLine,ce->startColumn);
1284 AUTO_TRACE_ADD(
"Concept '{}' not added, already exists (as alias)", qualifiedName);
1291 for (
const auto &ce : root->
children())
1293 if (ce->section.isConceptDocPart())
1313 if (root->
section.isModuleDoc())
1323 if (root->
section.isConcept())
1333 if (root->
section.isConceptDoc())
1352 if (cd!=ocd && cd->groupId()==ocd->groupId() &&
1353 !cd->partOfGroups().empty() && ocd->partOfGroups().empty())
1358 for (
const auto &gd : cd->partOfGroups())
1364 gd->addConcept(ocd.get());
1389 aliasFullName(name),aliasCd(std::move(cd)), aliasContext(ctx) {}
1391 std::unique_ptr<ClassDef> aliasCd;
1394 std::vector<ClassAlias> aliases;
1398 if (cd && visitedClasses.find(icd.get())==visitedClasses.end())
1404 name,icd->getFileDef(),
nullptr);
1430 aliases.emplace_back(aliasFullName,std::move(aliasCd),dm);
1441 visitedClasses.insert(icd.get());
1451 for (
auto &alias : aliases)
1456 alias.aliasContext->addInnerCompound(aliasCd);
1465 if (cd && visitedClasses.find(icd.get())==visitedClasses.end())
1483 "Incomplete input: scope for class {} not found!{}",name,
1484 name.
startsWith(
"std::") ?
" Try enabling BUILTIN_STL_SUPPORT." :
""
1502 if (visitedClasses.find(cd.get())==visitedClasses.end() && !cd->partOfGroups().empty())
1506 for (
auto &ncd : cd->getClasses())
1517 visitedClasses.insert(cd.get());
1528 fullName+=
"."+fieldName;
1571 for (
const auto &md : *ml)
1574 auto newMd =
createMemberDef(md->getDefFileName(),md->getDefLine(),md->getDefColumn(),
1575 md->typeString(),md->name(),md->argsString(),md->excpString(),
1576 md->protection(),md->virtualness(),md->isStatic(),Relationship::Member,
1623 for (
const auto &md : *ml)
1626 if (type.
find(
"::@")!=-1)
1632 if (type.
find(icd->name())!=-1)
1635 if (md->isAnonymous()) name =
"__unnamed" +
QCString().
setNum(pos++)+
"__";
1655 for (
const auto &pmd : *pml)
1658 if (pmdm && pmd->
name()==md->name())
1678 if (icd->name().find(
"@")==-1)
1687 candidates.push_back(cdm);
1693 std::vector<ClassDefMutable *> candidates;
1705 for (
auto &cd : candidates)
1718 (root->
section.isNamespace() ||
1719 root->
section.isNamespaceDoc() ||
1728 if (root->
section.isPackageDoc())
1792 root->
type,root->
spec.isPublished())));
1859 QCString aliasName = aliasNd->name();
1888 for (
auto &und : unl)
1892 if (usingNd!=
nullptr)
break;
1899 if (root->
section.isUsingDir())
1917 (fd==
nullptr || fd->
getLanguage()!=SrcLangExt::Java)
1931 int scopeOffset =
static_cast<int>(nsName.
length());
1942 else if ((scopeOffset=nsName.
findRev(
"::",scopeOffset-1))==-1)
1946 }
while (scopeOffset>=0 && usingNd==
nullptr);
1948 if (usingNd==
nullptr && nd)
1952 while (pnd && usingNd==
nullptr)
1969 if (usingNd==
nullptr && fd)
2042 if (root->
section.isUsingDecl() &&
2055 if (root->
section.isUsingDecl() &&
2057 (!filterPythonPackages || (root->
lang==SrcLangExt::Python && root->
fileName.
endsWith(
"__init__.py")))
2060 AUTO_TRACE(
"Found using declaration '{}' at line {} of {} inside section {}",
2090 if (nd==
nullptr) scope = fd;
2160 AUTO_TRACE(
"creating new member {} for class {}",memName,cd->
name());
2171 newMmd->setMemberClass(cd);
2189 newMmd->addSectionsToDefinition(root->
anchors);
2195 newMmd->setMemberGroupId(root->
mGrpId);
2198 newMmd->setLanguage(root->
lang);
2199 newMmd->setId(root->
id);
2208 if (root->
section.isUsingDecl() &&
2235 for (
auto &mi : *mni)
2238 if (md && md->
protection()!=Protection::Private)
2253 for (
const auto ©Cd : it->second)
2266 else if (root->
section.isUsingDecl() &&
2268 root->
lang==SrcLangExt::Cpp
2301 memName = root->
name;
2323 newMmd->setNamespace(nd);
2328 newMmd->setFileDef(fd);
2347 newMmd->addSectionsToDefinition(root->
anchors);
2353 newMmd->setMemberGroupId(root->
mGrpId);
2356 newMmd->setLanguage(root->
lang);
2357 newMmd->setId(root->
id);
2365 if (nd && aliasMd.get())
2369 if (fd && aliasMd.get())
2398 if (nd) ncdm->
moveTo(nd);
2427 aliasFullName = aliasCd->localName();
2431 aliasFullName = nd->
qualifiedName()+
"::"+aliasCd->localName();
2463 for (
const auto &fd : *fn)
2466 fd->addIncludedUsingDirectives(visitedFiles);
2488 if (lang==SrcLangExt::Java || lang==SrcLangExt::CSharp)
2493 AUTO_TRACE(
"class variable: file='{}' type='{}' scope='{}' name='{}' args='{}' prot={} mtype={} lang={} ann={} init='{}'",
2501 if (root->
spec.isAlias())
2507 def=type+
" "+name+args;
2512 if (root->
spec.isAlias())
2514 def=
"using "+qualScope+scopeSeparator+name;
2518 def=type+
" "+qualScope+scopeSeparator+name+args;
2530 def=qualScope+scopeSeparator+name+args;
2541 for (
const auto &imd : *mn)
2553 if (root->
lang==SrcLangExt::ObjC &&
2554 root->
mtype==MethodTypes::Property &&
2578 prot,Specifier::Normal,root->
isStatic,related,
2582 mmd->setTagInfo(root->
tagInfo());
2583 mmd->setMemberClass(cd);
2587 mmd->setDefinition(def);
2589 mmd->addSectionsToDefinition(root->
anchors);
2590 mmd->setFromAnonymousScope(fromAnnScope);
2591 mmd->setFromAnonymousMember(fromAnnMemb);
2596 mmd->setMemberGroupId(root->
mGrpId);
2597 mmd->setMemberSpecifiers(root->
spec);
2598 mmd->setVhdlSpecifiers(root->
vhdlSpec);
2599 mmd->setReadAccessor(root->
read);
2600 mmd->setWriteAccessor(root->
write);
2602 mmd->setHidden(root->
hidden);
2604 mmd->setLanguage(root->
lang);
2605 mmd->setId(root->
id);
2608 mmd->setBodyDef(root->
fileDef());
2613 mmd->setRefItems(root->
sli);
2614 mmd->setRequirementReferences(root->
rqli);
2644 AUTO_TRACE(
"global variable: file='{}' type='{}' scope='{}' name='{}' args='{}' prot={} mtype={} lang={} init='{}'",
2656 static const reg::Ex re(R
"(\a\w*)");
2658 const std::string &typ = ttype.
str();
2680 if (scope.
find(
'@')!=-1)
return nullptr;
2696 if (root->
spec.isAlias())
2698 def=
"using "+nd->
name()+sep+name;
2702 def=type+
" "+nd->
name()+sep+name+args;
2707 def=nd->
name()+sep+name+args;
2714 if (name.
at(0)==
'@')
2720 if (root->
spec.isAlias())
2722 def=
"using "+root->
name;
2726 def=type+
" "+name+args;
2747 for (
const auto &imd : *mn)
2761 bool isPHPArray = md->
getLanguage()==SrcLangExt::PHP &&
2764 bool staticsInDifferentFiles =
2770 !staticsInDifferentFiles
2812 mmd->setTagInfo(root->
tagInfo());
2813 mmd->setMemberSpecifiers(root->
spec);
2814 mmd->setVhdlSpecifiers(root->
vhdlSpec);
2818 mmd->addSectionsToDefinition(root->
anchors);
2819 mmd->setFromAnonymousScope(fromAnnScope);
2820 mmd->setFromAnonymousMember(fromAnnMemb);
2823 mmd->setMemberGroupId(root->
mGrpId);
2824 mmd->setDefinition(def);
2825 mmd->setLanguage(root->
lang);
2826 mmd->setId(root->
id);
2834 mmd->setBodyDef(fd);
2839 mmd->setRefItems(root->
sli);
2840 mmd->setRequirementReferences(root->
rqli);
2843 mmd->setNamespace(nd);
2851 mmd->setFileDef(fd);
2879 if (lang == SrcLangExt::Fortran || lang == SrcLangExt::VHDL)
2884 static const reg::Ex re(R
"(\([^)]*[*&^][^)]*\))");
2886 size_t i=std::string::npos;
2890 i = match.position();
2893 if (i!=std::string::npos)
2895 size_t di = type.find(
"decltype(");
2896 if (di!=std::string::npos && di<i)
2898 i = std::string::npos;
2901 size_t bb=type.find(
'<');
2902 size_t be=type.rfind(
'>');
2903 bool templFp =
false;
2904 if (be!=std::string::npos) {
2905 size_t cc_ast = type.find(
"::*");
2906 size_t cc_amp = type.find(
"::&");
2907 templFp = (cc_ast != std::string::npos && cc_ast>be) || (cc_amp != std::string::npos && cc_amp>be);
2910 if (!type.empty() &&
2911 i!=std::string::npos &&
2912 type.find(
"operator")==std::string::npos &&
2913 (type.find(
")(")==std::string::npos || type.find(
"typedef ")!=std::string::npos) &&
2915 (!(bb<i && i<be) || templFp)
2918 if (pLength) *pLength=
static_cast<int>(l);
2921 return static_cast<int>(i);
2938 bool result =
false;
2939 bool typeIsClass =
false;
2940 bool typePtrType =
false;
2974 typePtrType = type.
find(
'*')!=-1 || type.
find(
'&')!=-1;
2977 typeIsClass = resolver.
resolveClass(ctx,type)!=
nullptr;
2979 if (!typeIsClass && (ti=type.
find(
'<'))!=-1)
2996 static const reg::Ex initChars(R
"([\d"'&*!^]+)");
3000 std::string name = a.
name.
str();
3001 if (
reg::search(name,match,initChars) && match.position()==0)
3033 std::string atype = a.
type.
str();
3034 if (
reg::search(atype,match,initChars) && match.position()==0)
3041 if (resType.empty()) resType=atype;
3042 static const reg::Ex idChars(R
"(\a\w*)");
3043 if (
reg::search(resType,match,idChars) && match.position()==0)
3045 resType=match.str();
3046 if (resType==
"int" || resType==
"long" ||
3047 resType==
"float" || resType==
"double" ||
3048 resType==
"char" || resType==
"void" ||
3049 resType==
"signed" || resType==
"unsigned" ||
3050 resType==
"const" || resType==
"volatile" )
3087 bool insideString=
FALSE;
3088 bool insideChar=
FALSE;
3090 while (e<len && brCount!=0)
3096 if (!insideString && !insideChar)
3098 if (e<len-1 && s.
at(e+1)==
'<')
3100 else if (roundCount==0)
3105 if (!insideString && !insideChar)
3107 if (e<len-1 && s.
at(e+1)==
'>')
3109 else if (roundCount==0)
3114 if (!insideString && !insideChar)
3118 if (!insideString && !insideChar)
3124 if (insideString && pc!=
'\\')
3133 if (insideChar && pc!=
'\\')
3143 return brCount==0 ?
static_cast<int>(e) : -1;
3152 AUTO_TRACE(
"VARIABLE_SEC: type='{}' name='{}' args='{}' bodyLine={} endBodyLine={} mGrpId={} relates='{}'",
3159 if (type.
isEmpty() && name.
find(
"operator")==-1 &&
3160 (name.
find(
'*')!=-1 || name.
find(
'&')!=-1))
3167 std::string sargs = args.
str();
3168 static const reg::Ex reName(R
"(\a\w*)");
3173 sargs = match.suffix().str();
3174 size_t j = sargs.find(
')');
3175 if (j!=std::string::npos) args=sargs.substr(0,j);
3185 int ai = type.
find(
'[',i);
3191 else if (type.
find(
')',i)!=-1)
3198 AUTO_TRACE_ADD(
"after correction: type='{}' name='{}' args='{}'",type,name,args);
3209 scope=name.
left(index);
3210 name=name.
mid(index+2);
3229 bool isRelated=
FALSE;
3230 bool isMemberOf=
FALSE;
3233 if (root->
lang==SrcLangExt::CSharp)
3246 for (
size_t i=0;i<name.
length()-1;i++)
3248 if (name[i]==
':' && name[i+1]==
':')
3250 p=
static_cast<int>(i);
3252 else if (name[i]==
'<')
3257 if (e!=-1) i=
static_cast<int>(e);
3263 if (type==
"friend class" || type==
"friend struct" ||
3264 type==
"friend union")
3278 Relationship::Member
3304 else if (root->
mtype==MethodTypes::Property)
3306 else if (root->
mtype==MethodTypes::Event)
3308 else if (type.
find(
"sequence<") != -1)
3310 else if (type.
find(
"dictionary<") != -1)
3316 isMemberOf=(root->
relatesType==RelatesType::MemberOf);
3334 int si=scope.
find(
'@');
3338 bool inlineSimpleStructs =
Config_getBool(INLINE_SIMPLE_STRUCTS);
3339 Relationship relationship = isMemberOf ? Relationship::Foreign :
3340 isRelated ? Relationship::Related :
3341 Relationship::Member ;
3342 if (si!=-1 && !inlineSimpleStructs)
3346 pScope = scope.
left(std::max(si-2,0));
3348 pScope.
prepend(annScopePrefix);
3349 else if (annScopePrefix.
length()>2)
3350 pScope=annScopePrefix.
left(annScopePrefix.
length()-2);
3351 if (name.
at(0)!=
'@')
3419 scope=rname.
left(index);
3420 rname=rname.
mid(index+2);
3432 for (
auto &imd : *mn)
3434 if (!imd->isTypedef())
3443 bool notBothGrouped = root->
groups.empty() || imd->getGroupDef()==
nullptr;
3444 bool bothSameScope = (!cd && !nd) || (cd && imd->getClassDef() == cd) || (nd && imd->getNamespaceDef() == nd);
3447 if (notBothGrouped && bothSameScope && imd->typeString()==rtype)
3495 for (
const auto &e : root->
children())
3496 if (!e->section.isEnum())
3513 for (
const auto &e : root->
children())
3514 if (!e->section.isEnum())
3531 for (
const auto &e : root->
children())
3532 if (!e->section.isEnum())
3547 (root->
section.isVariable() &&
3550 (root->
section.isFunction() &&
3553 (root->
section.isFunction() &&
3562 for (
const auto &e : root->
children())
3563 if (!e->section.isEnum())
3589 mmd->setTagInfo(root->
tagInfo());
3590 mmd->setMemberClass(cd);
3592 mmd->setDocsForDefinition(
false);
3596 mmd->setMemberSpecifiers(root->
spec);
3597 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3598 mmd->setMemberGroupId(root->
mGrpId);
3600 mmd->setLanguage(root->
lang);
3601 mmd->setBodyDef(fd);
3602 mmd->setFileDef(fd);
3603 mmd->addSectionsToDefinition(root->
anchors);
3605 mmd->setDefinition(def);
3609 AUTO_TRACE(
"Interface member: fileName='{}' type='{}' name='{}' mtype='{}' prot={} virt={} state={} proto={} def='{}'",
3617 root->
spec.isOptional() ? Protection::Protected : Protection::Public, Specifier::Normal);
3627 mmd->setRefItems(root->
sli);
3628 mmd->setRequirementReferences(root->
rqli);
3637 if (root->
section.isExportedInterface() || root->
section.isIncludedService())
3639 AUTO_TRACE(
"Exported interface/included service: type='{}' scope='{}' name='{}' args='{}'"
3640 " relates='{}' relatesType='{}' file='{}' line={} bodyLine={} #tArgLists={}"
3641 " mGrpId={} spec={} proto={} docFile='{}'",
3667 "Illegal member name found.");
3673 case SrcLangExt::Unknown:
3674 case SrcLangExt::IDL:
3711 if ((fd==
nullptr || fd->
getLanguage()==SrcLangExt::Cpp) &&
3713 (i=name.
find(
'<'))!=-1 &&
3714 (j=name.
find(
'>'))!=-1 &&
3715 (j!=i+2 || name.
at(i+1)!=
'=')
3733 root->
relatesType==RelatesType::MemberOf ? Relationship::Foreign :
3734 Relationship::Related ;
3744 mmd->setTagInfo(root->
tagInfo());
3745 mmd->setMemberClass(cd);
3747 mmd->setDocsForDefinition(!root->
proto);
3751 mmd->setMemberSpecifiers(spec);
3752 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3753 mmd->setMemberGroupId(root->
mGrpId);
3755 mmd->setLanguage(root->
lang);
3756 mmd->setRequiresClause(root->
req);
3757 mmd->setId(root->
id);
3758 mmd->setBodyDef(fd);
3759 mmd->setFileDef(fd);
3760 mmd->addSectionsToDefinition(root->
anchors);
3765 if (scopeSeparator!=
"::")
3767 qualScope =
substitute(qualScope,
"::",scopeSeparator);
3769 if (lang==SrcLangExt::PHP)
3772 scopeSeparator=
"::";
3789 def=type+
" "+qualScope+scopeSeparator+name;
3793 def=qualScope+scopeSeparator+name;
3797 mmd->setDefinition(def);
3801 AUTO_TRACE(
"function member: type='{}' scope='{}' name='{}' args='{}' proto={} def='{}'",
3802 type, qualScope, rname, args, root->
proto, def);
3812 mmd->setRefItems(root->
sli);
3813 mmd->setRequirementReferences(root->
rqli);
3837 mmd->setTagInfo(root->
tagInfo());
3838 mmd->setLanguage(root->
lang);
3839 mmd->setId(root->
id);
3844 mmd->setDocsForDefinition(!root->
proto);
3850 mmd->addSectionsToDefinition(root->
anchors);
3851 mmd->setMemberSpecifiers(root->
spec);
3852 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3853 mmd->setMemberGroupId(root->
mGrpId);
3854 mmd->setRequiresClause(root->
req);
3889 def=root->
type+
" "+scope+name;
3895 AUTO_TRACE(
"new non-member function type='{}' scope='{}' name='{}' args='{}' proto={} def='{}'",
3897 mmd->setDefinition(def);
3901 mmd->setRefItems(root->
sli);
3902 mmd->setRequirementReferences(root->
rqli);
3906 mmd->setNamespace(nd);
3913 mmd->setFileDef(fd);
3934 if (root->
section.isFunction())
3936 AUTO_TRACE(
"member function: type='{}' scope='{}' name='{}' args='{}' relates='{}' relatesType='{}'"
3937 " file='{}' line={} bodyLine={} #tArgLists={} mGrpId={}"
3938 " spec={} proto={} docFile='{}'",
3943 bool isFriend=root->
type==
"friend" || root->
type.
find(
"friend ")!=-1;
3953 scope=rname.
left(index);
3954 rname=rname.
mid(index+2);
3963 if (root->
lang==SrcLangExt::CSharp)
3974 int memIndex=rname.
findRev(
"::");
3977 if (cd && scope+
"::"==rname.
left(scope.
length()+2))
3983 bool isMember=
FALSE;
3986 int ts=rname.
find(
'<');
3987 int te=rname.
find(
'>');
3988 if (memIndex>0 && (ts==-1 || te==-1))
4005 isMember=memIndex<ts || memIndex>te;
4045 for (
const auto &imd : *mn)
4058 fullScope.
prepend(parentScope);
4064 if (mnd) nsName = mnd->
name();
4065 if (rnd) rnsName = rnd->
name();
4073 bool sameTemplateArgs =
TRUE;
4074 bool matchingReturnTypes =
TRUE;
4075 bool sameRequiresClause =
TRUE;
4081 matchingReturnTypes =
FALSE;
4085 sameRequiresClause =
FALSE;
4091 sameTemplateArgs =
FALSE;
4094 bool staticsInDifferentFiles =
4097 if (sameTemplateArgs &&
4098 matchingReturnTypes &&
4099 sameRequiresClause &&
4100 !staticsInDifferentFiles &&
4107 if (!root->
groups.empty() && !root->
groups.front().groupname.isEmpty())
4114 found=(mnd && rnd && nsName==rnsName) ||
4115 ((mnd==
nullptr && rnd==
nullptr && mfd!=
nullptr &&
4120 if (!found && gd && gd==md->
getGroupDef() && nsName==rnsName)
4126 AUTO_TRACE_ADD(
"combining function with prototype found={} in namespace '{}'",found,nsName);
4228 "Illegal member name found."
4246 for (
const auto &ifmd : *fn)
4250 for (
const auto &immd : *mn)
4266 AUTO_TRACE_ADD(
"Merging related global and member '{}' isFriend={} isRelated={} isFunction={}",
4343 for (
const auto &imdec : *mn)
4351 for (
const auto &imdef : *mn)
4354 if (mdef && mdec!=mdef &&
4374 for (
const auto &imd : *mn)
4390 if (mdef && mdec)
break;
4398 mdec->getOuterScope(),mdec->getFileDef(),mdec->typeString(),
const_cast<ArgumentList*
>(&mdecAl),
4405 mdec->mergeReferences(mdef);
4407 mdec->mergeReferencedBy(mdef);
4424 for (
const auto &imd : *mn)
4435 for (
const auto &irmd : *rmn)
4469 size_t i=qualifiedName.rfind(
"::");
4470 if (i!=std::string::npos)
4472 QCString scope = qualifiedName.substr(0,i);
4473 QCString name = qualifiedName.substr(i+2);
4477 for (
const auto &imd : *mn)
4503 std::map<std::string,int> templateNames;
4505 for (
const Argument &arg : templateArguments)
4507 static const reg::Ex re(R
"(\a[\w:]*)");
4510 for (; it!=
end ; ++it)
4512 const auto &match = *it;
4513 std::string n = match.str();
4514 if (n==arg.name.str())
4516 if (templateNames.find(n)==templateNames.end())
4518 templateNames.emplace(n,count);
4523 return templateNames;
4538 if (context && cd!=context)
4543 if (result==
nullptr)
4548 if (result==
nullptr)
4577 for (
auto &mi : *mni)
4587 type = typedefValue;
4606 usedClassName = typeCd->
name();
4616 if (templateNames.empty())
4620 BaseInfo bi(usedName,Protection::Public,Specifier::Normal);
4625 if (arg.name==usedName)
4629 if (usedCd==
nullptr)
4680 if (!found && !type.
isEmpty())
4739 if (templateNames.empty())
4777 AUTO_TRACE(
"Derived from template '{}' with parameters '{}' isArtificial={}",
4778 templateClass->
name(),templSpec,isArtificial);
4781 bool existingClass = templSpec==tempArgsStr;
4782 if (existingClass)
return;
4784 bool freshInstance=
FALSE;
4801 for (
auto it=it_pair.first ; it!=it_pair.second ; ++it)
4803 const Entry *templateRoot = it->second;
4804 AUTO_TRACE_ADD(
"template root found '{}' templSpec='{}'",templateRoot->
name,templSpec);
4810 isArtificial,templArgs.get(),templateNames);
4829 int ti=ttype.
find(
'<');
4835 templateClassName,
true,
true);
4836 AUTO_TRACE_ADD(
"templateClassName={} baseClass={}",templateClassName,baseClass?baseClass->
name():
"<none>");
4855 int index=n.
find(
'<');
4867 int l =
static_cast<int>(name.
length());
4873 while (count>0 && i>=0)
4878 case '>':
if (!insideQuote) count++;
break;
4879 case '<':
if (!insideQuote) count--;
break;
4880 case '\'':
if (!insideQuote) insideQuote=c;
4881 else if (insideQuote==c && (i<0 || name[i]!=
'\\')) insideQuote=0;
4883 case '"':
if (!insideQuote) insideQuote=c;
4884 else if (insideQuote==c && (i<0 || name[i]!=
'\\')) insideQuote=0;
4904 AUTO_TRACE(
"name={} base={} isArtificial={} mode={}",cd->
name(),bi->
name,isArtificial,(
int)mode);
4907 bool explicitGlobalScope=
FALSE;
4911 explicitGlobalScope=
TRUE;
4915 bool lastParent=
FALSE;
4920 int scopeOffset=explicitGlobalScope ? 0 :
static_cast<int>(scopeName.
length());
4929 baseClassName.
prepend(scopeName.
left(scopeOffset)+
"::");
4931 if (root->
lang==SrcLangExt::CSharp)
4958 || explicitGlobalScope
4961 || (root->
lang==SrcLangExt::IDL &&
4962 (root->
section.isExportedInterface() ||
4963 root->
section.isIncludedService()))
4966 AUTO_TRACE_ADD(
"class relation '{}' inherited/used by '{}' found prot={} virt={} templSpec='{}'",
4967 baseClassName, root->
name, bi->
prot, bi->
virt, templSpec);
4970 int si=baseClassName.
findRev(
"::",i);
4972 if (baseClass==
nullptr &&
static_cast<size_t>(i)!=baseClassName.
length())
4982 baseClassName = baseClassName.
left(i)+baseClassName.
right(baseClassName.
length()-e);
4993 else if (baseClass && !templSpec.
isEmpty())
5004 baseClass = templClass;
5012 if (!found && si!=-1)
5022 found=baseClass!=
nullptr && baseClass!=cd;
5032 found = baseClass!=
nullptr && baseClass!=cd;
5044 found = baseClass!=
nullptr && baseClass!=cd;
5047 bool isATemplateArgument = templateNames.find(biName.
str())!=templateNames.end();
5052 AUTO_TRACE_ADD(
"Documented base class '{}' templSpec='{}'",biName,templSpec);
5070 if (baseClassTypeDef==
nullptr)
5080 if (baseClassTypeDef)
5089 AUTO_TRACE_ADD(
"insertBaseClass name={} prot={} virt={} templSpec={}",usedName,prot,bi->
virt,templSpec);
5097 "Detected potential recursive class relation "
5098 "between class {} and base class {}!",
5105 else if (mode==
Undocumented && (scopeOffset==0 || isATemplateArgument))
5107 AUTO_TRACE_ADD(
"New undocumented base class '{}' baseClassName='{}' templSpec='{}' isArtificial={}",
5108 biName,baseClassName,templSpec,isArtificial);
5110 if (isATemplateArgument)
5113 if (baseClass==
nullptr)
5132 if (baseClass==
nullptr)
5143 si = baseClassName.
findRev(
"::");
5159 biName=
"<"+biName.
left(biName.
length()-2)+
">";
5163 AUTO_TRACE_ADD(
"insertBaseClass name={} prot={} virt={} templSpec={}",biName,bi->
prot,bi->
virt,templSpec);
5173 if (scope!=baseClass)
5199 "Detected potential recursive class relation "
5200 "between class {} and base class {}!",
5201 root->
name,baseClassName
5212 else if ((scopeOffset=scopeName.
findRev(
"::",scopeOffset-1))==-1)
5217 }
while (scopeOffset>=0);
5219 if (parentNode==
nullptr)
5225 parentNode=parentNode->
parent();
5227 }
while (lastParent);
5247 bool hasExtends = !root->
extends.empty();
5248 if (hasExtends)
return TRUE;
5272 if ((root->
lang==SrcLangExt::CSharp || root->
lang==SrcLangExt::Java) &&
5273 (i=bName.
find(
'<'))!=-1)
5277 if (root->
lang==SrcLangExt::CSharp)
5283 bName = bName.
left(i);
5315 if (i!=-1 && j!=-1 && k==-1 && root->
lang!=SrcLangExt::CSharp && root->
lang!=SrcLangExt::Java)
5348 if (!nd->hasDocumentation())
5351 nd->getLanguage() == SrcLangExt::Fortran) &&
5355 warn_undoc(nd->getDefFileName(),nd->getDefLine(),
"{} {} is not documented.",
5356 nd->getLanguage() == SrcLangExt::Fortran ?
"Module" :
"Namespace",
5420 for (
const auto &tn_kv : templateNames)
5422 size_t templIndex = tn_kv.second;
5424 bool hasActArg=
FALSE;
5425 if (templIndex<templArgs->size())
5427 actArg=templArgs->at(templIndex);
5431 baseClassNames.find(actArg.
type.
str())!=baseClassNames.end() &&
5432 actualTemplateNames.find(actArg.
type.
str())==actualTemplateNames.end()
5435 actualTemplateNames.emplace(actArg.
type.
str(),
static_cast<int>(templIndex));
5470 for (
const auto &fd : *fn)
5472 fd->computeAnchors();
5485 gd->computeAnchors();
5492template<
typename Func>
5515 for (
const auto &fd : *fn)
5588 if (md==
nullptr)
return;
5589 AUTO_TRACE(
"scope='{}' name='{}' args='{}' funcDecl='{}' mSpec={}",
5604 fullName = cd->
name();
5606 fullName = nd->
name();
5608 if (!fullName.
isEmpty()) fullName+=
"::";
5609 fullName+=md->
name();
5714 "member {} belongs to two different groups. The second one found here will be ignored.",
5752 return allowNoGroup;
5755 for (
const auto &g : root->
groups)
5757 if (g.groupname == gd->
name())
5780 AUTO_TRACE(
"namespace='{}' type='{}' name='{}' tempArg='{}' decl='{}'",namespaceName,type,name,tempArg,decl);
5794 for (
const auto &md : *mn)
5805 if (md->isAlias() && md->getOuterScope() &&
5812 nd = md->getNamespaceDef();
5817 if (nd && md->isEnumValue() && (enumNamePos=namespaceName.
findRev(
"::"))!=-1)
5819 QCString enumName = namespaceName.
mid(enumNamePos+2);
5820 if (namespaceName.
left(enumNamePos)==nd->
name())
5825 for (
const auto &emd : *enumMn)
5827 found = emd->isStrong() && md->getEnumScope()==emd.get();
5841 else if (nd==
nullptr && md->isEnumValue())
5846 for (
const auto &emd : *enumMn)
5848 found = emd->isStrong() && md->getEnumScope()==emd.get();
5871 if ((namespaceName.
isEmpty() && nd==
nullptr) ||
5872 (nd && nd->
name()==namespaceName) ||
5876 AUTO_TRACE_ADD(
"Try to add member '{}' to scope '{}'",md->name(),namespaceName);
5884 md->isVariable() || md->isTypedef() ||
5885 matchArguments2(md->getOuterScope(),md->getFileDef(),md->typeString(),&mdAl,
5892 if (matching && !root->
tArgLists.empty())
5911 if (matching && md->isStatic() &&
5912 md->getDefFileName()!=root->
fileName &&
5920 if (!md->templateArguments().empty() && !root->
tArgLists.empty())
5924 if (md->templateArguments().size()!=root->
tArgLists.back().size() ||
5925 md->typeString()!=type ||
5926 md->requiresClause()!=root->
req)
5942 if (!found && root->
relatesType!=RelatesType::Duplicate && root->
section.isFunction())
5946 QCString warnMsg =
"no matching file member found for \n"+fullFuncDecl;
5949 warnMsg+=
"\nPossible candidates:";
5950 for (
const auto &md : *mn)
5954 warnMsg+=
"' " +
warn_line(md->getDefFileName(),md->getDefLine());
5962 if (root->
type!=
"friend class" &&
5963 root->
type!=
"friend struct" &&
5964 root->
type!=
"friend union" &&
5965 root->
type!=
"friend" &&
5971 "documented symbol '{}' was not declared or defined.",
qPrint(decl)
5983 auto srcIt = srcTempArgLists.begin();
5984 auto dstIt = dstTempArgLists.begin();
5985 while (srcIt!=srcTempArgLists.end() && dstIt!=dstTempArgLists.end())
5987 if ((*srcIt).size()!=(*dstIt).size())
return TRUE;
6001 result = cd->templateArguments().hasParameters() || cd->templateMaster()!=
nullptr ||
6011 const std::string &src
6015 static const reg::Ex re(R
"(\a\w*)");
6020 for (; it!=
end ; ++it)
6022 const auto &match = *it;
6023 size_t i = match.position();
6024 size_t l = match.length();
6026 dst+=src.substr(p,i-p);
6027 std::string name=match.str();
6029 auto srcIt = srcTempArgLists.begin();
6030 auto dstIt = dstTempArgLists.begin();
6031 while (srcIt!=srcTempArgLists.end() && !found)
6034 std::vector<Argument>::const_iterator tdaIt;
6035 if (dstIt!=dstTempArgLists.end())
6038 tdaIt = tdAli->
begin();
6043 for (
auto tsaIt = tsaLi.
begin(); tsaIt!=tsaLi.
end() && !found; ++tsaIt)
6047 if (tdAli && tdaIt!=tdAli->
end())
6063 else if (tdaType.
startsWith(
"typename ")) vc=9;
6066 tdaName = tdaType.
mid(vc);
6099 auto dstIt = dst.
begin();
6104 if (dstIt == dst.
end())
6108 da.
array = dstArray;
6116 da.
array = dstArray;
6124 srcTempArgLists,dstTempArgLists,
6150 funcType,funcName,funcArgs,exceptions,
6154 mmd->setTagInfo(root->
tagInfo());
6155 mmd->setLanguage(root->
lang);
6156 mmd->setId(root->
id);
6157 mmd->makeImplementationDetail();
6158 mmd->setMemberClass(cd);
6159 mmd->setDefinition(funcDecl);
6165 mmd->setDocsForDefinition(!root->
proto);
6167 mmd->addSectionsToDefinition(root->
anchors);
6171 mmd->setMemberSpecifiers(spec);
6172 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6173 mmd->setMemberGroupId(root->
mGrpId);
6176 mmd->setRefItems(root->
sli);
6177 mmd->setRequirementReferences(root->
rqli);
6213 bool memFound=
FALSE;
6214 for (
const auto &imd : *mn)
6217 if (md==
nullptr)
continue;
6219 if (cd==
nullptr)
continue;
6236 if (!namespaceName.
isEmpty()) fullScope.
prepend(namespaceName+
"::");
6237 if (fullScope==cd->
name())
6243 for (
const auto &emd : *enumMn)
6245 memFound = emd->isStrong() && md->
getEnumScope()==emd.get();
6251 if (memFound)
break;
6256 if (memFound)
break;
6274 if (!templAl.
empty())
6276 declTemplArgs.push_back(templAl);
6284 bool substDone=
false;
6291 if (declTemplArgs.size()>0 && declTemplArgs.size()==defTemplArgs.size())
6314 AUTO_TRACE_ADD(
"matching '{}'<=>'{}' className='{}' namespaceName='{}' result={}",
6343 AUTO_TRACE_ADD(
"Comparing return types '{}'<->'{}' #args {}<->{}",
6351 else if (defTemplArgs.size()>declTemplArgs.size())
6353 AUTO_TRACE_ADD(
"Different number of template arguments {} vs {}",defTemplArgs.size(),declTemplArgs.size());
6359 bool rootIsUserDoc = root->
section.isMemberDoc();
6362 bool classOrMdIsTemplate = mdIsTemplate || classIsTemplate;
6363 bool rootIsTemplate = !root->
tArgLists.empty();
6365 if (!rootIsUserDoc &&
6366 (mdIsTemplate || rootIsTemplate) &&
6367 ((classOrMdIsTemplate && !rootIsTemplate) || (!classOrMdIsTemplate && rootIsTemplate))
6372 AUTO_TRACE_ADD(
"Comparing return types: template v.s. non-template");
6376 AUTO_TRACE_ADD(
"Match results of matchArguments2='{}' substDone='{}'",matching,substDone);
6387 if (!funcTempList.
isEmpty() &&
6407 else if (cd && cd!=tcd)
6413 if (memFound)
break;
6417 addLocalObjCMethod(root,scopeName,funcType,funcName,funcArgs,exceptions,funcDecl,spec);
6420 if (count==0 && !(isFriend && funcType==
"class"))
6423 const ClassDef *ecd =
nullptr, *ucd =
nullptr;
6424 MemberDef *emd =
nullptr, *umd =
nullptr;
6426 for (
const auto &md : *mn)
6448 AUTO_TRACE_ADD(
"new candidate className='{}' scope='{}' args='{}': exact match",
6449 className,ccd->
name(),md->argsString());
6455 AUTO_TRACE_ADD(
"new candidate className='{}' scope='{}' args='{}': no match",
6456 className,ccd->
name(),md->argsString());
6461 bool strictProtoMatching =
Config_getBool(STRICT_PROTO_MATCHING);
6462 if (!strictProtoMatching)
6464 if (candidates==1 && ucd && umd)
6471 else if (candidates>1 && ecd && emd)
6482 if (noMatchCount>1) warnMsg+=
"uniquely ";
6483 warnMsg+=
"matching class member found for \n";
6487 warnMsg+=
" template ";
6496 warnMsg+=fullFuncDecl;
6498 if (candidates>0 || noMatchCount>=1)
6500 warnMsg+=
"\nPossible candidates:";
6506 for (
const auto &md : *mn)
6508 const ClassDef *cd=md->getClassDef();
6522 warnMsg+=
"template ";
6527 if (!md->typeString().isEmpty())
6529 warnMsg+=md->typeString();
6534 warnMsg+=qScope+
"::"+md->name();
6535 warnMsg+=md->argsString();
6536 warnMsg+=
"' " +
warn_line(md->getDefFileName(),md->getDefLine());
6557 AUTO_TRACE(
"funcType={} funcName={} funcArgs={} funcDecl={} spec={}",funcType,funcName,funcArgs,funcDecl,spec);
6559 for (
const auto &md : *mn)
6561 if (md->getClassDef()==cd)
6573 funcType,funcName,funcArgs,exceptions,
6579 mmd->setTagInfo(root->
tagInfo());
6580 mmd->setLanguage(root->
lang);
6581 mmd->setId(root->
id);
6582 mmd->setMemberClass(cd);
6583 mmd->setTemplateSpecialization(
TRUE);
6585 mmd->setDefinition(funcDecl);
6591 mmd->setDocsForDefinition(!root->
proto);
6593 mmd->addSectionsToDefinition(root->
anchors);
6597 mmd->setMemberSpecifiers(spec);
6598 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6599 mmd->setMemberGroupId(root->
mGrpId);
6601 mmd->setRefItems(root->
sli);
6602 mmd->setRequirementReferences(root->
rqli);
6616 bool sameClass=
false;
6621 [](
const auto &md1,
const auto &md2)
6622 { return md1->getClassDef()->name()==md2->getClassDef()->name(); });
6628 if (cd==
nullptr)
return;
6636 std::unique_ptr<ArgumentList> tArgList =
6641 funcType,funcName,funcArgs,exceptions,
6645 mmd->setTagInfo(root->
tagInfo());
6646 mmd->setLanguage(root->
lang);
6647 mmd->setId(root->
id);
6649 mmd->setMemberClass(cd);
6650 mmd->setDefinition(funcDecl);
6659 mmd->setDocsForDefinition(!root->
proto);
6661 mmd->addSectionsToDefinition(root->
anchors);
6665 mmd->setMemberSpecifiers(spec);
6666 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6667 mmd->setMemberGroupId(root->
mGrpId);
6670 mmd->setRefItems(root->
sli);
6671 mmd->setRequirementReferences(root->
rqli);
6729 AUTO_TRACE(
"root='{}' funcDecl='{}' related='{}' overload={} isFunc={} mGrpId={} #tArgList={} spec={} lang={}",
6742 bool isRelated=
false;
6743 bool isMemberOf=
false;
6744 bool isFriend=
false;
6757 spec.setInline(
true);
6762 spec.setExplicit(
true);
6767 spec.setMutable(
true);
6772 spec.setThreadLocal(
true);
6783 while ((sep=funcDecl.
find(
';'))!=-1)
6789 if (!funcDecl.
isEmpty() && funcDecl[0]!=
' ') funcDecl.
prepend(
" ");
6801 if (isFriend && funcDecl.
startsWith(
"class "))
6805 funcName = funcDecl;
6807 else if (isFriend && funcDecl.
startsWith(
"struct "))
6810 funcName = funcDecl;
6816 funcArgs,funcTempList,exceptions
6824 AUTO_TRACE_ADD(
"scopeName='{}' className='{}' namespaceName='{}' funcType='{}' funcName='{}' funcArgs='{}'",
6825 scopeName,className,namespaceName,funcType,funcName,funcArgs);
6829 isMemberOf=(root->
relatesType == RelatesType::MemberOf);
6836 scopeName = relates;
6849 scopeName = joinedName;
6863 QCString joinedName = fnd->name()+
"::"+scopeName;
6866 scopeName=joinedName;
6893 AUTO_TRACE_ADD(
"scopeName='{}' className='{}' namespaceName='{}'",scopeName,className,namespaceName);
6902 scopeName=namespaceName;
6904 else if (!relates.
isEmpty() ||
6907 scopeName=namespaceName+
"::"+className;
6911 scopeName=className;
6914 else if (!className.
isEmpty())
6916 scopeName=className;
6926 uint32_t argListIndex=0;
6931 tempScopeName=scopeName+funcSpec;
6945 funcDecl=funcType+
" "+tempScopeName+
"::"+funcName+funcTempList;
6949 funcDecl=funcType+
" "+tempScopeName+
"::"+funcName+funcArgs;
6956 funcDecl=tempScopeName+
"::"+funcName+funcTempList;
6960 funcDecl=tempScopeName+
"::"+funcName+funcArgs;
6970 funcDecl=funcType+
" "+funcName+funcTempList;
6974 funcDecl=funcType+
" "+funcName+funcArgs;
6981 funcDecl=funcName+funcTempList;
6985 funcDecl=funcName+funcArgs;
6990 if (funcType==
"template class" && !funcTempList.
isEmpty())
6993 AUTO_TRACE_ADD(
"Parse results: namespaceName='{}' className=`{}` funcType='{}' funcSpec='{}' "
6994 " funcName='{}' funcArgs='{}' funcTempList='{}' funcDecl='{}' relates='{}'"
6995 " exceptions='{}' isRelated={} isMemberOf={} isFriend={} isFunc={}",
6996 namespaceName, className, funcType, funcSpec,
6997 funcName, funcArgs, funcTempList, funcDecl, relates,
6998 exceptions, isRelated, isMemberOf, isFriend, isFunc);
7004 bool strongEnum =
false;
7008 for (
const auto &imd : *mn)
7021 namespaceName+=
"::"+className;
7025 namespaceName=className;
7033 funcName =
substitute(funcName,className+
"::",
"");
7044 if (!isRelated && !strongEnum && mn)
7052 funcArgs,funcTempList,exceptions,
7053 type,args,isFriend,spec,relates,funcDecl,overloaded,isFunc);
7065 else if (overloaded)
7067 addOverloaded(root,mn,funcType,funcName,funcArgs,funcDecl,exceptions,spec);
7071 if (!
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec))
7076 "Cannot determine class for function\n{}",
7082 else if (isRelated && !relates.
isEmpty())
7084 AUTO_TRACE_ADD(
"related function scopeName='{}' className='{}'",scopeName,className);
7085 if (className.
isEmpty()) className=relates;
7089 bool newMember=
TRUE;
7095 for (
const auto &imd : *mn)
7129 mn->
push_back(std::move(mdDefineTaken));
7143 for (
const auto &irmd : *mn)
7164 addMemberDocs(root,rmd_found,funcDecl,
nullptr,overloaded,spec);
7172 switch (root->
mtype)
7193 funcType,funcName,funcArgs,exceptions,
7196 isMemberOf ? Relationship::Foreign : Relationship::Related,
7216 mmd->setDefinitionTemplateParameterLists(root->
tArgLists);
7218 mmd->setTagInfo(root->
tagInfo());
7232 for (
const auto &irmd : *rmn)
7263 mmd->setBodyDef(fd);
7270 mmd->setMemberClass(cd);
7271 mmd->setMemberSpecifiers(spec);
7272 mmd->setVhdlSpecifiers(root->
vhdlSpec);
7273 mmd->setDefinition(funcDecl);
7278 mmd->setDocsForDefinition(!root->
proto);
7281 mmd->addSectionsToDefinition(root->
anchors);
7282 mmd->setMemberGroupId(root->
mGrpId);
7283 mmd->setLanguage(root->
lang);
7284 mmd->setId(root->
id);
7288 mmd->setRefItems(root->
sli);
7289 mmd->setRequirementReferences(root->
rqli);
7290 if (root->
relatesType==RelatesType::Duplicate) mmd->setRelatedAlso(cd);
7298 if (!
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec))
7303 "Cannot determine file/namespace for relatedalso function\n{}",
7317 addLocalObjCMethod(root,scopeName,funcType,funcName,funcArgs,exceptions,funcDecl,spec);
7321 bool globMem =
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec);
7322 if (className.
isEmpty() && !globMem)
7326 else if (!className.
isEmpty() && !globMem)
7329 "member '{}' of class '{}' cannot be found",
7330 funcName,className);
7348 AUTO_TRACE(
"root->type='{}' root->inside='{}' root->name='{}' root->args='{}' section={} root->spec={} root->mGrpId={}",
7363 type=type.
left(i+l);
7374 if (root->
section.isMemberDoc())
7400 else if (root->
section.isOverloadDoc())
7414 (root->
section.isVariable() &&
7426 if (type==
"friend class" || type==
"friend struct" ||
7427 type==
"friend union")
7433 type+
" "+root->
name,
7466 else if (root->
section.isVariableDoc())
7478 else if (root->
section.isExportedInterface() ||
7479 root->
section.isIncludedService())
7485 type +
" " + root->
name,
7498 if (root->
section.isMemberDoc() ||
7499 root->
section.isOverloadDoc() ||
7502 root->
section.isVariableDoc() ||
7504 root->
section.isIncludedService() ||
7505 root->
section.isExportedInterface()
7515 for (
const auto &e : root->
children())
7517 if (!e->section.isEnum())
7529 for (
const auto &objCImpl : root->
children())
7531 if (objCImpl->section.isObjcImpl())
7533 for (
const auto &objCMethod : objCImpl->children())
7535 if (objCMethod->section.isFunction())
7539 objCMethod->relates,
7542 objCMethod->type+
" "+objCImpl->name+
"::"+objCMethod->name+
" "+objCMethod->args,
7544 objCMethod->section=EntryType::makeEmpty();
7563 bool isGlobal =
false;
7564 bool isRelated =
false;
7565 bool isMemberOf =
false;
7575 if (root->
lang==SrcLangExt::CSharp)
7598 isMemberOf=(root->
relatesType==RelatesType::MemberOf);
7633 isMemberOf ? Relationship::Foreign : isRelated ? Relationship::Related : Relationship::Member,
7637 mmd->setTagInfo(root->
tagInfo());
7638 mmd->setLanguage(root->
lang);
7639 mmd->setId(root->
id);
7640 if (!isGlobal) mmd->setMemberClass(cd);
else mmd->setFileDef(fd);
7642 mmd->setBodyDef(root->
fileDef());
7643 mmd->setMemberSpecifiers(root->
spec);
7644 mmd->setVhdlSpecifiers(root->
vhdlSpec);
7645 mmd->setEnumBaseType(root->
args);
7648 mmd->addSectionsToDefinition(root->
anchors);
7649 mmd->setMemberGroupId(root->
mGrpId);
7653 mmd->setRefItems(root->
sli);
7654 mmd->setRequirementReferences(root->
rqli);
7668 mmd->setDefinition(name+baseType);
7672 mmd->setDefinition(nd->
name()+
"::"+name+baseType);
7676 mmd->setNamespace(nd);
7683 if (isGlobal && (nd==
nullptr || !nd->
isAnonymous()))
7685 if (!defSet) mmd->setDefinition(name+baseType);
7686 if (fd==
nullptr && root->
parent())
7692 mmd->setFileDef(fd);
7700 mmd->setDefinition(name+baseType);
7704 mmd->setDefinition(cd->
name()+
"::"+name+baseType);
7710 mmd->setDocsForDefinition(!root->
proto);
7740 bool isGlobal =
false;
7741 bool isRelated =
false;
7751 if (root->
lang==SrcLangExt::CSharp)
7766 if (root->
lang==SrcLangExt::CSharp)
7812 struct EnumValueInfo
7814 EnumValueInfo(
const QCString &n,std::unique_ptr<MemberDef> &&md) :
7815 name(n), member(std::move(md)) {}
7817 std::unique_ptr<MemberDef> member;
7819 std::vector< EnumValueInfo > extraMembers;
7821 for (
const auto &imd : *mn)
7828 for (
const auto &e : root->
children())
7831 bool isJavaLike = sle==SrcLangExt::CSharp || sle==SrcLangExt::Java || sle==SrcLangExt::XML;
7832 if ( isJavaLike || root->
spec.isStrong())
7834 if (sle == SrcLangExt::Cpp && e->section.isDefine())
continue;
7841 i = qualifiedName.
findRev(
"::");
7842 if (i!=-1 && sle==SrcLangExt::CSharp)
7848 qualifiedName=
substitute(qualifiedName,
"::",
".");
7853 if (fileName.
isEmpty() && e->tagInfo())
7855 fileName = e->tagInfo()->tagName;
7859 fileName,e->startLine,e->startColumn,
7860 e->type,e->name,e->args,
QCString(),
7861 e->protection, Specifier::Normal,e->isStatic,Relationship::Member,
7868 fmmd->setNamespace(mnd);
7872 fmmd->setTagInfo(e->tagInfo());
7873 fmmd->setLanguage(e->lang);
7874 fmmd->setBodySegment(e->startLine,e->bodyLine,e->endBodyLine);
7875 fmmd->setBodyDef(e->fileDef());
7877 fmmd->setDocumentation(e->doc,e->docFile,e->docLine);
7878 fmmd->setBriefDescription(e->brief,e->briefFile,e->briefLine);
7879 fmmd->addSectionsToDefinition(e->anchors);
7880 fmmd->setInitializer(e->initializer.str());
7881 fmmd->setMaxInitLines(e->initLines);
7882 fmmd->setMemberGroupId(e->mGrpId);
7883 fmmd->setExplicitExternal(e->explicitExternal,fileName,e->startLine,e->startColumn);
7884 fmmd->setRefItems(e->sli);
7885 fmmd->setRequirementReferences(e->rqli);
7888 fmmd->setEnumScope(md,
TRUE);
7889 extraMembers.emplace_back(e->name,std::move(fmd));
7898 if (!e->name.isEmpty() && (fmn=emnsd->
find(e->name)))
7901 for (
const auto &ifmd : *fmn)
7932 else if (isRelated && cd)
7964 for (
auto &e : extraMembers)
8010 if (gd==
nullptr && !root->
groups.empty())
8024 for (
const auto &g : root->
groups)
8043 "Found non-existing group '{}' for the command '{}', ignoring command",
8057 if (root->
section.isEnumDoc() &&
8083 AUTO_TRACE(
"Found docs for enum with name '{}' and scope '{}' in context '{}' cd='{}', nd='{}' fd='{}'",
8097 for (
const auto &imd : *mn)
8112 else if (cd==
nullptr && mcd==
nullptr && nd!=
nullptr && mnd==nd)
8119 else if (cd==
nullptr && nd==
nullptr && mcd==
nullptr && mnd==
nullptr && fd==mfd)
8144 for (
const auto &mn : mnsd)
8147 for (
const auto &imd : *mn)
8152 int documentedEnumValues=0;
8156 if (fmd->isLinkableInProject()) documentedEnumValues++;
8182 for (
const auto &md : *mn)
8184 index.addClassMemberNameToIndex(md.get());
8185 if (md->getModuleDef())
8187 index.addModuleMemberNameToIndex(md.get());
8195 for (
const auto &md : *mn)
8197 if (md->getNamespaceDef())
8199 index.addNamespaceMemberNameToIndex(md.get());
8203 index.addFileMemberNameToIndex(md.get());
8205 if (md->getModuleDef())
8207 index.addModuleMemberNameToIndex(md.get());
8212 index.sortMemberIndexLists();
8221 if (cd->isLinkableInProject())
8234 if (cd->isLinkableInProject())
8247 if (nd->isLinkableInProject())
8260 for (
const auto &fd : *fn)
8276 std::string s = title.str();
8277 static const reg::Ex re(R
"(\a[\w-]*)");
8280 for (; it!=
end ; ++it)
8282 const auto &match = *it;
8283 std::string matchStr = match.str();
8291 if (gd->isLinkableInProject())
8293 addWordsForTitle(gd.get(),gd->anchor(),gd->groupTitle());
8299 if (pd->isLinkableInProject())
8301 addWordsForTitle(pd.get(),pd->anchor(),pd->title());
8321 if (md->getClassDef())
8325 if (md->getNamespaceDef())
8336 if (md->getGroupDef()) scope = md->getGroupDef();
8337 else if (md->getClassDef()) scope = md->getClassDef();
8338 else if (md->getNamespaceDef()) scope = md->getNamespaceDef();
8339 else if (md->getFileDef()) scope = md->getFileDef();
8345 if (md->isLinkableInProject())
8347 if (!(md->isEnumerate() && md->isAnonymous()))
8352 if (md->isEnumerate())
8354 for (
const auto &fmd : md->enumFieldList())
8367 for (
const auto &md : *mn)
8369 addMemberToIndices(md.get());
8376 for (
const auto &md : *mn)
8378 addMemberToIndices(md.get());
8391 for (
const auto &imd : *mn)
8404 for (
const auto &imd : *mn)
8421 for (
const auto &imd : *mn)
8430 const auto &bmni = bmn.
find(mn->memberName());
8433 for (
const auto &ibmd : *bmni)
8441 lang==SrcLangExt::Python ||
8442 lang==SrcLangExt::Java ||
8443 lang==SrcLangExt::PHP ||
8454 lang==SrcLangExt::Python ||
8461 if (lang==SrcLangExt::Python && md->
name().
startsWith(
"__"))
continue;
8501 if (cd->isLinkable())
8503 for (
const auto &bcd : cd->baseClasses())
8519 for (
const auto &ti : cd->getTemplateInstances())
8538 int i=cd->name().find(
'(');
8545 AUTO_TRACE_ADD(
"merging members of category {} into {}",cd->name(),baseClass->
name());
8560 cd->subClasses().empty() &&
8561 !cd->baseClasses().empty())
8592 msg(
"Generating code for file {}...\n",fd->
docName());
8597 else if (parseSources)
8599 msg(
"Parsing code for file {}...\n",fd->
docName());
8615 for (
const auto &fd : *fn)
8623 for (
const auto &fd : *fn)
8632 clangParser->parse();
8633 processSourceFile(fd.get(),*
g_outputList,clangParser.get());
8635 for (
auto incFile : clangParser->filesInSameTU())
8637 if (filesToProcess.find(incFile)!=filesToProcess.end() &&
8639 processedFiles.
find(incFile)==processedFiles.end())
8646 processSourceFile(ifd,*
g_outputList,clangParser.get());
8647 processedFiles.insert(incFile);
8658 for (
const auto &fd : *fn)
8660 if (processedFiles.find(fd->
absFilePath().
str())==processedFiles.end())
8665 clangParser->parse();
8666 processSourceFile(fd.get(),*
g_outputList,clangParser.get());
8679 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8682 msg(
"Generating code files using {} threads.\n",numThreads);
8683 struct SourceContext
8686 : fd(fd_), generateSourceFile(gen_), ol(ol_) {}
8688 bool generateSourceFile;
8692 std::vector< std::future< std::shared_ptr<SourceContext> > > results;
8695 for (
const auto &fd : *fn)
8698 auto ctx = std::make_shared<SourceContext>(fd.get(),generateSourceFile,*
g_outputList);
8699 auto processFile = [ctx]()
8701 if (ctx->generateSourceFile)
8703 msg(
"Generating code for file {}...\n",ctx->fd->docName());
8707 msg(
"Parsing code for file {}...\n",ctx->fd->docName());
8710 ctx->fd->getAllIncludeFilesRecursively(filesInSameTu);
8711 if (ctx->generateSourceFile)
8713 ctx->fd->writeSourceHeader(ctx->ol);
8714 ctx->fd->writeSourceBody(ctx->ol,
nullptr);
8715 ctx->fd->writeSourceFooter(ctx->ol);
8720 ctx->fd->parseSource(
nullptr);
8724 results.emplace_back(threadPool.
queue(processFile));
8727 for (
auto &f : results)
8736 for (
const auto &fd : *fn)
8756 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8762 : fd(fd_), ol(ol_) {}
8767 std::vector< std::future< std::shared_ptr<DocContext> > > results;
8770 for (
const auto &fd : *fn)
8772 bool doc = fd->isLinkableInProject();
8775 auto ctx = std::make_shared<DocContext>(fd.get(),*
g_outputList);
8776 auto processFile = [ctx]() {
8777 msg(
"Generating docs for file {}...\n",ctx->fd->docName());
8778 ctx->fd->writeDocumentation(ctx->ol);
8781 results.emplace_back(threadPool.
queue(processFile));
8785 for (
auto &f : results)
8794 for (
const auto &fd : *fn)
8796 bool doc = fd->isLinkableInProject();
8799 msg(
"Generating docs for file {}...\n",fd->docName());
8818 const_cast<FileDef*
>(fd)->addSourceRef(cd->getStartDefLine(),cd.get(),
nullptr);
8827 const_cast<FileDef*
>(fd)->addSourceRef(cd->getStartDefLine(),cd.get(),
nullptr);
8836 const_cast<FileDef*
>(fd)->addSourceRef(nd->getStartDefLine(),nd.get(),
nullptr);
8843 for (
const auto &md : *mn)
8852 md->isLinkableInProject() &&
8858 const_cast<FileDef*
>(fd)->addSourceRef(md->getStartDefLine(),md->getOuterScope(),md.get());
8864 for (
const auto &md : *mn)
8874 md->isLinkableInProject() &&
8880 const_cast<FileDef*
>(fd)->addSourceRef(md->getStartDefLine(),md->getOuterScope(),md.get());
8897 for (
const auto &def : it->second)
8900 def.fileName,def.lineNr,def.columnNr,
8901 "#define",def.name,def.args,
QCString(),
8906 if (!def.args.isEmpty())
8910 mmd->setInitializer(def.definition);
8911 mmd->setFileDef(def.fileDef);
8912 mmd->setDefinition(
"#define "+def.name);
8917 const MemberList *defMl = def.fileDef->getMemberList(MemberListType::DocDefineMembers());
8926 def.fileDef->insertMember(md.get());
8928 AUTO_TRACE_ADD(
"adding macro {} with definition {}",def.name,def.definition);
8962 for (
const auto &fd : *fn)
8964 fd->sortMemberLists();
8971 gd->sortMemberLists();
8988 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8992 std::vector < std::future< void > > results;
8996 for (
const auto &def : symList)
8999 if (dm && !
isSymbolHidden(def) && !def->isArtificial() && def->isLinkableInProject())
9001 auto processTooltip = [dm]() {
9004 results.emplace_back(threadPool.
queue(processTooltip));
9009 for (
auto &f : results)
9018 for (
const auto &def : symList)
9021 if (dm && !
isSymbolHidden(def) && !def->isArtificial() && def->isLinkableInProject())
9068 for (
const auto &fd : *fn)
9090 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
9096 : cd(cd_), ol(ol_) {}
9101 std::vector< std::future< std::shared_ptr<DocContext> > > results;
9102 for (
const auto &cd : classList)
9105 if (cd->getOuterScope()==
nullptr ||
9109 auto ctx = std::make_shared<DocContext>(cd,*
g_outputList);
9110 auto processFile = [ctx]()
9112 msg(
"Generating docs for compound {}...\n",ctx->cd->displayName());
9116 if (!ctx->cd->isHidden() && !ctx->cd->isEmbeddedInOuterScope() &&
9117 ctx->cd->isLinkableInProject() && !ctx->cd->isImplicitTemplateInstance())
9119 ctx->cd->writeDocumentation(ctx->ol);
9120 ctx->cd->writeMemberList(ctx->ol);
9124 ctx->cd->writeDocumentationForInnerClasses(ctx->ol);
9127 results.emplace_back(threadPool.
queue(processFile));
9130 for (
auto &f : results)
9137 for (
const auto &cd : classList)
9141 if (cd->getOuterScope()==
nullptr ||
9147 if ( !cd->isHidden() && !cd->isEmbeddedInOuterScope() &&
9148 cd->isLinkableInProject() && !cd->isImplicitTemplateInstance())
9150 msg(
"Generating docs for compound {}...\n",cd->displayName());
9165 for (
const auto &innerCdi : cd->
getClasses())
9170 AUTO_TRACE(
"innerCd={} isLinkable={} isImplicitTemplateInstance={} protectLevelVisible={} embeddedInOuterScope={}",
9179 list.push_back(innerCd);
9187 std::vector<ClassDefMutable*> classList;
9236 for (
const auto &imd : *mn)
9272 for (
const auto &fd : *fn)
9274 fd->combineUsingRelations();
9306 for (
const auto &fd : *fn)
9308 fd->addMembersToMemberGroup();
9323 gd->addMembersToMemberGroup();
9344 for (
const auto &fd : *fn)
9346 fd->distributeMemberGroupDocumentation();
9361 gd->distributeMemberGroupDocumentation();
9391 for (
const auto &fd : *fn)
9393 fd->findSectionsInDocumentation();
9408 gd->findSectionsInDocumentation();
9413 pd->findSectionsInDocumentation();
9418 dd->findSectionsInDocumentation();
9439 elementsToRemove.push_back(ci.first);
9442 for (
const auto &k : elementsToRemove)
9453 for (
const auto &ifmd : *fn)
9467 for (
const auto &imd : *nm)
9499 elementsToRemove.push_back(ci.first);
9502 for (
const auto &k : elementsToRemove)
9511 for (
const auto &ifmd : *fn)
9524 for (
const auto &imd : *nm)
9544 return fd->absFilePath() == root->
fileName;
9592 mmd->setTagInfo(root->
tagInfo());
9593 mmd->setLanguage(root->
lang);
9605 for (
const auto &md : *mn)
9611 for (
const auto &imd : *mn)
9629 for (
const auto &imd : *mn)
9656 warn(root->
fileName,root->
startLine,
"found documented #define {} but ignoring it because ENABLE_PREPROCESSING is NO.", root->
name);
9670 normalizedName =
substitute(normalizedName,
"\\",
"/");
9673 if (root->
docFile==normalizedName)
9675 int lastSlashPos=normalizedName.
findRev(
'/');
9676 if (lastSlashPos!=-1)
9678 normalizedName=normalizedName.
left(lastSlashPos);
9681 if (normalizedName.
at(normalizedName.
length()-1)!=
'/')
9683 normalizedName+=
'/';
9685 DirDef *matchingDir=
nullptr;
9689 if (dir->name().right(normalizedName.
length())==normalizedName)
9694 "\\dir command matches multiple directories.\n"
9695 " Applying the command for directory {}\n"
9696 " Ignoring the command for directory {}",
9697 matchingDir->
name(),dir->name()
9702 matchingDir=dir.get();
9719 warn(root->
fileName,root->
startLine,
"No matching directory found for command \\dir {}",normalizedName);
9728 if (root->
section.isRequirementDoc())
9740 if (root->
section.isPageDoc())
9747 else if (root->
section.isMainpageDoc())
9767 if (root->
section.isMainpageDoc())
9800 else if (si->
lineNr() != -1)
9802 warn(root->
fileName,root->
startLine,
"multiple use of section label '{}' for main page, (first occurrence: {}, line {})",
9807 warn(root->
fileName,root->
startLine,
"multiple use of section label '{}' for main page, (first occurrence: {})",
9824 else if (root->
tagInfo()==
nullptr)
9827 "found more than one \\mainpage comment block! (first occurrence: {}, line {}), Skipping current block!",
9837 if (root->
section.isMainpageDoc())
9861 term(
"page defined {} with label {} is a direct "
9862 "subpage of itself! Please remove this cyclic dependency.\n",
9886 term(
"page defined {} with label {} is a subpage "
9887 "of itself! Please remove this cyclic dependency.\n",
9888 warn_line(pd->docFile(),pd->docLine()),pd->name());
9914 if (si->label().left(label.
length())==label)
9916 si->setFileName(rl->listName());
9917 si->setGenerated(
TRUE);
9923 if (!si->generated())
9927 if (!si->fileName().isEmpty() &&
9934 if (si->definition())
9941 gd = (
toMemberDef(si->definition()))->getGroupDef();
9971 if (!pd->getGroupDef() && !pd->isReference())
9973 msg(
"Generating docs for page {}...\n",pd->name());
9988 warn(root->
fileName,root->
startLine,
"Example {} was already documented. Ignoring documentation found here.",root->
name);
10016 indentStr.
fill(
' ',indent);
10018 indentStr.
isEmpty()?
"":indentStr,
10023 for (
const auto &e : root->
children())
10041 si->label(),si->fileName(),si->title(),si->type().level(),si->ref());
10055 msg(
"Generating docs for example {}...\n",pd->name());
10057 if (lang != SrcLangExt::Unknown)
10061 intf->resetCodeParserState();
10063 QCString n=pd->getOutputFileBase();
10070 if (pd->showLineNo())
10072 lineNoOptStr=
"{lineno}";
10078 (pd->briefDescription().isEmpty()?
"":pd->briefDescription()+
"\n\n")+
10079 pd->documentation()+
"\n\n\\include"+lineNoOptStr+
" "+pd->name(),
10081 .setIndexWords(
true)
10082 .setExample(pd->name()));
10095 if (!gd->isReference())
10107 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10113 : cdm(cdm_), ol(ol_) {}
10118 std::vector< std::future< std::shared_ptr<DocContext> > > results;
10120 for (
const auto &cd : classList)
10125 auto ctx = std::make_shared<DocContext>(cdm,*
g_outputList);
10126 auto processFile = [ctx]()
10128 if ( ( ctx->cdm->isLinkableInProject() &&
10129 !ctx->cdm->isImplicitTemplateInstance()
10132 && !ctx->cdm->isHidden() && !ctx->cdm->isEmbeddedInOuterScope()
10135 msg(
"Generating docs for compound {}...\n",ctx->cdm->displayName());
10136 ctx->cdm->writeDocumentation(ctx->ol);
10137 ctx->cdm->writeMemberList(ctx->ol);
10139 ctx->cdm->writeDocumentationForInnerClasses(ctx->ol);
10142 results.emplace_back(threadPool.
queue(processFile));
10146 for (
auto &f : results)
10148 auto ctx = f.get();
10154 for (
const auto &cd : classList)
10159 if ( ( cd->isLinkableInProject() &&
10160 !cd->isImplicitTemplateInstance()
10163 && !cd->isHidden() && !cd->isEmbeddedInOuterScope()
10166 msg(
"Generating docs for compound {}...\n",cd->displayName());
10180 for (
const auto &cd : conceptList)
10185 msg(
"Generating docs for concept {}...\n",cd->name());
10200 if (nd->isLinkableInProject())
10205 msg(
"Generating docs for namespace {}\n",nd->displayName());
10243 QCString cmd=qhgLocation+
" -v 2>&1";
10248 err(
"could not execute {}\n",qhgLocation);
10252 const size_t bufSize = 1024;
10253 char inBuf[bufSize+1];
10254 size_t numRead=fread(inBuf,1,bufSize,f);
10255 inBuf[numRead] =
'\0';
10260 static const reg::Ex versionReg(R
"(Qt (\d+)\.(\d+)\.(\d+))");
10262 std::string s = inBuf;
10269 if (qtVersion>0 && (qtVersion<60000 || qtVersion >= 60205))
10278 err(
"could not execute {}\n",qhgLocation);
10282 std::string output;
10283 while ((numRead=fread(inBuf,1,bufSize,f))>0)
10285 inBuf[numRead] =
'\0';
10317 warn_uncond(
"the dot tool could not be found as '{}'\n",dotPath);
10323 size_t l=dotPath.
length();
10324 for (
size_t i=0;i<l;i++)
if (dotPath.
at(i)==
'/') dotPath.
at(i)=
'\\';
10343 bool updateOnly=
FALSE)
10347 bool writeToStdout=configFile==
"-";
10352 if (!writeToStdout)
10356 msg(
"\n\nConfiguration file '{}' created.\n\n",configFile);
10357 msg(
"Now edit the configuration file and enter\n\n");
10358 if (configFile!=
"Doxyfile" && configFile!=
"doxyfile")
10359 msg(
" doxygen {}\n\n",configFile);
10361 msg(
" doxygen\n\n");
10362 msg(
"to generate the documentation for your project\n\n");
10366 msg(
"\n\nConfiguration file '{}' updated.\n\n",configFile);
10372 term(
"Cannot open file {} for writing\n",configFile);
10387 term(
"Cannot open stdout for writing\n");
10398 int eqPos = tagLine.
find(
'=');
10408 fileName = tagLine;
10414 err(
"Tag file '{}' does not exist or is not a file. Skipping it...\n",fileName);
10425 msg(
"Reading tag file '{}', location '{}'...\n",fileName,destName);
10429 msg(
"Reading tag file '{}'...\n",fileName);
10439 for (
const auto &sheet : latexExtraStyleSheet)
10441 std::string fileName = sheet;
10442 if (!fileName.empty())
10447 err(
"Style sheet '{}' specified by LATEX_EXTRA_STYLESHEET does not exist!\n",fileName);
10449 else if (fi.
isDir())
10451 err(
"Style sheet '{}' specified by LATEX_EXTRA_STYLESHEET is a directory, it has to be a file!\n", fileName);
10470 if (!htmlStyleSheet.
isEmpty())
10477 err(
"Style sheet '{}' specified by HTML_STYLESHEET does not exist!\n",htmlStyleSheet);
10480 else if (fi.
isDir())
10482 err(
"Style sheet '{}' specified by HTML_STYLESHEET is a directory, it has to be a file!\n",htmlStyleSheet);
10488 copyFile(htmlStyleSheet,destFileName);
10493 for (
const auto &sheet : htmlExtraStyleSheet)
10501 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET does not exist!\n",fileName);
10505 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET is already a built-in stylesheet. Please use a different name\n",fi.
fileName());
10507 else if (fi.
isDir())
10509 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET is a directory, it has to be a file!\n",fileName);
10528 err(
"Project logo '{}' specified by PROJECT_LOGO does not exist!\n",projectLogo);
10531 else if (fi.
isDir())
10533 err(
"Project logo '{}' specified by PROJECT_LOGO is a directory, it has to be a file!\n",projectLogo);
10539 copyFile(projectLogo,destFileName);
10553 err(
"Project icon '{}' specified by PROJECT_ICON does not exist!\n",projectIcon);
10556 else if (fi.
isDir())
10558 err(
"Project icon '{}' specified by PROJECT_ICON is a directory, it has to be a file!\n",projectIcon);
10564 copyFile(projectIcon,destFileName);
10572 for (
const auto &fileName : files)
10574 if (!fileName.empty())
10579 err(
"Extra file '{}' specified in {} does not exist!\n", fileName,filesOption);
10581 else if (fi.
isDir())
10583 err(
"Extra file '{}' specified in {} is a directory, it has to be a file!\n", fileName,filesOption);
10609 std::vector<FileEntry> fileEntries;
10610 for (
const auto &fd : *fn)
10612 if (!fd->isReference())
10614 fileEntries.emplace_back(fd->getPath(),fd.get());
10618 size_t size = fileEntries.size();
10622 FileDef *fd = fileEntries[0].fileDef;
10628 std::stable_sort(fileEntries.begin(),
10630 [](
const FileEntry &fe1,
const FileEntry &fe2)
10631 { return qstricmp_sort(fe1.path,fe2.path)<0; }
10636 const FileEntry &first = fileEntries[0];
10637 const FileEntry &last = fileEntries[size-1];
10638 int first_path_size =
static_cast<int>(first.path.size())-1;
10639 int last_path_size =
static_cast<int>(last.path.size())-1;
10642 for (i=0;i<first_path_size && i<last_path_size;i++)
10644 if (first.path[i]==
'/') j=i;
10645 if (first.path[i]!=last.path[i])
break;
10647 if (i==first_path_size && i<last_path_size && last.path[i]==
'/')
10652 else if (i==last_path_size && i<first_path_size && first.path[i]==
'/')
10659 for (
auto &fileEntry : fileEntries)
10661 QCString prefix = fileEntry.path.right(fileEntry.path.length()-j-1);
10662 fileEntry.fileDef->setName(
prefix+fn->fileName());
10664 fileEntry.fileDef->setDiskName(
prefix+fn->fileName());
10678 int sep = fileName.
findRev(
'/');
10679 int ei = fileName.
findRev(
'.');
10680 if (ei!=-1 && (sep==-1 || ei>sep))
10686 extension =
".no_extension";
10699 int ei = fileName.
findRev(
'.');
10706 extension =
".no_extension";
10710 std::string preBuf;
10717 for (
const auto &s : includePath)
10723 msg(
"Preprocessing {}...\n",fn);
10730 msg(
"Reading {}...\n",fn);
10735 std::string convBuf;
10736 convBuf.reserve(preBuf.size()+1024);
10741 std::shared_ptr<Entry> fileRoot = std::make_shared<Entry>();
10745 if (newTU) clangParser->
parse();
10748 parser.
parseInput(fileName,convBuf.
data(),fileRoot,clangParser);
10749 fileRoot->setFileDef(fd);
10766 filesToProcess.insert(s);
10769 std::mutex processedFilesLock;
10771 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10772 msg(
"Processing input using {} threads.\n",numThreads);
10774 using FutureType = std::vector< std::shared_ptr<Entry> >;
10775 std::vector< std::future< FutureType > > results;
10778 bool ambig =
false;
10785 auto processFile = [qs,&filesToProcess,&processedFilesLock,&processedFiles]() {
10786 bool ambig_l =
false;
10787 std::vector< std::shared_ptr<Entry> > roots;
10791 auto fileRoot {
parseFile(*parser.get(),fd_l,qs,clangParser.get(),
true) };
10792 roots.push_back(fileRoot);
10796 for (
auto incFile : clangParser->filesInSameTU())
10799 if (filesToProcess.find(incFile)!=filesToProcess.end())
10801 bool needsToBeProcessed =
false;
10803 std::lock_guard<std::mutex> lock(processedFilesLock);
10804 needsToBeProcessed = processedFiles.find(incFile)==processedFiles.end();
10805 if (needsToBeProcessed) processedFiles.insert(incFile);
10807 if (qincFile!=qs && needsToBeProcessed)
10813 fileRoot =
parseFile(*parser.get(),ifd,qincFile,clangParser.get(),
false);
10814 roots.push_back(fileRoot);
10822 results.emplace_back(threadPool.
queue(processFile));
10826 for (
auto &f : results)
10831 root->moveToSubEntryAndKeep(e);
10838 if (processedFiles.find(s)==processedFiles.end())
10841 auto processFile = [s]() {
10842 bool ambig =
false;
10844 std::vector< std::shared_ptr<Entry> > roots;
10851 auto fileRoot =
parseFile(*parser.get(),fd,qs,clangParser.get(),
true);
10852 roots.push_back(fileRoot);
10856 auto fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
10857 roots.push_back(fileRoot);
10861 results.emplace_back(threadPool.
queue(processFile));
10865 for (
auto &f : results)
10870 root->moveToSubEntryAndKeep(e);
10877 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10878 msg(
"Processing input using {} threads.\n",numThreads);
10880 using FutureType = std::shared_ptr<Entry>;
10881 std::vector< std::future< FutureType > > results;
10885 auto processFile = [s]() {
10886 bool ambig =
false;
10890 auto fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
10894 results.emplace_back(threadPool.
queue(processFile));
10897 for (
auto &f : results)
10899 root->moveToSubEntryAndKeep(f.get());
10917 filesToProcess.insert(s);
10923 bool ambig =
false;
10931 auto fileRoot =
parseFile(*parser.get(),fd,qs,clangParser.get(),
true);
10932 root->moveToSubEntryAndKeep(fileRoot);
10933 processedFiles.insert(s);
10937 for (
auto incFile : clangParser->filesInSameTU())
10940 if (filesToProcess.find(incFile)!=filesToProcess.end() &&
10941 processedFiles.find(incFile)==processedFiles.end())
10947 fileRoot =
parseFile(*parser.get(),ifd,incFile,clangParser.get(),
false);
10948 root->moveToSubEntryAndKeep(fileRoot);
10949 processedFiles.insert(incFile);
10958 if (processedFiles.find(s)==processedFiles.end())
10960 bool ambig =
false;
10967 auto fileRoot =
parseFile(*parser.get(),fd,qs,clangParser.get(),
true);
10968 root->moveToSubEntryAndKeep(fileRoot);
10973 std::shared_ptr<Entry> fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
10974 root->moveToSubEntryAndKeep(fileRoot);
10976 processedFiles.insert(s);
10985 bool ambig =
false;
10990 std::shared_ptr<Entry> fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
10991 root->moveToSubEntryAndKeep(std::move(fileRoot));
11011 sepPos = result.
find(
'/',2);
11013 sepPos = result.
find(
'/',sepPos+1);
11015 sepPos = result.
find(
'/',sepPos+1);
11018 if (nonSymlinks.find(
prefix.str())==nonSymlinks.end())
11035 target+=result.
mid(sepPos);
11038 if (known.find(result.
str())!=known.end())
return std::string();
11039 known.insert(result.
str());
11052 nonSymlinks.insert(
prefix.str());
11058 while (sepPos!=-1);
11077 bool errorIfNotExist,
11084 if (paths && !dirName.empty())
11086 paths->insert(dirName);
11092 if (dirName.empty())
11107 msg(
"Searching for files in directory {}\n", fi->
absFilePath());
11112 for (
const auto &dirEntry : dir.
iterator())
11115 auto checkPatterns = [&]() ->
bool
11117 return (patList==
nullptr ||
patternMatch(cfi,*patList)) &&
11118 (exclPatList==
nullptr || !
patternMatch(cfi,*exclPatList)) &&
11119 (killSet==
nullptr || killSet->find(cfi.
absFilePath())==killSet->end());
11122 if (exclSet==
nullptr || exclSet->find(cfi.
absFilePath())==exclSet->end())
11130 if (errorIfNotExist && checkPatterns())
11135 else if (cfi.
isFile() && checkPatterns())
11138 std::string path=cfi.
dirPath()+
"/";
11139 std::string fullName=path+name;
11146 fn = fnMap->
add(name,fullName);
11147 fn->push_back(std::move(fd));
11150 dirResultList.push_back(fullName);
11151 if (resultSet) resultSet->insert(fullName);
11152 if (killSet) killSet->insert(fullName);
11154 else if (recursive &&
11156 (exclPatList==
nullptr || !
patternMatch(cfi,*exclPatList)) &&
11161 patList,exclPatList,&dirResultList,resultSet,errorIfNotExist,
11162 recursive,killSet,paths);
11166 if (resultList && !dirResultList.empty())
11169 std::stable_sort(dirResultList.begin(),
11170 dirResultList.end(),
11171 [](
const auto &f1,
const auto &f2) { return qstricmp_sort(f1.c_str(),f2.c_str())<0; });
11174 resultList->insert(resultList->end(), dirResultList.begin(), dirResultList.end());
11191 bool errorIfNotExist,
11205 if (exclSet==
nullptr || exclSet->find(fi.
absFilePath())==exclSet->end())
11212 if (errorIfNotExist)
11214 warn_uncond(
"source '{}' is not a readable file or directory... skipping.\n",s);
11219 std::string dirPath = fi.
dirPath(
true);
11221 if (paths && !dirPath.empty())
11223 paths->insert(dirPath);
11226 if (killSet==
nullptr || killSet->find(filePath)==killSet->end())
11235 fn->push_back(std::move(fd));
11238 if (resultList || resultSet)
11240 if (resultList) resultList->push_back(filePath);
11241 if (resultSet) resultSet->insert(filePath);
11247 else if (fi.
isDir())
11249 readDir(&fi,fnMap,exclSet,patList,
11250 exclPatList,resultList,resultSet,errorIfNotExist,
11251 recursive,killSet,paths);
11265 anchor=
":"+md->
anchor();
11274 t <<
"REPLACE INTO symbols (symbol_id,scope_id,name,file,line) VALUES('"
11275 << fn+anchor <<
"','"
11277 << d->
name() <<
"','"
11291 for (
const auto &def : symList)
11303 msg(
"Developer parameters:\n");
11304 msg(
" -m dump symbol map\n");
11305 msg(
" -b making messages output unbuffered\n");
11306 msg(
" -c <file> process input file as a comment block and produce HTML output\n");
11308 msg(
" -t [<file|stdout|stderr>] trace debug info to file, stdout, or stderr (default file stdout)\n");
11309 msg(
" -t_time [<file|stdout|stderr>] trace debug info to file, stdout, or stderr (default file stdout),\n"
11310 " and include time and thread information\n");
11312 msg(
" -d <level> enable a debug level, such as (multiple invocations of -d are possible):\n");
11323 QCString versionString = getFullVersion();
11324 msg(
"{}\n",versionString);
11328 if (!extVers.
isEmpty()) extVers+=
", ";
11329 extVers +=
"sqlite3 ";
11330 extVers += sqlite3_libversion();
11332 if (!extVers.
isEmpty()) extVers+=
", ";
11333 extVers +=
"clang support ";
11334 extVers += CLANG_VERSION_STRING;
11338 int lastComma = extVers.
findRev(
',');
11339 if (lastComma != -1) extVers = extVers.
replace(lastComma,1,
" and");
11340 msg(
" with {}.\n",extVers);
11351 msg(
"Doxygen version {0}\nCopyright Dimitri van Heesch 1997-2025\n\n"
11352 "You can use Doxygen in a number of ways:\n\n"
11353 "1) Use Doxygen to generate a template configuration file*:\n"
11354 " {1} [-s] -g [configName]\n\n"
11355 "2) Use Doxygen to update an old configuration file*:\n"
11356 " {1} [-s] -u [configName]\n\n"
11357 "3) Use Doxygen to generate documentation using an existing "
11358 "configuration file*:\n"
11359 " {1} [configName]\n\n"
11360 "4) Use Doxygen to generate a template file controlling the layout of the\n"
11361 " generated documentation:\n"
11362 " {1} -l [layoutFileName]\n\n"
11363 " In case layoutFileName is omitted DoxygenLayout.xml will be used as filename.\n"
11364 " If - is used for layoutFileName Doxygen will write to standard output.\n\n"
11365 "5) Use Doxygen to generate a template style sheet file for RTF, HTML or Latex.\n"
11366 " RTF: {1} -w rtf styleSheetFile\n"
11367 " HTML: {1}-w html headerFile footerFile styleSheetFile [configFile]\n"
11368 " LaTeX: {1} -w latex headerFile footerFile styleSheetFile [configFile]\n\n"
11369 "6) Use Doxygen to generate a rtf extensions file\n"
11370 " {1} -e rtf extensionsFile\n\n"
11371 " If - is used for extensionsFile Doxygen will write to standard output.\n\n"
11372 "7) Use Doxygen to compare the used configuration file with the template configuration file\n"
11373 " {1} -x [configFile]\n\n"
11374 " Use Doxygen to compare the used configuration file with the template configuration file\n"
11375 " without replacing the environment variables or CMake type replacement variables\n"
11376 " {1} -x_noenv [configFile]\n\n"
11377 "8) Use Doxygen to show a list of built-in emojis.\n"
11378 " {1} -f emoji outputFileName\n\n"
11379 " If - is used for outputFileName Doxygen will write to standard output.\n\n"
11380 "*) If -s is specified the comments of the configuration items in the config file will be omitted.\n"
11381 " If configName is omitted 'Doxyfile' will be used as a default.\n"
11382 " If - is used for configFile Doxygen will write / read the configuration to /from standard output / input.\n\n"
11383 "If -q is used for a Doxygen documentation run, Doxygen will see this as if QUIET=YES has been set.\n\n"
11384 "-v print version string, -V print extended version information\n"
11385 "-h,-? prints usage help information\n"
11386 "{1} -d prints additional usage flags for debugging purposes\n",versionString,name);
11393static const char *
getArg(
int argc,
char **argv,
int &optInd)
11396 if (
qstrlen(&argv[optInd][2])>0)
11397 s=&argv[optInd][2];
11398 else if (optInd+1<argc && argv[optInd+1][0]!=
'-')
11417 return []() {
return std::make_unique<T>(); };
11425 std::setlocale(LC_ALL,
"");
11426 std::setlocale(LC_CTYPE,
"C");
11427 std::setlocale(LC_NUMERIC,
"C");
11534 return std::max(0,std::min(r-16,9));
11539 QCString versionString = getFullVersion();
11542 auto writeFile = [](
const char *fileName,std::function<void(
TextStream&)> func) ->
bool
11562 bool genConfig=
false;
11563 bool shortList=
false;
11564 bool traceTiming=
false;
11566 bool updateConfig=
false;
11567 bool quiet =
false;
11568 while (optInd<argc && argv[optInd][0]==
'-' &&
11569 (isalpha(argv[optInd][1]) || argv[optInd][1]==
'?' ||
11570 argv[optInd][1]==
'-')
11573 switch(argv[optInd][1])
11583 if (optInd+1>=argc)
11585 layoutName=
"DoxygenLayout.xml";
11589 layoutName=argv[optInd+1];
11597 if (optInd+1>=argc)
11599 msg(
"option \"-c\" is missing the file name to read\n");
11624 msg(
"option \"-d\" has unknown debug specifier: \"{}\".\n",debugLabel);
11634 if (!strcmp(argv[optInd]+1,
"t_time"))
11636 traceTiming =
true;
11638 else if (!strcmp(argv[optInd]+1,
"t"))
11640 traceTiming =
false;
11644 err(
"option should be \"-t\" or \"-t_time\", found: \"{}\".\n",argv[optInd]);
11648 if (optInd+1>=argc || argv[optInd+1][0] ==
'-')
11650 traceName=
"stdout";
11654 traceName=argv[optInd+1];
11658 err(
"support for option \"-t\" has not been compiled in (use a debug build or a release build with tracing enabled).\n");
11669 err(
"option should be \"-x\" or \"-x_noenv\", found: \"{}\".\n",argv[optInd]);
11685 err(
"option \"-e\" is missing format specifier rtf.\n");
11691 if (optInd+1>=argc)
11693 err(
"option \"-e rtf\" is missing an extensions file name\n");
11701 err(
"option \"-e\" has invalid format specifier.\n");
11711 err(
"option \"-f\" is missing list specifier.\n");
11717 if (optInd+1>=argc)
11719 err(
"option \"-f emoji\" is missing an output file name\n");
11727 err(
"option \"-f\" has invalid list specifier.\n");
11737 err(
"option \"-w\" is missing format specifier rtf, html or latex\n");
11743 if (optInd+1>=argc)
11745 err(
"option \"-w rtf\" is missing a style sheet file name\n");
11751 err(
"error opening RTF style sheet file {}!\n",argv[optInd+1]);
11761 if (optInd+4<argc ||
FileInfo(
"Doxyfile").exists() ||
FileInfo(
"doxyfile").exists())
11767 err(
"error opening or reading configuration file {}!\n",argv[optInd+4]);
11772 if (optInd+3>=argc)
11774 err(
"option \"-w html\" does not have enough arguments\n");
11791 if (optInd+4<argc ||
FileInfo(
"Doxyfile").exists() ||
FileInfo(
"doxyfile").exists())
11796 err(
"error opening or reading configuration file {}!\n",argv[optInd+4]);
11801 if (optInd+3>=argc)
11803 err(
"option \"-w latex\" does not have enough arguments\n");
11819 err(
"Illegal format specifier \"{}\": should be one of rtf, html or latex\n",formatName);
11839 if (
qstrcmp(&argv[optInd][2],
"help")==0)
11841 usage(argv[0],versionString);
11844 else if (
qstrcmp(&argv[optInd][2],
"version")==0)
11850 else if ((
qstrcmp(&argv[optInd][2],
"Version")==0) ||
11851 (
qstrcmp(&argv[optInd][2],
"VERSION")==0))
11859 err(
"Unknown option \"-{}\"\n",&argv[optInd][1]);
11860 usage(argv[0],versionString);
11865 setvbuf(stdout,
nullptr,_IONBF,0);
11872 usage(argv[0],versionString);
11876 err(
"Unknown option \"-{:c}\"\n",argv[optInd][1]);
11877 usage(argv[0],versionString);
11888 TRACE(
"Doxygen version used: {}",getFullVersion());
11891 FileInfo configFileInfo1(
"Doxyfile"),configFileInfo2(
"doxyfile");
11894 if (configFileInfo1.exists())
11896 configName=
"Doxyfile";
11898 else if (configFileInfo2.
exists())
11900 configName=
"doxyfile";
11902 else if (genConfig)
11904 configName=
"Doxyfile";
11908 err(
"Doxyfile not found and no input file specified!\n");
11909 usage(argv[0],versionString);
11916 if (fi.
exists() ||
qstrcmp(argv[optInd],
"-")==0 || genConfig)
11918 configName=argv[optInd];
11922 err(
"configuration file {} not found!\n",argv[optInd]);
11923 usage(argv[0],versionString);
11937 err(
"could not open or read configuration file {}!\n",configName);
12008 for (
const auto &mapping : extMaps)
12011 int i=mapStr.
find(
'=');
12027 err(
"Failed to map file extension '{}' to unsupported language '{}'.\n"
12028 "Check the EXTENSION_MAPPING setting in the config file.\n",
12033 msg(
"Adding custom extension mapping: '{}' will be treated as language '{}'\n",
12042 if (cd==
reinterpret_cast<void *
>(-1))
12044 term(
"unsupported character conversion: '{}'->'UTF-8': {}\n"
12045 "Check the 'INPUT_ENCODING' setting in the config file!\n",
12055 for (
const auto &mapping : fileEncod)
12058 int i=mapStr.
find(
'=');
12072 if (cd==
reinterpret_cast<void *
>(-1))
12074 term(
"unsupported character conversion: '{}'->'UTF-8': {}\n"
12075 "Check the 'INPUT_FILE_ENCODING' setting in the config file!\n",
12076 encoding,strerror(errno));
12089 for (
const auto &s : expandAsDefinedList)
12107 signal(SIGINT,SIG_DFL);
12109 msg(
"Cleaning up...\n");
12124 if (generateTagFile.
isEmpty())
return;
12129 err(
"cannot open tag file {} for writing\n", generateTagFile);
12133 tagFile <<
"<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>\n";
12134 tagFile <<
"<tagfile doxygen_version=\"" << getDoxygenVersion() <<
"\"";
12135 std::string gitVersion = getGitVersion();
12136 if (!gitVersion.empty())
12138 tagFile <<
" doxygen_gitid=\"" << gitVersion <<
"\"";
12145 for (
const auto &fd : *fn)
12147 if (fd->isLinkableInProject()) fd->writeTagFile(tagFile);
12180 if (gd->isLinkableInProject()) gd->writeTagFile(tagFile);
12185 if (mod->isLinkableInProject()) mod->writeTagFile(tagFile);
12190 if (pd->isLinkableInProject()) pd->writeTagFile(tagFile);
12197 if (dd->isLinkableInProject()) dd->writeTagFile(tagFile);
12201 tagFile <<
"</tagfile>\n";
12209 msg(
"Exiting...\n");
12219 const char *defaultDirName)
12224 result = baseDirName + defaultDirName;
12226 else if (formatDirName[0]!=
'/' && (formatDirName.
length()==1 || formatDirName[1]!=
':'))
12228 result.
prepend(baseDirName+
"/");
12230 Dir formatDir(result.
str());
12233 term(
"Could not create output directory {}\n", result);
12247 g_s.begin(
"Searching for include files...\n");
12250 for (
const auto &s : includePathList)
12268 g_s.begin(
"Searching for example files...\n");
12271 for (
const auto &s : examplePathList)
12286 g_s.begin(
"Searching for images...\n");
12289 for (
const auto &s : imagePathList)
12304 g_s.begin(
"Searching for dot files...\n");
12307 for (
const auto &s : dotFileList)
12322 g_s.begin(
"Searching for msc files...\n");
12325 for (
const auto &s : mscFileList)
12340 g_s.begin(
"Searching for dia files...\n");
12343 for (
const auto &s : diaFileList)
12358 g_s.begin(
"Searching for plantuml files...\n");
12361 for (
const auto &s : plantUmlFileList)
12376 g_s.begin(
"Searching for files to exclude\n");
12378 for (
const auto &s : excludeList)
12396 g_s.begin(
"Searching INPUT for files to process...\n");
12400 for (
const auto &s : inputList)
12403 size_t l = path.
length();
12407 if (path.
at(l-1)==
'\\' || path.
at(l-1)==
'/') path=path.
left(l-1);
12427 [](
const auto &f1,
const auto &f2)
12433 if (fileName->size()>1)
12435 std::stable_sort(fileName->begin(),fileName->end(),[](
const auto &f1,
const auto &f2)
12437 return qstricmp_sort(f1->absFilePath(),f2->absFilePath())<0;
12443 warn_uncond(
"No files to be processed, please check your settings, in particular INPUT, FILE_PATTERNS, and RECURSIVE\n");
12454 if (mdfileAsMainPage.
isEmpty())
return;
12458 warn_uncond(
"Specified markdown mainpage '{}' does not exist\n",mdfileAsMainPage);
12461 bool ambig =
false;
12464 warn_uncond(
"Specified markdown mainpage '{}' has not been defined as input file\n",mdfileAsMainPage);
12483 QCString versionString = getFullVersion();
12484 msg(
"Doxygen version used: {}\n",versionString);
12494 if (outputDirectory.
isEmpty())
12500 Dir dir(outputDirectory.
str());
12504 if (!dir.
mkdir(outputDirectory.
str()))
12506 term(
"tag OUTPUT_DIRECTORY: Output directory '{}' does not "
12507 "exist and cannot be created\n",outputDirectory);
12511 msg(
"Notice: Output directory '{}' does not exist. "
12512 "I have created it for you.\n", outputDirectory);
12527 if (cacheSize<0) cacheSize=0;
12528 if (cacheSize>9) cacheSize=9;
12529 uint32_t lookupSize = 65536 << cacheSize;
12568 bool generateSitemap = !sitemapUrl.
isEmpty();
12569 if (generateSitemap && !sitemapUrl.
endsWith(
"/"))
12576 bool generateEclipseHelp =
Config_getBool(GENERATE_ECLIPSEHELP);
12590 if (generateDocbook)
12637 newFontPath+=curFontPath;
12653 bool defaultLayoutUsed =
FALSE;
12654 if (layoutFileName.
isEmpty())
12657 defaultLayoutUsed =
TRUE;
12659 AUTO_TRACE_ADD(
"defaultLayoutUsed={}, layoutFileName={}",defaultLayoutUsed,layoutFileName);
12664 msg(
"Parsing layout file {}...\n",layoutFileName);
12667 else if (!defaultLayoutUsed)
12669 warn_uncond(
"failed to open layout file '{}' for reading! Using default settings.\n",layoutFileName);
12679 if (generateHtml) exclPatterns.push_back(htmlOutput.
str());
12680 if (generateDocbook) exclPatterns.push_back(docbookOutput.
str());
12681 if (generateXml) exclPatterns.push_back(xmlOutput.
str());
12682 if (generateLatex) exclPatterns.push_back(latexOutput.
str());
12683 if (generateRtf) exclPatterns.push_back(rtfOutput.
str());
12684 if (generateMan) exclPatterns.push_back(manOutput.
str());
12704 if (generateDocbook)
12715 std::shared_ptr<Entry> root = std::make_shared<Entry>();
12719 msg(
"Reading and parsing tag files\n");
12721 for (
const auto &s : tagFileList)
12733 g_s.begin(
"Parsing files\n");
12773 g_s.begin(
"Building macro definition list...\n");
12777 g_s.begin(
"Building group list...\n");
12782 g_s.begin(
"Building directory list...\n");
12787 g_s.begin(
"Building namespace list...\n");
12792 g_s.begin(
"Building file list...\n");
12796 g_s.begin(
"Building class list...\n");
12800 g_s.begin(
"Building concept list...\n");
12808 g_s.begin(
"Computing nesting relations for classes...\n");
12821 g_s.begin(
"Associating documentation with classes...\n");
12825 g_s.begin(
"Associating documentation with concepts...\n");
12830 g_s.begin(
"Associating documentation with modules...\n");
12834 g_s.begin(
"Building example list...\n");
12838 g_s.begin(
"Searching for enumerations...\n");
12846 g_s.begin(
"Searching for documented typedefs...\n");
12852 g_s.begin(
"Searching for documented sequences...\n");
12856 g_s.begin(
"Searching for documented dictionaries...\n");
12861 g_s.begin(
"Searching for members imported via using declarations...\n");
12868 g_s.begin(
"Searching for included using directives...\n");
12872 g_s.begin(
"Searching for documented variables...\n");
12876 g_s.begin(
"Building interface member list...\n");
12879 g_s.begin(
"Building member list...\n");
12883 g_s.begin(
"Searching for friends...\n");
12887 g_s.begin(
"Searching for documented defines...\n");
12891 g_s.begin(
"Computing class inheritance relations...\n");
12896 g_s.begin(
"Computing class usage relations...\n");
12902 g_s.begin(
"Searching for tag less structs...\n");
12907 g_s.begin(
"Flushing cached template relations that have become invalid...\n");
12911 g_s.begin(
"Warn for undocumented namespaces...\n");
12915 g_s.begin(
"Computing class relations...\n");
12926 g_s.begin(
"Add enum values to enums...\n");
12931 g_s.begin(
"Searching for member function documentation...\n");
12943 g_s.begin(
"Creating members for template instances...\n");
12947 g_s.begin(
"Building page list...\n");
12951 g_s.begin(
"Building requirements list...\n");
12955 g_s.begin(
"Search for main page...\n");
12960 g_s.begin(
"Computing page relations...\n");
12965 g_s.begin(
"Determining the scope of groups...\n");
12969 g_s.begin(
"Computing module relations...\n");
12971 mm.resolvePartitions();
12972 mm.resolveImports();
12973 mm.collectExportedSymbols();
12992 return i==0 ?
qstricmp_sort(c1->name(), c2->name())<0 : i<0;
13006 g_s.begin(
"Sorting lists...\n");
13027 g_s.begin(
"Determining which enums are documented\n");
13031 g_s.begin(
"Computing member relations...\n");
13036 g_s.begin(
"Building full member lists recursively...\n");
13040 g_s.begin(
"Adding members to member groups.\n");
13046 g_s.begin(
"Distributing member group documentation.\n");
13051 g_s.begin(
"Computing member references...\n");
13057 g_s.begin(
"Inheriting documentation...\n");
13065 g_s.begin(
"Generating disk names...\n");
13069 g_s.begin(
"Adding source references...\n");
13073 g_s.begin(
"Adding xrefitems...\n");
13078 g_s.begin(
"Adding requirements...\n");
13083 g_s.begin(
"Sorting member lists...\n");
13087 g_s.begin(
"Setting anonymous enum type...\n");
13091 g_s.begin(
"Computing dependencies between directories...\n");
13095 g_s.begin(
"Generating citations page...\n");
13099 g_s.begin(
"Counting members...\n");
13103 g_s.begin(
"Counting data structures...\n");
13107 g_s.begin(
"Resolving user defined references...\n");
13111 g_s.begin(
"Finding anchors and sections in the documentation...\n");
13115 g_s.begin(
"Transferring function references...\n");
13119 g_s.begin(
"Combining using relations...\n");
13124 g_s.begin(
"Adding members to index pages...\n");
13129 g_s.begin(
"Correcting members for VHDL...\n");
13133 g_s.begin(
"Computing tooltip texts...\n");
13141 [](
const auto &g1,
const auto &g2)
13142 {
return g1->groupTitle() < g2->groupTitle(); });
13146 gd->sortSubGroups();
13190 if (generateDocbook)
13210 err(
"USE_HTAGS is YES but htags(1) failed. \n");
13212 err(
"htags(1) ended normally but failed to load the filemap. \n");
13219 g_s.begin(
"Generating style sheet...\n");
13227 g_s.begin(
"Generating search indices...\n");
13228 if (searchEngine && !serverBasedSearch && generateHtml)
13236 if (generateHtml && searchEngine)
13239 Dir searchDir(searchDirName.
str());
13240 if (!searchDir.
exists() && !searchDir.
mkdir(searchDirName.
str()))
13242 term(
"Could not create search results directory '{}' $PWD='{}'\n",
13246 if (!serverBasedSearch)
13268 if (generateDocbook)
13284 g_s.begin(
"Generating images for formulas in HTML...\n");
13291 g_s.begin(
"Generating images for formulas in RTF...\n");
13298 g_s.begin(
"Generating images for formulas in Docbook...\n");
13303 g_s.begin(
"Generating example documentation...\n");
13307 g_s.begin(
"Generating file sources...\n");
13311 g_s.begin(
"Generating file documentation...\n");
13315 g_s.begin(
"Generating page documentation...\n");
13319 g_s.begin(
"Generating group documentation...\n");
13323 g_s.begin(
"Generating class documentation...\n");
13327 g_s.begin(
"Generating concept documentation...\n");
13331 g_s.begin(
"Generating module documentation...\n");
13335 g_s.begin(
"Generating namespace documentation...\n");
13341 g_s.begin(
"Generating graph info page...\n");
13346 g_s.begin(
"Generating directory documentation...\n");
13355 g_s.begin(
"finalizing index lists...\n");
13359 g_s.begin(
"writing tag file...\n");
13365 g_s.begin(
"Generating XML output...\n");
13373 g_s.begin(
"Generating SQLITE3 output...\n");
13380 g_s.begin(
"Generating AutoGen DEF output...\n");
13386 g_s.begin(
"Generating Perl module output...\n");
13390 if (generateHtml && searchEngine && serverBasedSearch)
13392 g_s.begin(
"Generating search index\n");
13402 if (searchDataFile.
isEmpty())
13404 searchDataFile=
"searchdata.xml";
13417 g_s.begin(
"Combining RTF output...\n");
13420 err(
"An error occurred during post-processing the RTF files!\n");
13425 g_s.begin(
"Running plantuml with JAVA...\n");
13431 g_s.begin(
"Running dot...\n");
13436 if (generateHtml &&
13440 g_s.begin(
"Running html help compiler...\n");
13445 if ( generateHtml &&
13449 g_s.begin(
"Running qhelpgenerator...\n");
13457 msg(
"type lookup cache used {}/{} hits={} misses={}\n",
13462 msg(
"symbol lookup cache used {}/{} hits={} misses={}\n",
13469 int cacheParam = std::max(typeCacheParam,symbolCacheParam);
13472 msg(
"Note: based on cache misses the ideal setting for LOOKUP_CACHE_SIZE is {} at the cost of higher memory usage.\n",cacheParam);
13478 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
13479 if (numThreads<1) numThreads=1;
13480 msg(
"Total elapsed time: {:.6f} seconds\n(of which an average of {:.6f} seconds per thread waiting for external tools to finish)\n",
13487 msg(
"finished...\n");
13492 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 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.