22#include <unordered_map>
120#pragma GCC diagnostic push
121#pragma GCC diagnostic ignored "-Wshadow"
123#include <clang/Basic/Version.h>
125#pragma GCC diagnostic pop
132#if !defined(_WIN32) || defined(__CYGWIN__)
200{
"template class",
"template struct",
"class",
"struct",
"union",
"interface",
"exception" };
237 stats.emplace_back(name,0);
238 startTime = std::chrono::steady_clock::now();
242 std::chrono::steady_clock::time_point endTime = std::chrono::steady_clock::now();
243 stats.back().elapsed =
static_cast<double>(std::chrono::duration_cast<
244 std::chrono::microseconds>(endTime -
startTime).count())/1000000.0;
255 msg(
"----------------------\n");
256 for (
const auto &s :
stats)
258 msg(
"Spent {:.6f} seconds in {}",s.elapsed,s.name);
321 scope+=
"::"+pd->
name();
364 ((!includeExternal && root->
tagInfo()==
nullptr) ||
365 ( includeExternal && root->
tagInfo()!=
nullptr))
368 AUTO_TRACE(
"additional={} includeExternal={}",additional,includeExternal);
384 "group {}: ignoring title \"{}\" that does not match old title \"{}\"",
404 std::unique_ptr<GroupDef>(
411 std::unique_ptr<GroupDef>(
461 scope+=
"::"+gd->
name();
513 bool save_ambig = ambig;
517 size_t newIndex=fn.
rfind(
'/');
524 fn = fn.
left(newIndex)+
"/"+root->
name;
527 if (!fd) ambig = save_ambig;
558 "Found non-existing group '{}' for the command '{}', ignoring command",
567 text.
sprintf(
"the name '%s' supplied as "
568 "the argument in the \\file statement ",
572 text+=
"matches the following input files:\n";
575 text+=
"Please use a more specific name by "
576 "including a (larger) part of the path!";
580 text+=
"is not an input file";
588template<
class DefMutable>
602 if (!includeFile.
empty() && includeFile.
at(0)==
'"')
605 includeFile=includeFile.
mid(1,includeFile.
length()-2);
607 else if (!includeFile.
empty() && includeFile.
at(0)==
'<')
610 includeFile=includeFile.
mid(1,includeFile.
length()-2);
617 if (!includeFile.
empty() &&
622 text.
sprintf(
"the name '%s' supplied as "
623 "the argument of the \\class, \\struct, \\union, or \\include command ",
628 text+=
"matches the following input files:\n";
631 text+=
"Please use a more specific name by "
632 "including a (larger) part of the path!";
636 text+=
"is not an input file";
640 else if (includeFile.
empty() && ifd &&
654 if (iName.
at(0)==
'<') local=
false;
655 else if (iName.
at(0)==
'"') local=
true;
656 if (iName.
at(0)==
'"' || iName.
at(0)==
'<')
679 cd->setIncludeFile(
nullptr,iName,local,
true);
692 for (
size_t i=0;i<l;i++)
696 else if (c==
')' && round>0) round--;
697 else if (c==
'<' && round==0) count++;
702 if (c==
'>' && round==0 && count>0) count--;
725 if (idx==-1)
return prevScope;
727 if (nsName.
empty())
return prevScope;
728 if (!fullScope.
empty()) fullScope+=
"::";
733 if (nd==
nullptr) cd =
getClass(fullScope);
734 if (nd==
nullptr && cd)
746 "[generated]",1,1,fullScope,
764 if (prevScopeMutable)
796 int p=i1+l1,l2=0,i2=0;
799 DString nestedNameSpecifier = scope.
mid(i1,l1);
804 if (resultScope==
nullptr)
815 if (resultScope!=
nullptr)
break;
874 auto alIt = tArgLists.begin();
891 return alIt!=tArgLists.end() ?
892 std::make_unique<ArgumentList>(*alIt) :
893 std::unique_ptr<ArgumentList>();
901 if (specifier.isStruct())
903 else if (specifier.isUnion())
905 else if (specifier.isCategory())
907 else if (specifier.isInterface())
909 else if (specifier.isProtocol())
911 else if (specifier.isException())
913 else if (specifier.isService())
915 else if (specifier.isSingleton())
918 if (section.isUnionDoc())
920 else if (section.isStructDoc())
922 else if (section.isInterfaceDoc())
924 else if (section.isProtocolDoc())
926 else if (section.isCategoryDoc())
928 else if (section.isExceptionDoc())
930 else if (section.isServiceDoc())
932 else if (section.isSingletonDoc())
960 DString qualifiedName = fullName;
963 qualifiedName.
prepend(scName+
"::");
969 AUTO_TRACE_ADD(
"Found class with name '{}', qualifiedName '{}'", cd ? cd->
name() : root->
name, qualifiedName);
1024 AUTO_TRACE_ADD(
"New class: fullname '{}' namespace '{}' name='{}' brief='{}' docs='{}'",
1041 std::unique_ptr<ArgumentList> tArgList;
1043 if ((root->
lang==SrcLangExt::CSharp || root->
lang==SrcLangExt::Java) &&
1058 fullName=fullName.
left(i);
1069 fullName,sec,tagName,refFileName,
true,root->
spec.isEnum()) ));
1072 AUTO_TRACE_ADD(
"New class '{}' type={} #tArgLists={} tagInfo={} hidden={} artificial={}",
1109 AUTO_TRACE_ADD(
"Class {} not added, already exists as alias", fullName);
1117 if (!root->
spec.isForwardDecl())
1179 qualifiedName.
prepend(scName+
"::");
1185 AUTO_TRACE_ADD(
"Found concept with name '{}' (qualifiedName='{}')", cd ? cd->
name() : root->
name, qualifiedName);
1189 qualifiedName=cd->
name();
1203 AUTO_TRACE_ADD(
"New concept: fullname '{}' namespace '{}' name='{}' brief='{}' docs='{}'",
1204 qualifiedName,namespaceName,className,root->
brief,root->
doc);
1225 qualifiedName,tagName,refFileName)));
1229 qualifiedName,root->
tArgLists.size(),fmt::ptr(tagInfo));
1260 for (
const auto &ce : root->
children())
1263 if (ce->section.isConceptDocPart())
1268 if (!ce->brief.empty())
1270 cd->
addDocPart(ce->brief,ce->startLine,ce->startColumn);
1273 if (!ce->doc.empty())
1275 cd->
addDocPart(ce->doc,ce->startLine,ce->startColumn);
1279 else if (ce->section.isConceptCodePart())
1281 cd->
addCodePart(ce->initializer.str(),ce->startLine,ce->startColumn);
1288 AUTO_TRACE_ADD(
"Concept '{}' not added, already exists (as alias)", qualifiedName);
1295 for (
const auto &ce : root->
children())
1297 if (ce->section.isConceptDocPart())
1317 if (root->
section.isModuleDoc())
1327 if (root->
section.isConcept())
1337 if (root->
section.isConceptDoc())
1356 if (cd!=ocd && cd->groupId()==ocd->groupId() &&
1357 !cd->partOfGroups().empty() && ocd->partOfGroups().empty())
1362 for (
const auto &gd : cd->partOfGroups())
1368 gd->addConcept(ocd.get());
1393 aliasFullName(name),aliasCd(std::move(cd)), aliasContext(ctx) {}
1395 std::unique_ptr<ClassDef> aliasCd;
1398 std::vector<ClassAlias> aliases;
1402 if (cd && visitedClasses.find(icd.get())==visitedClasses.end())
1408 name,icd->getFileDef(),
nullptr);
1434 aliases.emplace_back(aliasFullName,std::move(aliasCd),dm);
1445 visitedClasses.insert(icd.get());
1455 for (
auto &alias : aliases)
1460 alias.aliasContext->addInnerCompound(aliasCd);
1469 if (cd && visitedClasses.find(icd.get())==visitedClasses.end())
1487 "Incomplete input: scope for class {} not found!{}",name,
1488 name.
startsWith(
"std::") ?
" Try enabling BUILTIN_STL_SUPPORT." :
""
1506 if (visitedClasses.find(cd.get())==visitedClasses.end() && !cd->partOfGroups().empty())
1510 for (
auto &ncd : cd->getClasses())
1521 visitedClasses.insert(cd.get());
1528template<
typename Container>
1530 const Container *cd,
1536 MemberList *eiml = cd->getMemberList(mlFilter);
1539 for (
const auto &eimd : *eiml)
1541 DString vtype = eimd->typeString();
1562 const char *p = n.
data()+sn;
1566 if (!isdigit(c) && c!=
'@' && c!=
':')
break;
1572 DString fullName = n+
"."+fieldName;
1601 else if (outerScope)
1616 auto newMd =
createMemberDef(md->getDefFileName(),md->getDefLine(),md->getDefColumn(),
1617 md->typeString(),md->name(),md->argsString(),md->excpString(),
1618 md->protection(),md->virtualness(),md->isStatic(),Relationship::Member,
1628 imd->
setId(md->id());
1649 for (
const auto &md : *ml)
1658 for (
const auto &md : *ml)
1662 if (md->isEnumerate() && md->name().startsWith(
"@"))
1664 for (
const auto &emd : md->enumFieldList())
1687template<
typename Container,
typename TagContainer>
1689 const Container *cd,
1690 const TagContainer *tagParent,
1695 AUTO_TRACE(
"count={} name={}\n",count,cd->name());
1698 MemberList *ml = cd->getMemberList(varFilter);
1702 for (
const auto &md : *ml)
1704 DString type = md->typeString();
1709 std::vector<const ClassDef *> candidates;
1710 for (
const auto &icd : cd->getClasses())
1712 candidates.push_back(icd);
1714 for (
const auto &icd : candidates)
1720 if (md->isAnonymous()) name =
"__unnamed" +
DString().
setNum(pos++)+
"__";
1726 processTagLessClasses(ncd,icd,ncd,MemberListType::PubAttribs(),MemberListType::PubTypes(),name,count+1);
1731 MemberList *pml = tagParent->getMemberList(varFilter);
1734 for (
const auto &pmd : *pml)
1737 if (pmdm && pmd->
name()==md->name())
1754 ml = cd->getMemberList(typeFilter);
1757 for (
const auto &md : *ml)
1766template<
typename Container>
1769 for (
const auto &icd : cd->getClasses())
1777 candidates.insert(cd);
1782 std::set<const Definition *> candidates;
1792 const FileDef *fd = cd->getFileDef();
1807 for (
const auto &d : candidates)
1813 processTagLessClasses(nd,nd,nd,MemberListType::DecVarMembers(),MemberListType::DecEnumMembers(),
"",0);
1818 processTagLessClasses(fd,fd,fd,MemberListType::DecVarMembers(),MemberListType::DecEnumMembers(),
"",0);
1835 (root->
section.isNamespace() ||
1836 root->
section.isNamespaceDoc() ||
1845 if (root->
section.isPackageDoc())
1851 if (!fullName.
empty())
1909 root->
type,root->
spec.isPublished())));
1976 DString aliasName = aliasNd->name();
2005 for (
auto &und : unl)
2007 DString uScope=und->name()+
"::";
2009 if (usingNd!=
nullptr)
break;
2016 if (root->
section.isUsingDir())
2034 (fd==
nullptr || fd->
getLanguage()!=SrcLangExt::Java)
2038 if (!nsName.
empty())
2048 int scopeOffset =
static_cast<int>(nsName.
length());
2061 size_t o = nsName.
rfind(
"::",scopeOffset-1);
2064 }
while (scopeOffset>=0 && usingNd==
nullptr);
2066 if (usingNd==
nullptr && nd)
2070 while (pnd && usingNd==
nullptr)
2087 if (usingNd==
nullptr && fd)
2160 if (root->
section.isUsingDecl() &&
2173 if (root->
section.isUsingDecl() &&
2175 (!filterPythonPackages || (root->
lang==SrcLangExt::Python && root->
fileName.
endsWith(
"__init__.py")))
2178 AUTO_TRACE(
"Found using declaration '{}' at line {} of {} inside section {}",
2192 if (!scName.
empty())
2208 if (nd==
nullptr) scope = fd;
2278 AUTO_TRACE(
"creating new member {} for class {}",memName,cd->
name());
2289 newMmd->setMemberClass(cd);
2307 newMmd->addSectionsToDefinition(root->
anchors);
2313 newMmd->setMemberGroupId(root->
mGrpId);
2316 newMmd->setLanguage(root->
lang);
2317 newMmd->setId(root->
id);
2326 if (root->
section.isUsingDecl() &&
2353 for (
auto &mi : *mni)
2356 if (md && md->
protection()!=Protection::Private)
2371 for (
const auto ©Cd : it->second)
2384 else if (root->
section.isUsingDecl() &&
2386 root->
lang==SrcLangExt::Cpp
2419 memName = root->
name;
2441 newMmd->setNamespace(nd);
2446 newMmd->setFileDef(fd);
2465 newMmd->addSectionsToDefinition(root->
anchors);
2471 newMmd->setMemberGroupId(root->
mGrpId);
2474 newMmd->setLanguage(root->
lang);
2475 newMmd->setId(root->
id);
2483 if (nd && aliasMd.get())
2487 if (fd && aliasMd.get())
2516 if (nd) ncdm->
moveTo(nd);
2545 aliasFullName = aliasCd->localName();
2549 aliasFullName = nd->
qualifiedName()+
"::"+aliasCd->localName();
2581 for (
const auto &fd : *fn)
2584 fd->addIncludedUsingDirectives(visitedFiles);
2604 if (lang==SrcLangExt::Java || lang==SrcLangExt::CSharp)
2609 AUTO_TRACE(
"class variable: file='{}' type='{}' scope='{}' name='{}' args='{}' prot={} mtype={} lang={} init='{}'",
2615 if (related!=Relationship::Member || mtype==MemberType::Friend ||
Config_getBool(HIDE_SCOPE_NAMES))
2617 if (root->
spec.isAlias())
2619 if (lang==SrcLangExt::Python)
2621 def=
"type "+name+args;
2630 def=type+
" "+name+args;
2635 if (root->
spec.isAlias())
2637 if (lang==SrcLangExt::Python)
2639 def=
"type "+qualScope+scopeSeparator+name+args;
2643 def=
"using "+qualScope+scopeSeparator+name;
2648 def=type+
" "+qualScope+scopeSeparator+name+args;
2660 def=qualScope+scopeSeparator+name+args;
2671 for (
const auto &imd : *mn)
2683 if (root->
lang==SrcLangExt::ObjC &&
2684 root->
mtype==MethodTypes::Property &&
2708 prot,Specifier::Normal,root->
isStatic,related,
2712 mmd->setTagInfo(root->
tagInfo());
2713 mmd->setMemberClass(cd);
2717 mmd->setDefinition(def);
2719 mmd->addSectionsToDefinition(root->
anchors);
2723 mmd->setMemberGroupId(root->
mGrpId);
2724 mmd->setMemberSpecifiers(root->
spec);
2725 mmd->setVhdlSpecifiers(root->
vhdlSpec);
2726 mmd->setReadAccessor(root->
read);
2727 mmd->setWriteAccessor(root->
write);
2729 mmd->setHidden(root->
hidden);
2731 mmd->setLanguage(root->
lang);
2732 mmd->setId(root->
id);
2735 mmd->setBodyDef(root->
fileDef());
2740 mmd->setRefItems(root->
sli);
2741 mmd->setRequirementReferences(root->
rqli);
2746 if (mtype==MemberType::Typedef)
2769 AUTO_TRACE(
"global variable: file='{}' type='{}' scope='{}' name='{}' args='{}' prot={} mtype={} lang={} init='{}'",
2775 if (mtype==MemberType::Typedef &&
Config_getBool(TYPEDEF_HIDES_STRUCT))
2781 static const reg::Ex re(R
"(\a\w*)");
2783 const std::string &typ = ttype.
str();
2786 DString typeValue = match.str();
2821 if (root->
spec.isAlias())
2823 if (lang==SrcLangExt::Python)
2825 def=
"type "+nd->
name()+sep+name+args;
2829 def=
"using "+nd->
name()+sep+name;
2834 def=type+
" "+nd->
name()+sep+name+args;
2839 def=nd->
name()+sep+name+args;
2846 if (name.
at(0)==
'@')
2852 if (root->
spec.isAlias())
2854 if (root->
lang==SrcLangExt::Python)
2856 def=
"type "+root->
name+args;
2860 def=
"using "+root->
name;
2865 def=type+
" "+name+args;
2886 for (
const auto &imd : *mn)
2900 bool isPHPArray = md->
getLanguage()==SrcLangExt::PHP &&
2903 bool staticsInDifferentFiles =
2909 !staticsInDifferentFiles
2951 mmd->setTagInfo(root->
tagInfo());
2952 mmd->setMemberSpecifiers(root->
spec);
2953 mmd->setVhdlSpecifiers(root->
vhdlSpec);
2957 mmd->addSectionsToDefinition(root->
anchors);
2960 mmd->setMemberGroupId(root->
mGrpId);
2961 mmd->setDefinition(def);
2962 mmd->setLanguage(root->
lang);
2963 mmd->setId(root->
id);
2971 mmd->setBodyDef(fd);
2976 mmd->setRefItems(root->
sli);
2977 mmd->setRequirementReferences(root->
rqli);
2980 mmd->setNamespace(nd);
2988 mmd->setFileDef(fd);
2994 if (mtype==MemberType::Typedef)
3016 if (lang == SrcLangExt::Fortran || lang == SrcLangExt::VHDL)
3021 static const reg::Ex re(R
"(\([^)]*[*&^][^)]*\))");
3023 size_t i=std::string::npos;
3027 i = match.position();
3030 if (i!=std::string::npos)
3032 size_t di = type.find(
"decltype(");
3033 if (di!=std::string::npos && di<i)
3035 i = std::string::npos;
3038 size_t bb=type.find(
'<');
3039 size_t be=type.rfind(
'>');
3040 bool templFp =
false;
3041 if (be!=std::string::npos) {
3042 size_t cc_ast = type.find(
"::*");
3043 size_t cc_amp = type.find(
"::&");
3044 templFp = (cc_ast != std::string::npos && cc_ast>be) || (cc_amp != std::string::npos && cc_amp>be);
3047 if (!type.empty() &&
3048 i!=std::string::npos &&
3049 type.find(
"operator")==std::string::npos &&
3050 (type.find(
")(")==std::string::npos || type.find(
"typedef ")!=std::string::npos) &&
3052 (!(bb<i && i<be) || templFp)
3055 if (pLength) *pLength=
static_cast<int>(l);
3058 return static_cast<int>(i);
3075 bool result =
false;
3076 bool typeIsClass =
false;
3077 bool typePtrType =
false;
3114 typeIsClass = resolver.
resolveClass(ctx,type)!=
nullptr;
3132 static const reg::Ex initChars(R
"([\d"'&*!^]+)");
3136 std::string name = a.
name.
str();
3137 if (
reg::search(name,match,initChars) && match.position()==0)
3169 std::string atype = a.
type.
str();
3170 if (
reg::search(atype,match,initChars) && match.position()==0)
3177 if (resType.empty()) resType=atype;
3178 static const reg::Ex idChars(R
"(\a\w*)");
3179 if (
reg::search(resType,match,idChars) && match.position()==0)
3181 resType=match.str();
3182 if (resType==
"int" || resType==
"long" ||
3183 resType==
"float" || resType==
"double" ||
3184 resType==
"char" || resType==
"void" ||
3185 resType==
"signed" || resType==
"unsigned" ||
3186 resType==
"const" || resType==
"volatile" )
3223 bool insideString=
false;
3224 bool insideChar=
false;
3226 while (e<len && brCount!=0)
3232 if (!insideString && !insideChar)
3234 if (e<len-1 && s.
at(e+1)==
'<')
3236 else if (roundCount==0)
3241 if (!insideString && !insideChar)
3243 if (e<len-1 && s.
at(e+1)==
'>')
3245 else if (roundCount==0)
3250 if (!insideString && !insideChar)
3254 if (!insideString && !insideChar)
3260 if (insideString && pc!=
'\\')
3269 if (insideChar && pc!=
'\\')
3279 return brCount==0 ?
static_cast<int>(e) : -1;
3288 AUTO_TRACE(
"VARIABLE_SEC: type='{}' name='{}' args='{}' bodyLine={} endBodyLine={} mGrpId={} relates='{}'",
3303 std::string sargs = args.
str();
3304 static const reg::Ex reName(R
"(\a\w*)");
3309 sargs = match.suffix().str();
3310 size_t j = sargs.find(
')');
3311 if (j!=std::string::npos) args=sargs.
substr(0,j);
3322 size_t ai = type.
find(
'[',ii);
3335 AUTO_TRACE_ADD(
"after correction: type='{}' name='{}' args='{}'",type,name,args);
3346 scope=name.
left(index);
3347 name=name.
mid(index+2);
3355 if (!scopeName.
empty())
3367 bool isRelated=
false;
3368 bool isMemberOf=
false;
3371 if (root->
lang==SrcLangExt::CSharp)
3384 for (
size_t i=0;i<name.
length()-1;i++)
3386 if (name[i]==
':' && name[i+1]==
':')
3388 p=
static_cast<int>(i);
3390 else if (name[i]==
'<')
3395 if (e!=-1) i=
static_cast<int>(e);
3401 if (type==
"friend class" || type==
"friend struct" ||
3402 type==
"friend union")
3414 Relationship::Member
3435 mtype=MemberType::EnumValue;
3437 mtype=MemberType::Typedef;
3439 mtype=MemberType::Friend;
3440 else if (root->
mtype==MethodTypes::Property)
3441 mtype=MemberType::Property;
3442 else if (root->
mtype==MethodTypes::Event)
3443 mtype=MemberType::Event;
3445 mtype=sliceOpt ? MemberType::Sequence : MemberType::Typedef;
3447 mtype=sliceOpt ? MemberType::Dictionary : MemberType::Typedef;
3452 isMemberOf=(root->
relatesType==RelatesType::MemberOf);
3467 Relationship relationship = isMemberOf ? Relationship::Foreign :
3468 isRelated ? Relationship::Related :
3469 Relationship::Member ;
3481 else if (!name.
empty())
3507 scope=rname.
left(index);
3508 rname=rname.
mid(index+2);
3520 for (
auto &imd : *mn)
3522 if (!imd->isTypedef())
3531 bool notBothGrouped = root->
groups.empty() || imd->getGroupDef()==
nullptr;
3532 bool bothSameScope = (!cd && !nd) || (cd && imd->getClassDef() == cd) || (nd && imd->getNamespaceDef() == nd);
3535 if (notBothGrouped && bothSameScope && imd->typeString()==rtype)
3583 for (
const auto &e : root->
children())
3584 if (!e->section.isEnum())
3601 for (
const auto &e : root->
children())
3602 if (!e->section.isEnum())
3619 for (
const auto &e : root->
children())
3620 if (!e->section.isEnum())
3635 (root->
section.isVariable() &&
3638 (root->
section.isFunction() &&
3641 (root->
section.isFunction() &&
3650 for (
const auto &e : root->
children())
3651 if (!e->section.isEnum())
3666 enum MemberType type = root->
section.isExportedInterface() ? MemberType::Interface : MemberType::Service;
3677 mmd->setTagInfo(root->
tagInfo());
3678 mmd->setMemberClass(cd);
3680 mmd->setDocsForDefinition(
false);
3684 mmd->setMemberSpecifiers(root->
spec);
3685 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3686 mmd->setMemberGroupId(root->
mGrpId);
3688 mmd->setLanguage(root->
lang);
3689 mmd->setBodyDef(fd);
3690 mmd->setFileDef(fd);
3691 mmd->addSectionsToDefinition(root->
anchors);
3693 mmd->setDefinition(def);
3697 AUTO_TRACE(
"Interface member: fileName='{}' type='{}' name='{}' mtype='{}' prot={} virt={} state={} proto={} def='{}'",
3705 root->
spec.isOptional() ? Protection::Protected : Protection::Public, Specifier::Normal);
3715 mmd->setRefItems(root->
sli);
3716 mmd->setRequirementReferences(root->
rqli);
3725 if (root->
section.isExportedInterface() || root->
section.isIncludedService())
3727 AUTO_TRACE(
"Exported interface/included service: type='{}' scope='{}' name='{}' args='{}'"
3728 " relates='{}' relatesType='{}' file='{}' line={} bodyLine={} #tArgLists={}"
3729 " mGrpId={} spec={} proto={} docFile='{}'",
3752 else if (rname.
empty())
3755 "Illegal member name found.");
3761 case SrcLangExt::Unknown:
3762 case SrcLangExt::IDL:
3791 if (isFriend) mtype=MemberType::Friend;
3792 else if (root->
mtype==MethodTypes::Signal) mtype=MemberType::Signal;
3793 else if (root->
mtype==MethodTypes::Slot) mtype=MemberType::Slot;
3794 else if (root->
mtype==MethodTypes::DCOP) mtype=MemberType::DCOP;
3799 if ((fd==
nullptr || fd->
getLanguage()==SrcLangExt::Cpp) &&
3803 (j!=i+2 || name.
at(i+1)!=
'=')
3821 root->
relatesType==RelatesType::MemberOf ? Relationship::Foreign :
3822 Relationship::Related ;
3832 mmd->setTagInfo(root->
tagInfo());
3833 mmd->setMemberClass(cd);
3835 mmd->setDocsForDefinition(!root->
proto);
3839 mmd->setMemberSpecifiers(spec);
3840 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3841 mmd->setMemberGroupId(root->
mGrpId);
3843 mmd->setLanguage(root->
lang);
3844 mmd->setRequiresClause(root->
req);
3845 mmd->setId(root->
id);
3846 mmd->setBodyDef(fd);
3847 mmd->setFileDef(fd);
3848 mmd->addSectionsToDefinition(root->
anchors);
3853 if (scopeSeparator!=
"::")
3855 qualScope =
substitute(qualScope,
"::",scopeSeparator);
3857 if (lang==SrcLangExt::PHP)
3860 scopeSeparator=
"::";
3877 def=type+
" "+qualScope+scopeSeparator+name;
3881 def=qualScope+scopeSeparator+name;
3885 mmd->setDefinition(def);
3889 AUTO_TRACE(
"function member: type='{}' scope='{}' name='{}' args='{}' proto={} def='{}'",
3890 type, qualScope, rname, args, root->
proto, def);
3900 mmd->setRefItems(root->
sli);
3901 mmd->setRequirementReferences(root->
rqli);
3921 MemberType::Function,
3925 mmd->setTagInfo(root->
tagInfo());
3926 mmd->setLanguage(root->
lang);
3927 mmd->setId(root->
id);
3932 mmd->setDocsForDefinition(!root->
proto);
3938 mmd->addSectionsToDefinition(root->
anchors);
3939 mmd->setMemberSpecifiers(root->
spec);
3940 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3941 mmd->setMemberGroupId(root->
mGrpId);
3942 mmd->setRequiresClause(root->
req);
3952 if (!nscope.
empty())
3977 def=root->
type+
" "+scope+name;
3983 AUTO_TRACE(
"new non-member function type='{}' scope='{}' name='{}' args='{}' proto={} def='{}'",
3985 mmd->setDefinition(def);
3989 mmd->setRefItems(root->
sli);
3990 mmd->setRequirementReferences(root->
rqli);
3994 mmd->setNamespace(nd);
4001 mmd->setFileDef(fd);
4022 if (root->
section.isFunction())
4024 AUTO_TRACE(
"member function: type='{}' scope='{}' name='{}' args='{}' relates='{}' relatesType='{}'"
4025 " file='{}' line={} bodyLine={} #tArgLists={} mGrpId={}"
4026 " spec={} proto={} docFile='{}'",
4041 scope=rname.
left(index);
4042 rname=rname.
mid(index+2);
4051 if (root->
lang==SrcLangExt::CSharp)
4062 size_t memIndex=rname.
rfind(
"::");
4065 if (cd && scope+
"::"==rname.
left(scope.
length()+2))
4071 bool isMember=
false;
4074 size_t ts=rname.
find(
'<');
4075 size_t te=rname.
find(
'>');
4093 isMember=memIndex<ts || memIndex>te;
4133 for (
const auto &imd : *mn)
4146 fullScope.
prepend(parentScope);
4152 if (mnd) nsName = mnd->
name();
4153 if (rnd) rnsName = rnd->
name();
4161 bool sameTemplateArgs =
true;
4162 bool matchingReturnTypes =
true;
4163 bool sameRequiresClause =
true;
4169 matchingReturnTypes =
false;
4173 sameRequiresClause =
false;
4179 sameTemplateArgs =
false;
4182 bool staticsInDifferentFiles =
4185 if (sameTemplateArgs &&
4186 matchingReturnTypes &&
4187 sameRequiresClause &&
4188 !staticsInDifferentFiles &&
4195 if (!root->
groups.empty() && !root->
groups.front().groupname.empty())
4202 found=(mnd && rnd && nsName==rnsName) ||
4203 ((mnd==
nullptr && rnd==
nullptr && mfd!=
nullptr &&
4208 if (!found && gd && gd==md->
getGroupDef() && nsName==rnsName)
4214 AUTO_TRACE_ADD(
"combining function with prototype found={} in namespace '{}'",found,nsName);
4313 else if (rname.
empty())
4316 "Illegal member name found."
4334 for (
const auto &ifmd : *fn)
4338 for (
const auto &immd : *mn)
4354 AUTO_TRACE_ADD(
"Merging related global and member '{}' isFriend={} isRelated={} isFunction={}",
4431 for (
const auto &imdec : *mn)
4439 for (
const auto &imdef : *mn)
4442 if (mdef && mdec!=mdef &&
4462 for (
const auto &imd : *mn)
4478 if (mdef && mdec)
break;
4486 mdec->getOuterScope(),mdec->getFileDef(),mdec->typeString(),
const_cast<ArgumentList*
>(&mdecAl),
4493 mdec->mergeReferences(mdef);
4495 mdec->mergeReferencedBy(mdef);
4512 for (
const auto &imd : *mn)
4523 for (
const auto &irmd : *rmn)
4557 size_t i=qualifiedName.rfind(
"::");
4558 if (i!=std::string::npos)
4565 for (
const auto &imd : *mn)
4591 std::map<std::string,int> templateNames;
4593 for (
const Argument &arg : templateArguments)
4595 static const reg::Ex re(R
"(\a[\w:]*)");
4598 for (; it!=
end ; ++it)
4600 const auto &match = *it;
4601 std::string n = match.str();
4602 if (n==arg.name.str())
4604 if (templateNames.find(n)==templateNames.end())
4606 templateNames.emplace(n,count);
4611 return templateNames;
4626 if (context && cd!=context)
4631 if (result==
nullptr)
4636 if (result==
nullptr)
4665 for (
auto &mi : *mni)
4673 if (!typedefValue.
empty())
4675 type = typedefValue;
4694 usedClassName = typeCd->
name();
4704 if (templateNames.empty())
4708 BaseInfo bi(usedName,Protection::Public,Specifier::Normal);
4713 if (arg.name==usedName)
4717 if (usedCd==
nullptr)
4768 if (!found && !type.
empty())
4827 if (templateNames.empty())
4843 bool b =
Config_getBool(HIDE_UNDOC_RELATIONS) ? true : isArtificial;
4865 AUTO_TRACE(
"Derived from template '{}' with parameters '{}' isArtificial={}",
4866 templateClass->
name(),templSpec,isArtificial);
4869 bool existingClass = templSpec==tempArgsStr;
4870 if (existingClass)
return;
4872 bool freshInstance=
false;
4889 for (
auto it=it_pair.first ; it!=it_pair.second ; ++it)
4891 const Entry *templateRoot = it->second;
4892 AUTO_TRACE_ADD(
"template root found '{}' templSpec='{}'",templateRoot->
name,templSpec);
4898 isArtificial,templArgs.get(),templateNames);
4922 templateClassName,
true,
true);
4923 AUTO_TRACE_ADD(
"templateClassName={} baseClass={}",templateClassName,baseClass?baseClass->
name():
"<none>");
4952 if (name.
empty())
return 0;
4953 int l =
static_cast<int>(name.
length());
4959 while (count>0 && i>=0)
4964 case '>':
if (!insideQuote) count++;
break;
4965 case '<':
if (!insideQuote) count--;
break;
4966 case '\'':
if (!insideQuote) insideQuote=c;
4967 else if (insideQuote==c && (i<0 || name[i]!=
'\\')) insideQuote=0;
4969 case '"':
if (!insideQuote) insideQuote=c;
4970 else if (insideQuote==c && (i<0 || name[i]!=
'\\')) insideQuote=0;
4990 AUTO_TRACE(
"name={} base={} isArtificial={} mode={}",cd->
name(),bi->
name,isArtificial,(
int)mode);
4993 bool explicitGlobalScope=
false;
4996 biName=biName.
mid(2);
4997 explicitGlobalScope=
true;
5001 bool lastParent=
false;
5006 int scopeOffset=explicitGlobalScope ? 0 :
static_cast<int>(scopeName.
length());
5015 baseClassName.
prepend(scopeName.
left(scopeOffset)+
"::");
5017 if (root->
lang==SrcLangExt::CSharp)
5044 || explicitGlobalScope
5047 || (root->
lang==SrcLangExt::IDL &&
5048 (root->
section.isExportedInterface() ||
5049 root->
section.isIncludedService()))
5052 AUTO_TRACE_ADD(
"class relation '{}' inherited/used by '{}' found prot={} virt={} templSpec='{}'",
5053 baseClassName, root->
name, bi->
prot, bi->
virt, templSpec);
5056 size_t si=baseClassName.
rfind(
"::",i);
5058 if (baseClass==
nullptr &&
static_cast<size_t>(i)!=baseClassName.
length())
5068 baseClassName = baseClassName.
left(i)+baseClassName.
mid(e);
5079 else if (baseClass && !templSpec.
empty())
5090 baseClass = templClass;
5108 found=baseClass!=
nullptr && baseClass!=cd;
5118 found = baseClass!=
nullptr && baseClass!=cd;
5130 found = baseClass!=
nullptr && baseClass!=cd;
5133 bool isATemplateArgument = templateNames.find(biName.
str())!=templateNames.end();
5138 AUTO_TRACE_ADD(
"Documented base class '{}' templSpec='{}'",biName,templSpec);
5156 if (baseClassTypeDef==
nullptr)
5166 if (baseClassTypeDef)
5175 AUTO_TRACE_ADD(
"insertBaseClass name={} prot={} virt={} templSpec={}",usedName,prot,bi->
virt,templSpec);
5183 "Detected potential recursive class relation "
5184 "between class {} and base class {}!",
5191 else if (mode==
Undocumented && (scopeOffset==0 || isATemplateArgument))
5193 AUTO_TRACE_ADD(
"New undocumented base class '{}' baseClassName='{}' templSpec='{}' isArtificial={}",
5194 biName,baseClassName,templSpec,isArtificial);
5196 if (isATemplateArgument)
5199 if (baseClass==
nullptr)
5218 if (baseClass==
nullptr)
5229 si = baseClassName.
rfind(
"::");
5245 biName=
"<"+biName.
left(biName.
length()-2)+
">";
5249 AUTO_TRACE_ADD(
"insertBaseClass name={} prot={} virt={} templSpec={}",biName,bi->
prot,bi->
virt,templSpec);
5259 if (scope!=baseClass)
5285 "Detected potential recursive class relation "
5286 "between class {} and base class {}!",
5287 root->
name,baseClassName
5300 size_t o = scopeName.
rfind(
"::",scopeOffset-1);
5304 }
while (scopeOffset>=0);
5306 if (parentNode==
nullptr)
5312 parentNode=parentNode->
parent();
5314 }
while (lastParent);
5334 bool hasExtends = !root->
extends.empty();
5335 if (hasExtends)
return true;
5362 if (root->
lang==SrcLangExt::CSharp)
5368 bName = bName.
left(i);
5433 if (!nd->hasDocumentation())
5436 nd->getLanguage() == SrcLangExt::Fortran) &&
5440 warn_undoc(nd->getDefFileName(),nd->getDefLine(),
"{} {} is not documented.",
5441 nd->getLanguage() == SrcLangExt::Fortran ?
"Module" :
"Namespace",
5491 DString templSpec = ti.templSpec;
5505 for (
const auto &tn_kv : templateNames)
5507 size_t templIndex = tn_kv.second;
5509 bool hasActArg=
false;
5510 if (templIndex<templArgs->size())
5512 actArg=templArgs->at(templIndex);
5516 baseClassNames.find(actArg.
type.
str())!=baseClassNames.end() &&
5517 actualTemplateNames.find(actArg.
type.
str())==actualTemplateNames.end()
5520 actualTemplateNames.emplace(actArg.
type.
str(),
static_cast<int>(templIndex));
5555 for (
const auto &fd : *fn)
5557 fd->computeAnchors();
5570 gd->computeAnchors();
5577template<
typename Func>
5600 for (
const auto &fd : *fn)
5673 if (md==
nullptr)
return;
5674 AUTO_TRACE(
"scope='{}' name='{}' args='{}' funcDecl='{}' mSpec={}",
5689 fullName = cd->
name();
5691 fullName = nd->
name();
5693 if (!fullName.
empty()) fullName+=
"::";
5694 fullName+=md->
name();
5799 "member {} belongs to two different groups. The second one found here will be ignored.",
5837 return allowNoGroup;
5840 for (
const auto &g : root->
groups)
5842 if (g.groupname == gd->
name())
5865 AUTO_TRACE(
"namespace='{}' type='{}' name='{}' tempArg='{}' decl='{}'",namespaceName,type,name,tempArg,decl);
5867 if (n.
empty())
return false;
5879 for (
const auto &md : *mn)
5890 if (md->isAlias() && md->getOuterScope() &&
5897 nd = md->getNamespaceDef();
5901 size_t enumNamePos=0;
5902 if (nd && md->isEnumValue() && (enumNamePos=namespaceName.
rfind(
"::"))!=
DString::npos)
5904 DString enumName = namespaceName.
mid(enumNamePos+2);
5905 if (namespaceName.
left(enumNamePos)==nd->
name())
5910 for (
const auto &emd : *enumMn)
5912 found = emd->isStrong() && md->getEnumScope()==emd.get();
5926 else if (nd==
nullptr && md->isEnumValue())
5931 for (
const auto &emd : *enumMn)
5933 found = emd->isStrong() && md->getEnumScope()==emd.get();
5956 if ((namespaceName.
empty() && nd==
nullptr) ||
5957 (nd && nd->
name()==namespaceName) ||
5961 AUTO_TRACE_ADD(
"Try to add member '{}' to scope '{}'",md->name(),namespaceName);
5969 md->isVariable() || md->isTypedef() ||
5970 matchArguments2(md->getOuterScope(),md->getFileDef(),md->typeString(),&mdAl,
5977 if (matching && !root->
tArgLists.empty())
5996 if (matching && md->isStatic() &&
5997 md->getDefFileName()!=root->
fileName &&
6005 if (!md->templateArguments().empty() && !root->
tArgLists.empty())
6010 if (md->templateArguments().size()!=root->
tArgLists.back().size() ||
6011 md->typeString()!=type ||
6012 md->requiresClause()!=root->
req)
6028 if (!found && root->
relatesType!=RelatesType::Duplicate && root->
section.isFunction())
6032 DString warnMsg =
"no matching file member found for \n"+fullFuncDecl;
6035 warnMsg+=
"\nPossible candidates:";
6036 for (
const auto &md : *mn)
6040 warnMsg+=
"' " +
warn_line(md->getDefFileName(),md->getDefLine());
6048 if (root->
type!=
"friend class" &&
6049 root->
type!=
"friend struct" &&
6050 root->
type!=
"friend union" &&
6051 root->
type!=
"friend" &&
6057 "documented symbol '{}' was not declared or defined.",
qPrint(decl)
6069 auto srcIt = srcTempArgLists.begin();
6070 auto dstIt = dstTempArgLists.begin();
6071 while (srcIt!=srcTempArgLists.end() && dstIt!=dstTempArgLists.end())
6073 if ((*srcIt).size()!=(*dstIt).size())
return true;
6087 result = cd->templateArguments().hasParameters() || cd->templateMaster()!=
nullptr ||
6097 const std::string &src
6101 static const reg::Ex re(R
"(\a\w*)");
6106 for (; it!=
end ; ++it)
6108 const auto &match = *it;
6109 size_t i = match.position();
6110 size_t l = match.length();
6112 dst+=src.substr(p,i-p);
6113 std::string name=match.str();
6115 auto srcIt = srcTempArgLists.begin();
6116 auto dstIt = dstTempArgLists.begin();
6117 while (srcIt!=srcTempArgLists.end() && !found)
6120 std::vector<Argument>::const_iterator tdaIt;
6121 if (dstIt!=dstTempArgLists.end())
6124 tdaIt = tdAli->
begin();
6129 for (
auto tsaIt = tsaLi.
begin(); tsaIt!=tsaLi.
end() && !found; ++tsaIt)
6133 if (tdAli && tdaIt!=tdAli->
end())
6149 else if (tdaType.
startsWith(
"typename ")) vc=9;
6152 tdaName = tdaType.
mid(vc);
6154 if (!tdaName.
empty())
6185 auto dstIt = dst.
begin();
6190 if (dstIt == dst.
end())
6194 da.
array = dstArray;
6202 da.
array = dstArray;
6210 srcTempArgLists,dstTempArgLists,
6236 funcType,funcName,funcArgs,exceptions,
6240 mmd->setTagInfo(root->
tagInfo());
6241 mmd->setLanguage(root->
lang);
6242 mmd->setId(root->
id);
6243 mmd->makeImplementationDetail();
6244 mmd->setMemberClass(cd);
6245 mmd->setDefinition(funcDecl);
6251 mmd->setDocsForDefinition(!root->
proto);
6253 mmd->addSectionsToDefinition(root->
anchors);
6257 mmd->setMemberSpecifiers(spec);
6258 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6259 mmd->setMemberGroupId(root->
mGrpId);
6262 mmd->setRefItems(root->
sli);
6263 mmd->setRequirementReferences(root->
rqli);
6299 bool memFound=
false;
6300 for (
const auto &imd : *mn)
6303 if (md==
nullptr)
continue;
6305 if (cd==
nullptr)
continue;
6317 size_t enumNamePos=0;
6320 DString enumName = className.
mid(enumNamePos+2);
6322 if (!namespaceName.
empty()) fullScope.
prepend(namespaceName+
"::");
6323 if (fullScope==cd->
name())
6329 for (
const auto &emd : *enumMn)
6331 memFound = emd->isStrong() && md->
getEnumScope()==emd.get();
6337 if (memFound)
break;
6342 if (memFound)
break;
6360 if (!templAl.
empty())
6362 declTemplArgs.push_back(templAl);
6370 bool substDone=
false;
6377 if (declTemplArgs.size()>0 && declTemplArgs.size()==defTemplArgs.size())
6400 AUTO_TRACE_ADD(
"matching '{}'<=>'{}' className='{}' namespaceName='{}' result={}",
6429 AUTO_TRACE_ADD(
"Comparing return types '{}'<->'{}' #args {}<->{}",
6437 else if (defTemplArgs.size()>declTemplArgs.size())
6439 AUTO_TRACE_ADD(
"Different number of template arguments {} vs {}",defTemplArgs.size(),declTemplArgs.size());
6445 bool rootIsUserDoc = root->
section.isMemberDoc();
6448 bool classOrMdIsTemplate = mdIsTemplate || classIsTemplate;
6449 bool rootIsTemplate = !root->
tArgLists.empty();
6451 if (!rootIsUserDoc &&
6452 (mdIsTemplate || rootIsTemplate) &&
6453 ((classOrMdIsTemplate && !rootIsTemplate) || (!classOrMdIsTemplate && rootIsTemplate))
6458 AUTO_TRACE_ADD(
"Comparing return types: template v.s. non-template");
6462 AUTO_TRACE_ADD(
"Match results of matchArguments2='{}' substDone='{}'",matching,substDone);
6473 if (!funcTempList.
empty() &&
6493 else if (cd && cd!=tcd)
6499 if (memFound)
break;
6503 addLocalObjCMethod(root,scopeName,funcType,funcName,funcArgs,exceptions,funcDecl,spec);
6506 if (count==0 && !(isFriend && funcType==
"class"))
6509 const ClassDef *ecd =
nullptr, *ucd =
nullptr;
6510 MemberDef *emd =
nullptr, *umd =
nullptr;
6512 for (
const auto &md : *mn)
6534 AUTO_TRACE_ADD(
"new candidate className='{}' scope='{}' args='{}': exact match",
6535 className,ccd->
name(),md->argsString());
6541 AUTO_TRACE_ADD(
"new candidate className='{}' scope='{}' args='{}': no match",
6542 className,ccd->
name(),md->argsString());
6547 bool strictProtoMatching =
Config_getBool(STRICT_PROTO_MATCHING);
6548 if (!strictProtoMatching)
6550 if (candidates==1 && ucd && umd)
6557 else if (candidates>1 && ecd && emd)
6568 if (noMatchCount>1) warnMsg+=
"uniquely ";
6569 warnMsg+=
"matching class member found for \n";
6573 warnMsg+=
" template ";
6578 DString fullFuncDecl=funcDecl;
6582 warnMsg+=fullFuncDecl;
6584 if (candidates>0 || noMatchCount>=1)
6586 warnMsg+=
"\nPossible candidates:";
6592 for (
const auto &md : *mn)
6594 const ClassDef *cd=md->getClassDef();
6608 warnMsg+=
"template ";
6613 if (!md->typeString().empty())
6615 warnMsg+=md->typeString();
6619 if (!qScope.
empty())
6620 warnMsg+=qScope+
"::"+md->name();
6621 warnMsg+=md->argsString();
6622 warnMsg+=
"' " +
warn_line(md->getDefFileName(),md->getDefLine());
6643 AUTO_TRACE(
"funcType={} funcName={} funcArgs={} funcDecl={} spec={}",funcType,funcName,funcArgs,funcDecl,spec);
6645 for (
const auto &md : *mn)
6647 if (md->getClassDef()==cd)
6659 funcType,funcName,funcArgs,exceptions,
6665 mmd->setTagInfo(root->
tagInfo());
6666 mmd->setLanguage(root->
lang);
6667 mmd->setId(root->
id);
6668 mmd->setMemberClass(cd);
6669 mmd->setTemplateSpecialization(
true);
6671 mmd->setDefinition(funcDecl);
6677 mmd->setDocsForDefinition(!root->
proto);
6679 mmd->addSectionsToDefinition(root->
anchors);
6683 mmd->setMemberSpecifiers(spec);
6684 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6685 mmd->setMemberGroupId(root->
mGrpId);
6687 mmd->setRefItems(root->
sli);
6688 mmd->setRequirementReferences(root->
rqli);
6702 bool sameClass=
false;
6707 [](
const auto &md1,
const auto &md2)
6708 { return md1->getClassDef()->name()==md2->getClassDef()->name(); });
6714 if (cd==
nullptr)
return;
6717 if (root->
mtype==MethodTypes::Signal) mtype=MemberType::Signal;
6718 else if (root->
mtype==MethodTypes::Slot) mtype=MemberType::Slot;
6719 else if (root->
mtype==MethodTypes::DCOP) mtype=MemberType::DCOP;
6722 std::unique_ptr<ArgumentList> tArgList =
6727 funcType,funcName,funcArgs,exceptions,
6731 mmd->setTagInfo(root->
tagInfo());
6732 mmd->setLanguage(root->
lang);
6733 mmd->setId(root->
id);
6735 mmd->setMemberClass(cd);
6736 mmd->setDefinition(funcDecl);
6745 mmd->setDocsForDefinition(!root->
proto);
6747 mmd->addSectionsToDefinition(root->
anchors);
6751 mmd->setMemberSpecifiers(spec);
6752 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6753 mmd->setMemberGroupId(root->
mGrpId);
6756 mmd->setRefItems(root->
sli);
6757 mmd->setRequirementReferences(root->
rqli);
6815 AUTO_TRACE(
"root='{}' funcDecl='{}' related='{}' overload={} isFunc={} mGrpId={} #tArgList={} spec={} lang={}",
6828 bool isRelated=
false;
6829 bool isMemberOf=
false;
6830 bool isFriend=
false;
6843 spec.setInline(
true);
6848 spec.setExplicit(
true);
6853 spec.setMutable(
true);
6858 spec.setThreadLocal(
true);
6875 if (!funcDecl.
empty() && funcDecl[0]!=
' ') funcDecl.
prepend(
" ");
6887 if (isFriend && funcDecl.
startsWith(
"class "))
6890 funcDecl=funcDecl.
mid(6);
6891 funcName = funcDecl;
6893 else if (isFriend && funcDecl.
startsWith(
"struct "))
6895 funcDecl=funcDecl.
mid(7);
6896 funcName = funcDecl;
6902 funcArgs,funcTempList,exceptions
6910 AUTO_TRACE_ADD(
"scopeName='{}' className='{}' namespaceName='{}' funcType='{}' funcName='{}' funcArgs='{}'",
6911 scopeName,className,namespaceName,funcType,funcName,funcArgs);
6912 if (!relates.
empty())
6915 isMemberOf=(root->
relatesType == RelatesType::MemberOf);
6922 scopeName = relates;
6932 if (!scopeName.
empty() &&
6935 scopeName = joinedName;
6949 DString joinedName = fnd->name()+
"::"+scopeName;
6952 scopeName=joinedName;
6979 AUTO_TRACE_ADD(
"scopeName='{}' className='{}' namespaceName='{}'",scopeName,className,namespaceName);
6984 if (!namespaceName.
empty())
6986 if (className.
empty())
6988 scopeName=namespaceName;
6990 else if (!relates.
empty() ||
6993 scopeName=namespaceName+
"::"+className;
6997 scopeName=className;
7000 else if (!className.
empty())
7002 scopeName=className;
7006 DString tempScopeName=scopeName;
7010 if (funcSpec.
empty())
7012 uint32_t argListIndex=0;
7017 tempScopeName=scopeName+funcSpec;
7025 if (!scopeName.
empty() && !isRelated && !isFriend && !
Config_getBool(HIDE_SCOPE_NAMES) && root->
lang!=SrcLangExt::Python)
7027 if (!funcType.
empty())
7031 funcDecl=funcType+
" "+tempScopeName+
"::"+funcName+funcTempList;
7035 funcDecl=funcType+
" "+tempScopeName+
"::"+funcName+funcArgs;
7042 funcDecl=tempScopeName+
"::"+funcName+funcTempList;
7046 funcDecl=tempScopeName+
"::"+funcName+funcArgs;
7052 if (!funcType.
empty())
7056 funcDecl=funcType+
" "+funcName+funcTempList;
7060 funcDecl=funcType+
" "+funcName+funcArgs;
7067 funcDecl=funcName+funcTempList;
7071 funcDecl=funcName+funcArgs;
7076 if (funcType==
"template class" && !funcTempList.
empty())
7079 AUTO_TRACE_ADD(
"Parse results: namespaceName='{}' className=`{}` funcType='{}' funcSpec='{}' "
7080 " funcName='{}' funcArgs='{}' funcTempList='{}' funcDecl='{}' relates='{}'"
7081 " exceptions='{}' isRelated={} isMemberOf={} isFriend={} isFunc={}",
7082 namespaceName, className, funcType, funcSpec,
7083 funcName, funcArgs, funcTempList, funcDecl, relates,
7084 exceptions, isRelated, isMemberOf, isFriend, isFunc);
7086 if (!funcName.
empty())
7090 bool strongEnum =
false;
7094 for (
const auto &imd : *mn)
7105 if (!namespaceName.
empty())
7107 namespaceName+=
"::"+className;
7111 namespaceName=className;
7119 funcName =
substitute(funcName,className+
"::",
"");
7122 if (!funcTempList.
empty())
7130 if (!isRelated && !strongEnum && mn)
7133 if (!className.
empty())
7135 if (funcSpec.
empty())
7138 funcArgs,funcTempList,exceptions,
7139 type,args,isFriend,spec,relates,funcDecl,overloaded,isFunc);
7151 else if (overloaded)
7153 addOverloaded(root,mn,funcType,funcName,funcArgs,funcDecl,exceptions,spec);
7157 if (!
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec))
7159 DString fullFuncDecl=funcDecl;
7162 "Cannot determine class for function\n{}",
7168 else if (isRelated && !relates.
empty())
7170 AUTO_TRACE_ADD(
"related function scopeName='{}' className='{}'",scopeName,className);
7171 if (className.
empty()) className=relates;
7175 bool newMember=
true;
7181 for (
const auto &imd : *mn)
7215 mn->
push_back(std::move(mdDefineTaken));
7229 for (
const auto &irmd : *mn)
7250 addMemberDocs(root,rmd_found,funcDecl,
nullptr,overloaded,spec);
7258 switch (root->
mtype)
7260 case MethodTypes::Method: mtype = MemberType::Function;
break;
7261 case MethodTypes::Signal: mtype = MemberType::Signal;
break;
7262 case MethodTypes::Slot: mtype = MemberType::Slot;
break;
7263 case MethodTypes::DCOP: mtype = MemberType::DCOP;
break;
7264 case MethodTypes::Property: mtype = MemberType::Property;
break;
7265 case MethodTypes::Event: mtype = MemberType::Event;
break;
7279 funcType,funcName,funcArgs,exceptions,
7282 isMemberOf ? Relationship::Foreign : Relationship::Related,
7302 mmd->setDefinitionTemplateParameterLists(root->
tArgLists);
7304 mmd->setTagInfo(root->
tagInfo());
7318 for (
const auto &irmd : *rmn)
7349 mmd->setBodyDef(fd);
7356 mmd->setMemberClass(cd);
7357 mmd->setMemberSpecifiers(spec);
7358 mmd->setVhdlSpecifiers(root->
vhdlSpec);
7359 mmd->setDefinition(funcDecl);
7364 mmd->setDocsForDefinition(!root->
proto);
7367 mmd->addSectionsToDefinition(root->
anchors);
7368 mmd->setMemberGroupId(root->
mGrpId);
7369 mmd->setLanguage(root->
lang);
7370 mmd->setId(root->
id);
7374 mmd->setRefItems(root->
sli);
7375 mmd->setRequirementReferences(root->
rqli);
7376 if (root->
relatesType==RelatesType::Duplicate) mmd->setRelatedAlso(cd);
7384 if (!
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec))
7386 DString fullFuncDecl=funcDecl;
7389 "Cannot determine file/namespace for relatedalso function\n{}",
7403 addLocalObjCMethod(root,scopeName,funcType,funcName,funcArgs,exceptions,funcDecl,spec);
7407 bool globMem =
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec);
7408 if (className.
empty() && !globMem)
7412 else if (!className.
empty() && !globMem)
7415 "member '{}' of class '{}' cannot be found",
7416 funcName,className);
7434 AUTO_TRACE(
"root->type='{}' root->inside='{}' root->name='{}' root->args='{}' section={} root->spec={} root->mGrpId={}",
7449 type=type.
left(i+l);
7460 if (root->
section.isMemberDoc())
7486 else if (root->
section.isOverloadDoc())
7500 (root->
section.isVariable() &&
7512 if (type==
"friend class" || type==
"friend struct" ||
7513 type==
"friend union")
7519 type+
" "+root->
name,
7523 else if (!type.
empty())
7552 else if (root->
section.isVariableDoc())
7564 else if (root->
section.isExportedInterface() ||
7565 root->
section.isIncludedService())
7571 type +
" " + root->
name,
7584 if (root->
section.isMemberDoc() ||
7585 root->
section.isOverloadDoc() ||
7588 root->
section.isVariableDoc() ||
7590 root->
section.isIncludedService() ||
7591 root->
section.isExportedInterface()
7601 for (
const auto &e : root->
children())
7603 if (!e->section.isEnum())
7615 for (
const auto &objCImpl : root->
children())
7617 if (objCImpl->section.isObjcImpl())
7619 for (
const auto &objCMethod : objCImpl->children())
7621 if (objCMethod->section.isFunction())
7625 objCMethod->relates,
7628 objCMethod->type+
" "+objCImpl->name+
"::"+objCMethod->name+
" "+objCMethod->args,
7630 objCMethod->section=EntryType::makeEmpty();
7649 bool isGlobal =
false;
7650 bool isRelated =
false;
7651 bool isMemberOf =
false;
7660 if (root->
lang==SrcLangExt::CSharp)
7683 isMemberOf=(root->
relatesType==RelatesType::MemberOf);
7691 if (cd && !name.
empty())
7718 isMemberOf ? Relationship::Foreign : isRelated ? Relationship::Related : Relationship::Member,
7719 MemberType::Enumeration,
7722 mmd->setTagInfo(root->
tagInfo());
7723 mmd->setLanguage(root->
lang);
7724 mmd->setId(root->
id);
7725 if (!isGlobal) mmd->setMemberClass(cd);
else mmd->setFileDef(fd);
7727 mmd->setBodyDef(root->
fileDef());
7728 mmd->setMemberSpecifiers(root->
spec);
7729 mmd->setVhdlSpecifiers(root->
vhdlSpec);
7730 mmd->setEnumBaseType(root->
args);
7733 mmd->addSectionsToDefinition(root->
anchors);
7734 mmd->setMemberGroupId(root->
mGrpId);
7738 mmd->setRefItems(root->
sli);
7739 mmd->setRequirementReferences(root->
rqli);
7744 if (!baseType.
empty())
7753 mmd->setDefinition(name+baseType);
7757 mmd->setDefinition(nd->
name()+
"::"+name+baseType);
7761 mmd->setNamespace(nd);
7768 if (isGlobal && (nd==
nullptr || !nd->
isAnonymous()))
7770 if (!defSet) mmd->setDefinition(name+baseType);
7771 if (fd==
nullptr && root->
parent())
7777 mmd->setFileDef(fd);
7785 mmd->setDefinition(name+baseType);
7789 mmd->setDefinition(cd->
name()+
"::"+name+baseType);
7795 mmd->setDocsForDefinition(!root->
proto);
7825 bool isGlobal =
false;
7826 bool isRelated =
false;
7835 if (root->
lang==SrcLangExt::CSharp)
7850 if (root->
lang==SrcLangExt::CSharp)
7869 if (cd && !name.
empty())
7896 struct EnumValueInfo
7898 EnumValueInfo(
const DString &n,std::unique_ptr<MemberDef> &&md) :
7899 name(n), member(std::move(md)) {}
7901 std::unique_ptr<MemberDef> member;
7903 std::vector< EnumValueInfo > extraMembers;
7905 for (
const auto &imd : *mn)
7912 for (
const auto &e : root->
children())
7915 bool isJavaLike = sle==SrcLangExt::CSharp || sle==SrcLangExt::Java || sle==SrcLangExt::XML;
7916 if ( isJavaLike || root->
spec.isStrong())
7918 if (sle == SrcLangExt::Cpp && e->section.isDefine())
continue;
7925 if (
size_t i = qualifiedName.
rfind(
"::"); i!=
DString::npos && sle==SrcLangExt::CSharp)
7931 qualifiedName=
substitute(qualifiedName,
"::",
".");
7935 DString fileName = e->fileName;
7936 if (fileName.
empty() && e->tagInfo())
7938 fileName = e->tagInfo()->tagName;
7942 fileName,e->startLine,e->startColumn,
7943 e->type,e->name,e->args,
DString(),
7944 e->protection, Specifier::Normal,e->isStatic,Relationship::Member,
7951 fmmd->setNamespace(mnd);
7955 fmmd->setTagInfo(e->tagInfo());
7956 fmmd->setLanguage(e->lang);
7957 fmmd->setBodySegment(e->startLine,e->bodyLine,e->endBodyLine);
7958 fmmd->setBodyDef(e->fileDef());
7960 fmmd->setDocumentation(e->doc,e->docFile,e->docLine);
7961 fmmd->setBriefDescription(e->brief,e->briefFile,e->briefLine);
7962 fmmd->addSectionsToDefinition(e->anchors);
7963 fmmd->setInitializer(e->initializer.str());
7964 fmmd->setMaxInitLines(e->initLines);
7965 fmmd->setMemberGroupId(e->mGrpId);
7966 fmmd->setExplicitExternal(e->explicitExternal,fileName,e->startLine,e->startColumn);
7967 fmmd->setRefItems(e->sli);
7968 fmmd->setRequirementReferences(e->rqli);
7971 fmmd->setEnumScope(md,
true);
7972 extraMembers.emplace_back(e->name,std::move(fmd));
7981 if (!e->name.empty() && (fmn=emnsd->
find(e->name)))
7984 for (
const auto &ifmd : *fmn)
8015 else if (isRelated && cd)
8047 for (
auto &e : extraMembers)
8093 if (gd==
nullptr && !root->
groups.empty())
8107 for (
const auto &g : root->
groups)
8126 "Found non-existing group '{}' for the command '{}', ignoring command",
8140 if (root->
section.isEnumDoc() &&
8165 AUTO_TRACE(
"Found docs for enum with name '{}' and scope '{}' in context '{}' cd='{}', nd='{}' fd='{}'",
8179 for (
const auto &imd : *mn)
8194 else if (cd==
nullptr && mcd==
nullptr && nd!=
nullptr && mnd==nd)
8201 else if (cd==
nullptr && nd==
nullptr && mcd==
nullptr && mnd==
nullptr && fd==mfd)
8226 for (
const auto &mn : mnsd)
8229 for (
const auto &imd : *mn)
8234 int documentedEnumValues=0;
8238 if (fmd->isLinkableInProject()) documentedEnumValues++;
8264 for (
const auto &md : *mn)
8266 index.addClassMemberNameToIndex(md.get());
8267 if (md->getModuleDef())
8269 index.addModuleMemberNameToIndex(md.get());
8277 for (
const auto &md : *mn)
8279 if (md->getNamespaceDef())
8281 index.addNamespaceMemberNameToIndex(md.get());
8285 index.addFileMemberNameToIndex(md.get());
8287 if (md->getModuleDef())
8289 index.addModuleMemberNameToIndex(md.get());
8294 index.sortMemberIndexLists();
8303 if (cd->isLinkableInProject())
8316 if (cd->isLinkableInProject())
8329 if (nd->isLinkableInProject())
8342 for (
const auto &fd : *fn)
8358 std::string s = title.str();
8359 static const reg::Ex re(R
"(\a[\w-]*)");
8362 for (; it!=
end ; ++it)
8364 const auto &match = *it;
8365 std::string matchStr = match.str();
8373 if (gd->isLinkableInProject())
8375 addWordsForTitle(gd.get(),gd->anchor(),gd->groupTitle());
8381 if (pd->isLinkableInProject())
8383 addWordsForTitle(pd.get(),pd->anchor(),pd->title());
8392 auto addMemberToSearchIndex = [](
const MemberDef *md)
8398 DString qn=md->qualifiedName();
8403 if (md->getClassDef())
8407 if (md->getNamespaceDef())
8418 if (md->getGroupDef()) scope = md->getGroupDef();
8419 else if (md->getClassDef()) scope = md->getClassDef();
8420 else if (md->getNamespaceDef()) scope = md->getNamespaceDef();
8421 else if (md->getFileDef()) scope = md->getFileDef();
8425 auto addMemberToIndices = [addMemberToSearchIndex,getScope](
const MemberDef *md)
8427 if (md->isLinkableInProject())
8429 if (!(md->isEnumerate() && md->isAnonymous()))
8432 addMemberToSearchIndex(md);
8434 if (md->isEnumerate())
8436 for (
const auto &fmd : md->enumFieldList())
8439 addMemberToSearchIndex(fmd);
8449 for (
const auto &md : *mn)
8451 addMemberToIndices(md.get());
8458 for (
const auto &md : *mn)
8460 addMemberToIndices(md.get());
8473 for (
const auto &imd : *mn)
8486 for (
const auto &imd : *mn)
8503 for (
const auto &imd : *mn)
8512 const auto &bmni = bmn.
find(mn->memberName());
8515 for (
const auto &ibmd : *bmni)
8523 lang==SrcLangExt::Python ||
8524 lang==SrcLangExt::Java ||
8525 lang==SrcLangExt::PHP ||
8536 lang==SrcLangExt::Python ||
8543 if (lang==SrcLangExt::Python && md->
name().
startsWith(
"__"))
continue;
8583 if (cd->isLinkable())
8585 for (
const auto &bcd : cd->baseClasses())
8601 for (
const auto &ti : cd->getTemplateInstances())
8626 AUTO_TRACE_ADD(
"merging members of category {} into {}",cd->name(),baseClass->
name());
8641 cd->subClasses().empty() &&
8642 !cd->baseClasses().empty())
8673 msg(
"Generating code for file {}...\n",fd->
docName());
8678 else if (parseSources)
8680 msg(
"Parsing code for file {}...\n",fd->
docName());
8696 for (
const auto &fd : *fn)
8704 for (
const auto &fd : *fn)
8713 clangParser->parse();
8714 processSourceFile(fd.get(),*
g_outputList,clangParser.get());
8716 for (
auto incFile : clangParser->filesInSameTU())
8718 if (filesToProcess.find(incFile)!=filesToProcess.end() &&
8720 processedFiles.
find(incFile)==processedFiles.end())
8727 processSourceFile(ifd,*
g_outputList,clangParser.get());
8728 processedFiles.insert(incFile);
8739 for (
const auto &fd : *fn)
8741 if (processedFiles.find(fd->
absFilePath().
str())==processedFiles.end())
8746 clangParser->parse();
8747 processSourceFile(fd.get(),*
g_outputList,clangParser.get());
8760 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8763 msg(
"Generating code files using {} threads.\n",numThreads);
8764 struct SourceContext
8767 : fd(fd_), generateSourceFile(gen_), ol(ol_) {}
8769 bool generateSourceFile;
8773 std::vector< std::future< std::shared_ptr<SourceContext> > > results;
8776 for (
const auto &fd : *fn)
8779 auto ctx = std::make_shared<SourceContext>(fd.get(),generateSourceFile,*
g_outputList);
8780 auto processFile = [ctx]()
8782 if (ctx->generateSourceFile)
8784 msg(
"Generating code for file {}...\n",ctx->fd->docName());
8788 msg(
"Parsing code for file {}...\n",ctx->fd->docName());
8791 ctx->fd->getAllIncludeFilesRecursively(filesInSameTu);
8792 if (ctx->generateSourceFile)
8794 ctx->fd->writeSourceHeader(ctx->ol);
8795 ctx->fd->writeSourceBody(ctx->ol,
nullptr);
8796 ctx->fd->writeSourceFooter(ctx->ol);
8801 ctx->fd->parseSource(
nullptr);
8805 results.emplace_back(threadPool.
queue(processFile));
8808 for (
auto &f : results)
8817 for (
const auto &fd : *fn)
8837 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8843 : fd(fd_), ol(ol_) {}
8848 std::vector< std::future< std::shared_ptr<DocContext> > > results;
8851 for (
const auto &fd : *fn)
8853 bool doc = fd->isLinkableInProject();
8856 auto ctx = std::make_shared<DocContext>(fd.get(),*
g_outputList);
8857 auto processFile = [ctx]() {
8858 msg(
"Generating docs for file {}...\n",ctx->fd->docName());
8859 ctx->fd->writeDocumentation(ctx->ol);
8862 results.emplace_back(threadPool.
queue(processFile));
8866 for (
auto &f : results)
8875 for (
const auto &fd : *fn)
8877 bool doc = fd->isLinkableInProject();
8880 msg(
"Generating docs for file {}...\n",fd->docName());
8899 const_cast<FileDef*
>(fd)->addSourceRef(cd->getStartDefLine(),cd.get(),
nullptr);
8908 const_cast<FileDef*
>(fd)->addSourceRef(cd->getStartDefLine(),cd.get(),
nullptr);
8917 const_cast<FileDef*
>(fd)->addSourceRef(nd->getStartDefLine(),nd.get(),
nullptr);
8924 for (
const auto &md : *mn)
8933 md->isLinkableInProject() &&
8939 const_cast<FileDef*
>(fd)->addSourceRef(md->getStartDefLine(),md->getOuterScope(),md.get());
8945 for (
const auto &md : *mn)
8955 md->isLinkableInProject() &&
8961 const_cast<FileDef*
>(fd)->addSourceRef(md->getStartDefLine(),md->getOuterScope(),md.get());
8978 for (
const auto &def : it->second)
8981 def.fileName,def.lineNr,def.columnNr,
8982 "#define",def.name,def.args,
DString(),
8983 Protection::Public,Specifier::Normal,
false,Relationship::Member,MemberType::Define,
8987 if (!def.args.empty())
8991 mmd->setInitializer(def.definition);
8992 mmd->setFileDef(def.fileDef);
8993 mmd->setDefinition(
"#define "+def.name);
8998 const MemberList *defMl = def.fileDef->getMemberList(MemberListType::DocDefineMembers());
9007 def.fileDef->insertMember(md.get());
9009 AUTO_TRACE_ADD(
"adding macro {} with definition {}",def.name,def.definition);
9043 for (
const auto &fd : *fn)
9045 fd->sortMemberLists();
9052 gd->sortMemberLists();
9069 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
9073 std::vector < std::future< void > > results;
9077 for (
const auto &def : symList)
9080 if (dm && !
isSymbolHidden(def) && !def->isArtificial() && def->isLinkableInProject())
9082 auto processTooltip = [dm]() {
9085 results.emplace_back(threadPool.
queue(processTooltip));
9090 for (
auto &f : results)
9099 for (
const auto &def : symList)
9102 if (dm && !
isSymbolHidden(def) && !def->isArtificial() && def->isLinkableInProject())
9149 for (
const auto &fd : *fn)
9171 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
9177 : cd(cd_), ol(ol_) {}
9182 std::vector< std::future< std::shared_ptr<DocContext> > > results;
9183 for (
const auto &cd : classList)
9186 if (cd->getOuterScope()==
nullptr ||
9190 auto ctx = std::make_shared<DocContext>(cd,*
g_outputList);
9191 auto processFile = [ctx]()
9193 msg(
"Generating docs for compound {}...\n",ctx->cd->displayName());
9197 if (!ctx->cd->isHidden() && !ctx->cd->isEmbeddedInOuterScope() &&
9198 ctx->cd->isLinkableInProject() && !ctx->cd->isImplicitTemplateInstance())
9200 ctx->cd->writeDocumentation(ctx->ol);
9201 ctx->cd->writeMemberList(ctx->ol);
9205 ctx->cd->writeDocumentationForInnerClasses(ctx->ol);
9208 results.emplace_back(threadPool.
queue(processFile));
9211 for (
auto &f : results)
9218 for (
const auto &cd : classList)
9222 if (cd->getOuterScope()==
nullptr ||
9228 if ( !cd->isHidden() && !cd->isEmbeddedInOuterScope() &&
9229 cd->isLinkableInProject() && !cd->isImplicitTemplateInstance())
9231 msg(
"Generating docs for compound {}...\n",cd->displayName());
9246 for (
const auto &innerCdi : cd->
getClasses())
9251 AUTO_TRACE(
"innerCd={} isLinkable={} isImplicitTemplateInstance={} protectLevelVisible={} embeddedInOuterScope={}",
9260 list.push_back(innerCd);
9268 std::vector<ClassDefMutable*> classList;
9317 for (
const auto &imd : *mn)
9353 for (
const auto &fd : *fn)
9355 fd->combineUsingRelations();
9387 for (
const auto &fd : *fn)
9389 fd->addMembersToMemberGroup();
9404 gd->addMembersToMemberGroup();
9425 for (
const auto &fd : *fn)
9427 fd->distributeMemberGroupDocumentation();
9442 gd->distributeMemberGroupDocumentation();
9472 for (
const auto &fd : *fn)
9474 fd->findSectionsInDocumentation();
9489 gd->findSectionsInDocumentation();
9494 pd->findSectionsInDocumentation();
9499 dd->findSectionsInDocumentation();
9522 for (
const auto &ifmd : *fn)
9536 for (
const auto &imd : *nm)
9567 for (
const auto &imd : *nm)
9587 return fd->absFilePath() == root->
fileName;
9632 Protection::Public,Specifier::Normal,
false,Relationship::Member,MemberType::Define,
9635 mmd->setTagInfo(root->
tagInfo());
9636 mmd->setLanguage(root->
lang);
9648 for (
const auto &md : *mn)
9650 if (md->memberType()==MemberType::Define) count++;
9654 for (
const auto &imd : *mn)
9657 if (md && md->
memberType()==MemberType::Define)
9672 for (
const auto &imd : *mn)
9675 if (md && md->
memberType()==MemberType::Define)
9699 warn(root->
fileName,root->
startLine,
"found documented #define {} but ignoring it because ENABLE_PREPROCESSING is NO.", root->
name);
9713 normalizedName =
substitute(normalizedName,
"\\",
"/");
9716 if (root->
docFile==normalizedName)
9720 normalizedName=normalizedName.
left(lastSlashPos);
9723 if (normalizedName.
at(normalizedName.
length()-1)!=
'/')
9725 normalizedName+=
'/';
9727 DirDef *matchingDir=
nullptr;
9731 if (dir->name().right(normalizedName.
length())==normalizedName)
9736 "\\dir command matches multiple directories.\n"
9737 " Applying the command for directory {}\n"
9738 " Ignoring the command for directory {}",
9739 matchingDir->
name(),dir->name()
9744 matchingDir=dir.get();
9761 warn(root->
fileName,root->
startLine,
"No matching directory found for command \\dir {}",normalizedName);
9770 if (root->
section.isRequirementDoc())
9782 if (root->
section.isPageDoc())
9789 else if (root->
section.isMainpageDoc())
9809 if (root->
section.isMainpageDoc())
9842 else if (si->
lineNr() != -1)
9844 warn(root->
fileName,root->
startLine,
"multiple use of section label '{}' for main page, (first occurrence: {}, line {})",
9849 warn(root->
fileName,root->
startLine,
"multiple use of section label '{}' for main page, (first occurrence: {})",
9866 else if (root->
tagInfo()==
nullptr)
9869 "found more than one \\mainpage comment block! (first occurrence: {}, line {}), Skipping current block!",
9879 if (root->
section.isMainpageDoc())
9903 term(
"page defined {} with label {} is a direct "
9904 "subpage of itself! Please remove this cyclic dependency.\n",
9928 term(
"page defined {} with label {} is a subpage "
9929 "of itself! Please remove this cyclic dependency.\n",
9930 warn_line(pd->docFile(),pd->docLine()),pd->name());
9955 DString label=
"_"+rl->listName();
9956 if (si->label().left(label.
length())==label)
9958 si->setFileName(rl->listName());
9959 si->setGenerated(
true);
9965 if (!si->generated())
9969 if (!si->fileName().empty() &&
9976 if (si->definition())
9983 gd = (
toMemberDef(si->definition()))->getGroupDef();
10013 if (!pd->getGroupDef() && !pd->isReference())
10015 msg(
"Generating docs for page {}...\n",pd->name());
10030 warn(root->
fileName,root->
startLine,
"Example {} was already documented. Ignoring documentation found here.",root->
name);
10058 indentStr.
fill(
' ',indent);
10060 indentStr.
empty()?
"":indentStr,
10065 for (
const auto &e : root->
children())
10083 si->label(),si->fileName(),si->title(),si->type().level(),si->ref());
10097 msg(
"Generating docs for example {}...\n",pd->name());
10099 if (lang != SrcLangExt::Unknown)
10103 intf->resetCodeParserState();
10105 DString n=pd->getOutputFileBase();
10112 if (pd->showLineNo())
10114 lineNoOptStr=
"{lineno}";
10120 (pd->briefDescription().empty()?
"":pd->briefDescription()+
"\n\n")+
10121 pd->documentation()+
"\n\n\\include"+lineNoOptStr+
" "+pd->name(),
10123 .setIndexWords(
true)
10124 .setExample(pd->name()));
10137 if (!gd->isReference())
10149 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10155 : cdm(cdm_), ol(ol_) {}
10160 std::vector< std::future< std::shared_ptr<DocContext> > > results;
10162 for (
const auto &cd : classList)
10167 auto ctx = std::make_shared<DocContext>(cdm,*
g_outputList);
10168 auto processFile = [ctx]()
10170 if ( ( ctx->cdm->isLinkableInProject() &&
10171 !ctx->cdm->isImplicitTemplateInstance()
10174 && !ctx->cdm->isHidden() && !ctx->cdm->isEmbeddedInOuterScope()
10177 msg(
"Generating docs for compound {}...\n",ctx->cdm->displayName());
10178 ctx->cdm->writeDocumentation(ctx->ol);
10179 ctx->cdm->writeMemberList(ctx->ol);
10181 ctx->cdm->writeDocumentationForInnerClasses(ctx->ol);
10184 results.emplace_back(threadPool.
queue(processFile));
10188 for (
auto &f : results)
10190 auto ctx = f.get();
10196 for (
const auto &cd : classList)
10201 if ( ( cd->isLinkableInProject() &&
10202 !cd->isImplicitTemplateInstance()
10205 && !cd->isHidden() && !cd->isEmbeddedInOuterScope()
10208 msg(
"Generating docs for compound {}...\n",cd->displayName());
10222 for (
const auto &cd : conceptList)
10227 msg(
"Generating docs for concept {}...\n",cd->name());
10242 if (nd->isLinkableInProject())
10247 msg(
"Generating docs for namespace {}\n",nd->displayName());
10285 DString cmd=qhgLocation+
" -v 2>&1";
10290 err(
"could not execute {}\n",qhgLocation);
10294 const size_t bufSize = 1024;
10295 char inBuf[bufSize+1];
10296 size_t numRead=fread(inBuf,1,bufSize,f);
10297 inBuf[numRead] =
'\0';
10302 static const reg::Ex versionReg(R
"(Qt (\d+)\.(\d+)\.(\d+))");
10304 std::string s = inBuf;
10307 qtVersion = 10000*
DString(match[1].str()).toInt() +
10308 100*
DString(match[2].str()).toInt() +
10309 DString(match[3].str()).toInt();
10311 if (qtVersion>0 && (qtVersion<60000 || qtVersion >= 60205))
10320 err(
"could not execute {}\n",qhgLocation);
10324 std::string output;
10325 while ((numRead=fread(inBuf,1,bufSize,f))>0)
10327 inBuf[numRead] =
'\0';
10350 if (!dotPath.
empty())
10359 warn_uncond(
"the dot tool could not be found as '{}'\n",dotPath);
10365 size_t l=dotPath.
length();
10366 for (
size_t i=0;i<l;i++)
if (dotPath.
at(i)==
'/') dotPath.
at(i)=
'\\';
10385 bool updateOnly=
false)
10389 bool writeToStdout=configFile==
"-";
10394 if (!writeToStdout)
10398 msg(
"\n\nConfiguration file '{}' created.\n\n",configFile);
10399 msg(
"Now edit the configuration file and enter\n\n");
10400 if (configFile!=
"Doxyfile" && configFile!=
"doxyfile")
10401 msg(
" doxygen {}\n\n",configFile);
10403 msg(
" doxygen\n\n");
10404 msg(
"to generate the documentation for your project\n\n");
10408 msg(
"\n\nConfiguration file '{}' updated.\n\n",configFile);
10414 term(
"Cannot open file {} for writing\n",configFile);
10429 term(
"Cannot open stdout for writing\n");
10444 if (fileName.
empty() || destName.
empty())
return;
10449 fileName = tagLine;
10455 err(
"Tag file '{}' does not exist or is not a file. Skipping it...\n",fileName);
10463 if (!destName.
empty())
10466 msg(
"Reading tag file '{}', location '{}'...\n",fileName,destName);
10470 msg(
"Reading tag file '{}'...\n",fileName);
10480 for (
const auto &sheet : latexExtraStyleSheet)
10482 std::string fileName = sheet;
10483 if (!fileName.empty())
10488 err(
"Style sheet '{}' specified by LATEX_EXTRA_STYLESHEET does not exist!\n",fileName);
10490 else if (fi.
isDir())
10492 err(
"Style sheet '{}' specified by LATEX_EXTRA_STYLESHEET is a directory, it has to be a file!\n", fileName);
10511 if (!htmlStyleSheet.
empty())
10518 err(
"Style sheet '{}' specified by HTML_STYLESHEET does not exist!\n",htmlStyleSheet);
10521 else if (fi.
isDir())
10523 err(
"Style sheet '{}' specified by HTML_STYLESHEET is a directory, it has to be a file!\n",htmlStyleSheet);
10529 copyFile(htmlStyleSheet,destFileName);
10534 for (
const auto &sheet : htmlExtraStyleSheet)
10542 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET does not exist!\n",fileName);
10546 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET is already a built-in stylesheet. Please use a different name\n",fi.
fileName());
10548 else if (fi.
isDir())
10550 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET is a directory, it has to be a file!\n",fileName);
10564 if (!projectLogo.
empty())
10569 err(
"Project logo '{}' specified by PROJECT_LOGO does not exist!\n",projectLogo);
10572 else if (fi.
isDir())
10574 err(
"Project logo '{}' specified by PROJECT_LOGO is a directory, it has to be a file!\n",projectLogo);
10580 copyFile(projectLogo,destFileName);
10589 if (!projectIcon.
empty())
10594 err(
"Project icon '{}' specified by PROJECT_ICON does not exist!\n",projectIcon);
10597 else if (fi.
isDir())
10599 err(
"Project icon '{}' specified by PROJECT_ICON is a directory, it has to be a file!\n",projectIcon);
10605 copyFile(projectIcon,destFileName);
10613 for (
const auto &fileName : files)
10615 if (!fileName.empty())
10620 err(
"Extra file '{}' specified in {} does not exist!\n", fileName,filesOption);
10622 else if (fi.
isDir())
10624 err(
"Extra file '{}' specified in {} is a directory, it has to be a file!\n", fileName,filesOption);
10644 FileEntry(
const DString &p,
FileDef *fd) : path(p), fileDef(fd) {}
10650 std::vector<FileEntry> fileEntries;
10651 for (
const auto &fd : *fn)
10653 if (!fd->isReference())
10655 fileEntries.emplace_back(fd->getPath(),fd.get());
10659 size_t size = fileEntries.size();
10663 FileDef *fd = fileEntries[0].fileDef;
10669 std::stable_sort(fileEntries.begin(),
10671 [](
const FileEntry &fe1,
const FileEntry &fe2)
10672 { return dstricmp_sort(fe1.path,fe2.path)<0; }
10677 const FileEntry &first = fileEntries[0];
10678 const FileEntry &last = fileEntries[size-1];
10679 int first_path_size =
static_cast<int>(first.path.size())-1;
10680 int last_path_size =
static_cast<int>(last.path.size())-1;
10683 for (i=0;i<first_path_size && i<last_path_size;i++)
10685 if (first.path[i]==
'/') j=i;
10686 if (first.path[i]!=last.path[i])
break;
10688 if (i==first_path_size && i<last_path_size && last.path[i]==
'/')
10693 else if (i==last_path_size && i<first_path_size && first.path[i]==
'/')
10700 for (
auto &fileEntry : fileEntries)
10702 DString prefix = fileEntry.path.right(fileEntry.path.length()-j-1);
10703 fileEntry.fileDef->setName(
prefix+fn->fileName());
10705 fileEntry.fileDef->setDiskName(
prefix+fn->fileName());
10719 size_t sep = fileName.
rfind(
'/');
10720 size_t ei = fileName.
rfind(
'.');
10723 extension=fileName.
mid(ei);
10727 extension =
".no_extension";
10742 extension=fileName.
mid(ei);
10746 extension =
".no_extension";
10750 std::string preBuf;
10757 for (
const auto &s : includePath)
10759 std::string absPath =
FileInfo(s).absFilePath();
10763 msg(
"Preprocessing {}...\n",fn);
10770 msg(
"Reading {}...\n",fn);
10775 std::string convBuf;
10776 convBuf.reserve(preBuf.size()+1024);
10781 std::shared_ptr<Entry> fileRoot = std::make_shared<Entry>();
10785 if (newTU) clangParser->
parse();
10788 parser.
parseInput(fileName,convBuf.
data(),fileRoot,clangParser);
10789 fileRoot->setFileDef(fd);
10806 filesToProcess.insert(s);
10809 std::mutex processedFilesLock;
10811 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10812 msg(
"Processing input using {} threads.\n",numThreads);
10814 using FutureType = std::vector< std::shared_ptr<Entry> >;
10815 std::vector< std::future< FutureType > > results;
10818 bool ambig =
false;
10825 auto processFile = [qs,&filesToProcess,&processedFilesLock,&processedFiles]() {
10826 bool ambig_l =
false;
10827 std::vector< std::shared_ptr<Entry> > roots;
10831 auto fileRoot {
parseFile(*parser.get(),fd_l,qs,clangParser.get(),
true) };
10832 roots.push_back(fileRoot);
10836 for (
auto incFile : clangParser->filesInSameTU())
10839 if (filesToProcess.find(incFile)!=filesToProcess.end())
10841 bool needsToBeProcessed =
false;
10843 std::lock_guard<std::mutex> lock(processedFilesLock);
10844 needsToBeProcessed = processedFiles.find(incFile)==processedFiles.end();
10845 if (needsToBeProcessed) processedFiles.insert(incFile);
10847 if (qincFile!=qs && needsToBeProcessed)
10853 fileRoot =
parseFile(*parser.get(),ifd,qincFile,clangParser.get(),
false);
10854 roots.push_back(fileRoot);
10862 results.emplace_back(threadPool.
queue(processFile));
10866 for (
auto &f : results)
10871 root->moveToSubEntryAndKeep(e);
10878 if (processedFiles.find(s)==processedFiles.end())
10881 auto processFile = [s]() {
10882 bool ambig =
false;
10884 std::vector< std::shared_ptr<Entry> > roots;
10891 auto fileRoot =
parseFile(*parser.get(),fd,qs,clangParser.get(),
true);
10892 roots.push_back(fileRoot);
10896 auto fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
10897 roots.push_back(fileRoot);
10901 results.emplace_back(threadPool.
queue(processFile));
10905 for (
auto &f : results)
10910 root->moveToSubEntryAndKeep(e);
10917 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10918 msg(
"Processing input using {} threads.\n",numThreads);
10920 using FutureType = std::shared_ptr<Entry>;
10921 std::vector< std::future< FutureType > > results;
10925 auto processFile = [s]() {
10926 bool ambig =
false;
10930 auto fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
10934 results.emplace_back(threadPool.
queue(processFile));
10937 for (
auto &f : results)
10939 root->moveToSubEntryAndKeep(f.get());
10957 filesToProcess.insert(s);
10963 bool ambig =
false;
10971 auto fileRoot =
parseFile(*parser.get(),fd,qs,clangParser.get(),
true);
10972 root->moveToSubEntryAndKeep(fileRoot);
10973 processedFiles.insert(s);
10977 for (
auto incFile : clangParser->filesInSameTU())
10980 if (filesToProcess.find(incFile)!=filesToProcess.end() &&
10981 processedFiles.find(incFile)==processedFiles.end())
10987 fileRoot =
parseFile(*parser.get(),ifd,incFile,clangParser.get(),
false);
10988 root->moveToSubEntryAndKeep(fileRoot);
10989 processedFiles.insert(incFile);
10998 if (processedFiles.find(s)==processedFiles.end())
11000 bool ambig =
false;
11007 auto fileRoot =
parseFile(*parser.get(),fd,qs,clangParser.get(),
true);
11008 root->moveToSubEntryAndKeep(fileRoot);
11013 std::shared_ptr<Entry> fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
11014 root->moveToSubEntryAndKeep(fileRoot);
11016 processedFiles.insert(s);
11025 bool ambig =
false;
11030 std::shared_ptr<Entry> fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
11031 root->moveToSubEntryAndKeep(std::move(fileRoot));
11051 sepPos = result.
find(
'/',2);
11053 sepPos = result.
find(
'/',sepPos+1);
11055 sepPos = result.
find(
'/',sepPos+1);
11058 if (nonSymlinks.find(
prefix.str())==nonSymlinks.end())
11064 bool isRelative =
FileInfo(target.
str()).isRelative();
11075 target+=result.
mid(sepPos);
11078 if (known.find(result.
str())!=known.end())
return std::string();
11079 known.insert(result.
str());
11092 nonSymlinks.insert(
prefix.str());
11117 bool errorIfNotExist,
11124 if (paths && !dirName.empty())
11126 paths->insert(dirName);
11132 if (dirName.empty())
11147 msg(
"Searching for files in directory {}\n", fi->
absFilePath());
11154 for (
const auto &dirEntry : dir.
iterator())
11157 auto checkPatterns = [&]() ->
bool
11159 return (patList==
nullptr || cfi.
match(*patList,caseSenseNames)) &&
11160 (exclPatList==
nullptr || !cfi.
match(*exclPatList,caseSenseNames)) &&
11161 (killSet==
nullptr || killSet->find(cfi.
absFilePath())==killSet->end());
11164 if (exclSet==
nullptr || exclSet->find(cfi.
absFilePath())==exclSet->end())
11172 if (errorIfNotExist && checkPatterns())
11177 else if (cfi.
isFile() && checkPatterns())
11180 std::string path=cfi.
dirPath()+
"/";
11181 std::string fullName=path+name;
11188 fn = fnMap->
add(name);
11189 fn->push_back(std::move(fd));
11192 dirResultList.push_back(fullName);
11193 if (resultSet) resultSet->insert(fullName);
11194 if (killSet) killSet->insert(fullName);
11196 else if (recursive &&
11198 (exclPatList==
nullptr || !cfi.
match(*exclPatList,caseSenseNames)) &&
11203 patList,exclPatList,&dirResultList,resultSet,errorIfNotExist,
11204 recursive,killSet,paths);
11208 if (resultList && !dirResultList.empty())
11211 std::stable_sort(dirResultList.begin(),
11212 dirResultList.end(),
11213 [](
const auto &f1,
const auto &f2) { return dstricmp_sort(f1.c_str(),f2.c_str())<0; });
11216 resultList->insert(resultList->end(), dirResultList.begin(), dirResultList.end());
11233 bool errorIfNotExist,
11240 if (s.
empty())
return;
11247 if (exclSet==
nullptr || exclSet->find(fi.
absFilePath())==exclSet->end())
11254 if (errorIfNotExist)
11256 warn_uncond(
"source '{}' is not a readable file or directory... skipping.\n",s);
11261 std::string dirPath = fi.
dirPath(
true);
11263 if (paths && !dirPath.empty())
11265 paths->insert(dirPath);
11268 if (killSet==
nullptr || killSet->find(filePath)==killSet->end())
11277 fn->push_back(std::move(fd));
11280 if (resultList || resultSet)
11282 if (resultList) resultList->push_back(filePath);
11283 if (resultSet) resultSet->insert(filePath);
11289 else if (fi.
isDir())
11291 readDir(&fi,fnMap,exclSet,patList,
11292 exclPatList,resultList,resultSet,errorIfNotExist,
11293 recursive,killSet,paths);
11307 anchor=
":"+md->
anchor();
11316 t <<
"REPLACE INTO symbols (symbol_id,scope_id,name,file,line) VALUES('"
11317 << fn+anchor <<
"','"
11319 << d->
name() <<
"','"
11333 for (
const auto &def : symList)
11345 msg(
"Developer parameters:\n");
11346 msg(
" -m dump symbol map\n");
11347 msg(
" -b making messages output unbuffered\n");
11348 msg(
" -c <file> process input file as a comment block and produce HTML output\n");
11350 msg(
" -t [<file|stdout|stderr>] trace debug info to file, stdout, or stderr (default file stdout)\n");
11351 msg(
" -t_time [<file|stdout|stderr>] trace debug info to file, stdout, or stderr (default file stdout),\n"
11352 " and include time and thread information\n");
11354 msg(
" -d <level> enable a debug level, such as (multiple invocations of -d are possible):\n");
11365 DString versionString = getFullVersion();
11366 msg(
"{}\n",versionString);
11370 if (!extVers.
empty()) extVers+=
", ";
11371 extVers +=
"sqlite3 ";
11372 extVers += sqlite3_libversion();
11374 if (!extVers.
empty()) extVers+=
", ";
11375 extVers +=
"clang support ";
11376 extVers += CLANG_VERSION_STRING;
11378 if (!extVers.
empty())
11382 extVers = extVers.
replace(lastComma,1,
" and");
11384 msg(
" with {}.\n",extVers);
11395 msg(
"Doxygen version {0}\nCopyright Dimitri van Heesch 1997-2025\n\n"
11396 "You can use Doxygen in a number of ways:\n\n"
11397 "1) Use Doxygen to generate a template configuration file*:\n"
11398 " {1} [-s] -g [configName]\n\n"
11399 "2) Use Doxygen to update an old configuration file*:\n"
11400 " {1} [-s] -u [configName]\n\n"
11401 "3) Use Doxygen to generate documentation using an existing "
11402 "configuration file*:\n"
11403 " {1} [configName]\n\n"
11404 "4) Use Doxygen to generate a template file controlling the layout of the\n"
11405 " generated documentation:\n"
11406 " {1} -l [layoutFileName]\n\n"
11407 " In case layoutFileName is omitted DoxygenLayout.xml will be used as filename.\n"
11408 " If - is used for layoutFileName Doxygen will write to standard output.\n\n"
11409 "5) Use Doxygen to generate a template style sheet file for RTF, HTML or Latex.\n"
11410 " RTF: {1} -w rtf styleSheetFile\n"
11411 " HTML: {1} -w html headerFile footerFile styleSheetFile [configFile]\n"
11412 " LaTeX: {1} -w latex headerFile footerFile styleSheetFile [configFile]\n\n"
11413 "6) Use Doxygen to generate a rtf extensions file\n"
11414 " {1} -e rtf extensionsFile\n\n"
11415 " If - is used for extensionsFile Doxygen will write to standard output.\n\n"
11416 "7) Use Doxygen to compare the used configuration file with the template configuration file\n"
11417 " {1} -x [configFile]\n\n"
11418 " Use Doxygen to compare the used configuration file with the template configuration file\n"
11419 " without replacing the environment variables or CMake type replacement variables\n"
11420 " {1} -x_noenv [configFile]\n\n"
11421 "8) Use Doxygen to show a list of built-in emojis.\n"
11422 " {1} -f emoji outputFileName\n\n"
11423 " If - is used for outputFileName Doxygen will write to standard output.\n\n"
11424 "*) If -s is specified the comments of the configuration items in the config file will be omitted.\n"
11425 " If configName is omitted 'Doxyfile' will be used as a default.\n"
11426 " If - is used for configFile Doxygen will write / read the configuration to /from standard output / input.\n\n"
11427 "If -q is used for a Doxygen documentation run, Doxygen will see this as if QUIET=YES has been set.\n\n"
11428 "-v print version string, -V print extended version information\n"
11429 "-h,-? prints usage help information\n"
11430 "{1} -d prints additional usage flags for debugging purposes\n",versionString,name);
11437static const char *
getArg(
int argc,
char **argv,
int &optInd)
11440 if (
dstrlen(&argv[optInd][2])>0)
11441 s=&argv[optInd][2];
11442 else if (optInd+1<argc && argv[optInd+1][0]!=
'-')
11461 return []() {
return std::make_unique<T>(); };
11469 std::setlocale(LC_ALL,
"");
11470 std::setlocale(LC_CTYPE,
"C");
11471 std::setlocale(LC_NUMERIC,
"C");
11569 DString versionString = getFullVersion();
11572 auto writeFile = [](
const char *fileName,std::function<void(
TextStream&)> func) ->
bool
11592 bool genConfig=
false;
11593 bool shortList=
false;
11594 bool traceTiming=
false;
11596 bool updateConfig=
false;
11597 bool quiet =
false;
11598 while (optInd<argc && argv[optInd][0]==
'-' &&
11599 (isalpha(argv[optInd][1]) || argv[optInd][1]==
'?' ||
11600 argv[optInd][1]==
'-')
11603 switch(argv[optInd][1])
11613 if (optInd+1>=argc)
11615 layoutName=
"DoxygenLayout.xml";
11619 layoutName=argv[optInd+1];
11627 if (optInd+1>=argc)
11629 msg(
"option \"-c\" is missing the file name to read\n");
11645 if (debugLabel.
empty())
11654 msg(
"option \"-d\" has unknown debug specifier: \"{}\".\n",debugLabel);
11664 if (!strcmp(argv[optInd]+1,
"t_time"))
11666 traceTiming =
true;
11668 else if (!strcmp(argv[optInd]+1,
"t"))
11670 traceTiming =
false;
11674 err(
"option should be \"-t\" or \"-t_time\", found: \"{}\".\n",argv[optInd]);
11678 if (optInd+1>=argc || argv[optInd+1][0] ==
'-')
11680 traceName=
"stdout";
11684 traceName=argv[optInd+1];
11688 err(
"support for option \"-t\" has not been compiled in (use a debug build or a release build with tracing enabled).\n");
11699 err(
"option should be \"-x\" or \"-x_noenv\", found: \"{}\".\n",argv[optInd]);
11713 if (formatName.
empty())
11715 err(
"option \"-e\" is missing format specifier rtf.\n");
11721 if (optInd+1>=argc)
11723 err(
"option \"-e rtf\" is missing an extensions file name\n");
11731 err(
"option \"-e\" has invalid format specifier.\n");
11739 if (listName.
empty())
11741 err(
"option \"-f\" is missing list specifier.\n");
11747 if (optInd+1>=argc)
11749 err(
"option \"-f emoji\" is missing an output file name\n");
11757 err(
"option \"-f\" has invalid list specifier.\n");
11765 if (formatName.
empty())
11767 err(
"option \"-w\" is missing format specifier rtf, html or latex\n");
11773 if (optInd+1>=argc)
11775 err(
"option \"-w rtf\" is missing a style sheet file name\n");
11781 err(
"error opening RTF style sheet file {}!\n",argv[optInd+1]);
11791 if (optInd+4<argc ||
FileInfo(
"Doxyfile").exists() ||
FileInfo(
"doxyfile").exists())
11797 err(
"error opening or reading configuration file {}!\n",argv[optInd+4]);
11802 if (optInd+3>=argc)
11804 err(
"option \"-w html\" does not have enough arguments\n");
11821 if (optInd+4<argc ||
FileInfo(
"Doxyfile").exists() ||
FileInfo(
"doxyfile").exists())
11826 err(
"error opening or reading configuration file {}!\n",argv[optInd+4]);
11831 if (optInd+3>=argc)
11833 err(
"option \"-w latex\" does not have enough arguments\n");
11849 err(
"Illegal format specifier \"{}\": should be one of rtf, html or latex\n",formatName);
11869 if (
dstrcmp(&argv[optInd][2],
"help")==0)
11871 usage(argv[0],versionString);
11874 else if (
dstrcmp(&argv[optInd][2],
"version")==0)
11880 else if ((
dstrcmp(&argv[optInd][2],
"Version")==0) ||
11881 (
dstrcmp(&argv[optInd][2],
"VERSION")==0))
11889 err(
"Unknown option \"-{}\"\n",&argv[optInd][1]);
11890 usage(argv[0],versionString);
11895 setvbuf(stdout,
nullptr,_IONBF,0);
11902 usage(argv[0],versionString);
11906 err(
"Unknown option \"-{:c}\"\n",argv[optInd][1]);
11907 usage(argv[0],versionString);
11918 TRACE(
"Doxygen version used: {}",getFullVersion());
11921 FileInfo configFileInfo1(
"Doxyfile"),configFileInfo2(
"doxyfile");
11924 if (configFileInfo1.exists())
11926 configName=
"Doxyfile";
11928 else if (configFileInfo2.
exists())
11930 configName=
"doxyfile";
11932 else if (genConfig)
11934 configName=
"Doxyfile";
11938 err(
"Doxyfile not found and no input file specified!\n");
11939 usage(argv[0],versionString);
11946 if (fi.
exists() ||
dstrcmp(argv[optInd],
"-")==0 || genConfig)
11948 configName=argv[optInd];
11952 err(
"configuration file {} not found!\n",argv[optInd]);
11953 usage(argv[0],versionString);
11967 err(
"could not open or read configuration file {}!\n",configName);
12039 for (
const auto &mapping : extMaps)
12057 err(
"Failed to map file extension '{}' to unsupported language '{}'.\n"
12058 "Check the EXTENSION_MAPPING setting in the config file.\n",
12063 msg(
"Adding custom extension mapping: '{}' will be treated as language '{}'\n",
12072 if (cd==
reinterpret_cast<void *
>(-1))
12074 term(
"unsupported character conversion: '{}'->'UTF-8': {}\n"
12075 "Check the 'INPUT_ENCODING' setting in the config file!\n",
12085 for (
const auto &mapping : fileEncod)
12101 if (cd==
reinterpret_cast<void *
>(-1))
12103 term(
"unsupported character conversion: '{}'->'UTF-8': {}\n"
12104 "Check the 'INPUT_FILE_ENCODING' setting in the config file!\n",
12105 encoding,strerror(errno));
12118 for (
const auto &s : expandAsDefinedList)
12136 signal(SIGINT,SIG_DFL);
12138 msg(
"Cleaning up...\n");
12153 if (generateTagFile.
empty())
return;
12158 err(
"cannot open tag file {} for writing\n", generateTagFile);
12162 tagFile <<
"<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>\n";
12163 tagFile <<
"<tagfile doxygen_version=\"" << getDoxygenVersion() <<
"\"";
12164 std::string gitVersion = getGitVersion();
12165 if (!gitVersion.empty())
12167 tagFile <<
" doxygen_gitid=\"" << gitVersion <<
"\"";
12174 for (
const auto &fd : *fn)
12176 if (fd->isLinkableInProject()) fd->writeTagFile(tagFile);
12209 if (gd->isLinkableInProject()) gd->writeTagFile(tagFile);
12214 if (mod->isLinkableInProject()) mod->writeTagFile(tagFile);
12219 if (pd->isLinkableInProject()) pd->writeTagFile(tagFile);
12226 if (dd->isLinkableInProject()) dd->writeTagFile(tagFile);
12230 tagFile <<
"</tagfile>\n";
12238 msg(
"Exiting...\n");
12247 const DString &formatDirName,
12248 const char *defaultDirName)
12250 DString result = formatDirName;
12251 if (result.
empty())
12253 result = baseDirName + defaultDirName;
12255 else if (formatDirName[0]!=
'/' && (formatDirName.
length()==1 || formatDirName[1]!=
':'))
12257 result.
prepend(baseDirName+
"/");
12259 Dir formatDir(result.
str());
12262 term(
"Could not create output directory {}\n", result);
12276 g_s.
begin(
"Searching for include files...\n");
12279 for (
const auto &s : includePathList)
12297 g_s.
begin(
"Searching for example files...\n");
12300 for (
const auto &s : examplePathList)
12316 g_s.
begin(
"Searching for images...\n");
12319 for (
const auto &s : imagePathList)
12334 g_s.
begin(
"Searching for dot files...\n");
12337 for (
const auto &s : dotFileList)
12352 g_s.
begin(
"Searching for msc files...\n");
12355 for (
const auto &s : mscFileList)
12370 g_s.
begin(
"Searching for dia files...\n");
12373 for (
const auto &s : diaFileList)
12388 g_s.
begin(
"Searching for plantuml files...\n");
12391 for (
const auto &s : plantUmlFileList)
12406 g_s.
begin(
"Searching for mermaid files...\n");
12409 for (
const auto &s : mermaidFileList)
12424 g_s.
begin(
"Searching for files to exclude\n");
12426 for (
const auto &s : excludeList)
12445 g_s.
begin(
"Searching INPUT for files to process...\n");
12449 for (
const auto &s : inputList)
12452 size_t l = path.
length();
12456 if (path.
at(l-1)==
'\\' || path.
at(l-1)==
'/') path=path.
left(l-1);
12477 if (fileName->size()>1)
12479 std::stable_sort(fileName->begin(),fileName->end(),[](
const auto &f1,
const auto &f2)
12481 return dstricmp_sort(f1->absFilePath(),f2->absFilePath())<0;
12487 [](
const auto &f1,
const auto &f2)
12489 return dstricmp_sort(f1->front()->absFilePath(),f2->front()->absFilePath())<0;
12493 warn_uncond(
"No files to be processed, please check your settings, in particular INPUT, FILE_PATTERNS, and RECURSIVE\n");
12504 if (mdfileAsMainPage.
empty())
return;
12508 warn_uncond(
"Specified markdown mainpage '{}' does not exist\n",mdfileAsMainPage);
12511 bool ambig =
false;
12514 warn_uncond(
"Specified markdown mainpage '{}' has not been defined as input file\n",mdfileAsMainPage);
12533 DString versionString = getFullVersion();
12534 msg(
"Doxygen version used: {}\n",versionString);
12544 if (outputDirectory.
empty())
12550 Dir dir(outputDirectory.
str());
12554 if (!dir.
mkdir(outputDirectory.
str()))
12556 term(
"tag OUTPUT_DIRECTORY: Output directory '{}' does not "
12557 "exist and cannot be created\n",outputDirectory);
12561 msg(
"Notice: Output directory '{}' does not exist. "
12562 "I have created it for you.\n", outputDirectory);
12610 bool generateSitemap = !sitemapUrl.
empty();
12611 if (generateSitemap && !sitemapUrl.
endsWith(
"/"))
12618 bool generateEclipseHelp =
Config_getBool(GENERATE_ECLIPSEHELP);
12632 if (generateDocbook)
12672 if (curFontPath.
empty())
12676 if (!curFontPath.
empty())
12679 newFontPath+=curFontPath;
12695 bool defaultLayoutUsed =
false;
12696 if (layoutFileName.
empty())
12699 defaultLayoutUsed =
true;
12701 AUTO_TRACE_ADD(
"defaultLayoutUsed={}, layoutFileName={}",defaultLayoutUsed,layoutFileName);
12706 msg(
"Parsing layout file {}...\n",layoutFileName);
12709 else if (!defaultLayoutUsed)
12711 warn_uncond(
"failed to open layout file '{}' for reading! Using default settings.\n",layoutFileName);
12721 if (generateHtml) exclPatterns.push_back(htmlOutput.
str());
12722 if (generateDocbook) exclPatterns.push_back(docbookOutput.
str());
12723 if (generateXml) exclPatterns.push_back(xmlOutput.
str());
12724 if (generateLatex) exclPatterns.push_back(latexOutput.
str());
12725 if (generateRtf) exclPatterns.push_back(rtfOutput.
str());
12726 if (generateMan) exclPatterns.push_back(manOutput.
str());
12746 if (generateDocbook)
12757 std::shared_ptr<Entry> root = std::make_shared<Entry>();
12761 msg(
"Reading and parsing tag files\n");
12763 for (
const auto &s : tagFileList)
12815 g_s.
begin(
"Building macro definition list...\n");
12819 g_s.
begin(
"Building group list...\n");
12824 g_s.
begin(
"Building directory list...\n");
12829 g_s.
begin(
"Building namespace list...\n");
12834 g_s.
begin(
"Building file list...\n");
12838 g_s.
begin(
"Building class list...\n");
12842 g_s.
begin(
"Building concept list...\n");
12850 g_s.
begin(
"Computing nesting relations for classes...\n");
12863 g_s.
begin(
"Associating documentation with classes...\n");
12867 g_s.
begin(
"Associating documentation with concepts...\n");
12872 g_s.
begin(
"Associating documentation with modules...\n");
12876 g_s.
begin(
"Building example list...\n");
12880 g_s.
begin(
"Searching for enumerations...\n");
12888 g_s.
begin(
"Searching for documented typedefs...\n");
12894 g_s.
begin(
"Searching for documented sequences...\n");
12898 g_s.
begin(
"Searching for documented dictionaries...\n");
12903 g_s.
begin(
"Searching for members imported via using declarations...\n");
12910 g_s.
begin(
"Searching for included using directives...\n");
12914 g_s.
begin(
"Searching for documented variables...\n");
12918 g_s.
begin(
"Building interface member list...\n");
12921 g_s.
begin(
"Building member list...\n");
12925 g_s.
begin(
"Searching for friends...\n");
12929 g_s.
begin(
"Searching for documented defines...\n");
12933 g_s.
begin(
"Computing class inheritance relations...\n");
12938 g_s.
begin(
"Computing class usage relations...\n");
12942 g_s.
begin(
"Flushing cached template relations that have become invalid...\n");
12946 g_s.
begin(
"Warn for undocumented namespaces...\n");
12950 g_s.
begin(
"Computing class relations...\n");
12961 g_s.
begin(
"Add enum values to enums...\n");
12966 g_s.
begin(
"Searching for member function documentation...\n");
12978 g_s.
begin(
"Creating members for template instances...\n");
12982 g_s.
begin(
"Searching for tag less structs...\n");
12986 g_s.
begin(
"Building page list...\n");
12990 g_s.
begin(
"Building requirements list...\n");
12994 g_s.
begin(
"Search for main page...\n");
12999 g_s.
begin(
"Computing page relations...\n");
13004 g_s.
begin(
"Determining the scope of groups...\n");
13008 g_s.
begin(
"Computing module relations...\n");
13010 mm.resolvePartitions();
13011 mm.resolveImports();
13012 mm.collectExportedSymbols();
13031 return i==0 ?
dstricmp_sort(c1->name(), c2->name())<0 : i<0;
13066 g_s.
begin(
"Determining which enums are documented\n");
13070 g_s.
begin(
"Computing member relations...\n");
13075 g_s.
begin(
"Building full member lists recursively...\n");
13079 g_s.
begin(
"Adding members to member groups.\n");
13085 g_s.
begin(
"Distributing member group documentation.\n");
13090 g_s.
begin(
"Computing member references...\n");
13096 g_s.
begin(
"Inheriting documentation...\n");
13104 g_s.
begin(
"Generating disk names...\n");
13108 g_s.
begin(
"Adding source references...\n");
13112 g_s.
begin(
"Adding xrefitems...\n");
13117 g_s.
begin(
"Adding requirements...\n");
13122 g_s.
begin(
"Sorting member lists...\n");
13126 g_s.
begin(
"Setting anonymous enum type...\n");
13130 g_s.
begin(
"Computing dependencies between directories...\n");
13134 g_s.
begin(
"Generating citations page...\n");
13138 g_s.
begin(
"Counting data structures...\n");
13142 g_s.
begin(
"Resolving user defined references...\n");
13146 g_s.
begin(
"Finding anchors and sections in the documentation...\n");
13150 g_s.
begin(
"Transferring function references...\n");
13154 g_s.
begin(
"Combining using relations...\n");
13159 g_s.
begin(
"Adding members to index pages...\n");
13164 g_s.
begin(
"Correcting members for VHDL...\n");
13168 g_s.
begin(
"Computing tooltip texts...\n");
13176 [](
const auto &g1,
const auto &g2)
13177 {
return g1->groupTitle() < g2->groupTitle(); });
13181 gd->sortSubGroups();
13225 if (generateDocbook)
13245 err(
"USE_HTAGS is YES but htags(1) failed. \n");
13247 err(
"htags(1) ended normally but failed to load the filemap. \n");
13254 g_s.
begin(
"Generating style sheet...\n");
13262 g_s.
begin(
"Generating search indices...\n");
13263 if (searchEngine && !serverBasedSearch && generateHtml)
13271 if (generateHtml && searchEngine)
13274 Dir searchDir(searchDirName.
str());
13275 if (!searchDir.
exists() && !searchDir.
mkdir(searchDirName.
str()))
13277 term(
"Could not create search results directory '{}' $PWD='{}'\n",
13281 if (!serverBasedSearch)
13303 if (generateDocbook)
13319 g_s.
begin(
"Generating images for formulas in HTML...\n");
13326 g_s.
begin(
"Generating images for formulas in RTF...\n");
13333 g_s.
begin(
"Generating images for formulas in Docbook...\n");
13338 g_s.
begin(
"Generating example documentation...\n");
13342 g_s.
begin(
"Generating file sources...\n");
13346 g_s.
begin(
"Counting members...\n");
13352 g_s.
begin(
"Generating file documentation...\n");
13356 g_s.
begin(
"Generating page documentation...\n");
13360 g_s.
begin(
"Generating group documentation...\n");
13364 g_s.
begin(
"Generating class documentation...\n");
13368 g_s.
begin(
"Generating concept documentation...\n");
13372 g_s.
begin(
"Generating module documentation...\n");
13376 g_s.
begin(
"Generating namespace documentation...\n");
13382 g_s.
begin(
"Generating graph info page...\n");
13387 g_s.
begin(
"Generating directory documentation...\n");
13396 g_s.
begin(
"finalizing index lists...\n");
13400 g_s.
begin(
"writing tag file...\n");
13406 g_s.
begin(
"Generating XML output...\n");
13414 g_s.
begin(
"Generating SQLITE3 output...\n");
13421 g_s.
begin(
"Generating AutoGen DEF output...\n");
13427 g_s.
begin(
"Generating Perl module output...\n");
13431 if (generateHtml && searchEngine && serverBasedSearch)
13433 g_s.
begin(
"Generating search index\n");
13443 if (searchDataFile.
empty())
13445 searchDataFile=
"searchdata.xml";
13458 g_s.
begin(
"Combining RTF output...\n");
13461 err(
"An error occurred during post-processing the RTF files!\n");
13468 g_s.
begin(
"Running plantuml with JAVA...\n");
13475 g_s.
begin(
"Running mermaid (mmdc)...\n");
13487 if (generateHtml &&
13491 g_s.
begin(
"Running html help compiler...\n");
13496 if ( generateHtml &&
13500 g_s.
begin(
"Running qhelpgenerator...\n");
13513 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
13514 if (numThreads<1) numThreads=1;
13515 msg(
"Total elapsed time: {:.6f} seconds\n(of which an average of {:.6f} seconds per thread waiting for external tools to finish)\n",
13522 msg(
"finished...\n");
13527 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
bool hasParameters() const
DString trailingReturnType() const
void setPureSpecifier(bool b)
bool constSpecifier() const
void setTrailingReturnType(const DString &s)
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 DString requiresClause() const =0
virtual const MemberDef * getMemberByName(const DString &) const =0
Returns the member with the given name.
virtual const ArgumentList & templateArguments() const =0
Returns the template arguments of this class.
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 int isBaseClass(const ClassDef *bcd, bool followInstances, const DString &templSpec=DString()) const =0
Returns true iff bcd is a direct or indirect base class of this class.
virtual const TemplateInstanceList & getTemplateInstances() const =0
Returns a sorted dictionary with all template instances found for this template 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 DString compoundTypeString() const =0
Returns the type of compound as a string.
virtual MemberList * getMemberList(MemberListType lt) const =0
Returns the members in the list identified by lt.
virtual std::unique_ptr< ClassDef > deepCopy(const DString &name) const =0
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 DString qualifiedNameWithTemplateParameters(const ArgumentLists *actualParams=nullptr, uint32_t *actualParamIndex=nullptr) 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 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. class/struct/union/...
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 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 addUsedClass(ClassDef *cd, const DString &accessName, Protection prot)=0
virtual void insertExplicitTemplateInstance(ClassDef *instance, const DString &spec)=0
virtual void countMembers()=0
virtual void addMembersToMemberGroup()=0
virtual void setPrimaryConstructorParams(const ArgumentList &list)=0
virtual void setTemplateBaseClassNames(const TemplateNameMap &templateNames)=0
virtual ClassDef * insertTemplateInstance(const DString &fileName, int startLine, size_t startColumn, const DString &templSpec, bool &freshInstance)=0
virtual void setClassName(const DString &name)=0
virtual void setFileDef(FileDef *fd)=0
virtual void reclassifyMember(MemberDefMutable *md, MemberType t)=0
virtual void setTemplateArguments(const ArgumentList &al)=0
virtual void setTemplateMaster(const ClassDef *tm)=0
virtual void makeTemplateArgument(bool b=true)=0
virtual void mergeCategory(ClassDef *category)=0
virtual void addQualifiers(const StringVector &qualifiers)=0
virtual void setClassSpecifier(TypeSpecifier spec)=0
virtual void insertUsedFile(const FileDef *)=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 setMetaData(const DString &md)=0
virtual void findSectionsInDocumentation()=0
virtual void insertMember(MemberDef *)=0
virtual void sortAllMembersList()=0
virtual void mergeMembers()=0
virtual void setIsStatic(bool b)=0
virtual void addMembersToTemplateInstance(const ClassDef *cd, const ArgumentList &templateArguments, const DString &templSpec)=0
virtual void insertSubClass(ClassDef *, Protection p, Specifier s, const DString &t=DString())=0
virtual void addUsedByClass(ClassDef *cd, const DString &accessName, Protection prot)=0
virtual void setSubGrouping(bool enabled)=0
virtual void setRequiresClause(const DString &req)=0
virtual void insertBaseClass(ClassDef *, const DString &name, Protection p, Specifier s, const DString &t=DString())=0
virtual void addDocPart(const DString &doc, int lineNr, size_t colNr)=0
virtual void addCodePart(const DString &code, int lineNr, size_t colNr)=0
virtual void setFileDef(FileDef *fd)=0
virtual void writeTagFile(TextStream &)=0
virtual void writeDocumentation(OutputList &ol)=0
virtual void setGroupId(int id)=0
virtual void setInitializer(const DString &init)=0
virtual void findSectionsInDocumentation()=0
virtual void setTemplateArguments(const ArgumentList &al)=0
A String class for use with Doxygen wrapping std::string and adding some additional functionality off...
DString & setNum(short n)
void resize(size_t newlen)
size_t rfind(char c, size_t pos=npos) const
DString fill(char c, size_t len)
Fills a string with a predefined character.
DString mid(size_t index, size_t len=npos) const
bool empty() const
Returns true iff the string is empty (std::string compatible alias for isEmpty()).
DString & replace(size_t index, size_t len, const char *s)
DString substr(size_t pos=0, size_t count=npos) const
Returns a substring of length count starting at pos.
static constexpr size_t npos
value used to indicate 'not found' or 'to the end of the string', matching std::string::npos
char & at(size_t i)
Returns a reference to the character at index i.
bool findAndRemoveWord(const char *word)
removes occurrences of whole word from this string, while keeping internal spaces and reducing multip...
DString right(size_t len) const
size_t size() const
Returns the length of the string, not counting the 0-terminator.
DString & prepend(const char *s)
int contains(char c, bool cs=true) const
size_t find(char c, size_t pos=0) const
DString & sprintf(const char *format,...)
DString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
DString left(size_t len) const
const std::string & str() const
bool stripPrefix(const DString &prefix)
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
bool startsWith(const char *s) const
bool endsWith(const char *s) const
size_t length() const
Returns the length of the string, not counting the 0-terminator.
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 DString &label)
static void setFlag(const DebugMask mask)
The common base class of all entity definitions found in the sources.
virtual DString briefDescription(bool abbreviate=false) const =0
virtual DString inbodyFile() const =0
virtual int getEndBodyLine() const =0
virtual DString briefFile() const =0
virtual SrcLangExt getLanguage() const =0
Returns the programming language this definition was written in.
virtual int docLine() const =0
virtual DString getDefFileName() const =0
virtual DString documentation() const =0
virtual bool isLinkable() const =0
virtual DString inbodyDocumentation() const =0
virtual int getDefLine() const =0
virtual DefType definitionType() const =0
virtual const DString & name() const =0
virtual const DString & localName() 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 size_t getDefColumn() const =0
virtual bool isAnonymous() const =0
virtual DString displayName(bool includeScope=true) const =0
virtual DString qualifiedName() const =0
virtual bool isHidden() const =0
virtual DString anchor() const =0
virtual int getStartDefLine() const =0
virtual const GroupList & partOfGroups() const =0
virtual bool isArtificial() const =0
virtual Definition * getOuterScope() const =0
virtual DString docFile() const =0
virtual int getStartBodyLine() const =0
virtual bool isReference() const =0
virtual const Definition * findInnerCompound(const DString &name) const =0
virtual DString getOutputFileBase() const =0
virtual void mergeReferencedBy(const Definition *other)=0
virtual void setName(const DString &name)=0
virtual void setExported(bool b)=0
virtual void setBodySegment(int defLine, int bls, int ble)=0
virtual void setHidden(bool b)=0
virtual void setReference(const DString &r)=0
virtual void mergeReferences(const Definition *other)=0
virtual void setInbodyDocumentation(const DString &d, const DString &docFile, int docLine)=0
virtual void setDocumentation(const DString &d, const DString &docFile, int docLine, bool stripWhiteSpace=true)=0
virtual void addInnerCompound(Definition *d)=0
virtual void setDefFile(const DString &df, int defLine, size_t defColumn)=0
virtual void addSectionsToDefinition(const std::vector< const SectionInfo * > &anchorList)=0
virtual void setLanguage(SrcLangExt lang)=0
virtual void setOuterScope(Definition *d)=0
virtual void setArtificial(bool b)=0
virtual void setBriefDescription(const DString &b, const DString &briefFile, int briefLine)=0
virtual void makePartOfGroup(GroupDef *gd)=0
virtual void setBodyDef(const FileDef *fd)=0
virtual void setRequirementReferences(const RequirementRefs &rqli)=0
virtual void setId(const DString &name)=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 DString filterDBFileName
static ParserManager * parserManager
static InputFileEncodingList inputFileEncodingList
static DString verifiedDotPath
static ClassLinkedMap * classLinkedMap
static MemberNameLinkedMap * functionNameLinkedMap
static PageLinkedMap * exampleLinkedMap
static FileNameLinkedMap * dotFileNameLinkedMap
static NamespaceDefMutable * globalScope
static FileNameLinkedMap * imageNameLinkedMap
static FileNameLinkedMap * mscFileNameLinkedMap
static FileNameLinkedMap * mermaidFileNameLinkedMap
static MemberGroupInfoMap memberGroupInfoMap
static IndexList * indexList
static StaticInitMap staticInitMap
static StringMap tagDestinationMap
static std::mutex countFlowKeywordsMutex
static ClassLinkedMap * hiddenClassLinkedMap
static FileNameLinkedMap * diaFileNameLinkedMap
static PageLinkedMap * pageLinkedMap
static bool generatingXmlOutput
static std::unique_ptr< NamespaceDef > globalNamespaceDef
static DString htmlFileExtension
static DefinesPerFileList macroDefinitions
static DirLinkedMap * dirLinkedMap
static NamespaceAliasInfoMap namespaceAliasMap
static MemberNameLinkedMap * memberNameLinkedMap
static SymbolMap< Definition > * symbolMap
static StringUnorderedSet tagFileSet
static FileNameLinkedMap * includeNameLinkedMap
static FileNameLinkedMap * exampleNameLinkedMap
static SearchIndexIntf searchIndex
static DirRelationLinkedMap dirRelations
static std::mutex addExampleMutex
static ClangUsrMap * clangUsrMap
static GroupLinkedMap * groupLinkedMap
Generator for Eclipse help files.
static EmojiEntityMapper & instance()
Returns the one and only instance of the Emoji entity mapper.
void writeEmojiFile(TextStream &t)
Writes the list of supported emojis to the given file.
Represents an unstructured piece of information, about an entity found in the sources.
TextStream initializer
initial value (for variables)
VhdlSpecifier vhdlSpec
VHDL specifiers.
bool subGrouping
automatically group class members?
RequirementRefs rqli
references to requirements
const std::vector< std::shared_ptr< Entry > > & children() const
GroupDocType groupDocType
int docLine
line number at which the documentation was found
DString includeName
include name (3 arg of \class)
DString bitfields
member's bit fields
ArgumentList typeConstr
where clause (C#) for type constraints
void markAsProcessed() const
int endBodyLine
line number where the definition ends
DString write
property write accessor
bool exported
is the symbol exported from a C++20 module
const TagInfo * tagInfo() const
DString includeFile
include file (2 arg of \class, must be unique)
DString fileName
file this entry was extracted from
ArgumentLists tArgLists
template argument declarations
DString docFile
file in which the documentation was found
MethodTypes mtype
signal, slot, (dcop) method, or property?
@ GROUPDOC_NORMAL
defgroup
DString args
member argument string
SrcLangExt lang
programming language in which this entry was found
DString inside
name of the class in which documents are found
DString doc
documentation block (partly parsed)
DString req
C++20 requires clause.
bool explicitExternal
explicitly defined as external?
DString brief
brief description (doc block)
std::vector< const SectionInfo * > anchors
list of anchors defined in this entry
RelatesType relatesType
how relates is handled
std::vector< Grouping > groups
list of groups this entry belongs to
CommandOverrides commandOverrides
store info for commands whose default can be overridden
int startLine
start line of entry in the source
size_t startColumn
start column of entry in the source
ArgumentList argList
member arguments as a list
int inbodyLine
line number at which the body doc was found
EntryType section
entry type (see Sections);
int bodyLine
line number of the body in the source
DString exception
throw specification
DString relates
related class (doc block)
int mGrpId
member group id
std::vector< BaseInfo > extends
list of base classes
DString inbodyFile
file in which the body doc was found
Specifier virt
virtualness of the entry
DString metaData
Slice metadata.
std::vector< std::string > qualifiers
qualifiers specified with the qualifier command
RefItemVector sli
special lists (test/todo/bug/deprecated/..) this entry is in
Protection protection
class protection
bool artificial
Artificially introduced item.
bool hidden
does this represent an entity that is hidden from the output
DString inbodyDocs
documentation inside the body of a function
int briefLine
line number at which the brief desc. was found
FileDef * fileDef() const
int initLines
define/variable initializer lines to show
TypeSpecifier spec
class/member specifiers
DString briefFile
file in which the brief desc. was found
DString read
property read accessor
Wrapper class for the Entry type.
constexpr bool isCompoundDoc() const noexcept
constexpr bool isFile() const noexcept
constexpr bool isDoc() const noexcept
ENTRY_TYPES constexpr bool isCompound() const noexcept
std::string to_string() const
static EntryType guessSection(const DString &name)
constexpr bool isScope() const noexcept
A class that generates a dynamic tree view side panel.
A model of a file symbol.
virtual void addUsingDeclaration(const Definition *d)=0
virtual void removeMember(MemberDef *md)=0
virtual void insertClass(ClassDef *cd)=0
virtual void setDiskName(const DString &name)=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 DString absFilePath() const =0
virtual const DString & docName() const =0
virtual const LinkedRefMap< NamespaceDef > & getUsedNamespaces() const =0
virtual bool isSource() const =0
virtual void parseSource(ClangTUParser *clangParser)=0
virtual void getAllIncludeFilesRecursively(StringVector &incFiles) const =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 void insertMember(MemberDef *md)=0
virtual void insertNamespace(NamespaceDef *nd)=0
Minimal replacement for QFileInfo.
std::string readLink() const
FileInfo(const std::string &name)
bool match(const PatternList &patList, bool caseSenseNames, PatternElem *elem=nullptr, PatternGet getter=[](const std::string &s){ return s;}) const
Match the file name against a list of patterns.
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.
DString showFileDefMatches(const DString &n) const
Returns a list of file definitions in fnMap that match the file name n.
FileDef * findFileDef(const DString &n, bool &ambig) const
Returns the file definition in fnMap that matches the file name n.
A model of a group of symbols.
virtual DString 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 void setGroupTitle(const DString &newtitle)=0
virtual MemberList * getMemberList(MemberListType lt) const =0
virtual bool hasGroupTitle() const =0
Generator for HTML output.
static void writeSearchData(const DString &dir)
static void writeSearchPage()
static void writeHeaderFile(TextStream &t, const DString &cssname)
static void writeFooterFile(TextStream &t)
static void writeTabData()
Additional initialization after indices have been created.
static void writeExternalSearchPage()
static void writeStyleSheetFile(TextStream &t)
A class that generated the HTML Help specific files.
static const DString hhpFileName
static Index & instance()
void countDataStructures()
A list of index interfaces.
void addIndexItem(const Definition *context, const MemberDef *md, const DString §ionAnchor=DString(), const DString &title=DString())
void addIndex(As &&... args)
Add an index generator to the list, using a syntax similar to std::make_unique<T>().
void addImageFile(const DString &name)
Generator for LaTeX output.
static void writeFooterFile(TextStream &t)
static void writeStyleSheetFile(TextStream &t)
static void writeHeaderFile(TextStream &t)
void parse(const DString &fileName, const char *data=nullptr)
Parses a user provided layout.
static LayoutDocManager & instance()
Returns a reference to this singleton.
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 DString requiresClause() const =0
virtual bool isFriend() const =0
virtual DString argsString() const =0
virtual bool isForeign() const =0
virtual bool isRelated() const =0
virtual DString definition() const =0
virtual const ClassDef * getCachedTypedefVal() const =0
virtual const ClassDef * getClassDef() const =0
virtual DString excpString() const =0
virtual const ArgumentList & templateArguments() const =0
virtual const DString & initializer() 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 DString bitfieldString() const =0
virtual bool isStatic() const =0
virtual const MemberDef * reimplements() const =0
virtual StringVector getQualifiers() 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 DString typeString() 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 void setRequiresClause(const DString &req)=0
virtual void setClassDefOfAnonymousType(const ClassDef *cd)=0
virtual void setMemberClass(ClassDef *cd)=0
virtual void setProtection(Protection p)=0
virtual void setDefinition(const DString &d)=0
virtual void setMemberGroupId(int id)=0
virtual void setDocumentedEnumValues(bool value)=0
virtual void setMemberSpecifiers(TypeSpecifier s)=0
virtual ClassDefMutable * getClassDefMutable()=0
virtual void setArgsString(const DString &as)=0
virtual void setEnumScope(MemberDef *md, bool livesInsideEnum=false)=0
virtual void setDefinitionTemplateParameterLists(const ArgumentLists &lists)=0
virtual void invalidateTypedefValCache()=0
virtual void setVhdlSpecifiers(VhdlSpecifier s)=0
virtual void setEnumClassScope(ClassDef *cd)=0
virtual void setInitializer(const DString &i)=0
virtual void setMaxInitLines(int lines)=0
virtual void setInheritsDocsFrom(const MemberDef *md)=0
virtual void setPrototype(bool p, const DString &df, int line, size_t column)=0
virtual void setRelatedAlso(ClassDef *cd)=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 overrideCallGraph(bool e)=0
virtual void overrideInlineSource(bool e)=0
virtual void setBitfields(const DString &s)=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 setExplicitExternal(bool b, const DString &df, int line, size_t column)=0
virtual void insertEnumField(MemberDef *md)=0
virtual void moveDeclArgumentList(std::unique_ptr< ArgumentList > al)=0
virtual void setDeclFile(const DString &df, int line, size_t column)=0
virtual void setAnonymousEnumType(const MemberDef *md)=0
virtual void overrideCallerGraph(bool e)=0
virtual void setReimplements(MemberDef *md)=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.
Wrapper class for the MemberListType type.
Ordered dictionary of MemberName objects.
MemberName::Ptr take(const DString &key, const MemberDef *value)
const MemberDef * findRev(const DString &name) const
const MemberDef * find(const DString &name) const
void run()
Run mmdc tool for all collected diagrams.
static MermaidManager & instance()
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 findSectionsInDocumentation()=0
virtual void countMembers()=0
virtual void addUsingDirective(NamespaceDef *nd)=0
virtual void setFileName(const DString &fn)=0
virtual void insertMember(MemberDef *md)=0
virtual void setMetaData(const DString &m)=0
virtual void addUsingDeclaration(const Definition *d)=0
virtual void distributeMemberGroupDocumentation()=0
virtual void writeTagFile(TextStream &)=0
virtual void writeDocumentation(OutputList &ol)=0
virtual void setInline(bool isInline)=0
virtual void computeAnchors()=0
virtual void combineUsingRelations(NamespaceDefSet &visitedNamespace)=0
virtual void sortMemberLists()=0
virtual void addMembersToMemberGroup()=0
void parseInput(const DString &, 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 DString &) override
Callback function called by the comment block scanner.
bool needsPreprocessing(const DString &) const override
Returns true if the language identified by extension needs the C preprocessor to be run before feed t...
Abstract interface for outline parsers.
virtual bool needsPreprocessing(const DString &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 DString &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.
void disable(OutputType o)
void enable(OutputType o)
void docify(const DString &s)
void writeStyleInfo(int part)
void generateDoc(const DString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const DString &docStr, const DocOptions &options)
A model of a page symbol.
virtual void setLocalToc(const LocalToc &tl)=0
virtual void setFileName(const DString &name)=0
virtual void setShowLineNo(bool)=0
virtual void setPageScope(Definition *)=0
virtual const GroupDef * getGroupDef() const =0
Manages programming language parsers.
std::unique_ptr< CodeParserInterface > getCodeParser(const DString &extension)
Gets the interface to the parser associated with a given extension.
void registerParser(const DString &name, const OutlineParserFactory &outlineParserFactory, const CodeParserFactory &codeParserFactory)
Registers an additional parser.
ParserManager(const OutlineParserFactory &outlineParserFactory, const CodeParserFactory &codeParserFactory)
Create the parser manager.
std::unique_ptr< OutlineParserInterface > getOutlineParser(const DString &extension)
Gets the interface to the parser associated with a given extension.
static PlantumlManager & instance()
void run()
Run plant UML tool for all images.
void processFile(const DString &fileName, const std::string &input, std::string &output)
void addSearchDir(const DString &dir)
static DString getQchFileName()
static const DString qhpFileName
Generator for RTF output.
static bool preProcessFileInplace(const DString &path, const DString &name)
This is an API to a VERY brittle RTF preprocessor that combines nested RTF files.
static void writeStyleSheetFile(TextStream &t)
static void writeExtensionsFile(TextStream &t)
static RefListManager & instance()
static RequirementManager & instance()
void writeTagFile(TextStream &tagFile)
void addRequirement(Entry *e)
Abstract proxy interface for non-javascript based search indices.
void addWord(const DString &word, bool hiPriority)
void setCurrentDoc(const Definition *ctx, const DString &anchor, bool isSourceFile)
void write(const DString &file)
class that provide information about a section.
SectionInfo * replace(const DString &label, const DString &fileName, int lineNr, const DString &title, SectionType type, int level, const DString &ref=DString())
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
static void showCacheUsage()
Show usage of the type lookup cache.
static void clearTypeLookupCache(ClearScope scope)
ClassDefMutable * resolveClassMutable(const Definition *scope, const DString &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 ClassDef * resolveClass(const Definition *scope, const DString &name, bool maybeUnlinkable=false, bool mayBeHidden=false)
Find the class definition matching name within the scope set.
const Definition * resolveSymbol(const Definition *scope, const DString &name, const DString &args=DString(), bool checkCV=false, bool insideCode=false, bool onlyLinkable=false)
Find the symbool definition matching name within the scope set.
DString getTemplateSpec() const
In case a call to resolveClass() points to a template specialization, the template part is return via...
const MemberDef * getTypedef() const
In case a call to resolveClass() resolves to a type member (e.g. an enum) this method will return it.
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.
virtual DString trOverloadText()=0
virtual DString trPage(bool first_capital, bool singular)=0
virtual DString trMainPage()=0
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 DString &n)
std::unique_ptr< ClassDef > createClassDefAlias(const Definition *newScope, const ClassDef *cd)
std::unique_ptr< ClassDef > createClassDef(const DString &fileName, int startLine, size_t startColumn, const DString &name, ClassDef::CompoundType ct, const DString &ref, const DString &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 DString &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 DString &fileName, int startLine, size_t startColumn, const DString &name, const DString &tagRef, const DString &tagFile)
ConceptDefMutable * getConceptMutable(const DString &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 DString &decl, const SrcLangExt lang, DString &clName, DString &type, DString &name, DString &args, DString &funcTempList, DString &exceptions)
std::unique_ptr< ArgumentList > stringToArgumentList(SrcLangExt lang, const DString &argsString, DString *extraTypeChars=nullptr)
std::unordered_map< std::string, DefineList > DefinesPerFileList
Definition * toDefinition(DefinitionMutable *dm)
DefinitionMutable * toDefinitionMutable(Definition *d)
DirIterator begin(DirIterator it) noexcept
DirIterator end(const DirIterator &) noexcept
void computeDirDependencies()
void generateDirDocs(OutputList &ol)
#define AUTO_TRACE_ADD(...)
#define AUTO_TRACE_EXIT(...)
constexpr DocNodeVariant * parent(DocNodeVariant *n)
returns the parent node of a given node n or nullptr if the node has no parent.
static void findInheritedTemplateInstances()
void printNavTree(Entry *root, int indent)
static void addClassToContext(const Entry *root)
static void makeTemplateInstanceRelation(const Entry *root, ClassDefMutable *cd)
static StringUnorderedSet g_pathsVisited(1009)
static void buildGroupList(const Entry *root)
static void insertMemberAlias(Definition *outerScope, const MemberDef *md)
static void findUsingDeclarations(const Entry *root, bool filterPythonPackages)
static void flushCachedTemplateRelations()
static void copyLatexStyleSheet()
static void generateDocsForClassList(const std::vector< ClassDefMutable * > &classList)
static int findFunctionPtr(const std::string &type, SrcLangExt lang, int *pLength=nullptr)
static bool isSpecialization(const ArgumentLists &srcTempArgLists, const ArgumentLists &dstTempArgLists)
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 generateXRefPages()
static Definition * buildScopeFromQualifiedName(const DString &name_, SrcLangExt lang, const TagInfo *tagInfo)
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
static void processTagLessClasses(const Definition *root, const Container *cd, const TagContainer *tagParent, MemberListType varFilter, MemberListType typeFilter, const DString &prefix, int count)
Look through the members of class cd and its public members.
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 void buildConceptList(const Entry *root)
static void addMemberSpecialization(const Entry *root, MemberName *mn, ClassDefMutable *cd, const DString &funcType, const DString &funcName, const DString &funcArgs, const DString &funcDecl, const DString &exceptions, TypeSpecifier spec)
static void resolveClassNestingRelations()
static void generateNamespaceConceptDocs(const ConceptLinkedRefMap &conceptList)
static MemberDef * addVariableToFile(const Entry *root, MemberType mtype, const DString &scope, const DString &type, const DString &name, const DString &args)
static void findClassEntries(const Entry *root)
static void vhdlCorrectMemberProperties()
static void addMemberFunction(const Entry *root, MemberName *mn, const DString &scopeName, const DString &namespaceName, const DString &className, const DString &funcTyp, const DString &funcName, const DString &funcArgs, const DString &funcTempList, const DString &exceptions, const DString &type, const DString &args, bool isFriend, TypeSpecifier spec, const DString &relates, const DString &funcDecl, bool overloaded, bool isFunc)
static void generateExampleDocs()
static void stopDoxygen(int)
static void substituteTemplatesInArgList(const ArgumentLists &srcTempArgLists, const ArgumentLists &dstTempArgLists, const ArgumentList &src, ArgumentList &dst)
static void copyLogo(const DString &outputOption, bool toIndex)
static void computeMemberReferences()
static void transferRelatedFunctionDocumentation()
static void addMembersToMemberGroup()
static void findMainPageTagFiles(Entry *root)
static void addLocalObjCMethod(const Entry *root, const DString &scopeName, const DString &funcType, const DString &funcName, const DString &funcArgs, const DString &exceptions, const DString &funcDecl, TypeSpecifier spec)
static void distributeConceptGroups()
static NamespaceDef * findUsedNamespace(const LinkedRefMap< NamespaceDef > &unl, const DString &name)
static void transferFunctionDocumentation()
static void setAnonymousEnumType()
static void sortMemberLists()
static void findMember(const Entry *root, const DString &relates, const DString &type, const DString &args, DString funcDecl, bool overloaded, bool isFunc)
static void createTemplateInstanceMembers()
void transferStaticInstanceInitializers()
static void findObjCMethodDefinitions(const Entry *root)
static void addMemberDocs(const Entry *root, MemberDefMutable *md, const DString &funcDecl, const ArgumentList *al, bool over_load, TypeSpecifier spec)
static void dumpSymbolMap()
static void buildTypedefList(const Entry *root)
static void findGroupScope(const Entry *root)
static void generateFileDocs()
static int findEndOfTemplate(const DString &s, size_t startPos)
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 distributeMemberGroupDocumentation()
static void generateNamespaceClassDocs(const ClassLinkedRefMap &classList)
static void addEnumValuesToEnums(const Entry *root)
static void generatePageDocs()
static void resolveUserReferences()
static void buildRequirementsList(Entry *root)
static void compareDoxyfile(Config::CompareMode diffList)
static void addPageToContext(PageDef *pd, Entry *root)
static std::shared_ptr< Entry > parseFile(OutlineParserInterface &parser, FileDef *fd, const DString &fn, ClangTUParser *clangParser, bool newTU)
static void buildVarList(const Entry *root)
static void copyIcon(const DString &outputOption, bool toIndex)
static void buildSequenceList(const Entry *root)
static void generateFileSources()
static void copyExtraFiles(StringVector files, const DString &filesOption, const DString &outputOption, bool toIndex)
static void generateClassDocs()
static int findTemplateSpecializationPosition(const DString &name)
static void buildNamespaceList(const Entry *root)
static void findIncludedUsingDirectives()
static void addDefineDoc(const Entry *root, MemberDefMutable *md)
static void countMembers()
static ClassDef * findClassWithinClassContext(Definition *context, ClassDef *cd, const DString &name)
static void organizeSubGroups(const Entry *root)
static void applyMemberOverrideOptions(const Entry *root, MemberDefMutable *md)
static void addOverloaded(const Entry *root, MemberName *mn, const DString &funcType, const DString &funcName, const DString &funcArgs, const DString &funcDecl, const DString &exceptions, TypeSpecifier spec)
static void findFriends()
static void findEnums(const Entry *root)
static void generateConfigFile(const DString &configFile, bool shortList, bool updateOnly=false)
static DString g_commentFileName
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 bool findGlobalMember(const Entry *root, const DString &namespaceName, const DString &type, const DString &name, const DString &tempArg, const DString &, const DString &decl, TypeSpecifier)
static bool isClassSection(const Entry *root)
static void buildGroupListFiltered(const Entry *root, bool additional, bool includeExternal)
static void runHtmlHelpCompiler()
static void addMembersToIndex()
static bool g_dumpSymbolMap
static void version(const bool extended)
static OutputList * g_outputList
static DString extractClassName(const Entry *root)
static void findMainPage(Entry *root)
static ClassDef::CompoundType convertToCompoundType(EntryType section, TypeSpecifier specifier)
DString stripTemplateSpecifiers(const DString &s)
static void findUsingDirectives(const Entry *root)
static void addInterfaceOrServiceToServiceOrSingleton(const Entry *root, ClassDefMutable *cd, DString const &rname)
static bool g_successfulRun
static bool tryAddEnumDocsToGroupMember(const Entry *root, const DString &name)
static void addSourceReferences()
static void associateVariableWithAnonymousEnumType(const MemberDef *md, const Container *cd, const MemberDef *enumTypeMember, MemberListType mlFilter)
static void createUsingMemberImportForClass(const Entry *root, ClassDefMutable *cd, const MemberDef *md, const DString &fileName, const DString &memName)
static DString substituteTemplatesInString(const ArgumentLists &srcTempArgLists, const ArgumentLists &dstTempArgLists, const std::string &src)
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 void findTemplateInstanceRelation(const Entry *root, Definition *context, ClassDefMutable *templateClass, const DString &templSpec, const TemplateNameMap &templateNames, bool isArtificial)
static void findDocumentedEnumValues()
static void generateDiskNames()
static void addToIndices()
static void computeClassRelations()
static void buildFunctionList(const Entry *root)
static void checkPageRelations()
static void addGlobalFunction(const Entry *root, const DString &rname, const DString &sc)
static void findModuleDocumentation(const Entry *root)
static MemberDef * addVariableToClass(const Entry *root, ClassDefMutable *cd, MemberType mtype, const DString &type, const DString &name, const DString &args, Protection prot, Relationship related)
static void readTagFile(const std::shared_ptr< Entry > &root, const DString &tagLine)
static void findEnumDocumentation(const Entry *root)
static void computePageRelations(Entry *root)
static void addMethodToClass(const Entry *root, ClassDefMutable *cd, const DString &rtype, const DString &rname, const DString &rargs, bool isFriend, Protection protection, bool stat, Specifier virt, TypeSpecifier spec, const DString &relates)
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)
void readFileOrDirectory(const DString &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 generateNamespaceDocs()
static void buildClassDocList(const Entry *root)
static void buildPageList(Entry *root)
static void writeTagFile()
static void addRequirementReferences()
static void computeVerifiedDotPath()
static bool g_singleComment
static void findSectionsInDocumentation()
static void mergeCategories()
static const StringUnorderedSet g_compoundKeywords
static bool scopeIsTemplate(const Definition *d)
static void buildFileList(const Entry *root)
static void buildClassList(const Entry *root)
static void usage(const DString &name, const DString &versionString)
static void findUsedTemplateInstances()
static void computeTooltipTexts()
static void addVariable(const Entry *root, int isFuncPtr=-1)
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 const ClassDef * findClassDefinition(FileDef *fd, NamespaceDef *nd, const DString &scopeName)
static void filterMemberDocumentation(const Entry *root, const DString &relates)
static void generateConceptDocs()
static bool isRecursiveBaseClass(const DString &scope, const DString &name)
static std::unique_ptr< OutlineParserInterface > getParserForFile(const DString &fn)
static void combineUsingRelations()
static const char * getArg(int argc, char **argv, int &optInd)
std::unique_ptr< ArgumentList > getTemplateArgumentsFromName(const DString &name, const ArgumentLists &tArgLists)
static void findTagLessClasses(std::set< const Definition * > &candidates, const Container *cd)
static ClassDefMutable * createTagLessInstance(const Definition *root, const ClassDef *templ, const DString &fieldName)
static void checkMarkdownMainfile()
static std::unordered_map< std::string, std::vector< ClassDefMutable * > > g_usingClassMap
static void buildConceptDocList(const Entry *root)
static bool isEntryInGroupOfMember(const Entry *root, const MemberDef *md, bool allowNoGroup=false)
static void applyToAllDefinitions(Func func)
static void parseFilesMultiThreading(const std::shared_ptr< Entry > &root)
parse the list of input files
static DString createOutputDirectory(const DString &baseDirName, const DString &formatDirName, const char *defaultDirName)
static void transferFunctionReferences()
static void buildDefineList()
static void buildInterfaceAndServiceList(const Entry *root)
static Definition * findScopeFromQualifiedName(NamespaceDefMutable *startScope, const DString &n, FileDef *fileScope, const TagInfo *tagInfo)
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
DString substitute(const DString &s, const DString &src, const DString &dst)
substitute all occurrences of src in s by dst
int dstricmp(const char *s1, const char *s2)
uint32_t dstrlen(const char *str)
Returns the length of string str, or 0 if a null pointer is passed.
int dstricmp_sort(const char *str1, const char *str2)
int dstrcmp(const char *str1, const char *str2)
const char * qPrint(const char *s)
FileDef * toFileDef(Definition *d)
std::unique_ptr< FileDef > createFileDef(const DString &p, const DString &n, const DString &ref, const DString &dn)
std::unordered_set< const FileDef * > FileDefSet
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 DString &fileName, int line, const DString &name, const DString &title, const DString &refFileName)
void addConceptToGroups(const Entry *root, ConceptDef *cd)
void addMemberToGroups(const Entry *root, MemberDef *md)
void writeGraphInfo(OutputList &ol)
void endTitle(OutputList &ol, const DString &fileName, const DString &name)
void writeIndexHierarchy(OutputList &ol)
void endFile(OutputList &ol, bool skipNavIndex, bool skipEndContents, const DString &navPath)
void startTitle(OutputList &ol, const DString &fileName, const DefinitionMutable *def)
void startFile(OutputList &ol, const DString &name, bool isSource, const DString &manName, const DString &title, HighlightedItem hli, bool additionalIndices, const DString &altSidebarName, int hierarchyLevel, const DString &allMembersFile)
Translator * theTranslator
void setTranslator(OUTPUT_LANGUAGE_t langName)
#define LATEX_STYLE_EXTENSION
void writeDefaultLayoutFile(const DString &fileName)
std::unique_ptr< MemberDef > createMemberDef(const DString &defFileName, int defLine, size_t defColumn, const DString &type, const DString &name, const DString &args, const DString &excp, Protection prot, Specifier virt, bool stat, Relationship related, MemberType t, const ArgumentList &tal, const ArgumentList &al, const DString &metaData)
Factory method to create a new instance of a MemberDef.
std::unique_ptr< MemberDef > createMemberDefAlias(const Definition *newScope, const MemberDef *aliasMd)
MemberDefMutable * toMemberDefMutable(Definition *d)
void mergeMemberOverrideOptions(MemberDefMutable *md1, MemberDefMutable *md2)
void combineDeclarationAndDefinition(MemberDefMutable *mdec, MemberDefMutable *mdef)
MemberDef * toMemberDef(Definition *d)
std::unordered_map< int, std::unique_ptr< MemberGroupInfo > > MemberGroupInfoMap
DString warn_line(const DString &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)
void writeTemplate(TextStream &t, bool shortList, bool updateOnly=false)
bool parse(const DString &fileName, bool update=false, CompareMode compareMode=CompareMode::Full)
void correctPath(const StringVector &list)
Correct a possible wrong PATH variable.
FILE * popen(const DString &name, const DString &type)
double getSysElapsedTime()
void setenv(const DString &variable, const DString &value)
int system(const DString &command, const DString &args, bool commandHasConsole=true)
DString getenv(const DString &variable)
bool isAbsolutePath(const DString &fileName)
DString pathListSeparator()
std::ofstream openOutputStream(const DString &name, bool append=false)
const char * commandExtension()
DString trunc(const DString &s, size_t numChars=15)
std::unique_ptr< NamespaceDef > createNamespaceDef(const DString &defFileName, int defLine, size_t defColumn, const DString &name, const DString &ref, const DString &refFile, const DString &type, bool isPublished)
Factory method to create new NamespaceDef instance.
std::unique_ptr< NamespaceDef > createNamespaceDefAlias(const Definition *newScope, const NamespaceDef *nd)
Factory method to create an alias of an existing namespace.
void replaceNamespaceAliases(DString &name)
NamespaceDef * getResolvedNamespace(const DString &name)
NamespaceDef * toNamespaceDef(Definition *d)
NamespaceDefMutable * toNamespaceDefMutable(Definition *d)
NamespaceDefMutable * getResolvedNamespaceMutable(const DString &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 DString &f, int l, const DString &n, const DString &d, const DString &t)
void setPerlModDoxyfile(const DString &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)
void addRefItem(const RefItemVector &sli, const DString &key, const DString &prefix, const DString &name, const DString &title, const DString &args, const Definition *scope)
void finalizeSearchIndexer()
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
DString name
the name of the base class
Data associated with description found in the body.
Helper class to pass options when calling OutputList::generateDoc().
DString groupname
name of the group
static constexpr const char * getGroupPriName(GroupPri_t priority) noexcept
@ GROUPING_INGROUP
membership in group was defined by @ingroup
GroupPri_t pri
priority of this definition
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 DString &logFile, bool timing)
bool useCaseSenseNames()
Returns true if the names of the symbols can be case sensitive.
DString substituteTemplateArgumentsInString(const DString &nm, const ArgumentList &formalArgs, const ArgumentList *actualArgs)
bool protectionLevelVisible(Protection prot)
DString stripFromIncludePath(const DString &path)
DString mergeScopes(const DString &leftScope, const DString &rightScope)
DString filterTitle(const DString &title)
bool matchTemplateArguments(const ArgumentList &srcAl, const ArgumentList &dstAl)
void addCodeOnlyMappings()
bool rightScopeMatch(const DString &scope, const DString &name)
bool checkIfTypedef(const Definition *scope, const FileDef *fileScope, const DString &n)
DString replaceAnonymousScopes(const DString &s, const DString &replacement)
void cleanupInlineGraphs()
int computeQualifiedIndex(const DString &name)
Return the index of the last :: in the string name that is still before the first <.
DString removeRedundantWhiteSpace(const DString &s)
bool checkExtension(const DString &fName, const DString &ext)
DString convertNameToFile(const DString &name, bool allowDots, bool allowUnderscore)
bool leftScopeMatch(const DString &scope, const DString &name)
DString tempArgListToString(const ArgumentList &al, SrcLangExt lang, bool includeDefault)
DString getFileNameExtension(const DString &fn)
DString resolveTypeDef(const Definition *context, const DString &qualifiedName, const Definition **typedefContext)
bool readInputFile(const DString &fileName, std::string &contents, bool filter, bool isSourceCode)
read a file name fileName and optionally filter and transcode it
DString normalizeNonTemplateArgumentsInString(const DString &name, const Definition *context, const ArgumentList &formalArgs)
SrcLangExt getLanguageFromFileName(const DString &fileName, SrcLangExt defLang)
bool matchArguments2(const Definition *srcScope, const FileDef *srcFileScope, const DString &srcReturnType, const ArgumentList *srcAl, const Definition *dstScope, const FileDef *dstFileScope, const DString &dstReturnType, const ArgumentList *dstAl, bool checkCV, SrcLangExt lang)
void initDefaultExtensionMapping()
void addHtmlExtensionIfMissing(DString &fName)
DString fileToString(const DString &name, bool filter, bool isSourceCode)
void extractNamespaceName(const DString &scopeName, DString &className, DString &namespaceName, bool allowEmptyClass)
DString stripTemplateSpecifiersFromScope(const DString &fullName, bool parentOnly, DString *pLastScopeStripped, DString scopeName, bool allowArtificial)
DString argListToString(const ArgumentList &al, bool useCanonicalType, bool showDefVals)
DString projectLogoFile()
bool copyFile(const DString &src, const DString &dest)
Copies the contents of file with name src to the newly created file with name dest.
int getPrefixIndex(const DString &name)
DString getLanguageSpecificSeparator(SrcLangExt lang, bool classScope)
bool updateLanguageMapping(const DString &extension, const DString &language)
DString mangleCSharpGenericName(const DString &name)
void mergeArguments(ArgumentList &srcAl, ArgumentList &dstAl, bool forceNameOverwrite)
int getScopeFragment(const DString &s, int p, int *l)
int extractClassNameFromType(const DString &type, int &pos, DString &name, DString &templSpec, SrcLangExt lang)
bool openOutputFile(const DString &outFile, std::ofstream &f)
DString stripAnonymousNamespaceScope(const DString &s)
A bunch of utility functions.