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);
324 scope+=
"::"+pd->
name();
367 ((!includeExternal && root->
tagInfo()==
nullptr) ||
368 ( includeExternal && root->
tagInfo()!=
nullptr))
371 AUTO_TRACE(
"additional={} includeExternal={}",additional,includeExternal);
387 "group {}: ignoring title \"{}\" that does not match old title \"{}\"",
407 std::unique_ptr<GroupDef>(
414 std::unique_ptr<GroupDef>(
464 scope+=
"::"+gd->
name();
516 bool save_ambig = ambig;
520 size_t newIndex=fn.
rfind(
'/');
527 fn = fn.
left(newIndex)+
"/"+root->
name;
530 if (!fd) ambig = save_ambig;
561 "Found non-existing group '{}' for the command '{}', ignoring command",
570 text.
sprintf(
"the name '%s' supplied as "
571 "the argument in the \\file statement ",
575 text+=
"matches the following input files:\n";
578 text+=
"Please use a more specific name by "
579 "including a (larger) part of the path!";
583 text+=
"is not an input file";
591template<
class DefMutable>
605 if (!includeFile.
empty() && includeFile.
at(0)==
'"')
608 includeFile=includeFile.
mid(1,includeFile.
length()-2);
610 else if (!includeFile.
empty() && includeFile.
at(0)==
'<')
613 includeFile=includeFile.
mid(1,includeFile.
length()-2);
620 if (!includeFile.
empty() &&
625 text.
sprintf(
"the name '%s' supplied as "
626 "the argument of the \\class, \\struct, \\union, or \\include command ",
631 text+=
"matches the following input files:\n";
634 text+=
"Please use a more specific name by "
635 "including a (larger) part of the path!";
639 text+=
"is not an input file";
643 else if (includeFile.
empty() && ifd &&
657 if (iName.
at(0)==
'<') local=
false;
658 else if (iName.
at(0)==
'"') local=
true;
659 if (iName.
at(0)==
'"' || iName.
at(0)==
'<')
682 cd->setIncludeFile(
nullptr,iName,local,
true);
695 for (
size_t i=0;i<l;i++)
699 else if (c==
')' && round>0) round--;
700 else if (c==
'<' && round==0) count++;
705 if (c==
'>' && round==0 && count>0) count--;
728 if (idx==-1)
return prevScope;
730 if (nsName.
empty())
return prevScope;
731 if (!fullScope.
empty()) fullScope+=
"::";
736 if (nd==
nullptr) cd =
getClass(fullScope);
737 if (nd==
nullptr && cd)
749 "[generated]",1,1,fullScope,
767 if (prevScopeMutable)
799 int p=i1+l1,l2=0,i2=0;
802 DString nestedNameSpecifier = scope.
mid(i1,l1);
807 if (resultScope==
nullptr)
818 if (resultScope!=
nullptr)
break;
877 auto alIt = tArgLists.begin();
894 return alIt!=tArgLists.end() ?
895 std::make_unique<ArgumentList>(*alIt) :
896 std::unique_ptr<ArgumentList>();
904 if (specifier.isStruct())
906 else if (specifier.isUnion())
908 else if (specifier.isCategory())
910 else if (specifier.isInterface())
912 else if (specifier.isProtocol())
914 else if (specifier.isException())
916 else if (specifier.isService())
918 else if (specifier.isSingleton())
921 if (section.isUnionDoc())
923 else if (section.isStructDoc())
925 else if (section.isInterfaceDoc())
927 else if (section.isProtocolDoc())
929 else if (section.isCategoryDoc())
931 else if (section.isExceptionDoc())
933 else if (section.isServiceDoc())
935 else if (section.isSingletonDoc())
963 DString qualifiedName = fullName;
966 qualifiedName.
prepend(scName+
"::");
972 AUTO_TRACE_ADD(
"Found class with name '{}', qualifiedName '{}'", cd ? cd->
name() : root->
name, qualifiedName);
1027 AUTO_TRACE_ADD(
"New class: fullname '{}' namespace '{}' name='{}' brief='{}' docs='{}'",
1044 std::unique_ptr<ArgumentList> tArgList;
1046 if ((root->
lang==SrcLangExt::CSharp || root->
lang==SrcLangExt::Java) &&
1061 fullName=fullName.
left(i);
1072 fullName,sec,tagName,refFileName,
true,root->
spec.isEnum()) ));
1075 AUTO_TRACE_ADD(
"New class '{}' type={} #tArgLists={} tagInfo={} hidden={} artificial={}",
1112 AUTO_TRACE_ADD(
"Class {} not added, already exists as alias", fullName);
1120 if (!root->
spec.isForwardDecl())
1182 qualifiedName.
prepend(scName+
"::");
1188 AUTO_TRACE_ADD(
"Found concept with name '{}' (qualifiedName='{}')", cd ? cd->
name() : root->
name, qualifiedName);
1192 qualifiedName=cd->
name();
1206 AUTO_TRACE_ADD(
"New concept: fullname '{}' namespace '{}' name='{}' brief='{}' docs='{}'",
1207 qualifiedName,namespaceName,className,root->
brief,root->
doc);
1228 qualifiedName,tagName,refFileName)));
1232 qualifiedName,root->
tArgLists.size(),fmt::ptr(tagInfo));
1263 for (
const auto &ce : root->
children())
1266 if (ce->section.isConceptDocPart())
1271 if (!ce->brief.empty())
1273 cd->
addDocPart(ce->brief,ce->startLine,ce->startColumn);
1276 if (!ce->doc.empty())
1278 cd->
addDocPart(ce->doc,ce->startLine,ce->startColumn);
1282 else if (ce->section.isConceptCodePart())
1284 cd->
addCodePart(ce->initializer.str(),ce->startLine,ce->startColumn);
1291 AUTO_TRACE_ADD(
"Concept '{}' not added, already exists (as alias)", qualifiedName);
1298 for (
const auto &ce : root->
children())
1300 if (ce->section.isConceptDocPart())
1320 if (root->
section.isModuleDoc())
1330 if (root->
section.isConcept())
1340 if (root->
section.isConceptDoc())
1359 if (cd!=ocd && cd->groupId()==ocd->groupId() &&
1360 !cd->partOfGroups().empty() && ocd->partOfGroups().empty())
1365 for (
const auto &gd : cd->partOfGroups())
1371 gd->addConcept(ocd.get());
1396 aliasFullName(name),aliasCd(std::move(cd)), aliasContext(ctx) {}
1398 std::unique_ptr<ClassDef> aliasCd;
1401 std::vector<ClassAlias> aliases;
1405 if (cd && visitedClasses.find(icd.get())==visitedClasses.end())
1411 name,icd->getFileDef(),
nullptr);
1437 aliases.emplace_back(aliasFullName,std::move(aliasCd),dm);
1448 visitedClasses.insert(icd.get());
1458 for (
auto &alias : aliases)
1463 alias.aliasContext->addInnerCompound(aliasCd);
1472 if (cd && visitedClasses.find(icd.get())==visitedClasses.end())
1490 "Incomplete input: scope for class {} not found!{}",name,
1491 name.
startsWith(
"std::") ?
" Try enabling BUILTIN_STL_SUPPORT." :
""
1509 if (visitedClasses.find(cd.get())==visitedClasses.end() && !cd->partOfGroups().empty())
1513 for (
auto &ncd : cd->getClasses())
1524 visitedClasses.insert(cd.get());
1531template<
typename Container>
1533 const Container *cd,
1539 MemberList *eiml = cd->getMemberList(mlFilter);
1542 for (
const auto &eimd : *eiml)
1544 DString vtype = eimd->typeString();
1565 const char *p = n.
data()+sn;
1569 if (!isdigit(c) && c!=
'@' && c!=
':')
break;
1575 DString fullName = n+
"."+fieldName;
1604 else if (outerScope)
1619 auto newMd =
createMemberDef(md->getDefFileName(),md->getDefLine(),md->getDefColumn(),
1620 md->typeString(),md->name(),md->argsString(),md->excpString(),
1621 md->protection(),md->virtualness(),md->isStatic(),Relationship::Member,
1631 imd->
setId(md->id());
1652 for (
const auto &md : *ml)
1661 for (
const auto &md : *ml)
1665 if (md->isEnumerate() && md->name().startsWith(
"@"))
1667 for (
const auto &emd : md->enumFieldList())
1690template<
typename Container,
typename TagContainer>
1692 const Container *cd,
1693 const TagContainer *tagParent,
1698 AUTO_TRACE(
"count={} name={}\n",count,cd->name());
1701 MemberList *ml = cd->getMemberList(varFilter);
1705 for (
const auto &md : *ml)
1707 DString type = md->typeString();
1712 std::vector<const ClassDef *> candidates;
1713 for (
const auto &icd : cd->getClasses())
1715 candidates.push_back(icd);
1717 for (
const auto &icd : candidates)
1723 if (md->isAnonymous()) name =
"__unnamed" +
DString().
setNum(pos++)+
"__";
1729 processTagLessClasses(ncd,icd,ncd,MemberListType::PubAttribs(),MemberListType::PubTypes(),name,count+1);
1734 MemberList *pml = tagParent->getMemberList(varFilter);
1737 for (
const auto &pmd : *pml)
1740 if (pmdm && pmd->
name()==md->name())
1757 ml = cd->getMemberList(typeFilter);
1760 for (
const auto &md : *ml)
1769template<
typename Container>
1772 for (
const auto &icd : cd->getClasses())
1780 candidates.insert(cd);
1785 std::set<const Definition *> candidates;
1795 const FileDef *fd = cd->getFileDef();
1810 for (
const auto &d : candidates)
1816 processTagLessClasses(nd,nd,nd,MemberListType::DecVarMembers(),MemberListType::DecEnumMembers(),
"",0);
1821 processTagLessClasses(fd,fd,fd,MemberListType::DecVarMembers(),MemberListType::DecEnumMembers(),
"",0);
1838 (root->
section.isNamespace() ||
1839 root->
section.isNamespaceDoc() ||
1848 if (root->
section.isPackageDoc())
1854 if (!fullName.
empty())
1912 root->
type,root->
spec.isPublished())));
1979 DString aliasName = aliasNd->name();
2008 for (
auto &und : unl)
2010 DString uScope=und->name()+
"::";
2012 if (usingNd!=
nullptr)
break;
2019 if (root->
section.isUsingDir())
2037 (fd==
nullptr || fd->
getLanguage()!=SrcLangExt::Java)
2041 if (!nsName.
empty())
2051 int scopeOffset =
static_cast<int>(nsName.
length());
2064 size_t o = nsName.
rfind(
"::",scopeOffset-1);
2067 }
while (scopeOffset>=0 && usingNd==
nullptr);
2069 if (usingNd==
nullptr && nd)
2073 while (pnd && usingNd==
nullptr)
2090 if (usingNd==
nullptr && fd)
2163 if (root->
section.isUsingDecl() &&
2176 if (root->
section.isUsingDecl() &&
2178 (!filterPythonPackages || (root->
lang==SrcLangExt::Python && root->
fileName.
endsWith(
"__init__.py")))
2181 AUTO_TRACE(
"Found using declaration '{}' at line {} of {} inside section {}",
2195 if (!scName.
empty())
2211 if (nd==
nullptr) scope = fd;
2281 AUTO_TRACE(
"creating new member {} for class {}",memName,cd->
name());
2292 newMmd->setMemberClass(cd);
2310 newMmd->addSectionsToDefinition(root->
anchors);
2316 newMmd->setMemberGroupId(root->
mGrpId);
2319 newMmd->setLanguage(root->
lang);
2320 newMmd->setId(root->
id);
2329 if (root->
section.isUsingDecl() &&
2356 for (
auto &mi : *mni)
2359 if (md && md->
protection()!=Protection::Private)
2374 for (
const auto ©Cd : it->second)
2387 else if (root->
section.isUsingDecl() &&
2389 root->
lang==SrcLangExt::Cpp
2422 memName = root->
name;
2444 newMmd->setNamespace(nd);
2449 newMmd->setFileDef(fd);
2468 newMmd->addSectionsToDefinition(root->
anchors);
2474 newMmd->setMemberGroupId(root->
mGrpId);
2477 newMmd->setLanguage(root->
lang);
2478 newMmd->setId(root->
id);
2486 if (nd && aliasMd.get())
2490 if (fd && aliasMd.get())
2519 if (nd) ncdm->
moveTo(nd);
2548 aliasFullName = aliasCd->localName();
2552 aliasFullName = nd->
qualifiedName()+
"::"+aliasCd->localName();
2584 for (
const auto &fd : *fn)
2587 fd->addIncludedUsingDirectives(visitedFiles);
2607 if (lang==SrcLangExt::Java || lang==SrcLangExt::CSharp)
2612 AUTO_TRACE(
"class variable: file='{}' type='{}' scope='{}' name='{}' args='{}' prot={} mtype={} lang={} init='{}'",
2618 if (related!=Relationship::Member || mtype==MemberType::Friend ||
Config_getBool(HIDE_SCOPE_NAMES))
2620 if (root->
spec.isAlias())
2622 if (lang==SrcLangExt::Python)
2624 def=
"type "+name+args;
2633 def=type+
" "+name+args;
2638 if (root->
spec.isAlias())
2640 if (lang==SrcLangExt::Python)
2642 def=
"type "+qualScope+scopeSeparator+name+args;
2646 def=
"using "+qualScope+scopeSeparator+name;
2651 def=type+
" "+qualScope+scopeSeparator+name+args;
2663 def=qualScope+scopeSeparator+name+args;
2674 for (
const auto &imd : *mn)
2686 if (root->
lang==SrcLangExt::ObjC &&
2687 root->
mtype==MethodTypes::Property &&
2711 prot,Specifier::Normal,root->
isStatic,related,
2715 mmd->setTagInfo(root->
tagInfo());
2716 mmd->setMemberClass(cd);
2720 mmd->setDefinition(def);
2722 mmd->addSectionsToDefinition(root->
anchors);
2726 mmd->setMemberGroupId(root->
mGrpId);
2727 mmd->setMemberSpecifiers(root->
spec);
2728 mmd->setVhdlSpecifiers(root->
vhdlSpec);
2729 mmd->setReadAccessor(root->
read);
2730 mmd->setWriteAccessor(root->
write);
2732 mmd->setHidden(root->
hidden);
2734 mmd->setLanguage(root->
lang);
2735 mmd->setId(root->
id);
2738 mmd->setBodyDef(root->
fileDef());
2743 mmd->setRefItems(root->
sli);
2744 mmd->setRequirementReferences(root->
rqli);
2749 if (mtype==MemberType::Typedef)
2772 AUTO_TRACE(
"global variable: file='{}' type='{}' scope='{}' name='{}' args='{}' prot={} mtype={} lang={} init='{}'",
2778 if (mtype==MemberType::Typedef &&
Config_getBool(TYPEDEF_HIDES_STRUCT))
2784 static const reg::Ex re(R
"(\a\w*)");
2786 const std::string &typ = ttype.
str();
2789 DString typeValue = match.str();
2824 if (root->
spec.isAlias())
2826 if (lang==SrcLangExt::Python)
2828 def=
"type "+nd->
name()+sep+name+args;
2832 def=
"using "+nd->
name()+sep+name;
2837 def=type+
" "+nd->
name()+sep+name+args;
2842 def=nd->
name()+sep+name+args;
2849 if (name.
at(0)==
'@')
2855 if (root->
spec.isAlias())
2857 if (root->
lang==SrcLangExt::Python)
2859 def=
"type "+root->
name+args;
2863 def=
"using "+root->
name;
2868 def=type+
" "+name+args;
2889 for (
const auto &imd : *mn)
2903 bool isPHPArray = md->
getLanguage()==SrcLangExt::PHP &&
2906 bool staticsInDifferentFiles =
2912 !staticsInDifferentFiles
2954 mmd->setTagInfo(root->
tagInfo());
2955 mmd->setMemberSpecifiers(root->
spec);
2956 mmd->setVhdlSpecifiers(root->
vhdlSpec);
2960 mmd->addSectionsToDefinition(root->
anchors);
2963 mmd->setMemberGroupId(root->
mGrpId);
2964 mmd->setDefinition(def);
2965 mmd->setLanguage(root->
lang);
2966 mmd->setId(root->
id);
2974 mmd->setBodyDef(fd);
2979 mmd->setRefItems(root->
sli);
2980 mmd->setRequirementReferences(root->
rqli);
2983 mmd->setNamespace(nd);
2991 mmd->setFileDef(fd);
2997 if (mtype==MemberType::Typedef)
3019 if (lang == SrcLangExt::Fortran || lang == SrcLangExt::VHDL)
3024 static const reg::Ex re(R
"(\([^)]*[*&^][^)]*\))");
3026 size_t i=std::string::npos;
3030 i = match.position();
3033 if (i!=std::string::npos)
3035 size_t di = type.find(
"decltype(");
3036 if (di!=std::string::npos && di<i)
3038 i = std::string::npos;
3041 size_t bb=type.find(
'<');
3042 size_t be=type.rfind(
'>');
3043 bool templFp =
false;
3044 if (be!=std::string::npos) {
3045 size_t cc_ast = type.find(
"::*");
3046 size_t cc_amp = type.find(
"::&");
3047 templFp = (cc_ast != std::string::npos && cc_ast>be) || (cc_amp != std::string::npos && cc_amp>be);
3050 if (!type.empty() &&
3051 i!=std::string::npos &&
3052 type.find(
"operator")==std::string::npos &&
3053 (type.find(
")(")==std::string::npos || type.find(
"typedef ")!=std::string::npos) &&
3055 (!((bb!=std::string::npos && bb<i) && (be!=std::string::npos && i<be)) || templFp)
3058 if (pLength) *pLength=
static_cast<int>(l);
3061 return static_cast<int>(i);
3078 bool result =
false;
3079 bool typeIsClass =
false;
3080 bool typePtrType =
false;
3117 typeIsClass = resolver.
resolveClass(ctx,type)!=
nullptr;
3135 static const reg::Ex initChars(R
"([\d"'&*!^]+)");
3139 std::string name = a.
name.
str();
3140 if (
reg::search(name,match,initChars) && match.position()==0)
3172 std::string atype = a.
type.
str();
3173 if (
reg::search(atype,match,initChars) && match.position()==0)
3180 if (resType.empty()) resType=atype;
3181 static const reg::Ex idChars(R
"(\a\w*)");
3182 if (
reg::search(resType,match,idChars) && match.position()==0)
3184 resType=match.str();
3185 if (resType==
"int" || resType==
"long" ||
3186 resType==
"float" || resType==
"double" ||
3187 resType==
"char" || resType==
"void" ||
3188 resType==
"signed" || resType==
"unsigned" ||
3189 resType==
"const" || resType==
"volatile" )
3226 bool insideString=
false;
3227 bool insideChar=
false;
3229 while (e<len && brCount!=0)
3235 if (!insideString && !insideChar)
3237 if (e<len-1 && s.
at(e+1)==
'<')
3239 else if (roundCount==0)
3244 if (!insideString && !insideChar)
3246 if (e<len-1 && s.
at(e+1)==
'>')
3248 else if (roundCount==0)
3253 if (!insideString && !insideChar)
3257 if (!insideString && !insideChar)
3263 if (insideString && pc!=
'\\')
3272 if (insideChar && pc!=
'\\')
3282 return brCount==0 ?
static_cast<int>(e) : -1;
3291 AUTO_TRACE(
"VARIABLE_SEC: type='{}' name='{}' args='{}' bodyLine={} endBodyLine={} mGrpId={} relates='{}'",
3306 std::string sargs = args.
str();
3307 static const reg::Ex reName(R
"(\a\w*)");
3312 sargs = match.suffix().str();
3313 size_t j = sargs.find(
')');
3314 if (j!=std::string::npos) args=sargs.
substr(0,j);
3325 size_t ai = type.
find(
'[',ii);
3338 AUTO_TRACE_ADD(
"after correction: type='{}' name='{}' args='{}'",type,name,args);
3349 scope=name.
left(index);
3350 name=name.
mid(index+2);
3358 if (!scopeName.
empty())
3370 bool isRelated=
false;
3371 bool isMemberOf=
false;
3374 if (root->
lang==SrcLangExt::CSharp)
3387 for (
size_t i=0;i<name.
length()-1;i++)
3389 if (name[i]==
':' && name[i+1]==
':')
3391 p=
static_cast<int>(i);
3393 else if (name[i]==
'<')
3398 if (e!=-1) i=
static_cast<int>(e);
3416 Relationship::Member
3437 mtype=MemberType::EnumValue;
3439 mtype=MemberType::Typedef;
3440 else if (type_s.
startsWith(
"friend ") || type_s==
"friend")
3441 mtype=MemberType::Friend;
3442 else if (root->
mtype==MethodTypes::Property)
3443 mtype=MemberType::Property;
3444 else if (root->
mtype==MethodTypes::Event)
3445 mtype=MemberType::Event;
3447 mtype=sliceOpt ? MemberType::Sequence : MemberType::Typedef;
3449 mtype=sliceOpt ? MemberType::Dictionary : MemberType::Typedef;
3454 isMemberOf=(root->
relatesType==RelatesType::MemberOf);
3469 Relationship relationship = isMemberOf ? Relationship::Foreign :
3470 isRelated ? Relationship::Related :
3471 Relationship::Member ;
3483 else if (!name.
empty())
3509 scope=rname.
left(index);
3510 rname=rname.
mid(index+2);
3522 for (
auto &imd : *mn)
3524 if (!imd->isTypedef())
3533 bool notBothGrouped = root->
groups.empty() || imd->getGroupDef()==
nullptr;
3534 bool bothSameScope = (!cd && !nd) || (cd && imd->getClassDef() == cd) || (nd && imd->getNamespaceDef() == nd);
3537 if (notBothGrouped && bothSameScope && imd->typeString()==rtype)
3585 for (
const auto &e : root->
children())
3586 if (!e->section.isEnum())
3603 for (
const auto &e : root->
children())
3604 if (!e->section.isEnum())
3621 for (
const auto &e : root->
children())
3622 if (!e->section.isEnum())
3637 (root->
section.isVariable() &&
3640 (root->
section.isFunction() &&
3643 (root->
section.isFunction() &&
3652 for (
const auto &e : root->
children())
3653 if (!e->section.isEnum())
3668 enum MemberType type = root->
section.isExportedInterface() ? MemberType::Interface : MemberType::Service;
3679 mmd->setTagInfo(root->
tagInfo());
3680 mmd->setMemberClass(cd);
3682 mmd->setDocsForDefinition(
false);
3686 mmd->setMemberSpecifiers(root->
spec);
3687 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3688 mmd->setMemberGroupId(root->
mGrpId);
3690 mmd->setLanguage(root->
lang);
3691 mmd->setBodyDef(fd);
3692 mmd->setFileDef(fd);
3693 mmd->addSectionsToDefinition(root->
anchors);
3695 mmd->setDefinition(def);
3699 AUTO_TRACE(
"Interface member: fileName='{}' type='{}' name='{}' mtype='{}' prot={} virt={} state={} proto={} def='{}'",
3707 root->
spec.isOptional() ? Protection::Protected : Protection::Public, Specifier::Normal);
3717 mmd->setRefItems(root->
sli);
3718 mmd->setRequirementReferences(root->
rqli);
3727 if (root->
section.isExportedInterface() || root->
section.isIncludedService())
3729 AUTO_TRACE(
"Exported interface/included service: type='{}' scope='{}' name='{}' args='{}'"
3730 " relates='{}' relatesType='{}' file='{}' line={} bodyLine={} #tArgLists={}"
3731 " mGrpId={} spec={} proto={} docFile='{}'",
3754 else if (rname.
empty())
3757 "Illegal member name found.");
3763 case SrcLangExt::Unknown:
3764 case SrcLangExt::IDL:
3793 if (isFriend) mtype=MemberType::Friend;
3794 else if (root->
mtype==MethodTypes::Signal) mtype=MemberType::Signal;
3795 else if (root->
mtype==MethodTypes::Slot) mtype=MemberType::Slot;
3796 else if (root->
mtype==MethodTypes::DCOP) mtype=MemberType::DCOP;
3801 if ((fd==
nullptr || fd->
getLanguage()==SrcLangExt::Cpp) &&
3805 (j!=i+2 || name.
at(i+1)!=
'=')
3823 root->
relatesType==RelatesType::MemberOf ? Relationship::Foreign :
3824 Relationship::Related ;
3834 mmd->setTagInfo(root->
tagInfo());
3835 mmd->setMemberClass(cd);
3837 mmd->setDocsForDefinition(!root->
proto);
3841 mmd->setMemberSpecifiers(spec);
3842 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3843 mmd->setMemberGroupId(root->
mGrpId);
3845 mmd->setLanguage(root->
lang);
3846 mmd->setRequiresClause(root->
req);
3847 mmd->setId(root->
id);
3848 mmd->setBodyDef(fd);
3849 mmd->setFileDef(fd);
3850 mmd->addSectionsToDefinition(root->
anchors);
3855 if (scopeSeparator!=
"::")
3857 qualScope =
substitute(qualScope,
"::",scopeSeparator);
3859 if (lang==SrcLangExt::PHP)
3862 scopeSeparator=
"::";
3879 def=type+
" "+qualScope+scopeSeparator+name;
3883 def=qualScope+scopeSeparator+name;
3887 mmd->setDefinition(def);
3891 AUTO_TRACE(
"function member: type='{}' scope='{}' name='{}' args='{}' proto={} def='{}'",
3892 type, qualScope, rname, args, root->
proto, def);
3902 mmd->setRefItems(root->
sli);
3903 mmd->setRequirementReferences(root->
rqli);
3923 MemberType::Function,
3927 mmd->setTagInfo(root->
tagInfo());
3928 mmd->setLanguage(root->
lang);
3929 mmd->setId(root->
id);
3934 mmd->setDocsForDefinition(!root->
proto);
3940 mmd->addSectionsToDefinition(root->
anchors);
3941 mmd->setMemberSpecifiers(root->
spec);
3942 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3943 mmd->setMemberGroupId(root->
mGrpId);
3944 mmd->setRequiresClause(root->
req);
3954 if (!nscope.
empty())
3979 def=root->
type+
" "+scope+name;
3985 AUTO_TRACE(
"new non-member function type='{}' scope='{}' name='{}' args='{}' proto={} def='{}'",
3987 mmd->setDefinition(def);
3991 mmd->setRefItems(root->
sli);
3992 mmd->setRequirementReferences(root->
rqli);
3996 mmd->setNamespace(nd);
4003 mmd->setFileDef(fd);
4024 if (root->
section.isFunction())
4026 AUTO_TRACE(
"member function: type='{}' scope='{}' name='{}' args='{}' relates='{}' relatesType='{}'"
4027 " file='{}' line={} bodyLine={} #tArgLists={} mGrpId={}"
4028 " spec={} proto={} docFile='{}'",
4043 scope=rname.
left(index);
4044 rname=rname.
mid(index+2);
4053 if (root->
lang==SrcLangExt::CSharp)
4064 size_t memIndex=rname.
rfind(
"::");
4067 if (cd && scope+
"::"==rname.
left(scope.
length()+2))
4073 bool isMember=
false;
4076 size_t ts=rname.
find(
'<');
4077 size_t te=rname.
find(
'>');
4095 isMember=memIndex<ts || memIndex>te;
4135 for (
const auto &imd : *mn)
4148 fullScope.
prepend(parentScope);
4154 if (mnd) nsName = mnd->
name();
4155 if (rnd) rnsName = rnd->
name();
4163 bool sameTemplateArgs =
true;
4164 bool matchingReturnTypes =
true;
4165 bool sameRequiresClause =
true;
4171 matchingReturnTypes =
false;
4175 sameRequiresClause =
false;
4181 sameTemplateArgs =
false;
4184 bool staticsInDifferentFiles =
4187 if (sameTemplateArgs &&
4188 matchingReturnTypes &&
4189 sameRequiresClause &&
4190 !staticsInDifferentFiles &&
4197 if (!root->
groups.empty() && !root->
groups.front().groupname.empty())
4204 found=(mnd && rnd && nsName==rnsName) ||
4205 ((mnd==
nullptr && rnd==
nullptr && mfd!=
nullptr &&
4210 if (!found && gd && gd==md->
getGroupDef() && nsName==rnsName)
4216 AUTO_TRACE_ADD(
"combining function with prototype found={} in namespace '{}'",found,nsName);
4315 else if (rname.
empty())
4318 "Illegal member name found."
4336 for (
const auto &ifmd : *fn)
4340 for (
const auto &immd : *mn)
4356 AUTO_TRACE_ADD(
"Merging related global and member '{}' isFriend={} isRelated={} isFunction={}",
4433 for (
const auto &imdec : *mn)
4441 for (
const auto &imdef : *mn)
4444 if (mdef && mdec!=mdef &&
4464 for (
const auto &imd : *mn)
4480 if (mdef && mdec)
break;
4488 mdec->getOuterScope(),mdec->getFileDef(),mdec->typeString(),
const_cast<ArgumentList*
>(&mdecAl),
4495 mdec->mergeReferences(mdef);
4497 mdec->mergeReferencedBy(mdef);
4514 for (
const auto &imd : *mn)
4525 for (
const auto &irmd : *rmn)
4559 size_t i=qualifiedName.rfind(
"::");
4560 if (i!=std::string::npos)
4567 for (
const auto &imd : *mn)
4593 std::map<std::string,int> templateNames;
4595 for (
const Argument &arg : templateArguments)
4597 static const reg::Ex re(R
"(\a[\w:]*)");
4600 for (; it!=
end ; ++it)
4602 const auto &match = *it;
4603 std::string n = match.str();
4604 if (n==arg.name.str())
4606 if (templateNames.find(n)==templateNames.end())
4608 templateNames.emplace(n,count);
4613 return templateNames;
4628 if (context && cd!=context)
4633 if (result==
nullptr)
4638 if (result==
nullptr)
4667 for (
auto &mi : *mni)
4675 if (!typedefValue.
empty())
4677 type = typedefValue;
4696 usedClassName = typeCd->
name();
4706 if (templateNames.empty())
4710 BaseInfo bi(usedName,Protection::Public,Specifier::Normal);
4715 if (arg.name==usedName)
4719 if (usedCd==
nullptr)
4770 if (!found && !type.
empty())
4829 if (templateNames.empty())
4845 bool b =
Config_getBool(HIDE_UNDOC_RELATIONS) ? true : isArtificial;
4867 AUTO_TRACE(
"Derived from template '{}' with parameters '{}' isArtificial={}",
4868 templateClass->
name(),templSpec,isArtificial);
4871 bool existingClass = templSpec==tempArgsStr;
4872 if (existingClass)
return;
4874 bool freshInstance=
false;
4891 for (
auto it=it_pair.first ; it!=it_pair.second ; ++it)
4893 const Entry *templateRoot = it->second;
4894 AUTO_TRACE_ADD(
"template root found '{}' templSpec='{}'",templateRoot->
name,templSpec);
4900 isArtificial,templArgs.get(),templateNames);
4924 templateClassName,
true,
true);
4925 AUTO_TRACE_ADD(
"templateClassName={} baseClass={}",templateClassName,baseClass?baseClass->
name():
"<none>");
4954 if (name.
empty())
return 0;
4955 int l =
static_cast<int>(name.
length());
4961 while (count>0 && i>=0)
4966 case '>':
if (!insideQuote) count++;
break;
4967 case '<':
if (!insideQuote) count--;
break;
4968 case '\'':
if (!insideQuote) insideQuote=c;
4969 else if (insideQuote==c && (i<0 || name[i]!=
'\\')) insideQuote=0;
4971 case '"':
if (!insideQuote) insideQuote=c;
4972 else if (insideQuote==c && (i<0 || name[i]!=
'\\')) insideQuote=0;
4992 AUTO_TRACE(
"name={} base={} isArtificial={} mode={}",cd->
name(),bi->
name,isArtificial,(
int)mode);
4995 bool explicitGlobalScope=
false;
4998 biName=biName.
mid(2);
4999 explicitGlobalScope=
true;
5003 bool lastParent=
false;
5008 int scopeOffset=explicitGlobalScope ? 0 :
static_cast<int>(scopeName.
length());
5017 baseClassName.
prepend(scopeName.
left(scopeOffset)+
"::");
5019 if (root->
lang==SrcLangExt::CSharp)
5046 || explicitGlobalScope
5049 || (root->
lang==SrcLangExt::IDL &&
5050 (root->
section.isExportedInterface() ||
5051 root->
section.isIncludedService()))
5054 AUTO_TRACE_ADD(
"class relation '{}' inherited/used by '{}' found prot={} virt={} templSpec='{}'",
5055 baseClassName, root->
name, bi->
prot, bi->
virt, templSpec);
5058 size_t si=baseClassName.
rfind(
"::",i);
5060 if (baseClass==
nullptr &&
static_cast<size_t>(i)!=baseClassName.
length())
5070 baseClassName = baseClassName.
left(i)+baseClassName.
mid(e);
5081 else if (baseClass && !templSpec.
empty())
5092 baseClass = templClass;
5110 found=baseClass!=
nullptr && baseClass!=cd;
5120 found = baseClass!=
nullptr && baseClass!=cd;
5132 found = baseClass!=
nullptr && baseClass!=cd;
5135 bool isATemplateArgument = templateNames.find(biName.
str())!=templateNames.end();
5140 AUTO_TRACE_ADD(
"Documented base class '{}' templSpec='{}'",biName,templSpec);
5158 if (baseClassTypeDef==
nullptr)
5168 if (baseClassTypeDef)
5177 AUTO_TRACE_ADD(
"insertBaseClass name={} prot={} virt={} templSpec={}",usedName,prot,bi->
virt,templSpec);
5185 "Detected potential recursive class relation "
5186 "between class {} and base class {}!",
5193 else if (mode==
Undocumented && (scopeOffset==0 || isATemplateArgument))
5195 AUTO_TRACE_ADD(
"New undocumented base class '{}' baseClassName='{}' templSpec='{}' isArtificial={}",
5196 biName,baseClassName,templSpec,isArtificial);
5198 if (isATemplateArgument)
5201 if (baseClass==
nullptr)
5220 if (baseClass==
nullptr)
5231 si = baseClassName.
rfind(
"::");
5247 biName=
"<"+biName.
left(biName.
length()-2)+
">";
5251 AUTO_TRACE_ADD(
"insertBaseClass name={} prot={} virt={} templSpec={}",biName,bi->
prot,bi->
virt,templSpec);
5261 if (scope!=baseClass)
5287 "Detected potential recursive class relation "
5288 "between class {} and base class {}!",
5289 root->
name,baseClassName
5302 size_t o = scopeName.
rfind(
"::",scopeOffset-1);
5306 }
while (scopeOffset>=0);
5308 if (parentNode==
nullptr)
5314 parentNode=parentNode->
parent();
5316 }
while (lastParent);
5336 bool hasExtends = !root->
extends.empty();
5337 if (hasExtends)
return true;
5364 if (root->
lang==SrcLangExt::CSharp)
5370 bName = bName.
left(i);
5435 if (!nd->hasDocumentation())
5438 nd->getLanguage() == SrcLangExt::Fortran) &&
5442 warn_undoc(nd->getDefFileName(),nd->getDefLine(),
"{} {} is not documented.",
5443 nd->getLanguage() == SrcLangExt::Fortran ?
"Module" :
"Namespace",
5493 DString templSpec = ti.templSpec;
5507 for (
const auto &tn_kv : templateNames)
5509 size_t templIndex = tn_kv.second;
5511 bool hasActArg=
false;
5512 if (templIndex<templArgs->size())
5514 actArg=templArgs->at(templIndex);
5518 baseClassNames.find(actArg.
type.
str())!=baseClassNames.end() &&
5519 actualTemplateNames.find(actArg.
type.
str())==actualTemplateNames.end()
5522 actualTemplateNames.emplace(actArg.
type.
str(),
static_cast<int>(templIndex));
5557 for (
const auto &fd : *fn)
5559 fd->computeAnchors();
5572 gd->computeAnchors();
5579template<
typename Func>
5602 for (
const auto &fd : *fn)
5675 if (md==
nullptr)
return;
5676 AUTO_TRACE(
"scope='{}' name='{}' args='{}' funcDecl='{}' mSpec={}",
5691 fullName = cd->
name();
5693 fullName = nd->
name();
5695 if (!fullName.
empty()) fullName+=
"::";
5696 fullName+=md->
name();
5801 "member {} belongs to two different groups. The second one found here will be ignored.",
5839 return allowNoGroup;
5842 for (
const auto &g : root->
groups)
5844 if (g.groupname == gd->
name())
5867 AUTO_TRACE(
"namespace='{}' type='{}' name='{}' tempArg='{}' decl='{}'",namespaceName,type,name,tempArg,decl);
5869 if (n.
empty())
return false;
5881 for (
const auto &md : *mn)
5892 if (md->isAlias() && md->getOuterScope() &&
5899 nd = md->getNamespaceDef();
5903 size_t enumNamePos=0;
5904 if (nd && md->isEnumValue() && (enumNamePos=namespaceName.
rfind(
"::"))!=
DString::npos)
5906 DString enumName = namespaceName.
mid(enumNamePos+2);
5907 if (namespaceName.
left(enumNamePos)==nd->
name())
5912 for (
const auto &emd : *enumMn)
5914 found = emd->isStrong() && md->getEnumScope()==emd.get();
5928 else if (nd==
nullptr && md->isEnumValue())
5933 for (
const auto &emd : *enumMn)
5935 found = emd->isStrong() && md->getEnumScope()==emd.get();
5958 if ((namespaceName.
empty() && nd==
nullptr) ||
5959 (nd && nd->
name()==namespaceName) ||
5963 AUTO_TRACE_ADD(
"Try to add member '{}' to scope '{}'",md->name(),namespaceName);
5971 md->isVariable() || md->isTypedef() ||
5972 matchArguments2(md->getOuterScope(),md->getFileDef(),md->typeString(),&mdAl,
5979 if (matching && !root->
tArgLists.empty())
5998 if (matching && md->isStatic() &&
5999 md->getDefFileName()!=root->
fileName &&
6007 if (!md->templateArguments().empty() && !root->
tArgLists.empty())
6012 if (md->templateArguments().size()!=root->
tArgLists.back().size() ||
6013 md->typeString()!=type ||
6014 md->requiresClause()!=root->
req)
6030 if (!found && root->
relatesType!=RelatesType::Duplicate && root->
section.isFunction())
6034 DString warnMsg =
"no matching file member found for \n"+fullFuncDecl;
6037 warnMsg+=
"\nPossible candidates:";
6038 for (
const auto &md : *mn)
6042 warnMsg+=
"' " +
warn_line(md->getDefFileName(),md->getDefLine());
6050 if (root->
type!=
"friend class" &&
6051 root->
type!=
"friend struct" &&
6052 root->
type!=
"friend union" &&
6053 root->
type!=
"friend" &&
6059 "documented symbol '{}' was not declared or defined.",
qPrint(decl)
6071 auto srcIt = srcTempArgLists.begin();
6072 auto dstIt = dstTempArgLists.begin();
6073 while (srcIt!=srcTempArgLists.end() && dstIt!=dstTempArgLists.end())
6075 if ((*srcIt).size()!=(*dstIt).size())
return true;
6089 result = cd->templateArguments().hasParameters() || cd->templateMaster()!=
nullptr ||
6099 const std::string &src
6103 static const reg::Ex re(R
"(\a\w*)");
6108 for (; it!=
end ; ++it)
6110 const auto &match = *it;
6111 size_t i = match.position();
6112 size_t l = match.length();
6114 dst+=src.substr(p,i-p);
6115 std::string name=match.str();
6117 auto srcIt = srcTempArgLists.begin();
6118 auto dstIt = dstTempArgLists.begin();
6119 while (srcIt!=srcTempArgLists.end() && !found)
6122 std::vector<Argument>::const_iterator tdaIt;
6123 if (dstIt!=dstTempArgLists.end())
6126 tdaIt = tdAli->
begin();
6131 for (
auto tsaIt = tsaLi.
begin(); tsaIt!=tsaLi.
end() && !found; ++tsaIt)
6135 if (tdAli && tdaIt!=tdAli->
end())
6151 else if (tdaType.
startsWith(
"typename ")) vc=9;
6154 tdaName = tdaType.
mid(vc);
6156 if (!tdaName.
empty())
6187 auto dstIt = dst.
begin();
6192 if (dstIt == dst.
end())
6196 da.
array = dstArray;
6204 da.
array = dstArray;
6212 srcTempArgLists,dstTempArgLists,
6238 funcType,funcName,funcArgs,exceptions,
6242 mmd->setTagInfo(root->
tagInfo());
6243 mmd->setLanguage(root->
lang);
6244 mmd->setId(root->
id);
6245 mmd->makeImplementationDetail();
6246 mmd->setMemberClass(cd);
6247 mmd->setDefinition(funcDecl);
6253 mmd->setDocsForDefinition(!root->
proto);
6255 mmd->addSectionsToDefinition(root->
anchors);
6259 mmd->setMemberSpecifiers(spec);
6260 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6261 mmd->setMemberGroupId(root->
mGrpId);
6264 mmd->setRefItems(root->
sli);
6265 mmd->setRequirementReferences(root->
rqli);
6301 bool memFound=
false;
6302 for (
const auto &imd : *mn)
6305 if (md==
nullptr)
continue;
6307 if (cd==
nullptr)
continue;
6319 size_t enumNamePos=0;
6322 DString enumName = className.
mid(enumNamePos+2);
6324 if (!namespaceName.
empty()) fullScope.
prepend(namespaceName+
"::");
6325 if (fullScope==cd->
name())
6331 for (
const auto &emd : *enumMn)
6333 memFound = emd->isStrong() && md->
getEnumScope()==emd.get();
6339 if (memFound)
break;
6344 if (memFound)
break;
6362 if (!templAl.
empty())
6364 declTemplArgs.push_back(templAl);
6372 bool substDone=
false;
6379 if (declTemplArgs.size()>0 && declTemplArgs.size()==defTemplArgs.size())
6402 AUTO_TRACE_ADD(
"matching '{}'<=>'{}' className='{}' namespaceName='{}' result={}",
6431 AUTO_TRACE_ADD(
"Comparing return types '{}'<->'{}' #args {}<->{}",
6439 else if (defTemplArgs.size()>declTemplArgs.size())
6441 AUTO_TRACE_ADD(
"Different number of template arguments {} vs {}",defTemplArgs.size(),declTemplArgs.size());
6447 bool rootIsUserDoc = root->
section.isMemberDoc();
6450 bool classOrMdIsTemplate = mdIsTemplate || classIsTemplate;
6451 bool rootIsTemplate = !root->
tArgLists.empty();
6453 if (!rootIsUserDoc &&
6454 (mdIsTemplate || rootIsTemplate) &&
6455 ((classOrMdIsTemplate && !rootIsTemplate) || (!classOrMdIsTemplate && rootIsTemplate))
6460 AUTO_TRACE_ADD(
"Comparing return types: template v.s. non-template");
6464 AUTO_TRACE_ADD(
"Match results of matchArguments2='{}' substDone='{}'",matching,substDone);
6475 if (!funcTempList.
empty() &&
6495 else if (cd && cd!=tcd)
6501 if (memFound)
break;
6505 addLocalObjCMethod(root,scopeName,funcType,funcName,funcArgs,exceptions,funcDecl,spec);
6508 if (count==0 && !(isFriend && funcType==
"class"))
6511 const ClassDef *ecd =
nullptr, *ucd =
nullptr;
6512 MemberDef *emd =
nullptr, *umd =
nullptr;
6514 for (
const auto &md : *mn)
6536 AUTO_TRACE_ADD(
"new candidate className='{}' scope='{}' args='{}': exact match",
6537 className,ccd->
name(),md->argsString());
6543 AUTO_TRACE_ADD(
"new candidate className='{}' scope='{}' args='{}': no match",
6544 className,ccd->
name(),md->argsString());
6549 bool strictProtoMatching =
Config_getBool(STRICT_PROTO_MATCHING);
6550 if (!strictProtoMatching)
6552 if (candidates==1 && ucd && umd)
6559 else if (candidates>1 && ecd && emd)
6570 if (noMatchCount>1) warnMsg+=
"uniquely ";
6571 warnMsg+=
"matching class member found for \n";
6575 warnMsg+=
" template ";
6580 DString fullFuncDecl=funcDecl;
6584 warnMsg+=fullFuncDecl;
6586 if (candidates>0 || noMatchCount>=1)
6588 warnMsg+=
"\nPossible candidates:";
6594 for (
const auto &md : *mn)
6596 const ClassDef *cd=md->getClassDef();
6610 warnMsg+=
"template ";
6615 if (!md->typeString().empty())
6617 warnMsg+=md->typeString();
6621 if (!qScope.
empty())
6622 warnMsg+=qScope+
"::"+md->name();
6623 warnMsg+=md->argsString();
6624 warnMsg+=
"' " +
warn_line(md->getDefFileName(),md->getDefLine());
6645 AUTO_TRACE(
"funcType={} funcName={} funcArgs={} funcDecl={} spec={}",funcType,funcName,funcArgs,funcDecl,spec);
6647 for (
const auto &md : *mn)
6649 if (md->getClassDef()==cd)
6661 funcType,funcName,funcArgs,exceptions,
6667 mmd->setTagInfo(root->
tagInfo());
6668 mmd->setLanguage(root->
lang);
6669 mmd->setId(root->
id);
6670 mmd->setMemberClass(cd);
6671 mmd->setTemplateSpecialization(
true);
6673 mmd->setDefinition(funcDecl);
6679 mmd->setDocsForDefinition(!root->
proto);
6681 mmd->addSectionsToDefinition(root->
anchors);
6685 mmd->setMemberSpecifiers(spec);
6686 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6687 mmd->setMemberGroupId(root->
mGrpId);
6689 mmd->setRefItems(root->
sli);
6690 mmd->setRequirementReferences(root->
rqli);
6704 bool sameClass=
false;
6709 [](
const auto &md1,
const auto &md2)
6710 { return md1->getClassDef()->name()==md2->getClassDef()->name(); });
6716 if (cd==
nullptr)
return;
6719 if (root->
mtype==MethodTypes::Signal) mtype=MemberType::Signal;
6720 else if (root->
mtype==MethodTypes::Slot) mtype=MemberType::Slot;
6721 else if (root->
mtype==MethodTypes::DCOP) mtype=MemberType::DCOP;
6724 std::unique_ptr<ArgumentList> tArgList =
6729 funcType,funcName,funcArgs,exceptions,
6733 mmd->setTagInfo(root->
tagInfo());
6734 mmd->setLanguage(root->
lang);
6735 mmd->setId(root->
id);
6737 mmd->setMemberClass(cd);
6738 mmd->setDefinition(funcDecl);
6747 mmd->setDocsForDefinition(!root->
proto);
6749 mmd->addSectionsToDefinition(root->
anchors);
6753 mmd->setMemberSpecifiers(spec);
6754 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6755 mmd->setMemberGroupId(root->
mGrpId);
6758 mmd->setRefItems(root->
sli);
6759 mmd->setRequirementReferences(root->
rqli);
6817 AUTO_TRACE(
"root='{}' funcDecl='{}' related='{}' overload={} isFunc={} mGrpId={} #tArgList={} spec={} lang={}",
6830 bool isRelated=
false;
6831 bool isMemberOf=
false;
6832 bool isFriend=
false;
6845 spec.setInline(
true);
6850 spec.setExplicit(
true);
6855 spec.setMutable(
true);
6860 spec.setThreadLocal(
true);
6877 if (!funcDecl.
empty() && funcDecl[0]!=
' ') funcDecl.
prepend(
" ");
6889 if (isFriend && funcDecl.
startsWith(
"class "))
6892 funcDecl=funcDecl.
mid(6);
6893 funcName = funcDecl;
6895 else if (isFriend && funcDecl.
startsWith(
"struct "))
6897 funcDecl=funcDecl.
mid(7);
6898 funcName = funcDecl;
6904 funcArgs,funcTempList,exceptions
6912 AUTO_TRACE_ADD(
"scopeName='{}' className='{}' namespaceName='{}' funcType='{}' funcName='{}' funcArgs='{}'",
6913 scopeName,className,namespaceName,funcType,funcName,funcArgs);
6914 if (!relates.
empty())
6917 isMemberOf=(root->
relatesType == RelatesType::MemberOf);
6924 scopeName = relates;
6934 if (!scopeName.
empty() &&
6937 scopeName = joinedName;
6951 DString joinedName = fnd->name()+
"::"+scopeName;
6954 scopeName=joinedName;
6981 AUTO_TRACE_ADD(
"scopeName='{}' className='{}' namespaceName='{}'",scopeName,className,namespaceName);
6986 if (!namespaceName.
empty())
6988 if (className.
empty())
6990 scopeName=namespaceName;
6992 else if (!relates.
empty() ||
6995 scopeName=namespaceName+
"::"+className;
6999 scopeName=className;
7002 else if (!className.
empty())
7004 scopeName=className;
7008 DString tempScopeName=scopeName;
7012 if (funcSpec.
empty())
7014 uint32_t argListIndex=0;
7019 tempScopeName=scopeName+funcSpec;
7027 if (!scopeName.
empty() && !isRelated && !isFriend && !
Config_getBool(HIDE_SCOPE_NAMES) && root->
lang!=SrcLangExt::Python)
7029 if (!funcType.
empty())
7033 funcDecl=funcType+
" "+tempScopeName+
"::"+funcName+funcTempList;
7037 funcDecl=funcType+
" "+tempScopeName+
"::"+funcName+funcArgs;
7044 funcDecl=tempScopeName+
"::"+funcName+funcTempList;
7048 funcDecl=tempScopeName+
"::"+funcName+funcArgs;
7054 if (!funcType.
empty())
7058 funcDecl=funcType+
" "+funcName+funcTempList;
7062 funcDecl=funcType+
" "+funcName+funcArgs;
7069 funcDecl=funcName+funcTempList;
7073 funcDecl=funcName+funcArgs;
7078 if (funcType==
"template class" && !funcTempList.
empty())
7081 AUTO_TRACE_ADD(
"Parse results: namespaceName='{}' className=`{}` funcType='{}' funcSpec='{}' "
7082 " funcName='{}' funcArgs='{}' funcTempList='{}' funcDecl='{}' relates='{}'"
7083 " exceptions='{}' isRelated={} isMemberOf={} isFriend={} isFunc={}",
7084 namespaceName, className, funcType, funcSpec,
7085 funcName, funcArgs, funcTempList, funcDecl, relates,
7086 exceptions, isRelated, isMemberOf, isFriend, isFunc);
7088 if (!funcName.
empty())
7092 bool strongEnum =
false;
7096 for (
const auto &imd : *mn)
7107 if (!namespaceName.
empty())
7109 namespaceName+=
"::"+className;
7113 namespaceName=className;
7121 funcName =
substitute(funcName,className+
"::",
"");
7124 if (!funcTempList.
empty())
7132 if (!isRelated && !strongEnum && mn)
7135 if (!className.
empty())
7137 if (funcSpec.
empty())
7140 funcArgs,funcTempList,exceptions,
7141 type,args,isFriend,spec,relates,funcDecl,overloaded,isFunc);
7153 else if (overloaded)
7155 addOverloaded(root,mn,funcType,funcName,funcArgs,funcDecl,exceptions,spec);
7159 if (!
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec))
7161 DString fullFuncDecl=funcDecl;
7164 "Cannot determine class for function\n{}",
7170 else if (isRelated && !relates.
empty())
7172 AUTO_TRACE_ADD(
"related function scopeName='{}' className='{}'",scopeName,className);
7173 if (className.
empty()) className=relates;
7177 bool newMember=
true;
7183 for (
const auto &imd : *mn)
7217 mn->
push_back(std::move(mdDefineTaken));
7231 for (
const auto &irmd : *mn)
7252 addMemberDocs(root,rmd_found,funcDecl,
nullptr,overloaded,spec);
7260 switch (root->
mtype)
7262 case MethodTypes::Method: mtype = MemberType::Function;
break;
7263 case MethodTypes::Signal: mtype = MemberType::Signal;
break;
7264 case MethodTypes::Slot: mtype = MemberType::Slot;
break;
7265 case MethodTypes::DCOP: mtype = MemberType::DCOP;
break;
7266 case MethodTypes::Property: mtype = MemberType::Property;
break;
7267 case MethodTypes::Event: mtype = MemberType::Event;
break;
7281 funcType,funcName,funcArgs,exceptions,
7284 isMemberOf ? Relationship::Foreign : Relationship::Related,
7304 mmd->setDefinitionTemplateParameterLists(root->
tArgLists);
7306 mmd->setTagInfo(root->
tagInfo());
7320 for (
const auto &irmd : *rmn)
7351 mmd->setBodyDef(fd);
7358 mmd->setMemberClass(cd);
7359 mmd->setMemberSpecifiers(spec);
7360 mmd->setVhdlSpecifiers(root->
vhdlSpec);
7361 mmd->setDefinition(funcDecl);
7366 mmd->setDocsForDefinition(!root->
proto);
7369 mmd->addSectionsToDefinition(root->
anchors);
7370 mmd->setMemberGroupId(root->
mGrpId);
7371 mmd->setLanguage(root->
lang);
7372 mmd->setId(root->
id);
7376 mmd->setRefItems(root->
sli);
7377 mmd->setRequirementReferences(root->
rqli);
7378 if (root->
relatesType==RelatesType::Duplicate) mmd->setRelatedAlso(cd);
7386 if (!
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec))
7388 DString fullFuncDecl=funcDecl;
7391 "Cannot determine file/namespace for relatedalso function\n{}",
7405 addLocalObjCMethod(root,scopeName,funcType,funcName,funcArgs,exceptions,funcDecl,spec);
7409 bool globMem =
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec);
7410 if (className.
empty() && !globMem)
7414 else if (!className.
empty() && !globMem)
7417 "member '{}' of class '{}' cannot be found",
7418 funcName,className);
7436 AUTO_TRACE(
"root->type='{}' root->inside='{}' root->name='{}' root->args='{}' section={} root->spec={} root->mGrpId={}",
7451 type=type.
left(i+l);
7462 if (root->
section.isMemberDoc())
7488 else if (root->
section.isOverloadDoc())
7502 (root->
section.isVariable() &&
7520 type+
" "+root->
name,
7524 else if (!type.
empty())
7553 else if (root->
section.isVariableDoc())
7565 else if (root->
section.isExportedInterface() ||
7566 root->
section.isIncludedService())
7572 type +
" " + root->
name,
7585 if (root->
section.isMemberDoc() ||
7586 root->
section.isOverloadDoc() ||
7589 root->
section.isVariableDoc() ||
7591 root->
section.isIncludedService() ||
7592 root->
section.isExportedInterface()
7602 for (
const auto &e : root->
children())
7604 if (!e->section.isEnum())
7616 for (
const auto &objCImpl : root->
children())
7618 if (objCImpl->section.isObjcImpl())
7620 for (
const auto &objCMethod : objCImpl->children())
7622 if (objCMethod->section.isFunction())
7626 objCMethod->relates,
7629 objCMethod->type+
" "+objCImpl->name+
"::"+objCMethod->name+
" "+objCMethod->args,
7631 objCMethod->section=EntryType::makeEmpty();
7650 bool isGlobal =
false;
7651 bool isRelated =
false;
7652 bool isMemberOf =
false;
7661 if (root->
lang==SrcLangExt::CSharp)
7684 isMemberOf=(root->
relatesType==RelatesType::MemberOf);
7692 if (cd && !name.
empty())
7719 isMemberOf ? Relationship::Foreign : isRelated ? Relationship::Related : Relationship::Member,
7720 MemberType::Enumeration,
7723 mmd->setTagInfo(root->
tagInfo());
7724 mmd->setLanguage(root->
lang);
7725 mmd->setId(root->
id);
7726 if (!isGlobal) mmd->setMemberClass(cd);
else mmd->setFileDef(fd);
7728 mmd->setBodyDef(root->
fileDef());
7729 mmd->setMemberSpecifiers(root->
spec);
7730 mmd->setVhdlSpecifiers(root->
vhdlSpec);
7731 mmd->setEnumBaseType(root->
args);
7734 mmd->addSectionsToDefinition(root->
anchors);
7735 mmd->setMemberGroupId(root->
mGrpId);
7739 mmd->setRefItems(root->
sli);
7740 mmd->setRequirementReferences(root->
rqli);
7745 if (!baseType.
empty())
7754 mmd->setDefinition(name+baseType);
7758 mmd->setDefinition(nd->
name()+
"::"+name+baseType);
7762 mmd->setNamespace(nd);
7769 if (isGlobal && (nd==
nullptr || !nd->
isAnonymous()))
7771 if (!defSet) mmd->setDefinition(name+baseType);
7772 if (fd==
nullptr && root->
parent())
7778 mmd->setFileDef(fd);
7786 mmd->setDefinition(name+baseType);
7790 mmd->setDefinition(cd->
name()+
"::"+name+baseType);
7796 mmd->setDocsForDefinition(!root->
proto);
7826 bool isGlobal =
false;
7827 bool isRelated =
false;
7836 if (root->
lang==SrcLangExt::CSharp)
7851 if (root->
lang==SrcLangExt::CSharp)
7870 if (cd && !name.
empty())
7897 struct EnumValueInfo
7899 EnumValueInfo(
const DString &n,std::unique_ptr<MemberDef> &&md) :
7900 name(n), member(std::move(md)) {}
7902 std::unique_ptr<MemberDef> member;
7904 std::vector< EnumValueInfo > extraMembers;
7906 for (
const auto &imd : *mn)
7913 for (
const auto &e : root->
children())
7916 bool isJavaLike = sle==SrcLangExt::CSharp || sle==SrcLangExt::Java || sle==SrcLangExt::XML;
7917 if ( isJavaLike || root->
spec.isStrong())
7919 if (sle == SrcLangExt::Cpp && e->section.isDefine())
continue;
7926 if (
size_t i = qualifiedName.
rfind(
"::"); i!=
DString::npos && sle==SrcLangExt::CSharp)
7932 qualifiedName=
substitute(qualifiedName,
"::",
".");
7936 DString fileName = e->fileName;
7937 if (fileName.
empty() && e->tagInfo())
7939 fileName = e->tagInfo()->tagName;
7943 fileName,e->startLine,e->startColumn,
7944 e->type,e->name,e->args,
DString(),
7945 e->protection, Specifier::Normal,e->isStatic,Relationship::Member,
7952 fmmd->setNamespace(mnd);
7956 fmmd->setTagInfo(e->tagInfo());
7957 fmmd->setLanguage(e->lang);
7958 fmmd->setBodySegment(e->startLine,e->bodyLine,e->endBodyLine);
7959 fmmd->setBodyDef(e->fileDef());
7961 fmmd->setDocumentation(e->doc,e->docFile,e->docLine);
7962 fmmd->setBriefDescription(e->brief,e->briefFile,e->briefLine);
7963 fmmd->addSectionsToDefinition(e->anchors);
7964 fmmd->setInitializer(e->initializer.str());
7965 fmmd->setMaxInitLines(e->initLines);
7966 fmmd->setMemberGroupId(e->mGrpId);
7967 fmmd->setExplicitExternal(e->explicitExternal,fileName,e->startLine,e->startColumn);
7968 fmmd->setRefItems(e->sli);
7969 fmmd->setRequirementReferences(e->rqli);
7972 fmmd->setEnumScope(md,
true);
7973 extraMembers.emplace_back(e->name,std::move(fmd));
7982 if (!e->name.empty() && (fmn=emnsd->
find(e->name)))
7985 for (
const auto &ifmd : *fmn)
8016 else if (isRelated && cd)
8048 for (
auto &e : extraMembers)
8094 if (gd==
nullptr && !root->
groups.empty())
8108 for (
const auto &g : root->
groups)
8127 "Found non-existing group '{}' for the command '{}', ignoring command",
8141 if (root->
section.isEnumDoc() &&
8166 AUTO_TRACE(
"Found docs for enum with name '{}' and scope '{}' in context '{}' cd='{}', nd='{}' fd='{}'",
8180 for (
const auto &imd : *mn)
8195 else if (cd==
nullptr && mcd==
nullptr && nd!=
nullptr && mnd==nd)
8202 else if (cd==
nullptr && nd==
nullptr && mcd==
nullptr && mnd==
nullptr && fd==mfd)
8227 for (
const auto &mn : mnsd)
8230 for (
const auto &imd : *mn)
8235 int documentedEnumValues=0;
8239 if (fmd->isLinkableInProject()) documentedEnumValues++;
8265 for (
const auto &md : *mn)
8267 index.addClassMemberNameToIndex(md.get());
8268 if (md->getModuleDef())
8270 index.addModuleMemberNameToIndex(md.get());
8278 for (
const auto &md : *mn)
8280 if (md->getNamespaceDef())
8282 index.addNamespaceMemberNameToIndex(md.get());
8286 index.addFileMemberNameToIndex(md.get());
8288 if (md->getModuleDef())
8290 index.addModuleMemberNameToIndex(md.get());
8295 index.sortMemberIndexLists();
8304 if (cd->isLinkableInProject())
8317 if (cd->isLinkableInProject())
8330 if (nd->isLinkableInProject())
8343 for (
const auto &fd : *fn)
8359 std::string s = title.str();
8360 static const reg::Ex re(R
"(\a[\w-]*)");
8363 for (; it!=
end ; ++it)
8365 const auto &match = *it;
8366 std::string matchStr = match.str();
8374 if (gd->isLinkableInProject())
8376 addWordsForTitle(gd.get(),gd->anchor(),gd->groupTitle());
8382 if (pd->isLinkableInProject())
8384 addWordsForTitle(pd.get(),pd->anchor(),pd->title());
8393 auto addMemberToSearchIndex = [](
const MemberDef *md)
8399 DString qn=md->qualifiedName();
8404 if (md->getClassDef())
8408 if (md->getNamespaceDef())
8419 if (md->getGroupDef()) scope = md->getGroupDef();
8420 else if (md->getClassDef()) scope = md->getClassDef();
8421 else if (md->getNamespaceDef()) scope = md->getNamespaceDef();
8422 else if (md->getFileDef()) scope = md->getFileDef();
8426 auto addMemberToIndices = [addMemberToSearchIndex,getScope](
const MemberDef *md)
8428 if (md->isLinkableInProject())
8430 if (!(md->isEnumerate() && md->isAnonymous()))
8433 addMemberToSearchIndex(md);
8435 if (md->isEnumerate())
8437 for (
const auto &fmd : md->enumFieldList())
8440 addMemberToSearchIndex(fmd);
8450 for (
const auto &md : *mn)
8452 addMemberToIndices(md.get());
8459 for (
const auto &md : *mn)
8461 addMemberToIndices(md.get());
8474 for (
const auto &imd : *mn)
8487 for (
const auto &imd : *mn)
8504 for (
const auto &imd : *mn)
8513 const auto &bmni = bmn.
find(mn->memberName());
8516 for (
const auto &ibmd : *bmni)
8524 lang==SrcLangExt::Python ||
8525 lang==SrcLangExt::Java ||
8526 lang==SrcLangExt::PHP ||
8537 lang==SrcLangExt::Python ||
8544 if (lang==SrcLangExt::Python && md->
name().
startsWith(
"__"))
continue;
8584 if (cd->isLinkable())
8586 for (
const auto &bcd : cd->baseClasses())
8602 for (
const auto &ti : cd->getTemplateInstances())
8627 AUTO_TRACE_ADD(
"merging members of category {} into {}",cd->name(),baseClass->
name());
8642 cd->subClasses().empty() &&
8643 !cd->baseClasses().empty())
8674 msg(
"Generating code for file {}...\n",fd->
docName());
8679 else if (parseSources)
8681 msg(
"Parsing code for file {}...\n",fd->
docName());
8697 for (
const auto &fd : *fn)
8705 for (
const auto &fd : *fn)
8714 clangParser->parse();
8715 processSourceFile(fd.get(),*
g_outputList,clangParser.get());
8717 for (
auto incFile : clangParser->filesInSameTU())
8719 if (filesToProcess.find(incFile)!=filesToProcess.end() &&
8721 processedFiles.
find(incFile)==processedFiles.end())
8728 processSourceFile(ifd,*
g_outputList,clangParser.get());
8729 processedFiles.insert(incFile);
8740 for (
const auto &fd : *fn)
8742 if (processedFiles.find(fd->
absFilePath().
str())==processedFiles.end())
8747 clangParser->parse();
8748 processSourceFile(fd.get(),*
g_outputList,clangParser.get());
8761 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8764 msg(
"Generating code files using {} threads.\n",numThreads);
8765 struct SourceContext
8768 : fd(fd_), generateSourceFile(gen_), ol(ol_) {}
8770 bool generateSourceFile;
8774 std::vector< std::future< std::shared_ptr<SourceContext> > > results;
8777 for (
const auto &fd : *fn)
8780 auto ctx = std::make_shared<SourceContext>(fd.get(),generateSourceFile,*
g_outputList);
8781 auto processFile = [ctx]()
8783 if (ctx->generateSourceFile)
8785 msg(
"Generating code for file {}...\n",ctx->fd->docName());
8789 msg(
"Parsing code for file {}...\n",ctx->fd->docName());
8792 ctx->fd->getAllIncludeFilesRecursively(filesInSameTu);
8793 if (ctx->generateSourceFile)
8795 ctx->fd->writeSourceHeader(ctx->ol);
8796 ctx->fd->writeSourceBody(ctx->ol,
nullptr);
8797 ctx->fd->writeSourceFooter(ctx->ol);
8802 ctx->fd->parseSource(
nullptr);
8806 results.emplace_back(threadPool.
queue(processFile));
8809 for (
auto &f : results)
8818 for (
const auto &fd : *fn)
8838 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8844 : fd(fd_), ol(ol_) {}
8849 std::vector< std::future< std::shared_ptr<DocContext> > > results;
8852 for (
const auto &fd : *fn)
8854 bool doc = fd->isLinkableInProject();
8857 auto ctx = std::make_shared<DocContext>(fd.get(),*
g_outputList);
8858 auto processFile = [ctx]() {
8859 msg(
"Generating docs for file {}...\n",ctx->fd->docName());
8860 ctx->fd->writeDocumentation(ctx->ol);
8863 results.emplace_back(threadPool.
queue(processFile));
8867 for (
auto &f : results)
8876 for (
const auto &fd : *fn)
8878 bool doc = fd->isLinkableInProject();
8881 msg(
"Generating docs for file {}...\n",fd->docName());
8900 const_cast<FileDef*
>(fd)->addSourceRef(cd->getStartDefLine(),cd.get(),
nullptr);
8909 const_cast<FileDef*
>(fd)->addSourceRef(cd->getStartDefLine(),cd.get(),
nullptr);
8918 const_cast<FileDef*
>(fd)->addSourceRef(nd->getStartDefLine(),nd.get(),
nullptr);
8925 for (
const auto &md : *mn)
8934 md->isLinkableInProject() &&
8940 const_cast<FileDef*
>(fd)->addSourceRef(md->getStartDefLine(),md->getOuterScope(),md.get());
8946 for (
const auto &md : *mn)
8956 md->isLinkableInProject() &&
8962 const_cast<FileDef*
>(fd)->addSourceRef(md->getStartDefLine(),md->getOuterScope(),md.get());
8979 for (
const auto &def : it->second)
8982 def.fileName,def.lineNr,def.columnNr,
8983 "#define",def.name,def.args,
DString(),
8984 Protection::Public,Specifier::Normal,
false,Relationship::Member,MemberType::Define,
8988 if (!def.args.empty())
8992 mmd->setInitializer(def.definition);
8993 mmd->setFileDef(def.fileDef);
8994 mmd->setDefinition(
"#define "+def.name);
8999 const MemberList *defMl = def.fileDef->getMemberList(MemberListType::DocDefineMembers());
9008 def.fileDef->insertMember(md.get());
9010 AUTO_TRACE_ADD(
"adding macro {} with definition {}",def.name,def.definition);
9044 for (
const auto &fd : *fn)
9046 fd->sortMemberLists();
9053 gd->sortMemberLists();
9070 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
9074 std::vector < std::future< void > > results;
9078 for (
const auto &def : symList)
9081 if (dm && !
isSymbolHidden(def) && !def->isArtificial() && def->isLinkableInProject())
9083 auto processTooltip = [dm]() {
9086 results.emplace_back(threadPool.
queue(processTooltip));
9091 for (
auto &f : results)
9100 for (
const auto &def : symList)
9103 if (dm && !
isSymbolHidden(def) && !def->isArtificial() && def->isLinkableInProject())
9150 for (
const auto &fd : *fn)
9172 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
9178 : cd(cd_), ol(ol_) {}
9183 std::vector< std::future< std::shared_ptr<DocContext> > > results;
9184 for (
const auto &cd : classList)
9187 if (cd->getOuterScope()==
nullptr ||
9191 auto ctx = std::make_shared<DocContext>(cd,*
g_outputList);
9192 auto processFile = [ctx]()
9194 msg(
"Generating docs for compound {}...\n",ctx->cd->displayName());
9198 if (!ctx->cd->isHidden() && !ctx->cd->isEmbeddedInOuterScope() &&
9199 ctx->cd->isLinkableInProject() && !ctx->cd->isImplicitTemplateInstance())
9201 ctx->cd->writeDocumentation(ctx->ol);
9202 ctx->cd->writeMemberList(ctx->ol);
9206 ctx->cd->writeDocumentationForInnerClasses(ctx->ol);
9209 results.emplace_back(threadPool.
queue(processFile));
9212 for (
auto &f : results)
9219 for (
const auto &cd : classList)
9223 if (cd->getOuterScope()==
nullptr ||
9229 if ( !cd->isHidden() && !cd->isEmbeddedInOuterScope() &&
9230 cd->isLinkableInProject() && !cd->isImplicitTemplateInstance())
9232 msg(
"Generating docs for compound {}...\n",cd->displayName());
9247 for (
const auto &innerCdi : cd->
getClasses())
9252 AUTO_TRACE(
"innerCd={} isLinkable={} isImplicitTemplateInstance={} protectLevelVisible={} embeddedInOuterScope={}",
9261 list.push_back(innerCd);
9269 std::vector<ClassDefMutable*> classList;
9318 for (
const auto &imd : *mn)
9354 for (
const auto &fd : *fn)
9356 fd->combineUsingRelations();
9388 for (
const auto &fd : *fn)
9390 fd->addMembersToMemberGroup();
9405 gd->addMembersToMemberGroup();
9426 for (
const auto &fd : *fn)
9428 fd->distributeMemberGroupDocumentation();
9443 gd->distributeMemberGroupDocumentation();
9473 for (
const auto &fd : *fn)
9475 fd->findSectionsInDocumentation();
9490 gd->findSectionsInDocumentation();
9495 pd->findSectionsInDocumentation();
9500 dd->findSectionsInDocumentation();
9523 for (
const auto &ifmd : *fn)
9537 for (
const auto &imd : *nm)
9568 for (
const auto &imd : *nm)
9588 return fd->absFilePath() == root->
fileName;
9633 Protection::Public,Specifier::Normal,
false,Relationship::Member,MemberType::Define,
9636 mmd->setTagInfo(root->
tagInfo());
9637 mmd->setLanguage(root->
lang);
9649 for (
const auto &md : *mn)
9651 if (md->memberType()==MemberType::Define) count++;
9655 for (
const auto &imd : *mn)
9658 if (md && md->
memberType()==MemberType::Define)
9673 for (
const auto &imd : *mn)
9676 if (md && md->
memberType()==MemberType::Define)
9700 warn(root->
fileName,root->
startLine,
"found documented #define {} but ignoring it because ENABLE_PREPROCESSING is NO.", root->
name);
9714 normalizedName =
substitute(normalizedName,
"\\",
"/");
9717 if (root->
docFile==normalizedName)
9721 normalizedName=normalizedName.
left(lastSlashPos);
9724 if (normalizedName.
at(normalizedName.
length()-1)!=
'/')
9726 normalizedName+=
'/';
9728 DirDef *matchingDir=
nullptr;
9732 if (dir->name().right(normalizedName.
length())==normalizedName)
9737 "\\dir command matches multiple directories.\n"
9738 " Applying the command for directory {}\n"
9739 " Ignoring the command for directory {}",
9740 matchingDir->
name(),dir->name()
9745 matchingDir=dir.get();
9762 warn(root->
fileName,root->
startLine,
"No matching directory found for command \\dir {}",normalizedName);
9771 if (root->
section.isRequirementDoc())
9783 if (root->
section.isPageDoc())
9790 else if (root->
section.isMainpageDoc())
9810 if (root->
section.isMainpageDoc())
9843 else if (si->
lineNr() != -1)
9845 warn(root->
fileName,root->
startLine,
"multiple use of section label '{}' for main page, (first occurrence: {}, line {})",
9850 warn(root->
fileName,root->
startLine,
"multiple use of section label '{}' for main page, (first occurrence: {})",
9867 else if (root->
tagInfo()==
nullptr)
9870 "found more than one \\mainpage comment block! (first occurrence: {}, line {}), Skipping current block!",
9880 if (root->
section.isMainpageDoc())
9904 term(
"page defined {} with label {} is a direct "
9905 "subpage of itself! Please remove this cyclic dependency.\n",
9929 term(
"page defined {} with label {} is a subpage "
9930 "of itself! Please remove this cyclic dependency.\n",
9931 warn_line(pd->docFile(),pd->docLine()),pd->name());
9956 DString label=
"_"+rl->listName();
9957 if (si->label().left(label.
length())==label)
9959 si->setFileName(rl->listName());
9960 si->setGenerated(
true);
9966 if (!si->generated())
9970 if (!si->fileName().empty() &&
9977 if (si->definition())
9984 gd = (
toMemberDef(si->definition()))->getGroupDef();
10014 if (!pd->getGroupDef() && !pd->isReference())
10016 msg(
"Generating docs for page {}...\n",pd->name());
10031 warn(root->
fileName,root->
startLine,
"Example {} was already documented. Ignoring documentation found here.",root->
name);
10059 indentStr.
fill(
' ',indent);
10061 indentStr.
empty()?
"":indentStr,
10066 for (
const auto &e : root->
children())
10084 si->label(),si->fileName(),si->title(),si->type().level(),si->ref());
10098 msg(
"Generating docs for example {}...\n",pd->name());
10100 if (lang != SrcLangExt::Unknown)
10104 intf->resetCodeParserState();
10106 DString n=pd->getOutputFileBase();
10113 if (pd->showLineNo())
10115 lineNoOptStr=
"{lineno}";
10121 (pd->briefDescription().empty()?
"":pd->briefDescription()+
"\n\n")+
10122 pd->documentation()+
"\n\n\\include"+lineNoOptStr+
" "+pd->name(),
10124 .setIndexWords(
true)
10125 .setExample(pd->name()));
10138 if (!gd->isReference())
10150 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10156 : cdm(cdm_), ol(ol_) {}
10161 std::vector< std::future< std::shared_ptr<DocContext> > > results;
10163 for (
const auto &cd : classList)
10168 auto ctx = std::make_shared<DocContext>(cdm,*
g_outputList);
10169 auto processFile = [ctx]()
10171 if ( ( ctx->cdm->isLinkableInProject() &&
10172 !ctx->cdm->isImplicitTemplateInstance()
10175 && !ctx->cdm->isHidden() && !ctx->cdm->isEmbeddedInOuterScope()
10178 msg(
"Generating docs for compound {}...\n",ctx->cdm->displayName());
10179 ctx->cdm->writeDocumentation(ctx->ol);
10180 ctx->cdm->writeMemberList(ctx->ol);
10182 ctx->cdm->writeDocumentationForInnerClasses(ctx->ol);
10185 results.emplace_back(threadPool.
queue(processFile));
10189 for (
auto &f : results)
10191 auto ctx = f.get();
10197 for (
const auto &cd : classList)
10202 if ( ( cd->isLinkableInProject() &&
10203 !cd->isImplicitTemplateInstance()
10206 && !cd->isHidden() && !cd->isEmbeddedInOuterScope()
10209 msg(
"Generating docs for compound {}...\n",cd->displayName());
10223 for (
const auto &cd : conceptList)
10228 msg(
"Generating docs for concept {}...\n",cd->name());
10243 if (nd->isLinkableInProject())
10248 msg(
"Generating docs for namespace {}\n",nd->displayName());
10286 DString cmd=qhgLocation+
" -v 2>&1";
10291 err(
"could not execute {}\n",qhgLocation);
10295 const size_t bufSize = 1024;
10296 char inBuf[bufSize+1];
10297 size_t numRead=fread(inBuf,1,bufSize,f);
10298 inBuf[numRead] =
'\0';
10303 static const reg::Ex versionReg(R
"(Qt (\d+)\.(\d+)\.(\d+))");
10305 std::string s = inBuf;
10312 if (qtVersion>0 && (qtVersion<60000 || qtVersion >= 60205))
10321 err(
"could not execute {}\n",qhgLocation);
10325 std::string output;
10326 while ((numRead=fread(inBuf,1,bufSize,f))>0)
10328 inBuf[numRead] =
'\0';
10351 if (!dotPath.
empty())
10360 warn_uncond(
"the dot tool could not be found as '{}'\n",dotPath);
10366 size_t l=dotPath.
length();
10367 for (
size_t i=0;i<l;i++)
if (dotPath.
at(i)==
'/') dotPath.
at(i)=
'\\';
10386 bool updateOnly=
false)
10390 bool writeToStdout=configFile==
"-";
10395 if (!writeToStdout)
10399 msg(
"\n\nConfiguration file '{}' created.\n\n",configFile);
10400 msg(
"Now edit the configuration file and enter\n\n");
10401 if (configFile!=
"Doxyfile" && configFile!=
"doxyfile")
10402 msg(
" doxygen {}\n\n",configFile);
10404 msg(
" doxygen\n\n");
10405 msg(
"to generate the documentation for your project\n\n");
10409 msg(
"\n\nConfiguration file '{}' updated.\n\n",configFile);
10415 term(
"Cannot open file {} for writing\n",configFile);
10430 term(
"Cannot open stdout for writing\n");
10445 if (fileName.
empty() || destName.
empty())
return;
10450 fileName = tagLine;
10456 err(
"Tag file '{}' does not exist or is not a file. Skipping it...\n",fileName);
10464 if (!destName.
empty())
10467 msg(
"Reading tag file '{}', location '{}'...\n",fileName,destName);
10471 msg(
"Reading tag file '{}'...\n",fileName);
10481 for (
const auto &sheet : latexExtraStyleSheet)
10483 std::string fileName = sheet;
10484 if (!fileName.empty())
10489 err(
"Style sheet '{}' specified by LATEX_EXTRA_STYLESHEET does not exist!\n",fileName);
10491 else if (fi.
isDir())
10493 err(
"Style sheet '{}' specified by LATEX_EXTRA_STYLESHEET is a directory, it has to be a file!\n", fileName);
10512 if (!htmlStyleSheet.
empty())
10519 err(
"Style sheet '{}' specified by HTML_STYLESHEET does not exist!\n",htmlStyleSheet);
10522 else if (fi.
isDir())
10524 err(
"Style sheet '{}' specified by HTML_STYLESHEET is a directory, it has to be a file!\n",htmlStyleSheet);
10530 copyFile(htmlStyleSheet,destFileName);
10535 for (
const auto &sheet : htmlExtraStyleSheet)
10543 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET does not exist!\n",fileName);
10547 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET is already a built-in stylesheet. Please use a different name\n",fi.
fileName());
10549 else if (fi.
isDir())
10551 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET is a directory, it has to be a file!\n",fileName);
10565 if (!projectLogo.
empty())
10570 err(
"Project logo '{}' specified by PROJECT_LOGO does not exist!\n",projectLogo);
10573 else if (fi.
isDir())
10575 err(
"Project logo '{}' specified by PROJECT_LOGO is a directory, it has to be a file!\n",projectLogo);
10581 copyFile(projectLogo,destFileName);
10590 if (!projectIcon.
empty())
10595 err(
"Project icon '{}' specified by PROJECT_ICON does not exist!\n",projectIcon);
10598 else if (fi.
isDir())
10600 err(
"Project icon '{}' specified by PROJECT_ICON is a directory, it has to be a file!\n",projectIcon);
10606 copyFile(projectIcon,destFileName);
10614 for (
const auto &fileName : files)
10616 if (!fileName.empty())
10621 err(
"Extra file '{}' specified in {} does not exist!\n", fileName,filesOption);
10623 else if (fi.
isDir())
10625 err(
"Extra file '{}' specified in {} is a directory, it has to be a file!\n", fileName,filesOption);
10645 FileEntry(
const DString &p,
FileDef *fd) : path(p), fileDef(fd) {}
10651 std::vector<FileEntry> fileEntries;
10652 for (
const auto &fd : *fn)
10654 if (!fd->isReference())
10656 fileEntries.emplace_back(fd->getPath(),fd.get());
10660 size_t size = fileEntries.size();
10664 FileDef *fd = fileEntries[0].fileDef;
10670 std::stable_sort(fileEntries.begin(),
10672 [](
const FileEntry &fe1,
const FileEntry &fe2)
10673 { return dstricmp_sort(fe1.path,fe2.path)<0; }
10678 const FileEntry &first = fileEntries[0];
10679 const FileEntry &last = fileEntries[size-1];
10680 int first_path_size =
static_cast<int>(first.path.size())-1;
10681 int last_path_size =
static_cast<int>(last.path.size())-1;
10684 for (i=0;i<first_path_size && i<last_path_size;i++)
10686 if (first.path[i]==
'/') j=i;
10687 if (first.path[i]!=last.path[i])
break;
10689 if (i==first_path_size && i<last_path_size && last.path[i]==
'/')
10694 else if (i==last_path_size && i<first_path_size && first.path[i]==
'/')
10701 for (
auto &fileEntry : fileEntries)
10703 DString prefix = fileEntry.path.right(fileEntry.path.length()-j-1);
10704 fileEntry.fileDef->setName(
prefix+fn->fileName());
10706 fileEntry.fileDef->setDiskName(
prefix+fn->fileName());
10720 size_t sep = fileName.
rfind(
'/');
10721 size_t ei = fileName.
rfind(
'.');
10724 extension=fileName.
mid(ei);
10728 extension =
".no_extension";
10743 extension=fileName.
mid(ei);
10747 extension =
".no_extension";
10751 std::string preBuf;
10758 for (
const auto &s : includePath)
10764 msg(
"Preprocessing {}...\n",fn);
10771 msg(
"Reading {}...\n",fn);
10776 std::string convBuf;
10777 convBuf.reserve(preBuf.size()+1024);
10782 std::shared_ptr<Entry> fileRoot = std::make_shared<Entry>();
10786 if (newTU) clangParser->
parse();
10789 parser.
parseInput(fileName,convBuf.
data(),fileRoot,clangParser);
10790 fileRoot->setFileDef(fd);
10807 filesToProcess.insert(s);
10810 std::mutex processedFilesLock;
10812 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10813 msg(
"Processing input using {} threads.\n",numThreads);
10815 using FutureType = std::vector< std::shared_ptr<Entry> >;
10816 std::vector< std::future< FutureType > > results;
10819 bool ambig =
false;
10826 auto processFile = [qs,&filesToProcess,&processedFilesLock,&processedFiles]() {
10827 bool ambig_l =
false;
10828 std::vector< std::shared_ptr<Entry> > roots;
10832 auto fileRoot {
parseFile(*parser.get(),fd_l,qs,clangParser.get(),
true) };
10833 roots.push_back(fileRoot);
10837 for (
auto incFile : clangParser->filesInSameTU())
10840 if (filesToProcess.find(incFile)!=filesToProcess.end())
10842 bool needsToBeProcessed =
false;
10844 std::lock_guard<std::mutex> lock(processedFilesLock);
10845 needsToBeProcessed = processedFiles.find(incFile)==processedFiles.end();
10846 if (needsToBeProcessed) processedFiles.insert(incFile);
10848 if (qincFile!=qs && needsToBeProcessed)
10854 fileRoot =
parseFile(*parser.get(),ifd,qincFile,clangParser.get(),
false);
10855 roots.push_back(fileRoot);
10863 results.emplace_back(threadPool.
queue(processFile));
10867 for (
auto &f : results)
10872 root->moveToSubEntryAndKeep(e);
10879 if (processedFiles.find(s)==processedFiles.end())
10882 auto processFile = [s]() {
10883 bool ambig =
false;
10885 std::vector< std::shared_ptr<Entry> > roots;
10892 auto fileRoot =
parseFile(*parser.get(),fd,qs,clangParser.get(),
true);
10893 roots.push_back(fileRoot);
10897 auto fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
10898 roots.push_back(fileRoot);
10902 results.emplace_back(threadPool.
queue(processFile));
10906 for (
auto &f : results)
10911 root->moveToSubEntryAndKeep(e);
10918 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10919 msg(
"Processing input using {} threads.\n",numThreads);
10921 using FutureType = std::shared_ptr<Entry>;
10922 std::vector< std::future< FutureType > > results;
10926 auto processFile = [s]() {
10927 bool ambig =
false;
10931 auto fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
10935 results.emplace_back(threadPool.
queue(processFile));
10938 for (
auto &f : results)
10940 root->moveToSubEntryAndKeep(f.get());
10958 filesToProcess.insert(s);
10964 bool ambig =
false;
10972 auto fileRoot =
parseFile(*parser.get(),fd,qs,clangParser.get(),
true);
10973 root->moveToSubEntryAndKeep(fileRoot);
10974 processedFiles.insert(s);
10978 for (
auto incFile : clangParser->filesInSameTU())
10981 if (filesToProcess.find(incFile)!=filesToProcess.end() &&
10982 processedFiles.find(incFile)==processedFiles.end())
10988 fileRoot =
parseFile(*parser.get(),ifd,incFile,clangParser.get(),
false);
10989 root->moveToSubEntryAndKeep(fileRoot);
10990 processedFiles.insert(incFile);
10999 if (processedFiles.find(s)==processedFiles.end())
11001 bool ambig =
false;
11008 auto fileRoot =
parseFile(*parser.get(),fd,qs,clangParser.get(),
true);
11009 root->moveToSubEntryAndKeep(fileRoot);
11014 std::shared_ptr<Entry> fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
11015 root->moveToSubEntryAndKeep(fileRoot);
11017 processedFiles.insert(s);
11026 bool ambig =
false;
11031 std::shared_ptr<Entry> fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
11032 root->moveToSubEntryAndKeep(std::move(fileRoot));
11052 sepPos = result.
find(
'/',2);
11054 sepPos = result.
find(
'/',sepPos+1);
11056 sepPos = result.
find(
'/',sepPos+1);
11059 if (nonSymlinks.find(
prefix.str())==nonSymlinks.end())
11076 target+=result.
mid(sepPos);
11079 if (known.find(result.
str())!=known.end())
return std::string();
11080 known.insert(result.
str());
11093 nonSymlinks.insert(
prefix.str());
11118 bool errorIfNotExist,
11125 if (paths && !dirName.empty())
11127 paths->insert(dirName);
11133 if (dirName.empty())
11148 msg(
"Searching for files in directory {}\n", fi->
absFilePath());
11155 for (
const auto &dirEntry : dir.
iterator())
11158 auto checkPatterns = [&]() ->
bool
11160 return (patList==
nullptr || cfi.
match(*patList,caseSenseNames)) &&
11161 (exclPatList==
nullptr || !cfi.
match(*exclPatList,caseSenseNames)) &&
11162 (killSet==
nullptr || killSet->find(cfi.
absFilePath())==killSet->end());
11165 if (exclSet==
nullptr || exclSet->find(cfi.
absFilePath())==exclSet->end())
11173 if (errorIfNotExist && checkPatterns())
11178 else if (cfi.
isFile() && checkPatterns())
11181 std::string path=cfi.
dirPath()+
"/";
11182 std::string fullName=path+name;
11189 fn = fnMap->
add(name);
11190 fn->push_back(std::move(fd));
11193 dirResultList.push_back(fullName);
11194 if (resultSet) resultSet->insert(fullName);
11195 if (killSet) killSet->insert(fullName);
11197 else if (recursive &&
11199 (exclPatList==
nullptr || !cfi.
match(*exclPatList,caseSenseNames)) &&
11204 patList,exclPatList,&dirResultList,resultSet,errorIfNotExist,
11205 recursive,killSet,paths);
11209 if (resultList && !dirResultList.empty())
11212 std::stable_sort(dirResultList.begin(),
11213 dirResultList.end(),
11214 [](
const auto &f1,
const auto &f2) { return dstricmp_sort(f1.c_str(),f2.c_str())<0; });
11217 resultList->insert(resultList->end(), dirResultList.begin(), dirResultList.end());
11234 bool errorIfNotExist,
11241 if (s.
empty())
return;
11248 if (exclSet==
nullptr || exclSet->find(fi.
absFilePath())==exclSet->end())
11255 if (errorIfNotExist)
11257 warn_uncond(
"source '{}' is not a readable file or directory... skipping.\n",s);
11262 std::string dirPath = fi.
dirPath(
true);
11264 if (paths && !dirPath.empty())
11266 paths->insert(dirPath);
11269 if (killSet==
nullptr || killSet->find(filePath)==killSet->end())
11278 fn->push_back(std::move(fd));
11281 if (resultList || resultSet)
11283 if (resultList) resultList->push_back(filePath);
11284 if (resultSet) resultSet->insert(filePath);
11290 else if (fi.
isDir())
11292 readDir(&fi,fnMap,exclSet,patList,
11293 exclPatList,resultList,resultSet,errorIfNotExist,
11294 recursive,killSet,paths);
11308 anchor=
":"+md->
anchor();
11317 t <<
"REPLACE INTO symbols (symbol_id,scope_id,name,file,line) VALUES('"
11318 << fn+anchor <<
"','"
11320 << d->
name() <<
"','"
11334 for (
const auto &def : symList)
11346 msg(
"Developer parameters:\n");
11347 msg(
" -m dump symbol map\n");
11348 msg(
" -b making messages output unbuffered\n");
11349 msg(
" -c <file> process input file as a comment block and produce HTML output\n");
11351 msg(
" -t [<file|stdout|stderr>] trace debug info to file, stdout, or stderr (default file stdout)\n");
11352 msg(
" -t_time [<file|stdout|stderr>] trace debug info to file, stdout, or stderr (default file stdout),\n"
11353 " and include time and thread information\n");
11355 msg(
" -d <level> enable a debug level, such as (multiple invocations of -d are possible):\n");
11366 DString versionString = getFullVersion();
11367 msg(
"{}\n",versionString);
11371 if (!extVers.
empty()) extVers+=
", ";
11372 extVers +=
"sqlite3 ";
11373 extVers += sqlite3_libversion();
11375 if (!extVers.
empty()) extVers+=
", ";
11376 extVers +=
"clang support ";
11377 extVers += CLANG_VERSION_STRING;
11379 if (!extVers.
empty())
11383 extVers = extVers.
replace(lastComma,1,
" and");
11385 msg(
" with {}.\n",extVers);
11396 msg(
"Doxygen version {0}\nCopyright Dimitri van Heesch 1997-2025\n\n"
11397 "You can use Doxygen in a number of ways:\n\n"
11398 "1) Use Doxygen to generate a template configuration file*:\n"
11399 " {1} [-s] -g [configName]\n\n"
11400 "2) Use Doxygen to update an old configuration file*:\n"
11401 " {1} [-s] -u [configName]\n\n"
11402 "3) Use Doxygen to generate documentation using an existing "
11403 "configuration file*:\n"
11404 " {1} [configName]\n\n"
11405 "4) Use Doxygen to generate a template file controlling the layout of the\n"
11406 " generated documentation:\n"
11407 " {1} -l [layoutFileName]\n\n"
11408 " In case layoutFileName is omitted DoxygenLayout.xml will be used as filename.\n"
11409 " If - is used for layoutFileName Doxygen will write to standard output.\n\n"
11410 "5) Use Doxygen to generate a template style sheet file for RTF, HTML or Latex.\n"
11411 " RTF: {1} -w rtf styleSheetFile\n"
11412 " HTML: {1} -w html headerFile footerFile styleSheetFile [configFile]\n"
11413 " LaTeX: {1} -w latex headerFile footerFile styleSheetFile [configFile]\n\n"
11414 "6) Use Doxygen to generate a rtf extensions file\n"
11415 " {1} -e rtf extensionsFile\n\n"
11416 " If - is used for extensionsFile Doxygen will write to standard output.\n\n"
11417 "7) Use Doxygen to compare the used configuration file with the template configuration file\n"
11418 " {1} -x [configFile]\n\n"
11419 " Use Doxygen to compare the used configuration file with the template configuration file\n"
11420 " without replacing the environment variables or CMake type replacement variables\n"
11421 " {1} -x_noenv [configFile]\n\n"
11422 "8) Use Doxygen to show a list of built-in emojis.\n"
11423 " {1} -f emoji outputFileName\n\n"
11424 " If - is used for outputFileName Doxygen will write to standard output.\n\n"
11425 "*) If -s is specified the comments of the configuration items in the config file will be omitted.\n"
11426 " If configName is omitted 'Doxyfile' will be used as a default.\n"
11427 " If - is used for configFile Doxygen will write / read the configuration to /from standard output / input.\n\n"
11428 "If -q is used for a Doxygen documentation run, Doxygen will see this as if QUIET=YES has been set.\n\n"
11429 "-v print version string, -V print extended version information\n"
11430 "-h,-? prints usage help information\n"
11431 "{1} -d prints additional usage flags for debugging purposes\n",versionString,name);
11438static const char *
getArg(
int argc,
char **argv,
int &optInd)
11441 if (
dstrlen(&argv[optInd][2])>0)
11442 s=&argv[optInd][2];
11443 else if (optInd+1<argc && argv[optInd+1][0]!=
'-')
11462 return []() {
return std::make_unique<T>(); };
11470 std::setlocale(LC_ALL,
"");
11471 std::setlocale(LC_CTYPE,
"C");
11472 std::setlocale(LC_NUMERIC,
"C");
11570 DString versionString = getFullVersion();
11573 auto writeFile = [](
const char *fileName,std::function<void(
TextStream&)> func) ->
bool
11593 bool genConfig=
false;
11594 bool shortList=
false;
11595 bool traceTiming=
false;
11597 bool updateConfig=
false;
11598 bool quiet =
false;
11599 while (optInd<argc && argv[optInd][0]==
'-' &&
11600 (isalpha(argv[optInd][1]) || argv[optInd][1]==
'?' ||
11601 argv[optInd][1]==
'-')
11604 switch(argv[optInd][1])
11614 if (optInd+1>=argc)
11616 layoutName=
"DoxygenLayout.xml";
11620 layoutName=argv[optInd+1];
11628 if (optInd+1>=argc)
11630 msg(
"option \"-c\" is missing the file name to read\n");
11646 if (debugLabel.
empty())
11655 msg(
"option \"-d\" has unknown debug specifier: \"{}\".\n",debugLabel);
11665 if (!strcmp(argv[optInd]+1,
"t_time"))
11667 traceTiming =
true;
11669 else if (!strcmp(argv[optInd]+1,
"t"))
11671 traceTiming =
false;
11675 err(
"option should be \"-t\" or \"-t_time\", found: \"{}\".\n",argv[optInd]);
11679 if (optInd+1>=argc || argv[optInd+1][0] ==
'-')
11681 traceName=
"stdout";
11685 traceName=argv[optInd+1];
11689 err(
"support for option \"-t\" has not been compiled in (use a debug build or a release build with tracing enabled).\n");
11700 err(
"option should be \"-x\" or \"-x_noenv\", found: \"{}\".\n",argv[optInd]);
11714 if (formatName.
empty())
11716 err(
"option \"-e\" is missing format specifier rtf.\n");
11722 if (optInd+1>=argc)
11724 err(
"option \"-e rtf\" is missing an extensions file name\n");
11732 err(
"option \"-e\" has invalid format specifier.\n");
11740 if (listName.
empty())
11742 err(
"option \"-f\" is missing list specifier.\n");
11748 if (optInd+1>=argc)
11750 err(
"option \"-f emoji\" is missing an output file name\n");
11758 err(
"option \"-f\" has invalid list specifier.\n");
11766 if (formatName.
empty())
11768 err(
"option \"-w\" is missing format specifier rtf, html or latex\n");
11774 if (optInd+1>=argc)
11776 err(
"option \"-w rtf\" is missing a style sheet file name\n");
11782 err(
"error opening RTF style sheet file {}!\n",argv[optInd+1]);
11792 if (optInd+4<argc ||
FileInfo(
"Doxyfile").exists() ||
FileInfo(
"doxyfile").exists())
11798 err(
"error opening or reading configuration file {}!\n",argv[optInd+4]);
11803 if (optInd+3>=argc)
11805 err(
"option \"-w html\" does not have enough arguments\n");
11822 if (optInd+4<argc ||
FileInfo(
"Doxyfile").exists() ||
FileInfo(
"doxyfile").exists())
11827 err(
"error opening or reading configuration file {}!\n",argv[optInd+4]);
11832 if (optInd+3>=argc)
11834 err(
"option \"-w latex\" does not have enough arguments\n");
11850 err(
"Illegal format specifier \"{}\": should be one of rtf, html or latex\n",formatName);
11870 if (
dstrcmp(&argv[optInd][2],
"help")==0)
11872 usage(argv[0],versionString);
11875 else if (
dstrcmp(&argv[optInd][2],
"version")==0)
11881 else if ((
dstrcmp(&argv[optInd][2],
"Version")==0) ||
11882 (
dstrcmp(&argv[optInd][2],
"VERSION")==0))
11890 err(
"Unknown option \"-{}\"\n",&argv[optInd][1]);
11891 usage(argv[0],versionString);
11896 setvbuf(stdout,
nullptr,_IONBF,0);
11903 usage(argv[0],versionString);
11907 err(
"Unknown option \"-{:c}\"\n",argv[optInd][1]);
11908 usage(argv[0],versionString);
11919 TRACE(
"Doxygen version used: {}",getFullVersion());
11922 FileInfo configFileInfo1(
"Doxyfile"),configFileInfo2(
"doxyfile");
11925 if (configFileInfo1.exists())
11927 configName=
"Doxyfile";
11929 else if (configFileInfo2.
exists())
11931 configName=
"doxyfile";
11933 else if (genConfig)
11935 configName=
"Doxyfile";
11939 err(
"Doxyfile not found and no input file specified!\n");
11940 usage(argv[0],versionString);
11947 if (fi.
exists() ||
dstrcmp(argv[optInd],
"-")==0 || genConfig)
11949 configName=argv[optInd];
11953 err(
"configuration file {} not found!\n",argv[optInd]);
11954 usage(argv[0],versionString);
11968 err(
"could not open or read configuration file {}!\n",configName);
12040 for (
const auto &mapping : extMaps)
12058 err(
"Failed to map file extension '{}' to unsupported language '{}'.\n"
12059 "Check the EXTENSION_MAPPING setting in the config file.\n",
12064 msg(
"Adding custom extension mapping: '{}' will be treated as language '{}'\n",
12073 if (cd==
reinterpret_cast<void *
>(-1))
12075 term(
"unsupported character conversion: '{}'->'UTF-8': {}\n"
12076 "Check the 'INPUT_ENCODING' setting in the config file!\n",
12086 for (
const auto &mapping : fileEncod)
12102 if (cd==
reinterpret_cast<void *
>(-1))
12104 term(
"unsupported character conversion: '{}'->'UTF-8': {}\n"
12105 "Check the 'INPUT_FILE_ENCODING' setting in the config file!\n",
12106 encoding,strerror(errno));
12119 for (
const auto &s : expandAsDefinedList)
12137 signal(SIGINT,SIG_DFL);
12139 msg(
"Cleaning up...\n");
12154 if (generateTagFile.
empty())
return;
12159 err(
"cannot open tag file {} for writing\n", generateTagFile);
12163 tagFile <<
"<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>\n";
12164 tagFile <<
"<tagfile doxygen_version=\"" << getDoxygenVersion() <<
"\"";
12165 std::string gitVersion = getGitVersion();
12166 if (!gitVersion.empty())
12168 tagFile <<
" doxygen_gitid=\"" << gitVersion <<
"\"";
12175 for (
const auto &fd : *fn)
12177 if (fd->isLinkableInProject()) fd->writeTagFile(tagFile);
12210 if (gd->isLinkableInProject()) gd->writeTagFile(tagFile);
12215 if (mod->isLinkableInProject()) mod->writeTagFile(tagFile);
12220 if (pd->isLinkableInProject()) pd->writeTagFile(tagFile);
12227 if (dd->isLinkableInProject()) dd->writeTagFile(tagFile);
12231 tagFile <<
"</tagfile>\n";
12239 msg(
"Exiting...\n");
12248 const DString &formatDirName,
12249 const char *defaultDirName)
12251 DString result = formatDirName;
12252 if (result.
empty())
12254 result = baseDirName + defaultDirName;
12256 else if (formatDirName[0]!=
'/' && (formatDirName.
length()==1 || formatDirName[1]!=
':'))
12258 result.
prepend(baseDirName+
"/");
12260 Dir formatDir(result.
str());
12263 term(
"Could not create output directory {}\n", result);
12277 g_s.
begin(
"Searching for include files...\n");
12280 for (
const auto &s : includePathList)
12298 g_s.
begin(
"Searching for example files...\n");
12301 for (
const auto &s : examplePathList)
12317 g_s.
begin(
"Searching for images...\n");
12320 for (
const auto &s : imagePathList)
12335 g_s.
begin(
"Searching for dot files...\n");
12338 for (
const auto &s : dotFileList)
12353 g_s.
begin(
"Searching for msc files...\n");
12356 for (
const auto &s : mscFileList)
12371 g_s.
begin(
"Searching for dia files...\n");
12374 for (
const auto &s : diaFileList)
12389 g_s.
begin(
"Searching for plantuml files...\n");
12392 for (
const auto &s : plantUmlFileList)
12407 g_s.
begin(
"Searching for mermaid files...\n");
12410 for (
const auto &s : mermaidFileList)
12425 g_s.
begin(
"Searching for files to exclude\n");
12427 for (
const auto &s : excludeList)
12446 g_s.
begin(
"Searching INPUT for files to process...\n");
12450 for (
const auto &s : inputList)
12453 size_t l = path.
length();
12457 if (path.
at(l-1)==
'\\' || path.
at(l-1)==
'/') path=path.
left(l-1);
12478 if (fileName->size()>1)
12480 std::stable_sort(fileName->begin(),fileName->end(),[](
const auto &f1,
const auto &f2)
12482 return dstricmp_sort(f1->absFilePath(),f2->absFilePath())<0;
12488 [](
const auto &f1,
const auto &f2)
12490 return dstricmp_sort(f1->front()->absFilePath(),f2->front()->absFilePath())<0;
12494 warn_uncond(
"No files to be processed, please check your settings, in particular INPUT, FILE_PATTERNS, and RECURSIVE\n");
12505 if (mdfileAsMainPage.
empty())
return;
12509 warn_uncond(
"Specified markdown mainpage '{}' does not exist\n",mdfileAsMainPage);
12512 bool ambig =
false;
12515 warn_uncond(
"Specified markdown mainpage '{}' has not been defined as input file\n",mdfileAsMainPage);
12534 DString versionString = getFullVersion();
12535 msg(
"Doxygen version used: {}\n",versionString);
12545 if (outputDirectory.
empty())
12551 Dir dir(outputDirectory.
str());
12555 if (!dir.
mkdir(outputDirectory.
str()))
12557 term(
"tag OUTPUT_DIRECTORY: Output directory '{}' does not "
12558 "exist and cannot be created\n",outputDirectory);
12562 msg(
"Notice: Output directory '{}' does not exist. "
12563 "I have created it for you.\n", outputDirectory);
12611 bool generateSitemap = !sitemapUrl.
empty();
12612 if (generateSitemap && !sitemapUrl.
endsWith(
"/"))
12619 bool generateEclipseHelp =
Config_getBool(GENERATE_ECLIPSEHELP);
12633 if (generateDocbook)
12673 if (curFontPath.
empty())
12677 if (!curFontPath.
empty())
12680 newFontPath+=curFontPath;
12696 bool defaultLayoutUsed =
false;
12697 if (layoutFileName.
empty())
12700 defaultLayoutUsed =
true;
12702 AUTO_TRACE_ADD(
"defaultLayoutUsed={}, layoutFileName={}",defaultLayoutUsed,layoutFileName);
12707 msg(
"Parsing layout file {}...\n",layoutFileName);
12710 else if (!defaultLayoutUsed)
12712 warn_uncond(
"failed to open layout file '{}' for reading! Using default settings.\n",layoutFileName);
12722 if (generateHtml) exclPatterns.push_back(htmlOutput.
str());
12723 if (generateDocbook) exclPatterns.push_back(docbookOutput.
str());
12724 if (generateXml) exclPatterns.push_back(xmlOutput.
str());
12725 if (generateLatex) exclPatterns.push_back(latexOutput.
str());
12726 if (generateRtf) exclPatterns.push_back(rtfOutput.
str());
12727 if (generateMan) exclPatterns.push_back(manOutput.
str());
12747 if (generateDocbook)
12758 std::shared_ptr<Entry> root = std::make_shared<Entry>();
12762 msg(
"Reading and parsing tag files\n");
12764 for (
const auto &s : tagFileList)
12816 g_s.
begin(
"Building macro definition list...\n");
12820 g_s.
begin(
"Building group list...\n");
12825 g_s.
begin(
"Building directory list...\n");
12830 g_s.
begin(
"Building namespace list...\n");
12835 g_s.
begin(
"Building file list...\n");
12839 g_s.
begin(
"Building class list...\n");
12843 g_s.
begin(
"Building concept list...\n");
12851 g_s.
begin(
"Computing nesting relations for classes...\n");
12864 g_s.
begin(
"Associating documentation with classes...\n");
12868 g_s.
begin(
"Associating documentation with concepts...\n");
12873 g_s.
begin(
"Associating documentation with modules...\n");
12877 g_s.
begin(
"Building example list...\n");
12881 g_s.
begin(
"Searching for enumerations...\n");
12889 g_s.
begin(
"Searching for documented typedefs...\n");
12895 g_s.
begin(
"Searching for documented sequences...\n");
12899 g_s.
begin(
"Searching for documented dictionaries...\n");
12904 g_s.
begin(
"Searching for members imported via using declarations...\n");
12911 g_s.
begin(
"Searching for included using directives...\n");
12915 g_s.
begin(
"Searching for documented variables...\n");
12919 g_s.
begin(
"Building interface member list...\n");
12922 g_s.
begin(
"Building member list...\n");
12926 g_s.
begin(
"Searching for friends...\n");
12930 g_s.
begin(
"Searching for documented defines...\n");
12934 g_s.
begin(
"Computing class inheritance relations...\n");
12939 g_s.
begin(
"Computing class usage relations...\n");
12943 g_s.
begin(
"Flushing cached template relations that have become invalid...\n");
12947 g_s.
begin(
"Warn for undocumented namespaces...\n");
12951 g_s.
begin(
"Computing class relations...\n");
12962 g_s.
begin(
"Add enum values to enums...\n");
12967 g_s.
begin(
"Searching for member function documentation...\n");
12979 g_s.
begin(
"Creating members for template instances...\n");
12983 g_s.
begin(
"Searching for tag less structs...\n");
12987 g_s.
begin(
"Building page list...\n");
12991 g_s.
begin(
"Building requirements list...\n");
12995 g_s.
begin(
"Search for main page...\n");
13000 g_s.
begin(
"Computing page relations...\n");
13005 g_s.
begin(
"Determining the scope of groups...\n");
13009 g_s.
begin(
"Computing module relations...\n");
13011 mm.resolvePartitions();
13012 mm.resolveImports();
13013 mm.collectExportedSymbols();
13032 return i==0 ?
dstricmp_sort(c1->name(), c2->name())<0 : i<0;
13067 g_s.
begin(
"Determining which enums are documented\n");
13071 g_s.
begin(
"Computing member relations...\n");
13076 g_s.
begin(
"Building full member lists recursively...\n");
13080 g_s.
begin(
"Adding members to member groups.\n");
13086 g_s.
begin(
"Distributing member group documentation.\n");
13091 g_s.
begin(
"Computing member references...\n");
13097 g_s.
begin(
"Inheriting documentation...\n");
13105 g_s.
begin(
"Generating disk names...\n");
13109 g_s.
begin(
"Adding source references...\n");
13113 g_s.
begin(
"Adding xrefitems...\n");
13118 g_s.
begin(
"Adding requirements...\n");
13123 g_s.
begin(
"Sorting member lists...\n");
13127 g_s.
begin(
"Setting anonymous enum type...\n");
13131 g_s.
begin(
"Computing dependencies between directories...\n");
13135 g_s.
begin(
"Generating citations page...\n");
13139 g_s.
begin(
"Counting data structures...\n");
13143 g_s.
begin(
"Resolving user defined references...\n");
13147 g_s.
begin(
"Finding anchors and sections in the documentation...\n");
13151 g_s.
begin(
"Transferring function references...\n");
13155 g_s.
begin(
"Combining using relations...\n");
13160 g_s.
begin(
"Adding members to index pages...\n");
13165 g_s.
begin(
"Correcting members for VHDL...\n");
13169 g_s.
begin(
"Computing tooltip texts...\n");
13177 [](
const auto &g1,
const auto &g2)
13178 {
return g1->groupTitle() < g2->groupTitle(); });
13182 gd->sortSubGroups();
13226 if (generateDocbook)
13246 err(
"USE_HTAGS is YES but htags(1) failed. \n");
13248 err(
"htags(1) ended normally but failed to load the filemap. \n");
13255 g_s.
begin(
"Generating style sheet...\n");
13263 g_s.
begin(
"Generating search indices...\n");
13264 if (searchEngine && !serverBasedSearch && generateHtml)
13272 if (generateHtml && searchEngine)
13275 Dir searchDir(searchDirName.
str());
13276 if (!searchDir.
exists() && !searchDir.
mkdir(searchDirName.
str()))
13278 term(
"Could not create search results directory '{}' $PWD='{}'\n",
13282 if (!serverBasedSearch)
13304 if (generateDocbook)
13320 g_s.
begin(
"Generating images for formulas in HTML...\n");
13327 g_s.
begin(
"Generating images for formulas in RTF...\n");
13334 g_s.
begin(
"Generating images for formulas in Docbook...\n");
13339 g_s.
begin(
"Generating example documentation...\n");
13343 g_s.
begin(
"Generating file sources...\n");
13347 g_s.
begin(
"Counting members...\n");
13353 g_s.
begin(
"Generating file documentation...\n");
13357 g_s.
begin(
"Generating page documentation...\n");
13361 g_s.
begin(
"Generating group documentation...\n");
13365 g_s.
begin(
"Generating class documentation...\n");
13369 g_s.
begin(
"Generating concept documentation...\n");
13373 g_s.
begin(
"Generating module documentation...\n");
13377 g_s.
begin(
"Generating namespace documentation...\n");
13383 g_s.
begin(
"Generating graph info page...\n");
13388 g_s.
begin(
"Generating directory documentation...\n");
13397 g_s.
begin(
"finalizing index lists...\n");
13401 g_s.
begin(
"writing tag file...\n");
13407 g_s.
begin(
"Generating XML output...\n");
13415 g_s.
begin(
"Generating SQLITE3 output...\n");
13422 g_s.
begin(
"Generating AutoGen DEF output...\n");
13428 g_s.
begin(
"Generating Perl module output...\n");
13432 if (generateHtml && searchEngine && serverBasedSearch)
13434 g_s.
begin(
"Generating search index\n");
13444 if (searchDataFile.
empty())
13446 searchDataFile=
"searchdata.xml";
13459 g_s.
begin(
"Combining RTF output...\n");
13462 err(
"An error occurred during post-processing the RTF files!\n");
13469 g_s.
begin(
"Running plantuml with JAVA...\n");
13476 g_s.
begin(
"Running mermaid (mmdc)...\n");
13488 if (generateHtml &&
13492 g_s.
begin(
"Running html help compiler...\n");
13497 if ( generateHtml &&
13501 g_s.
begin(
"Running qhelpgenerator...\n");
13514 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
13515 if (numThreads<1) numThreads=1;
13516 msg(
"Total elapsed time: {:.6f} seconds\n(of which an average of {:.6f} seconds per thread waiting for external tools to finish)\n",
13523 msg(
"finished...\n");
13528 msg(
"finished...\n");
This class contains the information about the argument of a function or template.
This class represents an function or template argument list.
RefQualifierType refQualifier() const
bool noParameters() const
bool pureSpecifier() const
bool hasParameters() const
DString trailingReturnType() const
void setPureSpecifier(bool b)
bool constSpecifier() const
void setTrailingReturnType(const DString &s)
void push_back(const Argument &a)
void setConstSpecifier(bool b)
void setRefQualifier(RefQualifierType t)
void setIsDeleted(bool b)
bool volatileSpecifier() const
void setNoParameters(bool b)
void setVolatileSpecifier(bool b)
static CitationManager & instance()
void clear()
clears the database
void generatePage()
Generate the citations page.
std::unique_ptr< ClangTUParser > createTUParser(const FileDef *fd) const
static ClangParser * instance()
Returns the one and only instance of the class.
Clang parser object for a single translation unit, which consists of a source file and the directly o...
void switchToFile(const FileDef *fd)
Switches to another file within the translation unit started with start().
void parse()
Parse the file given at construction time as a translation unit This file should already be preproces...
A abstract class representing of a compound symbol.
virtual DString requiresClause() const =0
virtual const MemberDef * getMemberByName(const DString &) const =0
Returns the member with the given name.
virtual const ArgumentList & templateArguments() const =0
Returns the template arguments of this class.
virtual void writeDocumentation(OutputList &ol) const =0
virtual void writeMemberList(OutputList &ol) const =0
virtual bool isTemplate() const =0
Returns true if this class is a template.
virtual const BaseClassList & baseClasses() const =0
Returns the list of base classes from which this class directly inherits.
virtual int isBaseClass(const ClassDef *bcd, bool followInstances, const DString &templSpec=DString()) const =0
Returns true iff bcd is a direct or indirect base class of this class.
virtual const TemplateInstanceList & getTemplateInstances() const =0
Returns a sorted dictionary with all template instances found for this template class.
virtual ArgumentLists getTemplateParameterLists() const =0
Returns the template parameter lists that form the template declaration of this class.
virtual Protection protection() const =0
Return the protection level (Public,Protected,Private) in which this compound was found.
virtual DString compoundTypeString() const =0
Returns the type of compound as a string.
virtual MemberList * getMemberList(MemberListType lt) const =0
Returns the members in the list identified by lt.
virtual std::unique_ptr< ClassDef > deepCopy(const DString &name) const =0
virtual bool isForwardDeclared() const =0
Returns true if this class represents a forward declaration of a template class.
virtual bool isSubClass(ClassDef *bcd, int level=0) const =0
Returns true iff bcd is a direct or indirect sub class of this class.
virtual void moveTo(Definition *)=0
virtual const TemplateNameMap & getTemplateBaseClassNames() const =0
virtual DString qualifiedNameWithTemplateParameters(const ArgumentLists *actualParams=nullptr, uint32_t *actualParamIndex=nullptr) const =0
virtual bool isEmbeddedInOuterScope() const =0
virtual const MemberNameInfoLinkedMap & memberNameInfoLinkedMap() const =0
Returns a dictionary of all members.
virtual bool isImplicitTemplateInstance() const =0
virtual const ClassDef * templateMaster() const =0
Returns the template master of which this class is an instance.
CompoundType
The various compound types.
virtual CompoundType compoundType() const =0
Returns the type of compound this is, i.e. class/struct/union/...
virtual bool containsOverload(const MemberDef *md) const =0
virtual ClassLinkedRefMap getClasses() const =0
returns the classes nested into this class
virtual FileDef * getFileDef() const =0
Returns the file in which this compound's definition can be found.
virtual void writeTagFile(TextStream &) const =0
virtual void writeDocumentationForInnerClasses(OutputList &ol) const =0
virtual void computeAnchors()=0
virtual void addTypeConstraints()=0
virtual void overrideCollaborationGraph(bool e)=0
virtual void addUsedClass(ClassDef *cd, const DString &accessName, Protection prot)=0
virtual void insertExplicitTemplateInstance(ClassDef *instance, const DString &spec)=0
virtual void countMembers()=0
virtual void addMembersToMemberGroup()=0
virtual void setPrimaryConstructorParams(const ArgumentList &list)=0
virtual void setTemplateBaseClassNames(const TemplateNameMap &templateNames)=0
virtual ClassDef * insertTemplateInstance(const DString &fileName, int startLine, size_t startColumn, const DString &templSpec, bool &freshInstance)=0
virtual void setClassName(const DString &name)=0
virtual void setFileDef(FileDef *fd)=0
virtual void reclassifyMember(MemberDefMutable *md, MemberType t)=0
virtual void setTemplateArguments(const ArgumentList &al)=0
virtual void setTemplateMaster(const ClassDef *tm)=0
virtual void makeTemplateArgument(bool b=true)=0
virtual void mergeCategory(ClassDef *category)=0
virtual void addQualifiers(const StringVector &qualifiers)=0
virtual void setClassSpecifier(TypeSpecifier spec)=0
virtual void insertUsedFile(const FileDef *)=0
virtual void setTagLessReference(const ClassDef *cd)=0
virtual void setUsedOnly(bool b)=0
virtual void sortMemberLists()=0
virtual void setProtection(Protection p)=0
virtual void setTypeConstraints(const ArgumentList &al)=0
virtual void overrideInheritanceGraph(CLASS_GRAPH_t e)=0
virtual void setAnonymousEnumType()=0
virtual void setCompoundType(CompoundType t)=0
virtual void distributeMemberGroupDocumentation()=0
virtual void setMetaData(const DString &md)=0
virtual void findSectionsInDocumentation()=0
virtual void insertMember(MemberDef *)=0
virtual void sortAllMembersList()=0
virtual void mergeMembers()=0
virtual void setIsStatic(bool b)=0
virtual void addMembersToTemplateInstance(const ClassDef *cd, const ArgumentList &templateArguments, const DString &templSpec)=0
virtual void insertSubClass(ClassDef *, Protection p, Specifier s, const DString &t=DString())=0
virtual void addUsedByClass(ClassDef *cd, const DString &accessName, Protection prot)=0
virtual void setSubGrouping(bool enabled)=0
virtual void setRequiresClause(const DString &req)=0
virtual void insertBaseClass(ClassDef *, const DString &name, Protection p, Specifier s, const DString &t=DString())=0
virtual void addDocPart(const DString &doc, int lineNr, size_t colNr)=0
virtual void addCodePart(const DString &code, int lineNr, size_t colNr)=0
virtual void setFileDef(FileDef *fd)=0
virtual void writeTagFile(TextStream &)=0
virtual void writeDocumentation(OutputList &ol)=0
virtual void setGroupId(int id)=0
virtual void setInitializer(const DString &init)=0
virtual void findSectionsInDocumentation()=0
virtual void setTemplateArguments(const ArgumentList &al)=0
A String class for use with Doxygen wrapping std::string and adding some additional functionality off...
DString & setNum(short n)
void resize(size_t newlen)
size_t rfind(char c, size_t pos=npos) const
DString fill(char c, size_t len)
Fills a string with a predefined character.
DString mid(size_t index, size_t len=npos) const
bool empty() const
Returns true iff the string is empty (std::string compatible alias for isEmpty()).
DString & replace(size_t index, size_t len, const char *s)
DString substr(size_t pos=0, size_t count=npos) const
Returns a substring of length count starting at pos.
static constexpr size_t npos
value used to indicate 'not found' or 'to the end of the string', matching std::string::npos
char & at(size_t i)
Returns a reference to the character at index i.
bool findAndRemoveWord(const char *word)
removes occurrences of whole word from this string, while keeping internal spaces and reducing multip...
DString right(size_t len) const
size_t size() const
Returns the length of the string, not counting the 0-terminator.
DString & prepend(const char *s)
int contains(char c, bool cs=true) const
size_t find(char c, size_t pos=0) const
DString & sprintf(const char *format,...)
int toInt(bool *ok=nullptr, int base=10) const
DString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
DString left(size_t len) const
const std::string & str() const
bool stripPrefix(const DString &prefix)
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
bool startsWith(const char *s) const
bool endsWith(const char *s) const
size_t length() const
Returns the length of the string, not counting the 0-terminator.
static void clearFlag(const DebugMask mask)
static bool isFlagSet(const DebugMask mask)
static void print(DebugMask mask, int prio, fmt::format_string< Args... > fmt, Args &&... args)
static double elapsedTime()
static bool setFlagStr(const DString &label)
static void setFlag(const DebugMask mask)
The common base class of all entity definitions found in the sources.
virtual DString briefDescription(bool abbreviate=false) const =0
virtual DString inbodyFile() const =0
virtual int getEndBodyLine() const =0
virtual DString briefFile() const =0
virtual SrcLangExt getLanguage() const =0
Returns the programming language this definition was written in.
virtual int docLine() const =0
virtual DString getDefFileName() const =0
virtual DString documentation() const =0
virtual bool isLinkable() const =0
virtual DString inbodyDocumentation() const =0
virtual int getDefLine() const =0
virtual DefType definitionType() const =0
virtual const DString & name() const =0
virtual const DString & localName() const =0
virtual int inbodyLine() const =0
virtual const FileDef * getBodyDef() const =0
virtual int briefLine() const =0
virtual bool hasDocumentation() const =0
virtual bool isLinkableInProject() const =0
virtual size_t getDefColumn() const =0
virtual bool isAnonymous() const =0
virtual DString displayName(bool includeScope=true) const =0
virtual DString qualifiedName() const =0
virtual bool isHidden() const =0
virtual DString anchor() const =0
virtual int getStartDefLine() const =0
virtual const GroupList & partOfGroups() const =0
virtual bool isArtificial() const =0
virtual Definition * getOuterScope() const =0
virtual DString docFile() const =0
virtual int getStartBodyLine() const =0
virtual bool isReference() const =0
virtual const Definition * findInnerCompound(const DString &name) const =0
virtual DString getOutputFileBase() const =0
virtual void mergeReferencedBy(const Definition *other)=0
virtual void setName(const DString &name)=0
virtual void setExported(bool b)=0
virtual void setBodySegment(int defLine, int bls, int ble)=0
virtual void setHidden(bool b)=0
virtual void setReference(const DString &r)=0
virtual void mergeReferences(const Definition *other)=0
virtual void setInbodyDocumentation(const DString &d, const DString &docFile, int docLine)=0
virtual void setDocumentation(const DString &d, const DString &docFile, int docLine, bool stripWhiteSpace=true)=0
virtual void addInnerCompound(Definition *d)=0
virtual void setDefFile(const DString &df, int defLine, size_t defColumn)=0
virtual void addSectionsToDefinition(const std::vector< const SectionInfo * > &anchorList)=0
virtual void setLanguage(SrcLangExt lang)=0
virtual void setOuterScope(Definition *d)=0
virtual void setArtificial(bool b)=0
virtual void setBriefDescription(const DString &b, const DString &briefFile, int briefLine)=0
virtual void makePartOfGroup(GroupDef *gd)=0
virtual void setBodyDef(const FileDef *fd)=0
virtual void setRequirementReferences(const RequirementRefs &rqli)=0
virtual void setId(const DString &name)=0
virtual void setRefItems(const RefItemVector &sli)=0
virtual void computeTooltip()=0
A model of a directory symbol.
virtual void overrideDirectoryGraph(bool e)=0
Class representing a directory in the file system.
static std::string currentDirPath()
std::string absPath() const
bool mkdir(const std::string &path, bool acceptsAbsPath=true) const
void setPath(const std::string &path)
bool remove(const std::string &path, bool acceptsAbsPath=true) const
DirIterator iterator() const
static std::string cleanDirPath(const std::string &path)
static bool setCurrent(const std::string &path)
A linked map of directories.
A class that generates docset files.
static DotManager * instance()
static NamespaceLinkedMap * namespaceLinkedMap
static ConceptLinkedMap * conceptLinkedMap
static bool suppressDocWarnings
static FileNameLinkedMap * plantUmlFileNameLinkedMap
static bool parseSourcesNeeded
static StringUnorderedSet inputPaths
static std::unique_ptr< PageDef > mainPage
static bool clangAssistedParsing
static StringUnorderedSet expandAsDefinedSet
static FileNameLinkedMap * inputNameLinkedMap
static DString filterDBFileName
static ParserManager * parserManager
static InputFileEncodingList inputFileEncodingList
static DString verifiedDotPath
static ClassLinkedMap * classLinkedMap
static MemberNameLinkedMap * functionNameLinkedMap
static PageLinkedMap * exampleLinkedMap
static FileNameLinkedMap * dotFileNameLinkedMap
static NamespaceDefMutable * globalScope
static FileNameLinkedMap * imageNameLinkedMap
static FileNameLinkedMap * mscFileNameLinkedMap
static FileNameLinkedMap * mermaidFileNameLinkedMap
static MemberGroupInfoMap memberGroupInfoMap
static IndexList * indexList
static StaticInitMap staticInitMap
static StringMap tagDestinationMap
static std::mutex countFlowKeywordsMutex
static ClassLinkedMap * hiddenClassLinkedMap
static FileNameLinkedMap * diaFileNameLinkedMap
static PageLinkedMap * pageLinkedMap
static bool generatingXmlOutput
static std::unique_ptr< NamespaceDef > globalNamespaceDef
static DString htmlFileExtension
static DefinesPerFileList macroDefinitions
static DirLinkedMap * dirLinkedMap
static NamespaceAliasInfoMap namespaceAliasMap
static MemberNameLinkedMap * memberNameLinkedMap
static SymbolMap< Definition > * symbolMap
static StringUnorderedSet tagFileSet
static FileNameLinkedMap * includeNameLinkedMap
static FileNameLinkedMap * exampleNameLinkedMap
static SearchIndexIntf searchIndex
static DirRelationLinkedMap dirRelations
static std::mutex addExampleMutex
static ClangUsrMap * clangUsrMap
static GroupLinkedMap * groupLinkedMap
Generator for Eclipse help files.
static EmojiEntityMapper & instance()
Returns the one and only instance of the Emoji entity mapper.
void writeEmojiFile(TextStream &t)
Writes the list of supported emojis to the given file.
Represents an unstructured piece of information, about an entity found in the sources.
TextStream initializer
initial value (for variables)
VhdlSpecifier vhdlSpec
VHDL specifiers.
bool subGrouping
automatically group class members?
RequirementRefs rqli
references to requirements
const std::vector< std::shared_ptr< Entry > > & children() const
GroupDocType groupDocType
int docLine
line number at which the documentation was found
DString includeName
include name (3 arg of \class)
DString bitfields
member's bit fields
ArgumentList typeConstr
where clause (C#) for type constraints
void markAsProcessed() const
int endBodyLine
line number where the definition ends
DString write
property write accessor
bool exported
is the symbol exported from a C++20 module
const TagInfo * tagInfo() const
DString includeFile
include file (2 arg of \class, must be unique)
DString fileName
file this entry was extracted from
ArgumentLists tArgLists
template argument declarations
DString docFile
file in which the documentation was found
MethodTypes mtype
signal, slot, (dcop) method, or property?
@ GROUPDOC_NORMAL
defgroup
DString args
member argument string
SrcLangExt lang
programming language in which this entry was found
DString inside
name of the class in which documents are found
DString doc
documentation block (partly parsed)
DString req
C++20 requires clause.
bool explicitExternal
explicitly defined as external?
DString brief
brief description (doc block)
std::vector< const SectionInfo * > anchors
list of anchors defined in this entry
RelatesType relatesType
how relates is handled
std::vector< Grouping > groups
list of groups this entry belongs to
CommandOverrides commandOverrides
store info for commands whose default can be overridden
int startLine
start line of entry in the source
size_t startColumn
start column of entry in the source
ArgumentList argList
member arguments as a list
int inbodyLine
line number at which the body doc was found
EntryType section
entry type (see Sections);
int bodyLine
line number of the body in the source
DString exception
throw specification
DString relates
related class (doc block)
int mGrpId
member group id
std::vector< BaseInfo > extends
list of base classes
DString inbodyFile
file in which the body doc was found
Specifier virt
virtualness of the entry
DString metaData
Slice metadata.
std::vector< std::string > qualifiers
qualifiers specified with the qualifier command
RefItemVector sli
special lists (test/todo/bug/deprecated/..) this entry is in
Protection protection
class protection
bool artificial
Artificially introduced item.
bool hidden
does this represent an entity that is hidden from the output
DString inbodyDocs
documentation inside the body of a function
int briefLine
line number at which the brief desc. was found
FileDef * fileDef() const
int initLines
define/variable initializer lines to show
TypeSpecifier spec
class/member specifiers
DString briefFile
file in which the brief desc. was found
DString read
property read accessor
Wrapper class for the Entry type.
constexpr bool isCompoundDoc() const noexcept
constexpr bool isFile() const noexcept
constexpr bool isDoc() const noexcept
ENTRY_TYPES constexpr bool isCompound() const noexcept
std::string to_string() const
static EntryType guessSection(const DString &name)
constexpr bool isScope() const noexcept
A class that generates a dynamic tree view side panel.
A model of a file symbol.
virtual void addUsingDeclaration(const Definition *d)=0
virtual void removeMember(MemberDef *md)=0
virtual void insertClass(ClassDef *cd)=0
virtual void setDiskName(const DString &name)=0
virtual void insertConcept(ConceptDef *cd)=0
virtual void overrideIncludeGraph(bool e)=0
virtual void writeSourceHeader(OutputList &ol)=0
virtual bool generateSourceFile() const =0
virtual DString absFilePath() const =0
virtual const DString & docName() const =0
virtual const LinkedRefMap< NamespaceDef > & getUsedNamespaces() const =0
virtual bool isSource() const =0
virtual void parseSource(ClangTUParser *clangParser)=0
virtual void getAllIncludeFilesRecursively(StringVector &incFiles) const =0
virtual void writeSourceFooter(OutputList &ol)=0
virtual void writeSourceBody(OutputList &ol, ClangTUParser *clangParser)=0
virtual void addUsingDirective(NamespaceDef *nd)=0
virtual void overrideIncludedByGraph(bool e)=0
virtual void insertMember(MemberDef *md)=0
virtual void insertNamespace(NamespaceDef *nd)=0
Minimal replacement for QFileInfo.
std::string readLink() const
bool match(const PatternList &patList, bool caseSenseNames, PatternElem *elem=nullptr, PatternGet getter=[](const std::string &s){ return s;}) const
Match the file name against a list of patterns.
std::string fileName() const
std::string dirPath(bool absPath=true) const
std::string absFilePath() const
Class representing all files with a certain base name.
Ordered dictionary of FileName objects.
DString showFileDefMatches(const DString &n) const
Returns a list of file definitions in fnMap that match the file name n.
FileDef * findFileDef(const DString &n, bool &ambig) const
Returns the file definition in fnMap that matches the file name n.
A model of a group of symbols.
virtual DString groupTitle() const =0
virtual void overrideGroupGraph(bool e)=0
virtual bool addClass(ClassDef *def)=0
virtual bool containsFile(const FileDef *def) const =0
virtual bool addNamespace(NamespaceDef *def)=0
virtual void setGroupScope(Definition *d)=0
virtual void addFile(FileDef *def)=0
virtual void setGroupTitle(const DString &newtitle)=0
virtual MemberList * getMemberList(MemberListType lt) const =0
virtual bool hasGroupTitle() const =0
Generator for HTML output.
static void writeSearchData(const DString &dir)
static void writeSearchPage()
static void writeHeaderFile(TextStream &t, const DString &cssname)
static void writeFooterFile(TextStream &t)
static void writeTabData()
Additional initialization after indices have been created.
static void writeExternalSearchPage()
static void writeStyleSheetFile(TextStream &t)
A class that generated the HTML Help specific files.
static const DString hhpFileName
static Index & instance()
void countDataStructures()
A list of index interfaces.
void addIndexItem(const Definition *context, const MemberDef *md, const DString §ionAnchor=DString(), const DString &title=DString())
void addIndex(As &&... args)
Add an index generator to the list, using a syntax similar to std::make_unique<T>().
void addImageFile(const DString &name)
Generator for LaTeX output.
static void writeFooterFile(TextStream &t)
static void writeStyleSheetFile(TextStream &t)
static void writeHeaderFile(TextStream &t)
void parse(const DString &fileName, const char *data=nullptr)
Parses a user provided layout.
static LayoutDocManager & instance()
Returns a reference to this singleton.
std::unique_ptr< RefList > Ptr
T * add(const char *k, Args &&... args)
const T * find(const std::string &key) const
Container class representing a vector of objects with keys.
const T * find(const std::string &key) const
Generator for Man page output.
A model of a class/file/namespace member symbol.
virtual DString requiresClause() const =0
virtual bool isFriend() const =0
virtual DString argsString() const =0
virtual bool isForeign() const =0
virtual bool isRelated() const =0
virtual DString definition() const =0
virtual const ClassDef * getCachedTypedefVal() const =0
virtual const ClassDef * getClassDef() const =0
virtual DString excpString() const =0
virtual const ArgumentList & templateArguments() const =0
virtual const DString & initializer() const =0
virtual GroupDef * getGroupDef()=0
virtual bool isCSharpProperty() const =0
virtual bool isTypedef() const =0
virtual const MemberVector & enumFieldList() const =0
virtual void moveTo(Definition *)=0
virtual const FileDef * getFileDef() const =0
virtual const ArgumentList & argumentList() const =0
virtual bool isStrongEnumValue() const =0
virtual VhdlSpecifier getVhdlSpecifiers() const =0
virtual bool isFunction() const =0
virtual bool isExternal() const =0
virtual int getMemberGroupId() const =0
virtual DString bitfieldString() const =0
virtual bool isStatic() const =0
virtual const MemberDef * reimplements() const =0
virtual StringVector getQualifiers() const =0
virtual bool isTypedefValCached() const =0
virtual bool isDocsForDefinition() const =0
virtual bool isDefine() const =0
virtual const NamespaceDef * getNamespaceDef() const =0
virtual bool isObjCProperty() const =0
virtual Protection protection() const =0
virtual TypeSpecifier getMemberSpecifiers() const =0
virtual bool isEnumerate() const =0
virtual MemberType memberType() const =0
virtual ClassDef * relatedAlso() const =0
virtual bool isVariable() const =0
virtual bool isStrong() const =0
virtual DString typeString() const =0
virtual Specifier virtualness(int count=0) const =0
virtual int redefineCount() const =0
virtual int initializerLines() const =0
virtual const MemberDef * getEnumScope() const =0
virtual bool isEnumValue() const =0
virtual bool isPrototype() const =0
virtual void setRequiresClause(const DString &req)=0
virtual void setClassDefOfAnonymousType(const ClassDef *cd)=0
virtual void setMemberClass(ClassDef *cd)=0
virtual void setProtection(Protection p)=0
virtual void setDefinition(const DString &d)=0
virtual void setMemberGroupId(int id)=0
virtual void setDocumentedEnumValues(bool value)=0
virtual void setMemberSpecifiers(TypeSpecifier s)=0
virtual ClassDefMutable * getClassDefMutable()=0
virtual void setArgsString(const DString &as)=0
virtual void setEnumScope(MemberDef *md, bool livesInsideEnum=false)=0
virtual void setDefinitionTemplateParameterLists(const ArgumentLists &lists)=0
virtual void invalidateTypedefValCache()=0
virtual void setVhdlSpecifiers(VhdlSpecifier s)=0
virtual void setEnumClassScope(ClassDef *cd)=0
virtual void setInitializer(const DString &i)=0
virtual void setMaxInitLines(int lines)=0
virtual void setInheritsDocsFrom(const MemberDef *md)=0
virtual void setPrototype(bool p, const DString &df, int line, size_t column)=0
virtual void setRelatedAlso(ClassDef *cd)=0
virtual void overrideReferencesRelation(bool e)=0
virtual void makeForeign()=0
virtual void overrideReferencedByRelation(bool e)=0
virtual void setDocsForDefinition(bool b)=0
virtual void overrideCallGraph(bool e)=0
virtual void overrideInlineSource(bool e)=0
virtual void setBitfields(const DString &s)=0
virtual void copyArgumentNames(const MemberDef *bmd)=0
virtual void overrideEnumValues(bool e)=0
virtual void mergeMemberSpecifiers(TypeSpecifier s)=0
virtual void addQualifiers(const StringVector &qualifiers)=0
virtual void setExplicitExternal(bool b, const DString &df, int line, size_t column)=0
virtual void insertEnumField(MemberDef *md)=0
virtual void moveDeclArgumentList(std::unique_ptr< ArgumentList > al)=0
virtual void setDeclFile(const DString &df, int line, size_t column)=0
virtual void setAnonymousEnumType(const MemberDef *md)=0
virtual void overrideCallerGraph(bool e)=0
virtual void setReimplements(MemberDef *md)=0
virtual void invalidateCachedArgumentTypes()=0
virtual void moveArgumentList(std::unique_ptr< ArgumentList > al)=0
virtual void makeRelated()=0
virtual void insertReimplementedBy(MemberDef *md)=0
A list of MemberDef objects as shown in documentation sections.
Wrapper class for the MemberListType type.
Ordered dictionary of MemberName objects.
MemberName::Ptr take(const DString &key, const MemberDef *value)
const MemberDef * findRev(const DString &name) const
const MemberDef * find(const DString &name) const
void run()
Run mmdc tool for all collected diagrams.
static MermaidManager & instance()
static ModuleManager & instance()
void addDocs(const Entry *root)
void addConceptToModule(const Entry *root, ConceptDef *cd)
void addClassToModule(const Entry *root, ClassDef *cd)
void addMemberToModule(const Entry *root, MemberDef *md)
void writeDocumentation(OutputList &ol)
void addMembersToMemberGroup()
void findSectionsInDocumentation()
void distributeMemberGroupDocumentation()
An abstract interface of a namespace symbol.
virtual const LinkedRefMap< NamespaceDef > & getUsedNamespaces() const =0
virtual bool isInline() const =0
virtual void insertUsedFile(FileDef *fd)=0
virtual void findSectionsInDocumentation()=0
virtual void countMembers()=0
virtual void addUsingDirective(NamespaceDef *nd)=0
virtual void setFileName(const DString &fn)=0
virtual void insertMember(MemberDef *md)=0
virtual void setMetaData(const DString &m)=0
virtual void addUsingDeclaration(const Definition *d)=0
virtual void distributeMemberGroupDocumentation()=0
virtual void writeTagFile(TextStream &)=0
virtual void writeDocumentation(OutputList &ol)=0
virtual void setInline(bool isInline)=0
virtual void computeAnchors()=0
virtual void combineUsingRelations(NamespaceDefSet &visitedNamespace)=0
virtual void sortMemberLists()=0
virtual void addMembersToMemberGroup()=0
void parseInput(const DString &, const char *, const std::shared_ptr< Entry > &, ClangTUParser *) override
Parses a single input file with the goal to build an Entry tree.
void parsePrototype(const DString &) override
Callback function called by the comment block scanner.
bool needsPreprocessing(const DString &) const override
Returns true if the language identified by extension needs the C preprocessor to be run before feed t...
Abstract interface for outline parsers.
virtual bool needsPreprocessing(const DString &extension) const =0
Returns true if the language identified by extension needs the C preprocessor to be run before feed t...
virtual void parseInput(const DString &fileName, const char *fileBuf, const std::shared_ptr< Entry > &root, ClangTUParser *clangParser)=0
Parses a single input file with the goal to build an Entry tree.
Class representing a list of output generators that are written to in parallel.
void disable(OutputType o)
void enable(OutputType o)
void docify(const DString &s)
void writeStyleInfo(int part)
void generateDoc(const DString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const DString &docStr, const DocOptions &options)
A model of a page symbol.
virtual void setLocalToc(const LocalToc &tl)=0
virtual void setFileName(const DString &name)=0
virtual void setShowLineNo(bool)=0
virtual void setPageScope(Definition *)=0
virtual const GroupDef * getGroupDef() const =0
Manages programming language parsers.
std::unique_ptr< CodeParserInterface > getCodeParser(const DString &extension)
Gets the interface to the parser associated with a given extension.
void registerParser(const DString &name, const OutlineParserFactory &outlineParserFactory, const CodeParserFactory &codeParserFactory)
Registers an additional parser.
std::unique_ptr< OutlineParserInterface > getOutlineParser(const DString &extension)
Gets the interface to the parser associated with a given extension.
static PlantumlManager & instance()
void run()
Run plant UML tool for all images.
void processFile(const DString &fileName, const std::string &input, std::string &output)
void addSearchDir(const DString &dir)
static DString getQchFileName()
static const DString qhpFileName
Generator for RTF output.
static bool preProcessFileInplace(const DString &path, const DString &name)
This is an API to a VERY brittle RTF preprocessor that combines nested RTF files.
static void writeStyleSheetFile(TextStream &t)
static void writeExtensionsFile(TextStream &t)
static RefListManager & instance()
static RequirementManager & instance()
void writeTagFile(TextStream &tagFile)
void addRequirement(Entry *e)
Abstract proxy interface for non-javascript based search indices.
void addWord(const DString &word, bool hiPriority)
void setCurrentDoc(const Definition *ctx, const DString &anchor, bool isSourceFile)
void write(const DString &file)
class that provide information about a section.
SectionInfo * replace(const DString &label, const DString &fileName, int lineNr, const DString &title, SectionType type, int level, const DString &ref=DString())
SectionInfo * add(const SectionInfo &si)
static SectionManager & instance()
returns a reference to the singleton
static constexpr int Page
std::vector< stat > stats
void begin(const char *name)
std::chrono::steady_clock::time_point startTime
static void showCacheUsage()
Show usage of the type lookup cache.
static void clearTypeLookupCache(ClearScope scope)
ClassDefMutable * resolveClassMutable(const Definition *scope, const DString &name, bool mayBeUnlinkable=false, bool mayBeHidden=false)
Wrapper around resolveClass that returns a mutable interface to the class object or a nullptr if the ...
const ClassDef * resolveClass(const Definition *scope, const DString &name, bool maybeUnlinkable=false, bool mayBeHidden=false)
Find the class definition matching name within the scope set.
const Definition * resolveSymbol(const Definition *scope, const DString &name, const DString &args=DString(), bool checkCV=false, bool insideCode=false, bool onlyLinkable=false)
Find the symbool definition matching name within the scope set.
DString getTemplateSpec() const
In case a call to resolveClass() points to a template specialization, the template part is return via...
const MemberDef * getTypedef() const
In case a call to resolveClass() resolves to a type member (e.g. an enum) this method will return it.
This struct is used to capture the tag file information for an Entry.
Text streaming class that buffers data.
std::string str() const
Return the contents of the buffer as a std::string object.
Class managing a pool of worker threads.
auto queue(F &&f, Args &&... args) -> std::future< decltype(f(args...))>
Queue the callable function f for the threads to execute.
virtual DString trOverloadText()=0
virtual DString trPage(bool first_capital, bool singular)=0
virtual DString trMainPage()=0
Wrapper class for a number of boolean properties.
std::string to_string() const
static void correctMemberProperties(MemberDefMutable *md)
static void computeVhdlComponentRelations()
ClassDefMutable * toClassDefMutable(Definition *d)
ClassDef * getClass(const DString &n)
std::unique_ptr< ClassDef > createClassDefAlias(const Definition *newScope, const ClassDef *cd)
std::unique_ptr< ClassDef > createClassDef(const DString &fileName, int startLine, size_t startColumn, const DString &name, ClassDef::CompoundType ct, const DString &ref, const DString &fName, bool isSymbol, bool isJavaEnum)
Factory method to create a new ClassDef object.
ClassDef * toClassDef(Definition *d)
std::unordered_set< const ClassDef * > ClassDefSet
std::map< std::string, int > TemplateNameMap
ClassDefMutable * getClassMutable(const DString &key)
Class representing a regular expression.
Class to iterate through matches.
Object representing the matching results.
ConceptDefMutable * toConceptDefMutable(Definition *d)
std::unique_ptr< ConceptDef > createConceptDef(const DString &fileName, int startLine, size_t startColumn, const DString &name, const DString &tagRef, const DString &tagFile)
ConceptDefMutable * getConceptMutable(const DString &key)
#define Config_getInt(name)
#define Config_getList(name)
#define Config_updateString(name, value)
#define Config_updateBool(name, value)
#define Config_getBool(name)
#define Config_getString(name)
#define Config_updateList(name,...)
#define Config_getEnum(name)
std::set< std::string > StringSet
std::unordered_set< std::string > StringUnorderedSet
std::map< std::string, std::string > StringMap
std::vector< std::string > StringVector
void parseFuncDecl(const DString &decl, const SrcLangExt lang, DString &clName, DString &type, DString &name, DString &args, DString &funcTempList, DString &exceptions)
std::unique_ptr< ArgumentList > stringToArgumentList(SrcLangExt lang, const DString &argsString, DString *extraTypeChars=nullptr)
std::unordered_map< std::string, DefineList > DefinesPerFileList
Definition * toDefinition(DefinitionMutable *dm)
DefinitionMutable * toDefinitionMutable(Definition *d)
DirIterator begin(DirIterator it) noexcept
DirIterator end(const DirIterator &) noexcept
void computeDirDependencies()
void generateDirDocs(OutputList &ol)
#define AUTO_TRACE_ADD(...)
#define AUTO_TRACE_EXIT(...)
constexpr DocNodeVariant * parent(DocNodeVariant *n)
returns the parent node of a given node n or nullptr if the node has no parent.
static void findInheritedTemplateInstances()
void printNavTree(Entry *root, int indent)
static void addClassToContext(const Entry *root)
static void makeTemplateInstanceRelation(const Entry *root, ClassDefMutable *cd)
static StringUnorderedSet g_pathsVisited(1009)
static void buildGroupList(const Entry *root)
static void insertMemberAlias(Definition *outerScope, const MemberDef *md)
static void findUsingDeclarations(const Entry *root, bool filterPythonPackages)
static void flushCachedTemplateRelations()
static void copyLatexStyleSheet()
static void generateDocsForClassList(const std::vector< ClassDefMutable * > &classList)
static int findFunctionPtr(const std::string &type, SrcLangExt lang, int *pLength=nullptr)
static bool isSpecialization(const ArgumentLists &srcTempArgLists, const ArgumentLists &dstTempArgLists)
static void computeTemplateClassRelations()
static std::string resolveSymlink(const std::string &path)
void adjustConfiguration()
adjust globals that depend on configuration settings.
static void findDEV(const MemberNameLinkedMap &mnsd)
static void runQHelpGenerator()
static void addConceptToContext(const Entry *root)
static void addRelatedPage(Entry *root)
static void addIncludeFile(DefMutable *cd, FileDef *ifd, const Entry *root)
static StringVector g_inputFiles
static void generateXRefPages()
static Definition * buildScopeFromQualifiedName(const DString &name_, SrcLangExt lang, const TagInfo *tagInfo)
static void findUsingDeclImports(const Entry *root)
static void copyStyleSheet()
FindBaseClassRelation_Mode
void distributeClassGroupRelations()
static void generateGroupDocs()
static void findDirDocumentation(const Entry *root)
void checkConfiguration()
check and resolve config options
static void processTagLessClasses(const Definition *root, const Container *cd, const TagContainer *tagParent, MemberListType varFilter, MemberListType typeFilter, const DString &prefix, int count)
Look through the members of class cd and its public members.
static bool findClassRelation(const Entry *root, Definition *context, ClassDefMutable *cd, const BaseInfo *bi, const TemplateNameMap &templateNames, FindBaseClassRelation_Mode mode, bool isArtificial)
static void resolveTemplateInstanceInType(const Entry *root, const Definition *scope, const MemberDef *md)
static void organizeSubGroupsFiltered(const Entry *root, bool additional)
static void warnUndocumentedNamespaces()
static TemplateNameMap getTemplateArgumentsInName(const ArgumentList &templateArguments, const std::string &name)
static void buildConceptList(const Entry *root)
static void addMemberSpecialization(const Entry *root, MemberName *mn, ClassDefMutable *cd, const DString &funcType, const DString &funcName, const DString &funcArgs, const DString &funcDecl, const DString &exceptions, TypeSpecifier spec)
static void resolveClassNestingRelations()
static void generateNamespaceConceptDocs(const ConceptLinkedRefMap &conceptList)
static MemberDef * addVariableToFile(const Entry *root, MemberType mtype, const DString &scope, const DString &type, const DString &name, const DString &args)
static void findClassEntries(const Entry *root)
static void vhdlCorrectMemberProperties()
static void addMemberFunction(const Entry *root, MemberName *mn, const DString &scopeName, const DString &namespaceName, const DString &className, const DString &funcTyp, const DString &funcName, const DString &funcArgs, const DString &funcTempList, const DString &exceptions, const DString &type, const DString &args, bool isFriend, TypeSpecifier spec, const DString &relates, const DString &funcDecl, bool overloaded, bool isFunc)
static void generateExampleDocs()
static void stopDoxygen(int)
static void substituteTemplatesInArgList(const ArgumentLists &srcTempArgLists, const ArgumentLists &dstTempArgLists, const ArgumentList &src, ArgumentList &dst)
static void copyLogo(const DString &outputOption, bool toIndex)
static void computeMemberReferences()
static void transferRelatedFunctionDocumentation()
static void addMembersToMemberGroup()
static void findMainPageTagFiles(Entry *root)
static void addLocalObjCMethod(const Entry *root, const DString &scopeName, const DString &funcType, const DString &funcName, const DString &funcArgs, const DString &exceptions, const DString &funcDecl, TypeSpecifier spec)
static void distributeConceptGroups()
static NamespaceDef * findUsedNamespace(const LinkedRefMap< NamespaceDef > &unl, const DString &name)
static void transferFunctionDocumentation()
static void setAnonymousEnumType()
static void sortMemberLists()
static void findMember(const Entry *root, const DString &relates, const DString &type, const DString &args, DString funcDecl, bool overloaded, bool isFunc)
static void createTemplateInstanceMembers()
void transferStaticInstanceInitializers()
static void findObjCMethodDefinitions(const Entry *root)
static void addMemberDocs(const Entry *root, MemberDefMutable *md, const DString &funcDecl, const ArgumentList *al, bool over_load, TypeSpecifier spec)
static void dumpSymbolMap()
static void buildTypedefList(const Entry *root)
static void findGroupScope(const Entry *root)
static void generateFileDocs()
static int findEndOfTemplate(const DString &s, size_t startPos)
static void findDefineDocumentation(Entry *root)
static void findUsedClassesForClass(const Entry *root, Definition *context, ClassDefMutable *masterCd, ClassDefMutable *instanceCd, bool isArtificial, const ArgumentList *actualArgs=nullptr, const TemplateNameMap &templateNames=TemplateNameMap())
static void findMemberDocumentation(const Entry *root)
static void distributeMemberGroupDocumentation()
static void generateNamespaceClassDocs(const ClassLinkedRefMap &classList)
static void addEnumValuesToEnums(const Entry *root)
static void generatePageDocs()
static void resolveUserReferences()
static void buildRequirementsList(Entry *root)
static void compareDoxyfile(Config::CompareMode diffList)
static void addPageToContext(PageDef *pd, Entry *root)
static std::shared_ptr< Entry > parseFile(OutlineParserInterface &parser, FileDef *fd, const DString &fn, ClangTUParser *clangParser, bool newTU)
static void buildVarList(const Entry *root)
static void copyIcon(const DString &outputOption, bool toIndex)
static void buildSequenceList(const Entry *root)
static void generateFileSources()
static void copyExtraFiles(StringVector files, const DString &filesOption, const DString &outputOption, bool toIndex)
static void generateClassDocs()
static int findTemplateSpecializationPosition(const DString &name)
static void buildNamespaceList(const Entry *root)
static void findIncludedUsingDirectives()
static void addDefineDoc(const Entry *root, MemberDefMutable *md)
static void countMembers()
static ClassDef * findClassWithinClassContext(Definition *context, ClassDef *cd, const DString &name)
static void organizeSubGroups(const Entry *root)
static void applyMemberOverrideOptions(const Entry *root, MemberDefMutable *md)
static void addOverloaded(const Entry *root, MemberName *mn, const DString &funcType, const DString &funcName, const DString &funcArgs, const DString &funcDecl, const DString &exceptions, TypeSpecifier spec)
static void findFriends()
static void findEnums(const Entry *root)
static void generateConfigFile(const DString &configFile, bool shortList, bool updateOnly=false)
static DString g_commentFileName
static void dumpSymbol(TextStream &t, Definition *d)
static void addClassAndNestedClasses(std::vector< ClassDefMutable * > &list, ClassDefMutable *cd)
static void addEnumDocs(const Entry *root, MemberDefMutable *md)
static void addListReferences()
static void exitDoxygen() noexcept
static bool findGlobalMember(const Entry *root, const DString &namespaceName, const DString &type, const DString &name, const DString &tempArg, const DString &, const DString &decl, TypeSpecifier)
static bool isClassSection(const Entry *root)
static void buildGroupListFiltered(const Entry *root, bool additional, bool includeExternal)
static void runHtmlHelpCompiler()
static void addMembersToIndex()
static bool g_dumpSymbolMap
static void version(const bool extended)
static OutputList * g_outputList
static DString extractClassName(const Entry *root)
static void findMainPage(Entry *root)
static ClassDef::CompoundType convertToCompoundType(EntryType section, TypeSpecifier specifier)
DString stripTemplateSpecifiers(const DString &s)
static void findUsingDirectives(const Entry *root)
static void addInterfaceOrServiceToServiceOrSingleton(const Entry *root, ClassDefMutable *cd, DString const &rname)
static bool g_successfulRun
static bool tryAddEnumDocsToGroupMember(const Entry *root, const DString &name)
static void addSourceReferences()
static void associateVariableWithAnonymousEnumType(const MemberDef *md, const Container *cd, const MemberDef *enumTypeMember, MemberListType mlFilter)
static void createUsingMemberImportForClass(const Entry *root, ClassDefMutable *cd, const MemberDef *md, const DString &fileName, const DString &memName)
static DString substituteTemplatesInString(const ArgumentLists &srcTempArgLists, const ArgumentLists &dstTempArgLists, const std::string &src)
std::function< std::unique_ptr< T >() > make_parser_factory()
static void buildExampleList(Entry *root)
static void inheritDocumentation()
static void flushUnresolvedRelations()
static bool isSymbolHidden(const Definition *d)
void readConfiguration(int argc, char **argv)
static void readDir(FileInfo *fi, FileNameLinkedMap *fnMap, StringUnorderedSet *exclSet, const StringVector *patList, const StringVector *exclPatList, StringVector *resultList, StringUnorderedSet *resultSet, bool errorIfNotExist, bool recursive, StringUnorderedSet *killSet, StringUnorderedSet *paths)
static void findTemplateInstanceRelation(const Entry *root, Definition *context, ClassDefMutable *templateClass, const DString &templSpec, const TemplateNameMap &templateNames, bool isArtificial)
static void findDocumentedEnumValues()
static void findTagLessClasses()
static void generateDiskNames()
static void addToIndices()
static void computeClassRelations()
static void buildFunctionList(const Entry *root)
static void checkPageRelations()
static void addGlobalFunction(const Entry *root, const DString &rname, const DString &sc)
static void findModuleDocumentation(const Entry *root)
static MemberDef * addVariableToClass(const Entry *root, ClassDefMutable *cd, MemberType mtype, const DString &type, const DString &name, const DString &args, Protection prot, Relationship related)
static void readTagFile(const std::shared_ptr< Entry > &root, const DString &tagLine)
static void findEnumDocumentation(const Entry *root)
static void computePageRelations(Entry *root)
static void addMethodToClass(const Entry *root, ClassDefMutable *cd, const DString &rtype, const DString &rname, const DString &rargs, bool isFriend, Protection protection, bool stat, Specifier virt, TypeSpecifier spec, const DString &relates)
static bool isVarWithConstructor(const Entry *root)
static StringSet g_usingDeclarations
static void buildDictionaryList(const Entry *root)
static bool haveEqualFileNames(const Entry *root, const MemberDef *md)
void readFileOrDirectory(const DString &s, FileNameLinkedMap *fnMap, StringUnorderedSet *exclSet, const StringVector *patList, const StringVector *exclPatList, StringVector *resultList, StringUnorderedSet *resultSet, bool recursive, bool errorIfNotExist, StringUnorderedSet *killSet, StringUnorderedSet *paths)
static void generateNamespaceDocs()
static void buildClassDocList(const Entry *root)
static void buildPageList(Entry *root)
static void writeTagFile()
static void addRequirementReferences()
static void computeVerifiedDotPath()
static bool g_singleComment
static void findSectionsInDocumentation()
static void mergeCategories()
static const StringUnorderedSet g_compoundKeywords
static bool scopeIsTemplate(const Definition *d)
static void buildFileList(const Entry *root)
static void buildClassList(const Entry *root)
static void usage(const DString &name, const DString &versionString)
static void findUsedTemplateInstances()
static void computeTooltipTexts()
static void addVariable(const Entry *root, int isFuncPtr=-1)
static void findBaseClassesForClass(const Entry *root, Definition *context, ClassDefMutable *masterCd, ClassDefMutable *instanceCd, FindBaseClassRelation_Mode mode, bool isArtificial, const ArgumentList *actualArgs=nullptr, const TemplateNameMap &templateNames=TemplateNameMap())
static void parseFilesSingleThreading(const std::shared_ptr< Entry > &root)
parse the list of input files
static void buildCompleteMemberLists()
static const ClassDef * findClassDefinition(FileDef *fd, NamespaceDef *nd, const DString &scopeName)
static void filterMemberDocumentation(const Entry *root, const DString &relates)
static void generateConceptDocs()
static bool isRecursiveBaseClass(const DString &scope, const DString &name)
static std::unique_ptr< OutlineParserInterface > getParserForFile(const DString &fn)
static void combineUsingRelations()
static const char * getArg(int argc, char **argv, int &optInd)
std::unique_ptr< ArgumentList > getTemplateArgumentsFromName(const DString &name, const ArgumentLists &tArgLists)
static ClassDefMutable * createTagLessInstance(const Definition *root, const ClassDef *templ, const DString &fieldName)
static void checkMarkdownMainfile()
static std::unordered_map< std::string, std::vector< ClassDefMutable * > > g_usingClassMap
static void buildConceptDocList(const Entry *root)
static bool isEntryInGroupOfMember(const Entry *root, const MemberDef *md, bool allowNoGroup=false)
static void applyToAllDefinitions(Func func)
static void parseFilesMultiThreading(const std::shared_ptr< Entry > &root)
parse the list of input files
static DString createOutputDirectory(const DString &baseDirName, const DString &formatDirName, const char *defaultDirName)
static void transferFunctionReferences()
static void buildDefineList()
static void buildInterfaceAndServiceList(const Entry *root)
static Definition * findScopeFromQualifiedName(NamespaceDefMutable *startScope, const DString &n, FileDef *fileScope, const TagInfo *tagInfo)
static void computeMemberRelations()
static void buildListOfUsingDecls(const Entry *root)
static void computeMemberRelationsForBaseClass(const ClassDef *cd, const BaseClassDef *bcd)
static std::multimap< std::string, const Entry * > g_classEntries
std::vector< InputFileEncoding > InputFileEncodingList
std::unordered_map< std::string, BodyInfo > StaticInitMap
std::unordered_map< std::string, NamespaceAliasInfo > NamespaceAliasInfoMap
std::unordered_map< std::string, const Definition * > ClangUsrMap
DString substitute(const DString &s, const DString &src, const DString &dst)
substitute all occurrences of src in s by dst
int dstricmp(const char *s1, const char *s2)
uint32_t dstrlen(const char *str)
Returns the length of string str, or 0 if a null pointer is passed.
int dstricmp_sort(const char *str1, const char *str2)
int dstrcmp(const char *str1, const char *str2)
const char * qPrint(const char *s)
FileDef * toFileDef(Definition *d)
std::unique_ptr< FileDef > createFileDef(const DString &p, const DString &n, const DString &ref, const DString &dn)
std::unordered_set< const FileDef * > FileDefSet
void addNamespaceToGroups(const Entry *root, NamespaceDef *nd)
void addGroupToGroups(const Entry *root, GroupDef *subGroup)
void addClassToGroups(const Entry *root, ClassDef *cd)
void addDirToGroups(const Entry *root, DirDef *dd)
std::unique_ptr< GroupDef > createGroupDef(const DString &fileName, int line, const DString &name, const DString &title, const DString &refFileName)
void addConceptToGroups(const Entry *root, ConceptDef *cd)
void addMemberToGroups(const Entry *root, MemberDef *md)
void writeGraphInfo(OutputList &ol)
void endTitle(OutputList &ol, const DString &fileName, const DString &name)
void writeIndexHierarchy(OutputList &ol)
void endFile(OutputList &ol, bool skipNavIndex, bool skipEndContents, const DString &navPath)
void startTitle(OutputList &ol, const DString &fileName, const DefinitionMutable *def)
void startFile(OutputList &ol, const DString &name, bool isSource, const DString &manName, const DString &title, HighlightedItem hli, bool additionalIndices, const DString &altSidebarName, int hierarchyLevel, const DString &allMembersFile)
Translator * theTranslator
void setTranslator(OUTPUT_LANGUAGE_t langName)
#define LATEX_STYLE_EXTENSION
void writeDefaultLayoutFile(const DString &fileName)
std::unique_ptr< MemberDef > createMemberDef(const DString &defFileName, int defLine, size_t defColumn, const DString &type, const DString &name, const DString &args, const DString &excp, Protection prot, Specifier virt, bool stat, Relationship related, MemberType t, const ArgumentList &tal, const ArgumentList &al, const DString &metaData)
Factory method to create a new instance of a MemberDef.
std::unique_ptr< MemberDef > createMemberDefAlias(const Definition *newScope, const MemberDef *aliasMd)
MemberDefMutable * toMemberDefMutable(Definition *d)
void mergeMemberOverrideOptions(MemberDefMutable *md1, MemberDefMutable *md2)
void combineDeclarationAndDefinition(MemberDefMutable *mdec, MemberDefMutable *mdef)
MemberDef * toMemberDef(Definition *d)
std::unordered_map< int, std::unique_ptr< MemberGroupInfo > > MemberGroupInfoMap
DString warn_line(const DString &file, int line)
#define warn_undoc(file, line, fmt,...)
#define warn_uncond(fmt,...)
#define warn(file, line, fmt,...)
void postProcess(bool clearHeaderAndFooter, CompareMode compareMode=CompareMode::Full)
void checkAndCorrect(bool quiet, const bool check)
void compareDoxyfile(TextStream &t, CompareMode compareMode)
void writeTemplate(TextStream &t, bool shortList, bool updateOnly=false)
bool parse(const DString &fileName, bool update=false, CompareMode compareMode=CompareMode::Full)
void correctPath(const StringVector &list)
Correct a possible wrong PATH variable.
FILE * popen(const DString &name, const DString &type)
double getSysElapsedTime()
void setenv(const DString &variable, const DString &value)
int system(const DString &command, const DString &args, bool commandHasConsole=true)
DString getenv(const DString &variable)
bool isAbsolutePath(const DString &fileName)
DString pathListSeparator()
std::ofstream openOutputStream(const DString &name, bool append=false)
const char * commandExtension()
DString trunc(const DString &s, size_t numChars=15)
std::unique_ptr< NamespaceDef > createNamespaceDef(const DString &defFileName, int defLine, size_t defColumn, const DString &name, const DString &ref, const DString &refFile, const DString &type, bool isPublished)
Factory method to create new NamespaceDef instance.
std::unique_ptr< NamespaceDef > createNamespaceDefAlias(const Definition *newScope, const NamespaceDef *nd)
Factory method to create an alias of an existing namespace.
void replaceNamespaceAliases(DString &name)
NamespaceDef * getResolvedNamespace(const DString &name)
NamespaceDef * toNamespaceDef(Definition *d)
NamespaceDefMutable * toNamespaceDefMutable(Definition *d)
NamespaceDefMutable * getResolvedNamespaceMutable(const DString &key)
std::unordered_set< const NamespaceDef * > NamespaceDefSet
bool search(std::string_view str, Match &match, const Ex &re, size_t pos)
Search in a given string str starting at position pos for a match against regular expression re.
std::unique_ptr< PageDef > createPageDef(const DString &f, int l, const DString &n, const DString &d, const DString &t)
void setPerlModDoxyfile(const DString &qs)
Portable versions of functions that are platform dependent.
int portable_iconv_close(void *cd)
void * portable_iconv_open(const char *tocode, const char *fromcode)
void addRefItem(const RefItemVector &sli, const DString &key, const DString &prefix, const DString &name, const DString &title, const DString &args, const Definition *scope)
void finalizeSearchIndexer()
void createJavaScriptSearchIndex()
void writeJavaScriptSearchIndex()
Javascript based search engine.
void addSTLSupport(std::shared_ptr< Entry > &root)
Add stub entries for the most used classes in the standard template library.
Some helper functions for std::string.
void addTerminalCharIfMissing(std::string &s, char c)
Class that contains information about an inheritance relation.
ClassDef * classDef
Class definition that this relation inherits from.
This class stores information about an inheritance relation.
Protection prot
inheritance type
Specifier virt
virtualness
DString name
the name of the base class
Data associated with description found in the body.
Helper class to pass options when calling OutputList::generateDoc().
DString groupname
name of the group
static constexpr const char * getGroupPriName(GroupPri_t priority) noexcept
@ GROUPING_INGROUP
membership in group was defined by @ingroup
GroupPri_t pri
priority of this definition
stat(const char *n, double el)
void parseTagFile(const std::shared_ptr< Entry > &root, const char *fullName)
void initTracing(const DString &logFile, bool timing)
bool isTypeAClassFriend(const DString &type)
bool useCaseSenseNames()
Returns true if the names of the symbols can be case sensitive.
DString substituteTemplateArgumentsInString(const DString &nm, const ArgumentList &formalArgs, const ArgumentList *actualArgs)
bool protectionLevelVisible(Protection prot)
DString stripFromIncludePath(const DString &path)
DString mergeScopes(const DString &leftScope, const DString &rightScope)
DString filterTitle(const DString &title)
bool matchTemplateArguments(const ArgumentList &srcAl, const ArgumentList &dstAl)
void addCodeOnlyMappings()
bool rightScopeMatch(const DString &scope, const DString &name)
bool checkIfTypedef(const Definition *scope, const FileDef *fileScope, const DString &n)
DString replaceAnonymousScopes(const DString &s, const DString &replacement)
void cleanupInlineGraphs()
int computeQualifiedIndex(const DString &name)
Return the index of the last :: in the string name that is still before the first <.
DString removeRedundantWhiteSpace(const DString &s)
bool checkExtension(const DString &fName, const DString &ext)
DString convertNameToFile(const DString &name, bool allowDots, bool allowUnderscore)
bool leftScopeMatch(const DString &scope, const DString &name)
DString tempArgListToString(const ArgumentList &al, SrcLangExt lang, bool includeDefault)
DString getFileNameExtension(const DString &fn)
DString resolveTypeDef(const Definition *context, const DString &qualifiedName, const Definition **typedefContext)
bool readInputFile(const DString &fileName, std::string &contents, bool filter, bool isSourceCode)
read a file name fileName and optionally filter and transcode it
DString normalizeNonTemplateArgumentsInString(const DString &name, const Definition *context, const ArgumentList &formalArgs)
SrcLangExt getLanguageFromFileName(const DString &fileName, SrcLangExt defLang)
bool matchArguments2(const Definition *srcScope, const FileDef *srcFileScope, const DString &srcReturnType, const ArgumentList *srcAl, const Definition *dstScope, const FileDef *dstFileScope, const DString &dstReturnType, const ArgumentList *dstAl, bool checkCV, SrcLangExt lang)
void initDefaultExtensionMapping()
void addHtmlExtensionIfMissing(DString &fName)
DString fileToString(const DString &name, bool filter, bool isSourceCode)
void extractNamespaceName(const DString &scopeName, DString &className, DString &namespaceName, bool allowEmptyClass)
DString stripTemplateSpecifiersFromScope(const DString &fullName, bool parentOnly, DString *pLastScopeStripped, DString scopeName, bool allowArtificial)
DString argListToString(const ArgumentList &al, bool useCanonicalType, bool showDefVals)
DString projectLogoFile()
bool copyFile(const DString &src, const DString &dest)
Copies the contents of file with name src to the newly created file with name dest.
int getPrefixIndex(const DString &name)
DString getLanguageSpecificSeparator(SrcLangExt lang, bool classScope)
bool updateLanguageMapping(const DString &extension, const DString &language)
DString mangleCSharpGenericName(const DString &name)
void mergeArguments(ArgumentList &srcAl, ArgumentList &dstAl, bool forceNameOverwrite)
int getScopeFragment(const DString &s, int p, int *l)
int extractClassNameFromType(const DString &type, int &pos, DString &name, DString &templSpec, SrcLangExt lang)
bool openOutputFile(const DString &outFile, std::ofstream &f)
DString stripAnonymousNamespaceScope(const DString &s)
A bunch of utility functions.