22#include <unordered_map>
118#pragma GCC diagnostic push
119#pragma GCC diagnostic ignored "-Wshadow"
121#include <clang/Basic/Version.h>
123#pragma GCC diagnostic pop
130#if !defined(_WIN32) || defined(__CYGWIN__)
199{
"template class",
"template struct",
"class",
"struct",
"union",
"interface",
"exception" };
235 stats.emplace_back(name,0);
236 startTime = std::chrono::steady_clock::now();
240 std::chrono::steady_clock::time_point endTime = std::chrono::steady_clock::now();
241 stats.back().elapsed =
static_cast<double>(std::chrono::duration_cast<
242 std::chrono::microseconds>(endTime -
startTime).count())/1000000.0;
253 msg(
"----------------------\n");
254 for (
const auto &s :
stats)
256 msg(
"Spent {:.6f} seconds in {}",s.elapsed,s.name);
319 scope+=
"::"+pd->
name();
359 ((!includeExternal && root->
tagInfo()==
nullptr) ||
360 ( includeExternal && root->
tagInfo()!=
nullptr))
363 AUTO_TRACE(
"additional={} includeExternal={}",additional,includeExternal);
379 "group {}: ignoring title \"{}\" that does not match old title \"{}\"",
398 std::unique_ptr<GroupDef>(
405 std::unique_ptr<GroupDef>(
454 scope+=
"::"+gd->
name();
506 bool save_ambig = ambig;
517 fn = fn.
left(newIndex)+
"/"+root->
name;
520 if (!fd) ambig = save_ambig;
550 "Found non-existing group '{}' for the command '{}', ignoring command",
559 text.
sprintf(
"the name '%s' supplied as "
560 "the argument in the \\file statement ",
564 text+=
"matches the following input files:\n";
567 text+=
"Please use a more specific name by "
568 "including a (larger) part of the path!";
572 text+=
"is not an input file";
580template<
class DefMutable>
594 if (!includeFile.
isEmpty() && includeFile.
at(0)==
'"')
597 includeFile=includeFile.
mid(1,includeFile.
length()-2);
599 else if (!includeFile.
isEmpty() && includeFile.
at(0)==
'<')
602 includeFile=includeFile.
mid(1,includeFile.
length()-2);
614 text.
sprintf(
"the name '%s' supplied as "
615 "the argument of the \\class, \\struct, \\union, or \\include command ",
620 text+=
"matches the following input files:\n";
623 text+=
"Please use a more specific name by "
624 "including a (larger) part of the path!";
628 text+=
"is not an input file";
632 else if (includeFile.
isEmpty() && ifd &&
646 if (iName.
at(0)==
'<') local=
FALSE;
647 else if (iName.
at(0)==
'"') local=
TRUE;
648 if (iName.
at(0)==
'"' || iName.
at(0)==
'<')
671 cd->setIncludeFile(
nullptr,iName,local,
TRUE);
684 for (
size_t i=0;i<l;i++)
688 else if (c==
')' && round>0) round--;
689 else if (c==
'<' && round==0) count++;
694 if (c==
'>' && round==0 && count>0) count--;
717 if (idx==-1)
return prevScope;
719 if (nsName.
isEmpty())
return prevScope;
720 if (!fullScope.
isEmpty()) fullScope+=
"::";
725 if (nd==
nullptr) cd =
getClass(fullScope);
726 if (nd==
nullptr && cd)
730 else if (nd==
nullptr && cd==
nullptr && fullScope.
find(
'<')==-1)
738 "[generated]",1,1,fullScope,
756 if (prevScopeMutable)
788 int p=i1+l1,l2=0,i2=0;
796 if (resultScope==
nullptr)
807 if (resultScope!=
nullptr)
break;
866 auto alIt = tArgLists.begin();
867 while ((i=name.
find(
"::",p))!=-1 && alIt!=tArgLists.end())
883 return alIt!=tArgLists.end() ?
884 std::make_unique<ArgumentList>(*alIt) :
885 std::unique_ptr<ArgumentList>();
893 if (specifier.isStruct())
895 else if (specifier.isUnion())
897 else if (specifier.isCategory())
899 else if (specifier.isInterface())
901 else if (specifier.isProtocol())
903 else if (specifier.isException())
905 else if (specifier.isService())
907 else if (specifier.isSingleton())
910 if (section.isUnionDoc())
912 else if (section.isStructDoc())
914 else if (section.isInterfaceDoc())
916 else if (section.isProtocolDoc())
918 else if (section.isCategoryDoc())
920 else if (section.isExceptionDoc())
922 else if (section.isServiceDoc())
924 else if (section.isSingletonDoc())
945 int idx=fullName.
find(
'>');
956 qualifiedName.
prepend(scName+
"::");
962 AUTO_TRACE_ADD(
"Found class with name '{}', qualifiedName '{}'", cd ? cd->
name() : root->
name, qualifiedName);
1017 AUTO_TRACE_ADD(
"New class: fullname '{}' namespace '{}' name='{}' brief='{}' docs='{}'",
1027 if (fullName.
find(
"::")!=-1)
1034 std::unique_ptr<ArgumentList> tArgList;
1050 fullName=fullName.
left(i);
1061 fullName,sec,tagName,refFileName,
TRUE,root->
spec.isEnum()) ));
1064 AUTO_TRACE_ADD(
"New class '{}' type={} #tArgLists={} tagInfo={} hidden={} artificial={}",
1097 AUTO_TRACE_ADD(
"Class {} not added, already exists as alias", fullName);
1105 if (!root->
spec.isForwardDecl())
1166 qualifiedName.
prepend(scName+
"::");
1172 AUTO_TRACE_ADD(
"Found concept with name '{}' (qualifiedName='{}')", cd ? cd->
name() : root->
name, qualifiedName);
1176 qualifiedName=cd->
name();
1190 AUTO_TRACE_ADD(
"New concept: fullname '{}' namespace '{}' name='{}' brief='{}' docs='{}'",
1191 qualifiedName,namespaceName,className,root->
brief,root->
doc);
1200 if (qualifiedName.
find(
"::")!=-1)
1212 qualifiedName,tagName,refFileName)));
1216 qualifiedName,root->
tArgLists.size(),fmt::ptr(tagInfo));
1247 AUTO_TRACE_ADD(
"Concept '{}' not added, already exists (as alias)", qualifiedName);
1268 if (root->
section.isModuleDoc())
1278 if (root->
section.isConcept())
1288 if (root->
section.isConceptDoc())
1307 if (cd!=ocd && cd->groupId()==ocd->groupId() &&
1308 !cd->partOfGroups().empty() && ocd->partOfGroups().empty())
1313 for (
const auto &gd : cd->partOfGroups())
1319 gd->addConcept(ocd.get());
1344 aliasFullName(name),aliasCd(std::move(cd)), aliasContext(ctx) {}
1346 std::unique_ptr<ClassDef> aliasCd;
1349 std::vector<ClassAlias> aliases;
1353 if (cd && visitedClasses.find(icd.get())==visitedClasses.end())
1359 name,icd->getFileDef(),
nullptr);
1385 aliases.emplace_back(aliasFullName,std::move(aliasCd),dm);
1396 visitedClasses.insert(icd.get());
1406 for (
auto &alias : aliases)
1411 alias.aliasContext->addInnerCompound(aliasCd);
1420 if (cd && visitedClasses.find(icd.get())==visitedClasses.end())
1439 "Internal inconsistency: scope for class {} not "
1458 if (visitedClasses.find(cd.get())==visitedClasses.end() && !cd->partOfGroups().empty())
1462 for (
auto &ncd : cd->getClasses())
1473 visitedClasses.insert(cd.get());
1484 fullName+=
"."+fieldName;
1527 for (
const auto &md : *ml)
1530 auto newMd =
createMemberDef(md->getDefFileName(),md->getDefLine(),md->getDefColumn(),
1531 md->typeString(),md->name(),md->argsString(),md->excpString(),
1579 for (
const auto &md : *ml)
1582 if (type.
find(
"::@")!=-1)
1588 if (type.
find(icd->name())!=-1)
1591 if (md->isAnonymous()) name =
"__unnamed" +
QCString().
setNum(pos++)+
"__";
1611 for (
const auto &pmd : *pml)
1614 if (pmdm && pmd->
name()==md->name())
1634 if (icd->name().find(
"@")==-1)
1643 candidates.push_back(cdm);
1649 std::vector<ClassDefMutable *> candidates;
1661 for (
auto &cd : candidates)
1674 (root->
section.isNamespace() ||
1675 root->
section.isNamespaceDoc() ||
1684 if (root->
section.isPackageDoc())
1747 root->
type,root->
spec.isPublished())));
1813 QCString aliasName = aliasNd->name();
1842 for (
auto &und : unl)
1846 if (usingNd!=
nullptr)
break;
1853 if (root->
section.isUsingDir())
1885 int scopeOffset =
static_cast<int>(nsName.
length());
1896 else if ((scopeOffset=nsName.
findRev(
"::",scopeOffset-1))==-1)
1900 }
while (scopeOffset>=0 && usingNd==
nullptr);
1902 if (usingNd==
nullptr && nd)
1906 while (pnd && usingNd==
nullptr)
1923 if (usingNd==
nullptr && fd)
1995 if (root->
section.isUsingDecl() &&
2008 if (root->
section.isUsingDecl() &&
2013 AUTO_TRACE(
"Found using declaration '{}' at line {} of {} inside section {}",
2043 if (nd==
nullptr) scope = fd;
2113 AUTO_TRACE(
"creating new member {} for class {}",memName,cd->
name());
2124 newMmd->setMemberClass(cd);
2142 newMmd->addSectionsToDefinition(root->
anchors);
2148 newMmd->setMemberGroupId(root->
mGrpId);
2151 newMmd->setLanguage(root->
lang);
2152 newMmd->setId(root->
id);
2161 if (root->
section.isUsingDecl() &&
2188 for (
auto &mi : *mni)
2206 for (
const auto ©Cd : it->second)
2219 else if (root->
section.isUsingDecl() &&
2254 memName = root->
name;
2276 newMmd->setNamespace(nd);
2281 newMmd->setFileDef(fd);
2300 newMmd->addSectionsToDefinition(root->
anchors);
2306 newMmd->setMemberGroupId(root->
mGrpId);
2309 newMmd->setLanguage(root->
lang);
2310 newMmd->setId(root->
id);
2318 if (nd && aliasMd.get())
2322 if (fd && aliasMd.get())
2351 if (nd) ncdm->
moveTo(nd);
2380 aliasFullName = aliasCd->localName();
2384 aliasFullName = nd->
qualifiedName()+
"::"+aliasCd->localName();
2416 for (
const auto &fd : *fn)
2419 fd->addIncludedUsingDirectives(visitedFiles);
2446 AUTO_TRACE(
"class variable: file='{}' type='{}' scope='{}' name='{}' args='{}' prot={} mtype={} lang={} ann={} init='{}'",
2454 if (root->
spec.isAlias())
2460 def=type+
" "+name+args;
2465 if (root->
spec.isAlias())
2467 def=
"using "+qualScope+scopeSeparator+name;
2471 def=type+
" "+qualScope+scopeSeparator+name+args;
2483 def=qualScope+scopeSeparator+name+args;
2494 for (
const auto &imd : *mn)
2535 mmd->setTagInfo(root->
tagInfo());
2536 mmd->setMemberClass(cd);
2540 mmd->setDefinition(def);
2542 mmd->addSectionsToDefinition(root->
anchors);
2543 mmd->setFromAnonymousScope(fromAnnScope);
2544 mmd->setFromAnonymousMember(fromAnnMemb);
2548 mmd->setInitializer(init.c_str());
2550 mmd->setMemberGroupId(root->
mGrpId);
2551 mmd->setMemberSpecifiers(root->
spec);
2552 mmd->setVhdlSpecifiers(root->
vhdlSpec);
2553 mmd->setReadAccessor(root->
read);
2554 mmd->setWriteAccessor(root->
write);
2556 mmd->setHidden(root->
hidden);
2558 mmd->setLanguage(root->
lang);
2559 mmd->setId(root->
id);
2562 mmd->setBodyDef(root->
fileDef());
2567 mmd->setRefItems(root->
sli);
2597 AUTO_TRACE(
"global variable: file='{}' type='{}' scope='{}' name='{}' args='{}' prot={} mtype={} lang={} init='{}'",
2609 static const reg::Ex re(R
"(\a\w*)");
2611 std::string typ = ttype.str();
2633 if (scope.
find(
'@')!=-1)
return nullptr;
2649 if (root->
spec.isAlias())
2651 def=
"using "+nd->
name()+sep+name;
2655 def=type+
" "+nd->
name()+sep+name+args;
2660 def=nd->
name()+sep+name+args;
2667 if (name.
at(0)==
'@')
2673 if (root->
spec.isAlias())
2675 def=
"using "+root->
name;
2679 def=type+
" "+name+args;
2700 for (
const auto &imd : *mn)
2717 bool staticsInDifferentFiles =
2723 !staticsInDifferentFiles
2764 mmd->setTagInfo(root->
tagInfo());
2765 mmd->setMemberSpecifiers(root->
spec);
2766 mmd->setVhdlSpecifiers(root->
vhdlSpec);
2770 mmd->addSectionsToDefinition(root->
anchors);
2771 mmd->setFromAnonymousScope(fromAnnScope);
2772 mmd->setFromAnonymousMember(fromAnnMemb);
2774 mmd->setInitializer(init.c_str());
2776 mmd->setMemberGroupId(root->
mGrpId);
2777 mmd->setDefinition(def);
2778 mmd->setLanguage(root->
lang);
2779 mmd->setId(root->
id);
2787 mmd->setBodyDef(fd);
2792 mmd->setRefItems(root->
sli);
2795 mmd->setNamespace(nd);
2803 mmd->setFileDef(fd);
2836 static const reg::Ex re(R
"(\([^)]*[*&^][^)]*\))");
2838 size_t i=std::string::npos;
2842 i = match.position();
2845 if (i!=std::string::npos)
2847 size_t di = type.find(
"decltype(");
2848 if (di!=std::string::npos && di<i)
2850 i = std::string::npos;
2853 size_t bb=type.find(
'<');
2854 size_t be=type.rfind(
'>');
2855 bool templFp =
false;
2856 if (be!=std::string::npos) {
2857 size_t cc_ast = type.find(
"::*");
2858 size_t cc_amp = type.find(
"::&");
2859 templFp = (cc_ast != std::string::npos && cc_ast>be) || (cc_amp != std::string::npos && cc_amp>be);
2862 if (!type.empty() &&
2863 i!=std::string::npos &&
2864 type.find(
"operator")==std::string::npos &&
2865 (type.find(
")(")==std::string::npos || type.find(
"typedef ")!=std::string::npos) &&
2867 (!(bb<i && i<be) || templFp)
2870 if (pLength) *pLength=
static_cast<int>(l);
2873 return static_cast<int>(i);
2890 bool result =
false;
2891 bool typeIsClass =
false;
2892 bool typePtrType =
false;
2926 typePtrType = type.
find(
'*')!=-1 || type.
find(
'&')!=-1;
2929 typeIsClass = resolver.
resolveClass(ctx,type)!=
nullptr;
2931 if (!typeIsClass && (ti=type.
find(
'<'))!=-1)
2948 static const reg::Ex initChars(R
"([\d"'&*!^]+)");
2952 std::string name = a.
name.
str();
2953 if (
reg::search(name,match,initChars) && match.position()==0)
2985 std::string atype = a.
type.
str();
2986 if (
reg::search(atype,match,initChars) && match.position()==0)
2993 if (resType.empty()) resType=atype;
2994 static const reg::Ex idChars(R
"(\a\w*)");
2995 if (
reg::search(resType,match,idChars) && match.position()==0)
2997 resType=match.str();
2998 if (resType==
"int" || resType==
"long" ||
2999 resType==
"float" || resType==
"double" ||
3000 resType==
"char" || resType==
"void" ||
3001 resType==
"signed" || resType==
"unsigned" ||
3002 resType==
"const" || resType==
"volatile" )
3032static int findEndOfTemplate(
const QCString &s,
size_t startPos)
3039 bool insideString=
FALSE;
3040 bool insideChar=
FALSE;
3042 while (e<len && brCount!=0)
3048 if (!insideString && !insideChar)
3050 if (e<len-1 && s.
at(e+1)==
'<')
3052 else if (roundCount==0)
3057 if (!insideString && !insideChar)
3059 if (e<len-1 && s.
at(e+1)==
'>')
3061 else if (roundCount==0)
3066 if (!insideString && !insideChar)
3070 if (!insideString && !insideChar)
3076 if (insideString && pc!=
'\\')
3085 if (insideChar && pc!=
'\\')
3095 return brCount==0 ?
static_cast<int>(e) : -1;
3104 AUTO_TRACE(
"VARIABLE_SEC: type='{}' name='{}' args='{}' bodyLine={} endBodyLine={} mGrpId={} relates='{}'",
3111 if (type.
isEmpty() && name.
find(
"operator")==-1 &&
3112 (name.
find(
'*')!=-1 || name.
find(
'&')!=-1))
3119 std::string sargs = args.
str();
3120 static const reg::Ex reName(R
"(\a\w*)");
3125 sargs = match.suffix().str();
3126 size_t j = sargs.find(
')');
3127 if (j!=std::string::npos) args=sargs.substr(0,j);
3137 int ai = type.
find(
'[',i);
3143 else if (type.
find(
')',i)!=-1)
3150 AUTO_TRACE_ADD(
"after correction: type='{}' name='{}' args='{}'",type,name,args);
3161 scope=name.
left(index);
3162 name=name.
mid(index+2);
3181 bool isRelated=
FALSE;
3182 bool isMemberOf=
FALSE;
3198 for (
size_t i=0;i<name.
length()-1;i++)
3200 if (name[i]==
':' && name[i+1]==
':')
3202 p=
static_cast<int>(i);
3204 else if (name[i]==
'<')
3208 int e = findEndOfTemplate(name,i+1);
3209 if (e!=-1) i=
static_cast<int>(e);
3215 if (type==
"friend class" || type==
"friend struct" ||
3216 type==
"friend union")
3260 else if (type.
find(
"sequence<") != -1)
3262 else if (type.
find(
"dictionary<") != -1)
3286 int si=scope.
find(
'@');
3290 bool inlineSimpleStructs =
Config_getBool(INLINE_SIMPLE_STRUCTS);
3294 if (si!=-1 && !inlineSimpleStructs)
3298 pScope = scope.
left(std::max(si-2,0));
3300 pScope.
prepend(annScopePrefix);
3301 else if (annScopePrefix.
length()>2)
3302 pScope=annScopePrefix.
left(annScopePrefix.
length()-2);
3303 if (name.
at(0)!=
'@')
3371 scope=rname.
left(index);
3372 rname=rname.
mid(index+2);
3384 for (
auto &imd : *mn)
3386 if (!imd->isTypedef())
3395 bool notBothGrouped = root->
groups.empty() || imd->getGroupDef()==
nullptr;
3396 bool bothSameScope = (!cd && !nd) || (cd && imd->getClassDef() == cd) || (nd && imd->getNamespaceDef() == nd);
3399 if (notBothGrouped && bothSameScope && imd->typeString()==rtype)
3446 for (
const auto &e : root->
children())
3447 if (!e->section.isEnum())
3464 for (
const auto &e : root->
children())
3465 if (!e->section.isEnum())
3482 for (
const auto &e : root->
children())
3483 if (!e->section.isEnum())
3498 (root->
section.isVariable() &&
3501 (root->
section.isFunction() &&
3504 (root->
section.isFunction() &&
3513 for (
const auto &e : root->
children())
3514 if (!e->section.isEnum())
3540 mmd->setTagInfo(root->
tagInfo());
3541 mmd->setMemberClass(cd);
3543 mmd->setDocsForDefinition(
false);
3547 mmd->setMemberSpecifiers(root->
spec);
3548 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3549 mmd->setMemberGroupId(root->
mGrpId);
3551 mmd->setLanguage(root->
lang);
3552 mmd->setBodyDef(fd);
3553 mmd->setFileDef(fd);
3554 mmd->addSectionsToDefinition(root->
anchors);
3556 mmd->setDefinition(def);
3560 AUTO_TRACE(
"Interface member: fileName='{}' type='{}' name='{}' mtype='{}' prot={} virt={} state={} proto={} def='{}'",
3578 mmd->setRefItems(root->
sli);
3587 if (root->
section.isExportedInterface() || root->
section.isIncludedService())
3589 AUTO_TRACE(
"Exported interface/included service: type='{}' scope='{}' name='{}' args='{}'"
3590 " relates='{}' relatesType='{}' file='{}' line={} bodyLine={} #tArgLists={}"
3591 " mGrpId={} spec={} proto={} docFile='{}'",
3617 "Illegal member name found.");
3663 (i=name.
find(
'<'))!=-1 &&
3664 (j=name.
find(
'>'))!=-1 &&
3665 (j!=i+2 || name.
at(i+1)!=
'=')
3694 mmd->setTagInfo(root->
tagInfo());
3695 mmd->setMemberClass(cd);
3697 mmd->setDocsForDefinition(!root->
proto);
3701 mmd->setMemberSpecifiers(spec);
3702 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3703 mmd->setMemberGroupId(root->
mGrpId);
3705 mmd->setLanguage(root->
lang);
3706 mmd->setRequiresClause(root->
req);
3707 mmd->setId(root->
id);
3708 mmd->setBodyDef(fd);
3709 mmd->setFileDef(fd);
3710 mmd->addSectionsToDefinition(root->
anchors);
3715 if (scopeSeparator!=
"::")
3717 qualScope =
substitute(qualScope,
"::",scopeSeparator);
3722 scopeSeparator=
"::";
3740 def=type+
" "+qualScope+scopeSeparator+name;
3744 def=qualScope+scopeSeparator+name;
3748 mmd->setDefinition(def);
3752 AUTO_TRACE(
"function member: type='{}' scope='{}' name='{}' args='{}' proto={} def='{}'",
3753 type, qualScope, rname, args, root->
proto, def);
3763 mmd->setRefItems(root->
sli);
3787 mmd->setTagInfo(root->
tagInfo());
3788 mmd->setLanguage(root->
lang);
3789 mmd->setId(root->
id);
3794 mmd->setDocsForDefinition(!root->
proto);
3800 mmd->addSectionsToDefinition(root->
anchors);
3801 mmd->setMemberSpecifiers(root->
spec);
3802 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3803 mmd->setMemberGroupId(root->
mGrpId);
3804 mmd->setRequiresClause(root->
req);
3839 def=root->
type+
" "+scope+name;
3845 AUTO_TRACE(
"new non-member function type='{}' scope='{}' name='{}' args='{}' proto={} def='{}'",
3847 mmd->setDefinition(def);
3851 mmd->setRefItems(root->
sli);
3855 mmd->setNamespace(nd);
3862 mmd->setFileDef(fd);
3883 if (root->
section.isFunction())
3885 AUTO_TRACE(
"member function: type='{}' scope='{}' name='{}' args='{}' relates='{}' relatesType='{}'"
3886 " file='{}' line={} bodyLine={} #tArgLists={} mGrpId={}"
3887 " spec={} proto={} docFile='{}'",
3892 bool isFriend=root->
type.
find(
"friend ")!=-1;
3902 scope=rname.
left(index);
3903 rname=rname.
mid(index+2);
3923 int memIndex=rname.
findRev(
"::");
3926 if (cd && scope+
"::"==rname.
left(scope.
length()+2))
3932 bool isMember=
FALSE;
3935 int ts=rname.
find(
'<');
3936 int te=rname.
find(
'>');
3937 if (memIndex>0 && (ts==-1 || te==-1))
3954 isMember=memIndex<ts || memIndex>te;
3994 for (
const auto &imd : *mn)
4007 fullScope.
prepend(parentScope);
4013 if (mnd) nsName = mnd->
name();
4014 if (rnd) rnsName = rnd->
name();
4022 bool sameNumTemplateArgs =
TRUE;
4023 bool matchingReturnTypes =
TRUE;
4024 bool sameRequiresClause =
TRUE;
4029 sameNumTemplateArgs =
FALSE;
4033 matchingReturnTypes =
FALSE;
4037 sameRequiresClause =
FALSE;
4043 sameNumTemplateArgs =
FALSE;
4046 bool staticsInDifferentFiles =
4053 sameNumTemplateArgs &&
4054 matchingReturnTypes &&
4055 sameRequiresClause &&
4056 !staticsInDifferentFiles
4060 if (!root->
groups.empty() && !root->
groups.front().groupname.isEmpty())
4067 found=(mnd && rnd && nsName==rnsName) ||
4068 ((mnd==
nullptr && rnd==
nullptr && mfd!=
nullptr &&
4079 AUTO_TRACE_ADD(
"combining function with prototype found={} in namespace '{}'",
found,nsName);
4181 "Illegal member name found."
4199 for (
const auto &ifmd : *fn)
4203 for (
const auto &immd : *mn)
4219 AUTO_TRACE_ADD(
"Merging related global and member '{}' isFriend={} isRelated={} isFunction={}",
4296 for (
const auto &imdec : *mn)
4304 for (
const auto &imdef : *mn)
4307 if (mdef && mdec!=mdef &&
4327 for (
const auto &imd : *mn)
4343 if (mdef && mdec)
break;
4351 mdec->getOuterScope(),mdec->getFileDef(),
const_cast<ArgumentList*
>(&mdecAl),
4358 mdec->mergeReferences(mdef);
4360 mdec->mergeReferencedBy(mdef);
4377 for (
const auto &imd : *mn)
4388 for (
const auto &irmd : *rmn)
4422 size_t i=qualifiedName.rfind(
"::");
4423 if (i!=std::string::npos)
4425 QCString scope = qualifiedName.substr(0,i);
4426 QCString name = qualifiedName.substr(i+2);
4430 for (
const auto &imd : *mn)
4456 std::map<std::string,int> templateNames;
4458 for (
const Argument &arg : templateArguments)
4460 static const reg::Ex re(R
"(\a[\w:]*)");
4463 for (; it!=
end ; ++it)
4465 const auto &match = *it;
4466 std::string n = match.str();
4467 if (n==arg.name.str())
4469 if (templateNames.find(n)==templateNames.end())
4471 templateNames.emplace(n,count);
4476 return templateNames;
4491 if (context && cd!=context)
4496 if (result==
nullptr)
4501 if (result==
nullptr)
4530 for (
auto &mi : *mni)
4540 type = typedefValue;
4559 usedClassName = typeCd->
name();
4562 int sp=usedClassName.
find(
'<');
4571 if (templateNames.empty())
4580 if (arg.name==usedName)
4584 if (usedCd==
nullptr)
4694 if (templateNames.empty())
4732 AUTO_TRACE(
"Derived from template '{}' with parameters '{}' isArtificial={}",
4733 templateClass->
name(),templSpec,isArtificial);
4736 bool existingClass = templSpec==tempArgsStr;
4737 if (existingClass)
return;
4739 bool freshInstance=
FALSE;
4756 for (
auto it=it_pair.first ; it!=it_pair.second ; ++it)
4758 const Entry *templateRoot = it->second;
4759 AUTO_TRACE_ADD(
"template root found '{}' templSpec='{}'",templateRoot->
name,templSpec);
4765 isArtificial,templArgs.get(),templateNames);
4784 int ti=ttype.
find(
'<');
4790 templateClassName,
true,
true);
4791 AUTO_TRACE_ADD(
"templateClassName={} baseClass={}",templateClassName,baseClass?baseClass->
name():
"<none>");
4810 int index=n.
find(
'<');
4822 int l =
static_cast<int>(name.
length());
4828 while (count>0 && i>=0)
4833 case '>':
if (!insideQuote) count++;
break;
4834 case '<':
if (!insideQuote) count--;
break;
4835 case '\'':
if (!insideQuote) insideQuote=c;
4836 else if (insideQuote==c && (i<0 || name[i]!=
'\\')) insideQuote=0;
4838 case '"':
if (!insideQuote) insideQuote=c;
4839 else if (insideQuote==c && (i<0 || name[i]!=
'\\')) insideQuote=0;
4859 AUTO_TRACE(
"name={} base={} isArtificial={} mode={}",cd->
name(),bi->
name,isArtificial,(
int)mode);
4862 bool explicitGlobalScope=
FALSE;
4866 explicitGlobalScope=
TRUE;
4870 bool lastParent=
FALSE;
4875 int scopeOffset=explicitGlobalScope ? 0 :
static_cast<int>(scopeName.
length());
4884 baseClassName.
prepend(scopeName.
left(scopeOffset)+
"::");
4913 || explicitGlobalScope
4917 (root->
section.isExportedInterface() ||
4918 root->
section.isIncludedService()))
4921 AUTO_TRACE_ADD(
"class relation '{}' inherited/used by '{}' found prot={} virt={} templSpec='{}'",
4922 baseClassName, root->
name, bi->
prot, bi->
virt, templSpec);
4925 int si=baseClassName.
findRev(
"::",i);
4927 if (baseClass==
nullptr &&
static_cast<size_t>(i)!=baseClassName.
length())
4932 int e=findEndOfTemplate(baseClassName,i+1);
4937 baseClassName = baseClassName.
left(i)+baseClassName.
right(baseClassName.
length()-e);
4948 else if (baseClass && !templSpec.
isEmpty())
4959 baseClass = templClass;
4967 if (!
found && si!=-1)
4977 found=baseClass!=
nullptr && baseClass!=cd;
4987 found = baseClass!=
nullptr && baseClass!=cd;
4999 found = baseClass!=
nullptr && baseClass!=cd;
5002 bool isATemplateArgument = templateNames.find(biName.
str())!=templateNames.end();
5007 AUTO_TRACE_ADD(
"Documented base class '{}' templSpec='{}'",biName,templSpec);
5025 if (baseClassTypeDef==
nullptr)
5035 if (baseClassTypeDef)
5044 AUTO_TRACE_ADD(
"insertBaseClass name={} prot={} virt={} templSpec={}",usedName,prot,bi->
virt,templSpec);
5052 "Detected potential recursive class relation "
5053 "between class {} and base class {}!",
5060 else if (mode==
Undocumented && (scopeOffset==0 || isATemplateArgument))
5062 AUTO_TRACE_ADD(
"New undocumented base class '{}' baseClassName='{}' templSpec='{}' isArtificial={}",
5063 biName,baseClassName,templSpec,isArtificial);
5065 if (isATemplateArgument)
5068 if (baseClass==
nullptr)
5087 if (baseClass==
nullptr)
5098 si = baseClassName.
findRev(
"::");
5114 biName=
"<"+biName.
left(biName.
length()-2)+
">";
5118 AUTO_TRACE_ADD(
"insertBaseClass name={} prot={} virt={} templSpec={}",biName,bi->
prot,bi->
virt,templSpec);
5128 if (scope!=baseClass)
5154 "Detected potential recursive class relation "
5155 "between class {} and base class {}!",
5156 root->
name,baseClassName
5167 else if ((scopeOffset=scopeName.
findRev(
"::",scopeOffset-1))==-1)
5172 }
while (scopeOffset>=0);
5174 if (parentNode==
nullptr)
5180 parentNode=parentNode->
parent();
5182 }
while (lastParent);
5202 bool hasExtends = !root->
extends.empty();
5203 if (hasExtends)
return TRUE;
5228 (i=bName.
find(
'<'))!=-1)
5238 bName = bName.
left(i);
5301 if (!nd->hasDocumentation())
5308 warn_undoc(nd->getDefFileName(),nd->getDefLine(),
"{} {} is not documented.",
5373 for (
const auto &tn_kv : templateNames)
5375 size_t templIndex = tn_kv.second;
5377 bool hasActArg=
FALSE;
5378 if (templIndex<templArgs->size())
5380 actArg=templArgs->at(templIndex);
5384 baseClassNames.find(actArg.
type.
str())!=baseClassNames.end() &&
5385 actualTemplateNames.find(actArg.
type.
str())==actualTemplateNames.end()
5388 actualTemplateNames.emplace(actArg.
type.
str(),
static_cast<int>(templIndex));
5423 for (
const auto &fd : *fn)
5425 fd->computeAnchors();
5438 gd->computeAnchors();
5458 for (
const auto &fd : *fn)
5460 fd->addListReferences();
5475 gd->addListReferences();
5480 QCString name = pd->getOutputFileBase();
5481 if (pd->getGroupDef())
5483 name = pd->getGroupDef()->getOutputFileBase();
5490 name,pd->title(),
QCString(),
nullptr);
5496 QCString name = dd->getOutputFileBase();
5505 name,dd->displayName(),
QCString(),
nullptr);
5534 if (md==
nullptr)
return;
5535 AUTO_TRACE(
"scope='{}' name='{}' args='{}' funcDecl='{}' mSpec={}",
5550 fullName = cd->
name();
5552 fullName = nd->
name();
5554 if (!fullName.
isEmpty()) fullName+=
"::";
5555 fullName+=md->
name();
5659 "member {} belongs to two different groups. The second one found here will be ignored.",
5694 return allowNoGroup;
5697 for (
const auto &g : root->
groups)
5699 if (g.groupname == gd->
name())
5722 AUTO_TRACE(
"namespace='{}' type='{}' name='{}' tempArg='{}' decl='{}'",namespaceName,type,name,tempArg,decl);
5736 for (
const auto &md : *mn)
5747 if (md->isAlias() && md->getOuterScope() &&
5754 nd = md->getNamespaceDef();
5759 if (nd && md->isEnumValue() && (enumNamePos=namespaceName.
findRev(
"::"))!=-1)
5761 QCString enumName = namespaceName.
mid(enumNamePos+2);
5762 if (namespaceName.
left(enumNamePos)==nd->
name())
5767 for (
const auto &emd : *enumMn)
5769 found = emd->isStrong() && md->getEnumScope()==emd.get();
5783 else if (nd==
nullptr && md->isEnumValue())
5788 for (
const auto &emd : *enumMn)
5790 found = emd->isStrong() && md->getEnumScope()==emd.get();
5813 if ((namespaceName.
isEmpty() && nd==
nullptr) ||
5814 (nd && nd->
name()==namespaceName) ||
5818 AUTO_TRACE_ADD(
"Try to add member '{}' to scope '{}'",md->name(),namespaceName);
5826 md->isVariable() || md->isTypedef() ||
5834 if (matching && !root->
tArgLists.empty())
5853 if (matching && md->isStatic() &&
5854 md->getDefFileName()!=root->
fileName &&
5862 if (!md->templateArguments().empty() && !root->
tArgLists.empty())
5866 if (md->templateArguments().size()!=root->
tArgLists.back().size() ||
5867 md->typeString()!=type ||
5868 md->requiresClause()!=root->
req)
5888 QCString warnMsg =
"no matching file member found for \n"+fullFuncDecl;
5891 warnMsg+=
"\nPossible candidates:";
5892 for (
const auto &md : *mn)
5896 warnMsg+=
"' " +
warn_line(md->getDefFileName(),md->getDefLine());
5904 if (root->
type!=
"friend class" &&
5905 root->
type!=
"friend struct" &&
5906 root->
type!=
"friend union" &&
5907 root->
type!=
"friend" &&
5913 "documented symbol '{}' was not declared or defined.",
qPrint(decl)
5925 auto srcIt = srcTempArgLists.begin();
5926 auto dstIt = dstTempArgLists.begin();
5927 while (srcIt!=srcTempArgLists.end() && dstIt!=dstTempArgLists.end())
5929 if ((*srcIt).size()!=(*dstIt).size())
return TRUE;
5943 result = cd->templateArguments().hasParameters() || cd->templateMaster()!=
nullptr ||
5953 const std::string &src
5957 static const reg::Ex re(R
"(\a\w*)");
5962 for (; it!=
end ; ++it)
5964 const auto &match = *it;
5965 size_t i = match.position();
5966 size_t l = match.length();
5968 dst+=src.substr(p,i-p);
5969 std::string name=match.str();
5971 auto srcIt = srcTempArgLists.begin();
5972 auto dstIt = dstTempArgLists.begin();
5973 while (srcIt!=srcTempArgLists.end() && !
found)
5976 std::vector<Argument>::const_iterator tdaIt;
5977 if (dstIt!=dstTempArgLists.end())
5980 tdaIt = tdAli->
begin();
5985 for (
auto tsaIt = tsaLi.
begin(); tsaIt!=tsaLi.
end() && !
found; ++tsaIt)
5989 if (tdAli && tdaIt!=tdAli->
end())
6005 else if (tdaType.
startsWith(
"typename ")) vc=9;
6008 tdaName = tdaType.
mid(vc);
6041 auto dstIt = dst.
begin();
6046 if (dstIt == dst.
end())
6050 da.
array = dstArray;
6058 da.
array = dstArray;
6066 srcTempArgLists,dstTempArgLists,
6092 funcType,funcName,funcArgs,exceptions,
6096 mmd->setTagInfo(root->
tagInfo());
6097 mmd->setLanguage(root->
lang);
6098 mmd->setId(root->
id);
6099 mmd->makeImplementationDetail();
6100 mmd->setMemberClass(cd);
6101 mmd->setDefinition(funcDecl);
6107 mmd->setDocsForDefinition(!root->
proto);
6109 mmd->addSectionsToDefinition(root->
anchors);
6113 mmd->setMemberSpecifiers(spec);
6114 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6115 mmd->setMemberGroupId(root->
mGrpId);
6118 mmd->setRefItems(root->
sli);
6154 bool memFound=
FALSE;
6155 for (
const auto &imd : *mn)
6158 if (md==
nullptr)
continue;
6160 if (cd==
nullptr)
continue;
6177 if (!namespaceName.
isEmpty()) fullScope.
prepend(namespaceName+
"::");
6178 if (fullScope==cd->
name())
6184 for (
const auto &emd : *enumMn)
6186 memFound = emd->isStrong() && md->
getEnumScope()==emd.get();
6192 if (memFound)
break;
6197 if (memFound)
break;
6215 if (!templAl.
empty())
6217 declTemplArgs.push_back(templAl);
6225 bool substDone=
FALSE;
6232 if (declTemplArgs.size()>0 && declTemplArgs.size()==defTemplArgs.size())
6248 AUTO_TRACE_ADD(
"matching '{}'<=>'{}' className='{}' namespaceName='{}'",
6272 AUTO_TRACE_ADD(
"Comparing return types '{}'<->'{}' #args {}<->{}",
6280 else if (defTemplArgs.size()>declTemplArgs.size())
6282 AUTO_TRACE_ADD(
"Different number of template arguments {} vs {}",defTemplArgs.size(),declTemplArgs.size());
6288 bool rootIsUserDoc = root->
section.isMemberDoc();
6291 bool classOrMdIsTemplate = mdIsTemplate || classIsTemplate;
6292 bool rootIsTemplate = !root->
tArgLists.empty();
6294 if (!rootIsUserDoc &&
6295 (mdIsTemplate || rootIsTemplate) &&
6296 ((classOrMdIsTemplate && !rootIsTemplate) || (!classOrMdIsTemplate && rootIsTemplate))
6301 AUTO_TRACE_ADD(
"Comparing return types: template v.s. non-template");
6305 AUTO_TRACE_ADD(
"Match results of matchArguments2='{}' substDone='{}'",matching,substDone);
6316 if (!funcTempList.
isEmpty() &&
6336 else if (cd && cd!=tcd)
6342 if (memFound)
break;
6346 addLocalObjCMethod(root,scopeName,funcType,funcName,funcArgs,exceptions,funcDecl,spec);
6349 if (count==0 && !(isFriend && funcType==
"class"))
6352 const ClassDef *ecd =
nullptr, *ucd =
nullptr;
6353 MemberDef *emd =
nullptr, *umd =
nullptr;
6355 for (
const auto &md : *mn)
6377 AUTO_TRACE_ADD(
"new candidate className='{}' scope='{}' args='{}': exact match",
6378 className,ccd->
name(),md->argsString());
6384 AUTO_TRACE_ADD(
"new candidate className='{}' scope='{}' args='{}': no match",
6385 className,ccd->
name(),md->argsString());
6390 bool strictProtoMatching =
Config_getBool(STRICT_PROTO_MATCHING);
6391 if (!strictProtoMatching)
6393 if (candidates==1 && ucd && umd)
6400 else if (candidates>1 && ecd && emd)
6411 if (noMatchCount>1) warnMsg+=
"uniquely ";
6412 warnMsg+=
"matching class member found for \n";
6416 warnMsg+=
" template ";
6425 warnMsg+=fullFuncDecl;
6427 if (candidates>0 || noMatchCount>=1)
6429 warnMsg+=
"\nPossible candidates:";
6435 for (
const auto &md : *mn)
6437 const ClassDef *cd=md->getClassDef();
6451 warnMsg+=
"template ";
6456 if (!md->typeString().isEmpty())
6458 warnMsg+=md->typeString();
6463 warnMsg+=qScope+
"::"+md->name();
6464 warnMsg+=md->argsString();
6465 warnMsg+=
"' " +
warn_line(md->getDefFileName(),md->getDefLine());
6486 AUTO_TRACE(
"funcType={} funcName={} funcArgs={} funcDecl={} spec={}",funcType,funcName,funcArgs,funcDecl,spec);
6488 for (
const auto &md : *mn)
6490 if (md->getClassDef()==cd)
6502 funcType,funcName,funcArgs,exceptions,
6508 mmd->setTagInfo(root->
tagInfo());
6509 mmd->setLanguage(root->
lang);
6510 mmd->setId(root->
id);
6511 mmd->setMemberClass(cd);
6512 mmd->setTemplateSpecialization(
TRUE);
6514 mmd->setDefinition(funcDecl);
6520 mmd->setDocsForDefinition(!root->
proto);
6522 mmd->addSectionsToDefinition(root->
anchors);
6526 mmd->setMemberSpecifiers(spec);
6527 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6528 mmd->setMemberGroupId(root->
mGrpId);
6530 mmd->setRefItems(root->
sli);
6544 bool sameClass=
false;
6549 [](
const auto &md1,
const auto &md2)
6550 { return md1->getClassDef()->name()==md2->getClassDef()->name(); });
6556 if (cd==
nullptr)
return;
6564 std::unique_ptr<ArgumentList> tArgList =
6569 funcType,funcName,funcArgs,exceptions,
6573 mmd->setTagInfo(root->
tagInfo());
6574 mmd->setLanguage(root->
lang);
6575 mmd->setId(root->
id);
6577 mmd->setMemberClass(cd);
6578 mmd->setDefinition(funcDecl);
6587 mmd->setDocsForDefinition(!root->
proto);
6589 mmd->addSectionsToDefinition(root->
anchors);
6593 mmd->setMemberSpecifiers(spec);
6594 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6595 mmd->setMemberGroupId(root->
mGrpId);
6598 mmd->setRefItems(root->
sli);
6656 AUTO_TRACE(
"root='{}' funcDecl='{}' related='{}' overload={} isFunc={} mGrpId={} #tArgList={} spec={} lang={}",
6669 bool isRelated=
false;
6670 bool isMemberOf=
false;
6671 bool isFriend=
false;
6684 spec.setInline(
true);
6689 spec.setExplicit(
true);
6694 spec.setMutable(
true);
6705 while ((sep=funcDecl.
find(
';'))!=-1)
6711 if (!funcDecl.
isEmpty() && funcDecl[0]!=
' ') funcDecl.
prepend(
" ");
6723 if (isFriend && funcDecl.
startsWith(
"class "))
6727 funcName = funcDecl;
6729 else if (isFriend && funcDecl.
startsWith(
"struct "))
6732 funcName = funcDecl;
6738 funcArgs,funcTempList,exceptions
6746 AUTO_TRACE_ADD(
"scopeName='{}' className='{}' namespaceName='{}' funcType='{}' funcName='{}' funcArgs='{}'",
6747 scopeName,className,namespaceName,funcType,funcName,funcArgs);
6758 scopeName = relates;
6771 scopeName = joinedName;
6785 QCString joinedName = fnd->name()+
"::"+scopeName;
6788 scopeName=joinedName;
6815 AUTO_TRACE_ADD(
"scopeName='{}' className='{}' namespaceName='{}'",scopeName,className,namespaceName);
6824 scopeName=namespaceName;
6826 else if (!relates.
isEmpty() ||
6829 scopeName=namespaceName+
"::"+className;
6833 scopeName=className;
6836 else if (!className.
isEmpty())
6838 scopeName=className;
6848 uint32_t argListIndex=0;
6853 tempScopeName=scopeName+funcSpec;
6867 funcDecl=funcType+
" "+tempScopeName+
"::"+funcName+funcTempList;
6871 funcDecl=funcType+
" "+tempScopeName+
"::"+funcName+funcArgs;
6878 funcDecl=tempScopeName+
"::"+funcName+funcTempList;
6882 funcDecl=tempScopeName+
"::"+funcName+funcArgs;
6892 funcDecl=funcType+
" "+funcName+funcTempList;
6896 funcDecl=funcType+
" "+funcName+funcArgs;
6903 funcDecl=funcName+funcTempList;
6907 funcDecl=funcName+funcArgs;
6912 if (funcType==
"template class" && !funcTempList.
isEmpty())
6915 AUTO_TRACE_ADD(
"Parse results: namespaceName='{}' className=`{}` funcType='{}' funcSpec='{}' "
6916 " funcName='{}' funcArgs='{}' funcTempList='{}' funcDecl='{}' relates='{}'"
6917 " exceptions='{}' isRelated={} isMemberOf={} isFriend={} isFunc={}",
6918 namespaceName, className, funcType, funcSpec,
6919 funcName, funcArgs, funcTempList, funcDecl, relates,
6920 exceptions, isRelated, isMemberOf, isFriend, isFunc);
6926 bool strongEnum =
false;
6930 for (
const auto &imd : *mn)
6943 namespaceName+=
"::"+className;
6947 namespaceName=className;
6955 funcName =
substitute(funcName,className+
"::",
"");
6966 if (!isRelated && !strongEnum && mn)
6974 funcArgs,funcTempList,exceptions,
6975 type,args,isFriend,spec,relates,funcDecl,overloaded,isFunc);
6987 else if (overloaded)
6989 addOverloaded(root,mn,funcType,funcName,funcArgs,funcDecl,exceptions,spec);
6993 if (!
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec))
6998 "Cannot determine class for function\n{}",
7004 else if (isRelated && !relates.
isEmpty())
7006 AUTO_TRACE_ADD(
"related function scopeName='{}' className='{}'",scopeName,className);
7007 if (className.
isEmpty()) className=relates;
7011 bool newMember=
TRUE;
7017 for (
const auto &imd : *mn)
7051 mn->
push_back(std::move(mdDefineTaken));
7065 for (
const auto &irmd : *mn)
7086 addMemberDocs(root,rmd_found,funcDecl,
nullptr,overloaded,spec);
7094 switch (root->
mtype)
7115 funcType,funcName,funcArgs,exceptions,
7138 mmd->setDefinitionTemplateParameterLists(root->
tArgLists);
7140 mmd->setTagInfo(root->
tagInfo());
7154 for (
const auto &irmd : *rmn)
7185 mmd->setBodyDef(fd);
7192 mmd->setMemberClass(cd);
7193 mmd->setMemberSpecifiers(spec);
7194 mmd->setVhdlSpecifiers(root->
vhdlSpec);
7195 mmd->setDefinition(funcDecl);
7200 mmd->setDocsForDefinition(!root->
proto);
7203 mmd->addSectionsToDefinition(root->
anchors);
7204 mmd->setMemberGroupId(root->
mGrpId);
7205 mmd->setLanguage(root->
lang);
7206 mmd->setId(root->
id);
7210 mmd->setRefItems(root->
sli);
7219 if (!
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec))
7224 "Cannot determine file/namespace for relatedalso function\n{}",
7238 addLocalObjCMethod(root,scopeName,funcType,funcName,funcArgs,exceptions,funcDecl,spec);
7242 bool globMem =
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec);
7243 if (className.
isEmpty() && !globMem)
7247 else if (!className.
isEmpty() && !globMem)
7250 "member '{}' of class '{}' cannot be found",
7251 funcName,className);
7269 AUTO_TRACE(
"root->type='{}' root->inside='{}' root->name='{}' root->args='{}' section={} root->spec={} root->mGrpId={}",
7284 type=type.
left(i+l);
7295 if (root->
section.isMemberDoc())
7321 else if (root->
section.isOverloadDoc())
7335 (root->
section.isVariable() &&
7347 if (type==
"friend class" || type==
"friend struct" ||
7348 type==
"friend union")
7354 type+
" "+root->
name,
7387 else if (root->
section.isVariableDoc())
7399 else if (root->
section.isExportedInterface() ||
7400 root->
section.isIncludedService())
7406 type +
" " + root->
name,
7419 if (root->
section.isMemberDoc() ||
7420 root->
section.isOverloadDoc() ||
7423 root->
section.isVariableDoc() ||
7425 root->
section.isIncludedService() ||
7426 root->
section.isExportedInterface()
7436 for (
const auto &e : root->
children())
7438 if (!e->section.isEnum())
7450 for (
const auto &objCImpl : root->
children())
7452 if (objCImpl->section.isObjcImpl())
7454 for (
const auto &objCMethod : objCImpl->children())
7456 if (objCMethod->section.isFunction())
7460 objCMethod->relates,
7463 objCMethod->type+
" "+objCImpl->name+
"::"+objCMethod->name+
" "+objCMethod->args,
7465 objCMethod->section=EntryType::makeEmpty();
7484 bool isGlobal =
false;
7485 bool isRelated =
false;
7486 bool isMemberOf =
false;
7558 mmd->setTagInfo(root->
tagInfo());
7559 mmd->setLanguage(root->
lang);
7560 mmd->setId(root->
id);
7561 if (!isGlobal) mmd->setMemberClass(cd);
else mmd->setFileDef(fd);
7563 mmd->setBodyDef(root->
fileDef());
7564 mmd->setMemberSpecifiers(root->
spec);
7565 mmd->setVhdlSpecifiers(root->
vhdlSpec);
7566 mmd->setEnumBaseType(root->
args);
7569 mmd->addSectionsToDefinition(root->
anchors);
7570 mmd->setMemberGroupId(root->
mGrpId);
7574 mmd->setRefItems(root->
sli);
7588 mmd->setDefinition(name+baseType);
7592 mmd->setDefinition(nd->
name()+
"::"+name+baseType);
7596 mmd->setNamespace(nd);
7603 if (isGlobal && (nd==
nullptr || !nd->
isAnonymous()))
7605 if (!defSet) mmd->setDefinition(name+baseType);
7606 if (fd==
nullptr && root->
parent())
7612 mmd->setFileDef(fd);
7620 mmd->setDefinition(name+baseType);
7624 mmd->setDefinition(cd->
name()+
"::"+name+baseType);
7630 mmd->setDocsForDefinition(!root->
proto);
7660 bool isGlobal =
false;
7661 bool isRelated =
false;
7732 struct EnumValueInfo
7734 EnumValueInfo(
const QCString &n,std::unique_ptr<MemberDef> &&md) :
7735 name(n), member(std::move(md)) {}
7737 std::unique_ptr<MemberDef> member;
7739 std::vector< EnumValueInfo > extraMembers;
7741 for (
const auto &imd : *mn)
7748 for (
const auto &e : root->
children())
7752 if ( isJavaLike || root->
spec.isStrong())
7760 i = qualifiedName.
findRev(
"::");
7767 qualifiedName=
substitute(qualifiedName,
"::",
".");
7772 if (fileName.
isEmpty() && e->tagInfo())
7774 fileName = e->tagInfo()->tagName;
7778 fileName,e->startLine,e->startColumn,
7779 e->type,e->name,e->args,
QCString(),
7787 fmmd->setNamespace(mnd);
7791 fmmd->setTagInfo(e->tagInfo());
7792 fmmd->setLanguage(e->lang);
7793 fmmd->setBodySegment(e->startLine,e->bodyLine,e->endBodyLine);
7794 fmmd->setBodyDef(e->fileDef());
7796 fmmd->setDocumentation(e->doc,e->docFile,e->docLine);
7797 fmmd->setBriefDescription(e->brief,e->briefFile,e->briefLine);
7798 fmmd->addSectionsToDefinition(e->anchors);
7799 std::string init = e->initializer.str();
7800 fmmd->setInitializer(init.c_str());
7801 fmmd->setMaxInitLines(e->initLines);
7802 fmmd->setMemberGroupId(e->mGrpId);
7803 fmmd->setExplicitExternal(e->explicitExternal,fileName,e->startLine,e->startColumn);
7804 fmmd->setRefItems(e->sli);
7807 fmmd->setEnumScope(md,
TRUE);
7808 extraMembers.emplace_back(e->name,std::move(fmd));
7817 if (!e->name.isEmpty() && (fmn=emnsd->
find(e->name)))
7820 for (
const auto &ifmd : *fmn)
7851 else if (isRelated && cd)
7883 for (
auto &e : extraMembers)
7928 if (gd==
nullptr && !root->
groups.empty())
7942 for (
const auto &g : root->
groups)
7961 "Found non-existing group '{}' for the command '{}', ignoring command",
7975 if (root->
section.isEnumDoc() &&
8001 AUTO_TRACE(
"Found docs for enum with name '{}' and scope '{}' in context '{}' cd='{}', nd='{}' fd='{}'",
8015 for (
const auto &imd : *mn)
8030 else if (cd==
nullptr && mcd==
nullptr && nd!=
nullptr && mnd==nd)
8037 else if (cd==
nullptr && nd==
nullptr && mcd==
nullptr && mnd==
nullptr && fd==mfd)
8062 for (
const auto &mn : mnsd)
8065 for (
const auto &imd : *mn)
8070 int documentedEnumValues=0;
8074 if (fmd->isLinkableInProject()) documentedEnumValues++;
8100 for (
const auto &md : *mn)
8102 index.addClassMemberNameToIndex(md.get());
8103 if (md->getModuleDef())
8105 index.addModuleMemberNameToIndex(md.get());
8113 for (
const auto &md : *mn)
8115 if (md->getNamespaceDef())
8117 index.addNamespaceMemberNameToIndex(md.get());
8121 index.addFileMemberNameToIndex(md.get());
8123 if (md->getModuleDef())
8125 index.addModuleMemberNameToIndex(md.get());
8130 index.sortMemberIndexLists();
8139 if (cd->isLinkableInProject())
8152 if (cd->isLinkableInProject())
8165 if (nd->isLinkableInProject())
8178 for (
const auto &fd : *fn)
8194 std::string s = title.
str();
8195 static const reg::Ex re(R
"(\a[\w-]*)");
8198 for (; it!=
end ; ++it)
8200 const auto &match = *it;
8201 std::string matchStr = match.str();
8209 if (gd->isLinkableInProject())
8211 addWordsForTitle(gd.get(),gd->anchor(),gd->groupTitle());
8217 if (pd->isLinkableInProject())
8219 addWordsForTitle(pd.get(),pd->anchor(),pd->title());
8239 if (md->getClassDef())
8243 if (md->getNamespaceDef())
8254 if (md->getGroupDef()) scope = md->getGroupDef();
8255 else if (md->getClassDef()) scope = md->getClassDef();
8256 else if (md->getNamespaceDef()) scope = md->getNamespaceDef();
8257 else if (md->getFileDef()) scope = md->getFileDef();
8263 if (md->isLinkableInProject())
8265 if (!(md->isEnumerate() && md->isAnonymous()))
8270 if (md->isEnumerate())
8272 for (
const auto &fmd : md->enumFieldList())
8285 for (
const auto &md : *mn)
8287 addMemberToIndices(md.get());
8294 for (
const auto &md : *mn)
8296 addMemberToIndices(md.get());
8309 for (
const auto &imd : *mn)
8322 for (
const auto &imd : *mn)
8339 for (
const auto &imd : *mn)
8348 const auto &bmni = bmn.
find(mn->memberName());
8351 for (
const auto &ibmd : *bmni)
8419 if (cd->isLinkable())
8421 for (
const auto &bcd : cd->baseClasses())
8437 for (
const auto &ti : cd->getTemplateInstances())
8456 int i=cd->name().find(
'(');
8463 AUTO_TRACE_ADD(
"merging members of category {} into {}",cd->name(),baseClass->
name());
8478 cd->subClasses().empty() &&
8479 !cd->baseClasses().empty())
8510 msg(
"Generating code for file {}...\n",fd->
docName());
8515 else if (parseSources)
8517 msg(
"Parsing code for file {}...\n",fd->
docName());
8533 for (
const auto &fd : *fn)
8541 for (
const auto &fd : *fn)
8550 clangParser->parse();
8551 processSourceFile(fd.get(),*
g_outputList,clangParser.get());
8553 for (
auto incFile : clangParser->filesInSameTU())
8555 if (filesToProcess.find(incFile)!=filesToProcess.end() &&
8557 processedFiles.
find(incFile)==processedFiles.end())
8564 processSourceFile(ifd,*
g_outputList,clangParser.get());
8565 processedFiles.insert(incFile);
8576 for (
const auto &fd : *fn)
8578 if (processedFiles.find(fd->
absFilePath().
str())==processedFiles.end())
8583 clangParser->parse();
8584 processSourceFile(fd.get(),*
g_outputList,clangParser.get());
8597 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8600 msg(
"Generating code files using {} threads.\n",numThreads);
8601 struct SourceContext
8604 : fd(fd_), generateSourceFile(gen_), ol(ol_) {}
8606 bool generateSourceFile;
8610 std::vector< std::future< std::shared_ptr<SourceContext> > > results;
8613 for (
const auto &fd : *fn)
8616 auto ctx = std::make_shared<SourceContext>(fd.get(),generateSourceFile,*
g_outputList);
8617 auto processFile = [ctx]()
8619 if (ctx->generateSourceFile)
8621 msg(
"Generating code for file {}...\n",ctx->fd->docName());
8625 msg(
"Parsing code for file {}...\n",ctx->fd->docName());
8628 ctx->fd->getAllIncludeFilesRecursively(filesInSameTu);
8629 if (ctx->generateSourceFile)
8631 ctx->fd->writeSourceHeader(ctx->ol);
8632 ctx->fd->writeSourceBody(ctx->ol,
nullptr);
8633 ctx->fd->writeSourceFooter(ctx->ol);
8638 ctx->fd->parseSource(
nullptr);
8642 results.emplace_back(threadPool.
queue(processFile));
8645 for (
auto &f : results)
8654 for (
const auto &fd : *fn)
8674 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8680 : fd(fd_), ol(ol_) {}
8685 std::vector< std::future< std::shared_ptr<DocContext> > > results;
8688 for (
const auto &fd : *fn)
8690 bool doc = fd->isLinkableInProject();
8693 auto ctx = std::make_shared<DocContext>(fd.get(),*
g_outputList);
8694 auto processFile = [ctx]() {
8695 msg(
"Generating docs for file {}...\n",ctx->fd->docName());
8696 ctx->fd->writeDocumentation(ctx->ol);
8699 results.emplace_back(threadPool.
queue(processFile));
8703 for (
auto &f : results)
8712 for (
const auto &fd : *fn)
8714 bool doc = fd->isLinkableInProject();
8717 msg(
"Generating docs for file {}...\n",fd->docName());
8736 const_cast<FileDef*
>(fd)->addSourceRef(cd->getStartDefLine(),cd.get(),
nullptr);
8745 const_cast<FileDef*
>(fd)->addSourceRef(cd->getStartDefLine(),cd.get(),
nullptr);
8754 const_cast<FileDef*
>(fd)->addSourceRef(nd->getStartDefLine(),nd.get(),
nullptr);
8761 for (
const auto &md : *mn)
8770 md->isLinkableInProject() &&
8776 const_cast<FileDef*
>(fd)->addSourceRef(md->getStartDefLine(),md->getOuterScope(),md.get());
8782 for (
const auto &md : *mn)
8792 md->isLinkableInProject() &&
8798 const_cast<FileDef*
>(fd)->addSourceRef(md->getStartDefLine(),md->getOuterScope(),md.get());
8815 for (
const auto &def : it->second)
8818 def.fileName,def.lineNr,def.columnNr,
8819 "#define",def.name,def.args,
QCString(),
8824 if (!def.args.isEmpty())
8828 mmd->setInitializer(def.definition);
8829 mmd->setFileDef(def.fileDef);
8830 mmd->setDefinition(
"#define "+def.name);
8835 def.fileDef->insertMember(md.get());
8837 AUTO_TRACE_ADD(
"adding macro {} with definition {}",def.name,def.definition);
8871 for (
const auto &fd : *fn)
8873 fd->sortMemberLists();
8880 gd->sortMemberLists();
8897 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8901 std::vector < std::future< void > > results;
8905 for (
const auto &def : symList)
8908 if (dm && !
isSymbolHidden(def) && !def->isArtificial() && def->isLinkableInProject())
8910 auto processTooltip = [dm]() {
8913 results.emplace_back(threadPool.
queue(processTooltip));
8918 for (
auto &f : results)
8927 for (
const auto &def : symList)
8930 if (dm && !
isSymbolHidden(def) && !def->isArtificial() && def->isLinkableInProject())
8977 for (
const auto &fd : *fn)
8999 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
9005 : cd(cd_), ol(ol_) {}
9010 std::vector< std::future< std::shared_ptr<DocContext> > > results;
9011 for (
const auto &cd : classList)
9014 if (cd->getOuterScope()==
nullptr ||
9018 auto ctx = std::make_shared<DocContext>(cd,*
g_outputList);
9019 auto processFile = [ctx]()
9021 msg(
"Generating docs for compound {}...\n",ctx->cd->displayName());
9025 if (!ctx->cd->isHidden() && !ctx->cd->isEmbeddedInOuterScope() &&
9026 ctx->cd->isLinkableInProject() && !ctx->cd->isImplicitTemplateInstance())
9028 ctx->cd->writeDocumentation(ctx->ol);
9029 ctx->cd->writeMemberList(ctx->ol);
9033 ctx->cd->writeDocumentationForInnerClasses(ctx->ol);
9036 results.emplace_back(threadPool.
queue(processFile));
9039 for (
auto &f : results)
9046 for (
const auto &cd : classList)
9050 if (cd->getOuterScope()==
nullptr ||
9056 if ( !cd->isHidden() && !cd->isEmbeddedInOuterScope() &&
9057 cd->isLinkableInProject() && !cd->isImplicitTemplateInstance())
9059 msg(
"Generating docs for compound {}...\n",cd->displayName());
9074 for (
const auto &innerCdi : cd->
getClasses())
9079 AUTO_TRACE(
"innerCd={} isLinkable={} isImplicitTemplateInstance={} protectLevelVisible={} embeddedInOuterScope={}",
9088 list.push_back(innerCd);
9096 std::vector<ClassDefMutable*> classList;
9145 for (
const auto &imd : *mn)
9181 for (
const auto &fd : *fn)
9183 fd->combineUsingRelations();
9215 for (
const auto &fd : *fn)
9217 fd->addMembersToMemberGroup();
9232 gd->addMembersToMemberGroup();
9253 for (
const auto &fd : *fn)
9255 fd->distributeMemberGroupDocumentation();
9270 gd->distributeMemberGroupDocumentation();
9300 for (
const auto &fd : *fn)
9302 fd->findSectionsInDocumentation();
9317 gd->findSectionsInDocumentation();
9322 pd->findSectionsInDocumentation();
9343 elementsToRemove.push_back(ci.first);
9346 for (
const auto &k : elementsToRemove)
9357 for (
const auto &ifmd : *fn)
9371 for (
const auto &imd : *nm)
9403 elementsToRemove.push_back(ci.first);
9406 for (
const auto &k : elementsToRemove)
9415 for (
const auto &ifmd : *fn)
9428 for (
const auto &imd : *nm)
9496 mmd->setTagInfo(root->
tagInfo());
9497 mmd->setLanguage(root->
lang);
9508 for (
const auto &md : *mn)
9514 for (
const auto &imd : *mn)
9532 for (
const auto &imd : *mn)
9559 warn(root->
fileName,root->
startLine,
"found documented #define {} but ignoring it because ENABLE_PREPROCESSING is NO.", root->
name);
9573 normalizedName =
substitute(normalizedName,
"\\",
"/");
9576 if (root->
docFile==normalizedName)
9578 int lastSlashPos=normalizedName.
findRev(
'/');
9579 if (lastSlashPos!=-1)
9581 normalizedName=normalizedName.
left(lastSlashPos);
9584 if (normalizedName.
at(normalizedName.
length()-1)!=
'/')
9586 normalizedName+=
'/';
9588 DirDef *matchingDir=
nullptr;
9592 if (dir->name().right(normalizedName.
length())==normalizedName)
9597 "\\dir command matches multiple directories.\n"
9598 " Applying the command for directory {}\n"
9599 " Ignoring the command for directory {}",
9600 matchingDir->
name(),dir->name()
9605 matchingDir=dir.get();
9620 warn(root->
fileName,root->
startLine,
"No matching directory found for command \\dir {}",normalizedName);
9632 if (root->
section.isPageDoc())
9639 else if (root->
section.isMainpageDoc())
9659 if (root->
section.isMainpageDoc())
9692 else if (si->
lineNr() != -1)
9694 warn(root->
fileName,root->
startLine,
"multiple use of section label '{}' for main page, (first occurrence: {}, line {})",
9699 warn(root->
fileName,root->
startLine,
"multiple use of section label '{}' for main page, (first occurrence: {})",
9716 else if (root->
tagInfo()==
nullptr)
9719 "found more than one \\mainpage comment block! (first occurrence: {}, line {}), Skipping current block!",
9729 if (root->
section.isMainpageDoc())
9753 term(
"page defined {} with label {} is a direct "
9754 "subpage of itself! Please remove this cyclic dependency.\n",
9778 term(
"page defined {} with label {} is a subpage "
9779 "of itself! Please remove this cyclic dependency.\n",
9780 warn_line(pd->docFile(),pd->docLine()),pd->name());
9806 if (si->label().left(label.
length())==label)
9808 si->setFileName(rl->listName());
9809 si->setGenerated(
TRUE);
9815 if (!si->generated())
9819 if (!si->fileName().isEmpty() &&
9826 if (si->definition())
9833 gd = (
toMemberDef(si->definition()))->getGroupDef();
9863 if (!pd->getGroupDef() && !pd->isReference())
9865 msg(
"Generating docs for page {}...\n",pd->name());
9880 warn(root->
fileName,root->
startLine,
"Example {} was already documented. Ignoring documentation found here.",root->
name);
9908 indentStr.
fill(
' ',indent);
9910 indentStr.
isEmpty()?
"":indentStr,
9915 for (
const auto &e : root->
children())
9933 si->label(),si->fileName(),si->title(),si->type().level(),si->ref());
9947 msg(
"Generating docs for example {}...\n",pd->name());
9953 intf->resetCodeParserState();
9955 QCString n=pd->getOutputFileBase();
9962 if (pd->showLineNo())
9964 lineNoOptStr=
"{lineno}";
9970 (pd->briefDescription().isEmpty()?
"":pd->briefDescription()+
"\n\n")+
9971 pd->documentation()+
"\n\n\\include"+lineNoOptStr+
" "+pd->name(),
9991 if (!gd->isReference())
10003 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10009 : cdm(cdm_), ol(ol_) {}
10014 std::vector< std::future< std::shared_ptr<DocContext> > > results;
10016 for (
const auto &cd : classList)
10021 auto ctx = std::make_shared<DocContext>(cdm,*
g_outputList);
10022 auto processFile = [ctx]()
10024 if ( ( ctx->cdm->isLinkableInProject() &&
10025 !ctx->cdm->isImplicitTemplateInstance()
10028 && !ctx->cdm->isHidden() && !ctx->cdm->isEmbeddedInOuterScope()
10031 msg(
"Generating docs for compound {}...\n",ctx->cdm->displayName());
10032 ctx->cdm->writeDocumentation(ctx->ol);
10033 ctx->cdm->writeMemberList(ctx->ol);
10035 ctx->cdm->writeDocumentationForInnerClasses(ctx->ol);
10038 results.emplace_back(threadPool.
queue(processFile));
10042 for (
auto &f : results)
10044 auto ctx = f.get();
10050 for (
const auto &cd : classList)
10055 if ( ( cd->isLinkableInProject() &&
10056 !cd->isImplicitTemplateInstance()
10059 && !cd->isHidden() && !cd->isEmbeddedInOuterScope()
10062 msg(
"Generating docs for compound {}...\n",cd->displayName());
10076 for (
const auto &cd : conceptList)
10081 msg(
"Generating docs for concept {}...\n",cd->name());
10096 if (nd->isLinkableInProject())
10101 msg(
"Generating docs for namespace {}\n",nd->displayName());
10139 QCString cmd=qhgLocation+
" -v 2>&1";
10144 err(
"could not execute {}\n",qhgLocation);
10148 const size_t bufSize = 1024;
10149 char inBuf[bufSize+1];
10150 size_t numRead=fread(inBuf,1,bufSize,f);
10151 inBuf[numRead] =
'\0';
10156 static const reg::Ex versionReg(R
"(Qt (\d+)\.(\d+)\.(\d+))");
10158 std::string s = inBuf;
10165 if (qtVersion>0 && (qtVersion<60000 || qtVersion >= 60205))
10174 err(
"could not execute {}\n",qhgLocation);
10178 std::string output;
10179 while ((numRead=fread(inBuf,1,bufSize,f))>0)
10181 inBuf[numRead] =
'\0';
10213 warn_uncond(
"the dot tool could not be found as '{}'\n",dotPath);
10219 size_t l=dotPath.
length();
10220 for (
size_t i=0;i<l;i++)
if (dotPath.
at(i)==
'/') dotPath.
at(i)=
'\\';
10239 bool updateOnly=
FALSE)
10243 bool writeToStdout=configFile==
"-";
10248 if (!writeToStdout)
10252 msg(
"\n\nConfiguration file '{}' created.\n\n",configFile);
10253 msg(
"Now edit the configuration file and enter\n\n");
10254 if (configFile!=
"Doxyfile" && configFile!=
"doxyfile")
10255 msg(
" doxygen {}\n\n",configFile);
10257 msg(
" doxygen\n\n");
10258 msg(
"to generate the documentation for your project\n\n");
10262 msg(
"\n\nConfiguration file '{}' updated.\n\n",configFile);
10268 term(
"Cannot open file {} for writing\n",configFile);
10283 term(
"Cannot open stdout for writing\n");
10294 int eqPos = tagLine.
find(
'=');
10304 fileName = tagLine;
10310 err(
"Tag file '{}' does not exist or is not a file. Skipping it...\n",fileName);
10321 msg(
"Reading tag file '{}', location '{}'...\n",fileName,destName);
10325 msg(
"Reading tag file '{}'...\n",fileName);
10335 for (
const auto &sheet : latexExtraStyleSheet)
10337 std::string fileName = sheet;
10338 if (!fileName.empty())
10343 err(
"Style sheet '{}' specified by LATEX_EXTRA_STYLESHEET does not exist!\n",fileName);
10345 else if (fi.
isDir())
10347 err(
"Style sheet '{}' specified by LATEX_EXTRA_STYLESHEET is a directory, it has to be a file!\n", fileName);
10366 if (!htmlStyleSheet.
isEmpty())
10373 err(
"Style sheet '{}' specified by HTML_STYLESHEET does not exist!\n",htmlStyleSheet);
10376 else if (fi.
isDir())
10378 err(
"Style sheet '{}' specified by HTML_STYLESHEET is a directory, it has to be a file!\n",htmlStyleSheet);
10384 copyFile(htmlStyleSheet,destFileName);
10389 for (
const auto &sheet : htmlExtraStyleSheet)
10397 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET does not exist!\n",fileName);
10401 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET is already a built-in stylesheet. Please use a different name\n",fi.
fileName());
10403 else if (fi.
isDir())
10405 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET is a directory, it has to be a file!\n",fileName);
10424 err(
"Project logo '{}' specified by PROJECT_LOGO does not exist!\n",projectLogo);
10427 else if (fi.
isDir())
10429 err(
"Project logo '{}' specified by PROJECT_LOGO is a directory, it has to be a file!\n",projectLogo);
10435 copyFile(projectLogo,destFileName);
10449 err(
"Project icon '{}' specified by PROJECT_ICON does not exist!\n",projectIcon);
10452 else if (fi.
isDir())
10454 err(
"Project icon '{}' specified by PROJECT_ICON is a directory, it has to be a file!\n",projectIcon);
10460 copyFile(projectIcon,destFileName);
10468 for (
const auto &fileName : files)
10470 if (!fileName.empty())
10475 err(
"Extra file '{}' specified in {} does not exist!\n", fileName,filesOption);
10477 else if (fi.
isDir())
10479 err(
"Extra file '{}' specified in {} is a directory, it has to be a file!\n", fileName,filesOption);
10505 std::vector<FileEntry> fileEntries;
10506 for (
const auto &fd : *fn)
10508 if (!fd->isReference())
10510 fileEntries.emplace_back(fd->getPath(),fd.get());
10514 size_t size = fileEntries.size();
10518 FileDef *fd = fileEntries[0].fileDef;
10524 std::stable_sort(fileEntries.begin(),
10526 [](
const FileEntry &fe1,
const FileEntry &fe2)
10527 { return qstricmp_sort(fe1.path,fe2.path)<0; }
10532 const FileEntry &first = fileEntries[0];
10533 const FileEntry &last = fileEntries[size-1];
10534 int first_path_size =
static_cast<int>(first.path.size())-1;
10535 int last_path_size =
static_cast<int>(last.path.size())-1;
10538 for (i=0;i<first_path_size && i<last_path_size;i++)
10540 if (first.path[i]==
'/') j=i;
10541 if (first.path[i]!=last.path[i])
break;
10543 if (i==first_path_size && i<last_path_size && last.path[i]==
'/')
10548 else if (i==last_path_size && i<first_path_size && first.path[i]==
'/')
10555 for (
auto &fileEntry : fileEntries)
10557 QCString prefix = fileEntry.path.right(fileEntry.path.length()-j-1);
10558 fileEntry.fileDef->setName(
prefix+fn->fileName());
10560 fileEntry.fileDef->setDiskName(
prefix+fn->fileName());
10574 int sep = fileName.
findRev(
'/');
10575 int ei = fileName.
findRev(
'.');
10576 if (ei!=-1 && (sep==-1 || ei>sep))
10582 extension =
".no_extension";
10595 int ei = fileName.
findRev(
'.');
10602 extension =
".no_extension";
10606 std::string preBuf;
10613 for (
const auto &s : includePath)
10619 msg(
"Preprocessing {}...\n",fn);
10626 msg(
"Reading {}...\n",fn);
10631 std::string convBuf;
10632 convBuf.reserve(preBuf.size()+1024);
10637 std::shared_ptr<Entry> fileRoot = std::make_shared<Entry>();
10641 if (newTU) clangParser->
parse();
10644 parser.
parseInput(fileName,convBuf.
data(),fileRoot,clangParser);
10645 fileRoot->setFileDef(fd);
10662 filesToProcess.insert(s);
10665 std::mutex processedFilesLock;
10667 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10668 msg(
"Processing input using {} threads.\n",numThreads);
10670 using FutureType = std::vector< std::shared_ptr<Entry> >;
10671 std::vector< std::future< FutureType > > results;
10674 bool ambig =
false;
10680 auto processFile = [s,&filesToProcess,&processedFilesLock,&processedFiles]() {
10681 bool ambig_l =
false;
10682 std::vector< std::shared_ptr<Entry> > roots;
10686 auto fileRoot {
parseFile(*parser.get(),fd_l,s.c_str(),clangParser.get(),
true) };
10687 roots.push_back(fileRoot);
10691 for (
auto incFile : clangParser->filesInSameTU())
10693 if (filesToProcess.find(incFile)!=filesToProcess.end())
10695 bool needsToBeProcessed =
false;
10697 std::lock_guard<std::mutex> lock(processedFilesLock);
10698 needsToBeProcessed = processedFiles.find(incFile)==processedFiles.end();
10699 if (needsToBeProcessed) processedFiles.insert(incFile);
10701 if (incFile!=s && needsToBeProcessed)
10707 fileRoot =
parseFile(*parser.get(),ifd,incFile.c_str(),clangParser.get(),
false);
10708 roots.push_back(fileRoot);
10716 results.emplace_back(threadPool.
queue(processFile));
10720 for (
auto &f : results)
10725 root->moveToSubEntryAndKeep(e);
10732 if (processedFiles.find(s)==processedFiles.end())
10735 auto processFile = [s]() {
10736 bool ambig =
false;
10737 std::vector< std::shared_ptr<Entry> > roots;
10744 auto fileRoot =
parseFile(*parser.get(),fd,s.c_str(),clangParser.get(),
true);
10745 roots.push_back(fileRoot);
10749 auto fileRoot =
parseFile(*parser.get(),fd,s.c_str(),
nullptr,
true);
10750 roots.push_back(fileRoot);
10754 results.emplace_back(threadPool.
queue(processFile));
10758 for (
auto &f : results)
10763 root->moveToSubEntryAndKeep(e);
10770 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10771 msg(
"Processing input using {} threads.\n",numThreads);
10773 using FutureType = std::shared_ptr<Entry>;
10774 std::vector< std::future< FutureType > > results;
10778 auto processFile = [s]() {
10779 bool ambig =
false;
10782 auto fileRoot =
parseFile(*parser.get(),fd,s.c_str(),
nullptr,
true);
10786 results.emplace_back(threadPool.
queue(processFile));
10789 for (
auto &f : results)
10791 root->moveToSubEntryAndKeep(f.get());
10809 filesToProcess.insert(s);
10815 bool ambig =
false;
10822 auto fileRoot =
parseFile(*parser.get(),fd,s.c_str(),clangParser.get(),
true);
10823 root->moveToSubEntryAndKeep(fileRoot);
10824 processedFiles.insert(s);
10828 for (
auto incFile : clangParser->filesInSameTU())
10831 if (filesToProcess.find(incFile)!=filesToProcess.end() &&
10832 processedFiles.find(incFile)==processedFiles.end())
10838 fileRoot =
parseFile(*parser.get(),ifd,incFile.c_str(),clangParser.get(),
false);
10839 root->moveToSubEntryAndKeep(fileRoot);
10840 processedFiles.insert(incFile);
10849 if (processedFiles.find(s)==processedFiles.end())
10851 bool ambig =
false;
10857 auto fileRoot =
parseFile(*parser.get(),fd,s.c_str(),clangParser.get(),
true);
10858 root->moveToSubEntryAndKeep(fileRoot);
10862 std::unique_ptr<OutlineParserInterface> parser {
getParserForFile(s.c_str()) };
10863 std::shared_ptr<Entry> fileRoot =
parseFile(*parser.get(),fd,s.c_str(),
nullptr,
true);
10864 root->moveToSubEntryAndKeep(fileRoot);
10866 processedFiles.insert(s);
10875 bool ambig =
false;
10878 std::unique_ptr<OutlineParserInterface> parser {
getParserForFile(s.c_str()) };
10879 std::shared_ptr<Entry> fileRoot =
parseFile(*parser.get(),fd,s.c_str(),
nullptr,
true);
10880 root->moveToSubEntryAndKeep(std::move(fileRoot));
10900 sepPos = result.
find(
'/',2);
10902 sepPos = result.
find(
'/',sepPos+1);
10904 sepPos = result.
find(
'/',sepPos+1);
10907 if (nonSymlinks.find(
prefix.str())==nonSymlinks.end())
10924 target+=result.
mid(sepPos);
10927 if (known.find(result.
str())!=known.end())
return std::string();
10928 known.insert(result.
str());
10941 nonSymlinks.insert(
prefix.str());
10947 while (sepPos!=-1);
10966 bool errorIfNotExist,
10973 if (paths && !dirName.empty())
10975 paths->insert(dirName);
10981 if (dirName.empty())
10996 msg(
"Searching for files in directory {}\n", fi->
absFilePath());
11001 for (
const auto &dirEntry : dir.
iterator())
11004 if (exclSet==
nullptr || exclSet->find(cfi.
absFilePath())==exclSet->end())
11012 if (errorIfNotExist)
11017 else if (cfi.
isFile() &&
11019 (exclPatList==
nullptr || !
patternMatch(cfi,*exclPatList)) &&
11020 (killSet==
nullptr || killSet->find(cfi.
absFilePath())==killSet->end())
11024 std::string path=cfi.
dirPath()+
"/";
11025 std::string fullName=path+name;
11033 fn->push_back(std::move(fd));
11036 dirResultList.push_back(fullName);
11037 if (resultSet) resultSet->insert(fullName);
11038 if (killSet) killSet->insert(fullName);
11040 else if (recursive &&
11042 (exclPatList==
nullptr || !
patternMatch(cfi,*exclPatList)) &&
11047 patList,exclPatList,&dirResultList,resultSet,errorIfNotExist,
11048 recursive,killSet,paths);
11052 if (resultList && !dirResultList.empty())
11055 std::stable_sort(dirResultList.begin(),
11056 dirResultList.end(),
11057 [](
const auto &f1,
const auto &f2) { return qstricmp_sort(f1.c_str(),f2.c_str())<0; });
11060 resultList->insert(resultList->end(), dirResultList.begin(), dirResultList.end());
11077 bool errorIfNotExist,
11091 if (exclSet==
nullptr || exclSet->find(fi.
absFilePath())==exclSet->end())
11098 if (errorIfNotExist)
11100 warn_uncond(
"source '{}' is not a readable file or directory... skipping.\n",s);
11105 std::string dirPath = fi.
dirPath(
true);
11107 if (paths && !dirPath.empty())
11109 paths->insert(dirPath);
11112 if (killSet==
nullptr || killSet->find(filePath)==killSet->end())
11121 fn->push_back(std::move(fd));
11124 if (resultList || resultSet)
11126 if (resultList) resultList->push_back(filePath);
11127 if (resultSet) resultSet->insert(filePath);
11133 else if (fi.
isDir())
11135 readDir(&fi,fnMap,exclSet,patList,
11136 exclPatList,resultList,resultSet,errorIfNotExist,
11137 recursive,killSet,paths);
11151 anchor=
":"+md->
anchor();
11160 t <<
"REPLACE INTO symbols (symbol_id,scope_id,name,file,line) VALUES('"
11161 << fn+anchor <<
"','"
11163 << d->
name() <<
"','"
11177 for (
const auto &def : symList)
11189 msg(
"Developer parameters:\n");
11190 msg(
" -m dump symbol map\n");
11191 msg(
" -b making messages output unbuffered\n");
11192 msg(
" -c <file> process input file as a comment block and produce HTML output\n");
11194 msg(
" -t [<file|stdout|stderr>] trace debug info to file, stdout, or stderr (default file stdout)\n");
11195 msg(
" -t_time [<file|stdout|stderr>] trace debug info to file, stdout, or stderr (default file stdout),\n"
11196 " and include time and thread information\n");
11198 msg(
" -d <level> enable a debug level, such as (multiple invocations of -d are possible):\n");
11209 QCString versionString = getFullVersion();
11210 msg(
"{}\n",versionString);
11214 if (!extVers.
isEmpty()) extVers+=
", ";
11215 extVers +=
"sqlite3 ";
11216 extVers += sqlite3_libversion();
11218 if (!extVers.
isEmpty()) extVers+=
", ";
11219 extVers +=
"clang support ";
11220 extVers += CLANG_VERSION_STRING;
11224 int lastComma = extVers.
findRev(
',');
11225 if (lastComma != -1) extVers = extVers.
replace(lastComma,1,
" and");
11226 msg(
" with {}.\n",extVers);
11237 msg(
"Doxygen version {0}\nCopyright Dimitri van Heesch 1997-2025\n\n"
11238 "You can use Doxygen in a number of ways:\n\n"
11239 "1) Use Doxygen to generate a template configuration file*:\n"
11240 " {1} [-s] -g [configName]\n\n"
11241 "2) Use Doxygen to update an old configuration file*:\n"
11242 " {1} [-s] -u [configName]\n\n"
11243 "3) Use Doxygen to generate documentation using an existing "
11244 "configuration file*:\n"
11245 " {1} [configName]\n\n"
11246 "4) Use Doxygen to generate a template file controlling the layout of the\n"
11247 " generated documentation:\n"
11248 " {1} -l [layoutFileName]\n\n"
11249 " In case layoutFileName is omitted DoxygenLayout.xml will be used as filename.\n"
11250 " If - is used for layoutFileName Doxygen will write to standard output.\n\n"
11251 "5) Use Doxygen to generate a template style sheet file for RTF, HTML or Latex.\n"
11252 " RTF: {1} -w rtf styleSheetFile\n"
11253 " HTML: {1}-w html headerFile footerFile styleSheetFile [configFile]\n"
11254 " LaTeX: {1} -w latex headerFile footerFile styleSheetFile [configFile]\n\n"
11255 "6) Use Doxygen to generate a rtf extensions file\n"
11256 " {1} -e rtf extensionsFile\n\n"
11257 " If - is used for extensionsFile Doxygen will write to standard output.\n\n"
11258 "7) Use Doxygen to compare the used configuration file with the template configuration file\n"
11259 " {1} -x [configFile]\n\n"
11260 " Use Doxygen to compare the used configuration file with the template configuration file\n"
11261 " without replacing the environment variables or CMake type replacement variables\n"
11262 " {1} -x_noenv [configFile]\n\n"
11263 "8) Use Doxygen to show a list of built-in emojis.\n"
11264 " {1} -f emoji outputFileName\n\n"
11265 " If - is used for outputFileName Doxygen will write to standard output.\n\n"
11266 "*) If -s is specified the comments of the configuration items in the config file will be omitted.\n"
11267 " If configName is omitted 'Doxyfile' will be used as a default.\n"
11268 " If - is used for configFile Doxygen will write / read the configuration to /from standard output / input.\n\n"
11269 "If -q is used for a Doxygen documentation run, Doxygen will see this as if QUIET=YES has been set.\n\n"
11270 "-v print version string, -V print extended version information\n"
11271 "-h,-? prints usage help information\n"
11272 "{1} -d prints additional usage flags for debugging purposes\n",versionString,name);
11279static const char *
getArg(
int argc,
char **argv,
int &optInd)
11282 if (
qstrlen(&argv[optInd][2])>0)
11283 s=&argv[optInd][2];
11284 else if (optInd+1<argc && argv[optInd+1][0]!=
'-')
11303 return []() {
return std::make_unique<T>(); };
11311 std::setlocale(LC_ALL,
"");
11312 std::setlocale(LC_CTYPE,
"C");
11313 std::setlocale(LC_NUMERIC,
"C");
11412 while (v!=0) v>>=1,r++;
11416 return std::max(0,std::min(r-16,9));
11421 QCString versionString = getFullVersion();
11424 auto writeFile = [](
const char *fileName,std::function<void(
TextStream&)> func) ->
bool
11444 bool genConfig=
false;
11445 bool shortList=
false;
11446 bool traceTiming=
false;
11448 bool updateConfig=
false;
11449 bool quiet =
false;
11450 while (optInd<argc && argv[optInd][0]==
'-' &&
11451 (isalpha(argv[optInd][1]) || argv[optInd][1]==
'?' ||
11452 argv[optInd][1]==
'-')
11455 switch(argv[optInd][1])
11465 if (optInd+1>=argc)
11467 layoutName=
"DoxygenLayout.xml";
11471 layoutName=argv[optInd+1];
11479 if (optInd+1>=argc)
11481 err(
"option \"-c\" is missing the file name to read\n");
11506 err(
"option \"-d\" has unknown debug specifier: \"{}\".\n",debugLabel);
11516 if (!strcmp(argv[optInd]+1,
"t_time"))
11518 traceTiming =
true;
11520 else if (!strcmp(argv[optInd]+1,
"t"))
11522 traceTiming =
false;
11526 err(
"option should be \"-t\" or \"-t_time\", found: \"{}\".\n",argv[optInd]);
11530 if (optInd+1>=argc || argv[optInd+1][0] ==
'-')
11532 traceName=
"stdout";
11536 traceName=argv[optInd+1];
11540 err(
"support for option \"-t\" has not been compiled in (use a debug build or a release build with tracing enabled).\n");
11551 err(
"option should be \"-x\" or \"-x_noenv\", found: \"{}\".\n",argv[optInd]);
11567 err(
"option \"-e\" is missing format specifier rtf.\n");
11573 if (optInd+1>=argc)
11575 err(
"option \"-e rtf\" is missing an extensions file name\n");
11583 err(
"option \"-e\" has invalid format specifier.\n");
11593 err(
"option \"-f\" is missing list specifier.\n");
11599 if (optInd+1>=argc)
11601 err(
"option \"-f emoji\" is missing an output file name\n");
11609 err(
"option \"-f\" has invalid list specifier.\n");
11619 err(
"option \"-w\" is missing format specifier rtf, html or latex\n");
11625 if (optInd+1>=argc)
11627 err(
"option \"-w rtf\" is missing a style sheet file name\n");
11633 err(
"error opening RTF style sheet file {}!\n",argv[optInd+1]);
11643 if (optInd+4<argc ||
FileInfo(
"Doxyfile").exists() ||
FileInfo(
"doxyfile").exists())
11649 err(
"error opening or reading configuration file {}!\n",argv[optInd+4]);
11654 if (optInd+3>=argc)
11656 err(
"option \"-w html\" does not have enough arguments\n");
11673 if (optInd+4<argc ||
FileInfo(
"Doxyfile").exists() ||
FileInfo(
"doxyfile").exists())
11678 err(
"error opening or reading configuration file {}!\n",argv[optInd+4]);
11683 if (optInd+3>=argc)
11685 err(
"option \"-w latex\" does not have enough arguments\n");
11701 err(
"Illegal format specifier \"{}\": should be one of rtf, html or latex\n",formatName);
11721 if (
qstrcmp(&argv[optInd][2],
"help")==0)
11723 usage(argv[0],versionString);
11726 else if (
qstrcmp(&argv[optInd][2],
"version")==0)
11732 else if ((
qstrcmp(&argv[optInd][2],
"Version")==0) ||
11733 (
qstrcmp(&argv[optInd][2],
"VERSION")==0))
11741 err(
"Unknown option \"-{}\"\n",&argv[optInd][1]);
11742 usage(argv[0],versionString);
11747 setvbuf(stdout,
nullptr,_IONBF,0);
11754 usage(argv[0],versionString);
11758 err(
"Unknown option \"-{:c}\"\n",argv[optInd][1]);
11759 usage(argv[0],versionString);
11770 TRACE(
"Doxygen version used: {}",getFullVersion());
11773 FileInfo configFileInfo1(
"Doxyfile"),configFileInfo2(
"doxyfile");
11776 if (configFileInfo1.exists())
11778 configName=
"Doxyfile";
11780 else if (configFileInfo2.
exists())
11782 configName=
"doxyfile";
11784 else if (genConfig)
11786 configName=
"Doxyfile";
11790 err(
"Doxyfile not found and no input file specified!\n");
11791 usage(argv[0],versionString);
11798 if (fi.
exists() ||
qstrcmp(argv[optInd],
"-")==0 || genConfig)
11800 configName=argv[optInd];
11804 err(
"configuration file {} not found!\n",argv[optInd]);
11805 usage(argv[0],versionString);
11819 err(
"could not open or read configuration file {}!\n",configName);
11890 for (
const auto &mapping : extMaps)
11892 QCString mapStr = mapping.c_str();
11893 int i=mapStr.
find(
'=');
11909 err(
"Failed to map file extension '{}' to unsupported language '{}'.\n"
11910 "Check the EXTENSION_MAPPING setting in the config file.\n",
11915 msg(
"Adding custom extension mapping: '{}' will be treated as language '{}'\n",
11924 if (cd==
reinterpret_cast<void *
>(-1))
11926 term(
"unsupported character conversion: '{}'->'UTF-8': {}\n"
11927 "Check the 'INPUT_ENCODING' setting in the config file!\n",
11937 for (
const auto &mapping : fileEncod)
11939 QCString mapStr = mapping.c_str();
11940 int i=mapStr.
find(
'=');
11954 if (cd==
reinterpret_cast<void *
>(-1))
11956 term(
"unsupported character conversion: '{}'->'UTF-8': {}\n"
11957 "Check the 'INPUT_FILE_ENCODING' setting in the config file!\n",
11958 encoding,strerror(errno));
11971 for (
const auto &s : expandAsDefinedList)
11989 signal(SIGINT,SIG_DFL);
11991 msg(
"Cleaning up...\n");
12006 if (generateTagFile.
isEmpty())
return;
12011 err(
"cannot open tag file {} for writing\n", generateTagFile);
12015 tagFile <<
"<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>\n";
12016 tagFile <<
"<tagfile doxygen_version=\"" << getDoxygenVersion() <<
"\"";
12017 std::string gitVersion = getGitVersion();
12018 if (!gitVersion.empty())
12020 tagFile <<
" doxygen_gitid=\"" << gitVersion <<
"\"";
12027 for (
const auto &fd : *fn)
12029 if (fd->isLinkableInProject()) fd->writeTagFile(tagFile);
12062 if (gd->isLinkableInProject()) gd->writeTagFile(tagFile);
12067 if (mod->isLinkableInProject()) mod->writeTagFile(tagFile);
12072 if (pd->isLinkableInProject()) pd->writeTagFile(tagFile);
12076 tagFile <<
"</tagfile>\n";
12084 msg(
"Exiting...\n");
12094 const char *defaultDirName)
12099 result = baseDirName + defaultDirName;
12101 else if (formatDirName[0]!=
'/' && (formatDirName.
length()==1 || formatDirName[1]!=
':'))
12103 result.
prepend(baseDirName+
"/");
12105 Dir formatDir(result.
str());
12108 term(
"Could not create output directory {}\n", result);
12122 g_s.begin(
"Searching for include files...\n");
12125 for (
const auto &s : includePathList)
12143 g_s.begin(
"Searching for example files...\n");
12146 for (
const auto &s : examplePathList)
12161 g_s.begin(
"Searching for images...\n");
12164 for (
const auto &s : imagePathList)
12179 g_s.begin(
"Searching for dot files...\n");
12182 for (
const auto &s : dotFileList)
12197 g_s.begin(
"Searching for msc files...\n");
12200 for (
const auto &s : mscFileList)
12215 g_s.begin(
"Searching for dia files...\n");
12218 for (
const auto &s : diaFileList)
12233 g_s.begin(
"Searching for plantuml files...\n");
12236 for (
const auto &s : plantUmlFileList)
12251 g_s.begin(
"Searching for files to exclude\n");
12253 for (
const auto &s : excludeList)
12271 g_s.begin(
"Searching INPUT for files to process...\n");
12275 for (
const auto &s : inputList)
12278 size_t l = path.
length();
12282 if (path.
at(l-1)==
'\\' || path.
at(l-1)==
'/') path=path.
left(l-1);
12302 [](
const auto &f1,
const auto &f2)
12308 if (fileName->size()>1)
12310 std::stable_sort(fileName->begin(),fileName->end(),[](
const auto &f1,
const auto &f2)
12312 return qstricmp_sort(f1->absFilePath(),f2->absFilePath())<0;
12318 warn_uncond(
"No files to be processed, please check your settings, in particular INPUT, FILE_PATTERNS, and RECURSIVE\n");
12329 if (mdfileAsMainPage.
isEmpty())
return;
12333 warn_uncond(
"Specified markdown mainpage '{}' does not exist\n",mdfileAsMainPage);
12336 bool ambig =
false;
12339 warn_uncond(
"Specified markdown mainpage '{}' has not been defined as input file\n",mdfileAsMainPage);
12358 QCString versionString = getFullVersion();
12359 msg(
"Doxygen version used: {}\n",versionString);
12369 if (outputDirectory.
isEmpty())
12375 Dir dir(outputDirectory.
str());
12379 if (!dir.
mkdir(outputDirectory.
str()))
12381 term(
"tag OUTPUT_DIRECTORY: Output directory '{}' does not "
12382 "exist and cannot be created\n",outputDirectory);
12386 msg(
"Notice: Output directory '{}' does not exist. "
12387 "I have created it for you.\n", outputDirectory);
12402 if (cacheSize<0) cacheSize=0;
12403 if (cacheSize>9) cacheSize=9;
12404 uint32_t lookupSize = 65536 << cacheSize;
12443 bool generateSitemap = !sitemapUrl.
isEmpty();
12444 if (generateSitemap && !sitemapUrl.
endsWith(
"/"))
12451 bool generateEclipseHelp =
Config_getBool(GENERATE_ECLIPSEHELP);
12465 if (generateDocbook)
12512 newFontPath+=curFontPath;
12528 bool defaultLayoutUsed =
FALSE;
12529 if (layoutFileName.
isEmpty())
12532 defaultLayoutUsed =
TRUE;
12534 AUTO_TRACE_ADD(
"defaultLayoutUsed={}, layoutFileName={}",defaultLayoutUsed,layoutFileName);
12539 msg(
"Parsing layout file {}...\n",layoutFileName);
12542 else if (!defaultLayoutUsed)
12544 warn_uncond(
"failed to open layout file '{}' for reading! Using default settings.\n",layoutFileName);
12554 if (generateHtml) exclPatterns.push_back(htmlOutput.
str());
12555 if (generateDocbook) exclPatterns.push_back(docbookOutput.
str());
12556 if (generateXml) exclPatterns.push_back(xmlOutput.
str());
12557 if (generateLatex) exclPatterns.push_back(latexOutput.
str());
12558 if (generateRtf) exclPatterns.push_back(rtfOutput.
str());
12559 if (generateMan) exclPatterns.push_back(manOutput.
str());
12579 if (generateDocbook)
12590 std::shared_ptr<Entry> root = std::make_shared<Entry>();
12594 msg(
"Reading and parsing tag files\n");
12596 for (
const auto &s : tagFileList)
12608 g_s.begin(
"Parsing files\n");
12648 g_s.begin(
"Building macro definition list...\n");
12652 g_s.begin(
"Building group list...\n");
12657 g_s.begin(
"Building directory list...\n");
12662 g_s.begin(
"Building namespace list...\n");
12667 g_s.begin(
"Building file list...\n");
12671 g_s.begin(
"Building class list...\n");
12675 g_s.begin(
"Building concept list...\n");
12683 g_s.begin(
"Computing nesting relations for classes...\n");
12696 g_s.begin(
"Associating documentation with classes...\n");
12700 g_s.begin(
"Associating documentation with concepts...\n");
12705 g_s.begin(
"Associating documentation with modules...\n");
12709 g_s.begin(
"Building example list...\n");
12713 g_s.begin(
"Searching for enumerations...\n");
12721 g_s.begin(
"Searching for documented typedefs...\n");
12727 g_s.begin(
"Searching for documented sequences...\n");
12731 g_s.begin(
"Searching for documented dictionaries...\n");
12736 g_s.begin(
"Searching for members imported via using declarations...\n");
12743 g_s.begin(
"Searching for included using directives...\n");
12747 g_s.begin(
"Searching for documented variables...\n");
12751 g_s.begin(
"Building interface member list...\n");
12754 g_s.begin(
"Building member list...\n");
12758 g_s.begin(
"Searching for friends...\n");
12762 g_s.begin(
"Searching for documented defines...\n");
12766 g_s.begin(
"Computing class inheritance relations...\n");
12771 g_s.begin(
"Computing class usage relations...\n");
12777 g_s.begin(
"Searching for tag less structs...\n");
12782 g_s.begin(
"Flushing cached template relations that have become invalid...\n");
12786 g_s.begin(
"Warn for undocumented namespaces...\n");
12790 g_s.begin(
"Computing class relations...\n");
12801 g_s.begin(
"Add enum values to enums...\n");
12806 g_s.begin(
"Searching for member function documentation...\n");
12818 g_s.begin(
"Creating members for template instances...\n");
12822 g_s.begin(
"Building page list...\n");
12826 g_s.begin(
"Search for main page...\n");
12831 g_s.begin(
"Computing page relations...\n");
12836 g_s.begin(
"Determining the scope of groups...\n");
12840 g_s.begin(
"Computing module relations...\n");
12842 mm.resolvePartitions();
12843 mm.resolveImports();
12844 mm.collectExportedSymbols();
12863 return i==0 ?
qstricmp_sort(c1->name(), c2->name())<0 : i<0;
12877 g_s.begin(
"Sorting lists...\n");
12898 g_s.begin(
"Determining which enums are documented\n");
12902 g_s.begin(
"Computing member relations...\n");
12907 g_s.begin(
"Building full member lists recursively...\n");
12911 g_s.begin(
"Adding members to member groups.\n");
12917 g_s.begin(
"Distributing member group documentation.\n");
12922 g_s.begin(
"Computing member references...\n");
12928 g_s.begin(
"Inheriting documentation...\n");
12936 g_s.begin(
"Generating disk names...\n");
12940 g_s.begin(
"Adding source references...\n");
12944 g_s.begin(
"Adding xrefitems...\n");
12949 g_s.begin(
"Sorting member lists...\n");
12953 g_s.begin(
"Setting anonymous enum type...\n");
12957 g_s.begin(
"Computing dependencies between directories...\n");
12961 g_s.begin(
"Generating citations page...\n");
12965 g_s.begin(
"Counting members...\n");
12969 g_s.begin(
"Counting data structures...\n");
12973 g_s.begin(
"Resolving user defined references...\n");
12977 g_s.begin(
"Finding anchors and sections in the documentation...\n");
12981 g_s.begin(
"Transferring function references...\n");
12985 g_s.begin(
"Combining using relations...\n");
12990 g_s.begin(
"Adding members to index pages...\n");
12995 g_s.begin(
"Correcting members for VHDL...\n");
12999 g_s.begin(
"Computing tooltip texts...\n");
13007 [](
const auto &g1,
const auto &g2)
13008 {
return g1->groupTitle() < g2->groupTitle(); });
13012 gd->sortSubGroups();
13056 if (generateDocbook)
13076 err(
"USE_HTAGS is YES but htags(1) failed. \n");
13078 err(
"htags(1) ended normally but failed to load the filemap. \n");
13085 g_s.begin(
"Generating style sheet...\n");
13093 g_s.begin(
"Generating search indices...\n");
13094 if (searchEngine && !serverBasedSearch && generateHtml)
13102 if (generateHtml && searchEngine)
13105 Dir searchDir(searchDirName.
str());
13106 if (!searchDir.
exists() && !searchDir.
mkdir(searchDirName.
str()))
13108 term(
"Could not create search results directory '{}' $PWD='{}'\n",
13112 if (!serverBasedSearch)
13135 if (generateDocbook)
13151 g_s.begin(
"Generating images for formulas in HTML...\n");
13158 g_s.begin(
"Generating images for formulas in RTF...\n");
13165 g_s.begin(
"Generating images for formulas in Docbook...\n");
13170 g_s.begin(
"Generating example documentation...\n");
13174 g_s.begin(
"Generating file sources...\n");
13178 g_s.begin(
"Generating file documentation...\n");
13182 g_s.begin(
"Generating page documentation...\n");
13186 g_s.begin(
"Generating group documentation...\n");
13190 g_s.begin(
"Generating class documentation...\n");
13194 g_s.begin(
"Generating concept documentation...\n");
13198 g_s.begin(
"Generating module documentation...\n");
13202 g_s.begin(
"Generating namespace documentation...\n");
13208 g_s.begin(
"Generating graph info page...\n");
13213 g_s.begin(
"Generating directory documentation...\n");
13222 g_s.begin(
"finalizing index lists...\n");
13226 g_s.begin(
"writing tag file...\n");
13232 g_s.begin(
"Generating XML output...\n");
13240 g_s.begin(
"Generating SQLITE3 output...\n");
13247 g_s.begin(
"Generating AutoGen DEF output...\n");
13253 g_s.begin(
"Generating Perl module output...\n");
13257 if (generateHtml && searchEngine && serverBasedSearch)
13259 g_s.begin(
"Generating search index\n");
13269 if (searchDataFile.
isEmpty())
13271 searchDataFile=
"searchdata.xml";
13284 g_s.begin(
"Combining RTF output...\n");
13287 err(
"An error occurred during post-processing the RTF files!\n");
13292 g_s.begin(
"Running plantuml with JAVA...\n");
13298 g_s.begin(
"Running dot...\n");
13303 if (generateHtml &&
13307 g_s.begin(
"Running html help compiler...\n");
13312 if ( generateHtml &&
13316 g_s.begin(
"Running qhelpgenerator...\n");
13323 msg(
"type lookup cache used {}/{} hits={} misses={}\n",
13328 msg(
"symbol lookup cache used {}/{} hits={} misses={}\n",
13335 int cacheParam = std::max(typeCacheParam,symbolCacheParam);
13338 msg(
"Note: based on cache misses the ideal setting for LOOKUP_CACHE_SIZE is {} at the cost of higher memory usage.\n",cacheParam);
13344 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
13345 if (numThreads<1) numThreads=1;
13346 msg(
"Total elapsed time: {:.6f} seconds\n(of which an average of {:.6f} seconds per thread waiting for external tools to finish)\n",
13353 msg(
"finished...\n");
13358 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 addListReferences()=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 setFileDef(FileDef *fd)=0
virtual void writeTagFile(TextStream &)=0
virtual void setInitializer(const QCString &init)=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 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?
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.
ENTRY_TYPES bool isCompound() const
std::string to_string() const
bool isCompoundDoc() const
A class that generates a dynamic tree view side panel.
static void generateTreeViewImages()
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 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.
MemberDef * find(const QCString &name)
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 addListReferences()=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
void fill(char c, int len=-1)
Fills a string with a predefined character.
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
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()
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)
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.
Iterator class to iterator 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 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 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 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 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, const QCString &manName, const QCString &title, HighlightedItem hli, bool additionalIndices, const QCString &altSidebarName, int hierarchyLevel)
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)
std::vector< RefItem * > RefItemVector
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
@ GROUPING_INGROUP
membership in group was defined by @ingroup
static const char * getGroupPriName(GroupPri_t priority)
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)
Protection
Protection level of members.
SrcLangExt
Language as given by extension.
Relationship
Kind of member relationship.
Specifier
Virtualness of a member.
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)
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)
bool matchArguments2(const Definition *srcScope, const FileDef *srcFileScope, const ArgumentList *srcAl, const Definition *dstScope, const FileDef *dstFileScope, const ArgumentList *dstAl, bool checkCV, SrcLangExt lang)
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()
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.