22#include <unordered_map>
118#pragma GCC diagnostic push
119#pragma GCC diagnostic ignored "-Wshadow"
121#include <clang/Basic/Version.h>
123#pragma GCC diagnostic pop
130#if !defined(_WIN32) || defined(__CYGWIN__)
199{
"template class",
"template struct",
"class",
"struct",
"union",
"interface",
"exception" };
235 stats.emplace_back(name,0);
236 startTime = std::chrono::steady_clock::now();
240 std::chrono::steady_clock::time_point endTime = std::chrono::steady_clock::now();
241 stats.back().elapsed =
static_cast<double>(std::chrono::duration_cast<
242 std::chrono::microseconds>(endTime -
startTime).count())/1000000.0;
253 msg(
"----------------------\n");
254 for (
const auto &
s :
stats)
256 msg(
"Spent {:.6f} seconds in {}",
s.elapsed,
s.name);
319 scope+=
"::"+pd->
name();
359 ((!includeExternal && root->
tagInfo()==
nullptr) ||
360 ( includeExternal && root->
tagInfo()!=
nullptr))
363 AUTO_TRACE(
"additional={} includeExternal={}",additional,includeExternal);
379 "group {}: ignoring title \"{}\" that does not match old title \"{}\"",
398 std::unique_ptr<GroupDef>(
405 std::unique_ptr<GroupDef>(
454 scope+=
"::"+gd->
name();
506 bool save_ambig = ambig;
517 fn = fn.
left(newIndex)+
"/"+root->
name;
520 if (!fd) ambig = save_ambig;
550 "Found non-existing group '{}' for the command '{}', ignoring command",
559 text.
sprintf(
"the name '%s' supplied as "
560 "the argument in the \\file statement ",
564 text+=
"matches the following input files:\n";
567 text+=
"Please use a more specific name by "
568 "including a (larger) part of the path!";
572 text+=
"is not an input file";
580template<
class DefMutable>
594 if (!includeFile.
isEmpty() && includeFile.
at(0)==
'"')
597 includeFile=includeFile.
mid(1,includeFile.
length()-2);
599 else if (!includeFile.
isEmpty() && includeFile.
at(0)==
'<')
602 includeFile=includeFile.
mid(1,includeFile.
length()-2);
614 text.
sprintf(
"the name '%s' supplied as "
615 "the argument of the \\class, \\struct, \\union, or \\include command ",
620 text+=
"matches the following input files:\n";
623 text+=
"Please use a more specific name by "
624 "including a (larger) part of the path!";
628 text+=
"is not an input file";
632 else if (includeFile.
isEmpty() && ifd &&
646 if (iName.
at(0)==
'<') local=
FALSE;
647 else if (iName.
at(0)==
'"') local=
TRUE;
648 if (iName.
at(0)==
'"' || iName.
at(0)==
'<')
671 cd->setIncludeFile(
nullptr,iName,local,
TRUE);
680 size_t l =
s.length();
684 for (
size_t i=0;
i<l;
i++)
688 else if (c==
')' && round>0) round--;
689 else if (c==
'<' && round==0) count++;
694 if (c==
'>' && round==0 && count>0) count--;
717 if (idx==-1)
return prevScope;
719 if (nsName.
isEmpty())
return prevScope;
720 if (!fullScope.
isEmpty()) fullScope+=
"::";
725 if (nd==
nullptr) cd =
getClass(fullScope);
726 if (nd==
nullptr && cd)
730 else if (nd==
nullptr && cd==
nullptr && fullScope.
find(
'<')==-1)
738 "[generated]",1,1,fullScope,
756 if (prevScopeMutable)
788 int p=i1+l1,l2=0,i2=0;
796 if (resultScope==
nullptr)
807 if (resultScope!=
nullptr)
break;
866 auto alIt = tArgLists.begin();
867 while ((
i=name.
find(
"::",p))!=-1 && alIt!=tArgLists.end())
883 return alIt!=tArgLists.end() ?
884 std::make_unique<ArgumentList>(*alIt) :
885 std::unique_ptr<ArgumentList>();
893 if (specifier.isStruct())
895 else if (specifier.isUnion())
897 else if (specifier.isCategory())
899 else if (specifier.isInterface())
901 else if (specifier.isProtocol())
903 else if (specifier.isException())
905 else if (specifier.isService())
907 else if (specifier.isSingleton())
910 if (section.isUnionDoc())
912 else if (section.isStructDoc())
914 else if (section.isInterfaceDoc())
916 else if (section.isProtocolDoc())
918 else if (section.isCategoryDoc())
920 else if (section.isExceptionDoc())
922 else if (section.isServiceDoc())
924 else if (section.isSingletonDoc())
945 int idx=fullName.
find(
'>');
946 if (idx!=-1 && root->
lang==SrcLangExt::CSharp)
956 qualifiedName.
prepend(scName+
"::");
962 AUTO_TRACE_ADD(
"Found class with name '{}', qualifiedName '{}'", cd ? cd->
name() : root->
name, qualifiedName);
1017 AUTO_TRACE_ADD(
"New class: fullname '{}' namespace '{}' name='{}' brief='{}' docs='{}'",
1027 if (fullName.
find(
"::")!=-1)
1034 std::unique_ptr<ArgumentList> tArgList;
1036 if ((root->
lang==SrcLangExt::CSharp || root->
lang==SrcLangExt::Java) && (
i=fullName.
findRev(
'<'))!=-1)
1041 if (
i!=-1 && root->
lang==SrcLangExt::CSharp)
1050 fullName=fullName.
left(
i);
1061 fullName,sec,tagName,refFileName,
TRUE,root->
spec.isEnum()) ));
1064 AUTO_TRACE_ADD(
"New class '{}' type={} #tArgLists={} tagInfo={} hidden={} artificial={}",
1097 AUTO_TRACE_ADD(
"Class {} not added, already exists as alias", fullName);
1105 if (!root->
spec.isForwardDecl())
1166 qualifiedName.
prepend(scName+
"::");
1172 AUTO_TRACE_ADD(
"Found concept with name '{}' (qualifiedName='{}')", cd ? cd->
name() : root->
name, qualifiedName);
1176 qualifiedName=cd->
name();
1190 AUTO_TRACE_ADD(
"New concept: fullname '{}' namespace '{}' name='{}' brief='{}' docs='{}'",
1191 qualifiedName,namespaceName,className,root->
brief,root->
doc);
1200 if (qualifiedName.
find(
"::")!=-1)
1212 qualifiedName,tagName,refFileName)));
1216 qualifiedName,root->
tArgLists.size(),fmt::ptr(tagInfo));
1247 AUTO_TRACE_ADD(
"Concept '{}' not added, already exists (as alias)", qualifiedName);
1268 if (root->
section.isModuleDoc())
1278 if (root->
section.isConcept())
1288 if (root->
section.isConceptDoc())
1307 if (cd!=ocd && cd->groupId()==ocd->groupId() &&
1308 !cd->partOfGroups().empty() && ocd->partOfGroups().empty())
1313 for (
const auto &gd : cd->partOfGroups())
1319 gd->addConcept(ocd.get());
1344 aliasFullName(name),aliasCd(std::move(cd)), aliasContext(ctx) {}
1346 std::unique_ptr<ClassDef> aliasCd;
1349 std::vector<ClassAlias> aliases;
1353 if (cd && visitedClasses.find(icd.get())==visitedClasses.end())
1359 name,icd->getFileDef(),
nullptr);
1385 aliases.emplace_back(aliasFullName,std::move(aliasCd),dm);
1396 visitedClasses.insert(icd.get());
1406 for (
auto &alias : aliases)
1411 alias.aliasContext->addInnerCompound(aliasCd);
1420 if (cd && visitedClasses.find(icd.get())==visitedClasses.end())
1438 "Incomplete input: scope for class {} not found!{}",name,
1439 name.
startsWith(
"std::") ?
" Try enabling BUILTIN_STL_SUPPORT." :
""
1457 if (visitedClasses.find(cd.get())==visitedClasses.end() && !cd->partOfGroups().empty())
1461 for (
auto &ncd : cd->getClasses())
1472 visitedClasses.insert(cd.get());
1483 fullName+=
"."+fieldName;
1526 for (
const auto &md : *ml)
1529 auto newMd =
createMemberDef(md->getDefFileName(),md->getDefLine(),md->getDefColumn(),
1530 md->typeString(),md->name(),md->argsString(),md->excpString(),
1531 md->protection(),md->virtualness(),md->isStatic(),Relationship::Member,
1578 for (
const auto &md : *ml)
1581 if (type.
find(
"::@")!=-1)
1587 if (type.
find(icd->name())!=-1)
1590 if (md->isAnonymous()) name =
"__unnamed" +
QCString().
setNum(pos++)+
"__";
1610 for (
const auto &pmd : *pml)
1613 if (pmdm && pmd->
name()==md->name())
1633 if (icd->name().find(
"@")==-1)
1642 candidates.push_back(cdm);
1648 std::vector<ClassDefMutable *> candidates;
1660 for (
auto &cd : candidates)
1673 (root->
section.isNamespace() ||
1674 root->
section.isNamespaceDoc() ||
1683 if (root->
section.isPackageDoc())
1746 root->
type,root->
spec.isPublished())));
1812 QCString aliasName = aliasNd->name();
1841 for (
auto &und : unl)
1845 if (usingNd!=
nullptr)
break;
1852 if (root->
section.isUsingDir())
1870 (fd==
nullptr || fd->
getLanguage()!=SrcLangExt::Java)
1884 int scopeOffset =
static_cast<int>(nsName.
length());
1895 else if ((scopeOffset=nsName.
findRev(
"::",scopeOffset-1))==-1)
1899 }
while (scopeOffset>=0 && usingNd==
nullptr);
1901 if (usingNd==
nullptr && nd)
1905 while (pnd && usingNd==
nullptr)
1922 if (usingNd==
nullptr && fd)
1994 if (root->
section.isUsingDecl() &&
2007 if (root->
section.isUsingDecl() &&
2009 (!filterPythonPackages || (root->
lang==SrcLangExt::Python && root->
fileName.
endsWith(
"__init__.py")))
2012 AUTO_TRACE(
"Found using declaration '{}' at line {} of {} inside section {}",
2042 if (nd==
nullptr) scope = fd;
2112 AUTO_TRACE(
"creating new member {} for class {}",memName,cd->
name());
2123 newMmd->setMemberClass(cd);
2141 newMmd->addSectionsToDefinition(root->
anchors);
2147 newMmd->setMemberGroupId(root->
mGrpId);
2150 newMmd->setLanguage(root->
lang);
2151 newMmd->setId(root->
id);
2160 if (root->
section.isUsingDecl() &&
2187 for (
auto &mi : *mni)
2190 if (md && md->
protection()!=Protection::Private)
2205 for (
const auto ©Cd : it->second)
2218 else if (root->
section.isUsingDecl() &&
2220 root->
lang==SrcLangExt::Cpp
2253 memName = root->
name;
2275 newMmd->setNamespace(nd);
2280 newMmd->setFileDef(fd);
2299 newMmd->addSectionsToDefinition(root->
anchors);
2305 newMmd->setMemberGroupId(root->
mGrpId);
2308 newMmd->setLanguage(root->
lang);
2309 newMmd->setId(root->
id);
2317 if (nd && aliasMd.get())
2321 if (fd && aliasMd.get())
2350 if (nd) ncdm->
moveTo(nd);
2379 aliasFullName = aliasCd->localName();
2383 aliasFullName = nd->
qualifiedName()+
"::"+aliasCd->localName();
2415 for (
const auto &fd : *fn)
2418 fd->addIncludedUsingDirectives(visitedFiles);
2440 if (lang==SrcLangExt::Java || lang==SrcLangExt::CSharp)
2445 AUTO_TRACE(
"class variable: file='{}' type='{}' scope='{}' name='{}' args='{}' prot={} mtype={} lang={} ann={} init='{}'",
2453 if (root->
spec.isAlias())
2459 def=type+
" "+name+args;
2464 if (root->
spec.isAlias())
2466 def=
"using "+qualScope+scopeSeparator+name;
2470 def=type+
" "+qualScope+scopeSeparator+name+args;
2482 def=qualScope+scopeSeparator+name+args;
2493 for (
const auto &imd : *mn)
2505 if (root->
lang==SrcLangExt::ObjC &&
2506 root->
mtype==MethodTypes::Property &&
2530 prot,Specifier::Normal,root->
isStatic,related,
2534 mmd->setTagInfo(root->
tagInfo());
2535 mmd->setMemberClass(cd);
2539 mmd->setDefinition(def);
2541 mmd->addSectionsToDefinition(root->
anchors);
2542 mmd->setFromAnonymousScope(fromAnnScope);
2543 mmd->setFromAnonymousMember(fromAnnMemb);
2547 mmd->setInitializer(init.c_str());
2549 mmd->setMemberGroupId(root->
mGrpId);
2550 mmd->setMemberSpecifiers(root->
spec);
2551 mmd->setVhdlSpecifiers(root->
vhdlSpec);
2552 mmd->setReadAccessor(root->
read);
2553 mmd->setWriteAccessor(root->
write);
2555 mmd->setHidden(root->
hidden);
2557 mmd->setLanguage(root->
lang);
2558 mmd->setId(root->
id);
2561 mmd->setBodyDef(root->
fileDef());
2566 mmd->setRefItems(root->
sli);
2596 AUTO_TRACE(
"global variable: file='{}' type='{}' scope='{}' name='{}' args='{}' prot={} mtype={} lang={} init='{}'",
2608 static const reg::Ex re(R
"(\a\w*)");
2610 std::string typ = ttype.str();
2632 if (scope.
find(
'@')!=-1)
return nullptr;
2648 if (root->
spec.isAlias())
2650 def=
"using "+nd->
name()+sep+name;
2654 def=type+
" "+nd->
name()+sep+name+args;
2659 def=nd->
name()+sep+name+args;
2666 if (name.
at(0)==
'@')
2672 if (root->
spec.isAlias())
2674 def=
"using "+root->
name;
2678 def=type+
" "+name+args;
2699 for (
const auto &imd : *mn)
2713 bool isPHPArray = md->
getLanguage()==SrcLangExt::PHP &&
2716 bool staticsInDifferentFiles =
2722 !staticsInDifferentFiles
2763 mmd->setTagInfo(root->
tagInfo());
2764 mmd->setMemberSpecifiers(root->
spec);
2765 mmd->setVhdlSpecifiers(root->
vhdlSpec);
2769 mmd->addSectionsToDefinition(root->
anchors);
2770 mmd->setFromAnonymousScope(fromAnnScope);
2771 mmd->setFromAnonymousMember(fromAnnMemb);
2773 mmd->setInitializer(init.c_str());
2775 mmd->setMemberGroupId(root->
mGrpId);
2776 mmd->setDefinition(def);
2777 mmd->setLanguage(root->
lang);
2778 mmd->setId(root->
id);
2786 mmd->setBodyDef(fd);
2791 mmd->setRefItems(root->
sli);
2794 mmd->setNamespace(nd);
2802 mmd->setFileDef(fd);
2830 if (lang == SrcLangExt::Fortran || lang == SrcLangExt::VHDL)
2835 static const reg::Ex re(R
"(\([^)]*[*&^][^)]*\))");
2837 size_t i=std::string::npos;
2841 i = match.position();
2844 if (
i!=std::string::npos)
2846 size_t di = type.find(
"decltype(");
2847 if (di!=std::string::npos && di<
i)
2849 i = std::string::npos;
2852 size_t bb=type.find(
'<');
2853 size_t be=type.rfind(
'>');
2854 bool templFp =
false;
2855 if (be!=std::string::npos) {
2856 size_t cc_ast = type.find(
"::*");
2857 size_t cc_amp = type.find(
"::&");
2858 templFp = (cc_ast != std::string::npos && cc_ast>be) || (cc_amp != std::string::npos && cc_amp>be);
2861 if (!type.empty() &&
2862 i!=std::string::npos &&
2863 type.find(
"operator")==std::string::npos &&
2864 (type.find(
")(")==std::string::npos || type.find(
"typedef ")!=std::string::npos) &&
2866 (!(bb<
i &&
i<be) || templFp)
2869 if (pLength) *pLength=
static_cast<int>(l);
2872 return static_cast<int>(
i);
2889 bool result =
false;
2890 bool typeIsClass =
false;
2891 bool typePtrType =
false;
2925 typePtrType = type.
find(
'*')!=-1 || type.
find(
'&')!=-1;
2928 typeIsClass = resolver.
resolveClass(ctx,type)!=
nullptr;
2930 if (!typeIsClass && (ti=type.
find(
'<'))!=-1)
2947 static const reg::Ex initChars(R
"([\d"'&*!^]+)");
2951 std::string name = a.
name.
str();
2952 if (
reg::search(name,match,initChars) && match.position()==0)
2984 std::string atype = a.
type.
str();
2985 if (
reg::search(atype,match,initChars) && match.position()==0)
2992 if (resType.empty()) resType=atype;
2993 static const reg::Ex idChars(R
"(\a\w*)");
2994 if (
reg::search(resType,match,idChars) && match.position()==0)
2996 resType=match.str();
2997 if (resType==
"int" || resType==
"long" ||
2998 resType==
"float" || resType==
"double" ||
2999 resType==
"char" || resType==
"void" ||
3000 resType==
"signed" || resType==
"unsigned" ||
3001 resType==
"const" || resType==
"volatile" )
3037 size_t len =
s.length();
3038 bool insideString=
FALSE;
3039 bool insideChar=
FALSE;
3041 while (e<len && brCount!=0)
3047 if (!insideString && !insideChar)
3049 if (e<len-1 &&
s.at(e+1)==
'<')
3051 else if (roundCount==0)
3056 if (!insideString && !insideChar)
3058 if (e<len-1 &&
s.at(e+1)==
'>')
3060 else if (roundCount==0)
3065 if (!insideString && !insideChar)
3069 if (!insideString && !insideChar)
3075 if (insideString && pc!=
'\\')
3084 if (insideChar && pc!=
'\\')
3094 return brCount==0 ?
static_cast<int>(e) : -1;
3103 AUTO_TRACE(
"VARIABLE_SEC: type='{}' name='{}' args='{}' bodyLine={} endBodyLine={} mGrpId={} relates='{}'",
3110 if (type.
isEmpty() && name.
find(
"operator")==-1 &&
3111 (name.
find(
'*')!=-1 || name.
find(
'&')!=-1))
3118 std::string sargs = args.
str();
3119 static const reg::Ex reName(R
"(\a\w*)");
3124 sargs = match.suffix().str();
3125 size_t j = sargs.find(
')');
3126 if (j!=std::string::npos) args=sargs.substr(0,j);
3136 int ai = type.
find(
'[',
i);
3142 else if (type.
find(
')',
i)!=-1)
3149 AUTO_TRACE_ADD(
"after correction: type='{}' name='{}' args='{}'",type,name,args);
3160 scope=name.
left(index);
3161 name=name.
mid(index+2);
3180 bool isRelated=
FALSE;
3181 bool isMemberOf=
FALSE;
3184 if (root->
lang==SrcLangExt::CSharp)
3199 if (name[
i]==
':' && name[
i+1]==
':')
3201 p=
static_cast<int>(
i);
3203 else if (name[
i]==
'<')
3208 if (e!=-1)
i=
static_cast<int>(e);
3214 if (type==
"friend class" || type==
"friend struct" ||
3215 type==
"friend union")
3229 Relationship::Member
3255 else if (root->
mtype==MethodTypes::Property)
3257 else if (root->
mtype==MethodTypes::Event)
3259 else if (type.
find(
"sequence<") != -1)
3261 else if (type.
find(
"dictionary<") != -1)
3267 isMemberOf=(root->
relatesType==RelatesType::MemberOf);
3285 int si=scope.
find(
'@');
3289 bool inlineSimpleStructs =
Config_getBool(INLINE_SIMPLE_STRUCTS);
3290 Relationship relationship = isMemberOf ? Relationship::Foreign :
3291 isRelated ? Relationship::Related :
3292 Relationship::Member ;
3293 if (si!=-1 && !inlineSimpleStructs)
3297 pScope = scope.
left(std::max(si-2,0));
3299 pScope.
prepend(annScopePrefix);
3300 else if (annScopePrefix.
length()>2)
3301 pScope=annScopePrefix.
left(annScopePrefix.
length()-2);
3302 if (name.
at(0)!=
'@')
3370 scope=rname.
left(index);
3371 rname=rname.
mid(index+2);
3383 for (
auto &imd : *mn)
3385 if (!imd->isTypedef())
3394 bool notBothGrouped = root->
groups.empty() || imd->getGroupDef()==
nullptr;
3395 bool bothSameScope = (!cd && !nd) || (cd && imd->getClassDef() == cd) || (nd && imd->getNamespaceDef() == nd);
3398 if (notBothGrouped && bothSameScope && imd->typeString()==rtype)
3445 for (
const auto &e : root->
children())
3446 if (!e->section.isEnum())
3463 for (
const auto &e : root->
children())
3464 if (!e->section.isEnum())
3481 for (
const auto &e : root->
children())
3482 if (!e->section.isEnum())
3497 (root->
section.isVariable() &&
3500 (root->
section.isFunction() &&
3503 (root->
section.isFunction() &&
3512 for (
const auto &e : root->
children())
3513 if (!e->section.isEnum())
3539 mmd->setTagInfo(root->
tagInfo());
3540 mmd->setMemberClass(cd);
3542 mmd->setDocsForDefinition(
false);
3546 mmd->setMemberSpecifiers(root->
spec);
3547 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3548 mmd->setMemberGroupId(root->
mGrpId);
3550 mmd->setLanguage(root->
lang);
3551 mmd->setBodyDef(fd);
3552 mmd->setFileDef(fd);
3553 mmd->addSectionsToDefinition(root->
anchors);
3555 mmd->setDefinition(def);
3559 AUTO_TRACE(
"Interface member: fileName='{}' type='{}' name='{}' mtype='{}' prot={} virt={} state={} proto={} def='{}'",
3567 root->
spec.isOptional() ? Protection::Protected : Protection::Public, Specifier::Normal);
3577 mmd->setRefItems(root->
sli);
3586 if (root->
section.isExportedInterface() || root->
section.isIncludedService())
3588 AUTO_TRACE(
"Exported interface/included service: type='{}' scope='{}' name='{}' args='{}'"
3589 " relates='{}' relatesType='{}' file='{}' line={} bodyLine={} #tArgLists={}"
3590 " mGrpId={} spec={} proto={} docFile='{}'",
3616 "Illegal member name found.");
3622 case SrcLangExt::Unknown:
3623 case SrcLangExt::IDL:
3660 if ((fd==
nullptr || fd->
getLanguage()==SrcLangExt::Cpp) &&
3662 (
i=name.
find(
'<'))!=-1 &&
3663 (j=name.
find(
'>'))!=-1 &&
3664 (j!=
i+2 || name.
at(
i+1)!=
'=')
3682 root->
relatesType==RelatesType::MemberOf ? Relationship::Foreign :
3683 Relationship::Related ;
3693 mmd->setTagInfo(root->
tagInfo());
3694 mmd->setMemberClass(cd);
3696 mmd->setDocsForDefinition(!root->
proto);
3700 mmd->setMemberSpecifiers(spec);
3701 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3702 mmd->setMemberGroupId(root->
mGrpId);
3704 mmd->setLanguage(root->
lang);
3705 mmd->setRequiresClause(root->
req);
3706 mmd->setId(root->
id);
3707 mmd->setBodyDef(fd);
3708 mmd->setFileDef(fd);
3709 mmd->addSectionsToDefinition(root->
anchors);
3714 if (scopeSeparator!=
"::")
3716 qualScope =
substitute(qualScope,
"::",scopeSeparator);
3718 if (lang==SrcLangExt::PHP)
3721 scopeSeparator=
"::";
3739 def=type+
" "+qualScope+scopeSeparator+name;
3743 def=qualScope+scopeSeparator+name;
3747 mmd->setDefinition(def);
3751 AUTO_TRACE(
"function member: type='{}' scope='{}' name='{}' args='{}' proto={} def='{}'",
3752 type, qualScope, rname, args, root->
proto, def);
3762 mmd->setRefItems(root->
sli);
3786 mmd->setTagInfo(root->
tagInfo());
3787 mmd->setLanguage(root->
lang);
3788 mmd->setId(root->
id);
3793 mmd->setDocsForDefinition(!root->
proto);
3799 mmd->addSectionsToDefinition(root->
anchors);
3800 mmd->setMemberSpecifiers(root->
spec);
3801 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3802 mmd->setMemberGroupId(root->
mGrpId);
3803 mmd->setRequiresClause(root->
req);
3838 def=root->
type+
" "+scope+name;
3844 AUTO_TRACE(
"new non-member function type='{}' scope='{}' name='{}' args='{}' proto={} def='{}'",
3846 mmd->setDefinition(def);
3850 mmd->setRefItems(root->
sli);
3854 mmd->setNamespace(nd);
3861 mmd->setFileDef(fd);
3882 if (root->
section.isFunction())
3884 AUTO_TRACE(
"member function: type='{}' scope='{}' name='{}' args='{}' relates='{}' relatesType='{}'"
3885 " file='{}' line={} bodyLine={} #tArgLists={} mGrpId={}"
3886 " spec={} proto={} docFile='{}'",
3891 bool isFriend=root->
type.
find(
"friend ")!=-1;
3901 scope=rname.
left(index);
3902 rname=rname.
mid(index+2);
3911 if (root->
lang==SrcLangExt::CSharp)
3922 int memIndex=rname.
findRev(
"::");
3925 if (cd && scope+
"::"==rname.
left(scope.
length()+2))
3931 bool isMember=
FALSE;
3934 int ts=rname.
find(
'<');
3935 int te=rname.
find(
'>');
3936 if (memIndex>0 && (ts==-1 || te==-1))
3953 isMember=memIndex<ts || memIndex>te;
3993 for (
const auto &imd : *mn)
4006 fullScope.
prepend(parentScope);
4012 if (mnd) nsName = mnd->
name();
4013 if (rnd) rnsName = rnd->
name();
4021 bool sameTemplateArgs =
TRUE;
4022 bool matchingReturnTypes =
TRUE;
4023 bool sameRequiresClause =
TRUE;
4029 matchingReturnTypes =
FALSE;
4033 sameRequiresClause =
FALSE;
4039 sameTemplateArgs =
FALSE;
4042 bool staticsInDifferentFiles =
4050 matchingReturnTypes &&
4051 sameRequiresClause &&
4052 !staticsInDifferentFiles
4056 if (!root->
groups.empty() && !root->
groups.front().groupname.isEmpty())
4063 found=(mnd && rnd && nsName==rnsName) ||
4064 ((mnd==
nullptr && rnd==
nullptr && mfd!=
nullptr &&
4069 if (!found && gd && gd==md->
getGroupDef() && nsName==rnsName)
4075 AUTO_TRACE_ADD(
"combining function with prototype found={} in namespace '{}'",found,nsName);
4177 "Illegal member name found."
4195 for (
const auto &ifmd : *fn)
4199 for (
const auto &immd : *mn)
4215 AUTO_TRACE_ADD(
"Merging related global and member '{}' isFriend={} isRelated={} isFunction={}",
4292 for (
const auto &imdec : *mn)
4300 for (
const auto &imdef : *mn)
4303 if (mdef && mdec!=mdef &&
4323 for (
const auto &imd : *mn)
4339 if (mdef && mdec)
break;
4347 mdec->getOuterScope(),mdec->getFileDef(),
const_cast<ArgumentList*
>(&mdecAl),
4354 mdec->mergeReferences(mdef);
4356 mdec->mergeReferencedBy(mdef);
4373 for (
const auto &imd : *mn)
4384 for (
const auto &irmd : *rmn)
4418 size_t i=qualifiedName.rfind(
"::");
4419 if (
i!=std::string::npos)
4421 QCString scope = qualifiedName.substr(0,
i);
4422 QCString name = qualifiedName.substr(
i+2);
4426 for (
const auto &imd : *mn)
4452 std::map<std::string,int> templateNames;
4454 for (
const Argument &arg : templateArguments)
4456 static const reg::Ex re(R
"(\a[\w:]*)");
4459 for (; it!=
end ; ++it)
4461 const auto &match = *it;
4462 std::string n = match.str();
4463 if (n==arg.name.str())
4465 if (templateNames.find(n)==templateNames.end())
4467 templateNames.emplace(n,count);
4472 return templateNames;
4487 if (context && cd!=context)
4492 if (result==
nullptr)
4497 if (result==
nullptr)
4526 for (
auto &mi : *mni)
4536 type = typedefValue;
4555 usedClassName = typeCd->
name();
4558 int sp=usedClassName.
find(
'<');
4567 if (templateNames.empty())
4571 BaseInfo bi(usedName,Protection::Public,Specifier::Normal);
4576 if (arg.name==usedName)
4580 if (usedCd==
nullptr)
4631 if (!found && !type.
isEmpty())
4690 if (templateNames.empty())
4728 AUTO_TRACE(
"Derived from template '{}' with parameters '{}' isArtificial={}",
4729 templateClass->
name(),templSpec,isArtificial);
4732 bool existingClass = templSpec==tempArgsStr;
4733 if (existingClass)
return;
4735 bool freshInstance=
FALSE;
4752 for (
auto it=it_pair.first ; it!=it_pair.second ; ++it)
4754 const Entry *templateRoot = it->second;
4755 AUTO_TRACE_ADD(
"template root found '{}' templSpec='{}'",templateRoot->
name,templSpec);
4761 isArtificial,templArgs.get(),templateNames);
4780 int ti=ttype.
find(
'<');
4786 templateClassName,
true,
true);
4787 AUTO_TRACE_ADD(
"templateClassName={} baseClass={}",templateClassName,baseClass?baseClass->
name():
"<none>");
4806 int index=n.
find(
'<');
4818 int l =
static_cast<int>(name.
length());
4824 while (count>0 &&
i>=0)
4829 case '>':
if (!insideQuote) count++;
break;
4830 case '<':
if (!insideQuote) count--;
break;
4831 case '\'':
if (!insideQuote) insideQuote=c;
4832 else if (insideQuote==c && (
i<0 || name[
i]!=
'\\')) insideQuote=0;
4834 case '"':
if (!insideQuote) insideQuote=c;
4835 else if (insideQuote==c && (
i<0 || name[
i]!=
'\\')) insideQuote=0;
4855 AUTO_TRACE(
"name={} base={} isArtificial={} mode={}",cd->
name(),bi->
name,isArtificial,(
int)mode);
4858 bool explicitGlobalScope=
FALSE;
4862 explicitGlobalScope=
TRUE;
4866 bool lastParent=
FALSE;
4871 int scopeOffset=explicitGlobalScope ? 0 :
static_cast<int>(scopeName.
length());
4880 baseClassName.
prepend(scopeName.
left(scopeOffset)+
"::");
4882 if (root->
lang==SrcLangExt::CSharp)
4909 || explicitGlobalScope
4912 || (root->
lang==SrcLangExt::IDL &&
4913 (root->
section.isExportedInterface() ||
4914 root->
section.isIncludedService()))
4917 AUTO_TRACE_ADD(
"class relation '{}' inherited/used by '{}' found prot={} virt={} templSpec='{}'",
4918 baseClassName, root->
name, bi->
prot, bi->
virt, templSpec);
4921 int si=baseClassName.
findRev(
"::",
i);
4923 if (baseClass==
nullptr &&
static_cast<size_t>(
i)!=baseClassName.
length())
4933 baseClassName = baseClassName.
left(
i)+baseClassName.
right(baseClassName.
length()-e);
4944 else if (baseClass && !templSpec.
isEmpty())
4955 baseClass = templClass;
4963 if (!found && si!=-1)
4973 found=baseClass!=
nullptr && baseClass!=cd;
4983 found = baseClass!=
nullptr && baseClass!=cd;
4995 found = baseClass!=
nullptr && baseClass!=cd;
4998 bool isATemplateArgument = templateNames.find(biName.
str())!=templateNames.end();
5003 AUTO_TRACE_ADD(
"Documented base class '{}' templSpec='{}'",biName,templSpec);
5021 if (baseClassTypeDef==
nullptr)
5031 if (baseClassTypeDef)
5040 AUTO_TRACE_ADD(
"insertBaseClass name={} prot={} virt={} templSpec={}",usedName,prot,bi->
virt,templSpec);
5048 "Detected potential recursive class relation "
5049 "between class {} and base class {}!",
5056 else if (mode==
Undocumented && (scopeOffset==0 || isATemplateArgument))
5058 AUTO_TRACE_ADD(
"New undocumented base class '{}' baseClassName='{}' templSpec='{}' isArtificial={}",
5059 biName,baseClassName,templSpec,isArtificial);
5061 if (isATemplateArgument)
5064 if (baseClass==
nullptr)
5083 if (baseClass==
nullptr)
5094 si = baseClassName.
findRev(
"::");
5110 biName=
"<"+biName.
left(biName.
length()-2)+
">";
5114 AUTO_TRACE_ADD(
"insertBaseClass name={} prot={} virt={} templSpec={}",biName,bi->
prot,bi->
virt,templSpec);
5124 if (scope!=baseClass)
5150 "Detected potential recursive class relation "
5151 "between class {} and base class {}!",
5152 root->
name,baseClassName
5163 else if ((scopeOffset=scopeName.
findRev(
"::",scopeOffset-1))==-1)
5168 }
while (scopeOffset>=0);
5170 if (parentNode==
nullptr)
5176 parentNode=parentNode->
parent();
5178 }
while (lastParent);
5198 bool hasExtends = !root->
extends.empty();
5199 if (hasExtends)
return TRUE;
5223 if ((root->
lang==SrcLangExt::CSharp || root->
lang==SrcLangExt::Java) &&
5224 (
i=bName.
find(
'<'))!=-1)
5228 if (root->
lang==SrcLangExt::CSharp)
5234 bName = bName.
left(
i);
5266 if (
i!=-1 && j!=-1 && k==-1 && root->
lang!=SrcLangExt::CSharp && root->
lang!=SrcLangExt::Java)
5299 if (!nd->hasDocumentation())
5302 nd->getLanguage() == SrcLangExt::Fortran) &&
5306 warn_undoc(nd->getDefFileName(),nd->getDefLine(),
"{} {} is not documented.",
5307 nd->getLanguage() == SrcLangExt::Fortran ?
"Module" :
"Namespace",
5371 for (
const auto &tn_kv : templateNames)
5373 size_t templIndex = tn_kv.second;
5375 bool hasActArg=
FALSE;
5376 if (templIndex<templArgs->
size())
5378 actArg=templArgs->at(templIndex);
5382 baseClassNames.find(actArg.
type.
str())!=baseClassNames.end() &&
5383 actualTemplateNames.find(actArg.
type.
str())==actualTemplateNames.end()
5386 actualTemplateNames.emplace(actArg.
type.
str(),
static_cast<int>(templIndex));
5421 for (
const auto &fd : *fn)
5423 fd->computeAnchors();
5436 gd->computeAnchors();
5456 for (
const auto &fd : *fn)
5458 fd->addListReferences();
5473 gd->addListReferences();
5478 QCString name = pd->getOutputFileBase();
5479 if (pd->getGroupDef())
5481 name = pd->getGroupDef()->getOutputFileBase();
5488 name,pd->title(),
QCString(),
nullptr);
5494 QCString name = dd->getOutputFileBase();
5503 name,dd->displayName(),
QCString(),
nullptr);
5532 if (md==
nullptr)
return;
5533 AUTO_TRACE(
"scope='{}' name='{}' args='{}' funcDecl='{}' mSpec={}",
5548 fullName = cd->
name();
5550 fullName = nd->
name();
5552 if (!fullName.
isEmpty()) fullName+=
"::";
5553 fullName+=md->
name();
5657 "member {} belongs to two different groups. The second one found here will be ignored.",
5692 return allowNoGroup;
5695 for (
const auto &g : root->
groups)
5697 if (g.groupname == gd->
name())
5720 AUTO_TRACE(
"namespace='{}' type='{}' name='{}' tempArg='{}' decl='{}'",namespaceName,type,name,tempArg,decl);
5734 for (
const auto &md : *mn)
5745 if (md->isAlias() && md->getOuterScope() &&
5752 nd = md->getNamespaceDef();
5757 if (nd && md->isEnumValue() && (enumNamePos=namespaceName.
findRev(
"::"))!=-1)
5759 QCString enumName = namespaceName.
mid(enumNamePos+2);
5760 if (namespaceName.
left(enumNamePos)==nd->
name())
5765 for (
const auto &emd : *enumMn)
5767 found = emd->isStrong() && md->getEnumScope()==emd.get();
5781 else if (nd==
nullptr && md->isEnumValue())
5786 for (
const auto &emd : *enumMn)
5788 found = emd->isStrong() && md->getEnumScope()==emd.get();
5811 if ((namespaceName.
isEmpty() && nd==
nullptr) ||
5812 (nd && nd->
name()==namespaceName) ||
5816 AUTO_TRACE_ADD(
"Try to add member '{}' to scope '{}'",md->name(),namespaceName);
5824 md->isVariable() || md->isTypedef() ||
5832 if (matching && !root->
tArgLists.empty())
5851 if (matching && md->isStatic() &&
5852 md->getDefFileName()!=root->
fileName &&
5860 if (!md->templateArguments().empty() && !root->
tArgLists.empty())
5864 if (md->templateArguments().size()!=root->
tArgLists.back().size() ||
5865 md->typeString()!=type ||
5866 md->requiresClause()!=root->
req)
5882 if (!found && root->
relatesType!=RelatesType::Duplicate && root->
section.isFunction())
5886 QCString warnMsg =
"no matching file member found for \n"+fullFuncDecl;
5889 warnMsg+=
"\nPossible candidates:";
5890 for (
const auto &md : *mn)
5894 warnMsg+=
"' " +
warn_line(md->getDefFileName(),md->getDefLine());
5902 if (root->
type!=
"friend class" &&
5903 root->
type!=
"friend struct" &&
5904 root->
type!=
"friend union" &&
5905 root->
type!=
"friend" &&
5911 "documented symbol '{}' was not declared or defined.",
qPrint(decl)
5923 auto srcIt = srcTempArgLists.begin();
5924 auto dstIt = dstTempArgLists.begin();
5925 while (srcIt!=srcTempArgLists.end() && dstIt!=dstTempArgLists.end())
5927 if ((*srcIt).size()!=(*dstIt).size())
return TRUE;
5941 result = cd->templateArguments().hasParameters() || cd->templateMaster()!=
nullptr ||
5951 const std::string &src
5955 static const reg::Ex re(R
"(\a\w*)");
5960 for (; it!=
end ; ++it)
5962 const auto &match = *it;
5963 size_t i = match.position();
5964 size_t l = match.length();
5966 dst+=src.substr(p,
i-p);
5967 std::string name=match.str();
5969 auto srcIt = srcTempArgLists.begin();
5970 auto dstIt = dstTempArgLists.begin();
5971 while (srcIt!=srcTempArgLists.end() && !found)
5974 std::vector<Argument>::const_iterator tdaIt;
5975 if (dstIt!=dstTempArgLists.end())
5978 tdaIt = tdAli->
begin();
5983 for (
auto tsaIt = tsaLi.
begin(); tsaIt!=tsaLi.
end() && !found; ++tsaIt)
5987 if (tdAli && tdaIt!=tdAli->
end())
6003 else if (tdaType.
startsWith(
"typename ")) vc=9;
6006 tdaName = tdaType.
mid(vc);
6039 auto dstIt = dst.
begin();
6044 if (dstIt == dst.
end())
6048 da.
array = dstArray;
6056 da.
array = dstArray;
6064 srcTempArgLists,dstTempArgLists,
6090 funcType,funcName,funcArgs,exceptions,
6094 mmd->setTagInfo(root->
tagInfo());
6095 mmd->setLanguage(root->
lang);
6096 mmd->setId(root->
id);
6097 mmd->makeImplementationDetail();
6098 mmd->setMemberClass(cd);
6099 mmd->setDefinition(funcDecl);
6105 mmd->setDocsForDefinition(!root->
proto);
6107 mmd->addSectionsToDefinition(root->
anchors);
6111 mmd->setMemberSpecifiers(spec);
6112 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6113 mmd->setMemberGroupId(root->
mGrpId);
6116 mmd->setRefItems(root->
sli);
6152 bool memFound=
FALSE;
6153 for (
const auto &imd : *mn)
6156 if (md==
nullptr)
continue;
6158 if (cd==
nullptr)
continue;
6175 if (!namespaceName.
isEmpty()) fullScope.
prepend(namespaceName+
"::");
6176 if (fullScope==cd->
name())
6182 for (
const auto &emd : *enumMn)
6184 memFound = emd->isStrong() && md->
getEnumScope()==emd.get();
6190 if (memFound)
break;
6195 if (memFound)
break;
6213 if (!templAl.
empty())
6215 declTemplArgs.push_back(templAl);
6223 bool substDone=
FALSE;
6230 if (declTemplArgs.size()>0 && declTemplArgs.size()==defTemplArgs.size())
6246 AUTO_TRACE_ADD(
"matching '{}'<=>'{}' className='{}' namespaceName='{}'",
6270 AUTO_TRACE_ADD(
"Comparing return types '{}'<->'{}' #args {}<->{}",
6278 else if (defTemplArgs.size()>declTemplArgs.size())
6280 AUTO_TRACE_ADD(
"Different number of template arguments {} vs {}",defTemplArgs.size(),declTemplArgs.size());
6286 bool rootIsUserDoc = root->
section.isMemberDoc();
6289 bool classOrMdIsTemplate = mdIsTemplate || classIsTemplate;
6290 bool rootIsTemplate = !root->
tArgLists.empty();
6292 if (!rootIsUserDoc &&
6293 (mdIsTemplate || rootIsTemplate) &&
6294 ((classOrMdIsTemplate && !rootIsTemplate) || (!classOrMdIsTemplate && rootIsTemplate))
6299 AUTO_TRACE_ADD(
"Comparing return types: template v.s. non-template");
6303 AUTO_TRACE_ADD(
"Match results of matchArguments2='{}' substDone='{}'",matching,substDone);
6314 if (!funcTempList.
isEmpty() &&
6334 else if (cd && cd!=tcd)
6340 if (memFound)
break;
6344 addLocalObjCMethod(root,scopeName,funcType,funcName,funcArgs,exceptions,funcDecl,spec);
6347 if (count==0 && !(isFriend && funcType==
"class"))
6350 const ClassDef *ecd =
nullptr, *ucd =
nullptr;
6351 MemberDef *emd =
nullptr, *umd =
nullptr;
6353 for (
const auto &md : *mn)
6375 AUTO_TRACE_ADD(
"new candidate className='{}' scope='{}' args='{}': exact match",
6376 className,ccd->
name(),md->argsString());
6382 AUTO_TRACE_ADD(
"new candidate className='{}' scope='{}' args='{}': no match",
6383 className,ccd->
name(),md->argsString());
6388 bool strictProtoMatching =
Config_getBool(STRICT_PROTO_MATCHING);
6389 if (!strictProtoMatching)
6391 if (candidates==1 && ucd && umd)
6398 else if (candidates>1 && ecd && emd)
6409 if (noMatchCount>1) warnMsg+=
"uniquely ";
6410 warnMsg+=
"matching class member found for \n";
6414 warnMsg+=
" template ";
6423 warnMsg+=fullFuncDecl;
6425 if (candidates>0 || noMatchCount>=1)
6427 warnMsg+=
"\nPossible candidates:";
6433 for (
const auto &md : *mn)
6435 const ClassDef *cd=md->getClassDef();
6449 warnMsg+=
"template ";
6454 if (!md->typeString().isEmpty())
6456 warnMsg+=md->typeString();
6461 warnMsg+=qScope+
"::"+md->name();
6462 warnMsg+=md->argsString();
6463 warnMsg+=
"' " +
warn_line(md->getDefFileName(),md->getDefLine());
6484 AUTO_TRACE(
"funcType={} funcName={} funcArgs={} funcDecl={} spec={}",funcType,funcName,funcArgs,funcDecl,spec);
6486 for (
const auto &md : *mn)
6488 if (md->getClassDef()==cd)
6500 funcType,funcName,funcArgs,exceptions,
6506 mmd->setTagInfo(root->
tagInfo());
6507 mmd->setLanguage(root->
lang);
6508 mmd->setId(root->
id);
6509 mmd->setMemberClass(cd);
6510 mmd->setTemplateSpecialization(
TRUE);
6512 mmd->setDefinition(funcDecl);
6518 mmd->setDocsForDefinition(!root->
proto);
6520 mmd->addSectionsToDefinition(root->
anchors);
6524 mmd->setMemberSpecifiers(spec);
6525 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6526 mmd->setMemberGroupId(root->
mGrpId);
6528 mmd->setRefItems(root->
sli);
6542 bool sameClass=
false;
6547 [](
const auto &md1,
const auto &md2)
6548 { return md1->getClassDef()->name()==md2->getClassDef()->name(); });
6554 if (cd==
nullptr)
return;
6562 std::unique_ptr<ArgumentList> tArgList =
6567 funcType,funcName,funcArgs,exceptions,
6571 mmd->setTagInfo(root->
tagInfo());
6572 mmd->setLanguage(root->
lang);
6573 mmd->setId(root->
id);
6575 mmd->setMemberClass(cd);
6576 mmd->setDefinition(funcDecl);
6585 mmd->setDocsForDefinition(!root->
proto);
6587 mmd->addSectionsToDefinition(root->
anchors);
6591 mmd->setMemberSpecifiers(spec);
6592 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6593 mmd->setMemberGroupId(root->
mGrpId);
6596 mmd->setRefItems(root->
sli);
6654 AUTO_TRACE(
"root='{}' funcDecl='{}' related='{}' overload={} isFunc={} mGrpId={} #tArgList={} spec={} lang={}",
6667 bool isRelated=
false;
6668 bool isMemberOf=
false;
6669 bool isFriend=
false;
6682 spec.setInline(
true);
6687 spec.setExplicit(
true);
6692 spec.setMutable(
true);
6703 while ((sep=funcDecl.
find(
';'))!=-1)
6709 if (!funcDecl.
isEmpty() && funcDecl[0]!=
' ') funcDecl.
prepend(
" ");
6721 if (isFriend && funcDecl.
startsWith(
"class "))
6725 funcName = funcDecl;
6727 else if (isFriend && funcDecl.
startsWith(
"struct "))
6730 funcName = funcDecl;
6736 funcArgs,funcTempList,exceptions
6744 AUTO_TRACE_ADD(
"scopeName='{}' className='{}' namespaceName='{}' funcType='{}' funcName='{}' funcArgs='{}'",
6745 scopeName,className,namespaceName,funcType,funcName,funcArgs);
6749 isMemberOf=(root->
relatesType == RelatesType::MemberOf);
6756 scopeName = relates;
6769 scopeName = joinedName;
6783 QCString joinedName = fnd->name()+
"::"+scopeName;
6786 scopeName=joinedName;
6813 AUTO_TRACE_ADD(
"scopeName='{}' className='{}' namespaceName='{}'",scopeName,className,namespaceName);
6822 scopeName=namespaceName;
6824 else if (!relates.
isEmpty() ||
6827 scopeName=namespaceName+
"::"+className;
6831 scopeName=className;
6834 else if (!className.
isEmpty())
6836 scopeName=className;
6846 uint32_t argListIndex=0;
6851 tempScopeName=scopeName+funcSpec;
6865 funcDecl=funcType+
" "+tempScopeName+
"::"+funcName+funcTempList;
6869 funcDecl=funcType+
" "+tempScopeName+
"::"+funcName+funcArgs;
6876 funcDecl=tempScopeName+
"::"+funcName+funcTempList;
6880 funcDecl=tempScopeName+
"::"+funcName+funcArgs;
6890 funcDecl=funcType+
" "+funcName+funcTempList;
6894 funcDecl=funcType+
" "+funcName+funcArgs;
6901 funcDecl=funcName+funcTempList;
6905 funcDecl=funcName+funcArgs;
6910 if (funcType==
"template class" && !funcTempList.
isEmpty())
6913 AUTO_TRACE_ADD(
"Parse results: namespaceName='{}' className=`{}` funcType='{}' funcSpec='{}' "
6914 " funcName='{}' funcArgs='{}' funcTempList='{}' funcDecl='{}' relates='{}'"
6915 " exceptions='{}' isRelated={} isMemberOf={} isFriend={} isFunc={}",
6916 namespaceName, className, funcType, funcSpec,
6917 funcName, funcArgs, funcTempList, funcDecl, relates,
6918 exceptions, isRelated, isMemberOf, isFriend, isFunc);
6924 bool strongEnum =
false;
6928 for (
const auto &imd : *mn)
6941 namespaceName+=
"::"+className;
6945 namespaceName=className;
6953 funcName =
substitute(funcName,className+
"::",
"");
6964 if (!isRelated && !strongEnum && mn)
6972 funcArgs,funcTempList,exceptions,
6973 type,args,isFriend,spec,relates,funcDecl,overloaded,isFunc);
6985 else if (overloaded)
6987 addOverloaded(root,mn,funcType,funcName,funcArgs,funcDecl,exceptions,spec);
6991 if (!
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec))
6996 "Cannot determine class for function\n{}",
7002 else if (isRelated && !relates.
isEmpty())
7004 AUTO_TRACE_ADD(
"related function scopeName='{}' className='{}'",scopeName,className);
7005 if (className.
isEmpty()) className=relates;
7009 bool newMember=
TRUE;
7015 for (
const auto &imd : *mn)
7049 mn->
push_back(std::move(mdDefineTaken));
7063 for (
const auto &irmd : *mn)
7084 addMemberDocs(root,rmd_found,funcDecl,
nullptr,overloaded,spec);
7092 switch (root->
mtype)
7113 funcType,funcName,funcArgs,exceptions,
7116 isMemberOf ? Relationship::Foreign : Relationship::Related,
7136 mmd->setDefinitionTemplateParameterLists(root->
tArgLists);
7138 mmd->setTagInfo(root->
tagInfo());
7152 for (
const auto &irmd : *rmn)
7183 mmd->setBodyDef(fd);
7190 mmd->setMemberClass(cd);
7191 mmd->setMemberSpecifiers(spec);
7192 mmd->setVhdlSpecifiers(root->
vhdlSpec);
7193 mmd->setDefinition(funcDecl);
7198 mmd->setDocsForDefinition(!root->
proto);
7201 mmd->addSectionsToDefinition(root->
anchors);
7202 mmd->setMemberGroupId(root->
mGrpId);
7203 mmd->setLanguage(root->
lang);
7204 mmd->setId(root->
id);
7208 mmd->setRefItems(root->
sli);
7209 if (root->
relatesType==RelatesType::Duplicate) mmd->setRelatedAlso(cd);
7217 if (!
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec))
7222 "Cannot determine file/namespace for relatedalso function\n{}",
7236 addLocalObjCMethod(root,scopeName,funcType,funcName,funcArgs,exceptions,funcDecl,spec);
7240 bool globMem =
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec);
7241 if (className.
isEmpty() && !globMem)
7245 else if (!className.
isEmpty() && !globMem)
7248 "member '{}' of class '{}' cannot be found",
7249 funcName,className);
7267 AUTO_TRACE(
"root->type='{}' root->inside='{}' root->name='{}' root->args='{}' section={} root->spec={} root->mGrpId={}",
7282 type=type.
left(
i+l);
7293 if (root->
section.isMemberDoc())
7319 else if (root->
section.isOverloadDoc())
7333 (root->
section.isVariable() &&
7345 if (type==
"friend class" || type==
"friend struct" ||
7346 type==
"friend union")
7352 type+
" "+root->
name,
7385 else if (root->
section.isVariableDoc())
7397 else if (root->
section.isExportedInterface() ||
7398 root->
section.isIncludedService())
7404 type +
" " + root->
name,
7417 if (root->
section.isMemberDoc() ||
7418 root->
section.isOverloadDoc() ||
7421 root->
section.isVariableDoc() ||
7423 root->
section.isIncludedService() ||
7424 root->
section.isExportedInterface()
7434 for (
const auto &e : root->
children())
7436 if (!e->section.isEnum())
7448 for (
const auto &objCImpl : root->
children())
7450 if (objCImpl->section.isObjcImpl())
7452 for (
const auto &objCMethod : objCImpl->children())
7454 if (objCMethod->section.isFunction())
7458 objCMethod->relates,
7461 objCMethod->type+
" "+objCImpl->name+
"::"+objCMethod->name+
" "+objCMethod->args,
7463 objCMethod->section=EntryType::makeEmpty();
7482 bool isGlobal =
false;
7483 bool isRelated =
false;
7484 bool isMemberOf =
false;
7494 if (root->
lang==SrcLangExt::CSharp)
7517 isMemberOf=(root->
relatesType==RelatesType::MemberOf);
7552 isMemberOf ? Relationship::Foreign : isRelated ? Relationship::Related : Relationship::Member,
7556 mmd->setTagInfo(root->
tagInfo());
7557 mmd->setLanguage(root->
lang);
7558 mmd->setId(root->
id);
7559 if (!isGlobal) mmd->setMemberClass(cd);
else mmd->setFileDef(fd);
7561 mmd->setBodyDef(root->
fileDef());
7562 mmd->setMemberSpecifiers(root->
spec);
7563 mmd->setVhdlSpecifiers(root->
vhdlSpec);
7564 mmd->setEnumBaseType(root->
args);
7567 mmd->addSectionsToDefinition(root->
anchors);
7568 mmd->setMemberGroupId(root->
mGrpId);
7572 mmd->setRefItems(root->
sli);
7586 mmd->setDefinition(name+baseType);
7590 mmd->setDefinition(nd->
name()+
"::"+name+baseType);
7594 mmd->setNamespace(nd);
7601 if (isGlobal && (nd==
nullptr || !nd->
isAnonymous()))
7603 if (!defSet) mmd->setDefinition(name+baseType);
7604 if (fd==
nullptr && root->
parent())
7610 mmd->setFileDef(fd);
7618 mmd->setDefinition(name+baseType);
7622 mmd->setDefinition(cd->
name()+
"::"+name+baseType);
7628 mmd->setDocsForDefinition(!root->
proto);
7658 bool isGlobal =
false;
7659 bool isRelated =
false;
7669 if (root->
lang==SrcLangExt::CSharp)
7684 if (root->
lang==SrcLangExt::CSharp)
7730 struct EnumValueInfo
7732 EnumValueInfo(
const QCString &n,std::unique_ptr<MemberDef> &&md) :
7733 name(n), member(std::move(md)) {}
7735 std::unique_ptr<MemberDef> member;
7737 std::vector< EnumValueInfo > extraMembers;
7739 for (
const auto &imd : *mn)
7746 for (
const auto &e : root->
children())
7749 bool isJavaLike = sle==SrcLangExt::CSharp || sle==SrcLangExt::Java || sle==SrcLangExt::XML;
7750 if ( isJavaLike || root->
spec.isStrong())
7752 if (sle == SrcLangExt::Cpp && e->section.isDefine())
continue;
7760 if (
i!=-1 && sle==SrcLangExt::CSharp)
7766 qualifiedName=
substitute(qualifiedName,
"::",
".");
7771 if (fileName.
isEmpty() && e->tagInfo())
7773 fileName = e->tagInfo()->tagName;
7777 fileName,e->startLine,e->startColumn,
7778 e->type,e->name,e->args,
QCString(),
7779 e->protection, Specifier::Normal,e->isStatic,Relationship::Member,
7786 fmmd->setNamespace(mnd);
7790 fmmd->setTagInfo(e->tagInfo());
7791 fmmd->setLanguage(e->lang);
7792 fmmd->setBodySegment(e->startLine,e->bodyLine,e->endBodyLine);
7793 fmmd->setBodyDef(e->fileDef());
7795 fmmd->setDocumentation(e->doc,e->docFile,e->docLine);
7796 fmmd->setBriefDescription(e->brief,e->briefFile,e->briefLine);
7797 fmmd->addSectionsToDefinition(e->anchors);
7798 std::string init = e->initializer.str();
7799 fmmd->setInitializer(init.c_str());
7800 fmmd->setMaxInitLines(e->initLines);
7801 fmmd->setMemberGroupId(e->mGrpId);
7802 fmmd->setExplicitExternal(e->explicitExternal,fileName,e->startLine,e->startColumn);
7803 fmmd->setRefItems(e->sli);
7806 fmmd->setEnumScope(md,
TRUE);
7807 extraMembers.emplace_back(e->name,std::move(fmd));
7816 if (!e->name.isEmpty() && (fmn=emnsd->
find(e->name)))
7819 for (
const auto &ifmd : *fmn)
7850 else if (isRelated && cd)
7882 for (
auto &e : extraMembers)
7927 if (gd==
nullptr && !root->
groups.empty())
7941 for (
const auto &g : root->
groups)
7960 "Found non-existing group '{}' for the command '{}', ignoring command",
7974 if (root->
section.isEnumDoc() &&
8000 AUTO_TRACE(
"Found docs for enum with name '{}' and scope '{}' in context '{}' cd='{}', nd='{}' fd='{}'",
8014 for (
const auto &imd : *mn)
8029 else if (cd==
nullptr && mcd==
nullptr && nd!=
nullptr && mnd==nd)
8036 else if (cd==
nullptr && nd==
nullptr && mcd==
nullptr && mnd==
nullptr && fd==mfd)
8061 for (
const auto &mn : mnsd)
8064 for (
const auto &imd : *mn)
8069 int documentedEnumValues=0;
8073 if (fmd->isLinkableInProject()) documentedEnumValues++;
8099 for (
const auto &md : *mn)
8101 index.addClassMemberNameToIndex(md.get());
8102 if (md->getModuleDef())
8104 index.addModuleMemberNameToIndex(md.get());
8112 for (
const auto &md : *mn)
8114 if (md->getNamespaceDef())
8116 index.addNamespaceMemberNameToIndex(md.get());
8120 index.addFileMemberNameToIndex(md.get());
8122 if (md->getModuleDef())
8124 index.addModuleMemberNameToIndex(md.get());
8129 index.sortMemberIndexLists();
8138 if (cd->isLinkableInProject())
8151 if (cd->isLinkableInProject())
8164 if (nd->isLinkableInProject())
8177 for (
const auto &fd : *fn)
8193 std::string
s = title.str();
8194 static const reg::Ex re(R
"(\a[\w-]*)");
8197 for (; it!=
end ; ++it)
8199 const auto &match = *it;
8200 std::string matchStr = match.str();
8208 if (gd->isLinkableInProject())
8210 addWordsForTitle(gd.get(),gd->anchor(),gd->groupTitle());
8216 if (pd->isLinkableInProject())
8218 addWordsForTitle(pd.get(),pd->anchor(),pd->title());
8238 if (md->getClassDef())
8242 if (md->getNamespaceDef())
8253 if (md->getGroupDef()) scope = md->getGroupDef();
8254 else if (md->getClassDef()) scope = md->getClassDef();
8255 else if (md->getNamespaceDef()) scope = md->getNamespaceDef();
8256 else if (md->getFileDef()) scope = md->getFileDef();
8262 if (md->isLinkableInProject())
8264 if (!(md->isEnumerate() && md->isAnonymous()))
8269 if (md->isEnumerate())
8271 for (
const auto &fmd : md->enumFieldList())
8284 for (
const auto &md : *mn)
8286 addMemberToIndices(md.get());
8293 for (
const auto &md : *mn)
8295 addMemberToIndices(md.get());
8308 for (
const auto &imd : *mn)
8321 for (
const auto &imd : *mn)
8338 for (
const auto &imd : *mn)
8347 const auto &bmni = bmn.
find(mn->memberName());
8350 for (
const auto &ibmd : *bmni)
8358 lang==SrcLangExt::Python ||
8359 lang==SrcLangExt::Java ||
8360 lang==SrcLangExt::PHP ||
8371 lang==SrcLangExt::Python ||
8378 if (lang==SrcLangExt::Python && md->
name().
startsWith(
"__"))
continue;
8418 if (cd->isLinkable())
8420 for (
const auto &bcd : cd->baseClasses())
8436 for (
const auto &ti : cd->getTemplateInstances())
8455 int i=cd->name().find(
'(');
8462 AUTO_TRACE_ADD(
"merging members of category {} into {}",cd->name(),baseClass->
name());
8477 cd->subClasses().empty() &&
8478 !cd->baseClasses().empty())
8509 msg(
"Generating code for file {}...\n",fd->
docName());
8514 else if (parseSources)
8516 msg(
"Parsing code for file {}...\n",fd->
docName());
8532 for (
const auto &fd : *fn)
8540 for (
const auto &fd : *fn)
8549 clangParser->parse();
8550 processSourceFile(fd.get(),*
g_outputList,clangParser.get());
8552 for (
auto incFile : clangParser->filesInSameTU())
8554 if (filesToProcess.find(incFile)!=filesToProcess.end() &&
8556 processedFiles.
find(incFile)==processedFiles.end())
8563 processSourceFile(ifd,*
g_outputList,clangParser.get());
8564 processedFiles.insert(incFile);
8575 for (
const auto &fd : *fn)
8577 if (processedFiles.find(fd->
absFilePath().
str())==processedFiles.end())
8582 clangParser->parse();
8583 processSourceFile(fd.get(),*
g_outputList,clangParser.get());
8596 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8599 msg(
"Generating code files using {} threads.\n",numThreads);
8600 struct SourceContext
8603 : fd(fd_), generateSourceFile(gen_), ol(ol_) {}
8605 bool generateSourceFile;
8609 std::vector< std::future< std::shared_ptr<SourceContext> > > results;
8612 for (
const auto &fd : *fn)
8615 auto ctx = std::make_shared<SourceContext>(fd.get(),generateSourceFile,*
g_outputList);
8616 auto processFile = [ctx]()
8618 if (ctx->generateSourceFile)
8620 msg(
"Generating code for file {}...\n",ctx->fd->docName());
8624 msg(
"Parsing code for file {}...\n",ctx->fd->docName());
8627 ctx->fd->getAllIncludeFilesRecursively(filesInSameTu);
8628 if (ctx->generateSourceFile)
8630 ctx->fd->writeSourceHeader(ctx->ol);
8631 ctx->fd->writeSourceBody(ctx->ol,
nullptr);
8632 ctx->fd->writeSourceFooter(ctx->ol);
8637 ctx->fd->parseSource(
nullptr);
8641 results.emplace_back(threadPool.
queue(processFile));
8644 for (
auto &f : results)
8653 for (
const auto &fd : *fn)
8673 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8679 : fd(fd_), ol(ol_) {}
8684 std::vector< std::future< std::shared_ptr<DocContext> > > results;
8687 for (
const auto &fd : *fn)
8689 bool doc = fd->isLinkableInProject();
8692 auto ctx = std::make_shared<DocContext>(fd.get(),*
g_outputList);
8693 auto processFile = [ctx]() {
8694 msg(
"Generating docs for file {}...\n",ctx->fd->docName());
8695 ctx->fd->writeDocumentation(ctx->ol);
8698 results.emplace_back(threadPool.
queue(processFile));
8702 for (
auto &f : results)
8711 for (
const auto &fd : *fn)
8713 bool doc = fd->isLinkableInProject();
8716 msg(
"Generating docs for file {}...\n",fd->docName());
8735 const_cast<FileDef*
>(fd)->addSourceRef(cd->getStartDefLine(),cd.get(),
nullptr);
8744 const_cast<FileDef*
>(fd)->addSourceRef(cd->getStartDefLine(),cd.get(),
nullptr);
8753 const_cast<FileDef*
>(fd)->addSourceRef(nd->getStartDefLine(),nd.get(),
nullptr);
8760 for (
const auto &md : *mn)
8769 md->isLinkableInProject() &&
8775 const_cast<FileDef*
>(fd)->addSourceRef(md->getStartDefLine(),md->getOuterScope(),md.get());
8781 for (
const auto &md : *mn)
8791 md->isLinkableInProject() &&
8797 const_cast<FileDef*
>(fd)->addSourceRef(md->getStartDefLine(),md->getOuterScope(),md.get());
8814 for (
const auto &def : it->second)
8817 def.fileName,def.lineNr,def.columnNr,
8818 "#define",def.name,def.args,
QCString(),
8823 if (!def.args.isEmpty())
8827 mmd->setInitializer(def.definition);
8828 mmd->setFileDef(def.fileDef);
8829 mmd->setDefinition(
"#define "+def.name);
8834 const MemberList *defMl = def.fileDef->getMemberList(MemberListType::DocDefineMembers());
8843 def.fileDef->insertMember(md.get());
8845 AUTO_TRACE_ADD(
"adding macro {} with definition {}",def.name,def.definition);
8879 for (
const auto &fd : *fn)
8881 fd->sortMemberLists();
8888 gd->sortMemberLists();
8905 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8909 std::vector < std::future< void > > results;
8913 for (
const auto &def : symList)
8916 if (dm && !
isSymbolHidden(def) && !def->isArtificial() && def->isLinkableInProject())
8918 auto processTooltip = [dm]() {
8921 results.emplace_back(threadPool.
queue(processTooltip));
8926 for (
auto &f : results)
8935 for (
const auto &def : symList)
8938 if (dm && !
isSymbolHidden(def) && !def->isArtificial() && def->isLinkableInProject())
8985 for (
const auto &fd : *fn)
9007 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
9013 : cd(cd_), ol(ol_) {}
9018 std::vector< std::future< std::shared_ptr<DocContext> > > results;
9019 for (
const auto &cd : classList)
9022 if (cd->getOuterScope()==
nullptr ||
9026 auto ctx = std::make_shared<DocContext>(cd,*
g_outputList);
9027 auto processFile = [ctx]()
9029 msg(
"Generating docs for compound {}...\n",ctx->cd->displayName());
9033 if (!ctx->cd->isHidden() && !ctx->cd->isEmbeddedInOuterScope() &&
9034 ctx->cd->isLinkableInProject() && !ctx->cd->isImplicitTemplateInstance())
9036 ctx->cd->writeDocumentation(ctx->ol);
9037 ctx->cd->writeMemberList(ctx->ol);
9041 ctx->cd->writeDocumentationForInnerClasses(ctx->ol);
9044 results.emplace_back(threadPool.
queue(processFile));
9047 for (
auto &f : results)
9054 for (
const auto &cd : classList)
9058 if (cd->getOuterScope()==
nullptr ||
9064 if ( !cd->isHidden() && !cd->isEmbeddedInOuterScope() &&
9065 cd->isLinkableInProject() && !cd->isImplicitTemplateInstance())
9067 msg(
"Generating docs for compound {}...\n",cd->displayName());
9082 for (
const auto &innerCdi : cd->
getClasses())
9087 AUTO_TRACE(
"innerCd={} isLinkable={} isImplicitTemplateInstance={} protectLevelVisible={} embeddedInOuterScope={}",
9096 list.push_back(innerCd);
9104 std::vector<ClassDefMutable*> classList;
9153 for (
const auto &imd : *mn)
9189 for (
const auto &fd : *fn)
9191 fd->combineUsingRelations();
9223 for (
const auto &fd : *fn)
9225 fd->addMembersToMemberGroup();
9240 gd->addMembersToMemberGroup();
9261 for (
const auto &fd : *fn)
9263 fd->distributeMemberGroupDocumentation();
9278 gd->distributeMemberGroupDocumentation();
9308 for (
const auto &fd : *fn)
9310 fd->findSectionsInDocumentation();
9325 gd->findSectionsInDocumentation();
9330 pd->findSectionsInDocumentation();
9335 dd->findSectionsInDocumentation();
9356 elementsToRemove.push_back(ci.first);
9359 for (
const auto &k : elementsToRemove)
9370 for (
const auto &ifmd : *fn)
9384 for (
const auto &imd : *nm)
9416 elementsToRemove.push_back(ci.first);
9419 for (
const auto &k : elementsToRemove)
9428 for (
const auto &ifmd : *fn)
9441 for (
const auto &imd : *nm)
9509 mmd->setTagInfo(root->
tagInfo());
9510 mmd->setLanguage(root->
lang);
9521 for (
const auto &md : *mn)
9527 for (
const auto &imd : *mn)
9545 for (
const auto &imd : *mn)
9572 warn(root->
fileName,root->
startLine,
"found documented #define {} but ignoring it because ENABLE_PREPROCESSING is NO.", root->
name);
9586 normalizedName =
substitute(normalizedName,
"\\",
"/");
9589 if (root->
docFile==normalizedName)
9591 int lastSlashPos=normalizedName.
findRev(
'/');
9592 if (lastSlashPos!=-1)
9594 normalizedName=normalizedName.
left(lastSlashPos);
9597 if (normalizedName.
at(normalizedName.
length()-1)!=
'/')
9599 normalizedName+=
'/';
9601 DirDef *matchingDir=
nullptr;
9605 if (dir->name().right(normalizedName.
length())==normalizedName)
9610 "\\dir command matches multiple directories.\n"
9611 " Applying the command for directory {}\n"
9612 " Ignoring the command for directory {}",
9613 matchingDir->
name(),dir->name()
9618 matchingDir=dir.get();
9634 warn(root->
fileName,root->
startLine,
"No matching directory found for command \\dir {}",normalizedName);
9646 if (root->
section.isPageDoc())
9653 else if (root->
section.isMainpageDoc())
9673 if (root->
section.isMainpageDoc())
9706 else if (si->
lineNr() != -1)
9708 warn(root->
fileName,root->
startLine,
"multiple use of section label '{}' for main page, (first occurrence: {}, line {})",
9713 warn(root->
fileName,root->
startLine,
"multiple use of section label '{}' for main page, (first occurrence: {})",
9730 else if (root->
tagInfo()==
nullptr)
9733 "found more than one \\mainpage comment block! (first occurrence: {}, line {}), Skipping current block!",
9743 if (root->
section.isMainpageDoc())
9767 term(
"page defined {} with label {} is a direct "
9768 "subpage of itself! Please remove this cyclic dependency.\n",
9792 term(
"page defined {} with label {} is a subpage "
9793 "of itself! Please remove this cyclic dependency.\n",
9794 warn_line(pd->docFile(),pd->docLine()),pd->name());
9820 if (si->label().left(label.
length())==label)
9822 si->setFileName(rl->listName());
9823 si->setGenerated(
TRUE);
9829 if (!si->generated())
9833 if (!si->fileName().isEmpty() &&
9840 if (si->definition())
9847 gd = (
toMemberDef(si->definition()))->getGroupDef();
9877 if (!pd->getGroupDef() && !pd->isReference())
9879 msg(
"Generating docs for page {}...\n",pd->name());
9894 warn(root->
fileName,root->
startLine,
"Example {} was already documented. Ignoring documentation found here.",root->
name);
9922 indentStr.
fill(
' ',indent);
9924 indentStr.
isEmpty()?
"":indentStr,
9929 for (
const auto &e : root->
children())
9947 si->label(),si->fileName(),si->title(),si->type().level(),si->ref());
9961 msg(
"Generating docs for example {}...\n",pd->name());
9963 if (lang != SrcLangExt::Unknown)
9967 intf->resetCodeParserState();
9969 QCString n=pd->getOutputFileBase();
9976 if (pd->showLineNo())
9978 lineNoOptStr=
"{lineno}";
9984 (pd->briefDescription().isEmpty()?
"":pd->briefDescription()+
"\n\n")+
9985 pd->documentation()+
"\n\n\\include"+lineNoOptStr+
" "+pd->name(),
10004 if (!gd->isReference())
10016 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10022 : cdm(cdm_), ol(ol_) {}
10027 std::vector< std::future< std::shared_ptr<DocContext> > > results;
10029 for (
const auto &cd : classList)
10034 auto ctx = std::make_shared<DocContext>(cdm,*
g_outputList);
10035 auto processFile = [ctx]()
10037 if ( ( ctx->cdm->isLinkableInProject() &&
10038 !ctx->cdm->isImplicitTemplateInstance()
10041 && !ctx->cdm->isHidden() && !ctx->cdm->isEmbeddedInOuterScope()
10044 msg(
"Generating docs for compound {}...\n",ctx->cdm->displayName());
10045 ctx->cdm->writeDocumentation(ctx->ol);
10046 ctx->cdm->writeMemberList(ctx->ol);
10048 ctx->cdm->writeDocumentationForInnerClasses(ctx->ol);
10051 results.emplace_back(threadPool.
queue(processFile));
10055 for (
auto &f : results)
10057 auto ctx = f.get();
10063 for (
const auto &cd : classList)
10068 if ( ( cd->isLinkableInProject() &&
10069 !cd->isImplicitTemplateInstance()
10072 && !cd->isHidden() && !cd->isEmbeddedInOuterScope()
10075 msg(
"Generating docs for compound {}...\n",cd->displayName());
10089 for (
const auto &cd : conceptList)
10094 msg(
"Generating docs for concept {}...\n",cd->name());
10109 if (nd->isLinkableInProject())
10114 msg(
"Generating docs for namespace {}\n",nd->displayName());
10152 QCString cmd=qhgLocation+
" -v 2>&1";
10157 err(
"could not execute {}\n",qhgLocation);
10161 const size_t bufSize = 1024;
10162 char inBuf[bufSize+1];
10163 size_t numRead=fread(inBuf,1,bufSize,f);
10164 inBuf[numRead] =
'\0';
10169 static const reg::Ex versionReg(R
"(Qt (\d+)\.(\d+)\.(\d+))");
10171 std::string s = inBuf;
10178 if (qtVersion>0 && (qtVersion<60000 || qtVersion >= 60205))
10187 err(
"could not execute {}\n",qhgLocation);
10191 std::string output;
10192 while ((numRead=fread(inBuf,1,bufSize,f))>0)
10194 inBuf[numRead] =
'\0';
10226 warn_uncond(
"the dot tool could not be found as '{}'\n",dotPath);
10232 size_t l=dotPath.
length();
10233 for (
size_t i=0;
i<l;
i++)
if (dotPath.
at(
i)==
'/') dotPath.
at(
i)=
'\\';
10252 bool updateOnly=
FALSE)
10256 bool writeToStdout=configFile==
"-";
10261 if (!writeToStdout)
10265 msg(
"\n\nConfiguration file '{}' created.\n\n",configFile);
10266 msg(
"Now edit the configuration file and enter\n\n");
10267 if (configFile!=
"Doxyfile" && configFile!=
"doxyfile")
10268 msg(
" doxygen {}\n\n",configFile);
10270 msg(
" doxygen\n\n");
10271 msg(
"to generate the documentation for your project\n\n");
10275 msg(
"\n\nConfiguration file '{}' updated.\n\n",configFile);
10281 term(
"Cannot open file {} for writing\n",configFile);
10296 term(
"Cannot open stdout for writing\n");
10307 int eqPos = tagLine.
find(
'=');
10317 fileName = tagLine;
10323 err(
"Tag file '{}' does not exist or is not a file. Skipping it...\n",fileName);
10334 msg(
"Reading tag file '{}', location '{}'...\n",fileName,destName);
10338 msg(
"Reading tag file '{}'...\n",fileName);
10348 for (
const auto &sheet : latexExtraStyleSheet)
10350 std::string fileName = sheet;
10351 if (!fileName.empty())
10356 err(
"Style sheet '{}' specified by LATEX_EXTRA_STYLESHEET does not exist!\n",fileName);
10358 else if (fi.
isDir())
10360 err(
"Style sheet '{}' specified by LATEX_EXTRA_STYLESHEET is a directory, it has to be a file!\n", fileName);
10379 if (!htmlStyleSheet.
isEmpty())
10386 err(
"Style sheet '{}' specified by HTML_STYLESHEET does not exist!\n",htmlStyleSheet);
10389 else if (fi.
isDir())
10391 err(
"Style sheet '{}' specified by HTML_STYLESHEET is a directory, it has to be a file!\n",htmlStyleSheet);
10397 copyFile(htmlStyleSheet,destFileName);
10402 for (
const auto &sheet : htmlExtraStyleSheet)
10410 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET does not exist!\n",fileName);
10414 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET is already a built-in stylesheet. Please use a different name\n",fi.
fileName());
10416 else if (fi.
isDir())
10418 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET is a directory, it has to be a file!\n",fileName);
10437 err(
"Project logo '{}' specified by PROJECT_LOGO does not exist!\n",projectLogo);
10440 else if (fi.
isDir())
10442 err(
"Project logo '{}' specified by PROJECT_LOGO is a directory, it has to be a file!\n",projectLogo);
10448 copyFile(projectLogo,destFileName);
10462 err(
"Project icon '{}' specified by PROJECT_ICON does not exist!\n",projectIcon);
10465 else if (fi.
isDir())
10467 err(
"Project icon '{}' specified by PROJECT_ICON is a directory, it has to be a file!\n",projectIcon);
10473 copyFile(projectIcon,destFileName);
10481 for (
const auto &fileName : files)
10483 if (!fileName.empty())
10488 err(
"Extra file '{}' specified in {} does not exist!\n", fileName,filesOption);
10490 else if (fi.
isDir())
10492 err(
"Extra file '{}' specified in {} is a directory, it has to be a file!\n", fileName,filesOption);
10518 std::vector<FileEntry> fileEntries;
10519 for (
const auto &fd : *fn)
10521 if (!fd->isReference())
10523 fileEntries.emplace_back(fd->getPath(),fd.get());
10527 size_t size = fileEntries.size();
10531 FileDef *fd = fileEntries[0].fileDef;
10537 std::stable_sort(fileEntries.begin(),
10539 [](
const FileEntry &fe1,
const FileEntry &fe2)
10540 { return qstricmp_sort(fe1.path,fe2.path)<0; }
10545 const FileEntry &first = fileEntries[0];
10546 const FileEntry &last = fileEntries[
size-1];
10547 int first_path_size =
static_cast<int>(first.path.size())-1;
10548 int last_path_size =
static_cast<int>(last.path.size())-1;
10551 for (
i=0;
i<first_path_size &&
i<last_path_size;
i++)
10553 if (first.path[
i]==
'/') j=
i;
10554 if (first.path[
i]!=last.path[
i])
break;
10556 if (
i==first_path_size &&
i<last_path_size && last.path[
i]==
'/')
10561 else if (
i==last_path_size &&
i<first_path_size && first.path[
i]==
'/')
10568 for (
auto &fileEntry : fileEntries)
10570 QCString prefix = fileEntry.path.right(fileEntry.path.length()-j-1);
10571 fileEntry.fileDef->setName(
prefix+fn->fileName());
10573 fileEntry.fileDef->setDiskName(
prefix+fn->fileName());
10587 int sep = fileName.
findRev(
'/');
10588 int ei = fileName.
findRev(
'.');
10589 if (ei!=-1 && (sep==-1 || ei>sep))
10595 extension =
".no_extension";
10608 int ei = fileName.
findRev(
'.');
10615 extension =
".no_extension";
10619 std::string preBuf;
10626 for (
const auto &
s : includePath)
10632 msg(
"Preprocessing {}...\n",fn);
10639 msg(
"Reading {}...\n",fn);
10644 std::string convBuf;
10645 convBuf.reserve(preBuf.size()+1024);
10650 std::shared_ptr<Entry> fileRoot = std::make_shared<Entry>();
10654 if (newTU) clangParser->
parse();
10657 parser.
parseInput(fileName,convBuf.
data(),fileRoot,clangParser);
10658 fileRoot->setFileDef(fd);
10675 filesToProcess.insert(
s);
10678 std::mutex processedFilesLock;
10680 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10681 msg(
"Processing input using {} threads.\n",numThreads);
10683 using FutureType = std::vector< std::shared_ptr<Entry> >;
10684 std::vector< std::future< FutureType > > results;
10687 bool ambig =
false;
10693 auto processFile = [
s,&filesToProcess,&processedFilesLock,&processedFiles]() {
10694 bool ambig_l =
false;
10695 std::vector< std::shared_ptr<Entry> > roots;
10699 auto fileRoot {
parseFile(*parser.get(),fd_l,
s.c_str(),clangParser.get(),
true) };
10700 roots.push_back(fileRoot);
10704 for (
auto incFile : clangParser->filesInSameTU())
10706 if (filesToProcess.find(incFile)!=filesToProcess.end())
10708 bool needsToBeProcessed =
false;
10710 std::lock_guard<std::mutex> lock(processedFilesLock);
10711 needsToBeProcessed = processedFiles.find(incFile)==processedFiles.end();
10712 if (needsToBeProcessed) processedFiles.insert(incFile);
10714 if (incFile!=
s && needsToBeProcessed)
10720 fileRoot =
parseFile(*parser.get(),ifd,incFile.c_str(),clangParser.get(),
false);
10721 roots.push_back(fileRoot);
10729 results.emplace_back(threadPool.
queue(processFile));
10733 for (
auto &f : results)
10738 root->moveToSubEntryAndKeep(e);
10745 if (processedFiles.find(
s)==processedFiles.end())
10748 auto processFile = [
s]() {
10749 bool ambig =
false;
10750 std::vector< std::shared_ptr<Entry> > roots;
10757 auto fileRoot =
parseFile(*parser.get(),fd,
s.c_str(),clangParser.get(),
true);
10758 roots.push_back(fileRoot);
10762 auto fileRoot =
parseFile(*parser.get(),fd,
s.c_str(),
nullptr,
true);
10763 roots.push_back(fileRoot);
10767 results.emplace_back(threadPool.
queue(processFile));
10771 for (
auto &f : results)
10776 root->moveToSubEntryAndKeep(e);
10783 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10784 msg(
"Processing input using {} threads.\n",numThreads);
10786 using FutureType = std::shared_ptr<Entry>;
10787 std::vector< std::future< FutureType > > results;
10791 auto processFile = [
s]() {
10792 bool ambig =
false;
10795 auto fileRoot =
parseFile(*parser.get(),fd,
s.c_str(),
nullptr,
true);
10799 results.emplace_back(threadPool.
queue(processFile));
10802 for (
auto &f : results)
10804 root->moveToSubEntryAndKeep(f.get());
10822 filesToProcess.insert(
s);
10828 bool ambig =
false;
10835 auto fileRoot =
parseFile(*parser.get(),fd,
s.c_str(),clangParser.get(),
true);
10836 root->moveToSubEntryAndKeep(fileRoot);
10837 processedFiles.insert(
s);
10841 for (
auto incFile : clangParser->filesInSameTU())
10844 if (filesToProcess.find(incFile)!=filesToProcess.end() &&
10845 processedFiles.find(incFile)==processedFiles.end())
10851 fileRoot =
parseFile(*parser.get(),ifd,incFile.c_str(),clangParser.get(),
false);
10852 root->moveToSubEntryAndKeep(fileRoot);
10853 processedFiles.insert(incFile);
10862 if (processedFiles.find(
s)==processedFiles.end())
10864 bool ambig =
false;
10870 auto fileRoot =
parseFile(*parser.get(),fd,
s.c_str(),clangParser.get(),
true);
10871 root->moveToSubEntryAndKeep(fileRoot);
10875 std::unique_ptr<OutlineParserInterface> parser {
getParserForFile(
s.c_str()) };
10876 std::shared_ptr<Entry> fileRoot =
parseFile(*parser.get(),fd,
s.c_str(),
nullptr,
true);
10877 root->moveToSubEntryAndKeep(fileRoot);
10879 processedFiles.insert(
s);
10888 bool ambig =
false;
10891 std::unique_ptr<OutlineParserInterface> parser {
getParserForFile(
s.c_str()) };
10892 std::shared_ptr<Entry> fileRoot =
parseFile(*parser.get(),fd,
s.c_str(),
nullptr,
true);
10893 root->moveToSubEntryAndKeep(std::move(fileRoot));
10913 sepPos = result.
find(
'/',2);
10915 sepPos = result.
find(
'/',sepPos+1);
10917 sepPos = result.
find(
'/',sepPos+1);
10920 if (nonSymlinks.find(
prefix.str())==nonSymlinks.end())
10937 target+=result.
mid(sepPos);
10940 if (known.find(result.
str())!=known.end())
return std::string();
10941 known.insert(result.
str());
10954 nonSymlinks.insert(
prefix.str());
10960 while (sepPos!=-1);
10979 bool errorIfNotExist,
10986 if (paths && !dirName.empty())
10988 paths->insert(dirName);
10994 if (dirName.empty())
11009 msg(
"Searching for files in directory {}\n", fi->
absFilePath());
11014 for (
const auto &dirEntry : dir.
iterator())
11017 if (exclSet==
nullptr || exclSet->find(cfi.
absFilePath())==exclSet->end())
11025 if (errorIfNotExist)
11030 else if (cfi.
isFile() &&
11032 (exclPatList==
nullptr || !
patternMatch(cfi,*exclPatList)) &&
11033 (killSet==
nullptr || killSet->find(cfi.
absFilePath())==killSet->end())
11037 std::string path=cfi.
dirPath()+
"/";
11038 std::string fullName=path+name;
11046 fn->push_back(std::move(fd));
11049 dirResultList.push_back(fullName);
11050 if (resultSet) resultSet->insert(fullName);
11051 if (killSet) killSet->insert(fullName);
11053 else if (recursive &&
11055 (exclPatList==
nullptr || !
patternMatch(cfi,*exclPatList)) &&
11060 patList,exclPatList,&dirResultList,resultSet,errorIfNotExist,
11061 recursive,killSet,paths);
11065 if (resultList && !dirResultList.empty())
11068 std::stable_sort(dirResultList.begin(),
11069 dirResultList.end(),
11070 [](
const auto &f1,
const auto &f2) { return qstricmp_sort(f1.c_str(),f2.c_str())<0; });
11073 resultList->insert(resultList->end(), dirResultList.begin(), dirResultList.end());
11090 bool errorIfNotExist,
11097 if (
s.isEmpty())
return;
11104 if (exclSet==
nullptr || exclSet->find(fi.
absFilePath())==exclSet->end())
11111 if (errorIfNotExist)
11113 warn_uncond(
"source '{}' is not a readable file or directory... skipping.\n",
s);
11118 std::string dirPath = fi.
dirPath(
true);
11120 if (paths && !dirPath.empty())
11122 paths->insert(dirPath);
11125 if (killSet==
nullptr || killSet->find(filePath)==killSet->end())
11134 fn->push_back(std::move(fd));
11137 if (resultList || resultSet)
11139 if (resultList) resultList->push_back(filePath);
11140 if (resultSet) resultSet->insert(filePath);
11146 else if (fi.
isDir())
11148 readDir(&fi,fnMap,exclSet,patList,
11149 exclPatList,resultList,resultSet,errorIfNotExist,
11150 recursive,killSet,paths);
11164 anchor=
":"+md->
anchor();
11173 t <<
"REPLACE INTO symbols (symbol_id,scope_id,name,file,line) VALUES('"
11174 << fn+anchor <<
"','"
11176 << d->
name() <<
"','"
11190 for (
const auto &def : symList)
11202 msg(
"Developer parameters:\n");
11203 msg(
" -m dump symbol map\n");
11204 msg(
" -b making messages output unbuffered\n");
11205 msg(
" -c <file> process input file as a comment block and produce HTML output\n");
11207 msg(
" -t [<file|stdout|stderr>] trace debug info to file, stdout, or stderr (default file stdout)\n");
11208 msg(
" -t_time [<file|stdout|stderr>] trace debug info to file, stdout, or stderr (default file stdout),\n"
11209 " and include time and thread information\n");
11211 msg(
" -d <level> enable a debug level, such as (multiple invocations of -d are possible):\n");
11222 QCString versionString = getFullVersion();
11223 msg(
"{}\n",versionString);
11227 if (!extVers.
isEmpty()) extVers+=
", ";
11228 extVers +=
"sqlite3 ";
11229 extVers += sqlite3_libversion();
11231 if (!extVers.
isEmpty()) extVers+=
", ";
11232 extVers +=
"clang support ";
11233 extVers += CLANG_VERSION_STRING;
11237 int lastComma = extVers.
findRev(
',');
11238 if (lastComma != -1) extVers = extVers.
replace(lastComma,1,
" and");
11239 msg(
" with {}.\n",extVers);
11250 msg(
"Doxygen version {0}\nCopyright Dimitri van Heesch 1997-2025\n\n"
11251 "You can use Doxygen in a number of ways:\n\n"
11252 "1) Use Doxygen to generate a template configuration file*:\n"
11253 " {1} [-s] -g [configName]\n\n"
11254 "2) Use Doxygen to update an old configuration file*:\n"
11255 " {1} [-s] -u [configName]\n\n"
11256 "3) Use Doxygen to generate documentation using an existing "
11257 "configuration file*:\n"
11258 " {1} [configName]\n\n"
11259 "4) Use Doxygen to generate a template file controlling the layout of the\n"
11260 " generated documentation:\n"
11261 " {1} -l [layoutFileName]\n\n"
11262 " In case layoutFileName is omitted DoxygenLayout.xml will be used as filename.\n"
11263 " If - is used for layoutFileName Doxygen will write to standard output.\n\n"
11264 "5) Use Doxygen to generate a template style sheet file for RTF, HTML or Latex.\n"
11265 " RTF: {1} -w rtf styleSheetFile\n"
11266 " HTML: {1}-w html headerFile footerFile styleSheetFile [configFile]\n"
11267 " LaTeX: {1} -w latex headerFile footerFile styleSheetFile [configFile]\n\n"
11268 "6) Use Doxygen to generate a rtf extensions file\n"
11269 " {1} -e rtf extensionsFile\n\n"
11270 " If - is used for extensionsFile Doxygen will write to standard output.\n\n"
11271 "7) Use Doxygen to compare the used configuration file with the template configuration file\n"
11272 " {1} -x [configFile]\n\n"
11273 " Use Doxygen to compare the used configuration file with the template configuration file\n"
11274 " without replacing the environment variables or CMake type replacement variables\n"
11275 " {1} -x_noenv [configFile]\n\n"
11276 "8) Use Doxygen to show a list of built-in emojis.\n"
11277 " {1} -f emoji outputFileName\n\n"
11278 " If - is used for outputFileName Doxygen will write to standard output.\n\n"
11279 "*) If -s is specified the comments of the configuration items in the config file will be omitted.\n"
11280 " If configName is omitted 'Doxyfile' will be used as a default.\n"
11281 " If - is used for configFile Doxygen will write / read the configuration to /from standard output / input.\n\n"
11282 "If -q is used for a Doxygen documentation run, Doxygen will see this as if QUIET=YES has been set.\n\n"
11283 "-v print version string, -V print extended version information\n"
11284 "-h,-? prints usage help information\n"
11285 "{1} -d prints additional usage flags for debugging purposes\n",versionString,name);
11292static const char *
getArg(
int argc,
char **argv,
int &optInd)
11295 if (
qstrlen(&argv[optInd][2])>0)
11296 s=&argv[optInd][2];
11297 else if (optInd+1<argc && argv[optInd+1][0]!=
'-')
11316 return []() {
return std::make_unique<T>(); };
11324 std::setlocale(LC_ALL,
"");
11325 std::setlocale(LC_CTYPE,
"C");
11326 std::setlocale(LC_NUMERIC,
"C");
11425 while (v!=0) v>>=1,r++;
11429 return std::max(0,std::min(r-16,9));
11434 QCString versionString = getFullVersion();
11437 auto writeFile = [](
const char *fileName,std::function<void(
TextStream&)> func) ->
bool
11457 bool genConfig=
false;
11458 bool shortList=
false;
11459 bool traceTiming=
false;
11461 bool updateConfig=
false;
11462 bool quiet =
false;
11463 while (optInd<argc && argv[optInd][0]==
'-' &&
11464 (isalpha(argv[optInd][1]) || argv[optInd][1]==
'?' ||
11465 argv[optInd][1]==
'-')
11468 switch(argv[optInd][1])
11478 if (optInd+1>=argc)
11480 layoutName=
"DoxygenLayout.xml";
11484 layoutName=argv[optInd+1];
11492 if (optInd+1>=argc)
11494 msg(
"option \"-c\" is missing the file name to read\n");
11519 msg(
"option \"-d\" has unknown debug specifier: \"{}\".\n",debugLabel);
11529 if (!strcmp(argv[optInd]+1,
"t_time"))
11531 traceTiming =
true;
11533 else if (!strcmp(argv[optInd]+1,
"t"))
11535 traceTiming =
false;
11539 err(
"option should be \"-t\" or \"-t_time\", found: \"{}\".\n",argv[optInd]);
11543 if (optInd+1>=argc || argv[optInd+1][0] ==
'-')
11545 traceName=
"stdout";
11549 traceName=argv[optInd+1];
11553 err(
"support for option \"-t\" has not been compiled in (use a debug build or a release build with tracing enabled).\n");
11564 err(
"option should be \"-x\" or \"-x_noenv\", found: \"{}\".\n",argv[optInd]);
11580 err(
"option \"-e\" is missing format specifier rtf.\n");
11586 if (optInd+1>=argc)
11588 err(
"option \"-e rtf\" is missing an extensions file name\n");
11596 err(
"option \"-e\" has invalid format specifier.\n");
11606 err(
"option \"-f\" is missing list specifier.\n");
11612 if (optInd+1>=argc)
11614 err(
"option \"-f emoji\" is missing an output file name\n");
11622 err(
"option \"-f\" has invalid list specifier.\n");
11632 err(
"option \"-w\" is missing format specifier rtf, html or latex\n");
11638 if (optInd+1>=argc)
11640 err(
"option \"-w rtf\" is missing a style sheet file name\n");
11646 err(
"error opening RTF style sheet file {}!\n",argv[optInd+1]);
11656 if (optInd+4<argc ||
FileInfo(
"Doxyfile").exists() ||
FileInfo(
"doxyfile").exists())
11662 err(
"error opening or reading configuration file {}!\n",argv[optInd+4]);
11667 if (optInd+3>=argc)
11669 err(
"option \"-w html\" does not have enough arguments\n");
11686 if (optInd+4<argc ||
FileInfo(
"Doxyfile").exists() ||
FileInfo(
"doxyfile").exists())
11691 err(
"error opening or reading configuration file {}!\n",argv[optInd+4]);
11696 if (optInd+3>=argc)
11698 err(
"option \"-w latex\" does not have enough arguments\n");
11714 err(
"Illegal format specifier \"{}\": should be one of rtf, html or latex\n",formatName);
11734 if (
qstrcmp(&argv[optInd][2],
"help")==0)
11736 usage(argv[0],versionString);
11739 else if (
qstrcmp(&argv[optInd][2],
"version")==0)
11745 else if ((
qstrcmp(&argv[optInd][2],
"Version")==0) ||
11746 (
qstrcmp(&argv[optInd][2],
"VERSION")==0))
11754 err(
"Unknown option \"-{}\"\n",&argv[optInd][1]);
11755 usage(argv[0],versionString);
11760 setvbuf(stdout,
nullptr,_IONBF,0);
11767 usage(argv[0],versionString);
11771 err(
"Unknown option \"-{:c}\"\n",argv[optInd][1]);
11772 usage(argv[0],versionString);
11783 TRACE(
"Doxygen version used: {}",getFullVersion());
11786 FileInfo configFileInfo1(
"Doxyfile"),configFileInfo2(
"doxyfile");
11789 if (configFileInfo1.exists())
11791 configName=
"Doxyfile";
11793 else if (configFileInfo2.
exists())
11795 configName=
"doxyfile";
11797 else if (genConfig)
11799 configName=
"Doxyfile";
11803 err(
"Doxyfile not found and no input file specified!\n");
11804 usage(argv[0],versionString);
11811 if (fi.
exists() ||
qstrcmp(argv[optInd],
"-")==0 || genConfig)
11813 configName=argv[optInd];
11817 err(
"configuration file {} not found!\n",argv[optInd]);
11818 usage(argv[0],versionString);
11832 err(
"could not open or read configuration file {}!\n",configName);
11903 for (
const auto &mapping : extMaps)
11905 QCString mapStr = mapping.c_str();
11906 int i=mapStr.
find(
'=');
11922 err(
"Failed to map file extension '{}' to unsupported language '{}'.\n"
11923 "Check the EXTENSION_MAPPING setting in the config file.\n",
11928 msg(
"Adding custom extension mapping: '{}' will be treated as language '{}'\n",
11937 if (cd==
reinterpret_cast<void *
>(-1))
11939 term(
"unsupported character conversion: '{}'->'UTF-8': {}\n"
11940 "Check the 'INPUT_ENCODING' setting in the config file!\n",
11950 for (
const auto &mapping : fileEncod)
11952 QCString mapStr = mapping.c_str();
11953 int i=mapStr.
find(
'=');
11967 if (cd==
reinterpret_cast<void *
>(-1))
11969 term(
"unsupported character conversion: '{}'->'UTF-8': {}\n"
11970 "Check the 'INPUT_FILE_ENCODING' setting in the config file!\n",
11971 encoding,strerror(errno));
11984 for (
const auto &
s : expandAsDefinedList)
12002 signal(SIGINT,SIG_DFL);
12004 msg(
"Cleaning up...\n");
12019 if (generateTagFile.
isEmpty())
return;
12024 err(
"cannot open tag file {} for writing\n", generateTagFile);
12028 tagFile <<
"<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>\n";
12029 tagFile <<
"<tagfile doxygen_version=\"" << getDoxygenVersion() <<
"\"";
12030 std::string gitVersion = getGitVersion();
12031 if (!gitVersion.empty())
12033 tagFile <<
" doxygen_gitid=\"" << gitVersion <<
"\"";
12040 for (
const auto &fd : *fn)
12042 if (fd->isLinkableInProject()) fd->writeTagFile(tagFile);
12075 if (gd->isLinkableInProject()) gd->writeTagFile(tagFile);
12080 if (mod->isLinkableInProject()) mod->writeTagFile(tagFile);
12085 if (pd->isLinkableInProject()) pd->writeTagFile(tagFile);
12090 if (dd->isLinkableInProject()) dd->writeTagFile(tagFile);
12094 tagFile <<
"</tagfile>\n";
12102 msg(
"Exiting...\n");
12112 const char *defaultDirName)
12117 result = baseDirName + defaultDirName;
12119 else if (formatDirName[0]!=
'/' && (formatDirName.
length()==1 || formatDirName[1]!=
':'))
12121 result.
prepend(baseDirName+
"/");
12123 Dir formatDir(result.
str());
12126 term(
"Could not create output directory {}\n", result);
12140 g_s.begin(
"Searching for include files...\n");
12143 for (
const auto &
s : includePathList)
12161 g_s.begin(
"Searching for example files...\n");
12164 for (
const auto &
s : examplePathList)
12179 g_s.begin(
"Searching for images...\n");
12182 for (
const auto &
s : imagePathList)
12197 g_s.begin(
"Searching for dot files...\n");
12200 for (
const auto &
s : dotFileList)
12215 g_s.begin(
"Searching for msc files...\n");
12218 for (
const auto &
s : mscFileList)
12233 g_s.begin(
"Searching for dia files...\n");
12236 for (
const auto &
s : diaFileList)
12251 g_s.begin(
"Searching for plantuml files...\n");
12254 for (
const auto &
s : plantUmlFileList)
12269 g_s.begin(
"Searching for files to exclude\n");
12271 for (
const auto &
s : excludeList)
12289 g_s.begin(
"Searching INPUT for files to process...\n");
12293 for (
const auto &
s : inputList)
12296 size_t l = path.
length();
12300 if (path.
at(l-1)==
'\\' || path.
at(l-1)==
'/') path=path.
left(l-1);
12320 [](
const auto &f1,
const auto &f2)
12326 if (fileName->size()>1)
12328 std::stable_sort(fileName->begin(),fileName->end(),[](
const auto &f1,
const auto &f2)
12330 return qstricmp_sort(f1->absFilePath(),f2->absFilePath())<0;
12336 warn_uncond(
"No files to be processed, please check your settings, in particular INPUT, FILE_PATTERNS, and RECURSIVE\n");
12347 if (mdfileAsMainPage.
isEmpty())
return;
12351 warn_uncond(
"Specified markdown mainpage '{}' does not exist\n",mdfileAsMainPage);
12354 bool ambig =
false;
12357 warn_uncond(
"Specified markdown mainpage '{}' has not been defined as input file\n",mdfileAsMainPage);
12376 QCString versionString = getFullVersion();
12377 msg(
"Doxygen version used: {}\n",versionString);
12387 if (outputDirectory.
isEmpty())
12393 Dir dir(outputDirectory.
str());
12397 if (!dir.
mkdir(outputDirectory.
str()))
12399 term(
"tag OUTPUT_DIRECTORY: Output directory '{}' does not "
12400 "exist and cannot be created\n",outputDirectory);
12404 msg(
"Notice: Output directory '{}' does not exist. "
12405 "I have created it for you.\n", outputDirectory);
12420 if (cacheSize<0) cacheSize=0;
12421 if (cacheSize>9) cacheSize=9;
12422 uint32_t lookupSize = 65536 << cacheSize;
12461 bool generateSitemap = !sitemapUrl.
isEmpty();
12462 if (generateSitemap && !sitemapUrl.
endsWith(
"/"))
12469 bool generateEclipseHelp =
Config_getBool(GENERATE_ECLIPSEHELP);
12483 if (generateDocbook)
12530 newFontPath+=curFontPath;
12546 bool defaultLayoutUsed =
FALSE;
12547 if (layoutFileName.
isEmpty())
12550 defaultLayoutUsed =
TRUE;
12552 AUTO_TRACE_ADD(
"defaultLayoutUsed={}, layoutFileName={}",defaultLayoutUsed,layoutFileName);
12557 msg(
"Parsing layout file {}...\n",layoutFileName);
12560 else if (!defaultLayoutUsed)
12562 warn_uncond(
"failed to open layout file '{}' for reading! Using default settings.\n",layoutFileName);
12572 if (generateHtml) exclPatterns.push_back(htmlOutput.
str());
12573 if (generateDocbook) exclPatterns.push_back(docbookOutput.
str());
12574 if (generateXml) exclPatterns.push_back(xmlOutput.
str());
12575 if (generateLatex) exclPatterns.push_back(latexOutput.
str());
12576 if (generateRtf) exclPatterns.push_back(rtfOutput.
str());
12577 if (generateMan) exclPatterns.push_back(manOutput.
str());
12597 if (generateDocbook)
12608 std::shared_ptr<Entry> root = std::make_shared<Entry>();
12612 msg(
"Reading and parsing tag files\n");
12614 for (
const auto &
s : tagFileList)
12626 g_s.begin(
"Parsing files\n");
12666 g_s.begin(
"Building macro definition list...\n");
12670 g_s.begin(
"Building group list...\n");
12675 g_s.begin(
"Building directory list...\n");
12680 g_s.begin(
"Building namespace list...\n");
12685 g_s.begin(
"Building file list...\n");
12689 g_s.begin(
"Building class list...\n");
12693 g_s.begin(
"Building concept list...\n");
12701 g_s.begin(
"Computing nesting relations for classes...\n");
12714 g_s.begin(
"Associating documentation with classes...\n");
12718 g_s.begin(
"Associating documentation with concepts...\n");
12723 g_s.begin(
"Associating documentation with modules...\n");
12727 g_s.begin(
"Building example list...\n");
12731 g_s.begin(
"Searching for enumerations...\n");
12739 g_s.begin(
"Searching for documented typedefs...\n");
12745 g_s.begin(
"Searching for documented sequences...\n");
12749 g_s.begin(
"Searching for documented dictionaries...\n");
12754 g_s.begin(
"Searching for members imported via using declarations...\n");
12761 g_s.begin(
"Searching for included using directives...\n");
12765 g_s.begin(
"Searching for documented variables...\n");
12769 g_s.begin(
"Building interface member list...\n");
12772 g_s.begin(
"Building member list...\n");
12776 g_s.begin(
"Searching for friends...\n");
12780 g_s.begin(
"Searching for documented defines...\n");
12784 g_s.begin(
"Computing class inheritance relations...\n");
12789 g_s.begin(
"Computing class usage relations...\n");
12795 g_s.begin(
"Searching for tag less structs...\n");
12800 g_s.begin(
"Flushing cached template relations that have become invalid...\n");
12804 g_s.begin(
"Warn for undocumented namespaces...\n");
12808 g_s.begin(
"Computing class relations...\n");
12819 g_s.begin(
"Add enum values to enums...\n");
12824 g_s.begin(
"Searching for member function documentation...\n");
12836 g_s.begin(
"Creating members for template instances...\n");
12840 g_s.begin(
"Building page list...\n");
12844 g_s.begin(
"Search for main page...\n");
12849 g_s.begin(
"Computing page relations...\n");
12854 g_s.begin(
"Determining the scope of groups...\n");
12858 g_s.begin(
"Computing module relations...\n");
12860 mm.resolvePartitions();
12861 mm.resolveImports();
12862 mm.collectExportedSymbols();
12895 g_s.begin(
"Sorting lists...\n");
12916 g_s.begin(
"Determining which enums are documented\n");
12920 g_s.begin(
"Computing member relations...\n");
12925 g_s.begin(
"Building full member lists recursively...\n");
12929 g_s.begin(
"Adding members to member groups.\n");
12935 g_s.begin(
"Distributing member group documentation.\n");
12940 g_s.begin(
"Computing member references...\n");
12946 g_s.begin(
"Inheriting documentation...\n");
12954 g_s.begin(
"Generating disk names...\n");
12958 g_s.begin(
"Adding source references...\n");
12962 g_s.begin(
"Adding xrefitems...\n");
12967 g_s.begin(
"Sorting member lists...\n");
12971 g_s.begin(
"Setting anonymous enum type...\n");
12975 g_s.begin(
"Computing dependencies between directories...\n");
12979 g_s.begin(
"Generating citations page...\n");
12983 g_s.begin(
"Counting members...\n");
12987 g_s.begin(
"Counting data structures...\n");
12991 g_s.begin(
"Resolving user defined references...\n");
12995 g_s.begin(
"Finding anchors and sections in the documentation...\n");
12999 g_s.begin(
"Transferring function references...\n");
13003 g_s.begin(
"Combining using relations...\n");
13008 g_s.begin(
"Adding members to index pages...\n");
13013 g_s.begin(
"Correcting members for VHDL...\n");
13017 g_s.begin(
"Computing tooltip texts...\n");
13025 [](
const auto &g1,
const auto &g2)
13026 {
return g1->groupTitle() < g2->groupTitle(); });
13030 gd->sortSubGroups();
13074 if (generateDocbook)
13094 err(
"USE_HTAGS is YES but htags(1) failed. \n");
13096 err(
"htags(1) ended normally but failed to load the filemap. \n");
13103 g_s.begin(
"Generating style sheet...\n");
13111 g_s.begin(
"Generating search indices...\n");
13112 if (searchEngine && !serverBasedSearch && generateHtml)
13120 if (generateHtml && searchEngine)
13123 Dir searchDir(searchDirName.
str());
13124 if (!searchDir.
exists() && !searchDir.
mkdir(searchDirName.
str()))
13126 term(
"Could not create search results directory '{}' $PWD='{}'\n",
13130 if (!serverBasedSearch)
13152 if (generateDocbook)
13168 g_s.begin(
"Generating images for formulas in HTML...\n");
13175 g_s.begin(
"Generating images for formulas in RTF...\n");
13182 g_s.begin(
"Generating images for formulas in Docbook...\n");
13187 g_s.begin(
"Generating example documentation...\n");
13191 g_s.begin(
"Generating file sources...\n");
13195 g_s.begin(
"Generating file documentation...\n");
13199 g_s.begin(
"Generating page documentation...\n");
13203 g_s.begin(
"Generating group documentation...\n");
13207 g_s.begin(
"Generating class documentation...\n");
13211 g_s.begin(
"Generating concept documentation...\n");
13215 g_s.begin(
"Generating module documentation...\n");
13219 g_s.begin(
"Generating namespace documentation...\n");
13225 g_s.begin(
"Generating graph info page...\n");
13230 g_s.begin(
"Generating directory documentation...\n");
13239 g_s.begin(
"finalizing index lists...\n");
13243 g_s.begin(
"writing tag file...\n");
13249 g_s.begin(
"Generating XML output...\n");
13257 g_s.begin(
"Generating SQLITE3 output...\n");
13264 g_s.begin(
"Generating AutoGen DEF output...\n");
13270 g_s.begin(
"Generating Perl module output...\n");
13274 if (generateHtml && searchEngine && serverBasedSearch)
13276 g_s.begin(
"Generating search index\n");
13286 if (searchDataFile.
isEmpty())
13288 searchDataFile=
"searchdata.xml";
13301 g_s.begin(
"Combining RTF output...\n");
13304 err(
"An error occurred during post-processing the RTF files!\n");
13309 g_s.begin(
"Running plantuml with JAVA...\n");
13315 g_s.begin(
"Running dot...\n");
13320 if (generateHtml &&
13324 g_s.begin(
"Running html help compiler...\n");
13329 if ( generateHtml &&
13333 g_s.begin(
"Running qhelpgenerator...\n");
13340 msg(
"type lookup cache used {}/{} hits={} misses={}\n",
13345 msg(
"symbol lookup cache used {}/{} hits={} misses={}\n",
13352 int cacheParam = std::max(typeCacheParam,symbolCacheParam);
13355 msg(
"Note: based on cache misses the ideal setting for LOOKUP_CACHE_SIZE is {} at the cost of higher memory usage.\n",cacheParam);
13361 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
13362 if (numThreads<1) numThreads=1;
13363 msg(
"Total elapsed time: {:.6f} seconds\n(of which an average of {:.6f} seconds per thread waiting for external tools to finish)\n",
13370 msg(
"finished...\n");
13375 msg(
"finished...\n");
std::vector< ArgumentList > ArgumentLists
This class represents an function or template argument list.
RefQualifierType refQualifier() const
bool noParameters() const
bool pureSpecifier() const
void setTrailingReturnType(const QCString &s)
bool hasParameters() const
QCString trailingReturnType() const
void setPureSpecifier(bool b)
bool constSpecifier() const
void push_back(const Argument &a)
void setConstSpecifier(bool b)
void setRefQualifier(RefQualifierType t)
void setIsDeleted(bool b)
bool volatileSpecifier() const
void setNoParameters(bool b)
void setVolatileSpecifier(bool b)
static CitationManager & instance()
void clear()
clears the database
void generatePage()
Generate the citations page.
std::unique_ptr< ClangTUParser > createTUParser(const FileDef *fd) const
static ClangParser * instance()
Returns the one and only instance of the class.
Clang parser object for a single translation unit, which consists of a source file and the directly o...
void switchToFile(const FileDef *fd)
Switches to another file within the translation unit started with start().
void parse()
Parse the file given at construction time as a translation unit This file should already be preproces...
A abstract class representing of a compound symbol.
virtual const ArgumentList & templateArguments() const =0
Returns the template arguments of this class.
virtual QCString compoundTypeString() const =0
Returns the type of compound as a string.
virtual void writeDocumentation(OutputList &ol) const =0
virtual void writeMemberList(OutputList &ol) const =0
virtual bool isTemplate() const =0
Returns TRUE if this class is a template.
virtual const BaseClassList & baseClasses() const =0
Returns the list of base classes from which this class directly inherits.
virtual const MemberDef * getMemberByName(const QCString &) const =0
Returns the member with the given name.
virtual const TemplateInstanceList & getTemplateInstances() const =0
Returns a sorted dictionary with all template instances found for this template class.
virtual int isBaseClass(const ClassDef *bcd, bool followInstances, const QCString &templSpec=QCString()) const =0
Returns TRUE iff bcd is a direct or indirect base class of this class.
virtual ArgumentLists getTemplateParameterLists() const =0
Returns the template parameter lists that form the template declaration of this class.
virtual Protection protection() const =0
Return the protection level (Public,Protected,Private) in which this compound was found.
virtual MemberList * getMemberList(MemberListType lt) const =0
Returns the members in the list identified by lt.
virtual bool isForwardDeclared() const =0
Returns TRUE if this class represents a forward declaration of a template class.
virtual bool isSubClass(ClassDef *bcd, int level=0) const =0
Returns TRUE iff bcd is a direct or indirect sub class of this class.
virtual void moveTo(Definition *)=0
virtual const TemplateNameMap & getTemplateBaseClassNames() const =0
virtual bool isEmbeddedInOuterScope() const =0
virtual const MemberNameInfoLinkedMap & memberNameInfoLinkedMap() const =0
Returns a dictionary of all members.
virtual bool isImplicitTemplateInstance() const =0
virtual QCString qualifiedNameWithTemplateParameters(const ArgumentLists *actualParams=nullptr, uint32_t *actualParamIndex=nullptr) const =0
virtual std::unique_ptr< ClassDef > deepCopy(const QCString &name) const =0
virtual const ClassDef * templateMaster() const =0
Returns the template master of which this class is an instance.
CompoundType
The various compound types.
virtual CompoundType compoundType() const =0
Returns the type of compound this is, i.e.
virtual bool containsOverload(const MemberDef *md) const =0
virtual ClassLinkedRefMap getClasses() const =0
returns the classes nested into this class
virtual FileDef * getFileDef() const =0
Returns the namespace this compound is in, or 0 if it has a global scope.
virtual QCString requiresClause() const =0
virtual void writeTagFile(TextStream &) const =0
virtual void writeDocumentationForInnerClasses(OutputList &ol) const =0
virtual void computeAnchors()=0
virtual void addTypeConstraints()=0
virtual void overrideCollaborationGraph(bool e)=0
virtual void setClassName(const QCString &name)=0
virtual void countMembers()=0
virtual void addMembersToMemberGroup()=0
virtual void makeTemplateArgument(bool b=TRUE)=0
virtual void setTemplateBaseClassNames(const TemplateNameMap &templateNames)=0
virtual void insertExplicitTemplateInstance(ClassDef *instance, const QCString &spec)=0
virtual void setMetaData(const QCString &md)=0
virtual void setFileDef(FileDef *fd)=0
virtual void addUsedClass(ClassDef *cd, const QCString &accessName, Protection prot)=0
virtual void reclassifyMember(MemberDefMutable *md, MemberType t)=0
virtual ClassDef * insertTemplateInstance(const QCString &fileName, int startLine, int startColumn, const QCString &templSpec, bool &freshInstance)=0
virtual void insertBaseClass(ClassDef *, const QCString &name, Protection p, Specifier s, const QCString &t=QCString())=0
virtual void setTemplateArguments(const ArgumentList &al)=0
virtual void setTemplateMaster(const ClassDef *tm)=0
virtual void mergeCategory(ClassDef *category)=0
virtual void addQualifiers(const StringVector &qualifiers)=0
virtual void setClassSpecifier(TypeSpecifier spec)=0
virtual void addListReferences()=0
virtual void insertSubClass(ClassDef *, Protection p, Specifier s, const QCString &t=QCString())=0
virtual void insertUsedFile(const FileDef *)=0
virtual void setRequiresClause(const QCString &req)=0
virtual void setTagLessReference(const ClassDef *cd)=0
virtual void setUsedOnly(bool b)=0
virtual void sortMemberLists()=0
virtual void setProtection(Protection p)=0
virtual void setTypeConstraints(const ArgumentList &al)=0
virtual void overrideInheritanceGraph(CLASS_GRAPH_t e)=0
virtual void setAnonymousEnumType()=0
virtual void setCompoundType(CompoundType t)=0
virtual void distributeMemberGroupDocumentation()=0
virtual void findSectionsInDocumentation()=0
virtual void addUsedByClass(ClassDef *cd, const QCString &accessName, Protection prot)=0
virtual void insertMember(MemberDef *)=0
virtual void sortAllMembersList()=0
virtual void addMembersToTemplateInstance(const ClassDef *cd, const ArgumentList &templateArguments, const QCString &templSpec)=0
virtual void mergeMembers()=0
virtual void setIsStatic(bool b)=0
virtual void setSubGrouping(bool enabled)=0
virtual void setFileDef(FileDef *fd)=0
virtual void writeTagFile(TextStream &)=0
virtual void setInitializer(const QCString &init)=0
virtual void writeDocumentation(OutputList &ol)=0
virtual void setGroupId(int id)=0
virtual void findSectionsInDocumentation()=0
virtual void setTemplateArguments(const ArgumentList &al)=0
static void clearFlag(const DebugMask mask)
static bool isFlagSet(const DebugMask mask)
static void print(DebugMask mask, int prio, fmt::format_string< Args... > fmt, Args &&... args)
static double elapsedTime()
static bool setFlagStr(const QCString &label)
static void setFlag(const DebugMask mask)
The common base class of all entity definitions found in the sources.
virtual QCString docFile() const =0
virtual const QCString & localName() const =0
virtual int getEndBodyLine() const =0
virtual SrcLangExt getLanguage() const =0
Returns the programming language this definition was written in.
virtual int docLine() const =0
virtual QCString getDefFileName() const =0
virtual bool isLinkable() const =0
virtual int getDefLine() const =0
virtual DefType definitionType() const =0
virtual QCString anchor() const =0
virtual int inbodyLine() const =0
virtual const FileDef * getBodyDef() const =0
virtual int briefLine() const =0
virtual bool hasDocumentation() const =0
virtual bool isLinkableInProject() const =0
virtual QCString briefDescription(bool abbreviate=FALSE) const =0
virtual bool isAnonymous() const =0
virtual bool isHidden() const =0
virtual const Definition * findInnerCompound(const QCString &name) const =0
virtual int getStartDefLine() const =0
virtual const GroupList & partOfGroups() const =0
virtual QCString documentation() const =0
virtual QCString qualifiedName() const =0
virtual QCString displayName(bool includeScope=TRUE) const =0
virtual bool isArtificial() const =0
virtual QCString briefFile() const =0
virtual QCString getOutputFileBase() const =0
virtual Definition * getOuterScope() const =0
virtual int getStartBodyLine() const =0
virtual int getDefColumn() const =0
virtual bool isReference() const =0
virtual QCString inbodyDocumentation() const =0
virtual QCString inbodyFile() const =0
virtual const QCString & name() const =0
virtual void mergeReferencedBy(const Definition *other)=0
virtual void setExported(bool b)=0
virtual void setBodySegment(int defLine, int bls, int ble)=0
virtual void setName(const QCString &name)=0
virtual void setHidden(bool b)=0
virtual void mergeReferences(const Definition *other)=0
virtual void setDocumentation(const QCString &d, const QCString &docFile, int docLine, bool stripWhiteSpace=TRUE)=0
virtual void setDefFile(const QCString &df, int defLine, int defColumn)=0
virtual void addInnerCompound(Definition *d)=0
virtual void addSectionsToDefinition(const std::vector< const SectionInfo * > &anchorList)=0
virtual void setInbodyDocumentation(const QCString &d, const QCString &docFile, int docLine)=0
virtual void setLanguage(SrcLangExt lang)=0
virtual void setOuterScope(Definition *d)=0
virtual void setArtificial(bool b)=0
virtual void setId(const QCString &name)=0
virtual void makePartOfGroup(GroupDef *gd)=0
virtual void setBodyDef(const FileDef *fd)=0
virtual void setBriefDescription(const QCString &b, const QCString &briefFile, int briefLine)=0
virtual void setReference(const QCString &r)=0
virtual void setRefItems(const RefItemVector &sli)=0
virtual void computeTooltip()=0
A model of a directory symbol.
virtual void overrideDirectoryGraph(bool e)=0
Class representing a directory in the file system.
static std::string currentDirPath()
std::string absPath() const
bool mkdir(const std::string &path, bool acceptsAbsPath=true) const
void setPath(const std::string &path)
bool remove(const std::string &path, bool acceptsAbsPath=true) const
DirIterator iterator() const
static std::string cleanDirPath(const std::string &path)
static bool setCurrent(const std::string &path)
A linked map of directories.
A class that generates docset files.
static DotManager * instance()
static NamespaceLinkedMap * namespaceLinkedMap
static ConceptLinkedMap * conceptLinkedMap
static bool suppressDocWarnings
static FileNameLinkedMap * plantUmlFileNameLinkedMap
static bool parseSourcesNeeded
static StringUnorderedSet inputPaths
static std::unique_ptr< PageDef > mainPage
static bool clangAssistedParsing
static StringUnorderedSet expandAsDefinedSet
static FileNameLinkedMap * inputNameLinkedMap
static ParserManager * parserManager
static Cache< std::string, LookupInfo > * typeLookupCache
static InputFileEncodingList inputFileEncodingList
static ClassLinkedMap * classLinkedMap
static MemberNameLinkedMap * functionNameLinkedMap
static PageLinkedMap * exampleLinkedMap
static FileNameLinkedMap * dotFileNameLinkedMap
static NamespaceDefMutable * globalScope
static FileNameLinkedMap * imageNameLinkedMap
static FileNameLinkedMap * mscFileNameLinkedMap
static QCString verifiedDotPath
static MemberGroupInfoMap memberGroupInfoMap
static IndexList * indexList
static StaticInitMap staticInitMap
static Cache< std::string, LookupInfo > * symbolLookupCache
static StringMap tagDestinationMap
static std::mutex countFlowKeywordsMutex
static ClassLinkedMap * hiddenClassLinkedMap
static FileNameLinkedMap * diaFileNameLinkedMap
static QCString htmlFileExtension
static QCString filterDBFileName
static PageLinkedMap * pageLinkedMap
static bool generatingXmlOutput
static std::unique_ptr< NamespaceDef > globalNamespaceDef
static DefinesPerFileList macroDefinitions
static DirLinkedMap * dirLinkedMap
static NamespaceAliasInfoMap namespaceAliasMap
static MemberNameLinkedMap * memberNameLinkedMap
static SymbolMap< Definition > * symbolMap
static StringUnorderedSet tagFileSet
static FileNameLinkedMap * includeNameLinkedMap
static FileNameLinkedMap * exampleNameLinkedMap
static SearchIndexIntf searchIndex
static DirRelationLinkedMap dirRelations
static std::mutex addExampleMutex
static ClangUsrMap * clangUsrMap
static GroupLinkedMap * groupLinkedMap
Generator for Eclipse help files.
static EmojiEntityMapper & instance()
Returns the one and only instance of the Emoji entity mapper.
void writeEmojiFile(TextStream &t)
Writes the list of supported emojis to the given file.
Represents an unstructured piece of information, about an entity found in the sources.
TextStream initializer
initial value (for variables)
VhdlSpecifier vhdlSpec
VHDL specifiers.
bool subGrouping
automatically group class members?
const std::vector< std::shared_ptr< Entry > > & children() const
GroupDocType groupDocType
QCString metaData
Slice metadata.
int docLine
line number at which the documentation was found
QCString bitfields
member's bit fields
ArgumentList typeConstr
where clause (C#) for type constraints
void markAsProcessed() const
int endBodyLine
line number where the definition ends
bool exported
is the symbol exported from a C++20 module
const TagInfo * tagInfo() const
QCString includeName
include name (3 arg of \class)
ArgumentLists tArgLists
template argument declarations
MethodTypes mtype
signal, slot, (dcop) method, or property?
@ GROUPDOC_NORMAL
defgroup
SrcLangExt lang
programming language in which this entry was found
QCString inbodyDocs
documentation inside the body of a function
int startColumn
start column of entry in the source
QCString relates
related class (doc block)
bool explicitExternal
explicitly defined as external?
std::vector< const SectionInfo * > anchors
list of anchors defined in this entry
QCString fileName
file this entry was extracted from
RelatesType relatesType
how relates is handled
QCString write
property write accessor
QCString args
member argument string
std::vector< Grouping > groups
list of groups this entry belongs to
CommandOverrides commandOverrides
store info for commands whose default can be overridden
QCString exception
throw specification
int startLine
start line of entry in the source
QCString req
C++20 requires clause.
ArgumentList argList
member arguments as a list
QCString includeFile
include file (2 arg of \class, must be unique)
int inbodyLine
line number at which the body doc was found
EntryType section
entry type (see Sections);
QCString briefFile
file in which the brief desc. was found
int bodyLine
line number of the body in the source
int mGrpId
member group id
std::vector< BaseInfo > extends
list of base classes
Specifier virt
virtualness of the entry
std::vector< std::string > qualifiers
qualifiers specified with the qualifier command
QCString doc
documentation block (partly parsed)
QCString read
property read accessor
RefItemVector sli
special lists (test/todo/bug/deprecated/..) this entry is in
QCString docFile
file in which the documentation was found
Protection protection
class protection
bool artificial
Artificially introduced item.
bool hidden
does this represent an entity that is hidden from the output
QCString brief
brief description (doc block)
int briefLine
line number at which the brief desc. was found
FileDef * fileDef() const
int initLines
define/variable initializer lines to show
QCString inbodyFile
file in which the body doc was found
TypeSpecifier spec
class/member specifiers
QCString inside
name of the class in which documents are found
Wrapper class for the Entry type.
ENTRY_TYPES bool isCompound() const
std::string to_string() const
bool isCompoundDoc() const
A class that generates a dynamic tree view side panel.
A model of a file symbol.
virtual void addUsingDeclaration(const Definition *d)=0
virtual void removeMember(MemberDef *md)=0
virtual void insertClass(ClassDef *cd)=0
virtual void insertConcept(ConceptDef *cd)=0
virtual void overrideIncludeGraph(bool e)=0
virtual void writeSourceHeader(OutputList &ol)=0
virtual bool generateSourceFile() const =0
virtual const LinkedRefMap< NamespaceDef > & getUsedNamespaces() const =0
virtual QCString absFilePath() const =0
virtual bool isSource() const =0
virtual void parseSource(ClangTUParser *clangParser)=0
virtual void getAllIncludeFilesRecursively(StringVector &incFiles) const =0
virtual void setDiskName(const QCString &name)=0
virtual void writeSourceFooter(OutputList &ol)=0
virtual void writeSourceBody(OutputList &ol, ClangTUParser *clangParser)=0
virtual void addUsingDirective(NamespaceDef *nd)=0
virtual void overrideIncludedByGraph(bool e)=0
virtual const QCString & docName() const =0
virtual void insertMember(MemberDef *md)=0
virtual void insertNamespace(NamespaceDef *nd)=0
Minimal replacement for QFileInfo.
std::string readLink() const
std::string fileName() const
std::string dirPath(bool absPath=true) const
std::string absFilePath() const
Class representing all files with a certain base name.
Ordered dictionary of FileName objects.
A model of a group of symbols.
virtual QCString groupTitle() const =0
virtual void overrideGroupGraph(bool e)=0
virtual bool addClass(ClassDef *def)=0
virtual bool containsFile(const FileDef *def) const =0
virtual bool addNamespace(NamespaceDef *def)=0
virtual void setGroupScope(Definition *d)=0
virtual void addFile(FileDef *def)=0
virtual MemberList * getMemberList(MemberListType lt) const =0
virtual void setGroupTitle(const QCString &newtitle)=0
virtual bool hasGroupTitle() const =0
Generator for HTML output.
static void writeSearchPage()
static void writeFooterFile(TextStream &t)
static void writeTabData()
Additional initialization after indices have been created.
static void writeSearchData(const QCString &dir)
static void writeExternalSearchPage()
static void writeStyleSheetFile(TextStream &t)
static void writeHeaderFile(TextStream &t, const QCString &cssname)
A class that generated the HTML Help specific files.
static const QCString hhpFileName
static Index & instance()
void countDataStructures()
A list of index interfaces.
Generator for LaTeX output.
static void writeFooterFile(TextStream &t)
static void writeStyleSheetFile(TextStream &t)
static void writeHeaderFile(TextStream &t)
static LayoutDocManager & instance()
Returns a reference to this singleton.
void parse(const QCString &fileName, const char *data=nullptr)
Parses a user provided layout.
std::unique_ptr< RefList > Ptr
T * add(const char *k, Args &&... args)
const T * find(const std::string &key) const
Container class representing a vector of objects with keys.
const T * find(const std::string &key) const
Generator for Man page output.
A model of a class/file/namespace member symbol.
virtual QCString typeString() const =0
virtual QCString requiresClause() const =0
virtual bool isFriend() const =0
virtual bool isForeign() const =0
virtual QCString definition() const =0
virtual bool isRelated() const =0
virtual const ClassDef * getCachedTypedefVal() const =0
virtual QCString excpString() const =0
virtual const ClassDef * getClassDef() const =0
virtual const ArgumentList & templateArguments() const =0
virtual GroupDef * getGroupDef()=0
virtual bool isCSharpProperty() const =0
virtual bool isTypedef() const =0
virtual const MemberVector & enumFieldList() const =0
virtual void moveTo(Definition *)=0
virtual const FileDef * getFileDef() const =0
virtual const ArgumentList & argumentList() const =0
virtual bool isStrongEnumValue() const =0
virtual VhdlSpecifier getVhdlSpecifiers() const =0
virtual bool isFunction() const =0
virtual bool isExternal() const =0
virtual int getMemberGroupId() const =0
virtual bool isStatic() const =0
virtual const MemberDef * reimplements() const =0
virtual StringVector getQualifiers() const =0
virtual QCString bitfieldString() const =0
virtual bool isTypedefValCached() const =0
virtual bool isDocsForDefinition() const =0
virtual bool isDefine() const =0
virtual const NamespaceDef * getNamespaceDef() const =0
virtual bool isObjCProperty() const =0
virtual Protection protection() const =0
virtual TypeSpecifier getMemberSpecifiers() const =0
virtual bool isEnumerate() const =0
virtual MemberType memberType() const =0
virtual ClassDef * relatedAlso() const =0
virtual bool isVariable() const =0
virtual bool isStrong() const =0
virtual QCString argsString() const =0
virtual Specifier virtualness(int count=0) const =0
virtual int redefineCount() const =0
virtual int initializerLines() const =0
virtual const MemberDef * getEnumScope() const =0
virtual bool isEnumValue() const =0
virtual bool isPrototype() const =0
virtual const QCString & initializer() const =0
virtual void setMemberClass(ClassDef *cd)=0
virtual void setProtection(Protection p)=0
virtual void setMemberGroupId(int id)=0
virtual void setDocumentedEnumValues(bool value)=0
virtual void setMemberSpecifiers(TypeSpecifier s)=0
virtual void setDefinition(const QCString &d)=0
virtual ClassDefMutable * getClassDefMutable()=0
virtual void setExplicitExternal(bool b, const QCString &df, int line, int column)=0
virtual void setAccessorType(ClassDef *cd, const QCString &t)=0
virtual void setDefinitionTemplateParameterLists(const ArgumentLists &lists)=0
virtual void invalidateTypedefValCache()=0
virtual void setBitfields(const QCString &s)=0
virtual void setVhdlSpecifiers(VhdlSpecifier s)=0
virtual void setEnumScope(MemberDef *md, bool livesInsideEnum=FALSE)=0
virtual void setEnumClassScope(ClassDef *cd)=0
virtual void setMaxInitLines(int lines)=0
virtual void setInheritsDocsFrom(const MemberDef *md)=0
virtual void setRelatedAlso(ClassDef *cd)=0
virtual void setPrototype(bool p, const QCString &df, int line, int column)=0
virtual void overrideReferencesRelation(bool e)=0
virtual void makeForeign()=0
virtual void overrideReferencedByRelation(bool e)=0
virtual void setDocsForDefinition(bool b)=0
virtual void setRequiresClause(const QCString &req)=0
virtual void overrideCallGraph(bool e)=0
virtual void overrideInlineSource(bool e)=0
virtual void setArgsString(const QCString &as)=0
virtual void setInitializer(const QCString &i)=0
virtual void copyArgumentNames(const MemberDef *bmd)=0
virtual void overrideEnumValues(bool e)=0
virtual void mergeMemberSpecifiers(TypeSpecifier s)=0
virtual void addQualifiers(const StringVector &qualifiers)=0
virtual void insertEnumField(MemberDef *md)=0
virtual void moveDeclArgumentList(std::unique_ptr< ArgumentList > al)=0
virtual void overrideCallerGraph(bool e)=0
virtual void setReimplements(MemberDef *md)=0
virtual void setDeclFile(const QCString &df, int line, int column)=0
virtual void invalidateCachedArgumentTypes()=0
virtual void moveArgumentList(std::unique_ptr< ArgumentList > al)=0
virtual void makeRelated()=0
virtual void insertReimplementedBy(MemberDef *md)=0
A list of MemberDef objects as shown in documentation sections.
Ordered dictionary of MemberName objects.
const MemberDef * find(const QCString &name) const
const MemberDef * findRev(const QCString &name) const
static ModuleManager & instance()
void addDocs(const Entry *root)
void addConceptToModule(const Entry *root, ConceptDef *cd)
void addClassToModule(const Entry *root, ClassDef *cd)
void addMemberToModule(const Entry *root, MemberDef *md)
void writeDocumentation(OutputList &ol)
void addMembersToMemberGroup()
void findSectionsInDocumentation()
void distributeMemberGroupDocumentation()
An abstract interface of a namespace symbol.
virtual const LinkedRefMap< NamespaceDef > & getUsedNamespaces() const =0
virtual bool isInline() const =0
virtual void insertUsedFile(FileDef *fd)=0
virtual void setMetaData(const QCString &m)=0
virtual void findSectionsInDocumentation()=0
virtual void countMembers()=0
virtual void addUsingDirective(NamespaceDef *nd)=0
virtual void insertMember(MemberDef *md)=0
virtual void addUsingDeclaration(const Definition *d)=0
virtual void distributeMemberGroupDocumentation()=0
virtual void writeTagFile(TextStream &)=0
virtual void addListReferences()=0
virtual void writeDocumentation(OutputList &ol)=0
virtual void setInline(bool isInline)=0
virtual void computeAnchors()=0
virtual void combineUsingRelations(NamespaceDefSet &visitedNamespace)=0
virtual void setFileName(const QCString &fn)=0
virtual void sortMemberLists()=0
virtual void addMembersToMemberGroup()=0
bool needsPreprocessing(const QCString &) const override
Returns TRUE if the language identified by extension needs the C preprocessor to be run before feed t...
void parseInput(const QCString &, const char *, const std::shared_ptr< Entry > &, ClangTUParser *) override
Parses a single input file with the goal to build an Entry tree.
void parsePrototype(const QCString &) override
Callback function called by the comment block scanner.
Abstract interface for outline parsers.
virtual bool needsPreprocessing(const QCString &extension) const =0
Returns TRUE if the language identified by extension needs the C preprocessor to be run before feed t...
virtual void parseInput(const QCString &fileName, const char *fileBuf, const std::shared_ptr< Entry > &root, ClangTUParser *clangParser)=0
Parses a single input file with the goal to build an Entry tree.
Class representing a list of output generators that are written to in parallel.
A model of a page symbol.
virtual void setLocalToc(const LocalToc &tl)=0
virtual void setFileName(const QCString &name)=0
virtual void setShowLineNo(bool)=0
virtual void setPageScope(Definition *)=0
virtual const GroupDef * getGroupDef() const =0
Manages programming language parsers.
static PlantumlManager & instance()
void run()
Run plant UML tool for all images.
void processFile(const QCString &fileName, const std::string &input, std::string &output)
void addSearchDir(const QCString &dir)
This is an alternative implementation of QCString.
int find(char c, int index=0, bool cs=TRUE) const
void fill(char c, int len=-1)
Fills a string with a predefined character.
QCString & prepend(const char *s)
int toInt(bool *ok=nullptr, int base=10) const
size_t length() const
Returns the length of the string, not counting the 0-terminator.
bool startsWith(const char *s) const
QCString mid(size_t index, size_t len=static_cast< size_t >(-1)) const
bool endsWith(const char *s) const
char & at(size_t i)
Returns a reference to the character at index i.
bool isEmpty() const
Returns TRUE iff the string is empty.
QCString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
const std::string & str() const
QCString & setNum(short n)
QCString right(size_t len) const
size_t size() const
Returns the length of the string, not counting the 0-terminator.
QCString & sprintf(const char *format,...)
int findRev(char c, int index=-1, bool cs=TRUE) const
QCString & replace(size_t index, size_t len, const char *s)
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
QCString left(size_t len) const
int contains(char c, bool cs=TRUE) const
bool stripPrefix(const QCString &prefix)
static const QCString qhpFileName
static QCString getQchFileName()
Generator for RTF output.
static bool preProcessFileInplace(const QCString &path, const QCString &name)
This is an API to a VERY brittle RTF preprocessor that combines nested RTF files.
static void writeStyleSheetFile(TextStream &t)
static void writeExtensionsFile(TextStream &t)
static RefListManager & instance()
Abstract proxy interface for non-javascript based search indices.
class that provide information about a section.
QCString fileName() const
SectionInfo * replace(const QCString &label, const QCString &fileName, int lineNr, const QCString &title, SectionType type, int level, const QCString &ref=QCString())
SectionInfo * add(const SectionInfo &si)
static SectionManager & instance()
returns a reference to the singleton
static constexpr int Page
std::vector< stat > stats
void begin(const char *name)
std::chrono::steady_clock::time_point startTime
const Definition * resolveSymbol(const Definition *scope, const QCString &name, const QCString &args=QCString(), bool checkCV=false, bool insideCode=false, bool onlyLinkable=false)
Find the symbool definition matching name within the scope set.
const ClassDef * resolveClass(const Definition *scope, const QCString &name, bool maybeUnlinkable=false, bool mayBeHidden=false)
Find the class definition matching name within the scope set.
QCString getTemplateSpec() const
In case a call to resolveClass() points to a template specialization, the template part is return via...
ClassDefMutable * resolveClassMutable(const Definition *scope, const QCString &name, bool mayBeUnlinkable=false, bool mayBeHidden=false)
Wrapper around resolveClass that returns a mutable interface to the class object or a nullptr if the ...
const MemberDef * getTypedef() const
In case a call to resolveClass() resolves to a type member (e.g.
Text streaming class that buffers data.
std::string str() const
Return the contents of the buffer as a std::string object.
Class managing a pool of worker threads.
auto queue(F &&f, Args &&... args) -> std::future< decltype(f(args...))>
Queue the callable function f for the threads to execute.
Wrapper class for a number of boolean properties.
std::string to_string() const
static void correctMemberProperties(MemberDefMutable *md)
static void computeVhdlComponentRelations()
ClassDefMutable * toClassDefMutable(Definition *d)
ClassDef * getClass(const QCString &n)
std::unique_ptr< ClassDef > createClassDefAlias(const Definition *newScope, const ClassDef *cd)
std::unique_ptr< ClassDef > createClassDef(const QCString &fileName, int startLine, int startColumn, const QCString &name, ClassDef::CompoundType ct, const QCString &ref, const QCString &fName, bool isSymbol, bool isJavaEnum)
Factory method to create a new ClassDef object.
ClassDef * toClassDef(Definition *d)
std::unordered_set< const ClassDef * > ClassDefSet
std::map< std::string, int > TemplateNameMap
ClassDefMutable * getClassMutable(const QCString &key)
Class representing a regular expression.
Class to iterate through matches.
Object representing the matching results.
ConceptDefMutable * toConceptDefMutable(Definition *d)
std::unique_ptr< ConceptDef > createConceptDef(const QCString &fileName, int startLine, int startColumn, const QCString &name, const QCString &tagRef, const QCString &tagFile)
ConceptDefMutable * getConceptMutable(const QCString &key)
#define Config_getInt(name)
#define Config_getList(name)
#define Config_updateString(name, value)
#define Config_updateBool(name, value)
#define Config_getBool(name)
#define Config_getString(name)
#define Config_updateList(name,...)
#define Config_getEnum(name)
std::set< std::string > StringSet
std::unordered_set< std::string > StringUnorderedSet
std::map< std::string, std::string > StringMap
std::vector< std::string > StringVector
void parseFuncDecl(const QCString &decl, const SrcLangExt lang, QCString &clName, QCString &type, QCString &name, QCString &args, QCString &funcTempList, QCString &exceptions)
std::unique_ptr< ArgumentList > stringToArgumentList(SrcLangExt lang, const QCString &argsString, QCString *extraTypeChars=nullptr)
std::unordered_map< std::string, DefineList > DefinesPerFileList
Definition * toDefinition(DefinitionMutable *dm)
DefinitionMutable * toDefinitionMutable(Definition *d)
DirIterator begin(DirIterator it) noexcept
DirIterator end(const DirIterator &) noexcept
void computeDirDependencies()
void generateDirDocs(OutputList &ol)
#define AUTO_TRACE_ADD(...)
#define AUTO_TRACE_EXIT(...)
constexpr DocNodeVariant * parent(DocNodeVariant *n)
returns the parent node of a given node n or nullptr if the node has no parent.
static void findInheritedTemplateInstances()
void printNavTree(Entry *root, int indent)
static void addClassToContext(const Entry *root)
static void makeTemplateInstanceRelation(const Entry *root, ClassDefMutable *cd)
static StringUnorderedSet g_pathsVisited(1009)
static int findEndOfTemplate(const QCString &s, size_t startPos)
static void buildGroupList(const Entry *root)
static void insertMemberAlias(Definition *outerScope, const MemberDef *md)
static void findUsingDeclarations(const Entry *root, bool filterPythonPackages)
static void flushCachedTemplateRelations()
static bool isRecursiveBaseClass(const QCString &scope, const QCString &name)
static void copyLatexStyleSheet()
static void generateDocsForClassList(const std::vector< ClassDefMutable * > &classList)
static std::shared_ptr< Entry > parseFile(OutlineParserInterface &parser, FileDef *fd, const QCString &fn, ClangTUParser *clangParser, bool newTU)
static int findFunctionPtr(const std::string &type, SrcLangExt lang, int *pLength=nullptr)
static bool isSpecialization(const ArgumentLists &srcTempArgLists, const ArgumentLists &dstTempArgLists)
static MemberDef * addVariableToClass(const Entry *root, ClassDefMutable *cd, MemberType mtype, const QCString &type, const QCString &name, const QCString &args, bool fromAnnScope, MemberDef *fromAnnMemb, Protection prot, Relationship related)
static void computeTemplateClassRelations()
static std::string resolveSymlink(const std::string &path)
void adjustConfiguration()
adjust globals that depend on configuration settings.
static void findDEV(const MemberNameLinkedMap &mnsd)
static void runQHelpGenerator()
static void addConceptToContext(const Entry *root)
static void addRelatedPage(Entry *root)
static void addIncludeFile(DefMutable *cd, FileDef *ifd, const Entry *root)
static StringVector g_inputFiles
static void createUsingMemberImportForClass(const Entry *root, ClassDefMutable *cd, const MemberDef *md, const QCString &fileName, const QCString &memName)
static void generateXRefPages()
static void findUsingDeclImports(const Entry *root)
static void copyStyleSheet()
FindBaseClassRelation_Mode
void distributeClassGroupRelations()
static void generateGroupDocs()
static void findDirDocumentation(const Entry *root)
void checkConfiguration()
check and resolve config options
QCString stripTemplateSpecifiers(const QCString &s)
static bool findClassRelation(const Entry *root, Definition *context, ClassDefMutable *cd, const BaseInfo *bi, const TemplateNameMap &templateNames, FindBaseClassRelation_Mode mode, bool isArtificial)
static void resolveTemplateInstanceInType(const Entry *root, const Definition *scope, const MemberDef *md)
static void organizeSubGroupsFiltered(const Entry *root, bool additional)
static void warnUndocumentedNamespaces()
static TemplateNameMap getTemplateArgumentsInName(const ArgumentList &templateArguments, const std::string &name)
static NamespaceDef * findUsedNamespace(const LinkedRefMap< NamespaceDef > &unl, const QCString &name)
static void buildConceptList(const Entry *root)
static void resolveClassNestingRelations()
static void generateNamespaceConceptDocs(const ConceptLinkedRefMap &conceptList)
static void findMember(const Entry *root, const QCString &relates, const QCString &type, const QCString &args, QCString funcDecl, bool overloaded, bool isFunc)
static void findClassEntries(const Entry *root)
static void processTagLessClasses(const ClassDef *rootCd, const ClassDef *cd, ClassDefMutable *tagParentCd, const QCString &prefix, int count)
Look through the members of class cd and its public members.
static void addMemberFunction(const Entry *root, MemberName *mn, const QCString &scopeName, const QCString &namespaceName, const QCString &className, const QCString &funcTyp, const QCString &funcName, const QCString &funcArgs, const QCString &funcTempList, const QCString &exceptions, const QCString &type, const QCString &args, bool isFriend, TypeSpecifier spec, const QCString &relates, const QCString &funcDecl, bool overloaded, bool isFunc)
static void vhdlCorrectMemberProperties()
static void generateExampleDocs()
static void stopDoxygen(int)
static void findTemplateInstanceRelation(const Entry *root, Definition *context, ClassDefMutable *templateClass, const QCString &templSpec, const TemplateNameMap &templateNames, bool isArtificial)
static void substituteTemplatesInArgList(const ArgumentLists &srcTempArgLists, const ArgumentLists &dstTempArgLists, const ArgumentList &src, ArgumentList &dst)
static void computeMemberReferences()
static void generateConfigFile(const QCString &configFile, bool shortList, bool updateOnly=FALSE)
static void transferRelatedFunctionDocumentation()
static void addMembersToMemberGroup()
static bool tryAddEnumDocsToGroupMember(const Entry *root, const QCString &name)
static void addOverloaded(const Entry *root, MemberName *mn, const QCString &funcType, const QCString &funcName, const QCString &funcArgs, const QCString &funcDecl, const QCString &exceptions, TypeSpecifier spec)
static void findMainPageTagFiles(Entry *root)
static void distributeConceptGroups()
static void transferFunctionDocumentation()
static void setAnonymousEnumType()
static void sortMemberLists()
static void createTemplateInstanceMembers()
void transferStaticInstanceInitializers()
static void findObjCMethodDefinitions(const Entry *root)
static void dumpSymbolMap()
static void buildTypedefList(const Entry *root)
static void findGroupScope(const Entry *root)
static void generateFileDocs()
static void findDefineDocumentation(Entry *root)
static void findUsedClassesForClass(const Entry *root, Definition *context, ClassDefMutable *masterCd, ClassDefMutable *instanceCd, bool isArtificial, const ArgumentList *actualArgs=nullptr, const TemplateNameMap &templateNames=TemplateNameMap())
static void findMemberDocumentation(const Entry *root)
static void copyIcon(const QCString &outputOption)
static void addLocalObjCMethod(const Entry *root, const QCString &scopeName, const QCString &funcType, const QCString &funcName, const QCString &funcArgs, const QCString &exceptions, const QCString &funcDecl, TypeSpecifier spec)
static bool findGlobalMember(const Entry *root, const QCString &namespaceName, const QCString &type, const QCString &name, const QCString &tempArg, const QCString &, const QCString &decl, TypeSpecifier)
static void distributeMemberGroupDocumentation()
static void generateNamespaceClassDocs(const ClassLinkedRefMap &classList)
static void addEnumValuesToEnums(const Entry *root)
static void generatePageDocs()
static void resolveUserReferences()
static void compareDoxyfile(Config::CompareMode diffList)
static void addPageToContext(PageDef *pd, Entry *root)
static void buildVarList(const Entry *root)
static void buildSequenceList(const Entry *root)
static void generateFileSources()
static QCString substituteTemplatesInString(const ArgumentLists &srcTempArgLists, const ArgumentLists &dstTempArgLists, const std::string &src)
static void copyLogo(const QCString &outputOption)
static void usage(const QCString &name, const QCString &versionString)
static MemberDef * addVariableToFile(const Entry *root, MemberType mtype, const QCString &scope, const QCString &type, const QCString &name, const QCString &args, bool fromAnnScope, MemberDef *fromAnnMemb)
static void generateClassDocs()
static void buildNamespaceList(const Entry *root)
static int computeIdealCacheParam(size_t v)
static void readTagFile(const std::shared_ptr< Entry > &root, const QCString &tagLine)
static void findIncludedUsingDirectives()
static void addDefineDoc(const Entry *root, MemberDefMutable *md)
static void addMemberDocs(const Entry *root, MemberDefMutable *md, const QCString &funcDecl, const ArgumentList *al, bool over_load, TypeSpecifier spec)
static void countMembers()
static void addInterfaceOrServiceToServiceOrSingleton(const Entry *root, ClassDefMutable *cd, QCString const &rname)
static void organizeSubGroups(const Entry *root)
static void applyMemberOverrideOptions(const Entry *root, MemberDefMutable *md)
static void findFriends()
static void findEnums(const Entry *root)
static void dumpSymbol(TextStream &t, Definition *d)
static void addClassAndNestedClasses(std::vector< ClassDefMutable * > &list, ClassDefMutable *cd)
static void addEnumDocs(const Entry *root, MemberDefMutable *md)
static void addListReferences()
static void exitDoxygen() noexcept
static void copyExtraFiles(const StringVector &files, const QCString &filesOption, const QCString &outputOption)
static bool isClassSection(const Entry *root)
static Definition * findScopeFromQualifiedName(NamespaceDefMutable *startScope, const QCString &n, FileDef *fileScope, const TagInfo *tagInfo)
static ClassDef * findClassWithinClassContext(Definition *context, ClassDef *cd, const QCString &name)
static void buildGroupListFiltered(const Entry *root, bool additional, bool includeExternal)
static void runHtmlHelpCompiler()
static QCString extractClassName(const Entry *root)
static void addMembersToIndex()
static bool g_dumpSymbolMap
static void version(const bool extended)
static void addGlobalFunction(const Entry *root, const QCString &rname, const QCString &sc)
static OutputList * g_outputList
static void findMainPage(Entry *root)
static ClassDef::CompoundType convertToCompoundType(EntryType section, TypeSpecifier specifier)
static void findUsingDirectives(const Entry *root)
std::unique_ptr< ArgumentList > getTemplateArgumentsFromName(const QCString &name, const ArgumentLists &tArgLists)
static bool g_successfulRun
static void addSourceReferences()
std::function< std::unique_ptr< T >() > make_parser_factory()
static void buildExampleList(Entry *root)
static void inheritDocumentation()
static void flushUnresolvedRelations()
static bool isSymbolHidden(const Definition *d)
void readConfiguration(int argc, char **argv)
static void readDir(FileInfo *fi, FileNameLinkedMap *fnMap, StringUnorderedSet *exclSet, const StringVector *patList, const StringVector *exclPatList, StringVector *resultList, StringUnorderedSet *resultSet, bool errorIfNotExist, bool recursive, StringUnorderedSet *killSet, StringUnorderedSet *paths)
static QCString g_commentFileName
static void findDocumentedEnumValues()
static void findTagLessClasses()
static void generateDiskNames()
static void addToIndices()
static void computeClassRelations()
static void buildFunctionList(const Entry *root)
static void checkPageRelations()
static void findModuleDocumentation(const Entry *root)
static void findEnumDocumentation(const Entry *root)
static void computePageRelations(Entry *root)
static void filterMemberDocumentation(const Entry *root, const QCString &relates)
static QCString createOutputDirectory(const QCString &baseDirName, const QCString &formatDirName, const char *defaultDirName)
static bool isVarWithConstructor(const Entry *root)
static StringSet g_usingDeclarations
static void buildDictionaryList(const Entry *root)
static bool haveEqualFileNames(const Entry *root, const MemberDef *md)
static void generateNamespaceDocs()
static void buildClassDocList(const Entry *root)
static void buildPageList(Entry *root)
static void writeTagFile()
static Definition * buildScopeFromQualifiedName(const QCString &name_, SrcLangExt lang, const TagInfo *tagInfo)
static void computeVerifiedDotPath()
static bool g_singleComment
static void findSectionsInDocumentation()
static void mergeCategories()
static const StringUnorderedSet g_compoundKeywords
static bool scopeIsTemplate(const Definition *d)
static void buildFileList(const Entry *root)
static ClassDefMutable * createTagLessInstance(const ClassDef *rootCd, const ClassDef *templ, const QCString &fieldName)
static void buildClassList(const Entry *root)
static void addMethodToClass(const Entry *root, ClassDefMutable *cd, const QCString &rtype, const QCString &rname, const QCString &rargs, bool isFriend, Protection protection, bool stat, Specifier virt, TypeSpecifier spec, const QCString &relates)
static std::unique_ptr< OutlineParserInterface > getParserForFile(const QCString &fn)
static void findUsedTemplateInstances()
static void computeTooltipTexts()
void readFileOrDirectory(const QCString &s, FileNameLinkedMap *fnMap, StringUnorderedSet *exclSet, const StringVector *patList, const StringVector *exclPatList, StringVector *resultList, StringUnorderedSet *resultSet, bool recursive, bool errorIfNotExist, StringUnorderedSet *killSet, StringUnorderedSet *paths)
static void addVariable(const Entry *root, int isFuncPtr=-1)
static void addMemberSpecialization(const Entry *root, MemberName *mn, ClassDefMutable *cd, const QCString &funcType, const QCString &funcName, const QCString &funcArgs, const QCString &funcDecl, const QCString &exceptions, TypeSpecifier spec)
static void findBaseClassesForClass(const Entry *root, Definition *context, ClassDefMutable *masterCd, ClassDefMutable *instanceCd, FindBaseClassRelation_Mode mode, bool isArtificial, const ArgumentList *actualArgs=nullptr, const TemplateNameMap &templateNames=TemplateNameMap())
static void parseFilesSingleThreading(const std::shared_ptr< Entry > &root)
parse the list of input files
static void buildCompleteMemberLists()
static void generateConceptDocs()
static void combineUsingRelations()
static const char * getArg(int argc, char **argv, int &optInd)
static const ClassDef * findClassDefinition(FileDef *fd, NamespaceDef *nd, const QCString &scopeName)
static void checkMarkdownMainfile()
static std::unordered_map< std::string, std::vector< ClassDefMutable * > > g_usingClassMap
static void buildConceptDocList(const Entry *root)
static int findTemplateSpecializationPosition(const QCString &name)
static bool isEntryInGroupOfMember(const Entry *root, const MemberDef *md, bool allowNoGroup=false)
static void parseFilesMultiThreading(const std::shared_ptr< Entry > &root)
parse the list of input files
static void transferFunctionReferences()
static void buildDefineList()
static void buildInterfaceAndServiceList(const Entry *root)
static void computeMemberRelations()
static void buildListOfUsingDecls(const Entry *root)
static void computeMemberRelationsForBaseClass(const ClassDef *cd, const BaseClassDef *bcd)
static std::multimap< std::string, const Entry * > g_classEntries
std::vector< InputFileEncoding > InputFileEncodingList
std::unordered_map< std::string, BodyInfo > StaticInitMap
std::unordered_map< std::string, NamespaceAliasInfo > NamespaceAliasInfoMap
std::unordered_map< std::string, const Definition * > ClangUsrMap
std::unique_ptr< FileDef > createFileDef(const QCString &p, const QCString &n, const QCString &ref, const QCString &dn)
FileDef * toFileDef(Definition *d)
std::unordered_set< const FileDef * > FileDefSet
static void startScope(yyscan_t yyscanner)
start scope
void addNamespaceToGroups(const Entry *root, NamespaceDef *nd)
void addGroupToGroups(const Entry *root, GroupDef *subGroup)
void addClassToGroups(const Entry *root, ClassDef *cd)
void addDirToGroups(const Entry *root, DirDef *dd)
std::unique_ptr< GroupDef > createGroupDef(const QCString &fileName, int line, const QCString &name, const QCString &title, const QCString &refFileName)
void addConceptToGroups(const Entry *root, ConceptDef *cd)
void addMemberToGroups(const Entry *root, MemberDef *md)
void startTitle(OutputList &ol, const QCString &fileName, const DefinitionMutable *def)
void endFile(OutputList &ol, bool skipNavIndex, bool skipEndContents, const QCString &navPath)
void writeGraphInfo(OutputList &ol)
void endTitle(OutputList &ol, const QCString &fileName, const QCString &name)
void startFile(OutputList &ol, const QCString &name, const QCString &manName, const QCString &title, HighlightedItem hli, bool additionalIndices, const QCString &altSidebarName, int hierarchyLevel, const QCString &allMembersFile)
void writeIndexHierarchy(OutputList &ol)
Translator * theTranslator
void setTranslator(OUTPUT_LANGUAGE_t langName)
#define LATEX_STYLE_EXTENSION
void writeDefaultLayoutFile(const QCString &fileName)
std::unique_ptr< MemberDef > createMemberDefAlias(const Definition *newScope, const MemberDef *aliasMd)
MemberDefMutable * toMemberDefMutable(Definition *d)
void combineDeclarationAndDefinition(MemberDefMutable *mdec, MemberDefMutable *mdef)
MemberDef * toMemberDef(Definition *d)
std::unique_ptr< MemberDef > createMemberDef(const QCString &defFileName, int defLine, int defColumn, const QCString &type, const QCString &name, const QCString &args, const QCString &excp, Protection prot, Specifier virt, bool stat, Relationship related, MemberType t, const ArgumentList &tal, const ArgumentList &al, const QCString &metaData)
Factory method to create a new instance of a MemberDef.
std::unordered_map< int, std::unique_ptr< MemberGroupInfo > > MemberGroupInfoMap
QCString warn_line(const QCString &file, int line)
#define warn_undoc(file, line, fmt,...)
#define warn_uncond(fmt,...)
#define warn(file, line, fmt,...)
void postProcess(bool clearHeaderAndFooter, CompareMode compareMode=CompareMode::Full)
void checkAndCorrect(bool quiet, const bool check)
void compareDoxyfile(TextStream &t, CompareMode compareMode)
bool parse(const QCString &fileName, bool update=FALSE, CompareMode compareMode=CompareMode::Full)
void writeTemplate(TextStream &t, bool shortList, bool updateOnly=FALSE)
void correctPath(const StringVector &list)
Correct a possible wrong PATH variable.
bool isAbsolutePath(const QCString &fileName)
FILE * popen(const QCString &name, const QCString &type)
std::ofstream openOutputStream(const QCString &name, bool append=false)
double getSysElapsedTime()
QCString pathListSeparator()
int system(const QCString &command, const QCString &args, bool commandHasConsole=true)
void setenv(const QCString &variable, const QCString &value)
const char * commandExtension()
QCString getenv(const QCString &variable)
QCString trunc(const QCString &s, size_t numChars=15)
void replaceNamespaceAliases(QCString &name)
std::unique_ptr< NamespaceDef > createNamespaceDefAlias(const Definition *newScope, const NamespaceDef *nd)
Factory method to create an alias of an existing namespace.
std::unique_ptr< NamespaceDef > createNamespaceDef(const QCString &defFileName, int defLine, int defColumn, const QCString &name, const QCString &ref, const QCString &refFile, const QCString &type, bool isPublished)
Factory method to create new NamespaceDef instance.
NamespaceDef * getResolvedNamespace(const QCString &name)
NamespaceDef * toNamespaceDef(Definition *d)
NamespaceDefMutable * toNamespaceDefMutable(Definition *d)
NamespaceDefMutable * getResolvedNamespaceMutable(const QCString &key)
std::unordered_set< const NamespaceDef * > NamespaceDefSet
bool search(std::string_view str, Match &match, const Ex &re, size_t pos)
Search in a given string str starting at position pos for a match against regular expression re.
std::unique_ptr< PageDef > createPageDef(const QCString &f, int l, const QCString &n, const QCString &d, const QCString &t)
void setPerlModDoxyfile(const QCString &qs)
Portable versions of functions that are platform dependent.
int portable_iconv_close(void *cd)
void * portable_iconv_open(const char *tocode, const char *fromcode)
int qstricmp(const char *s1, const char *s2)
QCString substitute(const QCString &s, const QCString &src, const QCString &dst)
substitute all occurrences of src in s by dst
int qstricmp_sort(const char *str1, const char *str2)
const char * qPrint(const char *s)
uint32_t qstrlen(const char *str)
Returns the length of string str, or 0 if a null pointer is passed.
int qstrcmp(const char *str1, const char *str2)
std::vector< RefItem * > RefItemVector
void finalizeSearchIndexer()
static void addMemberToSearchIndex(const MemberDef *md)
void createJavaScriptSearchIndex()
void writeJavaScriptSearchIndex()
Javascript based search engine.
void addSTLSupport(std::shared_ptr< Entry > &root)
Add stub entries for the most used classes in the standard template library.
Some helper functions for std::string.
void addTerminalCharIfMissing(std::string &s, char c)
This class contains the information about the argument of a function or template.
Class that contains information about an inheritance relation.
ClassDef * classDef
Class definition that this relation inherits from.
This class stores information about an inheritance relation.
Protection prot
inheritance type
Specifier virt
virtualness
QCString name
the name of the base class
Data associated with description found in the body.
QCString groupname
name of the group
@ GROUPING_INGROUP
membership in group was defined by @ingroup
static const char * getGroupPriName(GroupPri_t priority)
GroupPri_t pri
priority of this definition
const Definition * definition
const MemberDef * typeDef
stat(const char *n, double el)
This struct is used to capture the tag file information for an Entry.
void parseTagFile(const std::shared_ptr< Entry > &root, const char *fullName)
void initTracing(const QCString &logFile, bool timing)
QCString removeRedundantWhiteSpace(const QCString &s)
QCString mergeScopes(const QCString &leftScope, const QCString &rightScope)
QCString normalizeNonTemplateArgumentsInString(const QCString &name, const Definition *context, const ArgumentList &formalArgs)
SrcLangExt getLanguageFromFileName(const QCString &fileName, SrcLangExt defLang)
bool protectionLevelVisible(Protection prot)
bool matchTemplateArguments(const ArgumentList &srcAl, const ArgumentList &dstAl)
void addCodeOnlyMappings()
QCString substituteTemplateArgumentsInString(const QCString &nm, const ArgumentList &formalArgs, const ArgumentList *actualArgs)
int extractClassNameFromType(const QCString &type, int &pos, QCString &name, QCString &templSpec, SrcLangExt lang)
bool leftScopeMatch(const QCString &scope, const QCString &name)
QCString stripAnonymousNamespaceScope(const QCString &s)
QCString stripFromIncludePath(const QCString &path)
bool checkIfTypedef(const Definition *scope, const FileDef *fileScope, const QCString &n)
bool readInputFile(const QCString &fileName, std::string &contents, bool filter, bool isSourceCode)
read a file name fileName and optionally filter and transcode it
bool patternMatch(const FileInfo &fi, const StringVector &patList)
bool openOutputFile(const QCString &outFile, std::ofstream &f)
QCString tempArgListToString(const ArgumentList &al, SrcLangExt lang, bool includeDefault)
void addRefItem(const RefItemVector &sli, const QCString &key, const QCString &prefix, const QCString &name, const QCString &title, const QCString &args, const Definition *scope)
QCString showFileDefMatches(const FileNameLinkedMap *fnMap, const QCString &n)
QCString fileToString(const QCString &name, bool filter, bool isSourceCode)
QCString filterTitle(const QCString &title)
QCString removeAnonymousScopes(const QCString &str)
bool matchArguments2(const Definition *srcScope, const FileDef *srcFileScope, const ArgumentList *srcAl, const Definition *dstScope, const FileDef *dstFileScope, const ArgumentList *dstAl, bool checkCV, SrcLangExt lang)
QCString resolveTypeDef(const Definition *context, const QCString &qualifiedName, const Definition **typedefContext)
bool checkExtension(const QCString &fName, const QCString &ext)
int computeQualifiedIndex(const QCString &name)
Return the index of the last :: in the string name that is still before the first <.
void initDefaultExtensionMapping()
bool findAndRemoveWord(QCString &sentence, const char *word)
removes occurrences of whole word from sentence, while keeps internal spaces and reducing multiple se...
QCString convertNameToFile(const QCString &name, bool allowDots, bool allowUnderscore)
QCString langToString(SrcLangExt lang)
Returns a string representation of lang.
EntryType guessSection(const QCString &name)
void extractNamespaceName(const QCString &scopeName, QCString &className, QCString &namespaceName, bool allowEmptyClass)
QCString argListToString(const ArgumentList &al, bool useCanonicalType, bool showDefVals)
QCString getLanguageSpecificSeparator(SrcLangExt lang, bool classScope)
Returns the scope separator to use given the programming language lang.
void mergeMemberOverrideOptions(MemberDefMutable *md1, MemberDefMutable *md2)
QCString mangleCSharpGenericName(const QCString &name)
QCString projectLogoFile()
void mergeArguments(ArgumentList &srcAl, ArgumentList &dstAl, bool forceNameOverwrite)
bool copyFile(const QCString &src, const QCString &dest)
Copies the contents of file with name src to the newly created file with name dest.
QCString stripTemplateSpecifiersFromScope(const QCString &fullName, bool parentOnly, QCString *pLastScopeStripped, QCString scopeName, bool allowArtificial)
QCString getOverloadDocs()
int getPrefixIndex(const QCString &name)
bool rightScopeMatch(const QCString &scope, const QCString &name)
bool updateLanguageMapping(const QCString &extension, const QCString &language)
QCString getFileNameExtension(const QCString &fn)
QCString replaceAnonymousScopes(const QCString &s, const QCString &replacement)
FileDef * findFileDef(const FileNameLinkedMap *fnMap, const QCString &n, bool &ambig)
int getScopeFragment(const QCString &s, int p, int *l)
void addHtmlExtensionIfMissing(QCString &fName)
A bunch of utility functions.