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--;
727 name.stripPrefix(
"::");
728 int level = name.contains(
"::");
736 if (idx==-1)
return prevScope;
737 DString nsName = name.mid(idx,l);
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();
886 while ((i=name.find(
"::",p))!=
DString::npos && alIt!=tArgLists.end())
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();
1575 if (
Config_getEnum(TAGLESS_NAMESTYLE)==TAGLESS_NAMESTYLE_t::flat)
1587 if (!fullName.
empty()) fullName +=
".";
1588 fullName += fieldName;
1596 const char *p = n.
data()+sn;
1600 if (!isdigit(c) && c!=
'@' && c!=
':')
break;
1606 fullName = n+
"."+fieldName;
1626 if (hasNamedVariable)
1639 else if (outerScope)
1659 auto newMd =
createMemberDef(md->getDefFileName(),md->getDefLine(),md->getDefColumn(),
1660 md->typeString(),md->name(),md->argsString(),md->excpString(),
1661 md->protection(),md->virtualness(),md->isStatic(),Relationship::Member,
1670 imd->
setId(md->id());
1685 static auto memberListPairs = std::array<std::pair<MemberListType,MemberListType>,3>{{
1686 { MemberListType::PubAttribs(), MemberListType::PubTypes() },
1687 { MemberListType::ProAttribs(), MemberListType::ProTypes() },
1688 { MemberListType::PriAttribs(), MemberListType::PriTypes() }
1690 for (
auto [attribs,types] : memberListPairs)
1695 for (
const auto &md : *ml)
1699 if (!hasNamedVariable && root)
1752 for (
const auto &md : *ml)
1760 if (md->isEnumerate() && md->name().startsWith(
"@"))
1762 for (
const auto &emd : md->enumFieldList())
1781template<
typename Container,
typename TagContainer>
1783 const Container *def,
1784 const TagContainer *tagParent,
1789template<
typename Container,
typename TagContainer>
1791 const Container *def,
1792 const TagContainer *tagParent,
1797 AUTO_TRACE(
"count={} name={}\n",count,def->name());
1800 MemberList *ml = def->getMemberList(varFilter);
1805 std::vector<MemberDef *> members;
1806 for (
const auto &md : *ml)
1808 members.push_back(md);
1810 for (
const auto &md : members)
1816 MemberList *pml = tagParent->getMemberList(varFilter);
1819 for (
const auto &pmd : *pml)
1821 if (pmd->name()==md->name())
1832 bool hasNamedVariable = pmdm==
nullptr || !pmdm->
isAnonymous();
1834 DString type = md->typeString();
1840 std::vector<const ClassDef *> candidates;
1841 for (
const auto &icd : def->getClasses())
1843 candidates.push_back(icd);
1845 for (
const auto &icd : candidates)
1851 if (md->isAnonymous()) name =
"__unnamed" +
DString().
setNum(pos++)+
"__";
1857 processTagLessClasses(ncd,icd,ncd,MemberListType::PubAttribs(),MemberListType::PubTypes(),name,count+1);
1875 ml = def->getMemberList(typeFilter);
1878 for (
const auto &md : *ml)
1896template<
typename Container,
typename TagContainer>
1898 const Container *def,
1899 const TagContainer *tagParent,
1904 if (varFilter==MemberListType::PubAttribs())
1916template<
typename Container>
1919 for (
const auto &icd : cd->getClasses())
1927 candidates.insert(cd);
1932 std::set<const Definition *> candidates;
1942 const FileDef *fd = cd->getFileDef();
1957 for (
const auto &d : candidates)
1963 processTagLessClasses(nd,nd,nd,MemberListType::DecVarMembers(),MemberListType::DecEnumMembers(),
"",0);
1968 processTagLessClasses(fd,fd,fd,MemberListType::DecVarMembers(),MemberListType::DecEnumMembers(),
"",0);
1985 (root->
section.isNamespace() ||
1986 root->
section.isNamespaceDoc() ||
1995 if (root->
section.isPackageDoc())
2001 if (!fullName.
empty())
2060 root->
type,root->
spec.isPublished())));
2128 DString aliasName = aliasNd->name();
2157 for (
auto &und : unl)
2159 DString uScope=und->name()+
"::";
2161 if (usingNd!=
nullptr)
break;
2168 if (root->
section.isUsingDir())
2172 if (name.endsWith(
"::"))
2174 name=name.left(name.length()-2);
2186 (fd==
nullptr || fd->
getLanguage()!=SrcLangExt::Java)
2190 if (!nsName.
empty())
2200 int scopeOffset =
static_cast<int>(nsName.
length());
2213 size_t o = nsName.
rfind(
"::",scopeOffset-1);
2216 }
while (scopeOffset>=0 && usingNd==
nullptr);
2218 if (usingNd==
nullptr && nd)
2222 while (pnd && usingNd==
nullptr)
2239 if (usingNd==
nullptr && fd)
2312 if (root->
section.isUsingDecl() &&
2325 if (root->
section.isUsingDecl() &&
2327 (!filterPythonPackages || (root->
lang==SrcLangExt::Python && root->
fileName.
endsWith(
"__init__.py")))
2330 AUTO_TRACE(
"Found using declaration '{}' at line {} of {} inside section {}",
2344 if (!scName.
empty())
2360 if (nd==
nullptr) scope = fd;
2430 AUTO_TRACE(
"creating new member {} for class {}",memName,cd->
name());
2441 newMmd->setMemberClass(cd);
2459 newMmd->addSectionsToDefinition(root->
anchors);
2465 newMmd->setMemberGroupId(root->
mGrpId);
2468 newMmd->setLanguage(root->
lang);
2469 newMmd->setId(root->
id);
2478 if (root->
section.isUsingDecl() &&
2505 for (
auto &mi : *mni)
2508 if (md && md->
protection()!=Protection::Private)
2523 for (
const auto ©Cd : it->second)
2536 else if (root->
section.isUsingDecl() &&
2538 root->
lang==SrcLangExt::Cpp
2571 memName = root->
name;
2593 newMmd->setNamespace(nd);
2598 newMmd->setFileDef(fd);
2617 newMmd->addSectionsToDefinition(root->
anchors);
2623 newMmd->setMemberGroupId(root->
mGrpId);
2626 newMmd->setLanguage(root->
lang);
2627 newMmd->setId(root->
id);
2635 if (nd && aliasMd.get())
2639 if (fd && aliasMd.get())
2668 if (nd) ncdm->
moveTo(nd);
2697 aliasFullName = aliasCd->localName();
2701 aliasFullName = nd->
qualifiedName()+
"::"+aliasCd->localName();
2733 for (
const auto &fd : *fn)
2736 fd->addIncludedUsingDirectives(visitedFiles);
2756 if (lang==SrcLangExt::Java || lang==SrcLangExt::CSharp)
2761 AUTO_TRACE(
"class variable: file='{}' type='{}' scope='{}' name='{}' args='{}' prot={} mtype={} lang={} init='{}'",
2767 if (related!=Relationship::Member || mtype==MemberType::Friend ||
Config_getBool(HIDE_SCOPE_NAMES))
2769 if (root->
spec.isAlias())
2771 if (lang==SrcLangExt::Python)
2773 def=
"type "+name+args;
2782 def=type+
" "+name+args;
2787 if (root->
spec.isAlias())
2789 if (lang==SrcLangExt::Python)
2791 def=
"type "+qualScope+scopeSeparator+name+args;
2795 def=
"using "+qualScope+scopeSeparator+name;
2800 def=type+
" "+qualScope+scopeSeparator+name+args;
2812 def=qualScope+scopeSeparator+name+args;
2823 for (
const auto &imd : *mn)
2835 if (root->
lang==SrcLangExt::ObjC &&
2836 root->
mtype==MethodTypes::Property &&
2860 prot,Specifier::Normal,root->
isStatic,related,
2864 mmd->setTagInfo(root->
tagInfo());
2865 mmd->setMemberClass(cd);
2869 mmd->setDefinition(def);
2871 mmd->addSectionsToDefinition(root->
anchors);
2875 mmd->setMemberGroupId(root->
mGrpId);
2876 mmd->setMemberSpecifiers(root->
spec);
2877 mmd->setVhdlSpecifiers(root->
vhdlSpec);
2878 mmd->setReadAccessor(root->
read);
2879 mmd->setWriteAccessor(root->
write);
2881 mmd->setHidden(root->
hidden);
2883 mmd->setLanguage(root->
lang);
2884 mmd->setId(root->
id);
2887 mmd->setBodyDef(root->
fileDef());
2893 mmd->setRefItems(root->
sli);
2894 mmd->setRequirementReferences(root->
rqli);
2899 if (mtype==MemberType::Typedef)
2922 AUTO_TRACE(
"global variable: file='{}' type='{}' scope='{}' name='{}' args='{}' prot={} mtype={} lang={} init='{}'",
2928 if (mtype==MemberType::Typedef &&
Config_getBool(TYPEDEF_HIDES_STRUCT))
2934 static const reg::Ex re(R
"(\a\w*)");
2936 const std::string &typ = ttype.
str();
2939 DString typeValue = match.str();
2974 if (root->
spec.isAlias())
2976 if (lang==SrcLangExt::Python)
2978 def=
"type "+nd->
name()+sep+name+args;
2982 def=
"using "+nd->
name()+sep+name;
2987 def=type+
" "+nd->
name()+sep+name+args;
2992 def=nd->
name()+sep+name+args;
2999 if (name.at(0)==
'@')
3005 if (root->
spec.isAlias())
3007 if (root->
lang==SrcLangExt::Python)
3009 def=
"type "+root->
name+args;
3013 def=
"using "+root->
name;
3018 def=type+
" "+name+args;
3039 for (
const auto &imd : *mn)
3053 bool isPHPArray = md->
getLanguage()==SrcLangExt::PHP &&
3056 bool staticsInDifferentFiles =
3062 !staticsInDifferentFiles
3104 mmd->setTagInfo(root->
tagInfo());
3105 mmd->setMemberSpecifiers(root->
spec);
3106 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3110 mmd->addSectionsToDefinition(root->
anchors);
3113 mmd->setMemberGroupId(root->
mGrpId);
3114 mmd->setDefinition(def);
3115 mmd->setLanguage(root->
lang);
3116 mmd->setId(root->
id);
3124 mmd->setBodyDef(fd);
3130 mmd->setRefItems(root->
sli);
3131 mmd->setRequirementReferences(root->
rqli);
3134 mmd->setNamespace(nd);
3142 mmd->setFileDef(fd);
3148 if (mtype==MemberType::Typedef)
3170 if (lang == SrcLangExt::Fortran || lang == SrcLangExt::VHDL)
3175 static const reg::Ex re(R
"(\([^)]*[*&^][^)]*\))");
3177 size_t i=std::string::npos;
3181 i = match.position();
3184 if (i!=std::string::npos)
3186 size_t di = type.find(
"decltype(");
3187 if (di!=std::string::npos && di<i)
3189 i = std::string::npos;
3192 size_t bb=type.find(
'<');
3193 size_t be=type.rfind(
'>');
3194 bool templFp =
false;
3195 if (be!=std::string::npos) {
3196 size_t cc_ast = type.find(
"::*");
3197 size_t cc_amp = type.find(
"::&");
3198 templFp = (cc_ast != std::string::npos && cc_ast>be) || (cc_amp != std::string::npos && cc_amp>be);
3201 if (!type.empty() &&
3202 i!=std::string::npos &&
3203 type.find(
"operator")==std::string::npos &&
3204 (type.find(
")(")==std::string::npos || type.find(
"typedef ")!=std::string::npos) &&
3206 (!((bb!=std::string::npos && bb<i) && (be!=std::string::npos && i<be)) || templFp)
3209 if (pLength) *pLength=
static_cast<int>(l);
3212 return static_cast<int>(i);
3229 bool result =
false;
3230 bool typeIsClass =
false;
3231 bool typePtrType =
false;
3268 typeIsClass = resolver.
resolveClass(ctx,type)!=
nullptr;
3286 static const reg::Ex initChars(R
"([\d"'&*!^]+)");
3290 std::string name = a.
name.
str();
3291 if (
reg::search(name,match,initChars) && match.position()==0)
3323 std::string atype = a.
type.
str();
3324 if (
reg::search(atype,match,initChars) && match.position()==0)
3331 if (resType.empty()) resType=atype;
3332 static const reg::Ex idChars(R
"(\a\w*)");
3333 if (
reg::search(resType,match,idChars) && match.position()==0)
3335 resType=match.str();
3336 if (resType==
"int" || resType==
"long" ||
3337 resType==
"float" || resType==
"double" ||
3338 resType==
"char" || resType==
"void" ||
3339 resType==
"signed" || resType==
"unsigned" ||
3340 resType==
"const" || resType==
"volatile" )
3377 bool insideString=
false;
3378 bool insideChar=
false;
3380 while (e<len && brCount!=0)
3386 if (!insideString && !insideChar)
3388 if (e<len-1 && s.
at(e+1)==
'<')
3390 else if (roundCount==0)
3395 if (!insideString && !insideChar)
3397 if (e<len-1 && s.
at(e+1)==
'>')
3399 else if (roundCount==0)
3404 if (!insideString && !insideChar)
3408 if (!insideString && !insideChar)
3414 if (insideString && pc!=
'\\')
3423 if (insideChar && pc!=
'\\')
3433 return brCount==0 ?
static_cast<int>(e) : -1;
3442 AUTO_TRACE(
"VARIABLE_SEC: type='{}' name='{}' args='{}' bodyLine={} endBodyLine={} mGrpId={} relates='{}'",
3457 std::string sargs = args.
str();
3458 static const reg::Ex reName(R
"(\a\w*)");
3463 sargs = match.suffix().str();
3464 size_t j = sargs.find(
')');
3465 if (j!=std::string::npos) args=sargs.
substr(0,j);
3476 size_t ai = type.
find(
'[',ii);
3489 AUTO_TRACE_ADD(
"after correction: type='{}' name='{}' args='{}'",type,name,args);
3502 bool variableTemplateSpecialization = index!=-1 && !root->
tArgLists.empty() &&
3504 getClass(name.left(index))==
nullptr;
3505 if (qualifiedGroupMember || variableTemplateSpecialization)
3508 if (variableTemplateSpecialization)
3518 scope=name.left(index);
3519 name=name.mid(index+2);
3527 if (!scopeName.
empty())
3539 bool isRelated=
false;
3540 bool isMemberOf=
false;
3543 if (root->
lang==SrcLangExt::CSharp)
3556 for (
size_t i=0;i<name.length()-1;i++)
3558 if (name[i]==
':' && name[i+1]==
':')
3560 p=
static_cast<int>(i);
3562 else if (name[i]==
'<')
3567 if (e!=-1) i=
static_cast<int>(e);
3585 Relationship::Member
3606 mtype=MemberType::EnumValue;
3608 mtype=MemberType::Typedef;
3609 else if (type_s.
startsWith(
"friend ") || type_s==
"friend")
3610 mtype=MemberType::Friend;
3611 else if (root->
mtype==MethodTypes::Property)
3612 mtype=MemberType::Property;
3613 else if (root->
mtype==MethodTypes::Event)
3614 mtype=MemberType::Event;
3616 mtype=sliceOpt ? MemberType::Sequence : MemberType::Typedef;
3618 mtype=sliceOpt ? MemberType::Dictionary : MemberType::Typedef;
3623 isMemberOf=(root->
relatesType==RelatesType::MemberOf);
3634 Relationship relationship = isMemberOf ? Relationship::Foreign :
3635 isRelated ? Relationship::Related :
3636 Relationship::Member ;
3649 else if (!name.empty())
3675 scope=rname.
left(index);
3676 rname=rname.
mid(index+2);
3688 for (
auto &imd : *mn)
3690 if (!imd->isTypedef())
3699 bool notBothGrouped = root->
groups.empty() || imd->getGroupDef()==
nullptr;
3700 bool bothSameScope = (!cd && !nd) || (cd && imd->getClassDef() == cd) || (nd && imd->getNamespaceDef() == nd);
3703 if (notBothGrouped && bothSameScope && imd->typeString()==rtype)
3751 for (
const auto &e : root->
children())
3752 if (!e->section.isEnum())
3769 for (
const auto &e : root->
children())
3770 if (!e->section.isEnum())
3787 for (
const auto &e : root->
children())
3788 if (!e->section.isEnum())
3803 (root->
section.isVariable() &&
3806 (root->
section.isFunction() &&
3809 (root->
section.isFunction() &&
3818 for (
const auto &e : root->
children())
3819 if (!e->section.isEnum())
3834 enum MemberType type = root->
section.isExportedInterface() ? MemberType::Interface : MemberType::Service;
3845 mmd->setTagInfo(root->
tagInfo());
3846 mmd->setMemberClass(cd);
3848 mmd->setDocsForDefinition(
false);
3852 mmd->setMemberSpecifiers(root->
spec);
3853 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3854 mmd->setMemberGroupId(root->
mGrpId);
3856 mmd->setLanguage(root->
lang);
3857 mmd->setBodyDef(fd);
3858 mmd->setFileDef(fd);
3859 mmd->addSectionsToDefinition(root->
anchors);
3861 mmd->setDefinition(def);
3866 AUTO_TRACE(
"Interface member: fileName='{}' type='{}' name='{}' mtype='{}' prot={} virt={} state={} proto={} def='{}'",
3874 root->
spec.isOptional() ? Protection::Protected : Protection::Public, Specifier::Normal);
3884 mmd->setRefItems(root->
sli);
3885 mmd->setRequirementReferences(root->
rqli);
3894 if (root->
section.isExportedInterface() || root->
section.isIncludedService())
3896 AUTO_TRACE(
"Exported interface/included service: type='{}' scope='{}' name='{}' args='{}'"
3897 " relates='{}' relatesType='{}' file='{}' line={} bodyLine={} #tArgLists={}"
3898 " mGrpId={} spec={} proto={} docFile='{}'",
3921 else if (rname.
empty())
3924 "Illegal member name found.");
3930 case SrcLangExt::Unknown:
3931 case SrcLangExt::IDL:
3957 name.stripPrefix(
"::");
3960 if (isFriend) mtype=MemberType::Friend;
3961 else if (root->
mtype==MethodTypes::Signal) mtype=MemberType::Signal;
3962 else if (root->
mtype==MethodTypes::Slot) mtype=MemberType::Slot;
3963 else if (root->
mtype==MethodTypes::DCOP) mtype=MemberType::DCOP;
3968 if ((fd==
nullptr || fd->
getLanguage()==SrcLangExt::Cpp) &&
3969 !name.startsWith(
"operator ") &&
3972 (j!=i+2 || name.at(i+1)!=
'=')
3990 root->
relatesType==RelatesType::MemberOf ? Relationship::Foreign :
3991 Relationship::Related ;
4001 mmd->setTagInfo(root->
tagInfo());
4002 mmd->setMemberClass(cd);
4004 mmd->setDocsForDefinition(!root->
proto);
4008 mmd->setMemberSpecifiers(spec);
4009 mmd->setVhdlSpecifiers(root->
vhdlSpec);
4010 mmd->setMemberGroupId(root->
mGrpId);
4012 mmd->setLanguage(root->
lang);
4013 mmd->setRequiresClause(root->
req);
4014 mmd->setId(root->
id);
4015 mmd->setBodyDef(fd);
4016 mmd->setFileDef(fd);
4017 mmd->addSectionsToDefinition(root->
anchors);
4023 if (scopeSeparator!=
"::")
4025 qualScope =
substitute(qualScope,
"::",scopeSeparator);
4027 if (lang==SrcLangExt::PHP)
4030 scopeSeparator=
"::";
4047 def=type+
" "+qualScope+scopeSeparator+name;
4051 def=qualScope+scopeSeparator+name;
4055 mmd->setDefinition(def);
4059 AUTO_TRACE(
"function member: type='{}' scope='{}' name='{}' args='{}' proto={} def='{}'",
4060 type, qualScope, rname, args, root->
proto, def);
4070 mmd->setRefItems(root->
sli);
4071 mmd->setRequirementReferences(root->
rqli);
4091 MemberType::Function,
4095 mmd->setTagInfo(root->
tagInfo());
4096 mmd->setLanguage(root->
lang);
4097 mmd->setId(root->
id);
4102 mmd->setDocsForDefinition(!root->
proto);
4108 mmd->addSectionsToDefinition(root->
anchors);
4109 mmd->setMemberSpecifiers(root->
spec);
4110 mmd->setVhdlSpecifiers(root->
vhdlSpec);
4111 mmd->setMemberGroupId(root->
mGrpId);
4112 mmd->setRequiresClause(root->
req);
4123 if (!nscope.
empty())
4148 def=root->
type+
" "+scope+name;
4154 AUTO_TRACE(
"new non-member function type='{}' scope='{}' name='{}' args='{}' proto={} def='{}'",
4156 mmd->setDefinition(def);
4160 mmd->setRefItems(root->
sli);
4161 mmd->setRequirementReferences(root->
rqli);
4165 mmd->setNamespace(nd);
4172 mmd->setFileDef(fd);
4193 if (root->
section.isFunction())
4195 AUTO_TRACE(
"member function: type='{}' scope='{}' name='{}' args='{}' relates='{}' relatesType='{}'"
4196 " file='{}' line={} bodyLine={} #tArgLists={} mGrpId={}"
4197 " spec={} proto={} docFile='{}'",
4212 scope=rname.
left(index);
4213 rname=rname.
mid(index+2);
4222 if (root->
lang==SrcLangExt::CSharp)
4233 size_t memIndex=rname.
rfind(
"::");
4236 if (cd && scope+
"::"==rname.
left(scope.
length()+2))
4242 bool isMember=
false;
4245 size_t ts=rname.
find(
'<');
4246 size_t te=rname.
find(
'>');
4264 isMember=memIndex<ts || memIndex>te;
4304 for (
const auto &imd : *mn)
4317 fullScope.
prepend(parentScope);
4323 if (mnd) nsName = mnd->
name();
4324 if (rnd) rnsName = rnd->
name();
4332 bool sameTemplateArgs =
true;
4333 bool matchingReturnTypes =
true;
4334 bool sameRequiresClause =
true;
4340 matchingReturnTypes =
false;
4344 sameRequiresClause =
false;
4350 sameTemplateArgs =
false;
4353 bool staticsInDifferentFiles =
4356 if (sameTemplateArgs &&
4357 matchingReturnTypes &&
4358 sameRequiresClause &&
4359 !staticsInDifferentFiles &&
4366 if (!root->
groups.empty() && !root->
groups.front().groupname.empty())
4373 found=(mnd && rnd && nsName==rnsName) ||
4374 ((mnd==
nullptr && rnd==
nullptr && mfd!=
nullptr &&
4379 if (!found && gd && gd==md->
getGroupDef() && nsName==rnsName)
4385 AUTO_TRACE_ADD(
"combining function with prototype found={} in namespace '{}'",found,nsName);
4484 else if (rname.
empty())
4487 "Illegal member name found."
4505 for (
const auto &ifmd : *fn)
4509 for (
const auto &immd : *mn)
4525 AUTO_TRACE_ADD(
"Merging related global and member '{}' isFriend={} isRelated={} isFunction={}",
4602 for (
const auto &imdec : *mn)
4610 for (
const auto &imdef : *mn)
4613 if (mdef && mdec!=mdef &&
4633 for (
const auto &imd : *mn)
4649 if (mdef && mdec)
break;
4657 mdec->getOuterScope(),mdec->getFileDef(),mdec->typeString(),
const_cast<ArgumentList*
>(&mdecAl),
4664 mdec->mergeReferences(mdef);
4666 mdec->mergeReferencedBy(mdef);
4683 for (
const auto &imd : *mn)
4694 for (
const auto &irmd : *rmn)
4728 size_t i=qualifiedName.rfind(
"::");
4729 if (i!=std::string::npos)
4732 DString name = qualifiedName.substr(i+2);
4736 for (
const auto &imd : *mn)
4762 std::map<std::string,int> templateNames;
4764 for (
const Argument &arg : templateArguments)
4766 static const reg::Ex re(R
"(\a[\w:]*)");
4769 for (; it!=
end ; ++it)
4771 const auto &match = *it;
4772 std::string n = match.str();
4773 if (n==arg.name.str())
4775 if (templateNames.find(n)==templateNames.end())
4777 templateNames.emplace(n,count);
4782 return templateNames;
4797 if (context && cd!=context)
4802 if (result==
nullptr)
4807 if (result==
nullptr)
4836 for (
auto &mi : *mni)
4844 if (!typedefValue.
empty())
4846 type = typedefValue;
4865 usedClassName = typeCd->
name();
4875 if (templateNames.empty())
4879 BaseInfo bi(usedName,Protection::Public,Specifier::Normal);
4884 if (arg.name==usedName)
4888 if (usedCd==
nullptr)
4939 if (!found && !type.
empty())
4998 if (templateNames.empty())
5014 bool b =
Config_getBool(HIDE_UNDOC_RELATIONS) ? true : isArtificial;
5036 AUTO_TRACE(
"Derived from template '{}' with parameters '{}' isArtificial={}",
5037 templateClass->
name(),templSpec,isArtificial);
5040 bool existingClass = templSpec==tempArgsStr;
5041 if (existingClass)
return;
5043 bool freshInstance=
false;
5060 for (
auto it=it_pair.first ; it!=it_pair.second ; ++it)
5062 const Entry *templateRoot = it->second;
5063 AUTO_TRACE_ADD(
"template root found '{}' templSpec='{}'",templateRoot->
name,templSpec);
5069 isArtificial,templArgs.get(),templateNames);
5093 templateClassName,
true,
true);
5094 AUTO_TRACE_ADD(
"templateClassName={} baseClass={}",templateClassName,baseClass?baseClass->
name():
"<none>");
5123 if (name.empty())
return 0;
5124 int l =
static_cast<int>(name.length());
5130 while (count>0 && i>=0)
5135 case '>':
if (!insideQuote) count++;
break;
5136 case '<':
if (!insideQuote) count--;
break;
5137 case '\'':
if (!insideQuote) insideQuote=c;
5138 else if (insideQuote==c && (i<0 || name[i]!=
'\\')) insideQuote=0;
5140 case '"':
if (!insideQuote) insideQuote=c;
5141 else if (insideQuote==c && (i<0 || name[i]!=
'\\')) insideQuote=0;
5161 AUTO_TRACE(
"name={} base={} isArtificial={} mode={}",cd->
name(),bi->
name,isArtificial,(
int)mode);
5164 bool explicitGlobalScope=
false;
5167 biName=biName.
mid(2);
5168 explicitGlobalScope=
true;
5172 bool lastParent=
false;
5177 int scopeOffset=explicitGlobalScope ? 0 :
static_cast<int>(scopeName.
length());
5186 baseClassName.
prepend(scopeName.
left(scopeOffset)+
"::");
5188 if (root->
lang==SrcLangExt::CSharp)
5215 || explicitGlobalScope
5218 || (root->
lang==SrcLangExt::IDL &&
5219 (root->
section.isExportedInterface() ||
5220 root->
section.isIncludedService()))
5223 AUTO_TRACE_ADD(
"class relation '{}' inherited/used by '{}' found prot={} virt={} templSpec='{}'",
5224 baseClassName, root->
name, bi->
prot, bi->
virt, templSpec);
5227 size_t si=baseClassName.
rfind(
"::",i);
5229 if (baseClass==
nullptr &&
static_cast<size_t>(i)!=baseClassName.
length())
5239 baseClassName = baseClassName.
left(i)+baseClassName.
mid(e);
5250 else if (baseClass && !templSpec.
empty())
5261 baseClass = templClass;
5279 found=baseClass!=
nullptr && baseClass!=cd;
5289 found = baseClass!=
nullptr && baseClass!=cd;
5301 found = baseClass!=
nullptr && baseClass!=cd;
5304 bool isATemplateArgument = templateNames.find(biName.
str())!=templateNames.end();
5309 AUTO_TRACE_ADD(
"Documented base class '{}' templSpec='{}'",biName,templSpec);
5327 if (baseClassTypeDef==
nullptr)
5337 if (baseClassTypeDef)
5346 AUTO_TRACE_ADD(
"insertBaseClass name={} prot={} virt={} templSpec={}",usedName,prot,bi->
virt,templSpec);
5354 "Detected potential recursive class relation "
5355 "between class {} and base class {}!",
5362 else if (mode==
Undocumented && (scopeOffset==0 || isATemplateArgument))
5364 AUTO_TRACE_ADD(
"New undocumented base class '{}' baseClassName='{}' templSpec='{}' isArtificial={}",
5365 biName,baseClassName,templSpec,isArtificial);
5367 if (isATemplateArgument)
5370 if (baseClass==
nullptr)
5389 if (baseClass==
nullptr)
5400 si = baseClassName.
rfind(
"::");
5416 biName=
"<"+biName.
left(biName.
length()-2)+
">";
5420 AUTO_TRACE_ADD(
"insertBaseClass name={} prot={} virt={} templSpec={}",biName,bi->
prot,bi->
virt,templSpec);
5430 if (scope!=baseClass)
5456 "Detected potential recursive class relation "
5457 "between class {} and base class {}!",
5458 root->
name,baseClassName
5471 size_t o = scopeName.
rfind(
"::",scopeOffset-1);
5475 }
while (scopeOffset>=0);
5477 if (parentNode==
nullptr)
5483 parentNode=parentNode->
parent();
5485 }
while (lastParent);
5505 bool hasExtends = !root->
extends.empty();
5506 if (hasExtends)
return true;
5533 if (root->
lang==SrcLangExt::CSharp)
5539 bName = bName.
left(i);
5604 if (!nd->hasDocumentation())
5607 nd->getLanguage() == SrcLangExt::Fortran) &&
5611 warn_undoc(nd->getDefFileName(),nd->getDefLine(),
"{} {} is not documented.",
5612 nd->getLanguage() == SrcLangExt::Fortran ?
"Module" :
"Namespace",
5662 DString templSpec = ti.templSpec;
5676 for (
const auto &tn_kv : templateNames)
5678 size_t templIndex = tn_kv.second;
5680 bool hasActArg=
false;
5681 if (templIndex<templArgs->size())
5683 actArg=templArgs->at(templIndex);
5687 baseClassNames.find(actArg.
type.
str())!=baseClassNames.end() &&
5688 actualTemplateNames.find(actArg.
type.
str())==actualTemplateNames.end()
5691 actualTemplateNames.emplace(actArg.
type.
str(),
static_cast<int>(templIndex));
5726 for (
const auto &fd : *fn)
5728 fd->computeAnchors();
5741 gd->computeAnchors();
5748template<
typename Func>
5771 for (
const auto &fd : *fn)
5844 if (md==
nullptr)
return;
5845 AUTO_TRACE(
"scope='{}' name='{}' args='{}' funcDecl='{}' mSpec={}",
5860 fullName = cd->
name();
5862 fullName = nd->
name();
5864 if (!fullName.
empty()) fullName+=
"::";
5865 fullName+=md->
name();
5971 "member {} belongs to two different groups. The second one found here will be ignored.",
6009 return allowNoGroup;
6012 for (
const auto &g : root->
groups)
6014 if (g.groupname == gd->
name())
6037 AUTO_TRACE(
"namespace='{}' type='{}' name='{}' tempArg='{}' decl='{}'",namespaceName,type,name,tempArg,decl);
6039 if (n.
empty())
return false;
6051 for (
const auto &md : *mn)
6062 if (md->isAlias() && md->getOuterScope() &&
6069 nd = md->getNamespaceDef();
6073 size_t enumNamePos=0;
6074 if (nd && md->isEnumValue() && (enumNamePos=namespaceName.
rfind(
"::"))!=
DString::npos)
6076 DString enumName = namespaceName.
mid(enumNamePos+2);
6077 if (namespaceName.
left(enumNamePos)==nd->
name())
6082 for (
const auto &emd : *enumMn)
6084 found = emd->isStrong() && md->getEnumScope()==emd.get();
6098 else if (nd==
nullptr && md->isEnumValue())
6103 for (
const auto &emd : *enumMn)
6105 found = emd->isStrong() && md->getEnumScope()==emd.get();
6128 if ((namespaceName.
empty() && nd==
nullptr) ||
6129 (nd && nd->
name()==namespaceName) ||
6133 AUTO_TRACE_ADD(
"Try to add member '{}' to scope '{}'",md->name(),namespaceName);
6141 md->isVariable() || md->isTypedef() ||
6142 matchArguments2(md->getOuterScope(),md->getFileDef(),md->typeString(),&mdAl,
6149 if (matching && !root->
tArgLists.empty())
6168 if (matching && md->isStatic() &&
6169 md->getDefFileName()!=root->
fileName &&
6177 if (!md->templateArguments().empty() && !root->
tArgLists.empty())
6182 if (md->templateArguments().size()!=root->
tArgLists.back().size() ||
6183 md->typeString()!=type ||
6184 md->requiresClause()!=root->
req)
6200 if (!found && root->
relatesType!=RelatesType::Duplicate && root->
section.isFunction())
6204 DString warnMsg =
"no matching file member found for \n"+fullFuncDecl;
6207 warnMsg+=
"\nPossible candidates:";
6208 for (
const auto &md : *mn)
6212 warnMsg+=
"' " +
warn_line(md->getDefFileName(),md->getDefLine());
6220 if (root->
type!=
"friend class" &&
6221 root->
type!=
"friend struct" &&
6222 root->
type!=
"friend union" &&
6223 root->
type!=
"friend" &&
6229 "documented symbol '{}' was not declared or defined.",
qPrint(decl)
6241 auto srcIt = srcTempArgLists.begin();
6242 auto dstIt = dstTempArgLists.begin();
6243 while (srcIt!=srcTempArgLists.end() && dstIt!=dstTempArgLists.end())
6245 if ((*srcIt).size()!=(*dstIt).size())
return true;
6259 result = cd->templateArguments().hasParameters() || cd->templateMaster()!=
nullptr ||
6269 const std::string &src
6273 static const reg::Ex re(R
"(\a\w*)");
6278 for (; it!=
end ; ++it)
6280 const auto &match = *it;
6281 size_t i = match.position();
6282 size_t l = match.length();
6284 dst+=src.substr(p,i-p);
6285 std::string name=match.str();
6287 auto srcIt = srcTempArgLists.begin();
6288 auto dstIt = dstTempArgLists.begin();
6289 while (srcIt!=srcTempArgLists.end() && !found)
6292 std::vector<Argument>::const_iterator tdaIt;
6293 if (dstIt!=dstTempArgLists.end())
6296 tdaIt = tdAli->
begin();
6301 for (
auto tsaIt = tsaLi.
begin(); tsaIt!=tsaLi.
end() && !found; ++tsaIt)
6305 if (tdAli && tdaIt!=tdAli->
end())
6321 else if (tdaType.
startsWith(
"typename ")) vc=9;
6324 tdaName = tdaType.
mid(vc);
6326 if (!tdaName.
empty())
6357 auto dstIt = dst.
begin();
6362 if (dstIt == dst.
end())
6366 da.
array = dstArray;
6374 da.
array = dstArray;
6382 srcTempArgLists,dstTempArgLists,
6408 funcType,funcName,funcArgs,exceptions,
6412 mmd->setTagInfo(root->
tagInfo());
6413 mmd->setLanguage(root->
lang);
6414 mmd->setId(root->
id);
6415 mmd->makeImplementationDetail();
6416 mmd->setMemberClass(cd);
6417 mmd->setDefinition(funcDecl);
6423 mmd->setDocsForDefinition(!root->
proto);
6425 mmd->addSectionsToDefinition(root->
anchors);
6429 mmd->setMemberSpecifiers(spec);
6430 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6431 mmd->setMemberGroupId(root->
mGrpId);
6434 mmd->setRefItems(root->
sli);
6435 mmd->setRequirementReferences(root->
rqli);
6472 bool memFound=
false;
6473 for (
const auto &imd : *mn)
6476 if (md==
nullptr)
continue;
6478 if (cd==
nullptr)
continue;
6490 size_t enumNamePos=0;
6493 DString enumName = className.
mid(enumNamePos+2);
6495 if (!namespaceName.
empty()) fullScope.
prepend(namespaceName+
"::");
6496 if (fullScope==cd->
name())
6502 for (
const auto &emd : *enumMn)
6504 memFound = emd->isStrong() && md->
getEnumScope()==emd.get();
6510 if (memFound)
break;
6515 if (memFound)
break;
6533 if (!templAl.
empty())
6535 declTemplArgs.push_back(templAl);
6543 bool substDone=
false;
6550 if (declTemplArgs.size()>0 && declTemplArgs.size()==defTemplArgs.size())
6573 AUTO_TRACE_ADD(
"matching '{}'<=>'{}' className='{}' namespaceName='{}' result={}",
6594 if (!namespaceName.
empty())
6611 AUTO_TRACE_ADD(
"Comparing return types '{}'<->'{}' #args {}<->{}",
6619 else if (defTemplArgs.size()>declTemplArgs.size())
6621 AUTO_TRACE_ADD(
"Different number of template arguments {} vs {}",defTemplArgs.size(),declTemplArgs.size());
6627 bool rootIsUserDoc = root->
section.isMemberDoc();
6630 bool classOrMdIsTemplate = mdIsTemplate || classIsTemplate;
6631 bool rootIsTemplate = !root->
tArgLists.empty();
6633 if (!rootIsUserDoc &&
6634 (mdIsTemplate || rootIsTemplate) &&
6635 ((classOrMdIsTemplate && !rootIsTemplate) || (!classOrMdIsTemplate && rootIsTemplate))
6640 AUTO_TRACE_ADD(
"Comparing return types: template v.s. non-template");
6644 AUTO_TRACE_ADD(
"Match results of matchArguments2='{}' substDone='{}'",matching,substDone);
6655 if (!funcTempList.
empty() &&
6675 else if (cd && cd!=tcd)
6681 if (memFound)
break;
6685 addLocalObjCMethod(root,scopeName,funcType,funcName,funcArgs,exceptions,funcDecl,spec);
6688 if (count==0 && !(isFriend && funcType==
"class"))
6691 const ClassDef *ecd =
nullptr, *ucd =
nullptr;
6692 MemberDef *emd =
nullptr, *umd =
nullptr;
6694 for (
const auto &md : *mn)
6716 AUTO_TRACE_ADD(
"new candidate className='{}' scope='{}' args='{}': exact match",
6717 className,ccd->
name(),md->argsString());
6723 AUTO_TRACE_ADD(
"new candidate className='{}' scope='{}' args='{}': no match",
6724 className,ccd->
name(),md->argsString());
6729 bool strictProtoMatching =
Config_getBool(STRICT_PROTO_MATCHING);
6730 if (!strictProtoMatching)
6732 if (candidates==1 && ucd && umd)
6739 else if (candidates>1 && ecd && emd)
6750 if (noMatchCount>1) warnMsg+=
"uniquely ";
6751 warnMsg+=
"matching class member found for \n";
6755 warnMsg+=
" template ";
6760 DString fullFuncDecl=funcDecl;
6764 warnMsg+=fullFuncDecl;
6766 if (candidates>0 || noMatchCount>=1)
6768 warnMsg+=
"\nPossible candidates:";
6774 for (
const auto &md : *mn)
6776 const ClassDef *cd=md->getClassDef();
6790 warnMsg+=
"template ";
6795 if (!md->typeString().empty())
6797 warnMsg+=md->typeString();
6801 if (!qScope.
empty())
6802 warnMsg+=qScope+
"::"+md->name();
6803 warnMsg+=md->argsString();
6804 warnMsg+=
"' " +
warn_line(md->getDefFileName(),md->getDefLine());
6825 AUTO_TRACE(
"funcType={} funcName={} funcArgs={} funcDecl={} spec={}",funcType,funcName,funcArgs,funcDecl,spec);
6827 for (
const auto &md : *mn)
6829 if (md->getClassDef()==cd)
6841 funcType,funcName,funcArgs,exceptions,
6847 mmd->setTagInfo(root->
tagInfo());
6848 mmd->setLanguage(root->
lang);
6849 mmd->setId(root->
id);
6850 mmd->setMemberClass(cd);
6851 mmd->setTemplateSpecialization(
true);
6853 mmd->setDefinition(funcDecl);
6859 mmd->setDocsForDefinition(!root->
proto);
6861 mmd->addSectionsToDefinition(root->
anchors);
6865 mmd->setMemberSpecifiers(spec);
6866 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6867 mmd->setMemberGroupId(root->
mGrpId);
6869 mmd->setRefItems(root->
sli);
6870 mmd->setRequirementReferences(root->
rqli);
6885 bool sameClass=
false;
6890 [](
const auto &md1,
const auto &md2)
6891 { return md1->getClassDef()->name()==md2->getClassDef()->name(); });
6897 if (cd==
nullptr)
return;
6900 if (root->
mtype==MethodTypes::Signal) mtype=MemberType::Signal;
6901 else if (root->
mtype==MethodTypes::Slot) mtype=MemberType::Slot;
6902 else if (root->
mtype==MethodTypes::DCOP) mtype=MemberType::DCOP;
6905 std::unique_ptr<ArgumentList> tArgList =
6910 funcType,funcName,funcArgs,exceptions,
6914 mmd->setTagInfo(root->
tagInfo());
6915 mmd->setLanguage(root->
lang);
6916 mmd->setId(root->
id);
6918 mmd->setMemberClass(cd);
6919 mmd->setDefinition(funcDecl);
6928 mmd->setDocsForDefinition(!root->
proto);
6930 mmd->addSectionsToDefinition(root->
anchors);
6934 mmd->setMemberSpecifiers(spec);
6935 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6936 mmd->setMemberGroupId(root->
mGrpId);
6939 mmd->setRefItems(root->
sli);
6940 mmd->setRequirementReferences(root->
rqli);
6999 AUTO_TRACE(
"root='{}' funcDecl='{}' related='{}' overload={} isFunc={} mGrpId={} #tArgList={} spec={} lang={}",
7012 bool isRelated=
false;
7013 bool isMemberOf=
false;
7014 bool isFriend=
false;
7027 spec.setInline(
true);
7032 spec.setExplicit(
true);
7037 spec.setMutable(
true);
7042 spec.setThreadLocal(
true);
7059 if (!funcDecl.
empty() && funcDecl[0]!=
' ') funcDecl.
prepend(
" ");
7071 if (isFriend && funcDecl.
startsWith(
"class "))
7074 funcDecl=funcDecl.
mid(6);
7075 funcName = funcDecl;
7077 else if (isFriend && funcDecl.
startsWith(
"struct "))
7079 funcDecl=funcDecl.
mid(7);
7080 funcName = funcDecl;
7086 funcArgs,funcTempList,exceptions
7094 AUTO_TRACE_ADD(
"scopeName='{}' className='{}' namespaceName='{}' funcType='{}' funcName='{}' funcArgs='{}'",
7095 scopeName,className,namespaceName,funcType,funcName,funcArgs);
7096 if (!relates.
empty())
7099 isMemberOf=(root->
relatesType == RelatesType::MemberOf);
7106 scopeName = relates;
7116 if (!scopeName.
empty() &&
7119 scopeName = joinedName;
7133 DString joinedName = fnd->name()+
"::"+scopeName;
7136 scopeName=joinedName;
7163 AUTO_TRACE_ADD(
"scopeName='{}' className='{}' namespaceName='{}'",scopeName,className,namespaceName);
7168 if (!namespaceName.
empty())
7170 if (className.
empty())
7172 scopeName=namespaceName;
7174 else if (!relates.
empty() ||
7177 scopeName=namespaceName+
"::"+className;
7181 scopeName=className;
7184 else if (!className.
empty())
7186 scopeName=className;
7190 DString tempScopeName=scopeName;
7194 if (funcSpec.
empty())
7196 uint32_t argListIndex=0;
7201 tempScopeName=scopeName+funcSpec;
7209 if (!scopeName.
empty() && !isRelated && !isFriend && !
Config_getBool(HIDE_SCOPE_NAMES) && root->
lang!=SrcLangExt::Python)
7211 if (!funcType.
empty())
7215 funcDecl=funcType+
" "+tempScopeName+
"::"+funcName+funcTempList;
7219 funcDecl=funcType+
" "+tempScopeName+
"::"+funcName+funcArgs;
7226 funcDecl=tempScopeName+
"::"+funcName+funcTempList;
7230 funcDecl=tempScopeName+
"::"+funcName+funcArgs;
7236 if (!funcType.
empty())
7240 funcDecl=funcType+
" "+funcName+funcTempList;
7244 funcDecl=funcType+
" "+funcName+funcArgs;
7251 funcDecl=funcName+funcTempList;
7255 funcDecl=funcName+funcArgs;
7260 if (funcType==
"template class" && !funcTempList.
empty())
7263 AUTO_TRACE_ADD(
"Parse results: namespaceName='{}' className=`{}` funcType='{}' funcSpec='{}' "
7264 " funcName='{}' funcArgs='{}' funcTempList='{}' funcDecl='{}' relates='{}'"
7265 " exceptions='{}' isRelated={} isMemberOf={} isFriend={} isFunc={}",
7266 namespaceName, className, funcType, funcSpec,
7267 funcName, funcArgs, funcTempList, funcDecl, relates,
7268 exceptions, isRelated, isMemberOf, isFriend, isFunc);
7270 if (!funcName.
empty())
7274 bool strongEnum =
false;
7278 for (
const auto &imd : *mn)
7289 if (!namespaceName.
empty())
7291 namespaceName+=
"::"+className;
7295 namespaceName=className;
7303 funcName =
substitute(funcName,className+
"::",
"");
7306 if (!funcTempList.
empty())
7314 if (!isRelated && !strongEnum && mn)
7317 if (!className.
empty())
7319 if (funcSpec.
empty())
7322 funcArgs,funcTempList,exceptions,
7323 type,args,isFriend,spec,relates,funcDecl,overloaded,isFunc);
7335 else if (overloaded)
7337 addOverloaded(root,mn,funcType,funcName,funcArgs,funcDecl,exceptions,spec);
7341 if (!
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec))
7343 DString fullFuncDecl=funcDecl;
7346 "Cannot determine class for function\n{}",
7352 else if (isRelated && !relates.
empty())
7354 AUTO_TRACE_ADD(
"related function scopeName='{}' className='{}'",scopeName,className);
7355 if (className.
empty()) className=relates;
7359 bool newMember=
true;
7365 for (
const auto &imd : *mn)
7399 mn->
push_back(std::move(mdDefineTaken));
7413 for (
const auto &irmd : *mn)
7434 addMemberDocs(root,rmd_found,funcDecl,
nullptr,overloaded,spec);
7442 switch (root->
mtype)
7444 case MethodTypes::Method: mtype = MemberType::Function;
break;
7445 case MethodTypes::Signal: mtype = MemberType::Signal;
break;
7446 case MethodTypes::Slot: mtype = MemberType::Slot;
break;
7447 case MethodTypes::DCOP: mtype = MemberType::DCOP;
break;
7448 case MethodTypes::Property: mtype = MemberType::Property;
break;
7449 case MethodTypes::Event: mtype = MemberType::Event;
break;
7463 funcType,funcName,funcArgs,exceptions,
7466 isMemberOf ? Relationship::Foreign : Relationship::Related,
7486 mmd->setDefinitionTemplateParameterLists(root->
tArgLists);
7488 mmd->setTagInfo(root->
tagInfo());
7503 for (
const auto &irmd : *rmn)
7534 mmd->setBodyDef(fd);
7541 mmd->setMemberClass(cd);
7542 mmd->setMemberSpecifiers(spec);
7543 mmd->setVhdlSpecifiers(root->
vhdlSpec);
7544 mmd->setDefinition(funcDecl);
7549 mmd->setDocsForDefinition(!root->
proto);
7552 mmd->addSectionsToDefinition(root->
anchors);
7553 mmd->setMemberGroupId(root->
mGrpId);
7554 mmd->setLanguage(root->
lang);
7555 mmd->setId(root->
id);
7559 mmd->setRefItems(root->
sli);
7560 mmd->setRequirementReferences(root->
rqli);
7561 if (root->
relatesType==RelatesType::Duplicate) mmd->setRelatedAlso(cd);
7569 if (!
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec))
7571 DString fullFuncDecl=funcDecl;
7574 "Cannot determine file/namespace for relatedalso function\n{}",
7588 addLocalObjCMethod(root,scopeName,funcType,funcName,funcArgs,exceptions,funcDecl,spec);
7592 bool globMem =
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec);
7593 if (className.
empty() && !globMem)
7597 else if (!className.
empty() && !globMem)
7600 "member '{}' of class '{}' cannot be found",
7601 funcName,className);
7619 AUTO_TRACE(
"root->type='{}' root->inside='{}' root->name='{}' root->args='{}' section={} root->spec={} root->mGrpId={}",
7634 type=type.
left(i+l);
7645 if (root->
section.isMemberDoc())
7671 else if (root->
section.isOverloadDoc())
7685 (root->
section.isVariable() &&
7703 type+
" "+root->
name,
7707 else if (!type.
empty())
7736 else if (root->
section.isVariableDoc())
7748 else if (root->
section.isExportedInterface() ||
7749 root->
section.isIncludedService())
7755 type +
" " + root->
name,
7768 if (root->
section.isMemberDoc() ||
7769 root->
section.isOverloadDoc() ||
7772 root->
section.isVariableDoc() ||
7774 root->
section.isIncludedService() ||
7775 root->
section.isExportedInterface()
7785 for (
const auto &e : root->
children())
7787 if (!e->section.isEnum())
7799 for (
const auto &objCImpl : root->
children())
7801 if (objCImpl->section.isObjcImpl())
7803 for (
const auto &objCMethod : objCImpl->children())
7805 if (objCMethod->section.isFunction())
7809 objCMethod->relates,
7812 objCMethod->type+
" "+objCImpl->name+
"::"+objCMethod->name+
" "+objCMethod->args,
7814 objCMethod->section=EntryType::makeEmpty();
7833 bool isGlobal =
false;
7834 bool isRelated =
false;
7835 bool isMemberOf =
false;
7844 if (root->
lang==SrcLangExt::CSharp)
7867 isMemberOf=(root->
relatesType==RelatesType::MemberOf);
7875 if (cd && !name.empty())
7902 isMemberOf ? Relationship::Foreign : isRelated ? Relationship::Related : Relationship::Member,
7903 MemberType::Enumeration,
7906 mmd->setTagInfo(root->
tagInfo());
7907 mmd->setLanguage(root->
lang);
7908 mmd->setId(root->
id);
7909 if (!isGlobal) mmd->setMemberClass(cd);
else mmd->setFileDef(fd);
7911 mmd->setBodyDef(root->
fileDef());
7912 mmd->setMemberSpecifiers(root->
spec);
7913 mmd->setVhdlSpecifiers(root->
vhdlSpec);
7914 mmd->setEnumBaseType(root->
args);
7917 mmd->addSectionsToDefinition(root->
anchors);
7918 mmd->setMemberGroupId(root->
mGrpId);
7922 mmd->setRefItems(root->
sli);
7923 mmd->setRequirementReferences(root->
rqli);
7929 if (!baseType.
empty())
7938 mmd->setDefinition(name+baseType);
7942 mmd->setDefinition(nd->
name()+
"::"+name+baseType);
7946 mmd->setNamespace(nd);
7953 if (isGlobal && (nd==
nullptr || !nd->
isAnonymous()))
7955 if (!defSet) mmd->setDefinition(name+baseType);
7956 if (fd==
nullptr && root->
parent())
7962 mmd->setFileDef(fd);
7970 mmd->setDefinition(name+baseType);
7974 mmd->setDefinition(cd->
name()+
"::"+name+baseType);
7980 mmd->setDocsForDefinition(!root->
proto);
8010 bool isGlobal =
false;
8011 bool isRelated =
false;
8020 if (root->
lang==SrcLangExt::CSharp)
8035 if (root->
lang==SrcLangExt::CSharp)
8054 if (cd && !name.empty())
8081 struct EnumValueInfo
8083 EnumValueInfo(
const DString &n,std::unique_ptr<MemberDef> &&md) :
8084 name(n), member(std::move(md)) {}
8086 std::unique_ptr<MemberDef> member;
8088 std::vector< EnumValueInfo > extraMembers;
8090 for (
const auto &imd : *mn)
8097 for (
const auto &e : root->
children())
8100 bool isJavaLike = sle==SrcLangExt::CSharp || sle==SrcLangExt::Java || sle==SrcLangExt::XML;
8101 if ( isJavaLike || root->
spec.isStrong())
8103 if (sle == SrcLangExt::Cpp && e->section.isDefine())
continue;
8110 if (
size_t i = qualifiedName.
rfind(
"::"); i!=
DString::npos && sle==SrcLangExt::CSharp)
8116 qualifiedName=
substitute(qualifiedName,
"::",
".");
8120 DString fileName = e->fileName;
8121 if (fileName.
empty() && e->tagInfo())
8123 fileName = e->tagInfo()->tagName;
8127 fileName,e->startLine,e->startColumn,
8128 e->type,e->name,e->args,
DString(),
8129 e->protection, Specifier::Normal,e->isStatic,Relationship::Member,
8136 fmmd->setNamespace(mnd);
8140 fmmd->setTagInfo(e->tagInfo());
8141 fmmd->setLanguage(e->lang);
8142 fmmd->setBodySegment(e->startLine,e->bodyLine,e->endBodyLine);
8143 fmmd->setBodyDef(e->fileDef());
8145 fmmd->setDocumentation(e->doc,e->docFile,e->docLine);
8146 fmmd->setBriefDescription(e->brief,e->briefFile,e->briefLine);
8147 fmmd->addSectionsToDefinition(e->anchors);
8148 fmmd->setInitializer(e->initializer.str());
8149 fmmd->setMaxInitLines(e->initLines);
8150 fmmd->setMemberGroupId(e->mGrpId);
8151 fmmd->setExplicitExternal(e->explicitExternal,fileName,e->startLine,e->startColumn);
8152 fmmd->setRefItems(e->sli);
8153 fmmd->setRequirementReferences(e->rqli);
8156 fmmd->setEnumScope(md,
true);
8157 extraMembers.emplace_back(e->name,std::move(fmd));
8166 if (!e->name.empty() && (fmn=emnsd->
find(e->name)))
8169 for (
const auto &ifmd : *fmn)
8200 else if (isRelated && cd)
8232 for (
auto &e : extraMembers)
8278 if (gd==
nullptr && !root->
groups.empty())
8292 for (
const auto &g : root->
groups)
8311 "Found non-existing group '{}' for the command '{}', ignoring command",
8325 if (root->
section.isEnumDoc() &&
8350 AUTO_TRACE(
"Found docs for enum with name '{}' and scope '{}' in context '{}' cd='{}', nd='{}' fd='{}'",
8364 for (
const auto &imd : *mn)
8379 else if (cd==
nullptr && mcd==
nullptr && nd!=
nullptr && mnd==nd)
8386 else if (cd==
nullptr && nd==
nullptr && mcd==
nullptr && mnd==
nullptr && fd==mfd)
8411 for (
const auto &mn : mnsd)
8414 for (
const auto &imd : *mn)
8419 int documentedEnumValues=0;
8423 if (fmd->isLinkableInProject()) documentedEnumValues++;
8449 for (
const auto &md : *mn)
8451 index.addClassMemberNameToIndex(md.get());
8452 if (md->getModuleDef())
8454 index.addModuleMemberNameToIndex(md.get());
8462 for (
const auto &md : *mn)
8464 if (md->getNamespaceDef())
8466 index.addNamespaceMemberNameToIndex(md.get());
8470 index.addFileMemberNameToIndex(md.get());
8472 if (md->getModuleDef())
8474 index.addModuleMemberNameToIndex(md.get());
8479 index.sortMemberIndexLists();
8488 if (cd->isLinkableInProject())
8501 if (cd->isLinkableInProject())
8514 if (nd->isLinkableInProject())
8527 for (
const auto &fd : *fn)
8543 std::string s = title.str();
8544 static const reg::Ex re(R
"(\a[\w-]*)");
8547 for (; it!=
end ; ++it)
8549 const auto &match = *it;
8550 std::string matchStr = match.str();
8558 if (gd->isLinkableInProject())
8560 addWordsForTitle(gd.get(),gd->anchor(),gd->groupTitle());
8566 if (pd->isLinkableInProject())
8568 addWordsForTitle(pd.get(),pd->anchor(),pd->title());
8577 auto addMemberToSearchIndex = [](
const MemberDef *md)
8583 DString qn=md->qualifiedName();
8588 if (md->getClassDef())
8592 if (md->getNamespaceDef())
8603 if (md->getGroupDef()) scope = md->getGroupDef();
8604 else if (md->getClassDef()) scope = md->getClassDef();
8605 else if (md->getNamespaceDef()) scope = md->getNamespaceDef();
8606 else if (md->getFileDef()) scope = md->getFileDef();
8610 auto addMemberToIndices = [addMemberToSearchIndex,getScope](
const MemberDef *md)
8612 if (md->isLinkableInProject())
8614 if (!(md->isEnumerate() && md->isAnonymous()))
8617 addMemberToSearchIndex(md);
8619 if (md->isEnumerate())
8621 for (
const auto &fmd : md->enumFieldList())
8624 addMemberToSearchIndex(fmd);
8634 for (
const auto &md : *mn)
8636 addMemberToIndices(md.get());
8643 for (
const auto &md : *mn)
8645 addMemberToIndices(md.get());
8658 for (
const auto &imd : *mn)
8671 for (
const auto &imd : *mn)
8688 for (
const auto &imd : *mn)
8697 const auto &bmni = bmn.
find(mn->memberName());
8700 for (
const auto &ibmd : *bmni)
8708 lang==SrcLangExt::Python ||
8709 lang==SrcLangExt::Java ||
8710 lang==SrcLangExt::PHP ||
8719 bool instantiateBaseMember = actualArgs &&
8720 (memberClass==baseClass || memberClass==baseTemplate) &&
8722 bool useDerivedScope =
false;
8725 if (instantiateBaseMember)
8727 instantiatedBmdAl = bmdAl;
8728 for (
Argument &arg : instantiatedBmdAl)
8732 useDerivedScope = useDerivedScope || substitutedType!=arg.type;
8733 arg.type = substitutedType;
8736 instantiatedBmdAl.trailingReturnType(),baseTemplate->
templateArguments(),actualArgs);
8737 useDerivedScope = useDerivedScope ||
8738 substitutedTrailingReturnType!=instantiatedBmdAl.trailingReturnType();
8739 instantiatedBmdAl.setTrailingReturnType(substitutedTrailingReturnType);
8742 useDerivedScope = useDerivedScope || substitutedType!=instantiatedBmdType;
8743 instantiatedBmdType = substitutedType;
8750 lang==SrcLangExt::Python ||
8753 instantiatedBmdType,instantiateBaseMember ? &instantiatedBmdAl : &bmdAl,
8759 if (lang==SrcLangExt::Python && md->
name().
startsWith(
"__"))
continue;
8786 DString templSpec = bbcd.templSpecifiers;
8807 if (cd->isLinkable())
8809 for (
const auto &bcd : cd->baseClasses())
8826 for (
const auto &ti : cd->getTemplateInstances())
8851 AUTO_TRACE_ADD(
"merging members of category {} into {}",cd->name(),baseClass->
name());
8866 cd->subClasses().empty() &&
8867 !cd->baseClasses().empty())
8898 msg(
"Generating code for file {}...\n",fd->
docName());
8903 else if (parseSources)
8905 msg(
"Parsing code for file {}...\n",fd->
docName());
8921 for (
const auto &fd : *fn)
8929 for (
const auto &fd : *fn)
8938 clangParser->parse();
8939 processSourceFile(fd.get(),*
g_outputList,clangParser.get());
8941 for (
auto incFile : clangParser->filesInSameTU())
8943 if (filesToProcess.find(incFile)!=filesToProcess.end() &&
8945 processedFiles.
find(incFile)==processedFiles.end())
8952 processSourceFile(ifd,*
g_outputList,clangParser.get());
8953 processedFiles.insert(incFile);
8964 for (
const auto &fd : *fn)
8966 if (processedFiles.find(fd->
absFilePath().
str())==processedFiles.end())
8971 clangParser->parse();
8972 processSourceFile(fd.get(),*
g_outputList,clangParser.get());
8985 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8988 msg(
"Generating code files using {} threads.\n",numThreads);
8989 struct SourceContext
8992 : fd(fd_), generateSourceFile(gen_), ol(ol_) {}
8994 bool generateSourceFile;
8998 std::vector< std::future< std::shared_ptr<SourceContext> > > results;
9001 for (
const auto &fd : *fn)
9004 auto ctx = std::make_shared<SourceContext>(fd.get(),generateSourceFile,*
g_outputList);
9005 auto processFile = [ctx]()
9007 if (ctx->generateSourceFile)
9009 msg(
"Generating code for file {}...\n",ctx->fd->docName());
9013 msg(
"Parsing code for file {}...\n",ctx->fd->docName());
9016 ctx->fd->getAllIncludeFilesRecursively(filesInSameTu);
9017 if (ctx->generateSourceFile)
9019 ctx->fd->writeSourceHeader(ctx->ol);
9020 ctx->fd->writeSourceBody(ctx->ol,
nullptr);
9021 ctx->fd->writeSourceFooter(ctx->ol);
9026 ctx->fd->parseSource(
nullptr);
9030 results.emplace_back(threadPool.
queue(processFile));
9033 for (
auto &f : results)
9042 for (
const auto &fd : *fn)
9062 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
9068 : fd(fd_), ol(ol_) {}
9073 std::vector< std::future< std::shared_ptr<DocContext> > > results;
9076 for (
const auto &fd : *fn)
9078 bool doc = fd->isLinkableInProject();
9081 auto ctx = std::make_shared<DocContext>(fd.get(),*
g_outputList);
9082 auto processFile = [ctx]() {
9083 msg(
"Generating docs for file {}...\n",ctx->fd->docName());
9084 ctx->fd->writeDocumentation(ctx->ol);
9087 results.emplace_back(threadPool.
queue(processFile));
9091 for (
auto &f : results)
9100 for (
const auto &fd : *fn)
9102 bool doc = fd->isLinkableInProject();
9105 msg(
"Generating docs for file {}...\n",fd->docName());
9124 const_cast<FileDef*
>(fd)->addSourceRef(cd->getStartDefLine(),cd.get(),
nullptr);
9133 const_cast<FileDef*
>(fd)->addSourceRef(cd->getStartDefLine(),cd.get(),
nullptr);
9142 const_cast<FileDef*
>(fd)->addSourceRef(nd->getStartDefLine(),nd.get(),
nullptr);
9149 for (
const auto &md : *mn)
9158 md->isLinkableInProject() &&
9164 const_cast<FileDef*
>(fd)->addSourceRef(md->getStartDefLine(),md->getOuterScope(),md.get());
9170 for (
const auto &md : *mn)
9180 md->isLinkableInProject() &&
9186 const_cast<FileDef*
>(fd)->addSourceRef(md->getStartDefLine(),md->getOuterScope(),md.get());
9203 for (
const auto &def : it->second)
9206 def.fileName,def.lineNr,def.columnNr,
9207 "#define",def.name,def.args,
DString(),
9208 Protection::Public,Specifier::Normal,
false,Relationship::Member,MemberType::Define,
9212 if (!def.args.empty())
9216 mmd->setInitializer(def.definition);
9217 mmd->setFileDef(def.fileDef);
9218 mmd->setDefinition(
"#define "+def.name);
9223 const MemberList *defMl = def.fileDef->getMemberList(MemberListType::DocDefineMembers());
9232 def.fileDef->insertMember(md.get());
9234 AUTO_TRACE_ADD(
"adding macro {} with definition {}",def.name,def.definition);
9268 for (
const auto &fd : *fn)
9270 fd->sortMemberLists();
9277 gd->sortMemberLists();
9294 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
9298 std::vector < std::future< void > > results;
9302 for (
const auto &def : symList)
9305 if (dm && !
isSymbolHidden(def) && !def->isArtificial() && def->isLinkableInProject())
9307 auto processTooltip = [dm]() {
9310 results.emplace_back(threadPool.
queue(processTooltip));
9315 for (
auto &f : results)
9324 for (
const auto &def : symList)
9327 if (dm && !
isSymbolHidden(def) && !def->isArtificial() && def->isLinkableInProject())
9374 for (
const auto &fd : *fn)
9396 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
9402 : cd(cd_), ol(ol_) {}
9407 std::vector< std::future< std::shared_ptr<DocContext> > > results;
9408 for (
const auto &cd : classList)
9411 if (cd->getOuterScope()==
nullptr ||
9415 auto ctx = std::make_shared<DocContext>(cd,*
g_outputList);
9416 auto processFile = [ctx]()
9418 msg(
"Generating docs for compound {}...\n",ctx->cd->displayName());
9422 if (!ctx->cd->isHidden() && !ctx->cd->isEmbeddedInOuterScope() &&
9423 ctx->cd->isLinkableInProject() && !ctx->cd->isImplicitTemplateInstance())
9425 ctx->cd->writeDocumentation(ctx->ol);
9426 ctx->cd->writeMemberList(ctx->ol);
9430 ctx->cd->writeDocumentationForInnerClasses(ctx->ol);
9433 results.emplace_back(threadPool.
queue(processFile));
9436 for (
auto &f : results)
9443 for (
const auto &cd : classList)
9447 if (cd->getOuterScope()==
nullptr ||
9453 if ( !cd->isHidden() && !cd->isEmbeddedInOuterScope() &&
9454 cd->isLinkableInProject() && !cd->isImplicitTemplateInstance())
9456 msg(
"Generating docs for compound {}...\n",cd->displayName());
9471 for (
const auto &innerCdi : cd->
getClasses())
9476 AUTO_TRACE(
"innerCd={} isLinkable={} isImplicitTemplateInstance={} protectLevelVisible={} embeddedInOuterScope={}",
9485 list.push_back(innerCd);
9493 std::vector<ClassDefMutable*> classList;
9542 for (
const auto &imd : *mn)
9578 for (
const auto &fd : *fn)
9580 fd->combineUsingRelations();
9612 for (
const auto &fd : *fn)
9614 fd->addMembersToMemberGroup();
9629 gd->addMembersToMemberGroup();
9650 for (
const auto &fd : *fn)
9652 fd->distributeMemberGroupDocumentation();
9667 gd->distributeMemberGroupDocumentation();
9697 for (
const auto &fd : *fn)
9699 fd->findSectionsInDocumentation();
9714 gd->findSectionsInDocumentation();
9719 pd->findSectionsInDocumentation();
9724 dd->findSectionsInDocumentation();
9747 for (
const auto &ifmd : *fn)
9761 for (
const auto &imd : *nm)
9792 for (
const auto &imd : *nm)
9812 return fd->absFilePath() == root->
fileName;
9857 Protection::Public,Specifier::Normal,
false,Relationship::Member,MemberType::Define,
9860 mmd->setTagInfo(root->
tagInfo());
9861 mmd->setLanguage(root->
lang);
9873 for (
const auto &md : *mn)
9875 if (md->memberType()==MemberType::Define) count++;
9879 for (
const auto &imd : *mn)
9882 if (md && md->
memberType()==MemberType::Define)
9897 for (
const auto &imd : *mn)
9900 if (md && md->
memberType()==MemberType::Define)
9924 warn(root->
fileName,root->
startLine,
"found documented #define {} but ignoring it because ENABLE_PREPROCESSING is NO.", root->
name);
9938 normalizedName =
substitute(normalizedName,
"\\",
"/");
9941 if (root->
docFile==normalizedName)
9945 normalizedName=normalizedName.
left(lastSlashPos);
9948 if (normalizedName.
at(normalizedName.
length()-1)!=
'/')
9950 normalizedName+=
'/';
9952 DirDef *matchingDir=
nullptr;
9956 if (dir->name().right(normalizedName.
length())==normalizedName)
9961 "\\dir command matches multiple directories.\n"
9962 " Applying the command for directory {}\n"
9963 " Ignoring the command for directory {}",
9964 matchingDir->
name(),dir->name()
9969 matchingDir=dir.get();
9986 warn(root->
fileName,root->
startLine,
"No matching directory found for command \\dir {}",normalizedName);
9995 if (root->
section.isRequirementDoc())
10007 if (root->
section.isPageDoc())
10014 else if (root->
section.isMainpageDoc())
10034 if (root->
section.isMainpageDoc())
10067 else if (si->
lineNr() != -1)
10069 warn(root->
fileName,root->
startLine,
"multiple use of section label '{}' for main page, (first occurrence: {}, line {})",
10074 warn(root->
fileName,root->
startLine,
"multiple use of section label '{}' for main page, (first occurrence: {})",
10091 else if (root->
tagInfo()==
nullptr)
10094 "found more than one \\mainpage comment block! (first occurrence: {}, line {}), Skipping current block!",
10104 if (root->
section.isMainpageDoc())
10128 term(
"page defined {} with label {} is a direct "
10129 "subpage of itself! Please remove this cyclic dependency.\n",
10153 term(
"page defined {} with label {} is a subpage "
10154 "of itself! Please remove this cyclic dependency.\n",
10155 warn_line(pd->docFile(),pd->docLine()),pd->name());
10180 DString label=
"_"+rl->listName();
10181 if (si->label().left(label.
length())==label)
10183 si->setFileName(rl->listName());
10184 si->setGenerated(
true);
10190 if (!si->generated())
10194 if (!si->fileName().empty() &&
10201 if (si->definition())
10208 gd = (
toMemberDef(si->definition()))->getGroupDef();
10238 if (!pd->getGroupDef() && !pd->isReference())
10240 msg(
"Generating docs for page {}...\n",pd->name());
10255 warn(root->
fileName,root->
startLine,
"Example {} was already documented. Ignoring documentation found here.",root->
name);
10283 indentStr.
fill(
' ',indent);
10285 indentStr.
empty()?
"":indentStr,
10290 for (
const auto &e : root->
children())
10308 si->label(),si->fileName(),si->title(),si->type().level(),si->ref());
10322 msg(
"Generating docs for example {}...\n",pd->name());
10324 if (lang != SrcLangExt::Unknown)
10328 intf->resetCodeParserState();
10330 DString n=pd->getOutputFileBase();
10337 if (pd->showLineNo())
10339 lineNoOptStr=
"{lineno}";
10345 (pd->briefDescription().empty()?
"":pd->briefDescription()+
"\n\n")+
10346 pd->documentation()+
"\n\n\\include"+lineNoOptStr+
" "+pd->name(),
10348 .setIndexWords(
true)
10349 .setExample(pd->name()));
10362 if (!gd->isReference())
10374 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10380 : cdm(cdm_), ol(ol_) {}
10385 std::vector< std::future< std::shared_ptr<DocContext> > > results;
10387 for (
const auto &cd : classList)
10392 auto ctx = std::make_shared<DocContext>(cdm,*
g_outputList);
10393 auto processFile = [ctx]()
10395 if ( ( ctx->cdm->isLinkableInProject() &&
10396 !ctx->cdm->isImplicitTemplateInstance()
10399 && !ctx->cdm->isHidden() && !ctx->cdm->isEmbeddedInOuterScope()
10402 msg(
"Generating docs for compound {}...\n",ctx->cdm->displayName());
10403 ctx->cdm->writeDocumentation(ctx->ol);
10404 ctx->cdm->writeMemberList(ctx->ol);
10406 ctx->cdm->writeDocumentationForInnerClasses(ctx->ol);
10409 results.emplace_back(threadPool.
queue(processFile));
10413 for (
auto &f : results)
10415 auto ctx = f.get();
10421 for (
const auto &cd : classList)
10426 if ( ( cd->isLinkableInProject() &&
10427 !cd->isImplicitTemplateInstance()
10430 && !cd->isHidden() && !cd->isEmbeddedInOuterScope()
10433 msg(
"Generating docs for compound {}...\n",cd->displayName());
10447 for (
const auto &cd : conceptList)
10452 msg(
"Generating docs for concept {}...\n",cd->name());
10467 if (nd->isLinkableInProject())
10472 msg(
"Generating docs for namespace {}\n",nd->displayName());
10510 DString cmd=qhgLocation+
" -v 2>&1";
10515 err(
"could not execute {}\n",qhgLocation);
10519 const size_t bufSize = 1024;
10520 char inBuf[bufSize+1];
10521 size_t numRead=fread(inBuf,1,bufSize,f);
10522 inBuf[numRead] =
'\0';
10527 static const reg::Ex versionReg(R
"(Qt (\d+)\.(\d+)\.(\d+))");
10529 std::string s = inBuf;
10536 if (qtVersion>0 && (qtVersion<60000 || qtVersion >= 60205))
10545 err(
"could not execute {}\n",qhgLocation);
10549 std::string output;
10550 while ((numRead=fread(inBuf,1,bufSize,f))>0)
10552 inBuf[numRead] =
'\0';
10575 if (!dotPath.
empty())
10584 warn_uncond(
"the dot tool could not be found as '{}'\n",dotPath);
10590 dotPath = fi.
dirPath() +
"/" + dotPath;
10594 size_t l=dotPath.
length();
10595 for (
size_t i=0;i<l;i++)
if (dotPath.
at(i)==
'/') dotPath.
at(i)=
'\\';
10614 bool updateOnly=
false)
10618 bool writeToStdout=configFile==
"-";
10623 if (!writeToStdout)
10627 msg(
"\n\nConfiguration file '{}' created.\n\n",configFile);
10628 msg(
"Now edit the configuration file and enter\n\n");
10629 if (configFile!=
"Doxyfile" && configFile!=
"doxyfile")
10630 msg(
" doxygen {}\n\n",configFile);
10632 msg(
" doxygen\n\n");
10633 msg(
"to generate the documentation for your project\n\n");
10637 msg(
"\n\nConfiguration file '{}' updated.\n\n",configFile);
10643 term(
"Cannot open file {} for writing\n",configFile);
10658 term(
"Cannot open stdout for writing\n");
10673 if (fileName.
empty() || destName.
empty())
return;
10678 fileName = tagLine;
10684 err(
"Tag file '{}' does not exist or is not a file. Skipping it...\n",fileName);
10692 if (!destName.
empty())
10695 msg(
"Reading tag file '{}', location '{}'...\n",fileName,destName);
10699 msg(
"Reading tag file '{}'...\n",fileName);
10709 for (
const auto &sheet : latexExtraStyleSheet)
10711 std::string fileName = sheet;
10712 if (!fileName.empty())
10717 err(
"Style sheet '{}' specified by LATEX_EXTRA_STYLESHEET does not exist!\n",fileName);
10719 else if (fi.
isDir())
10721 err(
"Style sheet '{}' specified by LATEX_EXTRA_STYLESHEET is a directory, it has to be a file!\n", fileName);
10740 if (!htmlStyleSheet.
empty())
10747 err(
"Style sheet '{}' specified by HTML_STYLESHEET does not exist!\n",htmlStyleSheet);
10750 else if (fi.
isDir())
10752 err(
"Style sheet '{}' specified by HTML_STYLESHEET is a directory, it has to be a file!\n",htmlStyleSheet);
10758 copyFile(htmlStyleSheet,destFileName);
10763 for (
const auto &sheet : htmlExtraStyleSheet)
10771 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET does not exist!\n",fileName);
10775 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET is already a built-in stylesheet. Please use a different name\n",fi.
fileName());
10777 else if (fi.
isDir())
10779 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET is a directory, it has to be a file!\n",fileName);
10793 if (!projectLogo.
empty())
10798 err(
"Project logo '{}' specified by PROJECT_LOGO does not exist!\n",projectLogo);
10801 else if (fi.
isDir())
10803 err(
"Project logo '{}' specified by PROJECT_LOGO is a directory, it has to be a file!\n",projectLogo);
10809 copyFile(projectLogo,destFileName);
10818 if (!projectIcon.
empty())
10823 err(
"Project icon '{}' specified by PROJECT_ICON does not exist!\n",projectIcon);
10826 else if (fi.
isDir())
10828 err(
"Project icon '{}' specified by PROJECT_ICON is a directory, it has to be a file!\n",projectIcon);
10834 copyFile(projectIcon,destFileName);
10842 for (
const auto &fileName : files)
10844 if (!fileName.empty())
10849 err(
"Extra file '{}' specified in {} does not exist!\n", fileName,filesOption);
10851 else if (fi.
isDir())
10853 err(
"Extra file '{}' specified in {} is a directory, it has to be a file!\n", fileName,filesOption);
10873 FileEntry(
const DString &p,
FileDef *fd) : path(p), fileDef(fd) {}
10879 std::vector<FileEntry> fileEntries;
10880 for (
const auto &fd : *fn)
10882 if (!fd->isReference())
10884 fileEntries.emplace_back(fd->getPath(),fd.get());
10888 size_t size = fileEntries.size();
10892 FileDef *fd = fileEntries[0].fileDef;
10898 std::stable_sort(fileEntries.begin(),
10900 [](
const FileEntry &fe1,
const FileEntry &fe2)
10901 { return dstricmp_sort(fe1.path,fe2.path)<0; }
10906 const FileEntry &first = fileEntries[0];
10907 const FileEntry &last = fileEntries[size-1];
10908 int first_path_size =
static_cast<int>(first.path.size())-1;
10909 int last_path_size =
static_cast<int>(last.path.size())-1;
10912 for (i=0;i<first_path_size && i<last_path_size;i++)
10914 if (first.path[i]==
'/') j=i;
10915 if (first.path[i]!=last.path[i])
break;
10917 if (i==first_path_size && i<last_path_size && last.path[i]==
'/')
10922 else if (i==last_path_size && i<first_path_size && first.path[i]==
'/')
10929 for (
auto &fileEntry : fileEntries)
10931 DString prefix = fileEntry.path.right(fileEntry.path.length()-j-1);
10932 fileEntry.fileDef->setName(
prefix+fn->fileName());
10934 fileEntry.fileDef->setDiskName(
prefix+fn->fileName());
10948 size_t sep = fileName.
rfind(
'/');
10949 size_t ei = fileName.
rfind(
'.');
10952 extension=fileName.
mid(ei);
10956 extension =
".no_extension";
10971 extension=fileName.
mid(ei);
10975 extension =
".no_extension";
10979 std::string preBuf;
10986 for (
const auto &s : includePath)
10992 msg(
"Preprocessing {}...\n",fn);
10999 msg(
"Reading {}...\n",fn);
11004 std::string convBuf;
11005 convBuf.reserve(preBuf.size()+1024);
11010 std::shared_ptr<Entry> fileRoot = std::make_shared<Entry>();
11014 if (newTU) clangParser->
parse();
11017 parser.
parseInput(fileName,convBuf.
data(),fileRoot,clangParser);
11018 fileRoot->setFileDef(fd);
11035 filesToProcess.insert(s);
11038 std::mutex processedFilesLock;
11040 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
11041 msg(
"Processing input using {} threads.\n",numThreads);
11043 using FutureType = std::vector< std::shared_ptr<Entry> >;
11044 std::vector< std::future< FutureType > > results;
11047 bool ambig =
false;
11054 auto processFile = [qs,&filesToProcess,&processedFilesLock,&processedFiles]() {
11055 bool ambig_l =
false;
11056 std::vector< std::shared_ptr<Entry> > roots;
11060 auto fileRoot {
parseFile(*parser.get(),fd_l,qs,clangParser.get(),
true) };
11061 roots.push_back(fileRoot);
11065 for (
auto incFile : clangParser->filesInSameTU())
11068 if (filesToProcess.find(incFile)!=filesToProcess.end())
11070 bool needsToBeProcessed =
false;
11072 std::lock_guard<std::mutex> lock(processedFilesLock);
11073 needsToBeProcessed = processedFiles.find(incFile)==processedFiles.end();
11074 if (needsToBeProcessed) processedFiles.insert(incFile);
11076 if (qincFile!=qs && needsToBeProcessed)
11082 fileRoot =
parseFile(*parser.get(),ifd,qincFile,clangParser.get(),
false);
11083 roots.push_back(fileRoot);
11091 results.emplace_back(threadPool.
queue(processFile));
11095 for (
auto &f : results)
11100 root->moveToSubEntryAndKeep(e);
11107 if (processedFiles.find(s)==processedFiles.end())
11110 auto processFile = [s]() {
11111 bool ambig =
false;
11113 std::vector< std::shared_ptr<Entry> > roots;
11120 auto fileRoot =
parseFile(*parser.get(),fd,qs,clangParser.get(),
true);
11121 roots.push_back(fileRoot);
11125 auto fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
11126 roots.push_back(fileRoot);
11130 results.emplace_back(threadPool.
queue(processFile));
11134 for (
auto &f : results)
11139 root->moveToSubEntryAndKeep(e);
11146 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
11147 msg(
"Processing input using {} threads.\n",numThreads);
11149 using FutureType = std::shared_ptr<Entry>;
11150 std::vector< std::future< FutureType > > results;
11154 auto processFile = [s]() {
11155 bool ambig =
false;
11159 auto fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
11163 results.emplace_back(threadPool.
queue(processFile));
11166 for (
auto &f : results)
11168 root->moveToSubEntryAndKeep(f.get());
11186 filesToProcess.insert(s);
11192 bool ambig =
false;
11200 auto fileRoot =
parseFile(*parser.get(),fd,qs,clangParser.get(),
true);
11201 root->moveToSubEntryAndKeep(fileRoot);
11202 processedFiles.insert(s);
11206 for (
auto incFile : clangParser->filesInSameTU())
11209 if (filesToProcess.find(incFile)!=filesToProcess.end() &&
11210 processedFiles.find(incFile)==processedFiles.end())
11216 fileRoot =
parseFile(*parser.get(),ifd,incFile,clangParser.get(),
false);
11217 root->moveToSubEntryAndKeep(fileRoot);
11218 processedFiles.insert(incFile);
11227 if (processedFiles.find(s)==processedFiles.end())
11229 bool ambig =
false;
11236 auto fileRoot =
parseFile(*parser.get(),fd,qs,clangParser.get(),
true);
11237 root->moveToSubEntryAndKeep(fileRoot);
11242 std::shared_ptr<Entry> fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
11243 root->moveToSubEntryAndKeep(fileRoot);
11245 processedFiles.insert(s);
11254 bool ambig =
false;
11259 std::shared_ptr<Entry> fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
11260 root->moveToSubEntryAndKeep(std::move(fileRoot));
11280 sepPos = result.
find(
'/',2);
11282 sepPos = result.
find(
'/',sepPos+1);
11284 sepPos = result.
find(
'/',sepPos+1);
11287 if (nonSymlinks.find(
prefix.str())==nonSymlinks.end())
11304 target+=result.
mid(sepPos);
11307 if (known.find(result.
str())!=known.end())
return std::string();
11308 known.insert(result.
str());
11321 nonSymlinks.insert(
prefix.str());
11346 bool errorIfNotExist,
11353 if (paths && !dirName.empty())
11355 paths->insert(dirName);
11361 if (dirName.empty())
11376 msg(
"Searching for files in directory {}\n", fi->
absFilePath());
11387 for (
const auto &dirEntry : dir.
iterator())
11389 entries.push_back(dirEntry.path());
11391 std::sort(entries.begin(),entries.end());
11393 for (
const auto &entryPath : entries)
11396 auto checkPatterns = [&]() ->
bool
11398 return (patList==
nullptr || cfi.
match(*patList,caseSenseNames)) &&
11399 (exclPatList==
nullptr || !cfi.
match(*exclPatList,caseSenseNames)) &&
11400 (killSet==
nullptr || killSet->find(cfi.
absFilePath())==killSet->end());
11403 if (exclSet==
nullptr || exclSet->find(cfi.
absFilePath())==exclSet->end())
11411 if (errorIfNotExist && checkPatterns())
11416 else if (cfi.
isFile() && checkPatterns())
11419 std::string path=cfi.
dirPath()+
"/";
11420 std::string fullName=path+name;
11427 fn = fnMap->
add(name);
11428 fn->push_back(std::move(fd));
11431 dirResultList.push_back(fullName);
11432 if (resultSet) resultSet->insert(fullName);
11433 if (killSet) killSet->insert(fullName);
11435 else if (recursive &&
11437 (exclPatList==
nullptr || !cfi.
match(*exclPatList,caseSenseNames)) &&
11442 patList,exclPatList,&dirResultList,resultSet,errorIfNotExist,
11443 recursive,killSet,paths);
11447 if (resultList && !dirResultList.empty())
11450 std::stable_sort(dirResultList.begin(),
11451 dirResultList.end(),
11452 [](
const auto &f1,
const auto &f2) { return dstricmp_sort(f1.c_str(),f2.c_str())<0; });
11455 resultList->insert(resultList->end(), dirResultList.begin(), dirResultList.end());
11472 bool errorIfNotExist,
11479 if (s.
empty())
return;
11486 if (exclSet==
nullptr || exclSet->find(fi.
absFilePath())==exclSet->end())
11493 if (errorIfNotExist)
11495 warn_uncond(
"source '{}' is not a readable file or directory... skipping.\n",s);
11500 std::string dirPath = fi.
dirPath(
true);
11502 if (paths && !dirPath.empty())
11504 paths->insert(dirPath);
11507 if (killSet==
nullptr || killSet->find(filePath)==killSet->end())
11516 fn->push_back(std::move(fd));
11519 if (resultList || resultSet)
11521 if (resultList) resultList->push_back(filePath);
11522 if (resultSet) resultSet->insert(filePath);
11528 else if (fi.
isDir())
11530 readDir(&fi,fnMap,exclSet,patList,
11531 exclPatList,resultList,resultSet,errorIfNotExist,
11532 recursive,killSet,paths);
11546 anchor=
":"+md->
anchor();
11555 t <<
"REPLACE INTO symbols (symbol_id,scope_id,name,file,line) VALUES('"
11556 << fn+anchor <<
"','"
11558 << d->
name() <<
"','"
11572 for (
const auto &def : symList)
11584 msg(
"Developer parameters:\n");
11585 msg(
" -m dump symbol map\n");
11586 msg(
" -b making messages output unbuffered\n");
11587 msg(
" -c <file> process input file as a comment block and produce HTML output\n");
11589 msg(
" -t [<file|stdout|stderr>] trace debug info to file, stdout, or stderr (default file stdout)\n");
11590 msg(
" -t_time [<file|stdout|stderr>] trace debug info to file, stdout, or stderr (default file stdout),\n"
11591 " and include time and thread information\n");
11593 msg(
" -d <level> enable a debug level, such as (multiple invocations of -d are possible):\n");
11604 DString versionString = getFullVersion();
11605 msg(
"{}\n",versionString);
11609 if (!extVers.
empty()) extVers+=
", ";
11610 extVers +=
"sqlite3 ";
11611 extVers += sqlite3_libversion();
11613 if (!extVers.
empty()) extVers+=
", ";
11614 extVers +=
"clang support ";
11615 extVers += CLANG_VERSION_STRING;
11617 if (!extVers.
empty())
11621 extVers = extVers.
replace(lastComma,1,
" and");
11623 msg(
" with {}.\n",extVers);
11634 msg(
"Doxygen version {0}\nCopyright Dimitri van Heesch 1997-2025\n\n"
11635 "You can use Doxygen in a number of ways:\n\n"
11636 "1) Use Doxygen to generate a template configuration file*:\n"
11637 " {1} [-s] -g [configName]\n\n"
11638 "2) Use Doxygen to update an old configuration file*:\n"
11639 " {1} [-s] -u [configName]\n\n"
11640 "3) Use Doxygen to generate documentation using an existing "
11641 "configuration file*:\n"
11642 " {1} [configName]\n\n"
11643 "4) Use Doxygen to generate a template file controlling the layout of the\n"
11644 " generated documentation:\n"
11645 " {1} -l [layoutFileName]\n\n"
11646 " In case layoutFileName is omitted DoxygenLayout.xml will be used as filename.\n"
11647 " If - is used for layoutFileName Doxygen will write to standard output.\n\n"
11648 "5) Use Doxygen to generate a template style sheet file for RTF, HTML or Latex.\n"
11649 " RTF: {1} -w rtf styleSheetFile\n"
11650 " HTML: {1} -w html headerFile footerFile styleSheetFile [configFile]\n"
11651 " LaTeX: {1} -w latex headerFile footerFile styleSheetFile [configFile]\n\n"
11652 "6) Use Doxygen to generate a rtf extensions file\n"
11653 " {1} -e rtf extensionsFile\n\n"
11654 " If - is used for extensionsFile Doxygen will write to standard output.\n\n"
11655 "7) Use Doxygen to compare the used configuration file with the template configuration file\n"
11656 " {1} -x [configFile]\n\n"
11657 " Use Doxygen to compare the used configuration file with the template configuration file\n"
11658 " without replacing the environment variables or CMake type replacement variables\n"
11659 " {1} -x_noenv [configFile]\n\n"
11660 "8) Use Doxygen to show a list of built-in emojis.\n"
11661 " {1} -f emoji outputFileName\n\n"
11662 " If - is used for outputFileName Doxygen will write to standard output.\n\n"
11663 "*) If -s is specified the comments of the configuration items in the config file will be omitted.\n"
11664 " If configName is omitted 'Doxyfile' will be used as a default.\n"
11665 " If - is used for configFile Doxygen will write / read the configuration to /from standard output / input.\n\n"
11666 "If -q is used for a Doxygen documentation run, Doxygen will see this as if QUIET=YES has been set.\n\n"
11667 "-v print version string, -V print extended version information\n"
11668 "-h,-? prints usage help information\n"
11669 "{1} -d prints additional usage flags for debugging purposes\n",versionString,name);
11676static const char *
getArg(
int argc,
char **argv,
int &optInd)
11679 if (
dstrlen(&argv[optInd][2])>0)
11680 s=&argv[optInd][2];
11681 else if (optInd+1<argc && argv[optInd+1][0]!=
'-')
11700 return []() {
return std::make_unique<T>(); };
11708 std::setlocale(LC_ALL,
"");
11709 std::setlocale(LC_CTYPE,
"C");
11710 std::setlocale(LC_NUMERIC,
"C");
11808 DString versionString = getFullVersion();
11811 auto writeFile = [](
const char *fileName,std::function<void(
TextStream&)> func) ->
bool
11831 bool genConfig=
false;
11832 bool shortList=
false;
11833 bool traceTiming=
false;
11835 bool updateConfig=
false;
11836 bool quiet =
false;
11837 while (optInd<argc && argv[optInd][0]==
'-' &&
11838 (isalpha(argv[optInd][1]) || argv[optInd][1]==
'?' ||
11839 argv[optInd][1]==
'-')
11842 switch(argv[optInd][1])
11852 if (optInd+1>=argc)
11854 layoutName=
"DoxygenLayout.xml";
11858 layoutName=argv[optInd+1];
11866 if (optInd+1>=argc)
11868 msg(
"option \"-c\" is missing the file name to read\n");
11884 if (debugLabel.
empty())
11893 msg(
"option \"-d\" has unknown debug specifier: \"{}\".\n",debugLabel);
11903 if (!strcmp(argv[optInd]+1,
"t_time"))
11905 traceTiming =
true;
11907 else if (!strcmp(argv[optInd]+1,
"t"))
11909 traceTiming =
false;
11913 err(
"option should be \"-t\" or \"-t_time\", found: \"{}\".\n",argv[optInd]);
11917 if (optInd+1>=argc || argv[optInd+1][0] ==
'-')
11919 traceName=
"stdout";
11923 traceName=argv[optInd+1];
11927 err(
"support for option \"-t\" has not been compiled in (use a debug build or a release build with tracing enabled).\n");
11938 err(
"option should be \"-x\" or \"-x_noenv\", found: \"{}\".\n",argv[optInd]);
11952 if (formatName.
empty())
11954 err(
"option \"-e\" is missing format specifier rtf.\n");
11960 if (optInd+1>=argc)
11962 err(
"option \"-e rtf\" is missing an extensions file name\n");
11970 err(
"option \"-e\" has invalid format specifier.\n");
11978 if (listName.
empty())
11980 err(
"option \"-f\" is missing list specifier.\n");
11986 if (optInd+1>=argc)
11988 err(
"option \"-f emoji\" is missing an output file name\n");
11996 err(
"option \"-f\" has invalid list specifier.\n");
12004 if (formatName.
empty())
12006 err(
"option \"-w\" is missing format specifier rtf, html or latex\n");
12012 if (optInd+1>=argc)
12014 err(
"option \"-w rtf\" is missing a style sheet file name\n");
12020 err(
"error opening RTF style sheet file {}!\n",argv[optInd+1]);
12030 if (optInd+4<argc ||
FileInfo(
"Doxyfile").exists() ||
FileInfo(
"doxyfile").exists())
12036 err(
"error opening or reading configuration file {}!\n",argv[optInd+4]);
12041 if (optInd+3>=argc)
12043 err(
"option \"-w html\" does not have enough arguments\n");
12060 if (optInd+4<argc ||
FileInfo(
"Doxyfile").exists() ||
FileInfo(
"doxyfile").exists())
12065 err(
"error opening or reading configuration file {}!\n",argv[optInd+4]);
12070 if (optInd+3>=argc)
12072 err(
"option \"-w latex\" does not have enough arguments\n");
12088 err(
"Illegal format specifier \"{}\": should be one of rtf, html or latex\n",formatName);
12108 if (
dstrcmp(&argv[optInd][2],
"help")==0)
12110 usage(argv[0],versionString);
12113 else if (
dstrcmp(&argv[optInd][2],
"version")==0)
12119 else if ((
dstrcmp(&argv[optInd][2],
"Version")==0) ||
12120 (
dstrcmp(&argv[optInd][2],
"VERSION")==0))
12128 err(
"Unknown option \"-{}\"\n",&argv[optInd][1]);
12129 usage(argv[0],versionString);
12134 setvbuf(stdout,
nullptr,_IONBF,0);
12141 usage(argv[0],versionString);
12145 err(
"Unknown option \"-{:c}\"\n",argv[optInd][1]);
12146 usage(argv[0],versionString);
12157 TRACE(
"Doxygen version used: {}",getFullVersion());
12160 FileInfo configFileInfo1(
"Doxyfile"),configFileInfo2(
"doxyfile");
12163 if (configFileInfo1.exists())
12165 configName=
"Doxyfile";
12167 else if (configFileInfo2.
exists())
12169 configName=
"doxyfile";
12171 else if (genConfig)
12173 configName=
"Doxyfile";
12177 err(
"Doxyfile not found and no input file specified!\n");
12178 usage(argv[0],versionString);
12185 if (fi.
exists() ||
dstrcmp(argv[optInd],
"-")==0 || genConfig)
12187 configName=argv[optInd];
12191 err(
"configuration file {} not found!\n",argv[optInd]);
12192 usage(argv[0],versionString);
12206 err(
"could not open or read configuration file {}!\n",configName);
12278 for (
const auto &mapping : extMaps)
12296 err(
"Failed to map file extension '{}' to unsupported language '{}'.\n"
12297 "Check the EXTENSION_MAPPING setting in the config file.\n",
12302 msg(
"Adding custom extension mapping: '{}' will be treated as language '{}'\n",
12311 if (cd==
reinterpret_cast<void *
>(-1))
12313 term(
"unsupported character conversion: '{}'->'UTF-8': {}\n"
12314 "Check the 'INPUT_ENCODING' setting in the config file!\n",
12324 for (
const auto &mapping : fileEncod)
12340 if (cd==
reinterpret_cast<void *
>(-1))
12342 term(
"unsupported character conversion: '{}'->'UTF-8': {}\n"
12343 "Check the 'INPUT_FILE_ENCODING' setting in the config file!\n",
12344 encoding,strerror(errno));
12357 for (
const auto &s : expandAsDefinedList)
12375 signal(SIGINT,SIG_DFL);
12377 msg(
"Cleaning up...\n");
12392 if (generateTagFile.
empty())
return;
12397 err(
"cannot open tag file {} for writing\n", generateTagFile);
12401 tagFile <<
"<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>\n";
12402 tagFile <<
"<tagfile doxygen_version=\"" << getDoxygenVersion() <<
"\"";
12403 std::string gitVersion = getGitVersion();
12404 if (!gitVersion.empty())
12406 tagFile <<
" doxygen_gitid=\"" << gitVersion <<
"\"";
12413 for (
const auto &fd : *fn)
12415 if (fd->isLinkableInProject()) fd->writeTagFile(tagFile);
12448 if (gd->isLinkableInProject()) gd->writeTagFile(tagFile);
12453 if (mod->isLinkableInProject()) mod->writeTagFile(tagFile);
12458 if (pd->isLinkableInProject()) pd->writeTagFile(tagFile);
12465 if (dd->isLinkableInProject()) dd->writeTagFile(tagFile);
12469 tagFile <<
"</tagfile>\n";
12477 msg(
"Exiting...\n");
12486 const DString &formatDirName,
12487 const char *defaultDirName)
12489 DString result = formatDirName;
12490 if (result.
empty())
12492 result = baseDirName + defaultDirName;
12494 else if (formatDirName[0]!=
'/' && (formatDirName.
length()==1 || formatDirName[1]!=
':'))
12496 result.
prepend(baseDirName+
"/");
12498 Dir formatDir(result.
str());
12501 term(
"Could not create output directory {}\n", result);
12515 g_s.
begin(
"Searching for include files...\n");
12518 for (
const auto &s : includePathList)
12536 g_s.
begin(
"Searching for example files...\n");
12539 for (
const auto &s : examplePathList)
12555 g_s.
begin(
"Searching for images...\n");
12558 for (
const auto &s : imagePathList)
12573 g_s.
begin(
"Searching for dot files...\n");
12576 for (
const auto &s : dotFileList)
12591 g_s.
begin(
"Searching for msc files...\n");
12594 for (
const auto &s : mscFileList)
12609 g_s.
begin(
"Searching for dia files...\n");
12612 for (
const auto &s : diaFileList)
12627 g_s.
begin(
"Searching for plantuml files...\n");
12630 for (
const auto &s : plantUmlFileList)
12645 g_s.
begin(
"Searching for mermaid files...\n");
12648 for (
const auto &s : mermaidFileList)
12663 g_s.
begin(
"Searching for files to exclude\n");
12665 for (
const auto &s : excludeList)
12684 g_s.
begin(
"Searching INPUT for files to process...\n");
12688 for (
const auto &s : inputList)
12691 size_t l = path.
length();
12695 if (path.
at(l-1)==
'\\' || path.
at(l-1)==
'/') path=path.
left(l-1);
12716 if (fileName->size()>1)
12718 std::stable_sort(fileName->begin(),fileName->end(),[](
const auto &f1,
const auto &f2)
12720 return dstricmp_sort(f1->absFilePath(),f2->absFilePath())<0;
12726 [](
const auto &f1,
const auto &f2)
12728 return dstricmp_sort(f1->front()->absFilePath(),f2->front()->absFilePath())<0;
12732 warn_uncond(
"No files to be processed, please check your settings, in particular INPUT, FILE_PATTERNS, and RECURSIVE\n");
12743 if (mdfileAsMainPage.
empty())
return;
12747 warn_uncond(
"Specified markdown mainpage '{}' does not exist\n",mdfileAsMainPage);
12750 bool ambig =
false;
12753 warn_uncond(
"Specified markdown mainpage '{}' has not been defined as input file\n",mdfileAsMainPage);
12772 DString versionString = getFullVersion();
12773 msg(
"Doxygen version used: {}\n",versionString);
12783 if (outputDirectory.
empty())
12789 Dir dir(outputDirectory.
str());
12793 if (!dir.
mkdir(outputDirectory.
str()))
12795 term(
"tag OUTPUT_DIRECTORY: Output directory '{}' does not "
12796 "exist and cannot be created\n",outputDirectory);
12800 msg(
"Notice: Output directory '{}' does not exist. "
12801 "I have created it for you.\n", outputDirectory);
12849 bool generateSitemap = !sitemapUrl.
empty();
12850 if (generateSitemap && !sitemapUrl.
endsWith(
"/"))
12857 bool generateEclipseHelp =
Config_getBool(GENERATE_ECLIPSEHELP);
12871 if (generateDocbook)
12911 if (curFontPath.
empty())
12915 if (!curFontPath.
empty())
12918 newFontPath+=curFontPath;
12934 bool defaultLayoutUsed =
false;
12935 if (layoutFileName.
empty())
12938 defaultLayoutUsed =
true;
12940 AUTO_TRACE_ADD(
"defaultLayoutUsed={}, layoutFileName={}",defaultLayoutUsed,layoutFileName);
12945 msg(
"Parsing layout file {}...\n",layoutFileName);
12948 else if (!defaultLayoutUsed)
12950 warn_uncond(
"failed to open layout file '{}' for reading! Using default settings.\n",layoutFileName);
12960 if (generateHtml) exclPatterns.push_back(htmlOutput.
str());
12961 if (generateDocbook) exclPatterns.push_back(docbookOutput.
str());
12962 if (generateXml) exclPatterns.push_back(xmlOutput.
str());
12963 if (generateLatex) exclPatterns.push_back(latexOutput.
str());
12964 if (generateRtf) exclPatterns.push_back(rtfOutput.
str());
12965 if (generateMan) exclPatterns.push_back(manOutput.
str());
12985 if (generateDocbook)
12996 std::shared_ptr<Entry> root = std::make_shared<Entry>();
13000 msg(
"Reading and parsing tag files\n");
13002 for (
const auto &s : tagFileList)
13054 g_s.
begin(
"Building macro definition list...\n");
13058 g_s.
begin(
"Building group list...\n");
13063 g_s.
begin(
"Building directory list...\n");
13068 g_s.
begin(
"Building namespace list...\n");
13073 g_s.
begin(
"Building file list...\n");
13077 g_s.
begin(
"Building class list...\n");
13081 g_s.
begin(
"Building concept list...\n");
13089 g_s.
begin(
"Computing nesting relations for classes...\n");
13102 g_s.
begin(
"Associating documentation with classes...\n");
13106 g_s.
begin(
"Associating documentation with concepts...\n");
13111 g_s.
begin(
"Associating documentation with modules...\n");
13115 g_s.
begin(
"Building example list...\n");
13119 g_s.
begin(
"Searching for enumerations...\n");
13127 g_s.
begin(
"Searching for documented typedefs...\n");
13133 g_s.
begin(
"Searching for documented sequences...\n");
13137 g_s.
begin(
"Searching for documented dictionaries...\n");
13142 g_s.
begin(
"Searching for members imported via using declarations...\n");
13149 g_s.
begin(
"Searching for included using directives...\n");
13153 g_s.
begin(
"Searching for documented variables...\n");
13157 g_s.
begin(
"Building interface member list...\n");
13160 g_s.
begin(
"Building member list...\n");
13164 g_s.
begin(
"Searching for friends...\n");
13168 g_s.
begin(
"Searching for documented defines...\n");
13172 g_s.
begin(
"Computing class inheritance relations...\n");
13177 g_s.
begin(
"Computing class usage relations...\n");
13181 g_s.
begin(
"Flushing cached template relations that have become invalid...\n");
13185 g_s.
begin(
"Warn for undocumented namespaces...\n");
13189 g_s.
begin(
"Computing class relations...\n");
13200 g_s.
begin(
"Add enum values to enums...\n");
13205 g_s.
begin(
"Searching for member function documentation...\n");
13217 g_s.
begin(
"Creating members for template instances...\n");
13221 g_s.
begin(
"Searching for tag less structs...\n");
13225 g_s.
begin(
"Building page list...\n");
13229 g_s.
begin(
"Building requirements list...\n");
13233 g_s.
begin(
"Search for main page...\n");
13238 g_s.
begin(
"Computing page relations...\n");
13243 g_s.
begin(
"Determining the scope of groups...\n");
13247 g_s.
begin(
"Computing module relations...\n");
13249 mm.resolvePartitions();
13250 mm.resolveImports();
13251 mm.collectExportedSymbols();
13270 return i==0 ?
dstricmp_sort(c1->name(), c2->name())<0 : i<0;
13305 g_s.
begin(
"Determining which enums are documented\n");
13309 g_s.
begin(
"Computing member relations...\n");
13314 g_s.
begin(
"Building full member lists recursively...\n");
13318 g_s.
begin(
"Adding members to member groups.\n");
13324 g_s.
begin(
"Distributing member group documentation.\n");
13329 g_s.
begin(
"Computing member references...\n");
13335 g_s.
begin(
"Inheriting documentation...\n");
13343 g_s.
begin(
"Generating disk names...\n");
13347 g_s.
begin(
"Adding source references...\n");
13351 g_s.
begin(
"Adding xrefitems...\n");
13356 g_s.
begin(
"Adding requirements...\n");
13361 g_s.
begin(
"Sorting member lists...\n");
13365 g_s.
begin(
"Setting anonymous enum type...\n");
13369 g_s.
begin(
"Computing dependencies between directories...\n");
13373 g_s.
begin(
"Generating citations page...\n");
13377 g_s.
begin(
"Counting data structures...\n");
13381 g_s.
begin(
"Resolving user defined references...\n");
13385 g_s.
begin(
"Finding anchors and sections in the documentation...\n");
13389 g_s.
begin(
"Transferring function references...\n");
13393 g_s.
begin(
"Combining using relations...\n");
13398 g_s.
begin(
"Adding members to index pages...\n");
13403 g_s.
begin(
"Correcting members for VHDL...\n");
13407 g_s.
begin(
"Computing tooltip texts...\n");
13415 [](
const auto &g1,
const auto &g2)
13416 {
return g1->groupTitle() < g2->groupTitle(); });
13420 gd->sortSubGroups();
13464 if (generateDocbook)
13484 err(
"USE_HTAGS is YES but htags(1) failed. \n");
13486 err(
"htags(1) ended normally but failed to load the filemap. \n");
13493 g_s.
begin(
"Generating style sheet...\n");
13501 g_s.
begin(
"Generating search indices...\n");
13502 if (searchEngine && !serverBasedSearch && generateHtml)
13510 if (generateHtml && searchEngine)
13513 Dir searchDir(searchDirName.
str());
13514 if (!searchDir.
exists() && !searchDir.
mkdir(searchDirName.
str()))
13516 term(
"Could not create search results directory '{}' $PWD='{}'\n",
13520 if (!serverBasedSearch)
13542 if (generateDocbook)
13558 g_s.
begin(
"Generating images for formulas in HTML...\n");
13565 g_s.
begin(
"Generating images for formulas in RTF...\n");
13572 g_s.
begin(
"Generating images for formulas in Docbook...\n");
13577 g_s.
begin(
"Generating example documentation...\n");
13581 g_s.
begin(
"Generating file sources...\n");
13585 g_s.
begin(
"Counting members...\n");
13591 g_s.
begin(
"Generating file documentation...\n");
13595 g_s.
begin(
"Generating page documentation...\n");
13599 g_s.
begin(
"Generating group documentation...\n");
13603 g_s.
begin(
"Generating class documentation...\n");
13607 g_s.
begin(
"Generating concept documentation...\n");
13611 g_s.
begin(
"Generating module documentation...\n");
13615 g_s.
begin(
"Generating namespace documentation...\n");
13621 g_s.
begin(
"Generating graph info page...\n");
13626 g_s.
begin(
"Generating directory documentation...\n");
13635 g_s.
begin(
"finalizing index lists...\n");
13639 g_s.
begin(
"writing tag file...\n");
13645 g_s.
begin(
"Generating XML output...\n");
13653 g_s.
begin(
"Generating SQLITE3 output...\n");
13660 g_s.
begin(
"Generating AutoGen DEF output...\n");
13666 g_s.
begin(
"Generating Perl module output...\n");
13670 if (generateHtml && searchEngine && serverBasedSearch)
13672 g_s.
begin(
"Generating search index\n");
13682 if (searchDataFile.
empty())
13684 searchDataFile=
"searchdata.xml";
13697 g_s.
begin(
"Combining RTF output...\n");
13700 err(
"An error occurred during post-processing the RTF files!\n");
13707 g_s.
begin(
"Running plantuml with JAVA...\n");
13714 g_s.
begin(
"Running mermaid (mmdc)...\n");
13726 if (generateHtml &&
13730 g_s.
begin(
"Running html help compiler...\n");
13735 if ( generateHtml &&
13739 g_s.
begin(
"Running qhelpgenerator...\n");
13752 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
13753 if (numThreads<1) numThreads=1;
13754 msg(
"Total elapsed time: {:.6f} seconds\n(of which an average of {:.6f} seconds per thread waiting for external tools to finish)\n",
13761 msg(
"finished...\n");
13766 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 setTaglessParent(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 setHasNamedVariable(bool b)=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)
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 setFileDef(FileDef *fd)=0
virtual void setPrototype(bool p, const DString &df, int line, size_t column)=0
virtual void setRelatedAlso(ClassDef *cd)=0
virtual void setAnonymousMemberForDeclaration(const MemberDef *md)=0
virtual void overrideReferencesRelation(bool e)=0
virtual void setAnonymousMemberForDetails(const MemberDef *md)=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 setNamespace(NamespaceDef *nd)=0
virtual void moveArgumentList(std::unique_ptr< ArgumentList > al)=0
virtual void makeRelated()=0
virtual void insertReimplementedBy(MemberDef *md)=0
virtual void setAnchor()=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 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 ClassDefMutable * createTagLessInstance(const Definition *root, const ClassDef *templ, const DString &fieldName, bool hasNamedVariable)
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 processTagLessClasses(const Definition *root, const Container *def, const TagContainer *tagParent, MemberListType varFilter, MemberListType typeFilter, const DString &prefix, int count)
Look through the members of class cd and its public members.
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 processTagLessClassesForList(const Definition *root, const Container *def, const TagContainer *tagParent, MemberListType varFilter, MemberListType typeFilter, const DString &prefix, int count)
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 computeMemberRelationsForBaseClass(const ClassDef *cd, const BaseClassDef *bcd, const ArgumentList *actualArgs)
static void buildClassDocList(const Entry *root)
static void buildPageList(Entry *root)
static void writeTagFile()
static void addRequirementReferences()
static void computeVerifiedDotPath()
static bool g_singleComment
static void findSectionsInDocumentation()
static void mergeCategories()
static const StringUnorderedSet g_compoundKeywords
static bool scopeIsTemplate(const Definition *d)
static void buildFileList(const Entry *root)
static void buildClassList(const Entry *root)
static void usage(const DString &name, const DString &versionString)
static void findUsedTemplateInstances()
static void computeTooltipTexts()
static void addVariable(const Entry *root, int isFuncPtr=-1)
static void findBaseClassesForClass(const Entry *root, Definition *context, ClassDefMutable *masterCd, ClassDefMutable *instanceCd, FindBaseClassRelation_Mode mode, bool isArtificial, const ArgumentList *actualArgs=nullptr, const TemplateNameMap &templateNames=TemplateNameMap())
static void parseFilesSingleThreading(const std::shared_ptr< Entry > &root)
parse the list of input files
static void buildCompleteMemberLists()
static const ClassDef * findClassDefinition(FileDef *fd, NamespaceDef *nd, const DString &scopeName)
static void filterMemberDocumentation(const Entry *root, const DString &relates)
static void generateConceptDocs()
static bool isRecursiveBaseClass(const DString &scope, const DString &name)
static std::unique_ptr< OutlineParserInterface > getParserForFile(const DString &fn)
static void combineUsingRelations()
static const char * getArg(int argc, char **argv, int &optInd)
std::unique_ptr< ArgumentList > getTemplateArgumentsFromName(const DString &name, const ArgumentLists &tArgLists)
static void 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 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)
DString removeAnonymousScopes(const DString &str)
bool openOutputFile(const DString &outFile, std::ofstream &f)
DString stripAnonymousNamespaceScope(const DString &s)
A bunch of utility functions.