浏览该文件的文档.
22 #include <unordered_map>
114 #include <clang/Basic/Version.h>
120 #if !defined(_WIN32) || defined(__CYGWIN__)
212 stats.emplace_back(name,0);
213 startTime = std::chrono::steady_clock::now();
217 std::chrono::steady_clock::time_point endTime = std::chrono::steady_clock::now();
218 stats.back().elapsed = std::chrono::duration_cast<
219 std::chrono::microseconds>(endTime -
startTime).count()/1000000.0;
229 msg(
"----------------------\n");
230 for (
const auto &s :
stats)
232 msg(
"Spent %.6f seconds in %s",s.elapsed,s.name);
294 scope+=
"::"+pd->
name();
342 ((!includeExternal && root->
tagInfo()==0) ||
343 ( includeExternal && root->
tagInfo()!=0))
362 "group %s: ignoring title \"%s\" that does not match old title \"%s\"\n",
377 std::unique_ptr<GroupDef>(
384 std::unique_ptr<GroupDef>(
429 scope+=
"::"+gd->
name();
481 int save_ambig = ambig;
492 fn = fn.
left(newIndex)+
"/"+root->
name;
495 if (!fd) ambig = save_ambig;
522 text.
sprintf(
"the name '%s' supplied as "
523 "the argument in the \\file statement ",
527 text+=
"matches the following input files:\n";
529 text+=
"Please use a more specific name by "
530 "including a (larger) part of the path!";
534 text+=
"is not an input file";
542 template<
class DefMutable>
556 if (!includeFile.
isEmpty() && includeFile.
at(0)==
'"')
559 includeFile=includeFile.
mid(1,includeFile.
length()-2);
561 else if (!includeFile.
isEmpty() && includeFile.
at(0)==
'<')
564 includeFile=includeFile.
mid(1,includeFile.
length()-2);
576 text.
sprintf(
"the name '%s' supplied as "
577 "the argument of the \\class, \\struct, \\union, or \\include command ",
582 text+=
"matches the following input files:\n";
584 text+=
"Please use a more specific name by "
585 "including a (larger) part of the path!";
589 text+=
"is not an input file";
593 else if (includeFile.
isEmpty() && ifd &&
607 if (iName.
at(0)==
'<') local=
FALSE;
608 else if (iName.
at(0)==
'"') local=
TRUE;
609 if (iName.
at(0)==
'"' || iName.
at(0)==
'<')
632 cd->setIncludeFile(0,iName,local,
TRUE);
652 if (!nsName.
isEmpty() && nsName.
at(0)!=
'@' &&
656 cd->setNamespace(nd);
657 cd->setOuterScope(nd);
672 if (root==0)
return 0;
677 result = findScope(root->
parent,level+1);
703 for (
int i=0;i<l;i++)
707 else if (c==
')' && round>0) round--;
708 else if (c==
'<' && round==0) count++;
713 if (c==
'>' && round==0 && count>0) count--;
735 if (idx==-1)
return prevScope;
737 if (nsName.
isEmpty())
return prevScope;
738 if (!fullScope.
isEmpty()) fullScope+=
"::";
743 if (nd==0) cd =
getClass(fullScope);
748 else if (nd==0 && cd==0 && fullScope.
find(
'<')==-1)
755 std::unique_ptr<NamespaceDef>(
757 "[generated]",1,1,fullScope,
775 if (prevScopeMutable)
823 if (resultScope!=0)
break;
881 auto alIt = tArgLists.begin();
882 while ((i=name.
find(
"::",p))!=-1 && alIt!=tArgLists.end())
898 return alIt!=tArgLists.end() ?
899 std::make_unique<ArgumentList>(*alIt) :
900 std::unique_ptr<ArgumentList>();
980 qualifiedName.
prepend(scName+
"::");
1051 if (fullName.
find(
"::")!=-1)
1058 std::unique_ptr<ArgumentList> tArgList;
1064 fullName=fullName.
left(i);
1074 std::unique_ptr<ClassDef>(
1188 qualifiedName.
prepend(scName+
"::");
1199 qualifiedName=cd->
name();
1223 if (qualifiedName.
find(
"::")!=-1)
1235 std::unique_ptr<ConceptDef>(
1237 qualifiedName,tagName,refFileName))));
1325 aliasFullName(name),aliasCd(std::move(cd)), aliasContext(ctx) {}
1327 std::unique_ptr<ClassDef> aliasCd;
1330 std::vector<ClassAlias> aliases;
1334 if (cd && visitedClasses.find(icd.get())==visitedClasses.end())
1340 name,icd->getFileDef(),0);
1366 aliases.push_back(ClassAlias(aliasFullName,std::move(aliasCd),dm));
1377 visitedClasses.
insert(icd.get());
1387 for (
auto &alias : aliases)
1392 alias.aliasContext->addInnerCompound(aliasCd);
1401 if (cd && visitedClasses.find(icd.get())==visitedClasses.end())
1420 "Internal inconsistency: scope for class %s not "
1439 if (visitedClasses.find(cd.get())==visitedClasses.end() && !cd->
partOfGroups().empty())
1451 const_cast<GroupDef*
>(gd)->addClass(ncdm);
1454 visitedClasses.insert(cd.get());
1464 if (fullName.
right(2)==
"::") fullName=fullName.
left(fullName.
length()-2);
1465 fullName+=
"."+fieldName;
1470 std::unique_ptr<ClassDef>(
1503 const_cast<GroupDef*
>(gd)->addClass(cd);
1509 for (
const auto &md : *ml)
1513 md->typeString(),md->name(),md->argsString(),md->excpString(),
1514 md->protection(),md->virtualness(),md->isStatic(),
Member,
1556 for (
const auto &md : *ml)
1559 if (type.
find(
"::@")!=-1)
1565 if (type.
find(icd->name())!=-1)
1568 if (md->isAnonymous()) name =
"__unnamed" + name.
right(name.
length()-1)+
"__";
1588 for (
const auto &pmd : *pml)
1591 if (pmdm && pmd->
name()==md->name())
1611 if (icd->name().find(
"@")==-1)
1620 candidates.push_back(cdm);
1626 std::vector<ClassDefMutable *> candidates;
1638 for (
auto &cd : candidates)
1721 std::unique_ptr<NamespaceDef>(
1793 aliasName,std::unique_ptr<NamespaceDef>(aliasNd));
1820 for (
const auto &und : unl)
1824 if (usingNd!=0)
break;
1836 if (name.
right(2)==
"::")
1864 int scopeOffset = nsName.
length();
1875 else if ((scopeOffset=nsName.
findRev(
"::",scopeOffset-1))==-1)
1879 }
while (scopeOffset>=0 && usingNd==0);
1881 if (usingNd==0 && nd)
1885 while (pnd && usingNd==0)
1902 if (usingNd==0 && fd)
1931 std::unique_ptr<NamespaceDef>(
2041 std::unique_ptr<ClassDef>(
2104 for (
auto &mi : *mni)
2139 newMd->enableCallGraph(root->
callGraph);
2144 newMd->addSectionsToDefinition(root->
anchors);
2150 newMd->setMemberGroupId(root->
mGrpId);
2152 newMd->setLanguage(root->
lang);
2153 newMd->setId(root->
id);
2176 for (
const auto &fd : *fn)
2179 fd->addIncludedUsingDirectives(visitedFiles);
2207 " class variable:\n"
2208 " '%s' '%s'::'%s' '%s' prot=%d ann=%d init='%s'\n",
2225 def=
"using "+name+
" = "+type.
mid(7);
2229 def=type+
" "+name+args;
2236 def=
"using "+qualScope+scopeSeparator+name+
" = "+type.
mid(7);
2240 def=type+
" "+qualScope+scopeSeparator+name+args;
2252 def=qualScope+scopeSeparator+name+args;
2263 for (
const auto &imd : *mn)
2303 md->setMemberClass(cd);
2307 md->setDefinition(def);
2309 md->addSectionsToDefinition(root->
anchors);
2310 md->setFromAnonymousScope(fromAnnScope);
2311 md->setFromAnonymousMember(fromAnnMemb);
2315 md->setInitializer(
init.c_str());
2317 md->setMemberGroupId(root->
mGrpId);
2318 md->setMemberSpecifiers(root->
spec);
2319 md->setReadAccessor(root->
read);
2320 md->setWriteAccessor(root->
write);
2325 md->setHidden(root->
hidden);
2327 md->setLanguage(root->
lang);
2328 md->setId(root->
id);
2330 md->setBodyDef(root->
fileDef());
2334 md->setRefItems(root->
sli);
2363 " global variable:\n"
2364 " file='%s' type='%s' scope='%s' name='%s' args='%s' prot=`%d mtype=%d lang=%d\n",
2382 if (ttype.
left(7)==
"struct " || ttype.
left(6)==
"union ")
2386 static const reg::Ex re(R
"(\a\w*)");
2388 std::string typ = ttype.str();
2410 if (scope.
find(
'@')!=-1)
return 0;
2428 def=
"using "+nd->
name()+sep+name+
" = "+type;
2432 def=type+
" "+nd->
name()+sep+name+args;
2437 def=nd->
name()+sep+name+args;
2444 if (name.
at(0)==
'@')
2452 def=
"using "+root->
name+
" = "+type.
mid(7);
2456 def=type+
" "+name+args;
2477 for (
const auto &imd : *mn)
2494 bool staticsInDifferentFiles =
2500 !staticsInDifferentFiles
2534 " new variable, nd=%s tagInfo=%p!\n",nd?
qPrint(nd->
name()):
"<global>",root->
tagInfo());
2543 md->setMemberSpecifiers(root->
spec);
2547 md->addSectionsToDefinition(root->
anchors);
2548 md->setFromAnonymousScope(fromAnnScope);
2549 md->setFromAnonymousMember(fromAnnMemb);
2551 md->setInitializer(
init.c_str());
2553 md->setMemberGroupId(root->
mGrpId);
2554 md->setDefinition(def);
2555 md->setLanguage(root->
lang);
2556 md->setId(root->
id);
2570 md->setRefItems(root->
sli);
2573 md->setNamespace(nd);
2606 static const reg::Ex re(R
"(\([^)]*[*^][^)]*\))");
2608 size_t i=std::string::npos;
2612 i =
match.position();
2615 size_t bb=type.find(
'<');
2616 size_t be=type.rfind(
'>');
2618 if (!type.empty() &&
2619 i!=std::string::npos &&
2620 type.find(
"operator")==std::string::npos &&
2621 (type.find(
")(")==std::string::npos || type.find(
"typedef ")!=std::string::npos) &&
2626 if (pLength) *pLength=(int)l;
2644 bool typeIsClass =
false;
2645 bool typePtrType =
false;
2658 else if ((fd !=
nullptr) && (fd->
name().
right(2)==
".c" || fd->
name().
right(2)==
".h"))
2677 typePtrType = type.
find(
'*')!=-1 || type.
find(
'&')!=-1;
2682 if (!typeIsClass && (ti=type.
find(
'<'))!=-1)
2699 static const reg::Ex initChars(R
"([\d"'&*!^]+)");
2703 std::string name = a.
name.
str();
2733 std::string atype = a.
type.
str();
2740 if (resType.empty()) resType=atype;
2741 static const reg::Ex idChars(R
"(\a\w*)");
2744 resType=
match.str();
2746 if (resType==
"int" || resType==
"long" ||
2747 resType==
"float" || resType==
"double" ||
2748 resType==
"char" || resType==
"void" ||
2749 resType==
"signed" || resType==
"unsigned" ||
2750 resType==
"const" || resType==
"volatile" )
2766 static void addVariable(
const Entry *root,
int isFuncPtr=-1)
2772 " type='%s' name='%s' args='%s' bodyLine=%d mGrpId=%d relates='%s'\n",
2785 if (type.
isEmpty() && name.
find(
"operator")==-1 &&
2786 (name.
find(
'*')!=-1 || name.
find(
'&')!=-1))
2793 std::string sargs = args.
str();
2794 static const reg::Ex reName(R
"(\a\w*)");
2799 sargs =
match.suffix().str();
2800 size_t j = sargs.find(
')');
2801 if (j!=std::string::npos) args=sargs.substr(0,j);
2813 int ai = type.
find(
'[',i);
2819 else if (type.
find(
')',i)!=-1)
2847 bool isRelated=
FALSE;
2848 bool isMemberOf=
FALSE;
2856 if (type==
"friend class" || type==
"friend struct" ||
2857 type==
"friend union")
2885 else if (type.
left(8)==
"typedef ")
2887 else if (type.
left(7)==
"friend ")
2893 else if (type.
find(
"sequence<") != -1)
2895 else if (type.
find(
"dictionary<") != -1)
2921 int si=scope.
find(
'@');
2925 static bool inlineSimpleStructs =
Config_getBool(INLINE_SIMPLE_STRUCTS);
2926 if (si!=-1 && !inlineSimpleStructs)
2930 pScope = scope.
left(std::max(si-2,0));
2932 pScope.
prepend(annScopePrefix);
2933 else if (annScopePrefix.
length()>2)
2934 pScope=annScopePrefix.
left(annScopePrefix.
length()-2);
2935 if (name.
at(0)!=
'@')
2988 static void buildTypedefList(
const Entry *root)
2998 for (
const auto &e : root->
children())
3000 buildTypedefList(e.get());
3006 static void buildSequenceList(
const Entry *root)
3015 for (
const auto &e : root->
children())
3017 buildSequenceList(e.get());
3023 static void buildDictionaryList(
const Entry *root)
3032 for (
const auto &e : root->
children())
3034 buildDictionaryList(e.get());
3041 static void buildVarList(
const Entry *root)
3059 addVariable(root,isFuncPtr);
3061 for (
const auto &e : root->
children())
3063 buildVarList(e.get());
3071 static void addInterfaceOrServiceToServiceOrSingleton(
3089 md->setTagInfo(root->
tagInfo());
3090 md->setMemberClass(cd);
3092 md->setDocsForDefinition(
false);
3096 md->setMemberSpecifiers(root->
spec);
3097 md->setMemberGroupId(root->
mGrpId);
3099 md->setLanguage(root->
lang);
3102 md->addSectionsToDefinition(root->
anchors);
3104 md->setDefinition(def);
3111 " Interface Member:\n"
3112 " '%s' '%s' proto=%d\n"
3135 md->setRefItems(root->
sli);
3142 static void buildInterfaceAndServiceList(
const Entry *root)
3148 "EXPORTED_INTERFACE_SEC:\n"
3149 " '%s' '%s'::'%s' '%s' relates='%s' relatesType='%d' file='%s' line='%d' bodyLine='%d' #tArgLists=%d mGrpId=%d spec=%lld proto=%d docFile=%s\n",
3177 addInterfaceOrServiceToServiceOrSingleton(root,cd,rname);
3187 "Illegal member name found.");
3195 for (
const auto &e : root->
children()) buildInterfaceAndServiceList(e.get());
3233 name.
left(9)!=
"operator " &&
3234 (i=name.
find(
'<'))!=-1 &&
3235 (j=name.
find(
'>'))!=-1 &&
3236 (j!=i+2 || name.
at(i+1)!=
'=')
3262 md->setTagInfo(root->
tagInfo());
3263 md->setMemberClass(cd);
3265 md->setDocsForDefinition(!root->
proto);
3269 md->setMemberSpecifiers(spec);
3270 md->setMemberGroupId(root->
mGrpId);
3272 md->setLanguage(root->
lang);
3273 md->setRequiresClause(root->
req);
3274 md->setId(root->
id);
3277 md->addSectionsToDefinition(root->
anchors);
3282 if (scopeSeparator!=
"::")
3284 qualScope =
substitute(qualScope,
"::",scopeSeparator);
3289 scopeSeparator=
"::";
3307 def=type+
" "+qualScope+scopeSeparator+name;
3311 def=qualScope+scopeSeparator+name;
3315 md->setDefinition(def);
3323 " '%s' '%s'::'%s' '%s' proto=%d\n"
3340 md->setRefItems(root->
sli);
3367 md->setTagInfo(root->
tagInfo());
3368 md->setLanguage(root->
lang);
3369 md->setId(root->
id);
3374 md->setDocsForDefinition(!root->
proto);
3380 md->addSectionsToDefinition(root->
anchors);
3381 md->setMemberSpecifiers(root->
spec);
3382 md->setMemberGroupId(root->
mGrpId);
3383 md->setRequiresClause(root->
req);
3412 def=root->
type+
" "+scope+name;
3419 " Global Function:\n"
3420 " '%s' '%s'::'%s' '%s' proto=%d\n"
3429 md->setDefinition(def);
3439 md->setRefItems(root->
sli);
3443 md->setNamespace(nd);
3469 static void buildFunctionList(
const Entry *root)
3475 " '%s' '%s'::'%s' '%s' relates='%s' relatesType='%d' file='%s' line='%d' bodyLine='%d' #tArgLists=%d mGrpId=%d spec=%lld proto=%d docFile=%s\n",
3492 bool isFriend=root->
type.
find(
"friend ")!=-1;
3505 int memIndex=rname.
findRev(
"::");
3508 if (cd && scope+
"::"==rname.
left(scope.
length()+2))
3514 bool isMember=
FALSE;
3517 int ts=rname.
find(
'<');
3518 int te=rname.
find(
'>');
3519 if (memIndex>0 && (ts==-1 || te==-1))
3536 isMember=memIndex<ts || memIndex>te;
3547 addMethodToClass(root,cd,root->
type,rname,root->
args,isFriend,
3569 for (
const auto &imd : *mn)
3582 fullScope.
prepend(parentScope);
3588 if (mnd) nsName = mnd->
name();
3589 if (rnd) rnsName = rnd->
name();
3597 bool sameNumTemplateArgs =
TRUE;
3598 bool matchingReturnTypes =
TRUE;
3599 bool sameRequiresClause =
TRUE;
3604 sameNumTemplateArgs =
FALSE;
3608 matchingReturnTypes =
FALSE;
3612 sameRequiresClause =
FALSE;
3616 bool staticsInDifferentFiles =
3623 sameNumTemplateArgs &&
3624 matchingReturnTypes &&
3625 sameRequiresClause &&
3626 !staticsInDifferentFiles
3630 if (!root->
groups.empty() && !root->
groups.front().groupname.isEmpty())
3637 found=(mnd && rnd && nsName==rnsName) ||
3638 ((mnd==0 && rnd==0 && mfd!=0 &&
3643 if (!found && gd && gd==md->
getGroupDef() && nsName==rnsName)
3731 addGlobalFunction(root,rname,scope);
3755 "Illegal member name found."
3759 for (
const auto &e : root->
children()) buildFunctionList(e.get());
3764 static void findFriends()
3775 for (
const auto &ifmd : *fn)
3779 for (
const auto &immd : *mn)
3864 for (
const auto &imdec : *mn)
3872 for (
const auto &imdef : *mn)
3875 if (mdef && mdec!=mdef &&
3894 for (
const auto &imd : *mn)
3910 if (mdef && mdec)
break;
3918 mdec->getOuterScope(),mdec->getFileDef(),
const_cast<ArgumentList*
>(&mdecAl),
3924 mdec->mergeReferences(mdef);
3926 mdec->mergeReferencedBy(mdef);
3942 for (
const auto &imd : *mn)
3953 for (
const auto &irmd : *rmn)
3989 std::map<std::string,int> templateNames;
3991 for (
const Argument &arg : templateArguments)
3993 static const reg::Ex re(R
"(\a[\w:]*)");
3996 for (; it!=
end ; ++it)
3998 const auto &
match = *it;
3999 std::string n =
match.str();
4000 if (n==arg.name.str())
4002 if (templateNames.find(n)==templateNames.end())
4004 templateNames.insert(std::make_pair(n,count));
4009 return templateNames;
4024 if (context && cd!=context)
4055 const std::unique_ptr<ArgumentList> &actualArgs = std::unique_ptr<ArgumentList>(),
4062 for (
auto &mi : *mni)
4072 type = typedefValue;
4091 usedClassName = typeCd->
name();
4094 int sp=usedClassName.
find(
'<');
4096 int si=usedClassName.
findRev(
"::",sp);
4107 if (templateNames.empty())
4116 if (arg.name==usedName)
4126 std::unique_ptr<ClassDef>(
4174 if (!found && !type.
isEmpty())
4180 if (type.
right(2)==
"(*" || type.
right(2)==
"(^")
4187 std::unique_ptr<ClassDef>(
4222 const std::unique_ptr<ArgumentList> &actualArgs = std::unique_ptr<ArgumentList>(),
4233 if (templateNames.empty())
4281 bool existingClass = (templSpec ==
4284 if (existingClass)
return;
4286 bool freshInstance=
FALSE;
4303 for (
auto it=it_pair.first ; it!=it_pair.second ; ++it)
4305 const Entry *templateRoot = it->second;
4313 isArtificial,templArgs,templateNames);
4329 int index=n.
find(
'<');
4358 bool insideString=
FALSE;
4359 bool insideChar=
FALSE;
4361 while (e<len && brCount!=0)
4367 if (!insideString && !insideChar)
4369 if (e<len-1 && s.
at(e+1)==
'<')
4371 else if (roundCount==0)
4376 if (!insideString && !insideChar)
4378 if (e<len-1 && s.
at(e+1)==
'>')
4380 else if (roundCount==0)
4385 if (!insideString && !insideChar)
4389 if (!insideString && !insideChar)
4395 if (insideString && pc!=
'\\')
4404 if (insideChar && pc!=
'\\')
4414 return brCount==0 ? e : -1;
4420 int l =
static_cast<int>(name.
length());
4426 while (count>0 && i>=0)
4431 case '>':
if (!insideQuote) count++;
break;
4432 case '<':
if (!insideQuote) count--;
break;
4433 case '\'':
if (!insideQuote) insideQuote=c;
4434 else if (insideQuote==c && (i<0 || name[i]!=
'\\')) insideQuote=0;
4436 case '"':
if (!insideQuote) insideQuote=c;
4437 else if (insideQuote==c && (i<0 || name[i]!=
'\\')) insideQuote=0;
4466 bool explicitGlobalScope=
FALSE;
4468 if (biName.
left(2)==
"::")
4471 explicitGlobalScope=
TRUE;
4475 bool lastParent=
FALSE;
4480 int scopeOffset=explicitGlobalScope ? 0 : scopeName.
length();
4489 baseClassName.
prepend(scopeName.
left(scopeOffset)+
"::");
4517 || explicitGlobalScope
4525 Debug::Classes,0,
" class relation %s inherited/used by %s found (%s and %s) templSpec='%s'\n",
4534 int si=baseClassName.
findRev(
"::",i);
4536 if (baseClass==0 &&
static_cast<uint>(i)!=baseClassName.
length())
4546 baseClassName = baseClassName.
left(i)+baseClassName.
right(baseClassName.
length()-e);
4557 else if (baseClass && !templSpec.
isEmpty())
4568 baseClass = templClass;
4576 if (!found && si!=-1)
4587 found=baseClass!=0 && baseClass!=cd;
4588 if (found) templSpec = tmpTemplSpec;
4597 found = baseClass!=0 && baseClass!=cd;
4609 found = baseClass!=0 && baseClass!=cd;
4612 bool isATemplateArgument = templateNames.find(biName.
str())!=templateNames.end();
4638 if (baseClassTypeDef==0)
4648 if (baseClassTypeDef || cd->
isCSharp())
4664 "Detected potential recursive class relation "
4665 "between class %s and base class %s!",
4672 else if (mode==
Undocumented && (scopeOffset==0 || isATemplateArgument))
4675 " New undocumented base class '%s' baseClassName=%s templSpec=%s isArtificial=%d\n",
4679 if (isATemplateArgument)
4686 std::unique_ptr<ClassDef>(
4706 std::unique_ptr<ClassDef>(
4714 si = baseClassName.
findRev(
"::");
4728 if (biName.
right(2)==
"-p")
4730 biName=
"<"+biName.
left(biName.
length()-2)+
">";
4740 if (scope!=baseClass)
4745 if (baseClassName.
right(2)==
"-p")
4766 "Detected potential recursive class relation "
4767 "between class %s and base class %s!\n",
4779 else if ((scopeOffset=scopeName.
findRev(
"::",scopeOffset-1))==-1)
4784 }
while (scopeOffset>=0);
4792 parentNode=parentNode->
parent();
4794 }
while (lastParent);
4814 bool hasExtends = !root->
extends.empty();
4815 if (hasExtends)
return TRUE;
4840 (i=bName.
find(
'<'))!=-1)
4844 bName=bName.
left(i);
4859 const Entry *root = kv.second;
4879 const Entry *root = kv.second;
4899 const Entry *root = kv.second;
4910 bName.
right(2)!=
"::")
4920 "Compound %s is not documented.",
4931 const Entry *root = kv.second;
4959 for (
const auto &tn_kv : templateNames)
4961 int templIndex = tn_kv.second;
4963 bool hasActArg=
FALSE;
4964 if (templIndex<(
int)templArgs->size())
4966 actArg=templArgs->at(templIndex);
4970 baseClassNames.find(actArg.
type.
str())!=baseClassNames.end() &&
4971 actualTemplateNames.find(actArg.
type.
str())==actualTemplateNames.end()
4974 actualTemplateNames.insert(std::make_pair(actArg.
type.
str(),templIndex));
5008 for (
const auto &fd : *fn)
5042 for (
const auto &fd : *fn)
5064 QCString name = pd->getOutputFileBase();
5065 if (pd->getGroupDef())
5067 name = pd->getGroupDef()->getOutputFileBase();
5080 QCString name = dd->getOutputFileBase();
5089 name,dd->displayName(),
QCString(),0);
5130 fullName = cd->
name();
5132 fullName = nd->
name();
5134 if (!fullName.
isEmpty()) fullName+=
"::";
5135 fullName+=md->
name();
5241 "member %s belongs to two different groups. The second "
5242 "one found here will be ignored.",
5283 "2. findGlobalMember(namespace=%s,type=%s,name=%s,tempArg=%s,decl=%s)\n",
5298 for (
const auto &md : *mn)
5315 QCString enumName = namespaceName.
mid(enumNamePos+2);
5316 if (namespaceName.
left(enumNamePos)==nd->
name())
5321 for (
const auto &emd : *enumMn)
5323 found = emd->isStrong() && md->
getEnumScope()==emd.get();
5342 for (
const auto &emd : *enumMn)
5344 found = emd->isStrong() && md->
getEnumScope()==emd.get();
5367 if ((namespaceName.
isEmpty() && nd==0) ||
5368 (nd && nd->
name()==namespaceName) ||
5389 if (matching && !root->
tArgLists.empty())
5444 warnMsg+=
"\nPossible candidates:\n";
5445 for (
const auto &md : *mn)
5458 if (root->
type!=
"friend class" &&
5459 root->
type!=
"friend struct" &&
5460 root->
type!=
"friend union" &&
5461 root->
type!=
"friend" &&
5467 "documented symbol '%s' was not declared or defined.",
qPrint(decl)
5479 auto srcIt = srcTempArgLists.begin();
5480 auto dstIt = dstTempArgLists.begin();
5481 while (srcIt!=srcTempArgLists.end() && dstIt!=dstTempArgLists.end())
5483 if ((*srcIt).size()!=(*dstIt).size())
return TRUE;
5495 result = !(
toClassDef(d))->templateArguments().empty() ||
5504 const std::string &src
5508 static const reg::Ex re(R
"(\a\w*)");
5513 for (; it!=
end ; ++it)
5515 const auto &
match = *it;
5516 size_t i =
match.position();
5517 size_t l =
match.length();
5519 dst+=src.substr(p,i-p);
5520 std::string name=
match.str();
5522 auto srcIt = srcTempArgLists.begin();
5523 auto dstIt = dstTempArgLists.begin();
5524 while (srcIt!=srcTempArgLists.end() && !found)
5527 std::vector<Argument>::const_iterator tdaIt;
5528 if (dstIt!=dstTempArgLists.end())
5531 tdaIt = tdAli->
begin();
5536 for (
auto tsaIt = tsaLi.
begin(); tsaIt!=tsaLi.
end() && !found; ++tsaIt)
5540 if (tdAli && tdaIt!=tdAli->
end())
5555 if (tdaType.
left(6)==
"class ") vc=6;
5556 else if (tdaType.
left(9)==
"typename ") vc=9;
5559 tdaName = tdaType.
mid(vc);
5592 auto dstIt = dst.
begin();
5597 if (dstIt == dst.
end())
5601 da.
array = dstArray;
5609 da.
array = dstArray;
5617 srcTempArgLists,dstTempArgLists,
5618 src.trailingReturnType().str()));
5641 funcType,funcName,funcArgs,exceptions,
5702 bool memFound=
FALSE;
5703 for (
const auto &imd : *mn)
5706 if (md==0)
continue;
5708 if (cd==0)
continue;
5710 "3. member definition found, "
5711 "scope needed='%s' scope='%s' args='%s' fileName=%s\n",
5731 if (!namespaceName.
isEmpty()) fullScope.
prepend(namespaceName+
"::");
5732 if (fullScope==cd->
name())
5738 for (
const auto &emd : *enumMn)
5740 memFound = emd->isStrong() && md->
getEnumScope()==emd.get();
5746 if (memFound)
break;
5751 if (memFound)
break;
5765 "4. class definition %s found\n",
qPrint(cd->
name()));
5770 if (!templAl.
empty())
5780 bool substDone=
FALSE;
5787 if (declTemplArgs.size()>0 && declTemplArgs.size()==defTemplArgs.size())
5804 "5. matching '%s'<=>'%s' className=%s namespaceName=%s\n",
5831 "5b. Comparing return types '%s'<->'%s' #args %d<->%d\n",
5843 bool classOrMdIsTemplate = mdIsTemplate || classIsTemplate;
5844 bool rootIsTemplate = !root->
tArgLists.empty();
5846 if (!rootIsUserDoc &&
5847 (mdIsTemplate || rootIsTemplate) &&
5848 ((classOrMdIsTemplate && !rootIsTemplate) || (!classOrMdIsTemplate && rootIsTemplate))
5854 "5b. Comparing return types: template v.s. non-template\n");
5860 "6. match results of matchArguments2 = %d substDone=%d\n",matching,substDone);
5871 if (!funcTempList.
isEmpty() &&
5878 addMethodToClass(root,cd,type,md->
name(),args,isFriend,
5891 else if (cd && cd!=tcd)
5897 if (memFound)
break;
5899 if (count==0 && root->
parent() &&
5902 addLocalObjCMethod(root,scopeName,funcType,funcName,funcArgs,exceptions,funcDecl,spec);
5905 if (count==0 && !(isFriend && funcType==
"class"))
5911 for (
const auto &md : *mn)
5923 addMethodToClass(root,ccd,type,md->
name(),args,isFriend,
5932 "7. new candidate className=%s scope=%s args=%s exact match\n",
5940 "7. new candidate className=%s scope=%s args=%s no match\n",
5946 static bool strictProtoMatching =
Config_getBool(STRICT_PROTO_MATCHING);
5947 if (!strictProtoMatching)
5949 if (candidates==1 && ucd && umd)
5956 else if (candidates>1 && ecd && emd)
5967 if (noMatchCount>1) warnMsg+=
"uniquely ";
5968 warnMsg+=
"matching class member found for \n";
5972 warnMsg+=
" template ";
5981 warnMsg+=fullFuncDecl;
5986 warnMsg+=
"Possible candidates:\n";
5987 for (
const auto &md : *mn)
5996 warnMsg+=
"template ";
6008 warnMsg+=qScope+
"::"+md->
name();
6040 for (
const auto &md : *mn)
6054 funcType,funcName,funcArgs,exceptions,
6084 mn->push_back(std::move(md));
6096 bool sameClass=
false;
6101 [](
const auto &md1,
const auto &md2)
6102 { return md1->getClassDef()->name()==md2->getClassDef()->name(); });
6114 std::unique_ptr<ArgumentList> tArgList =
6119 funcType,funcName,funcArgs,exceptions,
6175 "findMember(root=%p,funcDecl='%s',related='%s',overload=%d,"
6176 "isFunc=%d mGrpId=%d #tArgList=%d "
6177 "spec=%lld lang=%x\n",
6192 bool isRelated=
FALSE;
6193 bool isMemberOf=
FALSE;
6194 bool isFriend=
FALSE;
6228 while ((sep=funcDecl.
find(
';'))!=-1)
6230 funcDecl=(funcDecl.
left(sep)+funcDecl.
right(funcDecl.
length()-sep-1)).stripWhiteSpace();
6234 if (!funcDecl.
isEmpty() && funcDecl[0]!=
' ') funcDecl.
prepend(
" ");
6246 if (isFriend && funcDecl.
left(6)==
"class ")
6250 funcName = funcDecl;
6252 else if (isFriend && funcDecl.
left(7)==
"struct ")
6255 funcName = funcDecl;
6261 funcArgs,funcTempList,exceptions
6283 scopeName = relates;
6298 scopeName = joinedName;
6312 QCString joinedName = fnd->name()+
"::"+scopeName;
6315 scopeName=joinedName;
6343 if (namespaceName.
find(
'@')!=-1)
return;
6352 scopeName=namespaceName;
6354 else if (!relates.
isEmpty() ||
6357 scopeName=namespaceName+
"::"+className;
6361 scopeName=className;
6364 else if (!className.
isEmpty())
6366 scopeName=className;
6376 uint argListIndex=0;
6381 tempScopeName=scopeName+funcSpec;
6395 funcDecl=funcType+
" "+tempScopeName+
"::"+funcName+funcTempList;
6399 funcDecl=funcType+
" "+tempScopeName+
"::"+funcName+funcArgs;
6406 funcDecl=tempScopeName+
"::"+funcName+funcTempList;
6410 funcDecl=tempScopeName+
"::"+funcName+funcArgs;
6420 funcDecl=funcType+
" "+funcName+funcTempList;
6424 funcDecl=funcType+
" "+funcName+funcArgs;
6431 funcDecl=funcName+funcTempList;
6435 funcDecl=funcName+funcArgs;
6440 if (funcType==
"template class" && !funcTempList.
isEmpty())
6444 "findMember() Parse results:\n"
6445 " namespaceName='%s'\n"
6451 " funcTempList='%s'\n"
6454 " exceptions='%s'\n"
6468 "1. funcName='%s'\n",
qPrint(funcName));
6472 bool strongEnum =
false;
6476 for (
const auto &imd : *mn)
6486 namespaceName+=
"::"+className;
6490 namespaceName=className;
6496 if (funcName.
left(9)==
"operator ")
6498 funcName =
substitute(funcName,className+
"::",
"");
6509 if (!isRelated && !strongEnum && mn)
6512 "2. member name exists (%d members with this name)\n",mn->
size());
6518 funcArgs,funcTempList,exceptions,
6519 type,args,isFriend,spec,relates,funcDecl,overloaded,isFunc);
6531 else if (overloaded)
6533 addOverloaded(root,mn,funcType,funcName,funcArgs,funcDecl,exceptions,spec);
6537 if (!
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec))
6542 "Cannot determine class for function\n%s",
6548 else if (isRelated && !relates.
isEmpty())
6551 " scopeName=%s className=%s\n",
qPrint(scopeName),
qPrint(className));
6552 if (className.
isEmpty()) className=relates;
6556 bool newMember=
TRUE;
6562 for (
const auto &imd : *mn)
6584 for (
const auto &irmd : *mn)
6629 funcDecl=funcType +
" " + funcName;
6643 funcType,funcName,funcArgs,exceptions,
6645 root->
stat && !isMemberOf,
6684 for (
const auto &irmd : *rmn)
6752 if (!
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec))
6757 "Cannot determine file/namespace for relatedalso function\n%s",
6766 "class '%s' for related function '%s' is not "
6774 addLocalObjCMethod(root,scopeName,funcType,funcName,funcArgs,exceptions,funcDecl,spec);
6778 bool globMem =
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec);
6779 if (className.
isEmpty() && !globMem)
6782 "class for member '%s' cannot "
6783 "be found.",
qPrint(funcName)
6786 else if (!className.
isEmpty() && !globMem)
6789 "member '%s' of class '%s' cannot be found",
6798 "member with no name found.");
6811 "findMemberDocumentation(): root->type='%s' root->inside='%s' root->name='%s' root->args='%s' section=%x root->spec=%lld root->mGrpId=%d\n",
6826 type=type.
left(i+l);
6830 else if ((type.
left(8)==
"typedef " && args.
find(
'(')!=-1))
6889 if (type==
"friend class" || type==
"friend struct" ||
6890 type==
"friend union")
6896 type+
" "+root->
name,
6948 type +
" " + root->
name,
6977 for (
const auto &e : root->
children())
6990 for (
const auto &objCImpl : root->
children())
6994 for (
const auto &objCMethod : objCImpl->children())
7000 objCMethod->relates,
7003 objCMethod->type+
" "+objCImpl->name+
"::"+objCMethod->name+
" "+objCMethod->args,
7024 bool isRelated=
FALSE;
7025 bool isMemberOf=
FALSE;
7139 if (fd==0 && root->
parent())
7192 bool isRelated=
FALSE;
7254 struct EnumValueInfo
7256 EnumValueInfo(
const QCString &n,std::unique_ptr<MemberDefMutable> &md) :
7257 name(n), member(std::move(md)) {}
7259 std::unique_ptr<MemberDefMutable> member;
7261 std::vector< EnumValueInfo > extraMembers;
7263 for (
const auto &imd : *mn)
7270 for (
const auto &e : root->
children())
7288 qualifiedName=
substitute(scope,
"::",
".")+
"."+qualifiedName;
7327 extraMembers.push_back(EnumValueInfo(e->
name,fmd));
7338 for (
const auto &ifmd : *fmn)
7363 else if (isRelated && cd)
7392 for (
auto &e : extraMembers)
7436 if (gd==0 && !root->
groups.empty())
7496 for (
const auto &imd : *mn)
7511 else if (cd==0 && mcd==0 && nd!=0 && mnd==nd)
7518 else if (cd==0 && nd==0 && mcd==0 && mnd==0 && fd==mfd)
7531 "Documentation for undefined enum '%s' found.",
7545 for (
const auto &mn : mnsd)
7548 for (
const auto &imd : *mn)
7553 int documentedEnumValues=0;
7582 for (
const auto &md : *mn)
7591 for (
const auto &md : *mn)
7651 for (
const auto &fd : *fn)
7670 static const reg::Ex re(R
"(\a[\w-]*)");
7673 for (; it!=
end ; ++it)
7675 const auto &
match = *it;
7676 std::string matchStr =
match.str();
7685 if (pd->isLinkableInProject())
7748 for (
const auto &md : *mn)
7750 addMemberToIndices(md.get());
7757 for (
const auto &md : *mn)
7759 addMemberToIndices(md.get());
7772 for (
const auto &imd : *mn)
7785 for (
const auto &imd : *mn)
7807 for (
const auto &imd : *mn)
7813 for (
const auto &ibmd : *mn)
7826 if (bmcd && mcd && bmcd!=mcd &&
7961 for (
const auto &fd : *fn)
7969 for (
const auto &fd : *fn)
7981 clangParser->parse();
7990 clangParser->parse();
7994 for (
auto incFile : clangParser->filesInSameTU())
7996 if (filesToProcess.find(incFile)!=filesToProcess.end() &&
7998 processedFiles.
find(incFile)==processedFiles.end())
8018 processedFiles.insert(incFile);
8029 for (
const auto &fd : *fn)
8031 if (processedFiles.find(fd->
absFilePath().
str())==processedFiles.end())
8037 clangParser->parse();
8047 clangParser->parse();
8059 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8062 numThreads = std::thread::hardware_concurrency();
8066 msg(
"Generating code files using %zu threads.\n",numThreads);
8067 struct SourceContext
8070 : fd(fd_), generateSourceFile(gen_), ol(ol_) {}
8072 bool generateSourceFile;
8076 std::vector< std::future< std::shared_ptr<SourceContext> > > results;
8079 for (
const auto &fd : *fn)
8082 auto ctx = std::make_shared<SourceContext>(fd.get(),generateSourceFile,*
g_outputList);
8083 if (generateSourceFile)
8087 auto processFile = [ctx]() {
8088 if (ctx->generateSourceFile)
8090 msg(
"Generating code for file %s...\n",
qPrint(ctx->fd->docName()));
8094 msg(
"Parsing code for file %s...\n",
qPrint(ctx->fd->docName()));
8097 ctx->fd->getAllIncludeFilesRecursively(filesInSameTu);
8098 if (ctx->generateSourceFile)
8100 ctx->fd->writeSourceBody(ctx->ol,
nullptr);
8105 ctx->fd->parseSource(
nullptr);
8109 results.emplace_back(threadPool.
queue(processFile));
8112 for (
auto &f : results)
8115 if (ctx->generateSourceFile)
8117 ctx->fd->writeSourceFooter(ctx->ol);
8125 for (
const auto &fd : *fn)
8157 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8160 numThreads = std::thread::hardware_concurrency();
8167 : fd(fd_), ol(ol_) {}
8172 std::vector< std::future< std::shared_ptr<DocContext> > > results;
8175 for (
const auto &fd : *fn)
8180 auto ctx = std::make_shared<DocContext>(fd.get(),*
g_outputList);
8181 auto processFile = [ctx]() {
8182 msg(
"Generating docs for file %s...\n",
qPrint(ctx->fd->docName()));
8183 ctx->fd->writeDocumentation(ctx->ol);
8186 results.emplace_back(threadPool.
queue(processFile));
8190 for (
auto &f : results)
8199 for (
const auto &fd : *fn)
8248 for (
const auto &md : *mn)
8269 for (
const auto &md : *mn)
8301 for (
const auto &def : it->second)
8304 def.fileName,def.lineNr,def.columnNr,
8305 "#define",def.name,def.args,
QCString(),
8320 def.fileDef->insertMember(md.get());
8355 for (
const auto &fd : *fn)
8427 for (
const auto &fd : *fn)
8445 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8448 numThreads = std::thread::hardware_concurrency();
8455 : cd(cd_), ol(ol_) {}
8460 std::vector< std::future< std::shared_ptr<DocContext> > > results;
8461 for (
const auto &cdi : classList)
8472 auto ctx = std::make_shared<DocContext>(cd,*
g_outputList);
8473 auto processFile = [ctx]()
8475 msg(
"Generating docs for compound %s...\n",
qPrint(ctx->cd->name()));
8479 if ( ctx->cd->isLinkableInProject() && ctx->cd->templateMaster()==0)
8481 ctx->cd->writeDocumentation(ctx->ol);
8482 ctx->cd->writeMemberList(ctx->ol);
8486 ctx->cd->writeDocumentationForInnerClasses(ctx->ol);
8489 results.emplace_back(threadPool.
queue(processFile));
8492 for (
auto &f : results)
8499 for (
const auto &cdi : classList)
8514 msg(
"Generating docs for compound %s...\n",
qPrint(cd->
name()));
8547 msg(
"Generating docs for concept %s...\n",
qPrint(cd->
name()));
8559 for (
const auto &imd : *mn)
8595 for (
const auto &fd : *fn)
8629 for (
const auto &fd : *fn)
8666 for (
const auto &fd : *fn)
8712 for (
const auto &fd : *fn)
8734 pd->findSectionsInDocumentation();
8754 elementsToRemove.push_back(ci.first);
8757 for (
const auto &k : elementsToRemove)
8768 for (
const auto &ifmd : *fn)
8782 for (
const auto &imd : *nm)
8814 elementsToRemove.push_back(ci.first);
8817 for (
const auto &k : elementsToRemove)
8826 for (
const auto &ifmd : *fn)
8839 for (
const auto &imd : *nm)
8880 for (
const auto &md : *mn)
8886 for (
const auto &imd : *mn)
8917 for (
const auto &imd : *mn)
8955 "documentation for unknown define %s found.\n",
8962 "found documented #define %s but ignoring it because "
8963 "ENABLE_PREPROCESSING is NO.\n",
8979 normalizedName =
substitute(normalizedName,
"\\",
"/");
8982 if (root->
docFile==normalizedName)
8984 int lastSlashPos=normalizedName.
findRev(
'/');
8985 if (lastSlashPos!=-1)
8987 normalizedName=normalizedName.
left(lastSlashPos);
8990 if (normalizedName.
at(normalizedName.
length()-1)!=
'/')
8992 normalizedName+=
'/';
8998 if (dir->name().right(normalizedName.
length())==normalizedName)
9003 "\\dir command matches multiple directories.\n"
9004 " Applying the command for directory %s\n"
9005 " Ignoring the command for directory %s\n",
9011 matchingDir=dir.get();
9026 "directory found for command \\dir %s\n",
qPrint(normalizedName));
9098 else if (si->
lineNr() != -1)
9100 warn(root->
fileName,root->
startLine,
"multiple use of section label '%s' for main page, (first occurrence: %s, line %d)",
9105 warn(root->
fileName,root->
startLine,
"multiple use of section label '%s' for main page, (first occurrence: %s)",
9125 "found more than one \\mainpage comment block! (first occurrence: %s, line %d), Skipping current block!",
9163 term(
"page defined at line %d of file %s with label %s is a direct "
9164 "subpage of itself! Please remove this cyclic dependency.\n",
9188 term(
"page defined at line %d of file %s with label %s is a subpage "
9189 "of itself! Please remove this cyclic dependency.\n",
9190 pd->docLine(),
qPrint(pd->docFile()),
qPrint(pd->name()));
9216 if (si->label().left(label.
length())==label)
9218 si->setFileName(rl->listName());
9219 si->setGenerated(
TRUE);
9225 if (!si->generated())
9229 if (!si->fileName().isEmpty() &&
9236 if (si->definition())
9243 gd = (
toMemberDef(si->definition()))->getGroupDef();
9273 if (!pd->getGroupDef() && !pd->isReference())
9275 msg(
"Generating docs for page %s...\n",
qPrint(pd->name()));
9293 "Example %s was already documented. Ignoring "
9294 "documentation found here.",
9301 std::unique_ptr<PageDef>(
9323 indentStr.
fill(
' ',indent);
9324 msg(
"%s%s (sec=0x%x)\n",
9328 for (
const auto &e : root->
children())
9343 msg(
"Generating docs for example %s...\n",
qPrint(pd->name()));
9345 intf->resetCodeParserState();
9346 QCString n=pd->getOutputFileBase();
9353 if (pd->showLineNo())
9355 lineNoOptStr=
"{lineno}";
9361 pd->documentation()+
"\n\n\\include"+lineNoOptStr+
" "+pd->name(),
9393 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
9396 numThreads = std::thread::hardware_concurrency();
9403 : cdm(cdm_), ol(ol_) {}
9408 std::vector< std::future< std::shared_ptr<DocContext> > > results;
9410 for (
const auto &cd : classList)
9415 auto ctx = std::make_shared<DocContext>(cdm,*
g_outputList);
9416 auto processFile = [ctx]()
9418 if ( ( ctx->cdm->isLinkableInProject() &&
9419 ctx->cdm->templateMaster()==0
9422 && !ctx->cdm->isHidden() && !ctx->cdm->isEmbeddedInOuterScope()
9425 msg(
"Generating docs for compound %s...\n",
qPrint(ctx->cdm->name()));
9426 ctx->cdm->writeDocumentation(ctx->ol);
9427 ctx->cdm->writeMemberList(ctx->ol);
9429 ctx->cdm->writeDocumentationForInnerClasses(ctx->ol);
9432 results.emplace_back(threadPool.
queue(processFile));
9436 for (
auto &f : results)
9444 for (
const auto &cd : classList)
9456 msg(
"Generating docs for compound %s...\n",
qPrint(cd->
name()));
9470 for (
const auto &cd : conceptList)
9475 msg(
"Generating docs for concept %s...\n",
qPrint(cd->
name()));
9495 msg(
"Generating docs for namespace %s\n",
qPrint(nd->
name()));
9516 for (i=0;i<s.
length();i++)
9540 bool updateOnly=
FALSE)
9544 bool writeToStdout=configFile==
"-";
9553 msg(
"\n\nConfiguration file '%s' created.\n\n",
qPrint(configFile));
9554 msg(
"Now edit the configuration file and enter\n\n");
9555 if (configFile!=
"Doxyfile" && configFile!=
"doxyfile")
9556 msg(
" doxygen %s\n\n",
qPrint(configFile));
9558 msg(
" doxygen\n\n");
9559 msg(
"to generate the documentation for your project\n\n");
9563 msg(
"\n\nConfiguration file '%s' updated.\n\n",
qPrint(configFile));
9569 term(
"Cannot open file %s for writing\n",
qPrint(configFile));
9584 term(
"Cannot open stdout for writing\n");
9595 int eqPos = tagLine.
find(
'=');
9614 err(
"Tag file '%s' does not exist or is not a file. Skipping it...\n",
9620 msg(
"Reading tag file '%s', location '%s'...\n",
qPrint(fileName),
qPrint(destName));
9622 msg(
"Reading tag file '%s'...\n",
qPrint(fileName));
9631 for (
const auto &sheet : latexExtraStyleSheet)
9633 std::string fileName = sheet;
9634 if (!fileName.empty())
9639 err(
"Style sheet '%s' specified by LATEX_EXTRA_STYLESHEET does not exist!\n",
qPrint(fileName));
9658 if (!htmlStyleSheet.
isEmpty())
9663 err(
"Style sheet '%s' specified by HTML_STYLESHEET does not exist!\n",
qPrint(htmlStyleSheet));
9669 copyFile(htmlStyleSheet,destFileName);
9673 for (
const auto &sheet : htmlExtraStyleSheet)
9675 std::string fileName = sheet;
9676 if (!fileName.empty())
9681 err(
"Style sheet '%s' specified by HTML_EXTRA_STYLESHEET does not exist!\n",fileName.c_str());
9685 err(
"Style sheet %s specified by HTML_EXTRA_STYLESHEET is already a built-in stylesheet. Please use a different name\n",
qPrint(fi.
fileName()));
9704 err(
"Project logo '%s' specified by PROJECT_LOGO does not exist!\n",
qPrint(projectLogo));
9710 copyFile(projectLogo,destFileName);
9718 for (
const auto &fileName : files)
9720 if (!fileName.empty())
9725 err(
"Extra file '%s' specified in %s does not exist!\n", fileName.c_str(),
qPrint(filesOption));
9751 std::vector<FileEntry> fileEntries;
9752 for (
const auto &fd : *fn)
9756 fileEntries.emplace_back(fd->
getPath(),fd.get());
9760 size_t size = fileEntries.size();
9764 FileDef *fd = fileEntries[0].fileDef;
9770 std::sort(fileEntries.begin(),
9772 [](
const FileEntry &fe1,
const FileEntry &fe2)
9773 { return fe1.path < fe2.path; }
9778 const FileEntry &first = fileEntries[0];
9779 const FileEntry &last = fileEntries[size-1];
9780 int first_path_size =
static_cast<int>(first.path.size())-1;
9781 int last_path_size =
static_cast<int>(last.path.size())-1;
9784 for (i=0;i<first_path_size && i<last_path_size;i++)
9786 if (first.path[i]==
'/') j=i;
9787 if (first.path[i]!=last.path[i])
break;
9789 if (i==first_path_size && i<last_path_size && last.path[i]==
'/')
9794 else if (i==last_path_size && i<first_path_size && first.path[i]==
'/')
9801 for (
auto &fileEntry : fileEntries)
9803 QCString prefix = fileEntry.path.
right(fileEntry.path.length()-j-1);
9804 fileEntry.fileDef->setName(prefix+fn->fileName());
9806 fileEntry.fileDef->setDiskName(prefix+fn->fileName());
9820 int sep = fileName.
findRev(
'/');
9821 int ei = fileName.
findRev(
'.');
9822 if (ei!=-1 && (sep==-1 || ei>sep))
9828 extension =
".no_extension";
9840 int ei = fileName.
findRev(
'.');
9847 extension =
".no_extension";
9858 for (
const auto &s : includePath)
9864 msg(
"Preprocessing %s...\n",
qPrint(fn));
9885 std::shared_ptr<Entry> fileRoot = std::make_shared<Entry>();
9889 if (newTU) clangParser->
parse();
9893 fileRoot->setFileDef(fd);
9909 filesToProcess.insert(s);
9912 std::mutex processedFilesLock;
9914 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
9917 numThreads = std::thread::hardware_concurrency();
9919 msg(
"Processing input using %zu threads.\n",numThreads);
9921 using FutureType = std::vector< std::shared_ptr<Entry> >;
9922 std::vector< std::future< FutureType > > results;
9931 auto processFile = [s,&filesToProcess,&processedFilesLock,&processedFiles]() {
9933 std::vector< std::shared_ptr<Entry> > roots;
9937 auto fileRoot {
parseFile(*parser.get(),fd_l,s.c_str(),clangParser.get(),
true) };
9938 roots.push_back(fileRoot);
9942 for (
auto incFile : clangParser->filesInSameTU())
9944 if (filesToProcess.find(incFile)!=filesToProcess.end())
9946 bool needsToBeProcessed;
9948 std::lock_guard<std::mutex> lock(processedFilesLock);
9949 needsToBeProcessed = processedFiles.find(incFile)==processedFiles.end();
9950 if (needsToBeProcessed) processedFiles.insert(incFile);
9952 if (incFile!=s && needsToBeProcessed)
9958 fileRoot =
parseFile(*parser.get(),ifd,incFile.c_str(),clangParser.get(),
false);
9959 roots.push_back(fileRoot);
9967 results.emplace_back(threadPool.
queue(processFile));
9971 for (
auto &f : results)
9976 root->moveToSubEntryAndKeep(e);
9983 if (processedFiles.find(s)==processedFiles.end())
9986 auto processFile = [s]() {
9988 std::vector< std::shared_ptr<Entry> > roots;
9992 auto fileRoot =
parseFile(*parser.get(),fd,s.c_str(),clangParser.get(),
true);
9993 roots.push_back(fileRoot);
9997 results.emplace_back(threadPool.
queue(processFile));
10001 for (
auto &f : results)
10006 root->moveToSubEntryAndKeep(e);
10013 std::size_t numThreads = std::thread::hardware_concurrency();
10014 msg(
"Processing input using %zu threads.\n",numThreads);
10016 using FutureType = std::shared_ptr<Entry>;
10017 std::vector< std::future< FutureType > > results;
10021 auto processFile = [s]() {
10025 auto fileRoot =
parseFile(*parser.get(),fd,s.c_str(),
nullptr,
true);
10029 results.emplace_back(threadPool.
queue(processFile));
10032 for (
auto &f : results)
10034 root->moveToSubEntryAndKeep(f.get());
10051 filesToProcess.insert(s);
10064 auto fileRoot =
parseFile(*parser.get(),fd,s.c_str(),clangParser.get(),
true);
10065 root->moveToSubEntryAndKeep(fileRoot);
10066 processedFiles.insert(s);
10070 for (
auto incFile : clangParser->filesInSameTU())
10073 if (filesToProcess.find(incFile)!=filesToProcess.end() &&
10074 processedFiles.find(incFile)==processedFiles.end())
10080 fileRoot =
parseFile(*parser.get(),ifd,incFile.c_str(),clangParser.get(),
false);
10081 root->moveToSubEntryAndKeep(fileRoot);
10082 processedFiles.insert(incFile);
10091 if (processedFiles.find(s)==processedFiles.end())
10097 auto fileRoot =
parseFile(*parser.get(),fd,s.c_str(),clangParser.get(),
true);
10098 root->moveToSubEntryAndKeep(fileRoot);
10099 processedFiles.insert(s);
10111 std::unique_ptr<OutlineParserInterface> parser {
getParserForFile(s.c_str()) };
10112 std::shared_ptr<Entry> fileRoot =
parseFile(*parser.get(),fd,s.c_str(),
nullptr,
true);
10113 root->moveToSubEntryAndKeep(fileRoot);
10132 if (sepPos==0 && (result.
left(2)==
"//" || result.
left(2)==
"\\\\"))
10133 sepPos = result.
find(
'/',2);
10135 sepPos = result.
find(
'/',sepPos+1);
10137 sepPos = result.
find(
'/',sepPos+1);
10139 QCString prefix = sepPos==-1 ? result : result.
left(sepPos);
10140 if (nonSymlinks.find(prefix.
str())==nonSymlinks.end())
10157 target+=result.
mid(sepPos);
10161 if (known.find(result.
str())!=known.end())
return std::string();
10162 known.insert(result.
str());
10176 oldPrefix = prefix;
10181 while (sepPos!=-1);
10200 bool errorIfNotExist,
10207 if (paths && !dirName.empty())
10209 paths->insert(dirName);
10215 if (dirName.empty())
10235 for (
const auto &dirEntry : dir.
iterator())
10238 if (exclSet==0 || exclSet->find(cfi.
absFilePath())==exclSet->end())
10243 if (errorIfNotExist)
10245 warn_uncond(
"source '%s' is not a readable file or directory... skipping.\n",cfi.
absFilePath().c_str());
10248 else if (cfi.
isFile() &&
10251 (exclPatList==0 || !
patternMatch(cfi,*exclPatList)) &&
10252 (killSet==0 || killSet->find(cfi.
absFilePath())==killSet->end())
10256 std::string path=cfi.
dirPath()+
"/";
10257 std::string fullName=path+name;
10265 fn->push_back(std::move(fd));
10268 dirResultList.push_back(fullName);
10269 if (resultSet) resultSet->insert(fullName);
10270 if (killSet) killSet->insert(fullName);
10272 else if (recursive &&
10275 (exclPatList==0 || !
patternMatch(cfi,*exclPatList)) &&
10280 patList,exclPatList,&dirResultList,resultSet,errorIfNotExist,
10281 recursive,killSet,paths);
10285 if (resultList && !dirResultList.empty())
10288 std::sort(dirResultList.begin(),
10289 dirResultList.end(),
10290 [](
const auto &f1,
const auto &f2) { return qstricmp(f1.c_str(),f2.c_str())<0; });
10293 resultList->insert(resultList->end(), dirResultList.begin(), dirResultList.end());
10310 bool errorIfNotExist,
10324 if (exclSet==0 || exclSet->find(fi.
absFilePath())==exclSet->end())
10328 if (errorIfNotExist)
10330 warn_uncond(
"source '%s' is not a readable file or directory... skipping.\n",
qPrint(s));
10337 std::string dirPath = fi.
dirPath(
true);
10339 if (paths && !dirPath.empty())
10341 paths->insert(dirPath);
10344 if (killSet==0 || killSet->find(filePath)==killSet->end())
10353 fn->push_back(std::move(fd));
10356 if (resultList || resultSet)
10358 if (resultList) resultList->push_back(filePath);
10359 if (resultSet) resultSet->insert(filePath);
10365 else if (fi.
isDir())
10367 readDir(&fi,fnMap,exclSet,patList,
10368 exclPatList,resultList,resultSet,errorIfNotExist,
10369 recursive,killSet,paths);
10396 while ((in=value.
find(
"\\n",p))!=-1)
10398 newValue+=value.
mid(p,in-p);
10400 if (value.
mid(in,5)!=
"\\note" &&
10401 value.
mid(in,5)!=
"\\noop" &&
10402 value.
mid(in,5)!=
"\\name" &&
10403 value.
mid(in,10)!=
"\\namespace" &&
10404 value.
mid(in,14)!=
"\\nosubgrouping"
10407 newValue+=
"\\ilinebr ";
10415 newValue+=value.
mid(p,value.
length()-p);
10418 while ((in=value.
find(
"^^",p))!=-1)
10420 newValue+=value.
mid(p,in-p);
10421 newValue+=
"\\ilinebr ";
10424 newValue+=value.
mid(p,value.
length()-p);
10425 kv.second=newValue.
str();
10436 for (
const auto &al : aliasList)
10439 int i=alias.
find(
'=');
10454 it->second=value.
str();
10471 anchor=
":"+md->
anchor();
10478 t <<
"REPLACE INTO symbols (symbol_id,scope_id,name,file,line) VALUES('"
10481 << d->
name() <<
"','"
10489 std::ofstream f(
"symbols.sql",std::ofstream::out | std::ofstream::binary);
10503 msg(
"Developer parameters:\n");
10504 msg(
" -m dump symbol map\n");
10505 msg(
" -b making messages output unbuffered\n");
10506 msg(
" -T activates output generation via Django like template\n");
10507 msg(
" -d <level> enable a debug level, such as (multiple invocations of -d are possible):\n");
10517 QCString versionString = getFullVersion();
10523 if (!extVers.
isEmpty()) extVers+=
", ";
10524 extVers +=
"sqlite3 ";
10525 extVers += sqlite3_libversion();
10528 if (!extVers.
isEmpty()) extVers+=
", ";
10529 extVers +=
"clang support ";
10530 extVers += CLANG_VERSION_STRING;
10534 int lastComma = extVers.
findRev(
',');
10535 if (lastComma != -1) extVers = extVers.
replace(lastComma,1,
" and");
10546 msg(
"Doxygen version %s\nCopyright Dimitri van Heesch 1997-2021\n\n",
qPrint(versionString));
10547 msg(
"You can use doxygen in a number of ways:\n\n");
10548 msg(
"1) Use doxygen to generate a template configuration file:\n");
10549 msg(
" %s [-s] -g [configName]\n\n",
qPrint(name));
10550 msg(
"2) Use doxygen to update an old configuration file:\n");
10551 msg(
" %s [-s] -u [configName]\n\n",
qPrint(name));
10552 msg(
"3) Use doxygen to generate documentation using an existing ");
10553 msg(
"configuration file:\n");
10554 msg(
" %s [configName]\n\n",
qPrint(name));
10555 msg(
"4) Use doxygen to generate a template file controlling the layout of the\n");
10556 msg(
" generated documentation:\n");
10557 msg(
" %s -l [layoutFileName]\n\n",
qPrint(name));
10558 msg(
" In case layoutFileName is omitted layoutFileName.xml will be used as filename.\n");
10559 msg(
" If - is used for layoutFileName doxygen will write to standard output.\n\n");
10560 msg(
"5) Use doxygen to generate a template style sheet file for RTF, HTML or Latex.\n");
10561 msg(
" RTF: %s -w rtf styleSheetFile\n",
qPrint(name));
10562 msg(
" HTML: %s -w html headerFile footerFile styleSheetFile [configFile]\n",
qPrint(name));
10563 msg(
" LaTeX: %s -w latex headerFile footerFile styleSheetFile [configFile]\n\n",
qPrint(name));
10564 msg(
"6) Use doxygen to generate a rtf extensions file\n");
10565 msg(
" %s -e rtf extensionsFile\n\n",
qPrint(name));
10566 msg(
" If - is used for extensionsFile doxygen will write to standard output.\n\n");
10567 msg(
"7) Use doxygen to compare the used configuration file with the template configuration file\n");
10568 msg(
" %s -x [configFile]\n\n",
qPrint(name));
10569 msg(
"8) Use doxygen to show a list of built-in emojis.\n");
10570 msg(
" %s -f emoji outputFileName\n\n",
qPrint(name));
10571 msg(
" If - is used for outputFileName doxygen will write to standard output.\n\n");
10572 msg(
"If -s is specified the comments of the configuration items in the config file will be omitted.\n");
10573 msg(
"If configName is omitted 'Doxyfile' will be used as a default.\n");
10574 msg(
"If - is used for configFile doxygen will write / read the configuration to /from standard output / input.\n\n");
10575 msg(
"If -q is used for a doxygen documentation run, doxygen will see this as if QUIET=YES has been set.\n\n");
10576 msg(
"-v print version string, -V print extended version information\n");
10583 static const char *
getArg(
int argc,
char **argv,
int &optInd)
10586 if (
qstrlen(&argv[optInd][2])>0)
10587 s=&argv[optInd][2];
10588 else if (optInd+1<argc && argv[optInd+1][0]!=
'-')
10607 return []() {
return std::make_unique<T>(); };
10615 std::setlocale(LC_ALL,
"");
10616 std::setlocale(LC_CTYPE,
"C");
10617 std::setlocale(LC_NUMERIC,
"C");
10625 make_parser_factory<FileCodeParser>());
10627 make_parser_factory<CCodeParser>());
10629 make_parser_factory<PythonCodeParser>());
10631 make_parser_factory<FortranCodeParser>());
10633 make_parser_factory<FortranCodeParserFree>());
10635 make_parser_factory<FortranCodeParserFixed>());
10637 make_parser_factory<VHDLCodeParser>());
10639 make_parser_factory<XMLCodeParser>());
10641 make_parser_factory<SQLCodeParser>());
10643 make_parser_factory<FileCodeParser>());
10645 make_parser_factory<LexCodeParser>());
10654 #ifdef USE_LIBCLANG
10731 while (v!=0) v>>=1,r++;
10735 return std::max(0,std::min(r-16,9));
10740 QCString versionString = getFullVersion();
10752 bool genConfig=
FALSE;
10753 bool shortList=
FALSE;
10754 bool diffList=
FALSE;
10755 bool updateConfig=
FALSE;
10757 bool quiet =
false;
10758 while (optInd<argc && argv[optInd][0]==
'-' &&
10759 (
isalpha(argv[optInd][1]) || argv[optInd][1]==
'?' ||
10760 argv[optInd][1]==
'-')
10763 switch(argv[optInd][1])
10769 if (optInd+1>=argc)
10771 layoutName=
"DoxygenLayout.xml";
10775 layoutName=argv[optInd+1];
10782 debugLabel=
getArg(argc,argv,optInd);
10792 err(
"option \"-d\" has unknown debug specifier: \"%s\".\n",
qPrint(debugLabel));
10808 formatName=
getArg(argc,argv,optInd);
10811 err(
"option \"-e\" is missing format specifier rtf.\n");
10817 if (optInd+1>=argc)
10819 err(
"option \"-e rtf\" is missing an extensions file name\n");
10832 err(
"option \"-e\" has invalid format specifier.\n");
10837 listName=
getArg(argc,argv,optInd);
10840 err(
"option \"-f\" is missing list specifier.\n");
10846 if (optInd+1>=argc)
10848 err(
"option \"-f emoji\" is missing an output file name\n");
10861 err(
"option \"-f\" has invalid list specifier.\n");
10866 formatName=
getArg(argc,argv,optInd);
10869 err(
"option \"-w\" is missing format specifier rtf, html or latex\n");
10875 if (optInd+1>=argc)
10877 err(
"option \"-w rtf\" is missing a style sheet file name\n");
10893 if (optInd+4<argc ||
FileInfo(
"Doxyfile").exists())
10899 err(
"error opening or reading configuration file %s!\n",argv[optInd+4]);
10904 if (optInd+3>=argc)
10906 err(
"option \"-w html\" does not have enough arguments\n");
10940 if (optInd+4<argc ||
FileInfo(
"Doxyfile").exists())
10945 err(
"error opening or reading configuration file %s!\n",argv[optInd+4]);
10950 if (optInd+3>=argc)
10952 err(
"option \"-w latex\" does not have enough arguments\n");
10985 err(
"Illegal format specifier \"%s\": should be one of rtf, html or latex\n",
qPrint(formatName));
11004 if (
qstrcmp(&argv[optInd][2],
"help")==0)
11006 usage(argv[0],versionString);
11009 else if (
qstrcmp(&argv[optInd][2],
"version")==0)
11015 else if ((
qstrcmp(&argv[optInd][2],
"Version")==0) ||
11016 (
qstrcmp(&argv[optInd][2],
"VERSION")==0))
11024 err(
"Unknown option \"-%s\"\n",&argv[optInd][1]);
11025 usage(argv[0],versionString);
11030 setvbuf(stdout,NULL,_IONBF,0);
11036 msg(
"Warning: this option activates output generation via Django like template files. "
11037 "This option is scheduled for doxygen 2.0, is currently incomplete and highly experimental! "
11038 "Only use if you are a doxygen developer\n");
11043 usage(argv[0],versionString);
11047 err(
"Unknown option \"-%c\"\n",argv[optInd][1]);
11048 usage(argv[0],versionString);
11060 FileInfo configFileInfo1(
"Doxyfile"),configFileInfo2(
"doxyfile");
11063 if (configFileInfo1.exists())
11065 configName=
"Doxyfile";
11067 else if (configFileInfo2.
exists())
11069 configName=
"doxyfile";
11071 else if (genConfig)
11073 configName=
"Doxyfile";
11077 err(
"Doxyfile not found and no input file specified!\n");
11078 usage(argv[0],versionString);
11085 if (fi.
exists() ||
qstrcmp(argv[optInd],
"-")==0 || genConfig)
11087 configName=argv[optInd];
11091 err(
"configuration file %s not found!\n",argv[optInd]);
11092 usage(argv[0],versionString);
11113 err(
"could not open or read configuration file %s!\n",
qPrint(configName));
11180 for (
const auto &mapping : extMaps)
11182 QCString mapStr = mapping.c_str();
11183 int i=mapStr.
find(
'=');
11199 err(
"Failed to map file extension '%s' to unsupported language '%s'.\n"
11200 "Check the EXTENSION_MAPPING setting in the config file.\n",
11205 msg(
"Adding custom extension mapping: '%s' will be treated as language '%s'\n",
11213 for (
const auto &s : expandAsDefinedList)
11231 signal(SIGINT,SIG_DFL);
11233 msg(
"Cleaning up...\n");
11247 if (generateTagFile.
isEmpty())
return;
11249 std::ofstream f(generateTagFile.
str(),std::ofstream::out | std::ofstream::binary);
11252 err(
"cannot open tag file %s for writing\n",
11258 tagFile <<
"<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>\n";
11259 tagFile <<
"<tagfile doxygen_version=\"" << getDoxygenVersion() <<
"\"";
11260 if (strlen(getGitVersion())>0)
11262 tagFile <<
" doxygen_gitid=\"" << getGitVersion() <<
"\"";
11269 for (
const auto &fd : *fn)
11309 if (pd->isLinkableInProject()) pd->writeTagFile(tagFile);
11313 tagFile <<
"</tagfile>\n";
11321 msg(
"Exiting...\n");
11331 const char *defaultDirName)
11336 result = baseDirName + defaultDirName;
11338 else if (formatDirName[0]!=
'/' && (formatDirName.
length()==1 || formatDirName[1]!=
':'))
11340 result.
prepend(baseDirName+
"/");
11342 Dir formatDir(result.
str());
11345 err(
"Could not create output directory %s\n",
qPrint(result));
11378 g_s.
begin(
"Searching for include files...\n");
11381 for (
const auto &s : includePathList)
11399 g_s.
begin(
"Searching for example files...\n");
11402 for (
const auto &s : examplePathList)
11417 g_s.
begin(
"Searching for images...\n");
11420 for (
const auto &s : imagePathList)
11435 g_s.
begin(
"Searching for dot files...\n");
11438 for (
const auto &s : dotFileList)
11453 g_s.
begin(
"Searching for msc files...\n");
11456 for (
const auto &s : mscFileList)
11471 g_s.
begin(
"Searching for dia files...\n");
11474 for (
const auto &s : diaFileList)
11489 g_s.
begin(
"Searching for files to exclude\n");
11491 for (
const auto &s : excludeList)
11509 g_s.
begin(
"Searching INPUT for files to process...\n");
11513 for (
const auto &s : inputList)
11520 if (path.
at(l-1)==
'\\' || path.
at(l-1)==
'/') path=path.
left(l-1);
11540 [](
const auto &f1,
const auto &f2)
11542 return qstricmp(f1->fullName(),f2->fullName())<0;
11546 if (fileName->
size()>1)
11548 std::sort(fileName->begin(),fileName->end(),[](
const auto &f1,
const auto &f2)
11550 return qstricmp(f1->absFilePath(),f2->absFilePath())<0;
11568 QCString versionString = getFullVersion();
11569 msg(
"Doxygen version used: %s\n",
qPrint(versionString));
11575 if (outputDirectory.
isEmpty())
11581 Dir dir(outputDirectory.
str());
11585 if (!dir.
mkdir(outputDirectory.
str()))
11587 err(
"tag OUTPUT_DIRECTORY: Output directory '%s' does not "
11588 "exist and cannot be created\n",
qPrint(outputDirectory));
11594 msg(
"Notice: Output directory '%s' does not exist. "
11595 "I have created it for you.\n",
qPrint(outputDirectory));
11608 if (cacheSize<0) cacheSize=0;
11609 if (cacheSize>9) cacheSize=9;
11610 uint lookupSize = 65536 << cacheSize;
11634 bool generateEclipseHelp =
Config_getBool(GENERATE_ECLIPSEHELP);
11648 if (generateDocbook)
11706 newFontPath+=curFontPath;
11724 bool defaultLayoutUsed =
FALSE;
11725 if (layoutFileName.
isEmpty())
11728 defaultLayoutUsed =
TRUE;
11734 msg(
"Parsing layout file %s...\n",
qPrint(layoutFileName));
11737 else if (!defaultLayoutUsed)
11739 warn_uncond(
"failed to open layout file '%s' for reading!\n",
qPrint(layoutFileName));
11748 if (generateHtml) exclPatterns.push_back(htmlOutput.
str());
11749 if (generateDocbook) exclPatterns.push_back(docbookOutput.
str());
11750 if (generateXml) exclPatterns.push_back(xmlOutput.
str());
11751 if (generateLatex) exclPatterns.push_back(latexOutput.
str());
11752 if (generateRtf) exclPatterns.push_back(rtfOutput.
str());
11753 if (generateMan) exclPatterns.push_back(manOutput.
str());
11784 std::shared_ptr<Entry> root = std::make_shared<Entry>();
11785 msg(
"Reading and parsing tag files\n");
11788 for (
const auto &s : tagFileList)
11814 g_s.
begin(
"Building macro definition list...\n");
11818 g_s.
begin(
"Building group list...\n");
11823 g_s.
begin(
"Building directory list...\n");
11828 g_s.
begin(
"Building namespace list...\n");
11833 g_s.
begin(
"Building file list...\n");
11837 g_s.
begin(
"Building class list...\n");
11841 g_s.
begin(
"Building concept list...\n");
11849 g_s.
begin(
"Computing nesting relations for classes...\n");
11862 g_s.
begin(
"Associating documentation with classes...\n");
11866 g_s.
begin(
"Associating documentation with concepts...\n");
11870 g_s.
begin(
"Building example list...\n");
11874 g_s.
begin(
"Searching for enumerations...\n");
11882 g_s.
begin(
"Searching for documented typedefs...\n");
11883 buildTypedefList(root.get());
11888 g_s.
begin(
"Searching for documented sequences...\n");
11889 buildSequenceList(root.get());
11892 g_s.
begin(
"Searching for documented dictionaries...\n");
11893 buildDictionaryList(root.get());
11897 g_s.
begin(
"Searching for members imported via using declarations...\n");
11904 g_s.
begin(
"Searching for included using directives...\n");
11908 g_s.
begin(
"Searching for documented variables...\n");
11909 buildVarList(root.get());
11912 g_s.
begin(
"Building interface member list...\n");
11913 buildInterfaceAndServiceList(root.get());
11915 g_s.
begin(
"Building member list...\n");
11916 buildFunctionList(root.get());
11919 g_s.
begin(
"Searching for friends...\n");
11923 g_s.
begin(
"Searching for documented defines...\n");
11927 g_s.
begin(
"Computing class inheritance relations...\n");
11932 g_s.
begin(
"Computing class usage relations...\n");
11938 g_s.
begin(
"Searching for tag less structs...\n");
11943 g_s.
begin(
"Flushing cached template relations that have become invalid...\n");
11947 g_s.
begin(
"Computing class relations...\n");
11958 g_s.
begin(
"Add enum values to enums...\n");
11963 g_s.
begin(
"Searching for member function documentation...\n");
11974 g_s.
begin(
"Creating members for template instances...\n");
11978 g_s.
begin(
"Building page list...\n");
11982 g_s.
begin(
"Search for main page...\n");
11987 g_s.
begin(
"Computing page relations...\n");
11992 g_s.
begin(
"Determining the scope of groups...\n");
12007 return qstricmp(c1->name(), c2->name())<0;
12011 int i =
qstricmp(c1->className(), c2->className());
12012 return i==0 ?
qstricmp(c1->name(), c2->name())<0 : i<0;
12018 return qstricmp(n1->name(),n2->name())<0;
12023 return qstricmp(c1->name(),c2->name())<0;
12047 g_s.
begin(
"Determining which enums are documented\n");
12051 g_s.
begin(
"Computing member relations...\n");
12056 g_s.
begin(
"Building full member lists recursively...\n");
12060 g_s.
begin(
"Adding members to member groups.\n");
12066 g_s.
begin(
"Distributing member group documentation.\n");
12071 g_s.
begin(
"Computing member references...\n");
12077 g_s.
begin(
"Inheriting documentation...\n");
12084 g_s.
begin(
"Generating disk names...\n");
12088 g_s.
begin(
"Adding source references...\n");
12092 g_s.
begin(
"Adding xrefitems...\n");
12097 g_s.
begin(
"Sorting member lists...\n");
12101 g_s.
begin(
"Setting anonymous enum type...\n");
12107 g_s.
begin(
"Computing dependencies between directories...\n");
12112 g_s.
begin(
"Generating citations page...\n");
12116 g_s.
begin(
"Counting members...\n");
12120 g_s.
begin(
"Counting data structures...\n");
12124 g_s.
begin(
"Resolving user defined references...\n");
12128 g_s.
begin(
"Finding anchors and sections in the documentation...\n");
12132 g_s.
begin(
"Transferring function references...\n");
12136 g_s.
begin(
"Combining using relations...\n");
12140 g_s.
begin(
"Adding members to index pages...\n");
12145 g_s.
begin(
"Correcting members for VHDL...\n");
12149 g_s.
begin(
"Computing tooltip texts...\n");
12157 [](
const auto &g1,
const auto &g2)
12158 {
return g1->groupTitle() < g2->groupTitle(); });
12205 if (generateDocbook)
12225 err(
"USE_HTAGS is YES but htags(1) failed. \n");
12227 err(
"htags(1) ended normally but failed to load the filemap. \n");
12234 g_s.
begin(
"Generating style sheet...\n");
12240 static bool serverBasedSearch =
Config_getBool(SERVER_BASED_SEARCH);
12242 g_s.
begin(
"Generating search indices...\n");
12251 if (generateHtml && searchEngine)
12254 Dir searchDir(searchDirName.
str());
12255 if (!searchDir.
exists() && !searchDir.
mkdir(searchDirName.
str()))
12257 term(
"Could not create search results directory '%s' $PWD='%s'\n",
12261 if (!serverBasedSearch)
12282 if (generateDocbook)
12295 g_s.
begin(
"Generating images for formulas in HTML...\n");
12302 g_s.
begin(
"Generating images for formulas in RTF...\n");
12309 g_s.
begin(
"Generating images for formulas in Docbook...\n");
12314 g_s.
begin(
"Generating example documentation...\n");
12320 g_s.
begin(
"Generating file sources...\n");
12324 g_s.
begin(
"Generating file documentation...\n");
12328 g_s.
begin(
"Generating page documentation...\n");
12332 g_s.
begin(
"Generating group documentation...\n");
12336 g_s.
begin(
"Generating class documentation...\n");
12340 g_s.
begin(
"Generating concept documentation...\n");
12344 g_s.
begin(
"Generating namespace index...\n");
12350 g_s.
begin(
"Generating graph info page...\n");
12355 g_s.
begin(
"Generating directory documentation...\n");
12364 g_s.
begin(
"finalizing index lists...\n");
12368 g_s.
begin(
"writing tag file...\n");
12374 g_s.
begin(
"Generating XML output...\n");
12383 g_s.
begin(
"Generating SQLITE3 output...\n");
12391 g_s.
begin(
"Generating AutoGen DEF output...\n");
12397 g_s.
begin(
"Generating Perl module output...\n");
12401 if (generateHtml && searchEngine && serverBasedSearch)
12403 g_s.
begin(
"Generating search index\n");
12413 if (searchDataFile.
isEmpty())
12415 searchDataFile=
"searchdata.xml";
12428 g_s.
begin(
"Generating output via template engine...\n");
12437 g_s.
begin(
"Combining RTF output...\n");
12440 err(
"An error occurred during post-processing the RTF files!\n");
12447 g_s.
begin(
"Running plantuml with JAVA...\n");
12460 if (generateHtml &&
12464 g_s.
begin(
"Running html help compiler...\n");
12471 err(
"failed to run html help compiler on index.hhp\n");
12480 if ( generateHtml &&
12484 g_s.
begin(
"Running qhelpgenerator...\n");
12494 err(
"failed to run qhelpgenerator on index.qhp\n");
12504 msg(
"lookup cache used %zu/%zu hits=%" PRIu64
" misses=%" PRIu64
"\n",
12512 msg(
"Note: based on cache misses the ideal setting for LOOKUP_CACHE_SIZE is %d at the cost of higher memory usage.\n",cacheParam);
12517 msg(
"Total elapsed time: %.6f seconds\n(of which %.6f seconds waiting for external tools to finish)\n",
12525 msg(
"finished...\n");
virtual QCString requiresClause() const =0
void setVolatileSpecifier(bool b)
NamespaceDefMutable * 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
Definition * toDefinition(DefinitionMutable *dm)
virtual void setInbodyDocumentation(const QCString &d, const QCString &docFile, int docLine)=0
void combineDeclarationAndDefinition(MemberDefMutable *mdec, MemberDefMutable *mdef)
std::vector< std::string > StringVector
static void flushUnresolvedRelations()
static void buildClassDocList(const Entry *root)
std::set< const FileDef * > FileDefSet
static DotManager * instance()
virtual void setTemplateSpecialization(bool b)=0
static void addIncludeFile(DefMutable *cd, FileDef *ifd, const Entry *root)
virtual void sortMemberLists()=0
virtual void setTagInfo(const TagInfo *i)=0
std::future< R > queue(F &&f)
Queue the callable function f for the threads to execute.
static bool isalpha(char c)
static std::string currentDirPath()
void startTitle(OutputList &ol, const QCString &fileName, const DefinitionMutable *def)
virtual void setDocumentation(const QCString &d, const QCString &docFile, int docLine, bool stripWhiteSpace=TRUE)=0
QCString args
member argument string
static void correctMemberProperties(MemberDefMutable *md)
virtual void setEnumScope(const MemberDef *md, bool livesInsideEnum=FALSE)=0
virtual void getAllIncludeFilesRecursively(StringVector &incFiles) const =0
virtual void setDiskName(const QCString &name)=0
virtual bool isTypedef() const =0
virtual bool hasDocumentation() const =0
returns TRUE if this class has documentation
ArgumentLists tArgLists
template argument declarations
This struct is used to capture the tag file information for an Entry.
virtual void insertNamespace(const NamespaceDef *nd)=0
QCString stripAnonymousNamespaceScope(const QCString &s)
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 managing a pool of worker threads.
Generator for HTML output
virtual void setHidden(bool b)=0
FileDef * findFileDef(const FileNameLinkedMap *fnMap, const QCString &n, bool &ambig)
void setTrailingReturnType(const QCString &s)
@ GROUPDOC_NORMAL
defgroup
Specifier virt
virtualness of the entry
virtual void addSectionsToDefinition(const std::vector< const SectionInfo * > &anchorList)=0
virtual int docLine() const =0
static void copyExtraFiles(const StringVector &files, const QCString &filesOption, const QCString &outputOption)
QCString getTemplateSpec() const
In case a call to resolveClass() points to a template specialization, the template part is return via...
virtual void mergeMemberSpecifiers(uint64 s)=0
virtual void setSubGrouping(bool enabled)=0
static RefListManager & instance()
static void transferRelatedFunctionDocumentation()
bool findAndRemoveWord(QCString &sentence, const char *word)
removes occurrences of whole word from sentence, while keeps internal spaces and reducing multiple se...
virtual void addUsedClass(ClassDef *cd, const QCString &accessName, Protection prot)=0
bool leftScopeMatch(const QCString &scope, const QCString &name)
virtual void addListReferences()=0
virtual LinkedRefMap< const NamespaceDef > getUsedNamespaces() const =0
void endTitle(OutputList &ol, const QCString &fileName, const QCString &name)
MemberDefMutable * toMemberDefMutable(Definition *d)
virtual QCString anchor() const =0
void push_back(const Argument &a)
ClassDef * createClassDefAlias(const Definition *newScope, const ClassDef *cd)
static void generateConfigFile(const QCString &configFile, bool shortList, bool updateOnly=FALSE)
virtual bool hasReferencedByRelation() const =0
void switchToFile(const FileDef *fd)
Switches to another file within the translation unit started with start().
QCString & replace(size_t index, size_t len, const char *s)
static StringSet g_usingDeclarations
static std::unique_ptr< PageDef > mainPage
Protection
Protection level of members
Class representing all files with a certain base name
#define Config_getEnum(name)
virtual void setInitializer(const QCString &i)=0
TextStream initializer
initial value (for variables)
virtual QCString argsString() const =0
virtual void addListReferences()=0
stat(const char *n, double el)
static void expandAliases()
virtual void addMembersToMemberGroup()=0
void printNavTree(Entry *root, int indent)
virtual bool generateSourceFile() const =0
virtual void addUsingDirective(const NamespaceDef *nd)=0
static StringUnorderedSet g_pathsVisited(1009)
static void buildFileList(const Entry *root)
virtual void setTypeConstraints(const ArgumentList &al)=0
void setTranslator(OUTPUT_LANGUAGE_t langName)
QCString stripFromIncludePath(const QCString &path)
virtual QCString briefDescription(bool abbr=FALSE) const =0
virtual int getDefColumn() const =0
int startLine
start line of entry in the source
static StringUnorderedMap namespaceAliasMap
The common base class of all entity definitions found in the sources.
bool callGraph
do we need to draw the call graph?
virtual QCString documentation() const =0
virtual void setCompoundType(CompoundType t)=0
virtual bool isObjCProperty() const =0
static FileNameLinkedMap * imageNameLinkedMap
bool remove(const std::string &path, bool acceptsAbsPath=true) const
virtual QCString localName() const =0
virtual bool isStatic() const =0
virtual bool isEmbeddedInOuterScope() const =0
An abstract interface of a namespace symbol.
Class representing a directory in the file system
virtual void sortAllMembersList()=0
virtual void setAccessorType(ClassDef *cd, const QCString &t)=0
static void findMemberDocumentation(const Entry *root)
static bool isRecursiveBaseClass(const QCString &scope, const QCString &name)
virtual void setDefFile(const QCString &df, int defLine, int defColumn)=0
static FileNameLinkedMap * diaFileNameLinkedMap
virtual void writeDocumentation(OutputList &ol)=0
static void deleteInstance()
void docify(const QCString &s)
void addClassMemberNameToIndex(const MemberDef *md)
virtual int getMemberGroupId() const =0
static std::unique_ptr< OutlineParserInterface > getParserForFile(const QCString &fn)
void clear()
clears the database
virtual void setInline(bool isInline)=0
QCString substituteTemplateArgumentsInString(const QCString &nm, const ArgumentList &formalArgs, const std::unique_ptr< ArgumentList > &actualArgs)
void writeJavaScriptSearchIndex()
static void buildGroupList(const Entry *root)
virtual void makeRelated()=0
static void findClassEntries(const Entry *root)
static ClassLinkedMap * hiddenClassLinkedMap
Buffer used to store strings
uint length() const
Returns the length of the string, not counting the 0-terminator.
void parsePrototype(const QCString &)
Callback function called by the comment block scanner.
static StringMap tagDestinationMap
virtual void distributeMemberGroupDocumentation()=0
virtual ClassLinkedRefMap getExceptions() const =0
This class represents an function or template argument list.
static const uint64 ForwardDecl
static ConceptLinkedMap * conceptLinkedMap
virtual bool isLinkableInProject() const =0
A model of a directory symbol.
virtual int getDefLine() const =0
int findRev(char c, int index=-1, bool cs=TRUE) const
static void countMembers()
uint64 spec
class/member specifiers
QCString filterTitle(const QCString &title)
static void generateDiskNames()
virtual void setName(const QCString &name)=0
std::chrono::steady_clock::time_point startTime
static FileNameLinkedMap * dotFileNameLinkedMap
static void transferFunctionDocumentation()
bool isEmpty() const
Returns TRUE iff the string is empty
virtual void writeMemberList(OutputList &ol) const =0
Generator for RTF output.
virtual ClassDef * insertTemplateInstance(const QCString &fileName, int startLine, int startColumn, const QCString &templSpec, bool &freshInstance) const =0
bool match(const std::string &str, Match &match, const Ex &re)
Matches a given string str for a match against regular expression re.
void initFileMemberIndices()
virtual void setReference(const QCString &r)=0
static QCString createOutputDirectory(const QCString &baseDirName, const QCString &formatDirName, const char *defaultDirName)
static void transferFunctionReferences()
virtual const Definition * findInnerCompound(const QCString &name) const =0
virtual const GroupDef * getGroupDef() const =0
MethodTypes mtype
signal, slot, (dcop) method, or property?
static PageLinkedMap * pageLinkedMap
static void sortMemberLists()
static void writeStyleSheetFile(TextStream &t)
virtual void addUsingDeclaration(const ClassDef *cd)=0
static void addPageToContext(PageDef *pd, Entry *root)
std::vector< BaseInfo > extends
list of base classes
static IndexList * indexList
static void addRelatedPage(Entry *root)
virtual QCString groupTitle() const =0
virtual void setBitfields(const QCString &s)=0
CompoundType
The various compound types
static void findGroupScope(const Entry *root)
PageDef * createPageDef(const QCString &f, int l, const QCString &n, const QCString &d, const QCString &t)
static void dumpSymbol(TextStream &t, Definition *d)
static bool isSymbolHidden(const Definition *d)
bool copyFile(const QCString &src, const QCString &dest)
Copies the contents of file with name src to the newly created file with name dest.
uint size() const
Returns the length of the string, not counting the 0-terminator.
static void flushCachedTemplateRelations()
Helper class to find a class definition or check if A symbol is accessible in a given scope.
FindBaseClassRelation_Mode
static void computeTooltipTexts()
int startColumn
start column of entry in the source
void checkConfiguration()
check and resolve config options
static void organizeSubGroupsFiltered(const Entry *root, bool additional)
static void generateGroupDocs()
MemberDef * toMemberDef(Definition *d)
virtual QCString bitfieldString() const =0
static QCString extractClassName(const Entry *root)
virtual bool addNamespace(const NamespaceDef *def)=0
virtual ClassLinkedRefMap getInterfaces() const =0
bool hidden
does this represent an entity that is hidden from the output
static void findTemplateInstanceRelation(const Entry *root, Definition *context, ClassDefMutable *templateClass, const QCString &templSpec, const TemplateNameMap &templateNames, bool isArtificial)
static void generateExampleDocs()
Protection prot
inheritance type
virtual void countMembers()=0
virtual void setArgsString(const QCString &as)=0
SrcLangExt
Language as given by extension
std::vector< const SectionInfo * > anchors
list of anchors defined in this entry
T * add(const char *k, Args &&... args)
Adds a new object to the ordered vector if it was not added already.
void setPerlModDoxyfile(const QCString &qs)
static void buildDefineList()
static int findTemplateSpecializationPosition(const QCString &name)
virtual bool isPrototype() const =0
void addIndexItem(const Definition *context, const MemberDef *md, const QCString §ionAnchor=QCString(), const QCString &title=QCString())
static NamespaceDefMutable * globalScope
static void inheritDocumentation()
std::unordered_map< std::string, std::string > StringUnorderedMap
virtual void countMembers()=0
static void findUsedClassesForClass(const Entry *root, Definition *context, ClassDefMutable *masterCd, ClassDefMutable *instanceCd, bool isArtificial, const std::unique_ptr< ArgumentList > &actualArgs=std::unique_ptr< ArgumentList >(), const TemplateNameMap &templateNames=TemplateNameMap())
bool referencedByRelation
do we need to show the referenced by relation?
void addNamespaceToGroups(const Entry *root, NamespaceDef *nd)
std::set< std::string > StringSet
static DefinesPerFileList macroDefinitions
int mGrpId
member group id
QCString stripTemplateSpecifiersFromScope(const QCString &fullName, bool parentOnly, QCString *pLastScopeStripped)
static void writeStyleSheetFile(TextStream &t)
virtual void setMemberClass(const ClassDef *cd)=0
virtual void writeDocumentation(OutputList &ol)=0
static void generateNamespaceDocs()
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 ...
Protection protection
class protection
std::unique_ptr< RefList > Ptr
void addConceptToGroups(const Entry *root, ConceptDef *cd)
static void writeSearchData(const QCString &dir)
void addIndex(As &&... args)
Add an index generator to the list, using a syntax similar to std::make_unique<T>()
virtual void insertBaseClass(ClassDef *, const QCString &name, Protection p, Specifier s, const QCString &t=QCString())=0
virtual bool isInline() const =0
Specifier
Virtualness of a member.
virtual bool isHidden() const =0
static StringMap aliasMap
virtual void insertClass(const ClassDef *cd)=0
virtual bool isLinkableInProject() const =0
returns TRUE iff a link is possible to this item within this project.
virtual void setRequiresClause(const QCString &req)=0
virtual void mergeReferences(const Definition *other)=0
static PlantumlManager & instance()
QCString briefFile
file in which the brief desc. was found
virtual QCString anchor() const =0
virtual void insertEnumField(const MemberDef *md)=0
virtual void makeImplementationDetail()=0
static void dumpSymbolMap()
static const ClassDef * findClassDefinition(FileDef *fd, NamespaceDef *nd, const QCString &scopeName)
static void addLocalObjCMethod(const Entry *root, const QCString &scopeName, const QCString &funcType, const QCString &funcName, const QCString &funcArgs, const QCString &exceptions, const QCString &funcDecl, uint64 spec)
QCString includeName
include name (3 arg of \class)
static bool parseSourcesNeeded
virtual const TemplateNameMap & getTemplateBaseClassNames() const =0
static void addMemberDocs(const Entry *root, MemberDefMutable *md, const QCString &funcDecl, const ArgumentList *al, bool over_load, uint64 spec)
virtual bool isLinkableInProject() const =0
void err(const char *fmt,...)
virtual int inbodyLine() const =0
virtual void setDocsForDefinition(bool b)=0
char & at(size_t i)
Returns a reference to the character at index i.
virtual void setTemplateBaseClassNames(const TemplateNameMap &templateNames)=0
Text streaming class that buffers data.
static DirLinkedMap * dirLinkedMap
void warn_simple(const QCString &file, int line, const char *text)
int docLine
line number at which the documentation was found
void distributeClassGroupRelations()
MemberDefMutable * 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
QCString includeFile
include file (2 arg of \class, must be unique)
int find(char c, int index=0, bool cs=TRUE) const
FileDef * fileDef() const
virtual void insertReimplementedBy(const MemberDef *md)=0
static void addOverloaded(const Entry *root, MemberName *mn, const QCString &funcType, const QCString &funcName, const QCString &funcArgs, const QCString &funcDecl, const QCString &exceptions, uint64 spec)
static CitationManager & instance()
virtual int briefLine() const =0
virtual void setBriefDescription(const QCString &b, const QCString &briefFile, int briefLine)=0
virtual void writeTagFile(TextStream &)=0
static void findEnums(const Entry *root)
std::unordered_map< std::string, const Definition * > ClangUsrMap
NamespaceDef * getResolvedNamespace(const QCString &name)
static void generateConceptDocs()
ClassDef * getClass(const QCString &n)
static void computeClassRelations()
void readConfiguration(int argc, char **argv)
virtual FileDef * getFileDef() const =0
Returns the namespace this compound is in, or 0 if it has a global scope.
static void parseFilesMultiThreading(const std::shared_ptr< Entry > &root)
parse the list of input files
void writeStyleInfo(int part)
virtual void distributeMemberGroupDocumentation()=0
bool patternMatch(const FileInfo &fi, const StringVector &patList)
static FileNameLinkedMap * exampleNameLinkedMap
static bool isSpecialization(const ArgumentLists &srcTempArgLists, const ArgumentLists &dstTempArgLists)
virtual bool isLinkableInProject() const =0
virtual void setLocalToc(const LocalToc &tl)=0
virtual const QCString & docName() const =0
static Definition * findScopeFromQualifiedName(NamespaceDefMutable *startScope, const QCString &n, FileDef *fileScope, const TagInfo *tagInfo)
virtual QCString docFile() const =0
QCString stripTemplateSpecifiers(const QCString &s)
void createJavaScriptSearchIndex()
bool rightScopeMatch(const QCString &scope, const QCString &name)
static void writeExternalSearchPage()
bool protectionLevelVisible(Protection prot)
static void resolveClassNestingRelations()
static void addToIndices()
void warn(const QCString &file, int line, const char *fmt,...)
SectionInfo * replace(const QCString &label, const QCString &fileName, int lineNr, const QCString &title, SectionType type, int level, const QCString &ref=QCString())
Replace an existing section with a new one Return a non-owning pointer to the newly added section
DirIterator begin(DirIterator it) noexcept
virtual SrcLangExt getLanguage() const =0
Returns the programming language this definition was written in.
static bool isVarWithConstructor(const Entry *root)
Ordered dictionary of FileName objects.
QCString relates
related class (doc block)
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)
virtual void setIsStatic(bool b)=0
static const uint64 Alias
QCString doc
documentation block (partly parsed)
QCString getOverloadDocs()
static bool isFlagSet(DebugMask mask)
static void buildConceptDocList(const Entry *root)
Iterator class to iterator through matches.
bool hasParameters() const
static SymbolMap< Definition > * symbolMap
QCString getenv(const QCString &variable)
void markAsProcessed() const
A linked map of directories
virtual LinkedRefMap< const NamespaceDef > getUsedNamespaces() const =0
static void organizeSubGroups(const Entry *root)
DirIterator end(const DirIterator &) noexcept
static bool generatingXmlOutput
GroupDocType groupDocType
int contains(char c, bool cs=TRUE) const
static void writeStyleSheetFile(TextStream &t)
std::unordered_set< std::string > StringUnorderedSet
static OutputList * g_outputList
virtual const ClassDef * templateMaster() const =0
Returns the template master of which this class is an instance.
virtual void writeTagFile(TextStream &)=0
A model of a page symbol.
A model of a group of symbols.
virtual void setBodyDef(const FileDef *fd)=0
void addClassToGroups(const Entry *root, ClassDef *cd)
static void version(const bool extended)
static void writeFooterFile(TextStream &t)
static FileNameLinkedMap * inputNameLinkedMap
virtual void computeAnchors()=0
virtual void setMemberGroupId(int id)=0
QCString name
the name of the base class
static void buildConceptList(const Entry *root)
static void copyLatexStyleSheet()
virtual bool isTypedefValCached() const =0
QCString inbodyDocs
documentation inside the body of a function
virtual void setMaxInitLines(int lines)=0
static const uint64 Union
QCString metaData
Slice metadata
NamespaceDefMutable * toNamespaceDefMutable(Definition *d)
static void findInheritedTemplateInstances()
virtual void setFileDef(FileDef *fd)=0
virtual void combineUsingRelations(NamespaceDefSet &visitedNamespace)=0
static void findIncludedUsingDirectives()
#define Config_updateList(name,...)
static const uint64 Optional
virtual bool isLinkableInProject() const =0
DefinitionMutable * toDefinitionMutable(Definition *d)
static ClangParser * instance()
Returns the one and only instance of the class
#define Config_updateString(name, value)
virtual QCString anchor() const =0
static const uint64 Struct
static void findBaseClassesForClass(const Entry *root, Definition *context, ClassDefMutable *masterCd, ClassDefMutable *instanceCd, FindBaseClassRelation_Mode mode, bool isArtificial, const std::unique_ptr< ArgumentList > &actualArgs=std::unique_ptr< ArgumentList >(), const TemplateNameMap &templateNames=TemplateNameMap())
virtual const FileDef * getBodyDef() const =0
virtual void setMetaData(const QCString &md)=0
virtual void writeTagFile(TextStream &)=0
void addSearchDir(const QCString &dir)
Class representing a list of output generators that are written to in parallel.
virtual void setClassName(const QCString &name)=0
void addDirToGroups(const Entry *root, DirDef *dd)
static const uint64 Interface
virtual QCString qualifiedName() const =0
virtual void setBriefDescription(const QCString &b, const QCString &briefFile, int briefLine)=0
virtual void setProtection(Protection p)=0
virtual void reclassifyMember(MemberDefMutable *md, MemberType t)=0
virtual bool isSource() const =0
void postProcess(bool clearHeaderAndFooter, bool compare=FALSE)
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 bool isClassSection(const Entry *root)
QCString addHtmlExtensionIfMissing(const QCString &fName)
void setPureSpecifier(bool b)
static void findDocumentedEnumValues()
A model of a class/file/namespace member symbol.
void warn_uncond(const char *fmt,...)
static void findUsedTemplateInstances()
void addGroupToGroups(const Entry *root, GroupDef *subGroup)
static void addConceptToContext(const Entry *root)
virtual bool hasCallerGraph() const =0
static int findEndOfTemplate(const QCString &s, int startPos)
void begin(const char *name)
FileDef * createFileDef(const QCString &p, const QCString &n, const QCString &ref, const QCString &dn)
virtual void setMemberSpecifiers(uint64 s)=0
QCString argListToString(const ArgumentList &al, bool useCanonicalType, bool showDefVals)
virtual void findSectionsInDocumentation()=0
virtual void findSectionsInDocumentation()=0
void processFile(const QCString &fileName, BufStr &input, BufStr &output)
static bool findClassRelation(const Entry *root, Definition *context, ClassDefMutable *cd, const BaseInfo *bi, const TemplateNameMap &templateNames, FindBaseClassRelation_Mode mode, bool isArtificial)
virtual void distributeMemberGroupDocumentation()=0
static int subpageNestingLevel
static StringSet g_compoundKeywords
A abstract class representing of a compound symbol.
virtual const ClassDef * getCachedTypedefVal() const =0
virtual void setArtificial(bool b)=0
static void findDefineDocumentation(Entry *root)
virtual void mergeCategory(ClassDef *category)=0
static bool clangAssistedParsing
QCString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
#define Config_getInt(name)
virtual bool isFriend() const =0
static void generateXRefPages()
static MemberNameLinkedMap * functionNameLinkedMap
virtual void computeAnchors()=0
void disable(OutputGenerator::OutputType o)
static bool g_useOutputTemplate
void addNamespaceMemberNameToIndex(const MemberDef *md)
virtual void makeTemplateArgument(bool b=TRUE)=0
void addMemberToGroups(const Entry *root, MemberDef *md)
virtual ClassDef * relatedAlso() const =0
static void stopDoxygen(int)
QCString left(size_t len) const
static void writeHeaderFile(TextStream &t)
static const uint64 Inline
static void findObjCMethodDefinitions(const Entry *root)
virtual QCString excpString() const =0
static bool findGlobalMember(const Entry *root, const QCString &namespaceName, const QCString &type, const QCString &name, const QCString &tempArg, const QCString &, const QCString &decl, uint64 spec)
static std::shared_ptr< Entry > parseFile(OutlineParserInterface &parser, FileDef *fd, const QCString &fn, ClangTUParser *clangParser, bool newTU)
virtual QCString name() const =0
virtual void setEnumBaseType(const QCString &type)=0
virtual bool isDefine() const =0
static void usage(const QCString &name, const QCString &versionString)
virtual const MemberNameInfoLinkedMap & memberNameInfoLinkedMap() const =0
Returns a dictionary of all members.
virtual Specifier virtualness(int count=0) const =0
static void substituteTemplatesInArgList(const ArgumentLists &srcTempArgLists, const ArgumentLists &dstTempArgLists, const ArgumentList &src, ArgumentList &dst)
virtual void setDefinitionTemplateParameterLists(const ArgumentLists &lists)=0
virtual bool isAlias() const =0
virtual void makePartOfGroup(const GroupDef *gd)=0
virtual bool isVariable() const =0
virtual const MemberVector & enumFieldList() const =0
void addImageFile(const QCString &name)
static ParserManager * parserManager
QCString & insert(size_t index, const QCString &s)
ConceptDefMutable * getConceptMutable(const QCString &key)
virtual bool isAnonymous() const =0
std::unique_ptr< OutlineParserInterface > getOutlineParser(const QCString &extension)
Gets the interface to the parser associated with a given extension.
int briefLine
line number at which the brief desc. was found
static void buildGroupListFiltered(const Entry *root, bool additional, bool includeExternal)
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, uint64 spec)
virtual const TemplateInstanceList & getTemplateInstances() const =0
Returns a sorted dictionary with all template instances found for this template class.
virtual void findSectionsInDocumentation()=0
virtual void addUsingDeclaration(const ClassDef *cd)=0
virtual void sortMemberLists()=0
virtual void setFileDef(FileDef *fd)=0
virtual const BaseClassList & baseClasses() const =0
Returns the list of base classes from which this class directly inherits.
virtual void writeSourceHeader(OutputList &ol)=0
virtual void combineUsingRelations()=0
virtual int initializerLines() const =0
static void print(DebugMask mask, int prio, const char *fmt,...)
static void findUsingDeclarations(const Entry *root, bool filterPythonPackages)
bool updateLanguageMapping(const QCString &extension, const QCString &language)
std::unordered_map< int, std::unique_ptr< MemberGroupInfo > > MemberGroupInfoMap
static StringSet inputPaths
virtual void setInitializer(const QCString &init)=0
virtual void writeDocumentationForInnerClasses(OutputList &ol) const =0
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...
void generateTemplateFiles(const QCString &templateDir)
int section
entry type (see Sections);
QCString removeRedundantWhiteSpace(const QCString &s)
virtual ClassLinkedRefMap getClasses() const =0
virtual void setClassSpecifier(uint64 spec)=0
virtual void setPrototype(bool p, const QCString &df, int line, int column)=0
virtual QCString displayName(bool=TRUE) const =0
static void generateFileSources()
static void writeFooterFile(TextStream &t)
void sortMemberIndexLists()
static StringVector g_inputFiles
int qstricmp(const char *str1, const char *str2)
void initDefaultExtensionMapping()
void setConstSpecifier(bool b)
Translator * theTranslator
std::string absPath() const
virtual bool isReference() const =0
Ordered dictionary of MemberName objects.
A class that generated the HTML Help specific files.
virtual QCString inbodyDocumentation() const =0
A list of index interfaces.
static void readTagFile(const std::shared_ptr< Entry > &root, const QCString &tagLine)
virtual QCString name() const =0
ClassDefMutable * getClassDefMutable() const
static void findEnumDocumentation(const Entry *root)
static GroupLinkedMap * groupLinkedMap
static bool g_successfulRun
virtual void addFile(const FileDef *def)=0
virtual ClassLinkedRefMap getClasses() const =0
returns the classes nested into this class
virtual void addWord(const QCString &word, bool hiPriority)=0
void writeDefaultLayoutFile(const QCString &fileName)
QCString resolveTypeDef(const Definition *context, const QCString &qualifiedName, const Definition **typedefContext)
int endBodyLine
line number where the definition ends
virtual QCString inbodyFile() const =0
This class contains the information about the argument of a function or template
virtual MemberDef * resolveAlias()=0
virtual QCString definition() const =0
virtual const ClassDef * getClassDef() const =0
virtual void setAnchor()=0
virtual void setInbodyDocumentation(const QCString &d, const QCString &inbodyFile, int inbodyLine)=0
static void resolveUserReferences()
virtual void addMembersToMemberGroup()=0
static const uint64 Explicit
static ClassDefMutable * createTagLessInstance(const ClassDef *rootCd, const ClassDef *templ, const QCString &fieldName)
virtual void sortMemberLists()=0
void generatePage()
Generate the citations page
virtual void sortMemberLists()=0
static const NamespaceDef * findUsedNamespace(const LinkedRefMap< const NamespaceDef > &unl, const QCString &name)
virtual const Definition * findInnerCompound(const QCString &name) const =0
void run()
Run plant UML tool for all images
void addCodeOnlyMappings()
bool callerGraph
do we need to draw the caller graph?
static QCString substituteTemplatesInString(const ArgumentLists &srcTempArgLists, const ArgumentLists &dstTempArgLists, const std::string &src)
virtual void setOuterScope(Definition *d)=0
virtual ArgumentLists getTemplateParameterLists() const =0
Returns the template parameter lists that form the template declaration of this class.
void parseInput(const QCString &file, const char *buf, const std::shared_ptr< Entry > &, ClangTUParser *)
Parses a single input file with the goal to build an Entry tree.
static MemberGroupInfoMap memberGroupInfoMap
void warn_undoc(const QCString &file, int line, const char *fmt,...)
QCString getLanguageSpecificSeparator(SrcLangExt lang, bool classScope)
Returns the scope separator to use given the programming language lang
virtual void setTypeConstraints(const ArgumentList &al)=0
virtual QCString trMainPage()=0
void countDataStructures()
virtual void enableReferencesRelation(bool e)=0
virtual void computeAnchors()=0
virtual bool isFunction() const =0
static void findUsingDirectives(const Entry *root)
static void findDEV(const MemberNameLinkedMap &mnsd)
virtual bool isBaseClass(const ClassDef *bcd, bool followInstances, int level=0) const =0
Returns TRUE iff bcd is a direct or indirect base class of this class.
void startFile(OutputList &ol, const QCString &name, const QCString &manName, const QCString &title, HighlightedItem hli, bool additionalIndices, const QCString &altSidebarName)
ClassDefMutable * 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
virtual void writeSourceFooter(OutputList &ol)=0
int minClassDistance(const ClassDef *cd, const ClassDef *bcd, int level)
static int setFlag(const QCString &label)
QCString fileName() const
virtual void setLanguage(SrcLangExt lang)=0
void checkAndCorrect(bool quiet)
static void distributeMemberGroupDocumentation()
Object representing the matching results.
std::unique_ptr< CodeParserInterface > getCodeParser(const QCString &extension)
Gets the interface to the parser associated with a given extension.
virtual void addUsedByClass(ClassDef *cd, const QCString &accessName, Protection prot)=0
#define LATEX_STYLE_EXTENSION
virtual QCString briefDescription(bool abbreviate=FALSE) const =0
QCString showFileDefMatches(const FileNameLinkedMap *fnMap, const QCString &n)
void correct_path()
Correct a possible wrong PATH variable
virtual QCString getOutputFileBase() const =0
bool checkIfTypedef(const Definition *scope, const FileDef *fileScope, const QCString &n)
static void addMembersToMemberGroup()
static void generateNamespaceClassDocs(const ClassLinkedRefMap &classList)
virtual int getStartBodyLine() const =0
virtual int getEndBodyLine() const =0
virtual const NamespaceDef * getNamespaceDef() const =0
std::string readLink() const
static void findSectionsInDocumentation()
int extractClassNameFromType(const QCString &type, int &pos, QCString &name, QCString &templSpec, SrcLangExt lang)
virtual void setPageScope(Definition *)=0
NamespaceDef * createNamespaceDefAlias(const Definition *newScope, const NamespaceDef *nd)
Factory method to create an alias of an existing namespace.
QCString tempArgListToString(const ArgumentList &al, SrcLangExt lang, bool includeDefault)
int system(const QCString &command, const QCString &args, bool commandHasConsole=true)
static bool setCurrent(const std::string &path)
static StringUnorderedSet expandAsDefinedSet
static void setAnonymousEnumType()
virtual void invalidateTypedefValCache()=0
double getSysElapsedTime()
virtual void insertUsedFile(FileDef *fd)=0
QCString normalizeNonTemplateArgumentsInString(const QCString &name, const Definition *context, const ArgumentList &formalArgs)
#define Config_updateBool(name, value)
static void findDirDocumentation(const Entry *root)
static const uint64 Service
Generator for Eclipse help files.
const MemberDef * getTypedef() const
In case a call to resolveClass() resolves to a type member (e.g.
virtual QCString getPath() const =0
virtual bool isSubClass(ClassDef *bcd, int level=0) const =0
Returns TRUE iff bcd is a direct or indirect sub class of this class.
int inbodyLine
line number at which the body doc was found
virtual void computeTooltip()=0
static ClassDef * findClassWithinClassContext(Definition *context, ClassDef *cd, const QCString &name)
virtual const MemberDef * reimplements() const =0
virtual Protection protection() const =0
const T * find(const std::string &key) const
Find an object given the key.
std::string str() const
Return the contents of the buffer as a std::string object
ClassDef * toClassDef(Definition *d)
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, StringSet *paths)
virtual void insertUsedFile(const FileDef *)=0
static DirRelationLinkedMap dirRelations
virtual QCString anchor() const =0
virtual const GroupList & partOfGroups() const =0
static const uint64 Protocol
virtual void setInheritsDocsFrom(const MemberDef *md)=0
virtual void insertConcept(const ConceptDef *cd)=0
virtual void setMetaData(const QCString &m)=0
static void addEnumDocs(const Entry *root, MemberDefMutable *md)
bool fill(char c, int len=-1)
Fills a string with a predefined character
virtual void setDocumentedEnumValues(bool value)=0
void generateDirDocs(OutputList &ol)
void writeTemplate(TextStream &t, bool shortList, bool updateOnly=FALSE)
void addFileMemberNameToIndex(const MemberDef *md)
virtual bool isStrong() const =0
virtual void insertSubClass(ClassDef *, Protection p, Specifier s, const QCString &t=QCString())=0
ConceptDefMutable * createConceptDef(const QCString &fileName, int startLine, int startColumn, const QCString &name, const QCString &tagRef, const QCString &tagFile)
const TagInfo * tagInfo() const
static const char * getArg(int argc, char **argv, int &optInd)
virtual void copyArgumentNames(const MemberDef *bmd)=0
SectionInfo * add(const SectionInfo &si)
Add a new section given the data of an existing section.
void addRefItem(const RefItemVector &sli, const QCString &key, const QCString &prefix, const QCString &name, const QCString &title, const QCString &args, const Definition *scope)
static void freeMappers()
virtual void invalidateCachedArgumentTypes()=0
virtual DefType definitionType() const =0
virtual const BaseClassList & subClasses() const =0
Returns the list of sub classes that directly derive from this class
virtual void setNamespace(const NamespaceDef *nd)=0
virtual QCString declaration() const =0
virtual void findSectionsInDocumentation()=0
virtual void countMembers()=0
virtual QCString briefFile() const =0
void mergeArguments(ArgumentList &srcAl, ArgumentList &dstAl, bool forceNameOverwrite)
std::unique_ptr< ArgumentList > getTemplateArgumentsFromName(const QCString &name, const ArgumentLists &tArgLists)
virtual bool isForeign() const =0
virtual void setFileName(const QCString &name)=0
static QCString getQchFileName()
virtual CompoundType compoundType() const =0
Returns the type of compound this is, i.e.
int getPrefixIndex(const QCString &name)
QCString & setNum(short n)
QCString pathListSeparator()
virtual void addListReferences()=0
static double elapsedTime()
QCString fileName
file this entry was extracted from
static int computeIdealCacheParam(size_t v)
const MemberDef * typeDef
static void addClassToContext(const Entry *root)
static void generateTreeViewImages()
QCString groupname
name of the group
static void generateFileDocs()
virtual uint64 getMemberSpecifiers() const =0
static const uint64 Exception
void parseTagFile(const std::shared_ptr< Entry > &root, const char *fullName)
std::unique_ptr< ClangTUParser > createTUParser(const FileDef *fd) const
QCString inbodyFile
file in which the body doc was found
void adjustConfiguration()
adjust globals that depend on configuration settings.
SrcLangExt lang
programming language in which this entry was found
virtual QCString qualifiedName() const =0
void compareDoxyfile(TextStream &t)
static SearchIndexIntf * searchIndex
std::vector< ArgumentList > ArgumentLists
bool needsPreprocessing(const QCString &) const
Returns TRUE if the language identified by extension needs the C preprocessor to be run before feed t...
static void buildCompleteMemberLists()
virtual void sortSubGroups()=0
ArgumentList typeConstr
where clause (C#) for type constraints
static void findMember(const Entry *root, const QCString &relates, const QCString &type, const QCString &args, QCString funcDecl, bool overloaded, bool isFunc)
static void generatePageDocs()
virtual void setDeclFile(const QCString &df, int line, int column)=0
virtual void addListReferences()=0
QCString mid(size_t index, size_t len=static_cast< size_t >(-1)) const
QCString substitute(const QCString &s, const QCString &src, const QCString &dst)
substitute all occurrences of src in s by dst
std::string dirPath(bool absPath=true) const
void initNamespaceMemberIndices()
virtual QCString trPage(bool first_capital, bool singular)=0
QCString brief
brief description (doc block)
virtual void setRelatedAlso(ClassDef *cd)=0
static QCString filterDBFileName
virtual bool isLinkableInProject() const =0
void extractNamespaceName(const QCString &scopeName, QCString &className, QCString &namespaceName, bool allowEmptyClass)
int bodyLine
line number of the body in the source
virtual void enableReferencedByRelation(bool e)=0
bool readInputFile(const QCString &fileName, BufStr &inBuf, bool filter, bool isSourceCode)
read a file name fileName and optionally filter and transcode it
virtual const ArgumentList & templateArguments() const =0
std::vector< RefItem * > RefItemVector
virtual ConceptLinkedRefMap getConcepts() const =0
int initLines
define/variable initializer lines to show
virtual void setId(const QCString &name)=0
void parse()
Parse the file given at construction time as a translation unit This file should already be preproces...
virtual void enableCallGraph(bool e)=0
static const uint64 Strong
static void buildExampleList(Entry *root)
static MemberNameLinkedMap * memberNameLinkedMap
virtual bool isLinkable() const =0
static bool preProcessFileInplace(const QCString &path, const QCString &name)
This is an API to a VERY brittle RTF preprocessor that combines nested RTF files.
virtual void addTypeConstraints()=0
virtual void addMembersToMemberGroup()=0
Represents an unstructured piece of information, about an entity found in the sources.
static void writeSearchPage()
#define Config_getBool(name)
virtual void findSectionsInDocumentation()=0
virtual void setAnonymousEnumType()=0
virtual QCString getOutputFileBase() const =0
static void buildListOfUsingDecls(const Entry *root)
static void buildPageList(Entry *root)
static void writeTagFile()
virtual void moveDeclArgumentList(std::unique_ptr< ArgumentList > al)=0
const std::vector< std::shared_ptr< Entry > > & children() const
static void parseFilesSingleThreading(const std::shared_ptr< Entry > &root)
parse the list of input files
NamespaceDef * toNamespaceDef(Definition *d)
static void buildClassList(const Entry *root)
virtual void write(const QCString &file)=0
static QCString htmlFileExtension
virtual bool isDocsForDefinition() const =0
virtual const MemberDef * getEnumScope() const =0
static SectionManager & instance()
returns a reference to the singleton
bool explicitExternal
explicitly defined as external?
Specifier virt
virtualness
Class representing a regular expression.
virtual void writeTagFile(TextStream &t)=0
virtual void setDocumentation(const QCString &d, const QCString &docFile, int docLine, bool stripWhiteSpace=TRUE)=0
virtual bool isEnumerate() const =0
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, StringSet *paths)
void generateOutputViaTemplate()
void remove(const K &key)
Removes entry key from the cache.
virtual bool isExternal() const =0
void msg(const char *fmt,...)
virtual void makeForeign()=0
void writeGraphInfo(OutputList &ol)
virtual void writeDocumentation(OutputList &ol) const =0
void finalizeSearchIndexer()
void registerParser(const QCString &name, OutlineParserFactory outlineParserFactory, CodeParserFactory codeParserFactory)
Registers an additional parser.
static LayoutDocManager & instance()
Returns a reference to this singleton.
virtual QCString documentation() const =0
RelatesType relatesType
how relates is handled
static void checkPageRelations()
virtual bool isReference() const =0
Returns TRUE if this class is imported via a tag file
virtual void setCurrentDoc(const Definition *ctx, const QCString &anchor, bool isSourceFile)=0
void term(const char *fmt,...)
void writeIndexHierarchy(OutputList &ol)
static void computeMemberRelations()
std::unordered_map< std::string, DefineList > DefinesPerFileList
static void computeTemplateClassRelations()
virtual Definition * getOuterScope() const =0
bool endsWith(const char *s) const
virtual bool isEnumValue() const =0
static void mergeCategories()
Abstract interface for outline parsers.
static bool g_dumpSymbolMap
Minimal replacement for QFileInfo.
virtual bool isCSharp() const =0
Returns TRUE if this class is implemented in C#
static void generateNamespaceConceptDocs(const ConceptLinkedRefMap &conceptList)
static void computeVhdlComponentRelations()
virtual QCString absFilePath() const =0
virtual void writeTagFile(TextStream &)=0
std::string absFilePath() const
virtual bool isArtificial() const =0
static const uint64 Category
const char * qPrint(const char *s)
Generator for LaTeX output.
static void vhdlCorrectMemberProperties()
virtual void setTagLessReference(const ClassDef *cd)=0
static void exitDoxygen()
virtual const FileDef * getFileDef() const =0
#define Config_getString(name)
void setPath(const std::string &path)
virtual void setBodySegment(int defLine, int bls, int ble)=0
static void addMembersToIndex()
static QCString getQhpFileName()
static void findMainPage(Entry *root)
virtual QCString getDefFileName() const =0
class that provide information about a section.
A class that generates docset files.
static void generateClassDocs()
static void escapeAliases()
virtual void setRefItems(const RefItemVector &sli)=0
virtual bool hasCallGraph() const =0
void generateDoc(const QCString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const QCString &docStr, bool indexWords, bool isExample, const QCString &exampleName, bool singleLine, bool linkFromIndex, bool markdownSupport)
static bool insideMainPage
virtual void computeAnchors()=0
virtual void addInnerCompound(const Definition *)=0
bool artificial
Artificially introduced item
void addSTLSupport(std::shared_ptr< Entry > &root)
Add stub entries for the most used classes in the standard template library
virtual void countMembers()=0
bool parse(const QCString &fileName, bool update=FALSE)
static void compareDoxyfile()
virtual const ArgumentList & argumentList() const =0
static MemberDef * addVariableToFile(const Entry *root, MemberType mtype, const QCString &scope, const QCString &type, const QCString &name, const QCString &args, bool fromAnnScope, MemberDef *fromAnnMemb)
QCString convertNameToFile(const QCString &name, bool allowDots, bool allowUnderscore)
static void computePageRelations(Entry *root)
static const uint64 Mutable
@ MemberListType_pubAttribs
Manages programming language parsers.
static NamespaceLinkedMap * namespaceLinkedMap
QCString removeAnonymousScopes(const QCString &str)
static void addListReferences()
virtual QCString displayName(bool includeScope=TRUE) const =0
Returns the name as it is appears in the documentation
virtual void setUsedOnly(bool b)=0
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string
static FileNameLinkedMap * mscFileNameLinkedMap
void initClassMemberIndices()
Clang parser object for a single translation unit, which consists of a source file and the directly o...
virtual MemberList * getMemberList(MemberListType lt) const =0
Returns the members in the list identified by lt
QCString inside
name of the class in which documents are found
static void clearFlag(const QCString &label)
static Cache< std::string, LookupInfo > * lookupCache
const ClassDef * classDef
A model of a file symbol.
int qstrcmp(const char *str1, const char *str2)
virtual void addInnerCompound(const Definition *d)=0
static void generateClassList(const ClassLinkedMap &classList)
std::map< std::string, std::string > StringMap
static void buildNamespaceList(const Entry *root)
QCString read
property read accessor
static void addEnumValuesToEnums(const Entry *root)
This class stores information about an inheritance relation
QCString mergeScopes(const QCString &leftScope, const QCString &rightScope)
virtual void addMembersToMemberGroup()=0
bool subGrouping
automatically group class members?
RefItemVector sli
special lists (test/todo/bug/deprecated/..) this entry is in
void parseFuncDecl(const QCString &decl, const SrcLangExt lang, QCString &clName, QCString &type, QCString &name, QCString &args, QCString &funcTempList, QCString &exceptions)
void setenv(const QCString &variable, const QCString &value)
virtual void setRequiresClause(const QCString &req)=0
virtual void parseSource(ClangTUParser *clangParser)=0
virtual void moveArgumentList(std::unique_ptr< ArgumentList > al)=0
virtual void writeDocumentation(OutputList &ol)=0
bool isAbsolutePath(const QCString &fileName)
DirIterator iterator() const
virtual void distributeMemberGroupDocumentation()=0
static EmojiEntityMapper * instance()
Returns the one and only instance of the Emoji entity mapper
A class that generates a dynamic tree view side panel.
virtual void insertMember(MemberDef *)=0
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, uint64 spec, const QCString &relates, const QCString &funcDecl, bool overloaded, bool isFunc)
virtual void setExplicitExternal(bool b, const QCString &df, int line, int column)=0
static bool suppressDocWarnings
bool checkExtension(const QCString &fName, const QCString &ext)
std::string fileName() const
QCString exception
throw specification
QCString bitfields
member's bit fields
std::vector< stat > stats
ClassDefMutable * toClassDefMutable(Definition *d)
static void findMainPageTagFiles(Entry *root)
virtual void writeSourceBody(OutputList &ol, ClangTUParser *clangParser)=0
GroupDef * createGroupDef(const QCString &fileName, int line, const QCString &name, const QCString &title, const QCString &refFileName)
std::string expandAlias(const std::string &aliasName, const std::string &aliasValue)
virtual void setDefinition(const QCString &d)=0
Portable versions of functions that are platform dependent.
bool referencesRelation
do we need to show the references relation?
virtual void setProtection(Protection p)=0
std::function< std::unique_ptr< T >) > make_parser_factory()
virtual ClassLinkedRefMap getStructs() const =0
static void copyStyleSheet()
bool search(const std::string &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.
const T * find(const std::string &key) const
find an object given the key.
virtual void writeDocumentation(OutputList &ol)=0
static ClassDef::CompoundType convertToCompoundType(int section, uint64 specifier)
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.
static void copyLogo(const QCString &outputOption)
virtual bool hasReferencesRelation() const =0
ArgumentList argList
member arguments as a list
virtual void enableCallerGraph(bool e)=0
virtual void setHidden(bool b)=0
static ClassLinkedMap * classLinkedMap
void parse(const QCString &fileName)
Parses a user provided layout
virtual const QCString & initializer() const =0
int getScopeFragment(const QCString &s, int p, int *l)
virtual void addMembersToTemplateInstance(const ClassDef *cd, const ArgumentList &templateArguments, const QCString &templSpec)=0
virtual void addUsingDirective(const NamespaceDef *nd)=0
virtual int getStartDefLine() const =0
static const uint64 Singleton
static void addSourceReferences()
void writeEmojiFile(TextStream &t)
Writes the list of supported emojis to the given file.
virtual void setFileDef(const FileDef *fd)=0
bool mkdir(const std::string &path, bool acceptsAbsPath=true) const
virtual bool isRelated() const =0
int guessSection(const QCString &name)
A bunch of utility functions.
std::map< std::string, int > TemplateNameMap
virtual QCString qualifiedNameWithTemplateParameters(const ArgumentLists *actualParams=0, uint *actualParamIndex=0) const =0
QCString docFile
file in which the documentation was found
void replaceNamespaceAliases(QCString &scope, int i)
virtual QCString typeString() const =0
virtual void setEnumClassScope(const ClassDef *cd)=0
virtual bool hasGroupTitle() const =0
virtual QCString localName() const =0
virtual QCString requiresClause() const =0
static Definition * buildScopeFromQualifiedName(const QCString &name_, SrcLangExt lang, const TagInfo *tagInfo)
ConceptDefMutable * toConceptDefMutable(Definition *d)
void enable(OutputGenerator::OutputType o)
static void writeHeaderFile(TextStream &t, const QCString &cssname)
static int findFunctionPtr(const std::string &type, SrcLangExt lang, int *pLength=0)
virtual QCString trDir(bool first_capital, bool singular)=0
virtual bool isForwardDeclared() const =0
Returns TRUE if this class represents a forward declaration of a template class
static std::string cleanDirPath(const std::string &path)
virtual void setTemplateArguments(const ArgumentList &al)=0
std::set< const NamespaceDef * > NamespaceDefSet
virtual void setGroupTitle(const QCString &newtitle)=0
Relationship
Kind of member relationship
QCString write
property write accessor
virtual bool isLinkable() const =0
return TRUE iff a link to this class is possible (either within this project, or as a cross-reference...
std::vector< Grouping > groups
list of groups this entry belongs to
std::unique_ptr< ArgumentList > stringToArgumentList(SrcLangExt lang, const QCString &argsString, QCString *extraTypeChars=0)
static void findTagLessClasses(std::vector< ClassDefMutable * > &candidates, const ClassDef *cd)
virtual void setReimplements(const MemberDef *md)=0
A list of MemberDef objects as shown in documentation sections.
bool stripPrefix(const QCString &prefix)
bool matchArguments2(const Definition *srcScope, const FileDef *srcFileScope, const ArgumentList *srcAl, const Definition *dstScope, const FileDef *dstFileScope, const ArgumentList *dstAl, bool checkCV)
static void filterMemberDocumentation(const Entry *root, const QCString &relates)
static std::string resolveSymlink(const std::string &path)
static void createTemplateInstanceMembers()
static void addMemberToSearchIndex(const MemberDef *md)
QCString right(size_t len) const
virtual void setTemplateArguments(const ArgumentList &al)=0
Generator for Man page output.
static TemplateNameMap getTemplateArgumentsInName(const ArgumentList &templateArguments, const std::string &name)
QCString & prepend(const char *s)
bool resize(size_t newlen)
Resizes the string to hold newlen characters (this value should also count the 0-terminator).
uint qstrlen(const char *str)
virtual MemberType memberType() const =0
bool openOutputFile(const QCString &outFile, std::ofstream &f)
void computeDirDependencies()
QCString & sprintf(const char *format,...)
static void writeTabData()
Additional initialization after indices have been created
virtual void setFileName(const QCString &fn)=0
static const uint64 Published
virtual void setShowLineNo(bool)=0
virtual const ArgumentList & templateArguments() const =0
Returns the template arguments of this class
ClassDefMutable * getClassMutable(const QCString &key)
static void combineUsingRelations()
static ClangUsrMap * clangUsrMap
static void computeMemberReferences()
std::set< const ClassDef * > ClassDefSet
NamespaceDefMutable * getResolvedNamespaceMutable(const QCString &key)
virtual const GroupDef * getGroupDef() const =0
virtual void insertMember(MemberDef *md)=0
virtual void setGroupScope(Definition *d)=0
void endFile(OutputList &ol, bool skipNavIndex, bool skipEndContents, const QCString &navPath)
void clear()
Clears all values in the cache.
virtual void insertMember(MemberDef *md)=0
static void findUsingDeclImports(const Entry *root)
virtual void mergeReferencedBy(const Definition *other)=0
#define Config_getList(name)
static void writeExtensionsFile(TextStream &t)
static bool scopeIsTemplate(const Definition *d)
virtual bool isTemplate() const =0
Returns TRUE if this class is a template
static std::multimap< std::string, const Entry * > g_classEntries
virtual void mergeMembers()=0
static PageLinkedMap * exampleLinkedMap
virtual QCString anchor() const =0
static FileNameLinkedMap * includeNameLinkedMap
This is an alternative implementation of QCString.
QCString req
C++20 requires clause