30#include <unordered_map>
123#pragma GCC diagnostic push
124#pragma GCC diagnostic ignored "-Wshadow"
126#include <clang/Basic/Version.h>
128#pragma GCC diagnostic pop
135#if !defined(_WIN32) || defined(__CYGWIN__)
203{
"template class",
"template struct",
"class",
"struct",
"union",
"interface",
"exception" };
240 stats.emplace_back(name,0);
241 startTime = std::chrono::steady_clock::now();
245 std::chrono::steady_clock::time_point endTime = std::chrono::steady_clock::now();
246 stats.back().elapsed =
static_cast<double>(std::chrono::duration_cast<
247 std::chrono::microseconds>(endTime -
startTime).count())/1000000.0;
258 msg(
"----------------------\n");
259 for (
const auto &s :
stats)
261 msg(
"Spent {:.6f} seconds in {}",s.elapsed,s.name);
326 if (!includeFile.
empty() && includeFile.
at(0)==
'"')
329 includeFile=includeFile.
mid(1,includeFile.
length()-2);
331 else if (!includeFile.
empty() && includeFile.
at(0)==
'<')
334 includeFile=includeFile.
mid(1,includeFile.
length()-2);
341 if (!includeFile.
empty() &&
346 text.
sprintf(
"the name '%s' supplied as "
347 "the argument of the \\class, \\struct, \\union, or \\headerfile command ",
352 text+=
"matches the following input files:\n";
355 text+=
"Please use a more specific name by "
356 "including a (larger) part of the path!";
360 text+=
"is not an input file";
364 else if (includeFile.
empty() && ifd &&
378 if (iName.
at(0)==
'<') local=
false;
379 else if (iName.
at(0)==
'"') local=
true;
380 if (iName.
at(0)==
'"' || iName.
at(0)==
'<')
404 def->setIncludeFile(
nullptr,iName,local,
true);
427 scope+=
"::"+pd->
name();
470 ((!includeExternal && root->
tagInfo()==
nullptr) ||
471 ( includeExternal && root->
tagInfo()!=
nullptr))
474 AUTO_TRACE(
"additional={} includeExternal={}",additional,includeExternal);
490 "group {}: ignoring title \"{}\" that does not match old title \"{}\"",
511 std::unique_ptr<GroupDef>(
518 std::unique_ptr<GroupDef>(
569 scope+=
"::"+gd->
name();
621 bool save_ambig = ambig;
625 size_t newIndex=fn.
rfind(
'/');
632 fn = fn.
left(newIndex)+
"/"+root->
name;
635 if (!fd) ambig = save_ambig;
667 "Found non-existing group '{}' for the command '{}', ignoring command",
676 text.
sprintf(
"the name '%s' supplied as "
677 "the argument in the \\file statement ",
681 text+=
"matches the following input files:\n";
684 text+=
"Please use a more specific name by "
685 "including a (larger) part of the path!";
689 text+=
"is not an input file";
703 for (
size_t i=0;i<l;i++)
707 else if (c==
')' && round>0) round--;
708 else if (c==
'<' && round==0) count++;
713 if (c==
'>' && round==0 && count>0) count--;
736 if (idx==-1)
return prevScope;
738 if (nsName.
empty())
return prevScope;
739 if (!fullScope.
empty()) fullScope+=
"::";
744 if (nd==
nullptr) cd =
getClass(fullScope);
745 if (nd==
nullptr && cd)
757 "[generated]",1,1,fullScope,
775 if (prevScopeMutable)
807 int p=i1+l1,l2=0,i2=0;
810 DString nestedNameSpecifier = scope.
mid(i1,l1);
815 if (resultScope==
nullptr)
826 if (resultScope!=
nullptr)
break;
885 auto alIt = tArgLists.begin();
902 return alIt!=tArgLists.end() ?
903 std::make_unique<ArgumentList>(*alIt) :
904 std::unique_ptr<ArgumentList>();
912 if (specifier.isStruct())
914 else if (specifier.isUnion())
916 else if (specifier.isCategory())
918 else if (specifier.isInterface())
920 else if (specifier.isProtocol())
922 else if (specifier.isException())
924 else if (specifier.isService())
926 else if (specifier.isSingleton())
929 if (section.isUnionDoc())
931 else if (section.isStructDoc())
933 else if (section.isInterfaceDoc())
935 else if (section.isProtocolDoc())
937 else if (section.isCategoryDoc())
939 else if (section.isExceptionDoc())
941 else if (section.isServiceDoc())
943 else if (section.isSingletonDoc())
971 DString qualifiedName = fullName;
974 qualifiedName.
prepend(scName+
"::");
980 AUTO_TRACE_ADD(
"Found class with name '{}', qualifiedName '{}'", cd ? cd->
name() : root->
name, qualifiedName);
1035 AUTO_TRACE_ADD(
"New class: fullname '{}' namespace '{}' name='{}' brief='{}' docs='{}'",
1052 std::unique_ptr<ArgumentList> tArgList;
1054 if ((root->
lang==SrcLangExt::CSharp || root->
lang==SrcLangExt::Java) &&
1069 fullName=fullName.
left(i);
1080 fullName,sec,tagName,refFileName,
true,root->
spec.isEnum()) ));
1083 AUTO_TRACE_ADD(
"New class '{}' type={} #tArgLists={} tagInfo={} hidden={} artificial={}",
1120 AUTO_TRACE_ADD(
"Class {} not added, already exists as alias", fullName);
1128 if (!root->
spec.isForwardDecl())
1190 qualifiedName.
prepend(scName+
"::");
1196 AUTO_TRACE_ADD(
"Found concept with name '{}' (qualifiedName='{}')", cd ? cd->
name() : root->
name, qualifiedName);
1200 qualifiedName=cd->
name();
1214 AUTO_TRACE_ADD(
"New concept: fullname '{}' namespace '{}' name='{}' brief='{}' docs='{}'",
1215 qualifiedName,namespaceName,className,root->
brief,root->
doc);
1236 qualifiedName,tagName,refFileName)));
1240 qualifiedName,root->
tArgLists.size(),fmt::ptr(tagInfo));
1271 for (
const auto &ce : root->
children())
1274 if (ce->section.isConceptDocPart())
1279 if (!ce->brief.empty())
1281 cd->
addDocPart(ce->brief,ce->startLine,ce->startColumn);
1284 if (!ce->doc.empty())
1286 cd->
addDocPart(ce->doc,ce->startLine,ce->startColumn);
1290 else if (ce->section.isConceptCodePart())
1292 cd->
addCodePart(ce->initializer.str(),ce->startLine,ce->startColumn);
1299 AUTO_TRACE_ADD(
"Concept '{}' not added, already exists (as alias)", qualifiedName);
1306 for (
const auto &ce : root->
children())
1308 if (ce->section.isConceptDocPart())
1328 if (root->
section.isModuleDoc())
1338 if (root->
section.isConcept())
1348 if (root->
section.isConceptDoc())
1367 if (cd!=ocd && cd->groupId()==ocd->groupId() &&
1368 !cd->partOfGroups().empty() && ocd->partOfGroups().empty())
1373 for (
const auto &gd : cd->partOfGroups())
1379 gd->addConcept(ocd.get());
1404 aliasFullName(name),aliasCd(std::move(cd)), aliasContext(ctx) {}
1406 std::unique_ptr<ClassDef> aliasCd;
1409 std::vector<ClassAlias> aliases;
1413 if (cd && visitedClasses.find(icd.get())==visitedClasses.end())
1419 name,icd->getFileDef(),
nullptr);
1445 aliases.emplace_back(aliasFullName,std::move(aliasCd),dm);
1456 visitedClasses.insert(icd.get());
1466 for (
auto &alias : aliases)
1471 alias.aliasContext->addInnerCompound(aliasCd);
1480 if (cd && visitedClasses.find(icd.get())==visitedClasses.end())
1502 "Incomplete input: scope for class {} not found!{}",name,
1503 name.
startsWith(
"std::") ?
" Try enabling BUILTIN_STL_SUPPORT." :
""
1522 if (visitedClasses.find(cd.get())==visitedClasses.end() && !cd->partOfGroups().empty())
1526 for (
auto &ncd : cd->getClasses())
1537 visitedClasses.insert(cd.get());
1544template<
typename Container>
1546 const Container *cd,
1552 MemberList *eiml = cd->getMemberList(mlFilter);
1555 for (
const auto &eimd : *eiml)
1557 DString vtype = eimd->typeString();
1578 const char *p = n.
data()+sn;
1582 if (!isdigit(c) && c!=
'@' && c!=
':')
break;
1588 DString fullName = n+
"."+fieldName;
1617 else if (outerScope)
1632 auto newMd =
createMemberDef(md->getDefFileName(),md->getDefLine(),md->getDefColumn(),
1633 md->typeString(),md->name(),md->argsString(),md->excpString(),
1634 md->protection(),md->virtualness(),md->isStatic(),Relationship::Member,
1644 imd->
setId(md->id());
1665 for (
const auto &md : *ml)
1674 for (
const auto &md : *ml)
1678 if (md->isEnumerate() && md->name().startsWith(
"@"))
1680 for (
const auto &emd : md->enumFieldList())
1703template<
typename Container,
typename TagContainer>
1705 const Container *cd,
1706 const TagContainer *tagParent,
1711 AUTO_TRACE(
"count={} name={}\n",count,cd->name());
1714 MemberList *ml = cd->getMemberList(varFilter);
1718 for (
const auto &md : *ml)
1720 DString type = md->typeString();
1725 std::vector<const ClassDef *> candidates;
1726 for (
const auto &icd : cd->getClasses())
1728 candidates.push_back(icd);
1730 for (
const auto &icd : candidates)
1736 if (md->isAnonymous()) name =
"__unnamed" +
DString().
setNum(pos++)+
"__";
1742 processTagLessClasses(ncd,icd,ncd,MemberListType::PubAttribs(),MemberListType::PubTypes(),name,count+1);
1747 MemberList *pml = tagParent->getMemberList(varFilter);
1750 for (
const auto &pmd : *pml)
1753 if (pmdm && pmd->
name()==md->name())
1770 ml = cd->getMemberList(typeFilter);
1773 for (
const auto &md : *ml)
1782template<
typename Container>
1785 for (
const auto &icd : cd->getClasses())
1793 candidates.insert(cd);
1798 std::set<const Definition *> candidates;
1808 const FileDef *fd = cd->getFileDef();
1823 for (
const auto &d : candidates)
1829 processTagLessClasses(nd,nd,nd,MemberListType::DecVarMembers(),MemberListType::DecEnumMembers(),
"",0);
1834 processTagLessClasses(fd,fd,fd,MemberListType::DecVarMembers(),MemberListType::DecEnumMembers(),
"",0);
1851 (root->
section.isNamespace() ||
1852 root->
section.isNamespaceDoc() ||
1861 if (root->
section.isPackageDoc())
1867 if (!fullName.
empty())
1926 root->
type,root->
spec.isPublished())));
1994 DString aliasName = aliasNd->name();
2023 for (
auto &und : unl)
2025 DString uScope=und->name()+
"::";
2027 if (usingNd!=
nullptr)
break;
2034 if (root->
section.isUsingDir())
2052 (fd==
nullptr || fd->
getLanguage()!=SrcLangExt::Java)
2056 if (!nsName.
empty())
2066 int scopeOffset =
static_cast<int>(nsName.
length());
2079 size_t o = nsName.
rfind(
"::",scopeOffset-1);
2082 }
while (scopeOffset>=0 && usingNd==
nullptr);
2084 if (usingNd==
nullptr && nd)
2088 while (pnd && usingNd==
nullptr)
2105 if (usingNd==
nullptr && fd)
2178 if (root->
section.isUsingDecl() &&
2191 if (root->
section.isUsingDecl() &&
2193 (!filterPythonPackages || (root->
lang==SrcLangExt::Python && root->
fileName.
endsWith(
"__init__.py")))
2196 AUTO_TRACE(
"Found using declaration '{}' at line {} of {} inside section {}",
2210 if (!scName.
empty())
2226 if (nd==
nullptr) scope = fd;
2296 AUTO_TRACE(
"creating new member {} for class {}",memName,cd->
name());
2307 newMmd->setMemberClass(cd);
2325 newMmd->addSectionsToDefinition(root->
anchors);
2331 newMmd->setMemberGroupId(root->
mGrpId);
2334 newMmd->setLanguage(root->
lang);
2335 newMmd->setId(root->
id);
2344 if (root->
section.isUsingDecl() &&
2371 for (
auto &mi : *mni)
2374 if (md && md->
protection()!=Protection::Private)
2389 for (
const auto ©Cd : it->second)
2402 else if (root->
section.isUsingDecl() &&
2404 root->
lang==SrcLangExt::Cpp
2437 memName = root->
name;
2459 newMmd->setNamespace(nd);
2464 newMmd->setFileDef(fd);
2483 newMmd->addSectionsToDefinition(root->
anchors);
2489 newMmd->setMemberGroupId(root->
mGrpId);
2492 newMmd->setLanguage(root->
lang);
2493 newMmd->setId(root->
id);
2501 if (nd && aliasMd.get())
2505 if (fd && aliasMd.get())
2534 if (nd) ncdm->
moveTo(nd);
2563 aliasFullName = aliasCd->localName();
2567 aliasFullName = nd->
qualifiedName()+
"::"+aliasCd->localName();
2599 for (
const auto &fd : *fn)
2602 fd->addIncludedUsingDirectives(visitedFiles);
2622 if (lang==SrcLangExt::Java || lang==SrcLangExt::CSharp)
2627 AUTO_TRACE(
"class variable: file='{}' type='{}' scope='{}' name='{}' args='{}' prot={} mtype={} lang={} init='{}'",
2633 if (related!=Relationship::Member || mtype==MemberType::Friend ||
Config_getBool(HIDE_SCOPE_NAMES))
2635 if (root->
spec.isAlias())
2637 if (lang==SrcLangExt::Python)
2639 def=
"type "+name+args;
2648 def=type+
" "+name+args;
2653 if (root->
spec.isAlias())
2655 if (lang==SrcLangExt::Python)
2657 def=
"type "+qualScope+scopeSeparator+name+args;
2661 def=
"using "+qualScope+scopeSeparator+name;
2666 def=type+
" "+qualScope+scopeSeparator+name+args;
2678 def=qualScope+scopeSeparator+name+args;
2689 for (
const auto &imd : *mn)
2701 if (root->
lang==SrcLangExt::ObjC &&
2702 root->
mtype==MethodTypes::Property &&
2726 prot,Specifier::Normal,root->
isStatic,related,
2730 mmd->setTagInfo(root->
tagInfo());
2731 mmd->setMemberClass(cd);
2735 mmd->setDefinition(def);
2737 mmd->addSectionsToDefinition(root->
anchors);
2741 mmd->setMemberGroupId(root->
mGrpId);
2742 mmd->setMemberSpecifiers(root->
spec);
2743 mmd->setVhdlSpecifiers(root->
vhdlSpec);
2744 mmd->setReadAccessor(root->
read);
2745 mmd->setWriteAccessor(root->
write);
2747 mmd->setHidden(root->
hidden);
2749 mmd->setLanguage(root->
lang);
2750 mmd->setId(root->
id);
2753 mmd->setBodyDef(root->
fileDef());
2759 mmd->setRefItems(root->
sli);
2760 mmd->setRequirementReferences(root->
rqli);
2765 if (mtype==MemberType::Typedef)
2788 AUTO_TRACE(
"global variable: file='{}' type='{}' scope='{}' name='{}' args='{}' prot={} mtype={} lang={} init='{}'",
2794 if (mtype==MemberType::Typedef &&
Config_getBool(TYPEDEF_HIDES_STRUCT))
2800 static const reg::Ex re(R
"(\a\w*)");
2802 const std::string &typ = ttype.
str();
2805 DString typeValue = match.str();
2840 if (root->
spec.isAlias())
2842 if (lang==SrcLangExt::Python)
2844 def=
"type "+nd->
name()+sep+name+args;
2848 def=
"using "+nd->
name()+sep+name;
2853 def=type+
" "+nd->
name()+sep+name+args;
2858 def=nd->
name()+sep+name+args;
2865 if (name.
at(0)==
'@')
2871 if (root->
spec.isAlias())
2873 if (root->
lang==SrcLangExt::Python)
2875 def=
"type "+root->
name+args;
2879 def=
"using "+root->
name;
2884 def=type+
" "+name+args;
2905 for (
const auto &imd : *mn)
2919 bool isPHPArray = md->
getLanguage()==SrcLangExt::PHP &&
2922 bool staticsInDifferentFiles =
2928 !staticsInDifferentFiles
2970 mmd->setTagInfo(root->
tagInfo());
2971 mmd->setMemberSpecifiers(root->
spec);
2972 mmd->setVhdlSpecifiers(root->
vhdlSpec);
2976 mmd->addSectionsToDefinition(root->
anchors);
2979 mmd->setMemberGroupId(root->
mGrpId);
2980 mmd->setDefinition(def);
2981 mmd->setLanguage(root->
lang);
2982 mmd->setId(root->
id);
2990 mmd->setBodyDef(fd);
2996 mmd->setRefItems(root->
sli);
2997 mmd->setRequirementReferences(root->
rqli);
3000 mmd->setNamespace(nd);
3008 mmd->setFileDef(fd);
3014 if (mtype==MemberType::Typedef)
3036 if (lang == SrcLangExt::Fortran || lang == SrcLangExt::VHDL)
3041 static const reg::Ex re(R
"(\([^)]*[*&^][^)]*\))");
3043 size_t i=std::string::npos;
3047 i = match.position();
3050 if (i!=std::string::npos)
3052 size_t di = type.find(
"decltype(");
3053 if (di!=std::string::npos && di<i)
3055 i = std::string::npos;
3058 size_t bb=type.find(
'<');
3059 size_t be=type.rfind(
'>');
3060 bool templFp =
false;
3061 if (be!=std::string::npos) {
3062 size_t cc_ast = type.find(
"::*");
3063 size_t cc_amp = type.find(
"::&");
3064 templFp = (cc_ast != std::string::npos && cc_ast>be) || (cc_amp != std::string::npos && cc_amp>be);
3067 if (!type.empty() &&
3068 i!=std::string::npos &&
3069 type.find(
"operator")==std::string::npos &&
3070 (type.find(
")(")==std::string::npos || type.find(
"typedef ")!=std::string::npos) &&
3072 (!((bb!=std::string::npos && bb<i) && (be!=std::string::npos && i<be)) || templFp)
3075 if (pLength) *pLength=
static_cast<int>(l);
3078 return static_cast<int>(i);
3095 bool result =
false;
3096 bool typeIsClass =
false;
3097 bool typePtrType =
false;
3134 typeIsClass = resolver.
resolveClass(ctx,type)!=
nullptr;
3152 static const reg::Ex initChars(R
"([\d"'&*!^]+)");
3156 std::string name = a.
name.
str();
3157 if (
reg::search(name,match,initChars) && match.position()==0)
3189 std::string atype = a.
type.
str();
3190 if (
reg::search(atype,match,initChars) && match.position()==0)
3197 if (resType.empty()) resType=atype;
3198 static const reg::Ex idChars(R
"(\a\w*)");
3199 if (
reg::search(resType,match,idChars) && match.position()==0)
3201 resType=match.str();
3202 if (resType==
"int" || resType==
"long" ||
3203 resType==
"float" || resType==
"double" ||
3204 resType==
"char" || resType==
"void" ||
3205 resType==
"signed" || resType==
"unsigned" ||
3206 resType==
"const" || resType==
"volatile" )
3243 bool insideString=
false;
3244 bool insideChar=
false;
3246 while (e<len && brCount!=0)
3252 if (!insideString && !insideChar)
3254 if (e<len-1 && s.
at(e+1)==
'<')
3256 else if (roundCount==0)
3261 if (!insideString && !insideChar)
3263 if (e<len-1 && s.
at(e+1)==
'>')
3265 else if (roundCount==0)
3270 if (!insideString && !insideChar)
3274 if (!insideString && !insideChar)
3280 if (insideString && pc!=
'\\')
3289 if (insideChar && pc!=
'\\')
3299 return brCount==0 ?
static_cast<int>(e) : -1;
3308 AUTO_TRACE(
"VARIABLE_SEC: type='{}' name='{}' args='{}' bodyLine={} endBodyLine={} mGrpId={} relates='{}'",
3323 std::string sargs = args.
str();
3324 static const reg::Ex reName(R
"(\a\w*)");
3329 sargs = match.suffix().str();
3330 size_t j = sargs.find(
')');
3331 if (j!=std::string::npos) args=sargs.
substr(0,j);
3342 size_t ai = type.
find(
'[',ii);
3355 AUTO_TRACE_ADD(
"after correction: type='{}' name='{}' args='{}'",type,name,args);
3368 bool variableTemplateSpecialization = index!=-1 && !root->
tArgLists.empty() &&
3371 if (qualifiedGroupMember || variableTemplateSpecialization)
3374 if (variableTemplateSpecialization)
3384 scope=name.
left(index);
3385 name=name.
mid(index+2);
3393 if (!scopeName.
empty())
3405 bool isRelated=
false;
3406 bool isMemberOf=
false;
3409 if (root->
lang==SrcLangExt::CSharp)
3422 for (
size_t i=0;i<name.
length()-1;i++)
3424 if (name[i]==
':' && name[i+1]==
':')
3426 p=
static_cast<int>(i);
3428 else if (name[i]==
'<')
3433 if (e!=-1) i=
static_cast<int>(e);
3451 Relationship::Member
3472 mtype=MemberType::EnumValue;
3474 mtype=MemberType::Typedef;
3475 else if (type_s.
startsWith(
"friend ") || type_s==
"friend")
3476 mtype=MemberType::Friend;
3477 else if (root->
mtype==MethodTypes::Property)
3478 mtype=MemberType::Property;
3479 else if (root->
mtype==MethodTypes::Event)
3480 mtype=MemberType::Event;
3482 mtype=sliceOpt ? MemberType::Sequence : MemberType::Typedef;
3484 mtype=sliceOpt ? MemberType::Dictionary : MemberType::Typedef;
3489 isMemberOf=(root->
relatesType==RelatesType::MemberOf);
3504 Relationship relationship = isMemberOf ? Relationship::Foreign :
3505 isRelated ? Relationship::Related :
3506 Relationship::Member ;
3518 else if (!name.
empty())
3544 scope=rname.
left(index);
3545 rname=rname.
mid(index+2);
3557 for (
auto &imd : *mn)
3559 if (!imd->isTypedef())
3568 bool notBothGrouped = root->
groups.empty() || imd->getGroupDef()==
nullptr;
3569 bool bothSameScope = (!cd && !nd) || (cd && imd->getClassDef() == cd) || (nd && imd->getNamespaceDef() == nd);
3572 if (notBothGrouped && bothSameScope && imd->typeString()==rtype)
3620 for (
const auto &e : root->
children())
3621 if (!e->section.isEnum())
3638 for (
const auto &e : root->
children())
3639 if (!e->section.isEnum())
3656 for (
const auto &e : root->
children())
3657 if (!e->section.isEnum())
3672 (root->
section.isVariable() &&
3675 (root->
section.isFunction() &&
3678 (root->
section.isFunction() &&
3687 for (
const auto &e : root->
children())
3688 if (!e->section.isEnum())
3703 enum MemberType type = root->
section.isExportedInterface() ? MemberType::Interface : MemberType::Service;
3714 mmd->setTagInfo(root->
tagInfo());
3715 mmd->setMemberClass(cd);
3717 mmd->setDocsForDefinition(
false);
3721 mmd->setMemberSpecifiers(root->
spec);
3722 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3723 mmd->setMemberGroupId(root->
mGrpId);
3725 mmd->setLanguage(root->
lang);
3726 mmd->setBodyDef(fd);
3727 mmd->setFileDef(fd);
3728 mmd->addSectionsToDefinition(root->
anchors);
3730 mmd->setDefinition(def);
3735 AUTO_TRACE(
"Interface member: fileName='{}' type='{}' name='{}' mtype='{}' prot={} virt={} state={} proto={} def='{}'",
3743 root->
spec.isOptional() ? Protection::Protected : Protection::Public, Specifier::Normal);
3753 mmd->setRefItems(root->
sli);
3754 mmd->setRequirementReferences(root->
rqli);
3763 if (root->
section.isExportedInterface() || root->
section.isIncludedService())
3765 AUTO_TRACE(
"Exported interface/included service: type='{}' scope='{}' name='{}' args='{}'"
3766 " relates='{}' relatesType='{}' file='{}' line={} bodyLine={} #tArgLists={}"
3767 " mGrpId={} spec={} proto={} docFile='{}'",
3790 else if (rname.
empty())
3793 "Illegal member name found.");
3799 case SrcLangExt::Unknown:
3800 case SrcLangExt::IDL:
3829 if (isFriend) mtype=MemberType::Friend;
3830 else if (root->
mtype==MethodTypes::Signal) mtype=MemberType::Signal;
3831 else if (root->
mtype==MethodTypes::Slot) mtype=MemberType::Slot;
3832 else if (root->
mtype==MethodTypes::DCOP) mtype=MemberType::DCOP;
3837 if ((fd==
nullptr || fd->
getLanguage()==SrcLangExt::Cpp) &&
3841 (j!=i+2 || name.
at(i+1)!=
'=')
3859 root->
relatesType==RelatesType::MemberOf ? Relationship::Foreign :
3860 Relationship::Related ;
3870 mmd->setTagInfo(root->
tagInfo());
3871 mmd->setMemberClass(cd);
3873 mmd->setDocsForDefinition(!root->
proto);
3877 mmd->setMemberSpecifiers(spec);
3878 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3879 mmd->setMemberGroupId(root->
mGrpId);
3881 mmd->setLanguage(root->
lang);
3882 mmd->setRequiresClause(root->
req);
3883 mmd->setId(root->
id);
3884 mmd->setBodyDef(fd);
3885 mmd->setFileDef(fd);
3886 mmd->addSectionsToDefinition(root->
anchors);
3892 if (scopeSeparator!=
"::")
3894 qualScope =
substitute(qualScope,
"::",scopeSeparator);
3896 if (lang==SrcLangExt::PHP)
3899 scopeSeparator=
"::";
3916 def=type+
" "+qualScope+scopeSeparator+name;
3920 def=qualScope+scopeSeparator+name;
3924 mmd->setDefinition(def);
3928 AUTO_TRACE(
"function member: type='{}' scope='{}' name='{}' args='{}' proto={} def='{}'",
3929 type, qualScope, rname, args, root->
proto, def);
3939 mmd->setRefItems(root->
sli);
3940 mmd->setRequirementReferences(root->
rqli);
3960 MemberType::Function,
3964 mmd->setTagInfo(root->
tagInfo());
3965 mmd->setLanguage(root->
lang);
3966 mmd->setId(root->
id);
3971 mmd->setDocsForDefinition(!root->
proto);
3977 mmd->addSectionsToDefinition(root->
anchors);
3978 mmd->setMemberSpecifiers(root->
spec);
3979 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3980 mmd->setMemberGroupId(root->
mGrpId);
3981 mmd->setRequiresClause(root->
req);
3992 if (!nscope.
empty())
4017 def=root->
type+
" "+scope+name;
4023 AUTO_TRACE(
"new non-member function type='{}' scope='{}' name='{}' args='{}' proto={} def='{}'",
4025 mmd->setDefinition(def);
4029 mmd->setRefItems(root->
sli);
4030 mmd->setRequirementReferences(root->
rqli);
4034 mmd->setNamespace(nd);
4041 mmd->setFileDef(fd);
4062 if (root->
section.isFunction())
4064 AUTO_TRACE(
"member function: type='{}' scope='{}' name='{}' args='{}' relates='{}' relatesType='{}'"
4065 " file='{}' line={} bodyLine={} #tArgLists={} mGrpId={}"
4066 " spec={} proto={} docFile='{}'",
4081 scope=rname.
left(index);
4082 rname=rname.
mid(index+2);
4091 if (root->
lang==SrcLangExt::CSharp)
4102 size_t memIndex=rname.
rfind(
"::");
4105 if (cd && scope+
"::"==rname.
left(scope.
length()+2))
4111 bool isMember=
false;
4114 size_t ts=rname.
find(
'<');
4115 size_t te=rname.
find(
'>');
4133 isMember=memIndex<ts || memIndex>te;
4173 for (
const auto &imd : *mn)
4186 fullScope.
prepend(parentScope);
4192 if (mnd) nsName = mnd->
name();
4193 if (rnd) rnsName = rnd->
name();
4201 bool sameTemplateArgs =
true;
4202 bool matchingReturnTypes =
true;
4203 bool sameRequiresClause =
true;
4209 matchingReturnTypes =
false;
4213 sameRequiresClause =
false;
4219 sameTemplateArgs =
false;
4222 bool staticsInDifferentFiles =
4225 if (sameTemplateArgs &&
4226 matchingReturnTypes &&
4227 sameRequiresClause &&
4228 !staticsInDifferentFiles &&
4235 if (!root->
groups.empty() && !root->
groups.front().groupname.empty())
4242 found=(mnd && rnd && nsName==rnsName) ||
4243 ((mnd==
nullptr && rnd==
nullptr && mfd!=
nullptr &&
4248 if (!found && gd && gd==md->
getGroupDef() && nsName==rnsName)
4254 AUTO_TRACE_ADD(
"combining function with prototype found={} in namespace '{}'",found,nsName);
4353 else if (rname.
empty())
4356 "Illegal member name found."
4374 for (
const auto &ifmd : *fn)
4378 for (
const auto &immd : *mn)
4394 AUTO_TRACE_ADD(
"Merging related global and member '{}' isFriend={} isRelated={} isFunction={}",
4471 for (
const auto &imdec : *mn)
4479 for (
const auto &imdef : *mn)
4482 if (mdef && mdec!=mdef &&
4502 for (
const auto &imd : *mn)
4518 if (mdef && mdec)
break;
4526 mdec->getOuterScope(),mdec->getFileDef(),mdec->typeString(),
const_cast<ArgumentList*
>(&mdecAl),
4533 mdec->mergeReferences(mdef);
4535 mdec->mergeReferencedBy(mdef);
4552 for (
const auto &imd : *mn)
4563 for (
const auto &irmd : *rmn)
4597 size_t i=qualifiedName.rfind(
"::");
4598 if (i!=std::string::npos)
4605 for (
const auto &imd : *mn)
4631 std::map<std::string,int> templateNames;
4633 for (
const Argument &arg : templateArguments)
4635 static const reg::Ex re(R
"(\a[\w:]*)");
4638 for (; it!=
end ; ++it)
4640 const auto &match = *it;
4641 std::string n = match.str();
4642 if (n==arg.name.str())
4644 if (templateNames.find(n)==templateNames.end())
4646 templateNames.emplace(n,count);
4651 return templateNames;
4666 if (context && cd!=context)
4671 if (result==
nullptr)
4676 if (result==
nullptr)
4705 for (
auto &mi : *mni)
4713 if (!typedefValue.
empty())
4715 type = typedefValue;
4734 usedClassName = typeCd->
name();
4744 if (templateNames.empty())
4748 BaseInfo bi(usedName,Protection::Public,Specifier::Normal);
4753 if (arg.name==usedName)
4757 if (usedCd==
nullptr)
4808 if (!found && !type.
empty())
4867 if (templateNames.empty())
4883 bool b =
Config_getBool(HIDE_UNDOC_RELATIONS) ? true : isArtificial;
4905 AUTO_TRACE(
"Derived from template '{}' with parameters '{}' isArtificial={}",
4906 templateClass->
name(),templSpec,isArtificial);
4909 bool existingClass = templSpec==tempArgsStr;
4910 if (existingClass)
return;
4912 bool freshInstance=
false;
4929 for (
auto it=it_pair.first ; it!=it_pair.second ; ++it)
4931 const Entry *templateRoot = it->second;
4932 AUTO_TRACE_ADD(
"template root found '{}' templSpec='{}'",templateRoot->
name,templSpec);
4938 isArtificial,templArgs.get(),templateNames);
4962 templateClassName,
true,
true);
4963 AUTO_TRACE_ADD(
"templateClassName={} baseClass={}",templateClassName,baseClass?baseClass->
name():
"<none>");
4992 if (name.
empty())
return 0;
4993 int l =
static_cast<int>(name.
length());
4999 while (count>0 && i>=0)
5004 case '>':
if (!insideQuote) count++;
break;
5005 case '<':
if (!insideQuote) count--;
break;
5006 case '\'':
if (!insideQuote) insideQuote=c;
5007 else if (insideQuote==c && (i<0 || name[i]!=
'\\')) insideQuote=0;
5009 case '"':
if (!insideQuote) insideQuote=c;
5010 else if (insideQuote==c && (i<0 || name[i]!=
'\\')) insideQuote=0;
5030 AUTO_TRACE(
"name={} base={} isArtificial={} mode={}",cd->
name(),bi->
name,isArtificial,(
int)mode);
5033 bool explicitGlobalScope=
false;
5036 biName=biName.
mid(2);
5037 explicitGlobalScope=
true;
5041 bool lastParent=
false;
5046 int scopeOffset=explicitGlobalScope ? 0 :
static_cast<int>(scopeName.
length());
5055 baseClassName.
prepend(scopeName.
left(scopeOffset)+
"::");
5057 if (root->
lang==SrcLangExt::CSharp)
5084 || explicitGlobalScope
5087 || (root->
lang==SrcLangExt::IDL &&
5088 (root->
section.isExportedInterface() ||
5089 root->
section.isIncludedService()))
5092 AUTO_TRACE_ADD(
"class relation '{}' inherited/used by '{}' found prot={} virt={} templSpec='{}'",
5093 baseClassName, root->
name, bi->
prot, bi->
virt, templSpec);
5096 size_t si=baseClassName.
rfind(
"::",i);
5098 if (baseClass==
nullptr &&
static_cast<size_t>(i)!=baseClassName.
length())
5108 baseClassName = baseClassName.
left(i)+baseClassName.
mid(e);
5119 else if (baseClass && !templSpec.
empty())
5130 baseClass = templClass;
5148 found=baseClass!=
nullptr && baseClass!=cd;
5158 found = baseClass!=
nullptr && baseClass!=cd;
5170 found = baseClass!=
nullptr && baseClass!=cd;
5173 bool isATemplateArgument = templateNames.find(biName.
str())!=templateNames.end();
5178 AUTO_TRACE_ADD(
"Documented base class '{}' templSpec='{}'",biName,templSpec);
5196 if (baseClassTypeDef==
nullptr)
5206 if (baseClassTypeDef)
5215 AUTO_TRACE_ADD(
"insertBaseClass name={} prot={} virt={} templSpec={}",usedName,prot,bi->
virt,templSpec);
5223 "Detected potential recursive class relation "
5224 "between class {} and base class {}!",
5231 else if (mode==
Undocumented && (scopeOffset==0 || isATemplateArgument))
5233 AUTO_TRACE_ADD(
"New undocumented base class '{}' baseClassName='{}' templSpec='{}' isArtificial={}",
5234 biName,baseClassName,templSpec,isArtificial);
5236 if (isATemplateArgument)
5239 if (baseClass==
nullptr)
5258 if (baseClass==
nullptr)
5269 si = baseClassName.
rfind(
"::");
5285 biName=
"<"+biName.
left(biName.
length()-2)+
">";
5289 AUTO_TRACE_ADD(
"insertBaseClass name={} prot={} virt={} templSpec={}",biName,bi->
prot,bi->
virt,templSpec);
5299 if (scope!=baseClass)
5325 "Detected potential recursive class relation "
5326 "between class {} and base class {}!",
5327 root->
name,baseClassName
5340 size_t o = scopeName.
rfind(
"::",scopeOffset-1);
5344 }
while (scopeOffset>=0);
5346 if (parentNode==
nullptr)
5352 parentNode=parentNode->
parent();
5354 }
while (lastParent);
5374 bool hasExtends = !root->
extends.empty();
5375 if (hasExtends)
return true;
5402 if (root->
lang==SrcLangExt::CSharp)
5408 bName = bName.
left(i);
5473 if (!nd->hasDocumentation())
5476 nd->getLanguage() == SrcLangExt::Fortran) &&
5480 warn_undoc(nd->getDefFileName(),nd->getDefLine(),
"{} {} is not documented.",
5481 nd->getLanguage() == SrcLangExt::Fortran ?
"Module" :
"Namespace",
5531 DString templSpec = ti.templSpec;
5545 for (
const auto &tn_kv : templateNames)
5547 size_t templIndex = tn_kv.second;
5549 bool hasActArg=
false;
5550 if (templIndex<templArgs->size())
5552 actArg=templArgs->at(templIndex);
5556 baseClassNames.find(actArg.
type.
str())!=baseClassNames.end() &&
5557 actualTemplateNames.find(actArg.
type.
str())==actualTemplateNames.end()
5560 actualTemplateNames.emplace(actArg.
type.
str(),
static_cast<int>(templIndex));
5595 for (
const auto &fd : *fn)
5597 fd->computeAnchors();
5610 gd->computeAnchors();
5617template<
typename Func>
5640 for (
const auto &fd : *fn)
5713 if (md==
nullptr)
return;
5714 AUTO_TRACE(
"scope='{}' name='{}' args='{}' funcDecl='{}' mSpec={}",
5729 fullName = cd->
name();
5731 fullName = nd->
name();
5733 if (!fullName.
empty()) fullName+=
"::";
5734 fullName+=md->
name();
5840 "member {} belongs to two different groups. The second one found here will be ignored.",
5878 return allowNoGroup;
5881 for (
const auto &g : root->
groups)
5883 if (g.groupname == gd->
name())
5906 AUTO_TRACE(
"namespace='{}' type='{}' name='{}' tempArg='{}' decl='{}'",namespaceName,type,name,tempArg,decl);
5908 if (n.
empty())
return false;
5920 for (
const auto &md : *mn)
5931 if (md->isAlias() && md->getOuterScope() &&
5938 nd = md->getNamespaceDef();
5942 size_t enumNamePos=0;
5943 if (nd && md->isEnumValue() && (enumNamePos=namespaceName.
rfind(
"::"))!=
DString::npos)
5945 DString enumName = namespaceName.
mid(enumNamePos+2);
5946 if (namespaceName.
left(enumNamePos)==nd->
name())
5951 for (
const auto &emd : *enumMn)
5953 found = emd->isStrong() && md->getEnumScope()==emd.get();
5967 else if (nd==
nullptr && md->isEnumValue())
5972 for (
const auto &emd : *enumMn)
5974 found = emd->isStrong() && md->getEnumScope()==emd.get();
5997 if ((namespaceName.
empty() && nd==
nullptr) ||
5998 (nd && nd->
name()==namespaceName) ||
6002 AUTO_TRACE_ADD(
"Try to add member '{}' to scope '{}'",md->name(),namespaceName);
6010 md->isVariable() || md->isTypedef() ||
6011 matchArguments2(md->getOuterScope(),md->getFileDef(),md->typeString(),&mdAl,
6018 if (matching && !root->
tArgLists.empty())
6037 if (matching && md->isStatic() &&
6038 md->getDefFileName()!=root->
fileName &&
6046 if (!md->templateArguments().empty() && !root->
tArgLists.empty())
6051 if (md->templateArguments().size()!=root->
tArgLists.back().size() ||
6052 md->typeString()!=type ||
6053 md->requiresClause()!=root->
req)
6069 if (!found && root->
relatesType!=RelatesType::Duplicate && root->
section.isFunction())
6073 DString warnMsg =
"no matching file member found for \n"+fullFuncDecl;
6076 warnMsg+=
"\nPossible candidates:";
6077 for (
const auto &md : *mn)
6081 warnMsg+=
"' " +
warn_line(md->getDefFileName(),md->getDefLine());
6089 if (root->
type!=
"friend class" &&
6090 root->
type!=
"friend struct" &&
6091 root->
type!=
"friend union" &&
6092 root->
type!=
"friend" &&
6098 "documented symbol '{}' was not declared or defined.",
qPrint(decl)
6110 auto srcIt = srcTempArgLists.begin();
6111 auto dstIt = dstTempArgLists.begin();
6112 while (srcIt!=srcTempArgLists.end() && dstIt!=dstTempArgLists.end())
6114 if ((*srcIt).size()!=(*dstIt).size())
return true;
6128 result = cd->templateArguments().hasParameters() || cd->templateMaster()!=
nullptr ||
6138 const std::string &src
6142 static const reg::Ex re(R
"(\a\w*)");
6147 for (; it!=
end ; ++it)
6149 const auto &match = *it;
6150 size_t i = match.position();
6151 size_t l = match.length();
6153 dst+=src.substr(p,i-p);
6154 std::string name=match.str();
6156 auto srcIt = srcTempArgLists.begin();
6157 auto dstIt = dstTempArgLists.begin();
6158 while (srcIt!=srcTempArgLists.end() && !found)
6161 std::vector<Argument>::const_iterator tdaIt;
6162 if (dstIt!=dstTempArgLists.end())
6165 tdaIt = tdAli->
begin();
6170 for (
auto tsaIt = tsaLi.
begin(); tsaIt!=tsaLi.
end() && !found; ++tsaIt)
6174 if (tdAli && tdaIt!=tdAli->
end())
6190 else if (tdaType.
startsWith(
"typename ")) vc=9;
6193 tdaName = tdaType.
mid(vc);
6195 if (!tdaName.
empty())
6226 auto dstIt = dst.
begin();
6231 if (dstIt == dst.
end())
6235 da.
array = dstArray;
6243 da.
array = dstArray;
6251 srcTempArgLists,dstTempArgLists,
6277 funcType,funcName,funcArgs,exceptions,
6281 mmd->setTagInfo(root->
tagInfo());
6282 mmd->setLanguage(root->
lang);
6283 mmd->setId(root->
id);
6284 mmd->makeImplementationDetail();
6285 mmd->setMemberClass(cd);
6286 mmd->setDefinition(funcDecl);
6292 mmd->setDocsForDefinition(!root->
proto);
6294 mmd->addSectionsToDefinition(root->
anchors);
6298 mmd->setMemberSpecifiers(spec);
6299 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6300 mmd->setMemberGroupId(root->
mGrpId);
6303 mmd->setRefItems(root->
sli);
6304 mmd->setRequirementReferences(root->
rqli);
6341 bool memFound=
false;
6342 for (
const auto &imd : *mn)
6345 if (md==
nullptr)
continue;
6347 if (cd==
nullptr)
continue;
6359 size_t enumNamePos=0;
6362 DString enumName = className.
mid(enumNamePos+2);
6364 if (!namespaceName.
empty()) fullScope.
prepend(namespaceName+
"::");
6365 if (fullScope==cd->
name())
6371 for (
const auto &emd : *enumMn)
6373 memFound = emd->isStrong() && md->
getEnumScope()==emd.get();
6379 if (memFound)
break;
6384 if (memFound)
break;
6402 if (!templAl.
empty())
6404 declTemplArgs.push_back(templAl);
6412 bool substDone=
false;
6419 if (declTemplArgs.size()>0 && declTemplArgs.size()==defTemplArgs.size())
6442 AUTO_TRACE_ADD(
"matching '{}'<=>'{}' className='{}' namespaceName='{}' result={}",
6471 AUTO_TRACE_ADD(
"Comparing return types '{}'<->'{}' #args {}<->{}",
6479 else if (defTemplArgs.size()>declTemplArgs.size())
6481 AUTO_TRACE_ADD(
"Different number of template arguments {} vs {}",defTemplArgs.size(),declTemplArgs.size());
6487 bool rootIsUserDoc = root->
section.isMemberDoc();
6490 bool classOrMdIsTemplate = mdIsTemplate || classIsTemplate;
6491 bool rootIsTemplate = !root->
tArgLists.empty();
6493 if (!rootIsUserDoc &&
6494 (mdIsTemplate || rootIsTemplate) &&
6495 ((classOrMdIsTemplate && !rootIsTemplate) || (!classOrMdIsTemplate && rootIsTemplate))
6500 AUTO_TRACE_ADD(
"Comparing return types: template v.s. non-template");
6504 AUTO_TRACE_ADD(
"Match results of matchArguments2='{}' substDone='{}'",matching,substDone);
6515 if (!funcTempList.
empty() &&
6535 else if (cd && cd!=tcd)
6541 if (memFound)
break;
6545 addLocalObjCMethod(root,scopeName,funcType,funcName,funcArgs,exceptions,funcDecl,spec);
6548 if (count==0 && !(isFriend && funcType==
"class"))
6551 const ClassDef *ecd =
nullptr, *ucd =
nullptr;
6552 MemberDef *emd =
nullptr, *umd =
nullptr;
6554 for (
const auto &md : *mn)
6576 AUTO_TRACE_ADD(
"new candidate className='{}' scope='{}' args='{}': exact match",
6577 className,ccd->
name(),md->argsString());
6583 AUTO_TRACE_ADD(
"new candidate className='{}' scope='{}' args='{}': no match",
6584 className,ccd->
name(),md->argsString());
6589 bool strictProtoMatching =
Config_getBool(STRICT_PROTO_MATCHING);
6590 if (!strictProtoMatching)
6592 if (candidates==1 && ucd && umd)
6599 else if (candidates>1 && ecd && emd)
6610 if (noMatchCount>1) warnMsg+=
"uniquely ";
6611 warnMsg+=
"matching class member found for \n";
6615 warnMsg+=
" template ";
6620 DString fullFuncDecl=funcDecl;
6624 warnMsg+=fullFuncDecl;
6626 if (candidates>0 || noMatchCount>=1)
6628 warnMsg+=
"\nPossible candidates:";
6634 for (
const auto &md : *mn)
6636 const ClassDef *cd=md->getClassDef();
6650 warnMsg+=
"template ";
6655 if (!md->typeString().empty())
6657 warnMsg+=md->typeString();
6661 if (!qScope.
empty())
6662 warnMsg+=qScope+
"::"+md->name();
6663 warnMsg+=md->argsString();
6664 warnMsg+=
"' " +
warn_line(md->getDefFileName(),md->getDefLine());
6685 AUTO_TRACE(
"funcType={} funcName={} funcArgs={} funcDecl={} spec={}",funcType,funcName,funcArgs,funcDecl,spec);
6687 for (
const auto &md : *mn)
6689 if (md->getClassDef()==cd)
6701 funcType,funcName,funcArgs,exceptions,
6707 mmd->setTagInfo(root->
tagInfo());
6708 mmd->setLanguage(root->
lang);
6709 mmd->setId(root->
id);
6710 mmd->setMemberClass(cd);
6711 mmd->setTemplateSpecialization(
true);
6713 mmd->setDefinition(funcDecl);
6719 mmd->setDocsForDefinition(!root->
proto);
6721 mmd->addSectionsToDefinition(root->
anchors);
6725 mmd->setMemberSpecifiers(spec);
6726 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6727 mmd->setMemberGroupId(root->
mGrpId);
6729 mmd->setRefItems(root->
sli);
6730 mmd->setRequirementReferences(root->
rqli);
6745 bool sameClass=
false;
6750 [](
const auto &md1,
const auto &md2)
6751 { return md1->getClassDef()->name()==md2->getClassDef()->name(); });
6757 if (cd==
nullptr)
return;
6760 if (root->
mtype==MethodTypes::Signal) mtype=MemberType::Signal;
6761 else if (root->
mtype==MethodTypes::Slot) mtype=MemberType::Slot;
6762 else if (root->
mtype==MethodTypes::DCOP) mtype=MemberType::DCOP;
6765 std::unique_ptr<ArgumentList> tArgList =
6770 funcType,funcName,funcArgs,exceptions,
6774 mmd->setTagInfo(root->
tagInfo());
6775 mmd->setLanguage(root->
lang);
6776 mmd->setId(root->
id);
6778 mmd->setMemberClass(cd);
6779 mmd->setDefinition(funcDecl);
6788 mmd->setDocsForDefinition(!root->
proto);
6790 mmd->addSectionsToDefinition(root->
anchors);
6794 mmd->setMemberSpecifiers(spec);
6795 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6796 mmd->setMemberGroupId(root->
mGrpId);
6799 mmd->setRefItems(root->
sli);
6800 mmd->setRequirementReferences(root->
rqli);
6859 AUTO_TRACE(
"root='{}' funcDecl='{}' related='{}' overload={} isFunc={} mGrpId={} #tArgList={} spec={} lang={}",
6872 bool isRelated=
false;
6873 bool isMemberOf=
false;
6874 bool isFriend=
false;
6887 spec.setInline(
true);
6892 spec.setExplicit(
true);
6897 spec.setMutable(
true);
6902 spec.setThreadLocal(
true);
6919 if (!funcDecl.
empty() && funcDecl[0]!=
' ') funcDecl.
prepend(
" ");
6931 if (isFriend && funcDecl.
startsWith(
"class "))
6934 funcDecl=funcDecl.
mid(6);
6935 funcName = funcDecl;
6937 else if (isFriend && funcDecl.
startsWith(
"struct "))
6939 funcDecl=funcDecl.
mid(7);
6940 funcName = funcDecl;
6946 funcArgs,funcTempList,exceptions
6954 AUTO_TRACE_ADD(
"scopeName='{}' className='{}' namespaceName='{}' funcType='{}' funcName='{}' funcArgs='{}'",
6955 scopeName,className,namespaceName,funcType,funcName,funcArgs);
6956 if (!relates.
empty())
6959 isMemberOf=(root->
relatesType == RelatesType::MemberOf);
6966 scopeName = relates;
6976 if (!scopeName.
empty() &&
6979 scopeName = joinedName;
6993 DString joinedName = fnd->name()+
"::"+scopeName;
6996 scopeName=joinedName;
7023 AUTO_TRACE_ADD(
"scopeName='{}' className='{}' namespaceName='{}'",scopeName,className,namespaceName);
7028 if (!namespaceName.
empty())
7030 if (className.
empty())
7032 scopeName=namespaceName;
7034 else if (!relates.
empty() ||
7037 scopeName=namespaceName+
"::"+className;
7041 scopeName=className;
7044 else if (!className.
empty())
7046 scopeName=className;
7050 DString tempScopeName=scopeName;
7054 if (funcSpec.
empty())
7056 uint32_t argListIndex=0;
7061 tempScopeName=scopeName+funcSpec;
7069 if (!scopeName.
empty() && !isRelated && !isFriend && !
Config_getBool(HIDE_SCOPE_NAMES) && root->
lang!=SrcLangExt::Python)
7071 if (!funcType.
empty())
7075 funcDecl=funcType+
" "+tempScopeName+
"::"+funcName+funcTempList;
7079 funcDecl=funcType+
" "+tempScopeName+
"::"+funcName+funcArgs;
7086 funcDecl=tempScopeName+
"::"+funcName+funcTempList;
7090 funcDecl=tempScopeName+
"::"+funcName+funcArgs;
7096 if (!funcType.
empty())
7100 funcDecl=funcType+
" "+funcName+funcTempList;
7104 funcDecl=funcType+
" "+funcName+funcArgs;
7111 funcDecl=funcName+funcTempList;
7115 funcDecl=funcName+funcArgs;
7120 if (funcType==
"template class" && !funcTempList.
empty())
7123 AUTO_TRACE_ADD(
"Parse results: namespaceName='{}' className=`{}` funcType='{}' funcSpec='{}' "
7124 " funcName='{}' funcArgs='{}' funcTempList='{}' funcDecl='{}' relates='{}'"
7125 " exceptions='{}' isRelated={} isMemberOf={} isFriend={} isFunc={}",
7126 namespaceName, className, funcType, funcSpec,
7127 funcName, funcArgs, funcTempList, funcDecl, relates,
7128 exceptions, isRelated, isMemberOf, isFriend, isFunc);
7130 if (!funcName.
empty())
7134 bool strongEnum =
false;
7138 for (
const auto &imd : *mn)
7149 if (!namespaceName.
empty())
7151 namespaceName+=
"::"+className;
7155 namespaceName=className;
7163 funcName =
substitute(funcName,className+
"::",
"");
7166 if (!funcTempList.
empty())
7174 if (!isRelated && !strongEnum && mn)
7177 if (!className.
empty())
7179 if (funcSpec.
empty())
7182 funcArgs,funcTempList,exceptions,
7183 type,args,isFriend,spec,relates,funcDecl,overloaded,isFunc);
7195 else if (overloaded)
7197 addOverloaded(root,mn,funcType,funcName,funcArgs,funcDecl,exceptions,spec);
7201 if (!
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec))
7203 DString fullFuncDecl=funcDecl;
7206 "Cannot determine class for function\n{}",
7212 else if (isRelated && !relates.
empty())
7214 AUTO_TRACE_ADD(
"related function scopeName='{}' className='{}'",scopeName,className);
7215 if (className.
empty()) className=relates;
7219 bool newMember=
true;
7225 for (
const auto &imd : *mn)
7259 mn->
push_back(std::move(mdDefineTaken));
7273 for (
const auto &irmd : *mn)
7294 addMemberDocs(root,rmd_found,funcDecl,
nullptr,overloaded,spec);
7302 switch (root->
mtype)
7304 case MethodTypes::Method: mtype = MemberType::Function;
break;
7305 case MethodTypes::Signal: mtype = MemberType::Signal;
break;
7306 case MethodTypes::Slot: mtype = MemberType::Slot;
break;
7307 case MethodTypes::DCOP: mtype = MemberType::DCOP;
break;
7308 case MethodTypes::Property: mtype = MemberType::Property;
break;
7309 case MethodTypes::Event: mtype = MemberType::Event;
break;
7323 funcType,funcName,funcArgs,exceptions,
7326 isMemberOf ? Relationship::Foreign : Relationship::Related,
7346 mmd->setDefinitionTemplateParameterLists(root->
tArgLists);
7348 mmd->setTagInfo(root->
tagInfo());
7363 for (
const auto &irmd : *rmn)
7394 mmd->setBodyDef(fd);
7401 mmd->setMemberClass(cd);
7402 mmd->setMemberSpecifiers(spec);
7403 mmd->setVhdlSpecifiers(root->
vhdlSpec);
7404 mmd->setDefinition(funcDecl);
7409 mmd->setDocsForDefinition(!root->
proto);
7412 mmd->addSectionsToDefinition(root->
anchors);
7413 mmd->setMemberGroupId(root->
mGrpId);
7414 mmd->setLanguage(root->
lang);
7415 mmd->setId(root->
id);
7419 mmd->setRefItems(root->
sli);
7420 mmd->setRequirementReferences(root->
rqli);
7421 if (root->
relatesType==RelatesType::Duplicate) mmd->setRelatedAlso(cd);
7429 if (!
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec))
7431 DString fullFuncDecl=funcDecl;
7434 "Cannot determine file/namespace for relatedalso function\n{}",
7448 addLocalObjCMethod(root,scopeName,funcType,funcName,funcArgs,exceptions,funcDecl,spec);
7452 bool globMem =
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec);
7453 if (className.
empty() && !globMem)
7457 else if (!className.
empty() && !globMem)
7460 "member '{}' of class '{}' cannot be found",
7461 funcName,className);
7479 AUTO_TRACE(
"root->type='{}' root->inside='{}' root->name='{}' root->args='{}' section={} root->spec={} root->mGrpId={}",
7494 type=type.
left(i+l);
7505 if (root->
section.isMemberDoc())
7531 else if (root->
section.isOverloadDoc())
7545 (root->
section.isVariable() &&
7563 type+
" "+root->
name,
7567 else if (!type.
empty())
7596 else if (root->
section.isVariableDoc())
7608 else if (root->
section.isExportedInterface() ||
7609 root->
section.isIncludedService())
7615 type +
" " + root->
name,
7628 if (root->
section.isMemberDoc() ||
7629 root->
section.isOverloadDoc() ||
7632 root->
section.isVariableDoc() ||
7634 root->
section.isIncludedService() ||
7635 root->
section.isExportedInterface()
7645 for (
const auto &e : root->
children())
7647 if (!e->section.isEnum())
7659 for (
const auto &objCImpl : root->
children())
7661 if (objCImpl->section.isObjcImpl())
7663 for (
const auto &objCMethod : objCImpl->children())
7665 if (objCMethod->section.isFunction())
7669 objCMethod->relates,
7672 objCMethod->type+
" "+objCImpl->name+
"::"+objCMethod->name+
" "+objCMethod->args,
7674 objCMethod->section=EntryType::makeEmpty();
7693 bool isGlobal =
false;
7694 bool isRelated =
false;
7695 bool isMemberOf =
false;
7704 if (root->
lang==SrcLangExt::CSharp)
7727 isMemberOf=(root->
relatesType==RelatesType::MemberOf);
7735 if (cd && !name.
empty())
7762 isMemberOf ? Relationship::Foreign : isRelated ? Relationship::Related : Relationship::Member,
7763 MemberType::Enumeration,
7766 mmd->setTagInfo(root->
tagInfo());
7767 mmd->setLanguage(root->
lang);
7768 mmd->setId(root->
id);
7769 if (!isGlobal) mmd->setMemberClass(cd);
else mmd->setFileDef(fd);
7771 mmd->setBodyDef(root->
fileDef());
7772 mmd->setMemberSpecifiers(root->
spec);
7773 mmd->setVhdlSpecifiers(root->
vhdlSpec);
7774 mmd->setEnumBaseType(root->
args);
7777 mmd->addSectionsToDefinition(root->
anchors);
7778 mmd->setMemberGroupId(root->
mGrpId);
7782 mmd->setRefItems(root->
sli);
7783 mmd->setRequirementReferences(root->
rqli);
7789 if (!baseType.
empty())
7798 mmd->setDefinition(name+baseType);
7802 mmd->setDefinition(nd->
name()+
"::"+name+baseType);
7806 mmd->setNamespace(nd);
7813 if (isGlobal && (nd==
nullptr || !nd->
isAnonymous()))
7815 if (!defSet) mmd->setDefinition(name+baseType);
7816 if (fd==
nullptr && root->
parent())
7822 mmd->setFileDef(fd);
7830 mmd->setDefinition(name+baseType);
7834 mmd->setDefinition(cd->
name()+
"::"+name+baseType);
7840 mmd->setDocsForDefinition(!root->
proto);
7870 bool isGlobal =
false;
7871 bool isRelated =
false;
7880 if (root->
lang==SrcLangExt::CSharp)
7895 if (root->
lang==SrcLangExt::CSharp)
7914 if (cd && !name.
empty())
7941 struct EnumValueInfo
7943 EnumValueInfo(
const DString &n,std::unique_ptr<MemberDef> &&md) :
7944 name(n), member(std::move(md)) {}
7946 std::unique_ptr<MemberDef> member;
7948 std::vector< EnumValueInfo > extraMembers;
7950 for (
const auto &imd : *mn)
7957 for (
const auto &e : root->
children())
7960 bool isJavaLike = sle==SrcLangExt::CSharp || sle==SrcLangExt::Java || sle==SrcLangExt::XML;
7961 if ( isJavaLike || root->
spec.isStrong())
7963 if (sle == SrcLangExt::Cpp && e->section.isDefine())
continue;
7970 if (
size_t i = qualifiedName.
rfind(
"::"); i!=
DString::npos && sle==SrcLangExt::CSharp)
7976 qualifiedName=
substitute(qualifiedName,
"::",
".");
7980 DString fileName = e->fileName;
7981 if (fileName.
empty() && e->tagInfo())
7983 fileName = e->tagInfo()->tagName;
7987 fileName,e->startLine,e->startColumn,
7988 e->type,e->name,e->args,
DString(),
7989 e->protection, Specifier::Normal,e->isStatic,Relationship::Member,
7996 fmmd->setNamespace(mnd);
8000 fmmd->setTagInfo(e->tagInfo());
8001 fmmd->setLanguage(e->lang);
8002 fmmd->setBodySegment(e->startLine,e->bodyLine,e->endBodyLine);
8003 fmmd->setBodyDef(e->fileDef());
8005 fmmd->setDocumentation(e->doc,e->docFile,e->docLine);
8006 fmmd->setBriefDescription(e->brief,e->briefFile,e->briefLine);
8007 fmmd->addSectionsToDefinition(e->anchors);
8008 fmmd->setInitializer(e->initializer.str());
8009 fmmd->setMaxInitLines(e->initLines);
8010 fmmd->setMemberGroupId(e->mGrpId);
8011 fmmd->setExplicitExternal(e->explicitExternal,fileName,e->startLine,e->startColumn);
8012 fmmd->setRefItems(e->sli);
8013 fmmd->setRequirementReferences(e->rqli);
8016 fmmd->setEnumScope(md,
true);
8017 extraMembers.emplace_back(e->name,std::move(fmd));
8026 if (!e->name.empty() && (fmn=emnsd->
find(e->name)))
8029 for (
const auto &ifmd : *fmn)
8060 else if (isRelated && cd)
8092 for (
auto &e : extraMembers)
8138 if (gd==
nullptr && !root->
groups.empty())
8152 for (
const auto &g : root->
groups)
8171 "Found non-existing group '{}' for the command '{}', ignoring command",
8185 if (root->
section.isEnumDoc() &&
8210 AUTO_TRACE(
"Found docs for enum with name '{}' and scope '{}' in context '{}' cd='{}', nd='{}' fd='{}'",
8224 for (
const auto &imd : *mn)
8239 else if (cd==
nullptr && mcd==
nullptr && nd!=
nullptr && mnd==nd)
8246 else if (cd==
nullptr && nd==
nullptr && mcd==
nullptr && mnd==
nullptr && fd==mfd)
8271 for (
const auto &mn : mnsd)
8274 for (
const auto &imd : *mn)
8279 int documentedEnumValues=0;
8283 if (fmd->isLinkableInProject()) documentedEnumValues++;
8309 for (
const auto &md : *mn)
8311 index.addClassMemberNameToIndex(md.get());
8312 if (md->getModuleDef())
8314 index.addModuleMemberNameToIndex(md.get());
8322 for (
const auto &md : *mn)
8324 if (md->getNamespaceDef())
8326 index.addNamespaceMemberNameToIndex(md.get());
8330 index.addFileMemberNameToIndex(md.get());
8332 if (md->getModuleDef())
8334 index.addModuleMemberNameToIndex(md.get());
8339 index.sortMemberIndexLists();
8348 if (cd->isLinkableInProject())
8361 if (cd->isLinkableInProject())
8374 if (nd->isLinkableInProject())
8387 for (
const auto &fd : *fn)
8403 std::string s = title.str();
8404 static const reg::Ex re(R
"(\a[\w-]*)");
8407 for (; it!=
end ; ++it)
8409 const auto &match = *it;
8410 std::string matchStr = match.str();
8418 if (gd->isLinkableInProject())
8420 addWordsForTitle(gd.get(),gd->anchor(),gd->groupTitle());
8426 if (pd->isLinkableInProject())
8428 addWordsForTitle(pd.get(),pd->anchor(),pd->title());
8437 auto addMemberToSearchIndex = [](
const MemberDef *md)
8443 DString qn=md->qualifiedName();
8448 if (md->getClassDef())
8452 if (md->getNamespaceDef())
8463 if (md->getGroupDef()) scope = md->getGroupDef();
8464 else if (md->getClassDef()) scope = md->getClassDef();
8465 else if (md->getNamespaceDef()) scope = md->getNamespaceDef();
8466 else if (md->getFileDef()) scope = md->getFileDef();
8470 auto addMemberToIndices = [addMemberToSearchIndex,getScope](
const MemberDef *md)
8472 if (md->isLinkableInProject())
8474 if (!(md->isEnumerate() && md->isAnonymous()))
8477 addMemberToSearchIndex(md);
8479 if (md->isEnumerate())
8481 for (
const auto &fmd : md->enumFieldList())
8484 addMemberToSearchIndex(fmd);
8494 for (
const auto &md : *mn)
8496 addMemberToIndices(md.get());
8503 for (
const auto &md : *mn)
8505 addMemberToIndices(md.get());
8518 for (
const auto &imd : *mn)
8531 for (
const auto &imd : *mn)
8548 for (
const auto &imd : *mn)
8557 const auto &bmni = bmn.
find(mn->memberName());
8560 for (
const auto &ibmd : *bmni)
8568 lang==SrcLangExt::Python ||
8569 lang==SrcLangExt::Java ||
8570 lang==SrcLangExt::PHP ||
8581 lang==SrcLangExt::Python ||
8588 if (lang==SrcLangExt::Python && md->
name().
startsWith(
"__"))
continue;
8628 if (cd->isLinkable())
8630 for (
const auto &bcd : cd->baseClasses())
8646 for (
const auto &ti : cd->getTemplateInstances())
8671 AUTO_TRACE_ADD(
"merging members of category {} into {}",cd->name(),baseClass->
name());
8686 cd->subClasses().empty() &&
8687 !cd->baseClasses().empty())
8718 msg(
"Generating code for file {}...\n",fd->
docName());
8723 else if (parseSources)
8725 msg(
"Parsing code for file {}...\n",fd->
docName());
8741 for (
const auto &fd : *fn)
8749 for (
const auto &fd : *fn)
8758 clangParser->parse();
8759 processSourceFile(fd.get(),*
g_outputList,clangParser.get());
8761 for (
auto incFile : clangParser->filesInSameTU())
8763 if (filesToProcess.find(incFile)!=filesToProcess.end() &&
8765 processedFiles.
find(incFile)==processedFiles.end())
8772 processSourceFile(ifd,*
g_outputList,clangParser.get());
8773 processedFiles.insert(incFile);
8784 for (
const auto &fd : *fn)
8786 if (processedFiles.find(fd->
absFilePath().
str())==processedFiles.end())
8791 clangParser->parse();
8792 processSourceFile(fd.get(),*
g_outputList,clangParser.get());
8805 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8808 msg(
"Generating code files using {} threads.\n",numThreads);
8809 struct SourceContext
8812 : fd(fd_), generateSourceFile(gen_), ol(ol_) {}
8814 bool generateSourceFile;
8818 std::vector< std::future< std::shared_ptr<SourceContext> > > results;
8821 for (
const auto &fd : *fn)
8824 auto ctx = std::make_shared<SourceContext>(fd.get(),generateSourceFile,*
g_outputList);
8825 auto processFile = [ctx]()
8827 if (ctx->generateSourceFile)
8829 msg(
"Generating code for file {}...\n",ctx->fd->docName());
8833 msg(
"Parsing code for file {}...\n",ctx->fd->docName());
8836 ctx->fd->getAllIncludeFilesRecursively(filesInSameTu);
8837 if (ctx->generateSourceFile)
8839 ctx->fd->writeSourceHeader(ctx->ol);
8840 ctx->fd->writeSourceBody(ctx->ol,
nullptr);
8841 ctx->fd->writeSourceFooter(ctx->ol);
8846 ctx->fd->parseSource(
nullptr);
8850 results.emplace_back(threadPool.
queue(processFile));
8853 for (
auto &f : results)
8862 for (
const auto &fd : *fn)
8882 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8888 : fd(fd_), ol(ol_) {}
8893 std::vector< std::future< std::shared_ptr<DocContext> > > results;
8896 for (
const auto &fd : *fn)
8898 bool doc = fd->isLinkableInProject();
8901 auto ctx = std::make_shared<DocContext>(fd.get(),*
g_outputList);
8902 auto processFile = [ctx]() {
8903 msg(
"Generating docs for file {}...\n",ctx->fd->docName());
8904 ctx->fd->writeDocumentation(ctx->ol);
8907 results.emplace_back(threadPool.
queue(processFile));
8911 for (
auto &f : results)
8920 for (
const auto &fd : *fn)
8922 bool doc = fd->isLinkableInProject();
8925 msg(
"Generating docs for file {}...\n",fd->docName());
8944 const_cast<FileDef*
>(fd)->addSourceRef(cd->getStartDefLine(),cd.get(),
nullptr);
8953 const_cast<FileDef*
>(fd)->addSourceRef(cd->getStartDefLine(),cd.get(),
nullptr);
8962 const_cast<FileDef*
>(fd)->addSourceRef(nd->getStartDefLine(),nd.get(),
nullptr);
8969 for (
const auto &md : *mn)
8978 md->isLinkableInProject() &&
8984 const_cast<FileDef*
>(fd)->addSourceRef(md->getStartDefLine(),md->getOuterScope(),md.get());
8990 for (
const auto &md : *mn)
9000 md->isLinkableInProject() &&
9006 const_cast<FileDef*
>(fd)->addSourceRef(md->getStartDefLine(),md->getOuterScope(),md.get());
9023 for (
const auto &def : it->second)
9026 def.fileName,def.lineNr,def.columnNr,
9027 "#define",def.name,def.args,
DString(),
9028 Protection::Public,Specifier::Normal,
false,Relationship::Member,MemberType::Define,
9032 if (!def.args.empty())
9036 mmd->setInitializer(def.definition);
9037 mmd->setFileDef(def.fileDef);
9038 mmd->setDefinition(
"#define "+def.name);
9043 const MemberList *defMl = def.fileDef->getMemberList(MemberListType::DocDefineMembers());
9052 def.fileDef->insertMember(md.get());
9054 AUTO_TRACE_ADD(
"adding macro {} with definition {}",def.name,def.definition);
9088 for (
const auto &fd : *fn)
9090 fd->sortMemberLists();
9097 gd->sortMemberLists();
9114 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
9118 std::vector < std::future< void > > results;
9122 for (
const auto &def : symList)
9125 if (dm && !
isSymbolHidden(def) && !def->isArtificial() && def->isLinkableInProject())
9127 auto processTooltip = [dm]() {
9130 results.emplace_back(threadPool.
queue(processTooltip));
9135 for (
auto &f : results)
9144 for (
const auto &def : symList)
9147 if (dm && !
isSymbolHidden(def) && !def->isArtificial() && def->isLinkableInProject())
9194 for (
const auto &fd : *fn)
9216 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
9222 : cd(cd_), ol(ol_) {}
9227 std::vector< std::future< std::shared_ptr<DocContext> > > results;
9228 for (
const auto &cd : classList)
9231 if (cd->getOuterScope()==
nullptr ||
9235 auto ctx = std::make_shared<DocContext>(cd,*
g_outputList);
9236 auto processFile = [ctx]()
9238 msg(
"Generating docs for compound {}...\n",ctx->cd->displayName());
9242 if (!ctx->cd->isHidden() && !ctx->cd->isEmbeddedInOuterScope() &&
9243 ctx->cd->isLinkableInProject() && !ctx->cd->isImplicitTemplateInstance())
9245 ctx->cd->writeDocumentation(ctx->ol);
9246 ctx->cd->writeMemberList(ctx->ol);
9250 ctx->cd->writeDocumentationForInnerClasses(ctx->ol);
9253 results.emplace_back(threadPool.
queue(processFile));
9256 for (
auto &f : results)
9263 for (
const auto &cd : classList)
9267 if (cd->getOuterScope()==
nullptr ||
9273 if ( !cd->isHidden() && !cd->isEmbeddedInOuterScope() &&
9274 cd->isLinkableInProject() && !cd->isImplicitTemplateInstance())
9276 msg(
"Generating docs for compound {}...\n",cd->displayName());
9291 for (
const auto &innerCdi : cd->
getClasses())
9296 AUTO_TRACE(
"innerCd={} isLinkable={} isImplicitTemplateInstance={} protectLevelVisible={} embeddedInOuterScope={}",
9305 list.push_back(innerCd);
9313 std::vector<ClassDefMutable*> classList;
9362 for (
const auto &imd : *mn)
9398 for (
const auto &fd : *fn)
9400 fd->combineUsingRelations();
9432 for (
const auto &fd : *fn)
9434 fd->addMembersToMemberGroup();
9449 gd->addMembersToMemberGroup();
9470 for (
const auto &fd : *fn)
9472 fd->distributeMemberGroupDocumentation();
9487 gd->distributeMemberGroupDocumentation();
9517 for (
const auto &fd : *fn)
9519 fd->findSectionsInDocumentation();
9534 gd->findSectionsInDocumentation();
9539 pd->findSectionsInDocumentation();
9544 dd->findSectionsInDocumentation();
9567 for (
const auto &ifmd : *fn)
9581 for (
const auto &imd : *nm)
9612 for (
const auto &imd : *nm)
9632 return fd->absFilePath() == root->
fileName;
9677 Protection::Public,Specifier::Normal,
false,Relationship::Member,MemberType::Define,
9680 mmd->setTagInfo(root->
tagInfo());
9681 mmd->setLanguage(root->
lang);
9693 for (
const auto &md : *mn)
9695 if (md->memberType()==MemberType::Define) count++;
9699 for (
const auto &imd : *mn)
9702 if (md && md->
memberType()==MemberType::Define)
9717 for (
const auto &imd : *mn)
9720 if (md && md->
memberType()==MemberType::Define)
9744 warn(root->
fileName,root->
startLine,
"found documented #define {} but ignoring it because ENABLE_PREPROCESSING is NO.", root->
name);
9758 normalizedName =
substitute(normalizedName,
"\\",
"/");
9761 if (root->
docFile==normalizedName)
9765 normalizedName=normalizedName.
left(lastSlashPos);
9768 if (normalizedName.
at(normalizedName.
length()-1)!=
'/')
9770 normalizedName+=
'/';
9772 DirDef *matchingDir=
nullptr;
9776 if (dir->name().right(normalizedName.
length())==normalizedName)
9781 "\\dir command matches multiple directories.\n"
9782 " Applying the command for directory {}\n"
9783 " Ignoring the command for directory {}",
9784 matchingDir->
name(),dir->name()
9789 matchingDir=dir.get();
9806 warn(root->
fileName,root->
startLine,
"No matching directory found for command \\dir {}",normalizedName);
9815 if (root->
section.isRequirementDoc())
9827 if (root->
section.isPageDoc())
9834 else if (root->
section.isMainpageDoc())
9854 if (root->
section.isMainpageDoc())
9887 else if (si->
lineNr() != -1)
9889 warn(root->
fileName,root->
startLine,
"multiple use of section label '{}' for main page, (first occurrence: {}, line {})",
9894 warn(root->
fileName,root->
startLine,
"multiple use of section label '{}' for main page, (first occurrence: {})",
9911 else if (root->
tagInfo()==
nullptr)
9914 "found more than one \\mainpage comment block! (first occurrence: {}, line {}), Skipping current block!",
9924 if (root->
section.isMainpageDoc())
9948 term(
"page defined {} with label {} is a direct "
9949 "subpage of itself! Please remove this cyclic dependency.\n",
9973 term(
"page defined {} with label {} is a subpage "
9974 "of itself! Please remove this cyclic dependency.\n",
9975 warn_line(pd->docFile(),pd->docLine()),pd->name());
10000 DString label=
"_"+rl->listName();
10001 if (si->label().left(label.
length())==label)
10003 si->setFileName(rl->listName());
10004 si->setGenerated(
true);
10010 if (!si->generated())
10014 if (!si->fileName().empty() &&
10021 if (si->definition())
10028 gd = (
toMemberDef(si->definition()))->getGroupDef();
10058 if (!pd->getGroupDef() && !pd->isReference())
10060 msg(
"Generating docs for page {}...\n",pd->name());
10075 warn(root->
fileName,root->
startLine,
"Example {} was already documented. Ignoring documentation found here.",root->
name);
10103 indentStr.
fill(
' ',indent);
10105 indentStr.
empty()?
"":indentStr,
10110 for (
const auto &e : root->
children())
10128 si->label(),si->fileName(),si->title(),si->type().level(),si->ref());
10142 msg(
"Generating docs for example {}...\n",pd->name());
10144 if (lang != SrcLangExt::Unknown)
10148 intf->resetCodeParserState();
10150 DString n=pd->getOutputFileBase();
10157 if (pd->showLineNo())
10159 lineNoOptStr=
"{lineno}";
10165 (pd->briefDescription().empty()?
"":pd->briefDescription()+
"\n\n")+
10166 pd->documentation()+
"\n\n\\include"+lineNoOptStr+
" "+pd->name(),
10168 .setIndexWords(
true)
10169 .setExample(pd->name()));
10182 if (!gd->isReference())
10194 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10200 : cdm(cdm_), ol(ol_) {}
10205 std::vector< std::future< std::shared_ptr<DocContext> > > results;
10207 for (
const auto &cd : classList)
10212 auto ctx = std::make_shared<DocContext>(cdm,*
g_outputList);
10213 auto processFile = [ctx]()
10215 if ( ( ctx->cdm->isLinkableInProject() &&
10216 !ctx->cdm->isImplicitTemplateInstance()
10219 && !ctx->cdm->isHidden() && !ctx->cdm->isEmbeddedInOuterScope()
10222 msg(
"Generating docs for compound {}...\n",ctx->cdm->displayName());
10223 ctx->cdm->writeDocumentation(ctx->ol);
10224 ctx->cdm->writeMemberList(ctx->ol);
10226 ctx->cdm->writeDocumentationForInnerClasses(ctx->ol);
10229 results.emplace_back(threadPool.
queue(processFile));
10233 for (
auto &f : results)
10235 auto ctx = f.get();
10241 for (
const auto &cd : classList)
10246 if ( ( cd->isLinkableInProject() &&
10247 !cd->isImplicitTemplateInstance()
10250 && !cd->isHidden() && !cd->isEmbeddedInOuterScope()
10253 msg(
"Generating docs for compound {}...\n",cd->displayName());
10267 for (
const auto &cd : conceptList)
10272 msg(
"Generating docs for concept {}...\n",cd->name());
10287 if (nd->isLinkableInProject())
10292 msg(
"Generating docs for namespace {}\n",nd->displayName());
10330 DString cmd=qhgLocation+
" -v 2>&1";
10335 err(
"could not execute {}\n",qhgLocation);
10339 const size_t bufSize = 1024;
10340 char inBuf[bufSize+1];
10341 size_t numRead=fread(inBuf,1,bufSize,f);
10342 inBuf[numRead] =
'\0';
10347 static const reg::Ex versionReg(R
"(Qt (\d+)\.(\d+)\.(\d+))");
10349 std::string s = inBuf;
10356 if (qtVersion>0 && (qtVersion<60000 || qtVersion >= 60205))
10365 err(
"could not execute {}\n",qhgLocation);
10369 std::string output;
10370 while ((numRead=fread(inBuf,1,bufSize,f))>0)
10372 inBuf[numRead] =
'\0';
10395 if (!dotPath.
empty())
10404 warn_uncond(
"the dot tool could not be found as '{}'\n",dotPath);
10410 dotPath = fi.
dirPath() +
"/" + dotPath;
10414 size_t l=dotPath.
length();
10415 for (
size_t i=0;i<l;i++)
if (dotPath.
at(i)==
'/') dotPath.
at(i)=
'\\';
10434 bool updateOnly=
false)
10438 bool writeToStdout=configFile==
"-";
10443 if (!writeToStdout)
10447 msg(
"\n\nConfiguration file '{}' created.\n\n",configFile);
10448 msg(
"Now edit the configuration file and enter\n\n");
10449 if (configFile!=
"Doxyfile" && configFile!=
"doxyfile")
10450 msg(
" doxygen {}\n\n",configFile);
10452 msg(
" doxygen\n\n");
10453 msg(
"to generate the documentation for your project\n\n");
10457 msg(
"\n\nConfiguration file '{}' updated.\n\n",configFile);
10463 term(
"Cannot open file {} for writing\n",configFile);
10478 term(
"Cannot open stdout for writing\n");
10493 if (fileName.
empty() || destName.
empty())
return;
10498 fileName = tagLine;
10504 err(
"Tag file '{}' does not exist or is not a file. Skipping it...\n",fileName);
10512 if (!destName.
empty())
10515 msg(
"Reading tag file '{}', location '{}'...\n",fileName,destName);
10519 msg(
"Reading tag file '{}'...\n",fileName);
10529 for (
const auto &sheet : latexExtraStyleSheet)
10531 std::string fileName = sheet;
10532 if (!fileName.empty())
10537 err(
"Style sheet '{}' specified by LATEX_EXTRA_STYLESHEET does not exist!\n",fileName);
10539 else if (fi.
isDir())
10541 err(
"Style sheet '{}' specified by LATEX_EXTRA_STYLESHEET is a directory, it has to be a file!\n", fileName);
10560 if (!htmlStyleSheet.
empty())
10567 err(
"Style sheet '{}' specified by HTML_STYLESHEET does not exist!\n",htmlStyleSheet);
10570 else if (fi.
isDir())
10572 err(
"Style sheet '{}' specified by HTML_STYLESHEET is a directory, it has to be a file!\n",htmlStyleSheet);
10578 copyFile(htmlStyleSheet,destFileName);
10583 for (
const auto &sheet : htmlExtraStyleSheet)
10591 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET does not exist!\n",fileName);
10595 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET is already a built-in stylesheet. Please use a different name\n",fi.
fileName());
10597 else if (fi.
isDir())
10599 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET is a directory, it has to be a file!\n",fileName);
10613 if (!projectLogo.
empty())
10618 err(
"Project logo '{}' specified by PROJECT_LOGO does not exist!\n",projectLogo);
10621 else if (fi.
isDir())
10623 err(
"Project logo '{}' specified by PROJECT_LOGO is a directory, it has to be a file!\n",projectLogo);
10629 copyFile(projectLogo,destFileName);
10638 if (!projectIcon.
empty())
10643 err(
"Project icon '{}' specified by PROJECT_ICON does not exist!\n",projectIcon);
10646 else if (fi.
isDir())
10648 err(
"Project icon '{}' specified by PROJECT_ICON is a directory, it has to be a file!\n",projectIcon);
10654 copyFile(projectIcon,destFileName);
10662 for (
const auto &fileName : files)
10664 if (!fileName.empty())
10669 err(
"Extra file '{}' specified in {} does not exist!\n", fileName,filesOption);
10671 else if (fi.
isDir())
10673 err(
"Extra file '{}' specified in {} is a directory, it has to be a file!\n", fileName,filesOption);
10693 FileEntry(
const DString &p,
FileDef *fd) : path(p), fileDef(fd) {}
10699 std::vector<FileEntry> fileEntries;
10700 for (
const auto &fd : *fn)
10702 if (!fd->isReference())
10704 fileEntries.emplace_back(fd->getPath(),fd.get());
10708 size_t size = fileEntries.size();
10712 FileDef *fd = fileEntries[0].fileDef;
10718 std::stable_sort(fileEntries.begin(),
10720 [](
const FileEntry &fe1,
const FileEntry &fe2)
10721 { return dstricmp_sort(fe1.path,fe2.path)<0; }
10726 const FileEntry &first = fileEntries[0];
10727 const FileEntry &last = fileEntries[size-1];
10728 int first_path_size =
static_cast<int>(first.path.size())-1;
10729 int last_path_size =
static_cast<int>(last.path.size())-1;
10732 for (i=0;i<first_path_size && i<last_path_size;i++)
10734 if (first.path[i]==
'/') j=i;
10735 if (first.path[i]!=last.path[i])
break;
10737 if (i==first_path_size && i<last_path_size && last.path[i]==
'/')
10742 else if (i==last_path_size && i<first_path_size && first.path[i]==
'/')
10749 for (
auto &fileEntry : fileEntries)
10751 DString prefix = fileEntry.path.right(fileEntry.path.length()-j-1);
10752 fileEntry.fileDef->setName(
prefix+fn->fileName());
10754 fileEntry.fileDef->setDiskName(
prefix+fn->fileName());
10768 size_t sep = fileName.
rfind(
'/');
10769 size_t ei = fileName.
rfind(
'.');
10772 extension=fileName.
mid(ei);
10776 extension =
".no_extension";
10791 extension=fileName.
mid(ei);
10795 extension =
".no_extension";
10799 std::string preBuf;
10806 for (
const auto &s : includePath)
10812 msg(
"Preprocessing {}...\n",fn);
10819 msg(
"Reading {}...\n",fn);
10824 std::string convBuf;
10825 convBuf.reserve(preBuf.size()+1024);
10830 std::shared_ptr<Entry> fileRoot = std::make_shared<Entry>();
10834 if (newTU) clangParser->
parse();
10837 parser.
parseInput(fileName,convBuf.
data(),fileRoot,clangParser);
10838 fileRoot->setFileDef(fd);
10855 filesToProcess.insert(s);
10858 std::mutex processedFilesLock;
10860 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10861 msg(
"Processing input using {} threads.\n",numThreads);
10863 using FutureType = std::vector< std::shared_ptr<Entry> >;
10864 std::vector< std::future< FutureType > > results;
10867 bool ambig =
false;
10874 auto processFile = [qs,&filesToProcess,&processedFilesLock,&processedFiles]() {
10875 bool ambig_l =
false;
10876 std::vector< std::shared_ptr<Entry> > roots;
10880 auto fileRoot {
parseFile(*parser.get(),fd_l,qs,clangParser.get(),
true) };
10881 roots.push_back(fileRoot);
10885 for (
auto incFile : clangParser->filesInSameTU())
10888 if (filesToProcess.find(incFile)!=filesToProcess.end())
10890 bool needsToBeProcessed =
false;
10892 std::lock_guard<std::mutex> lock(processedFilesLock);
10893 needsToBeProcessed = processedFiles.find(incFile)==processedFiles.end();
10894 if (needsToBeProcessed) processedFiles.insert(incFile);
10896 if (qincFile!=qs && needsToBeProcessed)
10902 fileRoot =
parseFile(*parser.get(),ifd,qincFile,clangParser.get(),
false);
10903 roots.push_back(fileRoot);
10911 results.emplace_back(threadPool.
queue(processFile));
10915 for (
auto &f : results)
10920 root->moveToSubEntryAndKeep(e);
10927 if (processedFiles.find(s)==processedFiles.end())
10930 auto processFile = [s]() {
10931 bool ambig =
false;
10933 std::vector< std::shared_ptr<Entry> > roots;
10940 auto fileRoot =
parseFile(*parser.get(),fd,qs,clangParser.get(),
true);
10941 roots.push_back(fileRoot);
10945 auto fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
10946 roots.push_back(fileRoot);
10950 results.emplace_back(threadPool.
queue(processFile));
10954 for (
auto &f : results)
10959 root->moveToSubEntryAndKeep(e);
10966 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10967 msg(
"Processing input using {} threads.\n",numThreads);
10969 using FutureType = std::shared_ptr<Entry>;
10970 std::vector< std::future< FutureType > > results;
10974 auto processFile = [s]() {
10975 bool ambig =
false;
10979 auto fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
10983 results.emplace_back(threadPool.
queue(processFile));
10986 for (
auto &f : results)
10988 root->moveToSubEntryAndKeep(f.get());
11006 filesToProcess.insert(s);
11012 bool ambig =
false;
11020 auto fileRoot =
parseFile(*parser.get(),fd,qs,clangParser.get(),
true);
11021 root->moveToSubEntryAndKeep(fileRoot);
11022 processedFiles.insert(s);
11026 for (
auto incFile : clangParser->filesInSameTU())
11029 if (filesToProcess.find(incFile)!=filesToProcess.end() &&
11030 processedFiles.find(incFile)==processedFiles.end())
11036 fileRoot =
parseFile(*parser.get(),ifd,incFile,clangParser.get(),
false);
11037 root->moveToSubEntryAndKeep(fileRoot);
11038 processedFiles.insert(incFile);
11047 if (processedFiles.find(s)==processedFiles.end())
11049 bool ambig =
false;
11056 auto fileRoot =
parseFile(*parser.get(),fd,qs,clangParser.get(),
true);
11057 root->moveToSubEntryAndKeep(fileRoot);
11062 std::shared_ptr<Entry> fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
11063 root->moveToSubEntryAndKeep(fileRoot);
11065 processedFiles.insert(s);
11074 bool ambig =
false;
11079 std::shared_ptr<Entry> fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
11080 root->moveToSubEntryAndKeep(std::move(fileRoot));
11100 sepPos = result.
find(
'/',2);
11102 sepPos = result.
find(
'/',sepPos+1);
11104 sepPos = result.
find(
'/',sepPos+1);
11107 if (nonSymlinks.find(
prefix.str())==nonSymlinks.end())
11124 target+=result.
mid(sepPos);
11127 if (known.find(result.
str())!=known.end())
return std::string();
11128 known.insert(result.
str());
11141 nonSymlinks.insert(
prefix.str());
11166 bool errorIfNotExist,
11173 if (paths && !dirName.empty())
11175 paths->insert(dirName);
11181 if (dirName.empty())
11196 msg(
"Searching for files in directory {}\n", fi->
absFilePath());
11203 for (
const auto &dirEntry : dir.
iterator())
11206 auto checkPatterns = [&]() ->
bool
11208 return (patList==
nullptr || cfi.
match(*patList,caseSenseNames)) &&
11209 (exclPatList==
nullptr || !cfi.
match(*exclPatList,caseSenseNames)) &&
11210 (killSet==
nullptr || killSet->find(cfi.
absFilePath())==killSet->end());
11213 if (exclSet==
nullptr || exclSet->find(cfi.
absFilePath())==exclSet->end())
11221 if (errorIfNotExist && checkPatterns())
11226 else if (cfi.
isFile() && checkPatterns())
11229 std::string path=cfi.
dirPath()+
"/";
11230 std::string fullName=path+name;
11237 fn = fnMap->
add(name);
11238 fn->push_back(std::move(fd));
11241 dirResultList.push_back(fullName);
11242 if (resultSet) resultSet->insert(fullName);
11243 if (killSet) killSet->insert(fullName);
11245 else if (recursive &&
11247 (exclPatList==
nullptr || !cfi.
match(*exclPatList,caseSenseNames)) &&
11252 patList,exclPatList,&dirResultList,resultSet,errorIfNotExist,
11253 recursive,killSet,paths);
11257 if (resultList && !dirResultList.empty())
11260 std::stable_sort(dirResultList.begin(),
11261 dirResultList.end(),
11262 [](
const auto &f1,
const auto &f2) { return dstricmp_sort(f1.c_str(),f2.c_str())<0; });
11265 resultList->insert(resultList->end(), dirResultList.begin(), dirResultList.end());
11282 bool errorIfNotExist,
11289 if (s.
empty())
return;
11296 if (exclSet==
nullptr || exclSet->find(fi.
absFilePath())==exclSet->end())
11303 if (errorIfNotExist)
11305 warn_uncond(
"source '{}' is not a readable file or directory... skipping.\n",s);
11310 std::string dirPath = fi.
dirPath(
true);
11312 if (paths && !dirPath.empty())
11314 paths->insert(dirPath);
11317 if (killSet==
nullptr || killSet->find(filePath)==killSet->end())
11326 fn->push_back(std::move(fd));
11329 if (resultList || resultSet)
11331 if (resultList) resultList->push_back(filePath);
11332 if (resultSet) resultSet->insert(filePath);
11338 else if (fi.
isDir())
11340 readDir(&fi,fnMap,exclSet,patList,
11341 exclPatList,resultList,resultSet,errorIfNotExist,
11342 recursive,killSet,paths);
11356 anchor=
":"+md->
anchor();
11365 t <<
"REPLACE INTO symbols (symbol_id,scope_id,name,file,line) VALUES('"
11366 << fn+anchor <<
"','"
11368 << d->
name() <<
"','"
11382 for (
const auto &def : symList)
11394 msg(
"Developer parameters:\n");
11395 msg(
" -m dump symbol map\n");
11396 msg(
" -b making messages output unbuffered\n");
11397 msg(
" -c <file> process input file as a comment block and produce HTML output\n");
11399 msg(
" -t [<file|stdout|stderr>] trace debug info to file, stdout, or stderr (default file stdout)\n");
11400 msg(
" -t_time [<file|stdout|stderr>] trace debug info to file, stdout, or stderr (default file stdout),\n"
11401 " and include time and thread information\n");
11403 msg(
" -d <level> enable a debug level, such as (multiple invocations of -d are possible):\n");
11414 DString versionString = getFullVersion();
11415 msg(
"{}\n",versionString);
11419 if (!extVers.
empty()) extVers+=
", ";
11420 extVers +=
"sqlite3 ";
11421 extVers += sqlite3_libversion();
11423 if (!extVers.
empty()) extVers+=
", ";
11424 extVers +=
"clang support ";
11425 extVers += CLANG_VERSION_STRING;
11427 if (!extVers.
empty())
11431 extVers = extVers.
replace(lastComma,1,
" and");
11433 msg(
" with {}.\n",extVers);
11444 msg(
"Doxygen version {0}\nCopyright Dimitri van Heesch 1997-2025\n\n"
11445 "You can use Doxygen in a number of ways:\n\n"
11446 "1) Use Doxygen to generate a template configuration file*:\n"
11447 " {1} [-s] -g [configName]\n\n"
11448 "2) Use Doxygen to update an old configuration file*:\n"
11449 " {1} [-s] -u [configName]\n\n"
11450 "3) Use Doxygen to generate documentation using an existing "
11451 "configuration file*:\n"
11452 " {1} [configName]\n\n"
11453 "4) Use Doxygen to generate a template file controlling the layout of the\n"
11454 " generated documentation:\n"
11455 " {1} -l [layoutFileName]\n\n"
11456 " In case layoutFileName is omitted DoxygenLayout.xml will be used as filename.\n"
11457 " If - is used for layoutFileName Doxygen will write to standard output.\n\n"
11458 "5) Use Doxygen to generate a template style sheet file for RTF, HTML or Latex.\n"
11459 " RTF: {1} -w rtf styleSheetFile\n"
11460 " HTML: {1} -w html headerFile footerFile styleSheetFile [configFile]\n"
11461 " LaTeX: {1} -w latex headerFile footerFile styleSheetFile [configFile]\n\n"
11462 "6) Use Doxygen to generate a rtf extensions file\n"
11463 " {1} -e rtf extensionsFile\n\n"
11464 " If - is used for extensionsFile Doxygen will write to standard output.\n\n"
11465 "7) Use Doxygen to compare the used configuration file with the template configuration file\n"
11466 " {1} -x [configFile]\n\n"
11467 " Use Doxygen to compare the used configuration file with the template configuration file\n"
11468 " without replacing the environment variables or CMake type replacement variables\n"
11469 " {1} -x_noenv [configFile]\n\n"
11470 "8) Use Doxygen to show a list of built-in emojis.\n"
11471 " {1} -f emoji outputFileName\n\n"
11472 " If - is used for outputFileName Doxygen will write to standard output.\n\n"
11473 "*) If -s is specified the comments of the configuration items in the config file will be omitted.\n"
11474 " If configName is omitted 'Doxyfile' will be used as a default.\n"
11475 " If - is used for configFile Doxygen will write / read the configuration to /from standard output / input.\n\n"
11476 "If -q is used for a Doxygen documentation run, Doxygen will see this as if QUIET=YES has been set.\n\n"
11477 "-v print version string, -V print extended version information\n"
11478 "-h,-? prints usage help information\n"
11479 "{1} -d prints additional usage flags for debugging purposes\n",versionString,name);
11486static const char *
getArg(
int argc,
char **argv,
int &optInd)
11489 if (
dstrlen(&argv[optInd][2])>0)
11490 s=&argv[optInd][2];
11491 else if (optInd+1<argc && argv[optInd+1][0]!=
'-')
11510 return []() {
return std::make_unique<T>(); };
11518 std::setlocale(LC_ALL,
"");
11519 std::setlocale(LC_CTYPE,
"C");
11520 std::setlocale(LC_NUMERIC,
"C");
11618 DString versionString = getFullVersion();
11621 auto writeFile = [](
const char *fileName,std::function<void(
TextStream&)> func) ->
bool
11641 bool genConfig=
false;
11642 bool shortList=
false;
11643 bool traceTiming=
false;
11645 bool updateConfig=
false;
11646 bool quiet =
false;
11647 while (optInd<argc && argv[optInd][0]==
'-' &&
11648 (isalpha(argv[optInd][1]) || argv[optInd][1]==
'?' ||
11649 argv[optInd][1]==
'-')
11652 switch(argv[optInd][1])
11662 if (optInd+1>=argc)
11664 layoutName=
"DoxygenLayout.xml";
11668 layoutName=argv[optInd+1];
11676 if (optInd+1>=argc)
11678 msg(
"option \"-c\" is missing the file name to read\n");
11694 if (debugLabel.
empty())
11703 msg(
"option \"-d\" has unknown debug specifier: \"{}\".\n",debugLabel);
11713 if (!strcmp(argv[optInd]+1,
"t_time"))
11715 traceTiming =
true;
11717 else if (!strcmp(argv[optInd]+1,
"t"))
11719 traceTiming =
false;
11723 err(
"option should be \"-t\" or \"-t_time\", found: \"{}\".\n",argv[optInd]);
11727 if (optInd+1>=argc || argv[optInd+1][0] ==
'-')
11729 traceName=
"stdout";
11733 traceName=argv[optInd+1];
11737 err(
"support for option \"-t\" has not been compiled in (use a debug build or a release build with tracing enabled).\n");
11748 err(
"option should be \"-x\" or \"-x_noenv\", found: \"{}\".\n",argv[optInd]);
11762 if (formatName.
empty())
11764 err(
"option \"-e\" is missing format specifier rtf.\n");
11770 if (optInd+1>=argc)
11772 err(
"option \"-e rtf\" is missing an extensions file name\n");
11780 err(
"option \"-e\" has invalid format specifier.\n");
11788 if (listName.
empty())
11790 err(
"option \"-f\" is missing list specifier.\n");
11796 if (optInd+1>=argc)
11798 err(
"option \"-f emoji\" is missing an output file name\n");
11806 err(
"option \"-f\" has invalid list specifier.\n");
11814 if (formatName.
empty())
11816 err(
"option \"-w\" is missing format specifier rtf, html or latex\n");
11822 if (optInd+1>=argc)
11824 err(
"option \"-w rtf\" is missing a style sheet file name\n");
11830 err(
"error opening RTF style sheet file {}!\n",argv[optInd+1]);
11840 if (optInd+4<argc ||
FileInfo(
"Doxyfile").exists() ||
FileInfo(
"doxyfile").exists())
11846 err(
"error opening or reading configuration file {}!\n",argv[optInd+4]);
11851 if (optInd+3>=argc)
11853 err(
"option \"-w html\" does not have enough arguments\n");
11870 if (optInd+4<argc ||
FileInfo(
"Doxyfile").exists() ||
FileInfo(
"doxyfile").exists())
11875 err(
"error opening or reading configuration file {}!\n",argv[optInd+4]);
11880 if (optInd+3>=argc)
11882 err(
"option \"-w latex\" does not have enough arguments\n");
11898 err(
"Illegal format specifier \"{}\": should be one of rtf, html or latex\n",formatName);
11918 if (
dstrcmp(&argv[optInd][2],
"help")==0)
11920 usage(argv[0],versionString);
11923 else if (
dstrcmp(&argv[optInd][2],
"version")==0)
11929 else if ((
dstrcmp(&argv[optInd][2],
"Version")==0) ||
11930 (
dstrcmp(&argv[optInd][2],
"VERSION")==0))
11938 err(
"Unknown option \"-{}\"\n",&argv[optInd][1]);
11939 usage(argv[0],versionString);
11944 setvbuf(stdout,
nullptr,_IONBF,0);
11951 usage(argv[0],versionString);
11955 err(
"Unknown option \"-{:c}\"\n",argv[optInd][1]);
11956 usage(argv[0],versionString);
11967 TRACE(
"Doxygen version used: {}",getFullVersion());
11970 FileInfo configFileInfo1(
"Doxyfile"),configFileInfo2(
"doxyfile");
11973 if (configFileInfo1.exists())
11975 configName=
"Doxyfile";
11977 else if (configFileInfo2.
exists())
11979 configName=
"doxyfile";
11981 else if (genConfig)
11983 configName=
"Doxyfile";
11987 err(
"Doxyfile not found and no input file specified!\n");
11988 usage(argv[0],versionString);
11995 if (fi.
exists() ||
dstrcmp(argv[optInd],
"-")==0 || genConfig)
11997 configName=argv[optInd];
12001 err(
"configuration file {} not found!\n",argv[optInd]);
12002 usage(argv[0],versionString);
12016 err(
"could not open or read configuration file {}!\n",configName);
12088 for (
const auto &mapping : extMaps)
12106 err(
"Failed to map file extension '{}' to unsupported language '{}'.\n"
12107 "Check the EXTENSION_MAPPING setting in the config file.\n",
12112 msg(
"Adding custom extension mapping: '{}' will be treated as language '{}'\n",
12121 if (cd==
reinterpret_cast<void *
>(-1))
12123 term(
"unsupported character conversion: '{}'->'UTF-8': {}\n"
12124 "Check the 'INPUT_ENCODING' setting in the config file!\n",
12134 for (
const auto &mapping : fileEncod)
12150 if (cd==
reinterpret_cast<void *
>(-1))
12152 term(
"unsupported character conversion: '{}'->'UTF-8': {}\n"
12153 "Check the 'INPUT_FILE_ENCODING' setting in the config file!\n",
12154 encoding,strerror(errno));
12167 for (
const auto &s : expandAsDefinedList)
12185 signal(SIGINT,SIG_DFL);
12187 msg(
"Cleaning up...\n");
12202 if (generateTagFile.
empty())
return;
12207 err(
"cannot open tag file {} for writing\n", generateTagFile);
12211 tagFile <<
"<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>\n";
12212 tagFile <<
"<tagfile doxygen_version=\"" << getDoxygenVersion() <<
"\"";
12213 std::string gitVersion = getGitVersion();
12214 if (!gitVersion.empty())
12216 tagFile <<
" doxygen_gitid=\"" << gitVersion <<
"\"";
12223 for (
const auto &fd : *fn)
12225 if (fd->isLinkableInProject()) fd->writeTagFile(tagFile);
12258 if (gd->isLinkableInProject()) gd->writeTagFile(tagFile);
12263 if (mod->isLinkableInProject()) mod->writeTagFile(tagFile);
12268 if (pd->isLinkableInProject()) pd->writeTagFile(tagFile);
12275 if (dd->isLinkableInProject()) dd->writeTagFile(tagFile);
12279 tagFile <<
"</tagfile>\n";
12287 msg(
"Exiting...\n");
12296 const DString &formatDirName,
12297 const char *defaultDirName)
12299 DString result = formatDirName;
12300 if (result.
empty())
12302 result = baseDirName + defaultDirName;
12304 else if (formatDirName[0]!=
'/' && (formatDirName.
length()==1 || formatDirName[1]!=
':'))
12306 result.
prepend(baseDirName+
"/");
12308 Dir formatDir(result.
str());
12311 term(
"Could not create output directory {}\n", result);
12325 g_s.
begin(
"Searching for include files...\n");
12328 for (
const auto &s : includePathList)
12346 g_s.
begin(
"Searching for example files...\n");
12349 for (
const auto &s : examplePathList)
12365 g_s.
begin(
"Searching for images...\n");
12368 for (
const auto &s : imagePathList)
12383 g_s.
begin(
"Searching for dot files...\n");
12386 for (
const auto &s : dotFileList)
12401 g_s.
begin(
"Searching for msc files...\n");
12404 for (
const auto &s : mscFileList)
12419 g_s.
begin(
"Searching for dia files...\n");
12422 for (
const auto &s : diaFileList)
12437 g_s.
begin(
"Searching for plantuml files...\n");
12440 for (
const auto &s : plantUmlFileList)
12455 g_s.
begin(
"Searching for mermaid files...\n");
12458 for (
const auto &s : mermaidFileList)
12473 g_s.
begin(
"Searching for files to exclude\n");
12475 for (
const auto &s : excludeList)
12494 g_s.
begin(
"Searching INPUT for files to process...\n");
12498 for (
const auto &s : inputList)
12501 size_t l = path.
length();
12505 if (path.
at(l-1)==
'\\' || path.
at(l-1)==
'/') path=path.
left(l-1);
12526 if (fileName->size()>1)
12528 std::stable_sort(fileName->begin(),fileName->end(),[](
const auto &f1,
const auto &f2)
12530 return dstricmp_sort(f1->absFilePath(),f2->absFilePath())<0;
12536 [](
const auto &f1,
const auto &f2)
12538 return dstricmp_sort(f1->front()->absFilePath(),f2->front()->absFilePath())<0;
12542 warn_uncond(
"No files to be processed, please check your settings, in particular INPUT, FILE_PATTERNS, and RECURSIVE\n");
12553 if (mdfileAsMainPage.
empty())
return;
12557 warn_uncond(
"Specified markdown mainpage '{}' does not exist\n",mdfileAsMainPage);
12560 bool ambig =
false;
12563 warn_uncond(
"Specified markdown mainpage '{}' has not been defined as input file\n",mdfileAsMainPage);
12582 DString versionString = getFullVersion();
12583 msg(
"Doxygen version used: {}\n",versionString);
12593 if (outputDirectory.
empty())
12599 Dir dir(outputDirectory.
str());
12603 if (!dir.
mkdir(outputDirectory.
str()))
12605 term(
"tag OUTPUT_DIRECTORY: Output directory '{}' does not "
12606 "exist and cannot be created\n",outputDirectory);
12610 msg(
"Notice: Output directory '{}' does not exist. "
12611 "I have created it for you.\n", outputDirectory);
12659 bool generateSitemap = !sitemapUrl.
empty();
12660 if (generateSitemap && !sitemapUrl.
endsWith(
"/"))
12667 bool generateEclipseHelp =
Config_getBool(GENERATE_ECLIPSEHELP);
12681 if (generateDocbook)
12721 if (curFontPath.
empty())
12725 if (!curFontPath.
empty())
12728 newFontPath+=curFontPath;
12744 bool defaultLayoutUsed =
false;
12745 if (layoutFileName.
empty())
12748 defaultLayoutUsed =
true;
12750 AUTO_TRACE_ADD(
"defaultLayoutUsed={}, layoutFileName={}",defaultLayoutUsed,layoutFileName);
12755 msg(
"Parsing layout file {}...\n",layoutFileName);
12758 else if (!defaultLayoutUsed)
12760 warn_uncond(
"failed to open layout file '{}' for reading! Using default settings.\n",layoutFileName);
12770 if (generateHtml) exclPatterns.push_back(htmlOutput.
str());
12771 if (generateDocbook) exclPatterns.push_back(docbookOutput.
str());
12772 if (generateXml) exclPatterns.push_back(xmlOutput.
str());
12773 if (generateLatex) exclPatterns.push_back(latexOutput.
str());
12774 if (generateRtf) exclPatterns.push_back(rtfOutput.
str());
12775 if (generateMan) exclPatterns.push_back(manOutput.
str());
12795 if (generateDocbook)
12806 std::shared_ptr<Entry> root = std::make_shared<Entry>();
12810 msg(
"Reading and parsing tag files\n");
12812 for (
const auto &s : tagFileList)
12864 g_s.
begin(
"Building macro definition list...\n");
12868 g_s.
begin(
"Building group list...\n");
12873 g_s.
begin(
"Building directory list...\n");
12878 g_s.
begin(
"Building namespace list...\n");
12883 g_s.
begin(
"Building file list...\n");
12887 g_s.
begin(
"Building class list...\n");
12891 g_s.
begin(
"Building concept list...\n");
12899 g_s.
begin(
"Computing nesting relations for classes...\n");
12912 g_s.
begin(
"Associating documentation with classes...\n");
12916 g_s.
begin(
"Associating documentation with concepts...\n");
12921 g_s.
begin(
"Associating documentation with modules...\n");
12925 g_s.
begin(
"Building example list...\n");
12929 g_s.
begin(
"Searching for enumerations...\n");
12937 g_s.
begin(
"Searching for documented typedefs...\n");
12943 g_s.
begin(
"Searching for documented sequences...\n");
12947 g_s.
begin(
"Searching for documented dictionaries...\n");
12952 g_s.
begin(
"Searching for members imported via using declarations...\n");
12959 g_s.
begin(
"Searching for included using directives...\n");
12963 g_s.
begin(
"Searching for documented variables...\n");
12967 g_s.
begin(
"Building interface member list...\n");
12970 g_s.
begin(
"Building member list...\n");
12974 g_s.
begin(
"Searching for friends...\n");
12978 g_s.
begin(
"Searching for documented defines...\n");
12982 g_s.
begin(
"Computing class inheritance relations...\n");
12987 g_s.
begin(
"Computing class usage relations...\n");
12991 g_s.
begin(
"Flushing cached template relations that have become invalid...\n");
12995 g_s.
begin(
"Warn for undocumented namespaces...\n");
12999 g_s.
begin(
"Computing class relations...\n");
13010 g_s.
begin(
"Add enum values to enums...\n");
13015 g_s.
begin(
"Searching for member function documentation...\n");
13027 g_s.
begin(
"Creating members for template instances...\n");
13031 g_s.
begin(
"Searching for tag less structs...\n");
13035 g_s.
begin(
"Building page list...\n");
13039 g_s.
begin(
"Building requirements list...\n");
13043 g_s.
begin(
"Search for main page...\n");
13048 g_s.
begin(
"Computing page relations...\n");
13053 g_s.
begin(
"Determining the scope of groups...\n");
13057 g_s.
begin(
"Computing module relations...\n");
13059 mm.resolvePartitions();
13060 mm.resolveImports();
13061 mm.collectExportedSymbols();
13080 return i==0 ?
dstricmp_sort(c1->name(), c2->name())<0 : i<0;
13115 g_s.
begin(
"Determining which enums are documented\n");
13119 g_s.
begin(
"Computing member relations...\n");
13124 g_s.
begin(
"Building full member lists recursively...\n");
13128 g_s.
begin(
"Adding members to member groups.\n");
13134 g_s.
begin(
"Distributing member group documentation.\n");
13139 g_s.
begin(
"Computing member references...\n");
13145 g_s.
begin(
"Inheriting documentation...\n");
13153 g_s.
begin(
"Generating disk names...\n");
13157 g_s.
begin(
"Adding source references...\n");
13161 g_s.
begin(
"Adding xrefitems...\n");
13166 g_s.
begin(
"Adding requirements...\n");
13171 g_s.
begin(
"Sorting member lists...\n");
13175 g_s.
begin(
"Setting anonymous enum type...\n");
13179 g_s.
begin(
"Computing dependencies between directories...\n");
13183 g_s.
begin(
"Generating citations page...\n");
13187 g_s.
begin(
"Counting data structures...\n");
13191 g_s.
begin(
"Resolving user defined references...\n");
13195 g_s.
begin(
"Finding anchors and sections in the documentation...\n");
13199 g_s.
begin(
"Transferring function references...\n");
13203 g_s.
begin(
"Combining using relations...\n");
13208 g_s.
begin(
"Adding members to index pages...\n");
13213 g_s.
begin(
"Correcting members for VHDL...\n");
13217 g_s.
begin(
"Computing tooltip texts...\n");
13225 [](
const auto &g1,
const auto &g2)
13226 {
return g1->groupTitle() < g2->groupTitle(); });
13230 gd->sortSubGroups();
13274 if (generateDocbook)
13294 err(
"USE_HTAGS is YES but htags(1) failed. \n");
13296 err(
"htags(1) ended normally but failed to load the filemap. \n");
13303 g_s.
begin(
"Generating style sheet...\n");
13311 g_s.
begin(
"Generating search indices...\n");
13312 if (searchEngine && !serverBasedSearch && generateHtml)
13320 if (generateHtml && searchEngine)
13323 Dir searchDir(searchDirName.
str());
13324 if (!searchDir.
exists() && !searchDir.
mkdir(searchDirName.
str()))
13326 term(
"Could not create search results directory '{}' $PWD='{}'\n",
13330 if (!serverBasedSearch)
13352 if (generateDocbook)
13368 g_s.
begin(
"Generating images for formulas in HTML...\n");
13375 g_s.
begin(
"Generating images for formulas in RTF...\n");
13382 g_s.
begin(
"Generating images for formulas in Docbook...\n");
13387 g_s.
begin(
"Generating example documentation...\n");
13391 g_s.
begin(
"Generating file sources...\n");
13395 g_s.
begin(
"Counting members...\n");
13401 g_s.
begin(
"Generating file documentation...\n");
13405 g_s.
begin(
"Generating page documentation...\n");
13409 g_s.
begin(
"Generating group documentation...\n");
13413 g_s.
begin(
"Generating class documentation...\n");
13417 g_s.
begin(
"Generating concept documentation...\n");
13421 g_s.
begin(
"Generating module documentation...\n");
13425 g_s.
begin(
"Generating namespace documentation...\n");
13431 g_s.
begin(
"Generating graph info page...\n");
13436 g_s.
begin(
"Generating directory documentation...\n");
13445 g_s.
begin(
"finalizing index lists...\n");
13449 g_s.
begin(
"writing tag file...\n");
13455 g_s.
begin(
"Generating XML output...\n");
13463 g_s.
begin(
"Generating SQLITE3 output...\n");
13470 g_s.
begin(
"Generating AutoGen DEF output...\n");
13476 g_s.
begin(
"Generating Perl module output...\n");
13480 if (generateHtml && searchEngine && serverBasedSearch)
13482 g_s.
begin(
"Generating search index\n");
13492 if (searchDataFile.
empty())
13494 searchDataFile=
"searchdata.xml";
13507 g_s.
begin(
"Combining RTF output...\n");
13510 err(
"An error occurred during post-processing the RTF files!\n");
13517 g_s.
begin(
"Running plantuml with JAVA...\n");
13524 g_s.
begin(
"Running mermaid (mmdc)...\n");
13536 if (generateHtml &&
13540 g_s.
begin(
"Running html help compiler...\n");
13545 if ( generateHtml &&
13549 g_s.
begin(
"Running qhelpgenerator...\n");
13562 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
13563 if (numThreads<1) numThreads=1;
13564 msg(
"Total elapsed time: {:.6f} seconds\n(of which an average of {:.6f} seconds per thread waiting for external tools to finish)\n",
13571 msg(
"finished...\n");
13576 msg(
"finished...\n");
This class contains the information about the argument of a function or template.
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 file in which this compound's definition can be found.
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,...)
int toInt(bool *ok=nullptr, int base=10) const
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
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.
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.
This struct is used to capture the tag file information for an Entry.
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 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()
static void addIncludeFile(Def *def, FileDef *ifd, const Entry *root)
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 findTagLessClasses()
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 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)
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)
void parseTagFile(const std::shared_ptr< Entry > &root, const char *fullName)
void initTracing(const DString &logFile, bool timing)
bool isTypeAClassFriend(const DString &type)
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.