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();
506template<
class DefMutable>
520 if (!includeFile.
empty() && includeFile.
at(0)==
'"')
523 includeFile=includeFile.
mid(1,includeFile.
length()-2);
525 else if (!includeFile.
empty() && includeFile.
at(0)==
'<')
528 includeFile=includeFile.
mid(1,includeFile.
length()-2);
535 if (!includeFile.
empty() &&
540 text.
sprintf(
"the name '%s' supplied as "
541 "the argument of the \\class, \\struct, \\union, or \\headerfile command ",
546 text+=
"matches the following input files:\n";
549 text+=
"Please use a more specific name by "
550 "including a (larger) part of the path!";
554 text+=
"is not an input file";
558 else if (includeFile.
empty() && ifd &&
572 if (iName.
at(0)==
'<') local=
false;
573 else if (iName.
at(0)==
'"') local=
true;
574 if (iName.
at(0)==
'"' || iName.
at(0)==
'<')
597 def->setIncludeFile(
nullptr,iName,local,
true);
616 bool save_ambig = ambig;
620 size_t newIndex=fn.
rfind(
'/');
627 fn = fn.
left(newIndex)+
"/"+root->
name;
630 if (!fd) ambig = save_ambig;
662 "Found non-existing group '{}' for the command '{}', ignoring command",
671 text.
sprintf(
"the name '%s' supplied as "
672 "the argument in the \\file statement ",
676 text+=
"matches the following input files:\n";
679 text+=
"Please use a more specific name by "
680 "including a (larger) part of the path!";
684 text+=
"is not an input file";
698 for (
size_t i=0;i<l;i++)
702 else if (c==
')' && round>0) round--;
703 else if (c==
'<' && round==0) count++;
708 if (c==
'>' && round==0 && count>0) count--;
731 if (idx==-1)
return prevScope;
733 if (nsName.
empty())
return prevScope;
734 if (!fullScope.
empty()) fullScope+=
"::";
739 if (nd==
nullptr) cd =
getClass(fullScope);
740 if (nd==
nullptr && cd)
752 "[generated]",1,1,fullScope,
770 if (prevScopeMutable)
802 int p=i1+l1,l2=0,i2=0;
805 DString nestedNameSpecifier = scope.
mid(i1,l1);
810 if (resultScope==
nullptr)
821 if (resultScope!=
nullptr)
break;
880 auto alIt = tArgLists.begin();
897 return alIt!=tArgLists.end() ?
898 std::make_unique<ArgumentList>(*alIt) :
899 std::unique_ptr<ArgumentList>();
907 if (specifier.isStruct())
909 else if (specifier.isUnion())
911 else if (specifier.isCategory())
913 else if (specifier.isInterface())
915 else if (specifier.isProtocol())
917 else if (specifier.isException())
919 else if (specifier.isService())
921 else if (specifier.isSingleton())
924 if (section.isUnionDoc())
926 else if (section.isStructDoc())
928 else if (section.isInterfaceDoc())
930 else if (section.isProtocolDoc())
932 else if (section.isCategoryDoc())
934 else if (section.isExceptionDoc())
936 else if (section.isServiceDoc())
938 else if (section.isSingletonDoc())
966 DString qualifiedName = fullName;
969 qualifiedName.
prepend(scName+
"::");
975 AUTO_TRACE_ADD(
"Found class with name '{}', qualifiedName '{}'", cd ? cd->
name() : root->
name, qualifiedName);
1030 AUTO_TRACE_ADD(
"New class: fullname '{}' namespace '{}' name='{}' brief='{}' docs='{}'",
1047 std::unique_ptr<ArgumentList> tArgList;
1049 if ((root->
lang==SrcLangExt::CSharp || root->
lang==SrcLangExt::Java) &&
1064 fullName=fullName.
left(i);
1075 fullName,sec,tagName,refFileName,
true,root->
spec.isEnum()) ));
1078 AUTO_TRACE_ADD(
"New class '{}' type={} #tArgLists={} tagInfo={} hidden={} artificial={}",
1115 AUTO_TRACE_ADD(
"Class {} not added, already exists as alias", fullName);
1123 if (!root->
spec.isForwardDecl())
1185 qualifiedName.
prepend(scName+
"::");
1191 AUTO_TRACE_ADD(
"Found concept with name '{}' (qualifiedName='{}')", cd ? cd->
name() : root->
name, qualifiedName);
1195 qualifiedName=cd->
name();
1209 AUTO_TRACE_ADD(
"New concept: fullname '{}' namespace '{}' name='{}' brief='{}' docs='{}'",
1210 qualifiedName,namespaceName,className,root->
brief,root->
doc);
1231 qualifiedName,tagName,refFileName)));
1235 qualifiedName,root->
tArgLists.size(),fmt::ptr(tagInfo));
1266 for (
const auto &ce : root->
children())
1269 if (ce->section.isConceptDocPart())
1274 if (!ce->brief.empty())
1276 cd->
addDocPart(ce->brief,ce->startLine,ce->startColumn);
1279 if (!ce->doc.empty())
1281 cd->
addDocPart(ce->doc,ce->startLine,ce->startColumn);
1285 else if (ce->section.isConceptCodePart())
1287 cd->
addCodePart(ce->initializer.str(),ce->startLine,ce->startColumn);
1294 AUTO_TRACE_ADD(
"Concept '{}' not added, already exists (as alias)", qualifiedName);
1301 for (
const auto &ce : root->
children())
1303 if (ce->section.isConceptDocPart())
1323 if (root->
section.isModuleDoc())
1333 if (root->
section.isConcept())
1343 if (root->
section.isConceptDoc())
1362 if (cd!=ocd && cd->groupId()==ocd->groupId() &&
1363 !cd->partOfGroups().empty() && ocd->partOfGroups().empty())
1368 for (
const auto &gd : cd->partOfGroups())
1374 gd->addConcept(ocd.get());
1399 aliasFullName(name),aliasCd(std::move(cd)), aliasContext(ctx) {}
1401 std::unique_ptr<ClassDef> aliasCd;
1404 std::vector<ClassAlias> aliases;
1408 if (cd && visitedClasses.find(icd.get())==visitedClasses.end())
1414 name,icd->getFileDef(),
nullptr);
1440 aliases.emplace_back(aliasFullName,std::move(aliasCd),dm);
1451 visitedClasses.insert(icd.get());
1461 for (
auto &alias : aliases)
1466 alias.aliasContext->addInnerCompound(aliasCd);
1475 if (cd && visitedClasses.find(icd.get())==visitedClasses.end())
1497 "Incomplete input: scope for class {} not found!{}",name,
1498 name.
startsWith(
"std::") ?
" Try enabling BUILTIN_STL_SUPPORT." :
""
1517 if (visitedClasses.find(cd.get())==visitedClasses.end() && !cd->partOfGroups().empty())
1521 for (
auto &ncd : cd->getClasses())
1532 visitedClasses.insert(cd.get());
1539template<
typename Container>
1541 const Container *cd,
1547 MemberList *eiml = cd->getMemberList(mlFilter);
1550 for (
const auto &eimd : *eiml)
1552 DString vtype = eimd->typeString();
1573 const char *p = n.
data()+sn;
1577 if (!isdigit(c) && c!=
'@' && c!=
':')
break;
1583 DString fullName = n+
"."+fieldName;
1612 else if (outerScope)
1627 auto newMd =
createMemberDef(md->getDefFileName(),md->getDefLine(),md->getDefColumn(),
1628 md->typeString(),md->name(),md->argsString(),md->excpString(),
1629 md->protection(),md->virtualness(),md->isStatic(),Relationship::Member,
1639 imd->
setId(md->id());
1660 for (
const auto &md : *ml)
1669 for (
const auto &md : *ml)
1673 if (md->isEnumerate() && md->name().startsWith(
"@"))
1675 for (
const auto &emd : md->enumFieldList())
1698template<
typename Container,
typename TagContainer>
1700 const Container *cd,
1701 const TagContainer *tagParent,
1706 AUTO_TRACE(
"count={} name={}\n",count,cd->name());
1709 MemberList *ml = cd->getMemberList(varFilter);
1713 for (
const auto &md : *ml)
1715 DString type = md->typeString();
1720 std::vector<const ClassDef *> candidates;
1721 for (
const auto &icd : cd->getClasses())
1723 candidates.push_back(icd);
1725 for (
const auto &icd : candidates)
1731 if (md->isAnonymous()) name =
"__unnamed" +
DString().
setNum(pos++)+
"__";
1737 processTagLessClasses(ncd,icd,ncd,MemberListType::PubAttribs(),MemberListType::PubTypes(),name,count+1);
1742 MemberList *pml = tagParent->getMemberList(varFilter);
1745 for (
const auto &pmd : *pml)
1748 if (pmdm && pmd->
name()==md->name())
1765 ml = cd->getMemberList(typeFilter);
1768 for (
const auto &md : *ml)
1777template<
typename Container>
1780 for (
const auto &icd : cd->getClasses())
1788 candidates.insert(cd);
1793 std::set<const Definition *> candidates;
1803 const FileDef *fd = cd->getFileDef();
1818 for (
const auto &d : candidates)
1824 processTagLessClasses(nd,nd,nd,MemberListType::DecVarMembers(),MemberListType::DecEnumMembers(),
"",0);
1829 processTagLessClasses(fd,fd,fd,MemberListType::DecVarMembers(),MemberListType::DecEnumMembers(),
"",0);
1846 (root->
section.isNamespace() ||
1847 root->
section.isNamespaceDoc() ||
1856 if (root->
section.isPackageDoc())
1862 if (!fullName.
empty())
1921 root->
type,root->
spec.isPublished())));
1989 DString aliasName = aliasNd->name();
2018 for (
auto &und : unl)
2020 DString uScope=und->name()+
"::";
2022 if (usingNd!=
nullptr)
break;
2029 if (root->
section.isUsingDir())
2047 (fd==
nullptr || fd->
getLanguage()!=SrcLangExt::Java)
2051 if (!nsName.
empty())
2061 int scopeOffset =
static_cast<int>(nsName.
length());
2074 size_t o = nsName.
rfind(
"::",scopeOffset-1);
2077 }
while (scopeOffset>=0 && usingNd==
nullptr);
2079 if (usingNd==
nullptr && nd)
2083 while (pnd && usingNd==
nullptr)
2100 if (usingNd==
nullptr && fd)
2173 if (root->
section.isUsingDecl() &&
2186 if (root->
section.isUsingDecl() &&
2188 (!filterPythonPackages || (root->
lang==SrcLangExt::Python && root->
fileName.
endsWith(
"__init__.py")))
2191 AUTO_TRACE(
"Found using declaration '{}' at line {} of {} inside section {}",
2205 if (!scName.
empty())
2221 if (nd==
nullptr) scope = fd;
2291 AUTO_TRACE(
"creating new member {} for class {}",memName,cd->
name());
2302 newMmd->setMemberClass(cd);
2320 newMmd->addSectionsToDefinition(root->
anchors);
2326 newMmd->setMemberGroupId(root->
mGrpId);
2329 newMmd->setLanguage(root->
lang);
2330 newMmd->setId(root->
id);
2339 if (root->
section.isUsingDecl() &&
2366 for (
auto &mi : *mni)
2369 if (md && md->
protection()!=Protection::Private)
2384 for (
const auto ©Cd : it->second)
2397 else if (root->
section.isUsingDecl() &&
2399 root->
lang==SrcLangExt::Cpp
2432 memName = root->
name;
2454 newMmd->setNamespace(nd);
2459 newMmd->setFileDef(fd);
2478 newMmd->addSectionsToDefinition(root->
anchors);
2484 newMmd->setMemberGroupId(root->
mGrpId);
2487 newMmd->setLanguage(root->
lang);
2488 newMmd->setId(root->
id);
2496 if (nd && aliasMd.get())
2500 if (fd && aliasMd.get())
2529 if (nd) ncdm->
moveTo(nd);
2558 aliasFullName = aliasCd->localName();
2562 aliasFullName = nd->
qualifiedName()+
"::"+aliasCd->localName();
2594 for (
const auto &fd : *fn)
2597 fd->addIncludedUsingDirectives(visitedFiles);
2617 if (lang==SrcLangExt::Java || lang==SrcLangExt::CSharp)
2622 AUTO_TRACE(
"class variable: file='{}' type='{}' scope='{}' name='{}' args='{}' prot={} mtype={} lang={} init='{}'",
2628 if (related!=Relationship::Member || mtype==MemberType::Friend ||
Config_getBool(HIDE_SCOPE_NAMES))
2630 if (root->
spec.isAlias())
2632 if (lang==SrcLangExt::Python)
2634 def=
"type "+name+args;
2643 def=type+
" "+name+args;
2648 if (root->
spec.isAlias())
2650 if (lang==SrcLangExt::Python)
2652 def=
"type "+qualScope+scopeSeparator+name+args;
2656 def=
"using "+qualScope+scopeSeparator+name;
2661 def=type+
" "+qualScope+scopeSeparator+name+args;
2673 def=qualScope+scopeSeparator+name+args;
2684 for (
const auto &imd : *mn)
2696 if (root->
lang==SrcLangExt::ObjC &&
2697 root->
mtype==MethodTypes::Property &&
2721 prot,Specifier::Normal,root->
isStatic,related,
2725 mmd->setTagInfo(root->
tagInfo());
2726 mmd->setMemberClass(cd);
2730 mmd->setDefinition(def);
2732 mmd->addSectionsToDefinition(root->
anchors);
2736 mmd->setMemberGroupId(root->
mGrpId);
2737 mmd->setMemberSpecifiers(root->
spec);
2738 mmd->setVhdlSpecifiers(root->
vhdlSpec);
2739 mmd->setReadAccessor(root->
read);
2740 mmd->setWriteAccessor(root->
write);
2742 mmd->setHidden(root->
hidden);
2744 mmd->setLanguage(root->
lang);
2745 mmd->setId(root->
id);
2748 mmd->setBodyDef(root->
fileDef());
2753 mmd->setRefItems(root->
sli);
2754 mmd->setRequirementReferences(root->
rqli);
2759 if (mtype==MemberType::Typedef)
2782 AUTO_TRACE(
"global variable: file='{}' type='{}' scope='{}' name='{}' args='{}' prot={} mtype={} lang={} init='{}'",
2788 if (mtype==MemberType::Typedef &&
Config_getBool(TYPEDEF_HIDES_STRUCT))
2794 static const reg::Ex re(R
"(\a\w*)");
2796 const std::string &typ = ttype.
str();
2799 DString typeValue = match.str();
2834 if (root->
spec.isAlias())
2836 if (lang==SrcLangExt::Python)
2838 def=
"type "+nd->
name()+sep+name+args;
2842 def=
"using "+nd->
name()+sep+name;
2847 def=type+
" "+nd->
name()+sep+name+args;
2852 def=nd->
name()+sep+name+args;
2859 if (name.
at(0)==
'@')
2865 if (root->
spec.isAlias())
2867 if (root->
lang==SrcLangExt::Python)
2869 def=
"type "+root->
name+args;
2873 def=
"using "+root->
name;
2878 def=type+
" "+name+args;
2899 for (
const auto &imd : *mn)
2913 bool isPHPArray = md->
getLanguage()==SrcLangExt::PHP &&
2916 bool staticsInDifferentFiles =
2922 !staticsInDifferentFiles
2964 mmd->setTagInfo(root->
tagInfo());
2965 mmd->setMemberSpecifiers(root->
spec);
2966 mmd->setVhdlSpecifiers(root->
vhdlSpec);
2970 mmd->addSectionsToDefinition(root->
anchors);
2973 mmd->setMemberGroupId(root->
mGrpId);
2974 mmd->setDefinition(def);
2975 mmd->setLanguage(root->
lang);
2976 mmd->setId(root->
id);
2984 mmd->setBodyDef(fd);
2989 mmd->setRefItems(root->
sli);
2990 mmd->setRequirementReferences(root->
rqli);
2993 mmd->setNamespace(nd);
3001 mmd->setFileDef(fd);
3007 if (mtype==MemberType::Typedef)
3029 if (lang == SrcLangExt::Fortran || lang == SrcLangExt::VHDL)
3034 static const reg::Ex re(R
"(\([^)]*[*&^][^)]*\))");
3036 size_t i=std::string::npos;
3040 i = match.position();
3043 if (i!=std::string::npos)
3045 size_t di = type.find(
"decltype(");
3046 if (di!=std::string::npos && di<i)
3048 i = std::string::npos;
3051 size_t bb=type.find(
'<');
3052 size_t be=type.rfind(
'>');
3053 bool templFp =
false;
3054 if (be!=std::string::npos) {
3055 size_t cc_ast = type.find(
"::*");
3056 size_t cc_amp = type.find(
"::&");
3057 templFp = (cc_ast != std::string::npos && cc_ast>be) || (cc_amp != std::string::npos && cc_amp>be);
3060 if (!type.empty() &&
3061 i!=std::string::npos &&
3062 type.find(
"operator")==std::string::npos &&
3063 (type.find(
")(")==std::string::npos || type.find(
"typedef ")!=std::string::npos) &&
3065 (!((bb!=std::string::npos && bb<i) && (be!=std::string::npos && i<be)) || templFp)
3068 if (pLength) *pLength=
static_cast<int>(l);
3071 return static_cast<int>(i);
3088 bool result =
false;
3089 bool typeIsClass =
false;
3090 bool typePtrType =
false;
3127 typeIsClass = resolver.
resolveClass(ctx,type)!=
nullptr;
3145 static const reg::Ex initChars(R
"([\d"'&*!^]+)");
3149 std::string name = a.
name.
str();
3150 if (
reg::search(name,match,initChars) && match.position()==0)
3182 std::string atype = a.
type.
str();
3183 if (
reg::search(atype,match,initChars) && match.position()==0)
3190 if (resType.empty()) resType=atype;
3191 static const reg::Ex idChars(R
"(\a\w*)");
3192 if (
reg::search(resType,match,idChars) && match.position()==0)
3194 resType=match.str();
3195 if (resType==
"int" || resType==
"long" ||
3196 resType==
"float" || resType==
"double" ||
3197 resType==
"char" || resType==
"void" ||
3198 resType==
"signed" || resType==
"unsigned" ||
3199 resType==
"const" || resType==
"volatile" )
3236 bool insideString=
false;
3237 bool insideChar=
false;
3239 while (e<len && brCount!=0)
3245 if (!insideString && !insideChar)
3247 if (e<len-1 && s.
at(e+1)==
'<')
3249 else if (roundCount==0)
3254 if (!insideString && !insideChar)
3256 if (e<len-1 && s.
at(e+1)==
'>')
3258 else if (roundCount==0)
3263 if (!insideString && !insideChar)
3267 if (!insideString && !insideChar)
3273 if (insideString && pc!=
'\\')
3282 if (insideChar && pc!=
'\\')
3292 return brCount==0 ?
static_cast<int>(e) : -1;
3301 AUTO_TRACE(
"VARIABLE_SEC: type='{}' name='{}' args='{}' bodyLine={} endBodyLine={} mGrpId={} relates='{}'",
3316 std::string sargs = args.
str();
3317 static const reg::Ex reName(R
"(\a\w*)");
3322 sargs = match.suffix().str();
3323 size_t j = sargs.find(
')');
3324 if (j!=std::string::npos) args=sargs.
substr(0,j);
3335 size_t ai = type.
find(
'[',ii);
3348 AUTO_TRACE_ADD(
"after correction: type='{}' name='{}' args='{}'",type,name,args);
3359 scope=name.
left(index);
3360 name=name.
mid(index+2);
3368 if (!scopeName.
empty())
3380 bool isRelated=
false;
3381 bool isMemberOf=
false;
3384 if (root->
lang==SrcLangExt::CSharp)
3397 for (
size_t i=0;i<name.
length()-1;i++)
3399 if (name[i]==
':' && name[i+1]==
':')
3401 p=
static_cast<int>(i);
3403 else if (name[i]==
'<')
3408 if (e!=-1) i=
static_cast<int>(e);
3426 Relationship::Member
3447 mtype=MemberType::EnumValue;
3449 mtype=MemberType::Typedef;
3450 else if (type_s.
startsWith(
"friend ") || type_s==
"friend")
3451 mtype=MemberType::Friend;
3452 else if (root->
mtype==MethodTypes::Property)
3453 mtype=MemberType::Property;
3454 else if (root->
mtype==MethodTypes::Event)
3455 mtype=MemberType::Event;
3457 mtype=sliceOpt ? MemberType::Sequence : MemberType::Typedef;
3459 mtype=sliceOpt ? MemberType::Dictionary : MemberType::Typedef;
3464 isMemberOf=(root->
relatesType==RelatesType::MemberOf);
3479 Relationship relationship = isMemberOf ? Relationship::Foreign :
3480 isRelated ? Relationship::Related :
3481 Relationship::Member ;
3493 else if (!name.
empty())
3519 scope=rname.
left(index);
3520 rname=rname.
mid(index+2);
3532 for (
auto &imd : *mn)
3534 if (!imd->isTypedef())
3543 bool notBothGrouped = root->
groups.empty() || imd->getGroupDef()==
nullptr;
3544 bool bothSameScope = (!cd && !nd) || (cd && imd->getClassDef() == cd) || (nd && imd->getNamespaceDef() == nd);
3547 if (notBothGrouped && bothSameScope && imd->typeString()==rtype)
3595 for (
const auto &e : root->
children())
3596 if (!e->section.isEnum())
3613 for (
const auto &e : root->
children())
3614 if (!e->section.isEnum())
3631 for (
const auto &e : root->
children())
3632 if (!e->section.isEnum())
3647 (root->
section.isVariable() &&
3650 (root->
section.isFunction() &&
3653 (root->
section.isFunction() &&
3662 for (
const auto &e : root->
children())
3663 if (!e->section.isEnum())
3678 enum MemberType type = root->
section.isExportedInterface() ? MemberType::Interface : MemberType::Service;
3689 mmd->setTagInfo(root->
tagInfo());
3690 mmd->setMemberClass(cd);
3692 mmd->setDocsForDefinition(
false);
3696 mmd->setMemberSpecifiers(root->
spec);
3697 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3698 mmd->setMemberGroupId(root->
mGrpId);
3700 mmd->setLanguage(root->
lang);
3701 mmd->setBodyDef(fd);
3702 mmd->setFileDef(fd);
3703 mmd->addSectionsToDefinition(root->
anchors);
3705 mmd->setDefinition(def);
3709 AUTO_TRACE(
"Interface member: fileName='{}' type='{}' name='{}' mtype='{}' prot={} virt={} state={} proto={} def='{}'",
3717 root->
spec.isOptional() ? Protection::Protected : Protection::Public, Specifier::Normal);
3727 mmd->setRefItems(root->
sli);
3728 mmd->setRequirementReferences(root->
rqli);
3737 if (root->
section.isExportedInterface() || root->
section.isIncludedService())
3739 AUTO_TRACE(
"Exported interface/included service: type='{}' scope='{}' name='{}' args='{}'"
3740 " relates='{}' relatesType='{}' file='{}' line={} bodyLine={} #tArgLists={}"
3741 " mGrpId={} spec={} proto={} docFile='{}'",
3764 else if (rname.
empty())
3767 "Illegal member name found.");
3773 case SrcLangExt::Unknown:
3774 case SrcLangExt::IDL:
3803 if (isFriend) mtype=MemberType::Friend;
3804 else if (root->
mtype==MethodTypes::Signal) mtype=MemberType::Signal;
3805 else if (root->
mtype==MethodTypes::Slot) mtype=MemberType::Slot;
3806 else if (root->
mtype==MethodTypes::DCOP) mtype=MemberType::DCOP;
3811 if ((fd==
nullptr || fd->
getLanguage()==SrcLangExt::Cpp) &&
3815 (j!=i+2 || name.
at(i+1)!=
'=')
3833 root->
relatesType==RelatesType::MemberOf ? Relationship::Foreign :
3834 Relationship::Related ;
3844 mmd->setTagInfo(root->
tagInfo());
3845 mmd->setMemberClass(cd);
3847 mmd->setDocsForDefinition(!root->
proto);
3851 mmd->setMemberSpecifiers(spec);
3852 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3853 mmd->setMemberGroupId(root->
mGrpId);
3855 mmd->setLanguage(root->
lang);
3856 mmd->setRequiresClause(root->
req);
3857 mmd->setId(root->
id);
3858 mmd->setBodyDef(fd);
3859 mmd->setFileDef(fd);
3860 mmd->addSectionsToDefinition(root->
anchors);
3865 if (scopeSeparator!=
"::")
3867 qualScope =
substitute(qualScope,
"::",scopeSeparator);
3869 if (lang==SrcLangExt::PHP)
3872 scopeSeparator=
"::";
3889 def=type+
" "+qualScope+scopeSeparator+name;
3893 def=qualScope+scopeSeparator+name;
3897 mmd->setDefinition(def);
3901 AUTO_TRACE(
"function member: type='{}' scope='{}' name='{}' args='{}' proto={} def='{}'",
3902 type, qualScope, rname, args, root->
proto, def);
3912 mmd->setRefItems(root->
sli);
3913 mmd->setRequirementReferences(root->
rqli);
3933 MemberType::Function,
3937 mmd->setTagInfo(root->
tagInfo());
3938 mmd->setLanguage(root->
lang);
3939 mmd->setId(root->
id);
3944 mmd->setDocsForDefinition(!root->
proto);
3950 mmd->addSectionsToDefinition(root->
anchors);
3951 mmd->setMemberSpecifiers(root->
spec);
3952 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3953 mmd->setMemberGroupId(root->
mGrpId);
3954 mmd->setRequiresClause(root->
req);
3964 if (!nscope.
empty())
3989 def=root->
type+
" "+scope+name;
3995 AUTO_TRACE(
"new non-member function type='{}' scope='{}' name='{}' args='{}' proto={} def='{}'",
3997 mmd->setDefinition(def);
4001 mmd->setRefItems(root->
sli);
4002 mmd->setRequirementReferences(root->
rqli);
4006 mmd->setNamespace(nd);
4013 mmd->setFileDef(fd);
4034 if (root->
section.isFunction())
4036 AUTO_TRACE(
"member function: type='{}' scope='{}' name='{}' args='{}' relates='{}' relatesType='{}'"
4037 " file='{}' line={} bodyLine={} #tArgLists={} mGrpId={}"
4038 " spec={} proto={} docFile='{}'",
4053 scope=rname.
left(index);
4054 rname=rname.
mid(index+2);
4063 if (root->
lang==SrcLangExt::CSharp)
4074 size_t memIndex=rname.
rfind(
"::");
4077 if (cd && scope+
"::"==rname.
left(scope.
length()+2))
4083 bool isMember=
false;
4086 size_t ts=rname.
find(
'<');
4087 size_t te=rname.
find(
'>');
4105 isMember=memIndex<ts || memIndex>te;
4145 for (
const auto &imd : *mn)
4158 fullScope.
prepend(parentScope);
4164 if (mnd) nsName = mnd->
name();
4165 if (rnd) rnsName = rnd->
name();
4173 bool sameTemplateArgs =
true;
4174 bool matchingReturnTypes =
true;
4175 bool sameRequiresClause =
true;
4181 matchingReturnTypes =
false;
4185 sameRequiresClause =
false;
4191 sameTemplateArgs =
false;
4194 bool staticsInDifferentFiles =
4197 if (sameTemplateArgs &&
4198 matchingReturnTypes &&
4199 sameRequiresClause &&
4200 !staticsInDifferentFiles &&
4207 if (!root->
groups.empty() && !root->
groups.front().groupname.empty())
4214 found=(mnd && rnd && nsName==rnsName) ||
4215 ((mnd==
nullptr && rnd==
nullptr && mfd!=
nullptr &&
4220 if (!found && gd && gd==md->
getGroupDef() && nsName==rnsName)
4226 AUTO_TRACE_ADD(
"combining function with prototype found={} in namespace '{}'",found,nsName);
4325 else if (rname.
empty())
4328 "Illegal member name found."
4346 for (
const auto &ifmd : *fn)
4350 for (
const auto &immd : *mn)
4366 AUTO_TRACE_ADD(
"Merging related global and member '{}' isFriend={} isRelated={} isFunction={}",
4443 for (
const auto &imdec : *mn)
4451 for (
const auto &imdef : *mn)
4454 if (mdef && mdec!=mdef &&
4474 for (
const auto &imd : *mn)
4490 if (mdef && mdec)
break;
4498 mdec->getOuterScope(),mdec->getFileDef(),mdec->typeString(),
const_cast<ArgumentList*
>(&mdecAl),
4505 mdec->mergeReferences(mdef);
4507 mdec->mergeReferencedBy(mdef);
4524 for (
const auto &imd : *mn)
4535 for (
const auto &irmd : *rmn)
4569 size_t i=qualifiedName.rfind(
"::");
4570 if (i!=std::string::npos)
4577 for (
const auto &imd : *mn)
4603 std::map<std::string,int> templateNames;
4605 for (
const Argument &arg : templateArguments)
4607 static const reg::Ex re(R
"(\a[\w:]*)");
4610 for (; it!=
end ; ++it)
4612 const auto &match = *it;
4613 std::string n = match.str();
4614 if (n==arg.name.str())
4616 if (templateNames.find(n)==templateNames.end())
4618 templateNames.emplace(n,count);
4623 return templateNames;
4638 if (context && cd!=context)
4643 if (result==
nullptr)
4648 if (result==
nullptr)
4677 for (
auto &mi : *mni)
4685 if (!typedefValue.
empty())
4687 type = typedefValue;
4706 usedClassName = typeCd->
name();
4716 if (templateNames.empty())
4720 BaseInfo bi(usedName,Protection::Public,Specifier::Normal);
4725 if (arg.name==usedName)
4729 if (usedCd==
nullptr)
4780 if (!found && !type.
empty())
4839 if (templateNames.empty())
4855 bool b =
Config_getBool(HIDE_UNDOC_RELATIONS) ? true : isArtificial;
4877 AUTO_TRACE(
"Derived from template '{}' with parameters '{}' isArtificial={}",
4878 templateClass->
name(),templSpec,isArtificial);
4881 bool existingClass = templSpec==tempArgsStr;
4882 if (existingClass)
return;
4884 bool freshInstance=
false;
4901 for (
auto it=it_pair.first ; it!=it_pair.second ; ++it)
4903 const Entry *templateRoot = it->second;
4904 AUTO_TRACE_ADD(
"template root found '{}' templSpec='{}'",templateRoot->
name,templSpec);
4910 isArtificial,templArgs.get(),templateNames);
4934 templateClassName,
true,
true);
4935 AUTO_TRACE_ADD(
"templateClassName={} baseClass={}",templateClassName,baseClass?baseClass->
name():
"<none>");
4964 if (name.
empty())
return 0;
4965 int l =
static_cast<int>(name.
length());
4971 while (count>0 && i>=0)
4976 case '>':
if (!insideQuote) count++;
break;
4977 case '<':
if (!insideQuote) count--;
break;
4978 case '\'':
if (!insideQuote) insideQuote=c;
4979 else if (insideQuote==c && (i<0 || name[i]!=
'\\')) insideQuote=0;
4981 case '"':
if (!insideQuote) insideQuote=c;
4982 else if (insideQuote==c && (i<0 || name[i]!=
'\\')) insideQuote=0;
5002 AUTO_TRACE(
"name={} base={} isArtificial={} mode={}",cd->
name(),bi->
name,isArtificial,(
int)mode);
5005 bool explicitGlobalScope=
false;
5008 biName=biName.
mid(2);
5009 explicitGlobalScope=
true;
5013 bool lastParent=
false;
5018 int scopeOffset=explicitGlobalScope ? 0 :
static_cast<int>(scopeName.
length());
5027 baseClassName.
prepend(scopeName.
left(scopeOffset)+
"::");
5029 if (root->
lang==SrcLangExt::CSharp)
5056 || explicitGlobalScope
5059 || (root->
lang==SrcLangExt::IDL &&
5060 (root->
section.isExportedInterface() ||
5061 root->
section.isIncludedService()))
5064 AUTO_TRACE_ADD(
"class relation '{}' inherited/used by '{}' found prot={} virt={} templSpec='{}'",
5065 baseClassName, root->
name, bi->
prot, bi->
virt, templSpec);
5068 size_t si=baseClassName.
rfind(
"::",i);
5070 if (baseClass==
nullptr &&
static_cast<size_t>(i)!=baseClassName.
length())
5080 baseClassName = baseClassName.
left(i)+baseClassName.
mid(e);
5091 else if (baseClass && !templSpec.
empty())
5102 baseClass = templClass;
5120 found=baseClass!=
nullptr && baseClass!=cd;
5130 found = baseClass!=
nullptr && baseClass!=cd;
5142 found = baseClass!=
nullptr && baseClass!=cd;
5145 bool isATemplateArgument = templateNames.find(biName.
str())!=templateNames.end();
5150 AUTO_TRACE_ADD(
"Documented base class '{}' templSpec='{}'",biName,templSpec);
5168 if (baseClassTypeDef==
nullptr)
5178 if (baseClassTypeDef)
5187 AUTO_TRACE_ADD(
"insertBaseClass name={} prot={} virt={} templSpec={}",usedName,prot,bi->
virt,templSpec);
5195 "Detected potential recursive class relation "
5196 "between class {} and base class {}!",
5203 else if (mode==
Undocumented && (scopeOffset==0 || isATemplateArgument))
5205 AUTO_TRACE_ADD(
"New undocumented base class '{}' baseClassName='{}' templSpec='{}' isArtificial={}",
5206 biName,baseClassName,templSpec,isArtificial);
5208 if (isATemplateArgument)
5211 if (baseClass==
nullptr)
5230 if (baseClass==
nullptr)
5241 si = baseClassName.
rfind(
"::");
5257 biName=
"<"+biName.
left(biName.
length()-2)+
">";
5261 AUTO_TRACE_ADD(
"insertBaseClass name={} prot={} virt={} templSpec={}",biName,bi->
prot,bi->
virt,templSpec);
5271 if (scope!=baseClass)
5297 "Detected potential recursive class relation "
5298 "between class {} and base class {}!",
5299 root->
name,baseClassName
5312 size_t o = scopeName.
rfind(
"::",scopeOffset-1);
5316 }
while (scopeOffset>=0);
5318 if (parentNode==
nullptr)
5324 parentNode=parentNode->
parent();
5326 }
while (lastParent);
5346 bool hasExtends = !root->
extends.empty();
5347 if (hasExtends)
return true;
5374 if (root->
lang==SrcLangExt::CSharp)
5380 bName = bName.
left(i);
5445 if (!nd->hasDocumentation())
5448 nd->getLanguage() == SrcLangExt::Fortran) &&
5452 warn_undoc(nd->getDefFileName(),nd->getDefLine(),
"{} {} is not documented.",
5453 nd->getLanguage() == SrcLangExt::Fortran ?
"Module" :
"Namespace",
5503 DString templSpec = ti.templSpec;
5517 for (
const auto &tn_kv : templateNames)
5519 size_t templIndex = tn_kv.second;
5521 bool hasActArg=
false;
5522 if (templIndex<templArgs->size())
5524 actArg=templArgs->at(templIndex);
5528 baseClassNames.find(actArg.
type.
str())!=baseClassNames.end() &&
5529 actualTemplateNames.find(actArg.
type.
str())==actualTemplateNames.end()
5532 actualTemplateNames.emplace(actArg.
type.
str(),
static_cast<int>(templIndex));
5567 for (
const auto &fd : *fn)
5569 fd->computeAnchors();
5582 gd->computeAnchors();
5589template<
typename Func>
5612 for (
const auto &fd : *fn)
5685 if (md==
nullptr)
return;
5686 AUTO_TRACE(
"scope='{}' name='{}' args='{}' funcDecl='{}' mSpec={}",
5701 fullName = cd->
name();
5703 fullName = nd->
name();
5705 if (!fullName.
empty()) fullName+=
"::";
5706 fullName+=md->
name();
5811 "member {} belongs to two different groups. The second one found here will be ignored.",
5849 return allowNoGroup;
5852 for (
const auto &g : root->
groups)
5854 if (g.groupname == gd->
name())
5877 AUTO_TRACE(
"namespace='{}' type='{}' name='{}' tempArg='{}' decl='{}'",namespaceName,type,name,tempArg,decl);
5879 if (n.
empty())
return false;
5891 for (
const auto &md : *mn)
5902 if (md->isAlias() && md->getOuterScope() &&
5909 nd = md->getNamespaceDef();
5913 size_t enumNamePos=0;
5914 if (nd && md->isEnumValue() && (enumNamePos=namespaceName.
rfind(
"::"))!=
DString::npos)
5916 DString enumName = namespaceName.
mid(enumNamePos+2);
5917 if (namespaceName.
left(enumNamePos)==nd->
name())
5922 for (
const auto &emd : *enumMn)
5924 found = emd->isStrong() && md->getEnumScope()==emd.get();
5938 else if (nd==
nullptr && md->isEnumValue())
5943 for (
const auto &emd : *enumMn)
5945 found = emd->isStrong() && md->getEnumScope()==emd.get();
5968 if ((namespaceName.
empty() && nd==
nullptr) ||
5969 (nd && nd->
name()==namespaceName) ||
5973 AUTO_TRACE_ADD(
"Try to add member '{}' to scope '{}'",md->name(),namespaceName);
5981 md->isVariable() || md->isTypedef() ||
5982 matchArguments2(md->getOuterScope(),md->getFileDef(),md->typeString(),&mdAl,
5989 if (matching && !root->
tArgLists.empty())
6008 if (matching && md->isStatic() &&
6009 md->getDefFileName()!=root->
fileName &&
6017 if (!md->templateArguments().empty() && !root->
tArgLists.empty())
6022 if (md->templateArguments().size()!=root->
tArgLists.back().size() ||
6023 md->typeString()!=type ||
6024 md->requiresClause()!=root->
req)
6040 if (!found && root->
relatesType!=RelatesType::Duplicate && root->
section.isFunction())
6044 DString warnMsg =
"no matching file member found for \n"+fullFuncDecl;
6047 warnMsg+=
"\nPossible candidates:";
6048 for (
const auto &md : *mn)
6052 warnMsg+=
"' " +
warn_line(md->getDefFileName(),md->getDefLine());
6060 if (root->
type!=
"friend class" &&
6061 root->
type!=
"friend struct" &&
6062 root->
type!=
"friend union" &&
6063 root->
type!=
"friend" &&
6069 "documented symbol '{}' was not declared or defined.",
qPrint(decl)
6081 auto srcIt = srcTempArgLists.begin();
6082 auto dstIt = dstTempArgLists.begin();
6083 while (srcIt!=srcTempArgLists.end() && dstIt!=dstTempArgLists.end())
6085 if ((*srcIt).size()!=(*dstIt).size())
return true;
6099 result = cd->templateArguments().hasParameters() || cd->templateMaster()!=
nullptr ||
6109 const std::string &src
6113 static const reg::Ex re(R
"(\a\w*)");
6118 for (; it!=
end ; ++it)
6120 const auto &match = *it;
6121 size_t i = match.position();
6122 size_t l = match.length();
6124 dst+=src.substr(p,i-p);
6125 std::string name=match.str();
6127 auto srcIt = srcTempArgLists.begin();
6128 auto dstIt = dstTempArgLists.begin();
6129 while (srcIt!=srcTempArgLists.end() && !found)
6132 std::vector<Argument>::const_iterator tdaIt;
6133 if (dstIt!=dstTempArgLists.end())
6136 tdaIt = tdAli->
begin();
6141 for (
auto tsaIt = tsaLi.
begin(); tsaIt!=tsaLi.
end() && !found; ++tsaIt)
6145 if (tdAli && tdaIt!=tdAli->
end())
6161 else if (tdaType.
startsWith(
"typename ")) vc=9;
6164 tdaName = tdaType.
mid(vc);
6166 if (!tdaName.
empty())
6197 auto dstIt = dst.
begin();
6202 if (dstIt == dst.
end())
6206 da.
array = dstArray;
6214 da.
array = dstArray;
6222 srcTempArgLists,dstTempArgLists,
6248 funcType,funcName,funcArgs,exceptions,
6252 mmd->setTagInfo(root->
tagInfo());
6253 mmd->setLanguage(root->
lang);
6254 mmd->setId(root->
id);
6255 mmd->makeImplementationDetail();
6256 mmd->setMemberClass(cd);
6257 mmd->setDefinition(funcDecl);
6263 mmd->setDocsForDefinition(!root->
proto);
6265 mmd->addSectionsToDefinition(root->
anchors);
6269 mmd->setMemberSpecifiers(spec);
6270 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6271 mmd->setMemberGroupId(root->
mGrpId);
6274 mmd->setRefItems(root->
sli);
6275 mmd->setRequirementReferences(root->
rqli);
6311 bool memFound=
false;
6312 for (
const auto &imd : *mn)
6315 if (md==
nullptr)
continue;
6317 if (cd==
nullptr)
continue;
6329 size_t enumNamePos=0;
6332 DString enumName = className.
mid(enumNamePos+2);
6334 if (!namespaceName.
empty()) fullScope.
prepend(namespaceName+
"::");
6335 if (fullScope==cd->
name())
6341 for (
const auto &emd : *enumMn)
6343 memFound = emd->isStrong() && md->
getEnumScope()==emd.get();
6349 if (memFound)
break;
6354 if (memFound)
break;
6372 if (!templAl.
empty())
6374 declTemplArgs.push_back(templAl);
6382 bool substDone=
false;
6389 if (declTemplArgs.size()>0 && declTemplArgs.size()==defTemplArgs.size())
6412 AUTO_TRACE_ADD(
"matching '{}'<=>'{}' className='{}' namespaceName='{}' result={}",
6441 AUTO_TRACE_ADD(
"Comparing return types '{}'<->'{}' #args {}<->{}",
6449 else if (defTemplArgs.size()>declTemplArgs.size())
6451 AUTO_TRACE_ADD(
"Different number of template arguments {} vs {}",defTemplArgs.size(),declTemplArgs.size());
6457 bool rootIsUserDoc = root->
section.isMemberDoc();
6460 bool classOrMdIsTemplate = mdIsTemplate || classIsTemplate;
6461 bool rootIsTemplate = !root->
tArgLists.empty();
6463 if (!rootIsUserDoc &&
6464 (mdIsTemplate || rootIsTemplate) &&
6465 ((classOrMdIsTemplate && !rootIsTemplate) || (!classOrMdIsTemplate && rootIsTemplate))
6470 AUTO_TRACE_ADD(
"Comparing return types: template v.s. non-template");
6474 AUTO_TRACE_ADD(
"Match results of matchArguments2='{}' substDone='{}'",matching,substDone);
6485 if (!funcTempList.
empty() &&
6505 else if (cd && cd!=tcd)
6511 if (memFound)
break;
6515 addLocalObjCMethod(root,scopeName,funcType,funcName,funcArgs,exceptions,funcDecl,spec);
6518 if (count==0 && !(isFriend && funcType==
"class"))
6521 const ClassDef *ecd =
nullptr, *ucd =
nullptr;
6522 MemberDef *emd =
nullptr, *umd =
nullptr;
6524 for (
const auto &md : *mn)
6546 AUTO_TRACE_ADD(
"new candidate className='{}' scope='{}' args='{}': exact match",
6547 className,ccd->
name(),md->argsString());
6553 AUTO_TRACE_ADD(
"new candidate className='{}' scope='{}' args='{}': no match",
6554 className,ccd->
name(),md->argsString());
6559 bool strictProtoMatching =
Config_getBool(STRICT_PROTO_MATCHING);
6560 if (!strictProtoMatching)
6562 if (candidates==1 && ucd && umd)
6569 else if (candidates>1 && ecd && emd)
6580 if (noMatchCount>1) warnMsg+=
"uniquely ";
6581 warnMsg+=
"matching class member found for \n";
6585 warnMsg+=
" template ";
6590 DString fullFuncDecl=funcDecl;
6594 warnMsg+=fullFuncDecl;
6596 if (candidates>0 || noMatchCount>=1)
6598 warnMsg+=
"\nPossible candidates:";
6604 for (
const auto &md : *mn)
6606 const ClassDef *cd=md->getClassDef();
6620 warnMsg+=
"template ";
6625 if (!md->typeString().empty())
6627 warnMsg+=md->typeString();
6631 if (!qScope.
empty())
6632 warnMsg+=qScope+
"::"+md->name();
6633 warnMsg+=md->argsString();
6634 warnMsg+=
"' " +
warn_line(md->getDefFileName(),md->getDefLine());
6655 AUTO_TRACE(
"funcType={} funcName={} funcArgs={} funcDecl={} spec={}",funcType,funcName,funcArgs,funcDecl,spec);
6657 for (
const auto &md : *mn)
6659 if (md->getClassDef()==cd)
6671 funcType,funcName,funcArgs,exceptions,
6677 mmd->setTagInfo(root->
tagInfo());
6678 mmd->setLanguage(root->
lang);
6679 mmd->setId(root->
id);
6680 mmd->setMemberClass(cd);
6681 mmd->setTemplateSpecialization(
true);
6683 mmd->setDefinition(funcDecl);
6689 mmd->setDocsForDefinition(!root->
proto);
6691 mmd->addSectionsToDefinition(root->
anchors);
6695 mmd->setMemberSpecifiers(spec);
6696 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6697 mmd->setMemberGroupId(root->
mGrpId);
6699 mmd->setRefItems(root->
sli);
6700 mmd->setRequirementReferences(root->
rqli);
6714 bool sameClass=
false;
6719 [](
const auto &md1,
const auto &md2)
6720 { return md1->getClassDef()->name()==md2->getClassDef()->name(); });
6726 if (cd==
nullptr)
return;
6729 if (root->
mtype==MethodTypes::Signal) mtype=MemberType::Signal;
6730 else if (root->
mtype==MethodTypes::Slot) mtype=MemberType::Slot;
6731 else if (root->
mtype==MethodTypes::DCOP) mtype=MemberType::DCOP;
6734 std::unique_ptr<ArgumentList> tArgList =
6739 funcType,funcName,funcArgs,exceptions,
6743 mmd->setTagInfo(root->
tagInfo());
6744 mmd->setLanguage(root->
lang);
6745 mmd->setId(root->
id);
6747 mmd->setMemberClass(cd);
6748 mmd->setDefinition(funcDecl);
6757 mmd->setDocsForDefinition(!root->
proto);
6759 mmd->addSectionsToDefinition(root->
anchors);
6763 mmd->setMemberSpecifiers(spec);
6764 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6765 mmd->setMemberGroupId(root->
mGrpId);
6768 mmd->setRefItems(root->
sli);
6769 mmd->setRequirementReferences(root->
rqli);
6827 AUTO_TRACE(
"root='{}' funcDecl='{}' related='{}' overload={} isFunc={} mGrpId={} #tArgList={} spec={} lang={}",
6840 bool isRelated=
false;
6841 bool isMemberOf=
false;
6842 bool isFriend=
false;
6855 spec.setInline(
true);
6860 spec.setExplicit(
true);
6865 spec.setMutable(
true);
6870 spec.setThreadLocal(
true);
6887 if (!funcDecl.
empty() && funcDecl[0]!=
' ') funcDecl.
prepend(
" ");
6899 if (isFriend && funcDecl.
startsWith(
"class "))
6902 funcDecl=funcDecl.
mid(6);
6903 funcName = funcDecl;
6905 else if (isFriend && funcDecl.
startsWith(
"struct "))
6907 funcDecl=funcDecl.
mid(7);
6908 funcName = funcDecl;
6914 funcArgs,funcTempList,exceptions
6922 AUTO_TRACE_ADD(
"scopeName='{}' className='{}' namespaceName='{}' funcType='{}' funcName='{}' funcArgs='{}'",
6923 scopeName,className,namespaceName,funcType,funcName,funcArgs);
6924 if (!relates.
empty())
6927 isMemberOf=(root->
relatesType == RelatesType::MemberOf);
6934 scopeName = relates;
6944 if (!scopeName.
empty() &&
6947 scopeName = joinedName;
6961 DString joinedName = fnd->name()+
"::"+scopeName;
6964 scopeName=joinedName;
6991 AUTO_TRACE_ADD(
"scopeName='{}' className='{}' namespaceName='{}'",scopeName,className,namespaceName);
6996 if (!namespaceName.
empty())
6998 if (className.
empty())
7000 scopeName=namespaceName;
7002 else if (!relates.
empty() ||
7005 scopeName=namespaceName+
"::"+className;
7009 scopeName=className;
7012 else if (!className.
empty())
7014 scopeName=className;
7018 DString tempScopeName=scopeName;
7022 if (funcSpec.
empty())
7024 uint32_t argListIndex=0;
7029 tempScopeName=scopeName+funcSpec;
7037 if (!scopeName.
empty() && !isRelated && !isFriend && !
Config_getBool(HIDE_SCOPE_NAMES) && root->
lang!=SrcLangExt::Python)
7039 if (!funcType.
empty())
7043 funcDecl=funcType+
" "+tempScopeName+
"::"+funcName+funcTempList;
7047 funcDecl=funcType+
" "+tempScopeName+
"::"+funcName+funcArgs;
7054 funcDecl=tempScopeName+
"::"+funcName+funcTempList;
7058 funcDecl=tempScopeName+
"::"+funcName+funcArgs;
7064 if (!funcType.
empty())
7068 funcDecl=funcType+
" "+funcName+funcTempList;
7072 funcDecl=funcType+
" "+funcName+funcArgs;
7079 funcDecl=funcName+funcTempList;
7083 funcDecl=funcName+funcArgs;
7088 if (funcType==
"template class" && !funcTempList.
empty())
7091 AUTO_TRACE_ADD(
"Parse results: namespaceName='{}' className=`{}` funcType='{}' funcSpec='{}' "
7092 " funcName='{}' funcArgs='{}' funcTempList='{}' funcDecl='{}' relates='{}'"
7093 " exceptions='{}' isRelated={} isMemberOf={} isFriend={} isFunc={}",
7094 namespaceName, className, funcType, funcSpec,
7095 funcName, funcArgs, funcTempList, funcDecl, relates,
7096 exceptions, isRelated, isMemberOf, isFriend, isFunc);
7098 if (!funcName.
empty())
7102 bool strongEnum =
false;
7106 for (
const auto &imd : *mn)
7117 if (!namespaceName.
empty())
7119 namespaceName+=
"::"+className;
7123 namespaceName=className;
7131 funcName =
substitute(funcName,className+
"::",
"");
7134 if (!funcTempList.
empty())
7142 if (!isRelated && !strongEnum && mn)
7145 if (!className.
empty())
7147 if (funcSpec.
empty())
7150 funcArgs,funcTempList,exceptions,
7151 type,args,isFriend,spec,relates,funcDecl,overloaded,isFunc);
7163 else if (overloaded)
7165 addOverloaded(root,mn,funcType,funcName,funcArgs,funcDecl,exceptions,spec);
7169 if (!
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec))
7171 DString fullFuncDecl=funcDecl;
7174 "Cannot determine class for function\n{}",
7180 else if (isRelated && !relates.
empty())
7182 AUTO_TRACE_ADD(
"related function scopeName='{}' className='{}'",scopeName,className);
7183 if (className.
empty()) className=relates;
7187 bool newMember=
true;
7193 for (
const auto &imd : *mn)
7227 mn->
push_back(std::move(mdDefineTaken));
7241 for (
const auto &irmd : *mn)
7262 addMemberDocs(root,rmd_found,funcDecl,
nullptr,overloaded,spec);
7270 switch (root->
mtype)
7272 case MethodTypes::Method: mtype = MemberType::Function;
break;
7273 case MethodTypes::Signal: mtype = MemberType::Signal;
break;
7274 case MethodTypes::Slot: mtype = MemberType::Slot;
break;
7275 case MethodTypes::DCOP: mtype = MemberType::DCOP;
break;
7276 case MethodTypes::Property: mtype = MemberType::Property;
break;
7277 case MethodTypes::Event: mtype = MemberType::Event;
break;
7291 funcType,funcName,funcArgs,exceptions,
7294 isMemberOf ? Relationship::Foreign : Relationship::Related,
7314 mmd->setDefinitionTemplateParameterLists(root->
tArgLists);
7316 mmd->setTagInfo(root->
tagInfo());
7330 for (
const auto &irmd : *rmn)
7361 mmd->setBodyDef(fd);
7368 mmd->setMemberClass(cd);
7369 mmd->setMemberSpecifiers(spec);
7370 mmd->setVhdlSpecifiers(root->
vhdlSpec);
7371 mmd->setDefinition(funcDecl);
7376 mmd->setDocsForDefinition(!root->
proto);
7379 mmd->addSectionsToDefinition(root->
anchors);
7380 mmd->setMemberGroupId(root->
mGrpId);
7381 mmd->setLanguage(root->
lang);
7382 mmd->setId(root->
id);
7386 mmd->setRefItems(root->
sli);
7387 mmd->setRequirementReferences(root->
rqli);
7388 if (root->
relatesType==RelatesType::Duplicate) mmd->setRelatedAlso(cd);
7396 if (!
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec))
7398 DString fullFuncDecl=funcDecl;
7401 "Cannot determine file/namespace for relatedalso function\n{}",
7415 addLocalObjCMethod(root,scopeName,funcType,funcName,funcArgs,exceptions,funcDecl,spec);
7419 bool globMem =
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec);
7420 if (className.
empty() && !globMem)
7424 else if (!className.
empty() && !globMem)
7427 "member '{}' of class '{}' cannot be found",
7428 funcName,className);
7446 AUTO_TRACE(
"root->type='{}' root->inside='{}' root->name='{}' root->args='{}' section={} root->spec={} root->mGrpId={}",
7461 type=type.
left(i+l);
7472 if (root->
section.isMemberDoc())
7498 else if (root->
section.isOverloadDoc())
7512 (root->
section.isVariable() &&
7530 type+
" "+root->
name,
7534 else if (!type.
empty())
7563 else if (root->
section.isVariableDoc())
7575 else if (root->
section.isExportedInterface() ||
7576 root->
section.isIncludedService())
7582 type +
" " + root->
name,
7595 if (root->
section.isMemberDoc() ||
7596 root->
section.isOverloadDoc() ||
7599 root->
section.isVariableDoc() ||
7601 root->
section.isIncludedService() ||
7602 root->
section.isExportedInterface()
7612 for (
const auto &e : root->
children())
7614 if (!e->section.isEnum())
7626 for (
const auto &objCImpl : root->
children())
7628 if (objCImpl->section.isObjcImpl())
7630 for (
const auto &objCMethod : objCImpl->children())
7632 if (objCMethod->section.isFunction())
7636 objCMethod->relates,
7639 objCMethod->type+
" "+objCImpl->name+
"::"+objCMethod->name+
" "+objCMethod->args,
7641 objCMethod->section=EntryType::makeEmpty();
7660 bool isGlobal =
false;
7661 bool isRelated =
false;
7662 bool isMemberOf =
false;
7671 if (root->
lang==SrcLangExt::CSharp)
7694 isMemberOf=(root->
relatesType==RelatesType::MemberOf);
7702 if (cd && !name.
empty())
7729 isMemberOf ? Relationship::Foreign : isRelated ? Relationship::Related : Relationship::Member,
7730 MemberType::Enumeration,
7733 mmd->setTagInfo(root->
tagInfo());
7734 mmd->setLanguage(root->
lang);
7735 mmd->setId(root->
id);
7736 if (!isGlobal) mmd->setMemberClass(cd);
else mmd->setFileDef(fd);
7738 mmd->setBodyDef(root->
fileDef());
7739 mmd->setMemberSpecifiers(root->
spec);
7740 mmd->setVhdlSpecifiers(root->
vhdlSpec);
7741 mmd->setEnumBaseType(root->
args);
7744 mmd->addSectionsToDefinition(root->
anchors);
7745 mmd->setMemberGroupId(root->
mGrpId);
7749 mmd->setRefItems(root->
sli);
7750 mmd->setRequirementReferences(root->
rqli);
7755 if (!baseType.
empty())
7764 mmd->setDefinition(name+baseType);
7768 mmd->setDefinition(nd->
name()+
"::"+name+baseType);
7772 mmd->setNamespace(nd);
7779 if (isGlobal && (nd==
nullptr || !nd->
isAnonymous()))
7781 if (!defSet) mmd->setDefinition(name+baseType);
7782 if (fd==
nullptr && root->
parent())
7788 mmd->setFileDef(fd);
7796 mmd->setDefinition(name+baseType);
7800 mmd->setDefinition(cd->
name()+
"::"+name+baseType);
7806 mmd->setDocsForDefinition(!root->
proto);
7836 bool isGlobal =
false;
7837 bool isRelated =
false;
7846 if (root->
lang==SrcLangExt::CSharp)
7861 if (root->
lang==SrcLangExt::CSharp)
7880 if (cd && !name.
empty())
7907 struct EnumValueInfo
7909 EnumValueInfo(
const DString &n,std::unique_ptr<MemberDef> &&md) :
7910 name(n), member(std::move(md)) {}
7912 std::unique_ptr<MemberDef> member;
7914 std::vector< EnumValueInfo > extraMembers;
7916 for (
const auto &imd : *mn)
7923 for (
const auto &e : root->
children())
7926 bool isJavaLike = sle==SrcLangExt::CSharp || sle==SrcLangExt::Java || sle==SrcLangExt::XML;
7927 if ( isJavaLike || root->
spec.isStrong())
7929 if (sle == SrcLangExt::Cpp && e->section.isDefine())
continue;
7936 if (
size_t i = qualifiedName.
rfind(
"::"); i!=
DString::npos && sle==SrcLangExt::CSharp)
7942 qualifiedName=
substitute(qualifiedName,
"::",
".");
7946 DString fileName = e->fileName;
7947 if (fileName.
empty() && e->tagInfo())
7949 fileName = e->tagInfo()->tagName;
7953 fileName,e->startLine,e->startColumn,
7954 e->type,e->name,e->args,
DString(),
7955 e->protection, Specifier::Normal,e->isStatic,Relationship::Member,
7962 fmmd->setNamespace(mnd);
7966 fmmd->setTagInfo(e->tagInfo());
7967 fmmd->setLanguage(e->lang);
7968 fmmd->setBodySegment(e->startLine,e->bodyLine,e->endBodyLine);
7969 fmmd->setBodyDef(e->fileDef());
7971 fmmd->setDocumentation(e->doc,e->docFile,e->docLine);
7972 fmmd->setBriefDescription(e->brief,e->briefFile,e->briefLine);
7973 fmmd->addSectionsToDefinition(e->anchors);
7974 fmmd->setInitializer(e->initializer.str());
7975 fmmd->setMaxInitLines(e->initLines);
7976 fmmd->setMemberGroupId(e->mGrpId);
7977 fmmd->setExplicitExternal(e->explicitExternal,fileName,e->startLine,e->startColumn);
7978 fmmd->setRefItems(e->sli);
7979 fmmd->setRequirementReferences(e->rqli);
7982 fmmd->setEnumScope(md,
true);
7983 extraMembers.emplace_back(e->name,std::move(fmd));
7992 if (!e->name.empty() && (fmn=emnsd->
find(e->name)))
7995 for (
const auto &ifmd : *fmn)
8026 else if (isRelated && cd)
8058 for (
auto &e : extraMembers)
8104 if (gd==
nullptr && !root->
groups.empty())
8118 for (
const auto &g : root->
groups)
8137 "Found non-existing group '{}' for the command '{}', ignoring command",
8151 if (root->
section.isEnumDoc() &&
8176 AUTO_TRACE(
"Found docs for enum with name '{}' and scope '{}' in context '{}' cd='{}', nd='{}' fd='{}'",
8190 for (
const auto &imd : *mn)
8205 else if (cd==
nullptr && mcd==
nullptr && nd!=
nullptr && mnd==nd)
8212 else if (cd==
nullptr && nd==
nullptr && mcd==
nullptr && mnd==
nullptr && fd==mfd)
8237 for (
const auto &mn : mnsd)
8240 for (
const auto &imd : *mn)
8245 int documentedEnumValues=0;
8249 if (fmd->isLinkableInProject()) documentedEnumValues++;
8275 for (
const auto &md : *mn)
8277 index.addClassMemberNameToIndex(md.get());
8278 if (md->getModuleDef())
8280 index.addModuleMemberNameToIndex(md.get());
8288 for (
const auto &md : *mn)
8290 if (md->getNamespaceDef())
8292 index.addNamespaceMemberNameToIndex(md.get());
8296 index.addFileMemberNameToIndex(md.get());
8298 if (md->getModuleDef())
8300 index.addModuleMemberNameToIndex(md.get());
8305 index.sortMemberIndexLists();
8314 if (cd->isLinkableInProject())
8327 if (cd->isLinkableInProject())
8340 if (nd->isLinkableInProject())
8353 for (
const auto &fd : *fn)
8369 std::string s = title.str();
8370 static const reg::Ex re(R
"(\a[\w-]*)");
8373 for (; it!=
end ; ++it)
8375 const auto &match = *it;
8376 std::string matchStr = match.str();
8384 if (gd->isLinkableInProject())
8386 addWordsForTitle(gd.get(),gd->anchor(),gd->groupTitle());
8392 if (pd->isLinkableInProject())
8394 addWordsForTitle(pd.get(),pd->anchor(),pd->title());
8403 auto addMemberToSearchIndex = [](
const MemberDef *md)
8409 DString qn=md->qualifiedName();
8414 if (md->getClassDef())
8418 if (md->getNamespaceDef())
8429 if (md->getGroupDef()) scope = md->getGroupDef();
8430 else if (md->getClassDef()) scope = md->getClassDef();
8431 else if (md->getNamespaceDef()) scope = md->getNamespaceDef();
8432 else if (md->getFileDef()) scope = md->getFileDef();
8436 auto addMemberToIndices = [addMemberToSearchIndex,getScope](
const MemberDef *md)
8438 if (md->isLinkableInProject())
8440 if (!(md->isEnumerate() && md->isAnonymous()))
8443 addMemberToSearchIndex(md);
8445 if (md->isEnumerate())
8447 for (
const auto &fmd : md->enumFieldList())
8450 addMemberToSearchIndex(fmd);
8460 for (
const auto &md : *mn)
8462 addMemberToIndices(md.get());
8469 for (
const auto &md : *mn)
8471 addMemberToIndices(md.get());
8484 for (
const auto &imd : *mn)
8497 for (
const auto &imd : *mn)
8514 for (
const auto &imd : *mn)
8523 const auto &bmni = bmn.
find(mn->memberName());
8526 for (
const auto &ibmd : *bmni)
8534 lang==SrcLangExt::Python ||
8535 lang==SrcLangExt::Java ||
8536 lang==SrcLangExt::PHP ||
8547 lang==SrcLangExt::Python ||
8554 if (lang==SrcLangExt::Python && md->
name().
startsWith(
"__"))
continue;
8594 if (cd->isLinkable())
8596 for (
const auto &bcd : cd->baseClasses())
8612 for (
const auto &ti : cd->getTemplateInstances())
8637 AUTO_TRACE_ADD(
"merging members of category {} into {}",cd->name(),baseClass->
name());
8652 cd->subClasses().empty() &&
8653 !cd->baseClasses().empty())
8684 msg(
"Generating code for file {}...\n",fd->
docName());
8689 else if (parseSources)
8691 msg(
"Parsing code for file {}...\n",fd->
docName());
8707 for (
const auto &fd : *fn)
8715 for (
const auto &fd : *fn)
8724 clangParser->parse();
8725 processSourceFile(fd.get(),*
g_outputList,clangParser.get());
8727 for (
auto incFile : clangParser->filesInSameTU())
8729 if (filesToProcess.find(incFile)!=filesToProcess.end() &&
8731 processedFiles.
find(incFile)==processedFiles.end())
8738 processSourceFile(ifd,*
g_outputList,clangParser.get());
8739 processedFiles.insert(incFile);
8750 for (
const auto &fd : *fn)
8752 if (processedFiles.find(fd->
absFilePath().
str())==processedFiles.end())
8757 clangParser->parse();
8758 processSourceFile(fd.get(),*
g_outputList,clangParser.get());
8771 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8774 msg(
"Generating code files using {} threads.\n",numThreads);
8775 struct SourceContext
8778 : fd(fd_), generateSourceFile(gen_), ol(ol_) {}
8780 bool generateSourceFile;
8784 std::vector< std::future< std::shared_ptr<SourceContext> > > results;
8787 for (
const auto &fd : *fn)
8790 auto ctx = std::make_shared<SourceContext>(fd.get(),generateSourceFile,*
g_outputList);
8791 auto processFile = [ctx]()
8793 if (ctx->generateSourceFile)
8795 msg(
"Generating code for file {}...\n",ctx->fd->docName());
8799 msg(
"Parsing code for file {}...\n",ctx->fd->docName());
8802 ctx->fd->getAllIncludeFilesRecursively(filesInSameTu);
8803 if (ctx->generateSourceFile)
8805 ctx->fd->writeSourceHeader(ctx->ol);
8806 ctx->fd->writeSourceBody(ctx->ol,
nullptr);
8807 ctx->fd->writeSourceFooter(ctx->ol);
8812 ctx->fd->parseSource(
nullptr);
8816 results.emplace_back(threadPool.
queue(processFile));
8819 for (
auto &f : results)
8828 for (
const auto &fd : *fn)
8848 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8854 : fd(fd_), ol(ol_) {}
8859 std::vector< std::future< std::shared_ptr<DocContext> > > results;
8862 for (
const auto &fd : *fn)
8864 bool doc = fd->isLinkableInProject();
8867 auto ctx = std::make_shared<DocContext>(fd.get(),*
g_outputList);
8868 auto processFile = [ctx]() {
8869 msg(
"Generating docs for file {}...\n",ctx->fd->docName());
8870 ctx->fd->writeDocumentation(ctx->ol);
8873 results.emplace_back(threadPool.
queue(processFile));
8877 for (
auto &f : results)
8886 for (
const auto &fd : *fn)
8888 bool doc = fd->isLinkableInProject();
8891 msg(
"Generating docs for file {}...\n",fd->docName());
8910 const_cast<FileDef*
>(fd)->addSourceRef(cd->getStartDefLine(),cd.get(),
nullptr);
8919 const_cast<FileDef*
>(fd)->addSourceRef(cd->getStartDefLine(),cd.get(),
nullptr);
8928 const_cast<FileDef*
>(fd)->addSourceRef(nd->getStartDefLine(),nd.get(),
nullptr);
8935 for (
const auto &md : *mn)
8944 md->isLinkableInProject() &&
8950 const_cast<FileDef*
>(fd)->addSourceRef(md->getStartDefLine(),md->getOuterScope(),md.get());
8956 for (
const auto &md : *mn)
8966 md->isLinkableInProject() &&
8972 const_cast<FileDef*
>(fd)->addSourceRef(md->getStartDefLine(),md->getOuterScope(),md.get());
8989 for (
const auto &def : it->second)
8992 def.fileName,def.lineNr,def.columnNr,
8993 "#define",def.name,def.args,
DString(),
8994 Protection::Public,Specifier::Normal,
false,Relationship::Member,MemberType::Define,
8998 if (!def.args.empty())
9002 mmd->setInitializer(def.definition);
9003 mmd->setFileDef(def.fileDef);
9004 mmd->setDefinition(
"#define "+def.name);
9009 const MemberList *defMl = def.fileDef->getMemberList(MemberListType::DocDefineMembers());
9018 def.fileDef->insertMember(md.get());
9020 AUTO_TRACE_ADD(
"adding macro {} with definition {}",def.name,def.definition);
9054 for (
const auto &fd : *fn)
9056 fd->sortMemberLists();
9063 gd->sortMemberLists();
9080 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
9084 std::vector < std::future< void > > results;
9088 for (
const auto &def : symList)
9091 if (dm && !
isSymbolHidden(def) && !def->isArtificial() && def->isLinkableInProject())
9093 auto processTooltip = [dm]() {
9096 results.emplace_back(threadPool.
queue(processTooltip));
9101 for (
auto &f : results)
9110 for (
const auto &def : symList)
9113 if (dm && !
isSymbolHidden(def) && !def->isArtificial() && def->isLinkableInProject())
9160 for (
const auto &fd : *fn)
9182 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
9188 : cd(cd_), ol(ol_) {}
9193 std::vector< std::future< std::shared_ptr<DocContext> > > results;
9194 for (
const auto &cd : classList)
9197 if (cd->getOuterScope()==
nullptr ||
9201 auto ctx = std::make_shared<DocContext>(cd,*
g_outputList);
9202 auto processFile = [ctx]()
9204 msg(
"Generating docs for compound {}...\n",ctx->cd->displayName());
9208 if (!ctx->cd->isHidden() && !ctx->cd->isEmbeddedInOuterScope() &&
9209 ctx->cd->isLinkableInProject() && !ctx->cd->isImplicitTemplateInstance())
9211 ctx->cd->writeDocumentation(ctx->ol);
9212 ctx->cd->writeMemberList(ctx->ol);
9216 ctx->cd->writeDocumentationForInnerClasses(ctx->ol);
9219 results.emplace_back(threadPool.
queue(processFile));
9222 for (
auto &f : results)
9229 for (
const auto &cd : classList)
9233 if (cd->getOuterScope()==
nullptr ||
9239 if ( !cd->isHidden() && !cd->isEmbeddedInOuterScope() &&
9240 cd->isLinkableInProject() && !cd->isImplicitTemplateInstance())
9242 msg(
"Generating docs for compound {}...\n",cd->displayName());
9257 for (
const auto &innerCdi : cd->
getClasses())
9262 AUTO_TRACE(
"innerCd={} isLinkable={} isImplicitTemplateInstance={} protectLevelVisible={} embeddedInOuterScope={}",
9271 list.push_back(innerCd);
9279 std::vector<ClassDefMutable*> classList;
9328 for (
const auto &imd : *mn)
9364 for (
const auto &fd : *fn)
9366 fd->combineUsingRelations();
9398 for (
const auto &fd : *fn)
9400 fd->addMembersToMemberGroup();
9415 gd->addMembersToMemberGroup();
9436 for (
const auto &fd : *fn)
9438 fd->distributeMemberGroupDocumentation();
9453 gd->distributeMemberGroupDocumentation();
9483 for (
const auto &fd : *fn)
9485 fd->findSectionsInDocumentation();
9500 gd->findSectionsInDocumentation();
9505 pd->findSectionsInDocumentation();
9510 dd->findSectionsInDocumentation();
9533 for (
const auto &ifmd : *fn)
9547 for (
const auto &imd : *nm)
9578 for (
const auto &imd : *nm)
9598 return fd->absFilePath() == root->
fileName;
9643 Protection::Public,Specifier::Normal,
false,Relationship::Member,MemberType::Define,
9646 mmd->setTagInfo(root->
tagInfo());
9647 mmd->setLanguage(root->
lang);
9659 for (
const auto &md : *mn)
9661 if (md->memberType()==MemberType::Define) count++;
9665 for (
const auto &imd : *mn)
9668 if (md && md->
memberType()==MemberType::Define)
9683 for (
const auto &imd : *mn)
9686 if (md && md->
memberType()==MemberType::Define)
9710 warn(root->
fileName,root->
startLine,
"found documented #define {} but ignoring it because ENABLE_PREPROCESSING is NO.", root->
name);
9724 normalizedName =
substitute(normalizedName,
"\\",
"/");
9727 if (root->
docFile==normalizedName)
9731 normalizedName=normalizedName.
left(lastSlashPos);
9734 if (normalizedName.
at(normalizedName.
length()-1)!=
'/')
9736 normalizedName+=
'/';
9738 DirDef *matchingDir=
nullptr;
9742 if (dir->name().right(normalizedName.
length())==normalizedName)
9747 "\\dir command matches multiple directories.\n"
9748 " Applying the command for directory {}\n"
9749 " Ignoring the command for directory {}",
9750 matchingDir->
name(),dir->name()
9755 matchingDir=dir.get();
9772 warn(root->
fileName,root->
startLine,
"No matching directory found for command \\dir {}",normalizedName);
9781 if (root->
section.isRequirementDoc())
9793 if (root->
section.isPageDoc())
9800 else if (root->
section.isMainpageDoc())
9820 if (root->
section.isMainpageDoc())
9853 else if (si->
lineNr() != -1)
9855 warn(root->
fileName,root->
startLine,
"multiple use of section label '{}' for main page, (first occurrence: {}, line {})",
9860 warn(root->
fileName,root->
startLine,
"multiple use of section label '{}' for main page, (first occurrence: {})",
9877 else if (root->
tagInfo()==
nullptr)
9880 "found more than one \\mainpage comment block! (first occurrence: {}, line {}), Skipping current block!",
9890 if (root->
section.isMainpageDoc())
9914 term(
"page defined {} with label {} is a direct "
9915 "subpage of itself! Please remove this cyclic dependency.\n",
9939 term(
"page defined {} with label {} is a subpage "
9940 "of itself! Please remove this cyclic dependency.\n",
9941 warn_line(pd->docFile(),pd->docLine()),pd->name());
9966 DString label=
"_"+rl->listName();
9967 if (si->label().left(label.
length())==label)
9969 si->setFileName(rl->listName());
9970 si->setGenerated(
true);
9976 if (!si->generated())
9980 if (!si->fileName().empty() &&
9987 if (si->definition())
9994 gd = (
toMemberDef(si->definition()))->getGroupDef();
10024 if (!pd->getGroupDef() && !pd->isReference())
10026 msg(
"Generating docs for page {}...\n",pd->name());
10041 warn(root->
fileName,root->
startLine,
"Example {} was already documented. Ignoring documentation found here.",root->
name);
10069 indentStr.
fill(
' ',indent);
10071 indentStr.
empty()?
"":indentStr,
10076 for (
const auto &e : root->
children())
10094 si->label(),si->fileName(),si->title(),si->type().level(),si->ref());
10108 msg(
"Generating docs for example {}...\n",pd->name());
10110 if (lang != SrcLangExt::Unknown)
10114 intf->resetCodeParserState();
10116 DString n=pd->getOutputFileBase();
10123 if (pd->showLineNo())
10125 lineNoOptStr=
"{lineno}";
10131 (pd->briefDescription().empty()?
"":pd->briefDescription()+
"\n\n")+
10132 pd->documentation()+
"\n\n\\include"+lineNoOptStr+
" "+pd->name(),
10134 .setIndexWords(
true)
10135 .setExample(pd->name()));
10148 if (!gd->isReference())
10160 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10166 : cdm(cdm_), ol(ol_) {}
10171 std::vector< std::future< std::shared_ptr<DocContext> > > results;
10173 for (
const auto &cd : classList)
10178 auto ctx = std::make_shared<DocContext>(cdm,*
g_outputList);
10179 auto processFile = [ctx]()
10181 if ( ( ctx->cdm->isLinkableInProject() &&
10182 !ctx->cdm->isImplicitTemplateInstance()
10185 && !ctx->cdm->isHidden() && !ctx->cdm->isEmbeddedInOuterScope()
10188 msg(
"Generating docs for compound {}...\n",ctx->cdm->displayName());
10189 ctx->cdm->writeDocumentation(ctx->ol);
10190 ctx->cdm->writeMemberList(ctx->ol);
10192 ctx->cdm->writeDocumentationForInnerClasses(ctx->ol);
10195 results.emplace_back(threadPool.
queue(processFile));
10199 for (
auto &f : results)
10201 auto ctx = f.get();
10207 for (
const auto &cd : classList)
10212 if ( ( cd->isLinkableInProject() &&
10213 !cd->isImplicitTemplateInstance()
10216 && !cd->isHidden() && !cd->isEmbeddedInOuterScope()
10219 msg(
"Generating docs for compound {}...\n",cd->displayName());
10233 for (
const auto &cd : conceptList)
10238 msg(
"Generating docs for concept {}...\n",cd->name());
10253 if (nd->isLinkableInProject())
10258 msg(
"Generating docs for namespace {}\n",nd->displayName());
10296 DString cmd=qhgLocation+
" -v 2>&1";
10301 err(
"could not execute {}\n",qhgLocation);
10305 const size_t bufSize = 1024;
10306 char inBuf[bufSize+1];
10307 size_t numRead=fread(inBuf,1,bufSize,f);
10308 inBuf[numRead] =
'\0';
10313 static const reg::Ex versionReg(R
"(Qt (\d+)\.(\d+)\.(\d+))");
10315 std::string s = inBuf;
10322 if (qtVersion>0 && (qtVersion<60000 || qtVersion >= 60205))
10331 err(
"could not execute {}\n",qhgLocation);
10335 std::string output;
10336 while ((numRead=fread(inBuf,1,bufSize,f))>0)
10338 inBuf[numRead] =
'\0';
10361 if (!dotPath.
empty())
10370 warn_uncond(
"the dot tool could not be found as '{}'\n",dotPath);
10376 size_t l=dotPath.
length();
10377 for (
size_t i=0;i<l;i++)
if (dotPath.
at(i)==
'/') dotPath.
at(i)=
'\\';
10396 bool updateOnly=
false)
10400 bool writeToStdout=configFile==
"-";
10405 if (!writeToStdout)
10409 msg(
"\n\nConfiguration file '{}' created.\n\n",configFile);
10410 msg(
"Now edit the configuration file and enter\n\n");
10411 if (configFile!=
"Doxyfile" && configFile!=
"doxyfile")
10412 msg(
" doxygen {}\n\n",configFile);
10414 msg(
" doxygen\n\n");
10415 msg(
"to generate the documentation for your project\n\n");
10419 msg(
"\n\nConfiguration file '{}' updated.\n\n",configFile);
10425 term(
"Cannot open file {} for writing\n",configFile);
10440 term(
"Cannot open stdout for writing\n");
10455 if (fileName.
empty() || destName.
empty())
return;
10460 fileName = tagLine;
10466 err(
"Tag file '{}' does not exist or is not a file. Skipping it...\n",fileName);
10474 if (!destName.
empty())
10477 msg(
"Reading tag file '{}', location '{}'...\n",fileName,destName);
10481 msg(
"Reading tag file '{}'...\n",fileName);
10491 for (
const auto &sheet : latexExtraStyleSheet)
10493 std::string fileName = sheet;
10494 if (!fileName.empty())
10499 err(
"Style sheet '{}' specified by LATEX_EXTRA_STYLESHEET does not exist!\n",fileName);
10501 else if (fi.
isDir())
10503 err(
"Style sheet '{}' specified by LATEX_EXTRA_STYLESHEET is a directory, it has to be a file!\n", fileName);
10522 if (!htmlStyleSheet.
empty())
10529 err(
"Style sheet '{}' specified by HTML_STYLESHEET does not exist!\n",htmlStyleSheet);
10532 else if (fi.
isDir())
10534 err(
"Style sheet '{}' specified by HTML_STYLESHEET is a directory, it has to be a file!\n",htmlStyleSheet);
10540 copyFile(htmlStyleSheet,destFileName);
10545 for (
const auto &sheet : htmlExtraStyleSheet)
10553 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET does not exist!\n",fileName);
10557 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET is already a built-in stylesheet. Please use a different name\n",fi.
fileName());
10559 else if (fi.
isDir())
10561 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET is a directory, it has to be a file!\n",fileName);
10575 if (!projectLogo.
empty())
10580 err(
"Project logo '{}' specified by PROJECT_LOGO does not exist!\n",projectLogo);
10583 else if (fi.
isDir())
10585 err(
"Project logo '{}' specified by PROJECT_LOGO is a directory, it has to be a file!\n",projectLogo);
10591 copyFile(projectLogo,destFileName);
10600 if (!projectIcon.
empty())
10605 err(
"Project icon '{}' specified by PROJECT_ICON does not exist!\n",projectIcon);
10608 else if (fi.
isDir())
10610 err(
"Project icon '{}' specified by PROJECT_ICON is a directory, it has to be a file!\n",projectIcon);
10616 copyFile(projectIcon,destFileName);
10624 for (
const auto &fileName : files)
10626 if (!fileName.empty())
10631 err(
"Extra file '{}' specified in {} does not exist!\n", fileName,filesOption);
10633 else if (fi.
isDir())
10635 err(
"Extra file '{}' specified in {} is a directory, it has to be a file!\n", fileName,filesOption);
10655 FileEntry(
const DString &p,
FileDef *fd) : path(p), fileDef(fd) {}
10661 std::vector<FileEntry> fileEntries;
10662 for (
const auto &fd : *fn)
10664 if (!fd->isReference())
10666 fileEntries.emplace_back(fd->getPath(),fd.get());
10670 size_t size = fileEntries.size();
10674 FileDef *fd = fileEntries[0].fileDef;
10680 std::stable_sort(fileEntries.begin(),
10682 [](
const FileEntry &fe1,
const FileEntry &fe2)
10683 { return dstricmp_sort(fe1.path,fe2.path)<0; }
10688 const FileEntry &first = fileEntries[0];
10689 const FileEntry &last = fileEntries[size-1];
10690 int first_path_size =
static_cast<int>(first.path.size())-1;
10691 int last_path_size =
static_cast<int>(last.path.size())-1;
10694 for (i=0;i<first_path_size && i<last_path_size;i++)
10696 if (first.path[i]==
'/') j=i;
10697 if (first.path[i]!=last.path[i])
break;
10699 if (i==first_path_size && i<last_path_size && last.path[i]==
'/')
10704 else if (i==last_path_size && i<first_path_size && first.path[i]==
'/')
10711 for (
auto &fileEntry : fileEntries)
10713 DString prefix = fileEntry.path.right(fileEntry.path.length()-j-1);
10714 fileEntry.fileDef->setName(
prefix+fn->fileName());
10716 fileEntry.fileDef->setDiskName(
prefix+fn->fileName());
10730 size_t sep = fileName.
rfind(
'/');
10731 size_t ei = fileName.
rfind(
'.');
10734 extension=fileName.
mid(ei);
10738 extension =
".no_extension";
10753 extension=fileName.
mid(ei);
10757 extension =
".no_extension";
10761 std::string preBuf;
10768 for (
const auto &s : includePath)
10774 msg(
"Preprocessing {}...\n",fn);
10781 msg(
"Reading {}...\n",fn);
10786 std::string convBuf;
10787 convBuf.reserve(preBuf.size()+1024);
10792 std::shared_ptr<Entry> fileRoot = std::make_shared<Entry>();
10796 if (newTU) clangParser->
parse();
10799 parser.
parseInput(fileName,convBuf.
data(),fileRoot,clangParser);
10800 fileRoot->setFileDef(fd);
10817 filesToProcess.insert(s);
10820 std::mutex processedFilesLock;
10822 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10823 msg(
"Processing input using {} threads.\n",numThreads);
10825 using FutureType = std::vector< std::shared_ptr<Entry> >;
10826 std::vector< std::future< FutureType > > results;
10829 bool ambig =
false;
10836 auto processFile = [qs,&filesToProcess,&processedFilesLock,&processedFiles]() {
10837 bool ambig_l =
false;
10838 std::vector< std::shared_ptr<Entry> > roots;
10842 auto fileRoot {
parseFile(*parser.get(),fd_l,qs,clangParser.get(),
true) };
10843 roots.push_back(fileRoot);
10847 for (
auto incFile : clangParser->filesInSameTU())
10850 if (filesToProcess.find(incFile)!=filesToProcess.end())
10852 bool needsToBeProcessed =
false;
10854 std::lock_guard<std::mutex> lock(processedFilesLock);
10855 needsToBeProcessed = processedFiles.find(incFile)==processedFiles.end();
10856 if (needsToBeProcessed) processedFiles.insert(incFile);
10858 if (qincFile!=qs && needsToBeProcessed)
10864 fileRoot =
parseFile(*parser.get(),ifd,qincFile,clangParser.get(),
false);
10865 roots.push_back(fileRoot);
10873 results.emplace_back(threadPool.
queue(processFile));
10877 for (
auto &f : results)
10882 root->moveToSubEntryAndKeep(e);
10889 if (processedFiles.find(s)==processedFiles.end())
10892 auto processFile = [s]() {
10893 bool ambig =
false;
10895 std::vector< std::shared_ptr<Entry> > roots;
10902 auto fileRoot =
parseFile(*parser.get(),fd,qs,clangParser.get(),
true);
10903 roots.push_back(fileRoot);
10907 auto fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
10908 roots.push_back(fileRoot);
10912 results.emplace_back(threadPool.
queue(processFile));
10916 for (
auto &f : results)
10921 root->moveToSubEntryAndKeep(e);
10928 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10929 msg(
"Processing input using {} threads.\n",numThreads);
10931 using FutureType = std::shared_ptr<Entry>;
10932 std::vector< std::future< FutureType > > results;
10936 auto processFile = [s]() {
10937 bool ambig =
false;
10941 auto fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
10945 results.emplace_back(threadPool.
queue(processFile));
10948 for (
auto &f : results)
10950 root->moveToSubEntryAndKeep(f.get());
10968 filesToProcess.insert(s);
10974 bool ambig =
false;
10982 auto fileRoot =
parseFile(*parser.get(),fd,qs,clangParser.get(),
true);
10983 root->moveToSubEntryAndKeep(fileRoot);
10984 processedFiles.insert(s);
10988 for (
auto incFile : clangParser->filesInSameTU())
10991 if (filesToProcess.find(incFile)!=filesToProcess.end() &&
10992 processedFiles.find(incFile)==processedFiles.end())
10998 fileRoot =
parseFile(*parser.get(),ifd,incFile,clangParser.get(),
false);
10999 root->moveToSubEntryAndKeep(fileRoot);
11000 processedFiles.insert(incFile);
11009 if (processedFiles.find(s)==processedFiles.end())
11011 bool ambig =
false;
11018 auto fileRoot =
parseFile(*parser.get(),fd,qs,clangParser.get(),
true);
11019 root->moveToSubEntryAndKeep(fileRoot);
11024 std::shared_ptr<Entry> fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
11025 root->moveToSubEntryAndKeep(fileRoot);
11027 processedFiles.insert(s);
11036 bool ambig =
false;
11041 std::shared_ptr<Entry> fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
11042 root->moveToSubEntryAndKeep(std::move(fileRoot));
11062 sepPos = result.
find(
'/',2);
11064 sepPos = result.
find(
'/',sepPos+1);
11066 sepPos = result.
find(
'/',sepPos+1);
11069 if (nonSymlinks.find(
prefix.str())==nonSymlinks.end())
11086 target+=result.
mid(sepPos);
11089 if (known.find(result.
str())!=known.end())
return std::string();
11090 known.insert(result.
str());
11103 nonSymlinks.insert(
prefix.str());
11128 bool errorIfNotExist,
11135 if (paths && !dirName.empty())
11137 paths->insert(dirName);
11143 if (dirName.empty())
11158 msg(
"Searching for files in directory {}\n", fi->
absFilePath());
11165 for (
const auto &dirEntry : dir.
iterator())
11168 auto checkPatterns = [&]() ->
bool
11170 return (patList==
nullptr || cfi.
match(*patList,caseSenseNames)) &&
11171 (exclPatList==
nullptr || !cfi.
match(*exclPatList,caseSenseNames)) &&
11172 (killSet==
nullptr || killSet->find(cfi.
absFilePath())==killSet->end());
11175 if (exclSet==
nullptr || exclSet->find(cfi.
absFilePath())==exclSet->end())
11183 if (errorIfNotExist && checkPatterns())
11188 else if (cfi.
isFile() && checkPatterns())
11191 std::string path=cfi.
dirPath()+
"/";
11192 std::string fullName=path+name;
11199 fn = fnMap->
add(name);
11200 fn->push_back(std::move(fd));
11203 dirResultList.push_back(fullName);
11204 if (resultSet) resultSet->insert(fullName);
11205 if (killSet) killSet->insert(fullName);
11207 else if (recursive &&
11209 (exclPatList==
nullptr || !cfi.
match(*exclPatList,caseSenseNames)) &&
11214 patList,exclPatList,&dirResultList,resultSet,errorIfNotExist,
11215 recursive,killSet,paths);
11219 if (resultList && !dirResultList.empty())
11222 std::stable_sort(dirResultList.begin(),
11223 dirResultList.end(),
11224 [](
const auto &f1,
const auto &f2) { return dstricmp_sort(f1.c_str(),f2.c_str())<0; });
11227 resultList->insert(resultList->end(), dirResultList.begin(), dirResultList.end());
11244 bool errorIfNotExist,
11251 if (s.
empty())
return;
11258 if (exclSet==
nullptr || exclSet->find(fi.
absFilePath())==exclSet->end())
11265 if (errorIfNotExist)
11267 warn_uncond(
"source '{}' is not a readable file or directory... skipping.\n",s);
11272 std::string dirPath = fi.
dirPath(
true);
11274 if (paths && !dirPath.empty())
11276 paths->insert(dirPath);
11279 if (killSet==
nullptr || killSet->find(filePath)==killSet->end())
11288 fn->push_back(std::move(fd));
11291 if (resultList || resultSet)
11293 if (resultList) resultList->push_back(filePath);
11294 if (resultSet) resultSet->insert(filePath);
11300 else if (fi.
isDir())
11302 readDir(&fi,fnMap,exclSet,patList,
11303 exclPatList,resultList,resultSet,errorIfNotExist,
11304 recursive,killSet,paths);
11318 anchor=
":"+md->
anchor();
11327 t <<
"REPLACE INTO symbols (symbol_id,scope_id,name,file,line) VALUES('"
11328 << fn+anchor <<
"','"
11330 << d->
name() <<
"','"
11344 for (
const auto &def : symList)
11356 msg(
"Developer parameters:\n");
11357 msg(
" -m dump symbol map\n");
11358 msg(
" -b making messages output unbuffered\n");
11359 msg(
" -c <file> process input file as a comment block and produce HTML output\n");
11361 msg(
" -t [<file|stdout|stderr>] trace debug info to file, stdout, or stderr (default file stdout)\n");
11362 msg(
" -t_time [<file|stdout|stderr>] trace debug info to file, stdout, or stderr (default file stdout),\n"
11363 " and include time and thread information\n");
11365 msg(
" -d <level> enable a debug level, such as (multiple invocations of -d are possible):\n");
11376 DString versionString = getFullVersion();
11377 msg(
"{}\n",versionString);
11381 if (!extVers.
empty()) extVers+=
", ";
11382 extVers +=
"sqlite3 ";
11383 extVers += sqlite3_libversion();
11385 if (!extVers.
empty()) extVers+=
", ";
11386 extVers +=
"clang support ";
11387 extVers += CLANG_VERSION_STRING;
11389 if (!extVers.
empty())
11393 extVers = extVers.
replace(lastComma,1,
" and");
11395 msg(
" with {}.\n",extVers);
11406 msg(
"Doxygen version {0}\nCopyright Dimitri van Heesch 1997-2025\n\n"
11407 "You can use Doxygen in a number of ways:\n\n"
11408 "1) Use Doxygen to generate a template configuration file*:\n"
11409 " {1} [-s] -g [configName]\n\n"
11410 "2) Use Doxygen to update an old configuration file*:\n"
11411 " {1} [-s] -u [configName]\n\n"
11412 "3) Use Doxygen to generate documentation using an existing "
11413 "configuration file*:\n"
11414 " {1} [configName]\n\n"
11415 "4) Use Doxygen to generate a template file controlling the layout of the\n"
11416 " generated documentation:\n"
11417 " {1} -l [layoutFileName]\n\n"
11418 " In case layoutFileName is omitted DoxygenLayout.xml will be used as filename.\n"
11419 " If - is used for layoutFileName Doxygen will write to standard output.\n\n"
11420 "5) Use Doxygen to generate a template style sheet file for RTF, HTML or Latex.\n"
11421 " RTF: {1} -w rtf styleSheetFile\n"
11422 " HTML: {1} -w html headerFile footerFile styleSheetFile [configFile]\n"
11423 " LaTeX: {1} -w latex headerFile footerFile styleSheetFile [configFile]\n\n"
11424 "6) Use Doxygen to generate a rtf extensions file\n"
11425 " {1} -e rtf extensionsFile\n\n"
11426 " If - is used for extensionsFile Doxygen will write to standard output.\n\n"
11427 "7) Use Doxygen to compare the used configuration file with the template configuration file\n"
11428 " {1} -x [configFile]\n\n"
11429 " Use Doxygen to compare the used configuration file with the template configuration file\n"
11430 " without replacing the environment variables or CMake type replacement variables\n"
11431 " {1} -x_noenv [configFile]\n\n"
11432 "8) Use Doxygen to show a list of built-in emojis.\n"
11433 " {1} -f emoji outputFileName\n\n"
11434 " If - is used for outputFileName Doxygen will write to standard output.\n\n"
11435 "*) If -s is specified the comments of the configuration items in the config file will be omitted.\n"
11436 " If configName is omitted 'Doxyfile' will be used as a default.\n"
11437 " If - is used for configFile Doxygen will write / read the configuration to /from standard output / input.\n\n"
11438 "If -q is used for a Doxygen documentation run, Doxygen will see this as if QUIET=YES has been set.\n\n"
11439 "-v print version string, -V print extended version information\n"
11440 "-h,-? prints usage help information\n"
11441 "{1} -d prints additional usage flags for debugging purposes\n",versionString,name);
11448static const char *
getArg(
int argc,
char **argv,
int &optInd)
11451 if (
dstrlen(&argv[optInd][2])>0)
11452 s=&argv[optInd][2];
11453 else if (optInd+1<argc && argv[optInd+1][0]!=
'-')
11472 return []() {
return std::make_unique<T>(); };
11480 std::setlocale(LC_ALL,
"");
11481 std::setlocale(LC_CTYPE,
"C");
11482 std::setlocale(LC_NUMERIC,
"C");
11580 DString versionString = getFullVersion();
11583 auto writeFile = [](
const char *fileName,std::function<void(
TextStream&)> func) ->
bool
11603 bool genConfig=
false;
11604 bool shortList=
false;
11605 bool traceTiming=
false;
11607 bool updateConfig=
false;
11608 bool quiet =
false;
11609 while (optInd<argc && argv[optInd][0]==
'-' &&
11610 (isalpha(argv[optInd][1]) || argv[optInd][1]==
'?' ||
11611 argv[optInd][1]==
'-')
11614 switch(argv[optInd][1])
11624 if (optInd+1>=argc)
11626 layoutName=
"DoxygenLayout.xml";
11630 layoutName=argv[optInd+1];
11638 if (optInd+1>=argc)
11640 msg(
"option \"-c\" is missing the file name to read\n");
11656 if (debugLabel.
empty())
11665 msg(
"option \"-d\" has unknown debug specifier: \"{}\".\n",debugLabel);
11675 if (!strcmp(argv[optInd]+1,
"t_time"))
11677 traceTiming =
true;
11679 else if (!strcmp(argv[optInd]+1,
"t"))
11681 traceTiming =
false;
11685 err(
"option should be \"-t\" or \"-t_time\", found: \"{}\".\n",argv[optInd]);
11689 if (optInd+1>=argc || argv[optInd+1][0] ==
'-')
11691 traceName=
"stdout";
11695 traceName=argv[optInd+1];
11699 err(
"support for option \"-t\" has not been compiled in (use a debug build or a release build with tracing enabled).\n");
11710 err(
"option should be \"-x\" or \"-x_noenv\", found: \"{}\".\n",argv[optInd]);
11724 if (formatName.
empty())
11726 err(
"option \"-e\" is missing format specifier rtf.\n");
11732 if (optInd+1>=argc)
11734 err(
"option \"-e rtf\" is missing an extensions file name\n");
11742 err(
"option \"-e\" has invalid format specifier.\n");
11750 if (listName.
empty())
11752 err(
"option \"-f\" is missing list specifier.\n");
11758 if (optInd+1>=argc)
11760 err(
"option \"-f emoji\" is missing an output file name\n");
11768 err(
"option \"-f\" has invalid list specifier.\n");
11776 if (formatName.
empty())
11778 err(
"option \"-w\" is missing format specifier rtf, html or latex\n");
11784 if (optInd+1>=argc)
11786 err(
"option \"-w rtf\" is missing a style sheet file name\n");
11792 err(
"error opening RTF style sheet file {}!\n",argv[optInd+1]);
11802 if (optInd+4<argc ||
FileInfo(
"Doxyfile").exists() ||
FileInfo(
"doxyfile").exists())
11808 err(
"error opening or reading configuration file {}!\n",argv[optInd+4]);
11813 if (optInd+3>=argc)
11815 err(
"option \"-w html\" does not have enough arguments\n");
11832 if (optInd+4<argc ||
FileInfo(
"Doxyfile").exists() ||
FileInfo(
"doxyfile").exists())
11837 err(
"error opening or reading configuration file {}!\n",argv[optInd+4]);
11842 if (optInd+3>=argc)
11844 err(
"option \"-w latex\" does not have enough arguments\n");
11860 err(
"Illegal format specifier \"{}\": should be one of rtf, html or latex\n",formatName);
11880 if (
dstrcmp(&argv[optInd][2],
"help")==0)
11882 usage(argv[0],versionString);
11885 else if (
dstrcmp(&argv[optInd][2],
"version")==0)
11891 else if ((
dstrcmp(&argv[optInd][2],
"Version")==0) ||
11892 (
dstrcmp(&argv[optInd][2],
"VERSION")==0))
11900 err(
"Unknown option \"-{}\"\n",&argv[optInd][1]);
11901 usage(argv[0],versionString);
11906 setvbuf(stdout,
nullptr,_IONBF,0);
11913 usage(argv[0],versionString);
11917 err(
"Unknown option \"-{:c}\"\n",argv[optInd][1]);
11918 usage(argv[0],versionString);
11929 TRACE(
"Doxygen version used: {}",getFullVersion());
11932 FileInfo configFileInfo1(
"Doxyfile"),configFileInfo2(
"doxyfile");
11935 if (configFileInfo1.exists())
11937 configName=
"Doxyfile";
11939 else if (configFileInfo2.
exists())
11941 configName=
"doxyfile";
11943 else if (genConfig)
11945 configName=
"Doxyfile";
11949 err(
"Doxyfile not found and no input file specified!\n");
11950 usage(argv[0],versionString);
11957 if (fi.
exists() ||
dstrcmp(argv[optInd],
"-")==0 || genConfig)
11959 configName=argv[optInd];
11963 err(
"configuration file {} not found!\n",argv[optInd]);
11964 usage(argv[0],versionString);
11978 err(
"could not open or read configuration file {}!\n",configName);
12050 for (
const auto &mapping : extMaps)
12068 err(
"Failed to map file extension '{}' to unsupported language '{}'.\n"
12069 "Check the EXTENSION_MAPPING setting in the config file.\n",
12074 msg(
"Adding custom extension mapping: '{}' will be treated as language '{}'\n",
12083 if (cd==
reinterpret_cast<void *
>(-1))
12085 term(
"unsupported character conversion: '{}'->'UTF-8': {}\n"
12086 "Check the 'INPUT_ENCODING' setting in the config file!\n",
12096 for (
const auto &mapping : fileEncod)
12112 if (cd==
reinterpret_cast<void *
>(-1))
12114 term(
"unsupported character conversion: '{}'->'UTF-8': {}\n"
12115 "Check the 'INPUT_FILE_ENCODING' setting in the config file!\n",
12116 encoding,strerror(errno));
12129 for (
const auto &s : expandAsDefinedList)
12147 signal(SIGINT,SIG_DFL);
12149 msg(
"Cleaning up...\n");
12164 if (generateTagFile.
empty())
return;
12169 err(
"cannot open tag file {} for writing\n", generateTagFile);
12173 tagFile <<
"<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>\n";
12174 tagFile <<
"<tagfile doxygen_version=\"" << getDoxygenVersion() <<
"\"";
12175 std::string gitVersion = getGitVersion();
12176 if (!gitVersion.empty())
12178 tagFile <<
" doxygen_gitid=\"" << gitVersion <<
"\"";
12185 for (
const auto &fd : *fn)
12187 if (fd->isLinkableInProject()) fd->writeTagFile(tagFile);
12220 if (gd->isLinkableInProject()) gd->writeTagFile(tagFile);
12225 if (mod->isLinkableInProject()) mod->writeTagFile(tagFile);
12230 if (pd->isLinkableInProject()) pd->writeTagFile(tagFile);
12237 if (dd->isLinkableInProject()) dd->writeTagFile(tagFile);
12241 tagFile <<
"</tagfile>\n";
12249 msg(
"Exiting...\n");
12258 const DString &formatDirName,
12259 const char *defaultDirName)
12261 DString result = formatDirName;
12262 if (result.
empty())
12264 result = baseDirName + defaultDirName;
12266 else if (formatDirName[0]!=
'/' && (formatDirName.
length()==1 || formatDirName[1]!=
':'))
12268 result.
prepend(baseDirName+
"/");
12270 Dir formatDir(result.
str());
12273 term(
"Could not create output directory {}\n", result);
12287 g_s.
begin(
"Searching for include files...\n");
12290 for (
const auto &s : includePathList)
12308 g_s.
begin(
"Searching for example files...\n");
12311 for (
const auto &s : examplePathList)
12327 g_s.
begin(
"Searching for images...\n");
12330 for (
const auto &s : imagePathList)
12345 g_s.
begin(
"Searching for dot files...\n");
12348 for (
const auto &s : dotFileList)
12363 g_s.
begin(
"Searching for msc files...\n");
12366 for (
const auto &s : mscFileList)
12381 g_s.
begin(
"Searching for dia files...\n");
12384 for (
const auto &s : diaFileList)
12399 g_s.
begin(
"Searching for plantuml files...\n");
12402 for (
const auto &s : plantUmlFileList)
12417 g_s.
begin(
"Searching for mermaid files...\n");
12420 for (
const auto &s : mermaidFileList)
12435 g_s.
begin(
"Searching for files to exclude\n");
12437 for (
const auto &s : excludeList)
12456 g_s.
begin(
"Searching INPUT for files to process...\n");
12460 for (
const auto &s : inputList)
12463 size_t l = path.
length();
12467 if (path.
at(l-1)==
'\\' || path.
at(l-1)==
'/') path=path.
left(l-1);
12488 if (fileName->size()>1)
12490 std::stable_sort(fileName->begin(),fileName->end(),[](
const auto &f1,
const auto &f2)
12492 return dstricmp_sort(f1->absFilePath(),f2->absFilePath())<0;
12498 [](
const auto &f1,
const auto &f2)
12500 return dstricmp_sort(f1->front()->absFilePath(),f2->front()->absFilePath())<0;
12504 warn_uncond(
"No files to be processed, please check your settings, in particular INPUT, FILE_PATTERNS, and RECURSIVE\n");
12515 if (mdfileAsMainPage.
empty())
return;
12519 warn_uncond(
"Specified markdown mainpage '{}' does not exist\n",mdfileAsMainPage);
12522 bool ambig =
false;
12525 warn_uncond(
"Specified markdown mainpage '{}' has not been defined as input file\n",mdfileAsMainPage);
12544 DString versionString = getFullVersion();
12545 msg(
"Doxygen version used: {}\n",versionString);
12555 if (outputDirectory.
empty())
12561 Dir dir(outputDirectory.
str());
12565 if (!dir.
mkdir(outputDirectory.
str()))
12567 term(
"tag OUTPUT_DIRECTORY: Output directory '{}' does not "
12568 "exist and cannot be created\n",outputDirectory);
12572 msg(
"Notice: Output directory '{}' does not exist. "
12573 "I have created it for you.\n", outputDirectory);
12621 bool generateSitemap = !sitemapUrl.
empty();
12622 if (generateSitemap && !sitemapUrl.
endsWith(
"/"))
12629 bool generateEclipseHelp =
Config_getBool(GENERATE_ECLIPSEHELP);
12643 if (generateDocbook)
12683 if (curFontPath.
empty())
12687 if (!curFontPath.
empty())
12690 newFontPath+=curFontPath;
12706 bool defaultLayoutUsed =
false;
12707 if (layoutFileName.
empty())
12710 defaultLayoutUsed =
true;
12712 AUTO_TRACE_ADD(
"defaultLayoutUsed={}, layoutFileName={}",defaultLayoutUsed,layoutFileName);
12717 msg(
"Parsing layout file {}...\n",layoutFileName);
12720 else if (!defaultLayoutUsed)
12722 warn_uncond(
"failed to open layout file '{}' for reading! Using default settings.\n",layoutFileName);
12732 if (generateHtml) exclPatterns.push_back(htmlOutput.
str());
12733 if (generateDocbook) exclPatterns.push_back(docbookOutput.
str());
12734 if (generateXml) exclPatterns.push_back(xmlOutput.
str());
12735 if (generateLatex) exclPatterns.push_back(latexOutput.
str());
12736 if (generateRtf) exclPatterns.push_back(rtfOutput.
str());
12737 if (generateMan) exclPatterns.push_back(manOutput.
str());
12757 if (generateDocbook)
12768 std::shared_ptr<Entry> root = std::make_shared<Entry>();
12772 msg(
"Reading and parsing tag files\n");
12774 for (
const auto &s : tagFileList)
12826 g_s.
begin(
"Building macro definition list...\n");
12830 g_s.
begin(
"Building group list...\n");
12835 g_s.
begin(
"Building directory list...\n");
12840 g_s.
begin(
"Building namespace list...\n");
12845 g_s.
begin(
"Building file list...\n");
12849 g_s.
begin(
"Building class list...\n");
12853 g_s.
begin(
"Building concept list...\n");
12861 g_s.
begin(
"Computing nesting relations for classes...\n");
12874 g_s.
begin(
"Associating documentation with classes...\n");
12878 g_s.
begin(
"Associating documentation with concepts...\n");
12883 g_s.
begin(
"Associating documentation with modules...\n");
12887 g_s.
begin(
"Building example list...\n");
12891 g_s.
begin(
"Searching for enumerations...\n");
12899 g_s.
begin(
"Searching for documented typedefs...\n");
12905 g_s.
begin(
"Searching for documented sequences...\n");
12909 g_s.
begin(
"Searching for documented dictionaries...\n");
12914 g_s.
begin(
"Searching for members imported via using declarations...\n");
12921 g_s.
begin(
"Searching for included using directives...\n");
12925 g_s.
begin(
"Searching for documented variables...\n");
12929 g_s.
begin(
"Building interface member list...\n");
12932 g_s.
begin(
"Building member list...\n");
12936 g_s.
begin(
"Searching for friends...\n");
12940 g_s.
begin(
"Searching for documented defines...\n");
12944 g_s.
begin(
"Computing class inheritance relations...\n");
12949 g_s.
begin(
"Computing class usage relations...\n");
12953 g_s.
begin(
"Flushing cached template relations that have become invalid...\n");
12957 g_s.
begin(
"Warn for undocumented namespaces...\n");
12961 g_s.
begin(
"Computing class relations...\n");
12972 g_s.
begin(
"Add enum values to enums...\n");
12977 g_s.
begin(
"Searching for member function documentation...\n");
12989 g_s.
begin(
"Creating members for template instances...\n");
12993 g_s.
begin(
"Searching for tag less structs...\n");
12997 g_s.
begin(
"Building page list...\n");
13001 g_s.
begin(
"Building requirements list...\n");
13005 g_s.
begin(
"Search for main page...\n");
13010 g_s.
begin(
"Computing page relations...\n");
13015 g_s.
begin(
"Determining the scope of groups...\n");
13019 g_s.
begin(
"Computing module relations...\n");
13021 mm.resolvePartitions();
13022 mm.resolveImports();
13023 mm.collectExportedSymbols();
13042 return i==0 ?
dstricmp_sort(c1->name(), c2->name())<0 : i<0;
13077 g_s.
begin(
"Determining which enums are documented\n");
13081 g_s.
begin(
"Computing member relations...\n");
13086 g_s.
begin(
"Building full member lists recursively...\n");
13090 g_s.
begin(
"Adding members to member groups.\n");
13096 g_s.
begin(
"Distributing member group documentation.\n");
13101 g_s.
begin(
"Computing member references...\n");
13107 g_s.
begin(
"Inheriting documentation...\n");
13115 g_s.
begin(
"Generating disk names...\n");
13119 g_s.
begin(
"Adding source references...\n");
13123 g_s.
begin(
"Adding xrefitems...\n");
13128 g_s.
begin(
"Adding requirements...\n");
13133 g_s.
begin(
"Sorting member lists...\n");
13137 g_s.
begin(
"Setting anonymous enum type...\n");
13141 g_s.
begin(
"Computing dependencies between directories...\n");
13145 g_s.
begin(
"Generating citations page...\n");
13149 g_s.
begin(
"Counting data structures...\n");
13153 g_s.
begin(
"Resolving user defined references...\n");
13157 g_s.
begin(
"Finding anchors and sections in the documentation...\n");
13161 g_s.
begin(
"Transferring function references...\n");
13165 g_s.
begin(
"Combining using relations...\n");
13170 g_s.
begin(
"Adding members to index pages...\n");
13175 g_s.
begin(
"Correcting members for VHDL...\n");
13179 g_s.
begin(
"Computing tooltip texts...\n");
13187 [](
const auto &g1,
const auto &g2)
13188 {
return g1->groupTitle() < g2->groupTitle(); });
13192 gd->sortSubGroups();
13236 if (generateDocbook)
13256 err(
"USE_HTAGS is YES but htags(1) failed. \n");
13258 err(
"htags(1) ended normally but failed to load the filemap. \n");
13265 g_s.
begin(
"Generating style sheet...\n");
13273 g_s.
begin(
"Generating search indices...\n");
13274 if (searchEngine && !serverBasedSearch && generateHtml)
13282 if (generateHtml && searchEngine)
13285 Dir searchDir(searchDirName.
str());
13286 if (!searchDir.
exists() && !searchDir.
mkdir(searchDirName.
str()))
13288 term(
"Could not create search results directory '{}' $PWD='{}'\n",
13292 if (!serverBasedSearch)
13314 if (generateDocbook)
13330 g_s.
begin(
"Generating images for formulas in HTML...\n");
13337 g_s.
begin(
"Generating images for formulas in RTF...\n");
13344 g_s.
begin(
"Generating images for formulas in Docbook...\n");
13349 g_s.
begin(
"Generating example documentation...\n");
13353 g_s.
begin(
"Generating file sources...\n");
13357 g_s.
begin(
"Counting members...\n");
13363 g_s.
begin(
"Generating file documentation...\n");
13367 g_s.
begin(
"Generating page documentation...\n");
13371 g_s.
begin(
"Generating group documentation...\n");
13375 g_s.
begin(
"Generating class documentation...\n");
13379 g_s.
begin(
"Generating concept documentation...\n");
13383 g_s.
begin(
"Generating module documentation...\n");
13387 g_s.
begin(
"Generating namespace documentation...\n");
13393 g_s.
begin(
"Generating graph info page...\n");
13398 g_s.
begin(
"Generating directory documentation...\n");
13407 g_s.
begin(
"finalizing index lists...\n");
13411 g_s.
begin(
"writing tag file...\n");
13417 g_s.
begin(
"Generating XML output...\n");
13425 g_s.
begin(
"Generating SQLITE3 output...\n");
13432 g_s.
begin(
"Generating AutoGen DEF output...\n");
13438 g_s.
begin(
"Generating Perl module output...\n");
13442 if (generateHtml && searchEngine && serverBasedSearch)
13444 g_s.
begin(
"Generating search index\n");
13454 if (searchDataFile.
empty())
13456 searchDataFile=
"searchdata.xml";
13469 g_s.
begin(
"Combining RTF output...\n");
13472 err(
"An error occurred during post-processing the RTF files!\n");
13479 g_s.
begin(
"Running plantuml with JAVA...\n");
13486 g_s.
begin(
"Running mermaid (mmdc)...\n");
13498 if (generateHtml &&
13502 g_s.
begin(
"Running html help compiler...\n");
13507 if ( generateHtml &&
13511 g_s.
begin(
"Running qhelpgenerator...\n");
13524 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
13525 if (numThreads<1) numThreads=1;
13526 msg(
"Total elapsed time: {:.6f} seconds\n(of which an average of {:.6f} seconds per thread waiting for external tools to finish)\n",
13533 msg(
"finished...\n");
13538 msg(
"finished...\n");
This class contains the information about the argument of a function or template.
This class represents an function or template argument list.
RefQualifierType refQualifier() const
bool noParameters() const
bool pureSpecifier() const
bool hasParameters() const
DString trailingReturnType() const
void setPureSpecifier(bool b)
bool constSpecifier() const
void setTrailingReturnType(const DString &s)
void push_back(const Argument &a)
void setConstSpecifier(bool b)
void setRefQualifier(RefQualifierType t)
void setIsDeleted(bool b)
bool volatileSpecifier() const
void setNoParameters(bool b)
void setVolatileSpecifier(bool b)
static CitationManager & instance()
void clear()
clears the database
void generatePage()
Generate the citations page.
std::unique_ptr< ClangTUParser > createTUParser(const FileDef *fd) const
static ClangParser * instance()
Returns the one and only instance of the class.
Clang parser object for a single translation unit, which consists of a source file and the directly o...
void switchToFile(const FileDef *fd)
Switches to another file within the translation unit started with start().
void parse()
Parse the file given at construction time as a translation unit This file should already be preproces...
A abstract class representing of a compound symbol.
virtual DString requiresClause() const =0
virtual const MemberDef * getMemberByName(const DString &) const =0
Returns the member with the given name.
virtual const ArgumentList & templateArguments() const =0
Returns the template arguments of this class.
virtual void writeDocumentation(OutputList &ol) const =0
virtual void writeMemberList(OutputList &ol) const =0
virtual bool isTemplate() const =0
Returns true if this class is a template.
virtual const BaseClassList & baseClasses() const =0
Returns the list of base classes from which this class directly inherits.
virtual int isBaseClass(const ClassDef *bcd, bool followInstances, const DString &templSpec=DString()) const =0
Returns true iff bcd is a direct or indirect base class of this class.
virtual const TemplateInstanceList & getTemplateInstances() const =0
Returns a sorted dictionary with all template instances found for this template class.
virtual ArgumentLists getTemplateParameterLists() const =0
Returns the template parameter lists that form the template declaration of this class.
virtual Protection protection() const =0
Return the protection level (Public,Protected,Private) in which this compound was found.
virtual DString compoundTypeString() const =0
Returns the type of compound as a string.
virtual MemberList * getMemberList(MemberListType lt) const =0
Returns the members in the list identified by lt.
virtual std::unique_ptr< ClassDef > deepCopy(const DString &name) const =0
virtual bool isForwardDeclared() const =0
Returns true if this class represents a forward declaration of a template class.
virtual bool isSubClass(ClassDef *bcd, int level=0) const =0
Returns true iff bcd is a direct or indirect sub class of this class.
virtual void moveTo(Definition *)=0
virtual const TemplateNameMap & getTemplateBaseClassNames() const =0
virtual DString qualifiedNameWithTemplateParameters(const ArgumentLists *actualParams=nullptr, uint32_t *actualParamIndex=nullptr) const =0
virtual bool isEmbeddedInOuterScope() const =0
virtual const MemberNameInfoLinkedMap & memberNameInfoLinkedMap() const =0
Returns a dictionary of all members.
virtual bool isImplicitTemplateInstance() const =0
virtual const ClassDef * templateMaster() const =0
Returns the template master of which this class is an instance.
CompoundType
The various compound types.
virtual CompoundType compoundType() const =0
Returns the type of compound this is, i.e. class/struct/union/...
virtual bool containsOverload(const MemberDef *md) const =0
virtual ClassLinkedRefMap getClasses() const =0
returns the classes nested into this class
virtual FileDef * getFileDef() const =0
Returns the file in which this compound's definition can be found.
virtual void writeTagFile(TextStream &) const =0
virtual void writeDocumentationForInnerClasses(OutputList &ol) const =0
virtual void computeAnchors()=0
virtual void addTypeConstraints()=0
virtual void overrideCollaborationGraph(bool e)=0
virtual void addUsedClass(ClassDef *cd, const DString &accessName, Protection prot)=0
virtual void insertExplicitTemplateInstance(ClassDef *instance, const DString &spec)=0
virtual void countMembers()=0
virtual void addMembersToMemberGroup()=0
virtual void setPrimaryConstructorParams(const ArgumentList &list)=0
virtual void setTemplateBaseClassNames(const TemplateNameMap &templateNames)=0
virtual ClassDef * insertTemplateInstance(const DString &fileName, int startLine, size_t startColumn, const DString &templSpec, bool &freshInstance)=0
virtual void setClassName(const DString &name)=0
virtual void setFileDef(FileDef *fd)=0
virtual void reclassifyMember(MemberDefMutable *md, MemberType t)=0
virtual void setTemplateArguments(const ArgumentList &al)=0
virtual void setTemplateMaster(const ClassDef *tm)=0
virtual void makeTemplateArgument(bool b=true)=0
virtual void mergeCategory(ClassDef *category)=0
virtual void addQualifiers(const StringVector &qualifiers)=0
virtual void setClassSpecifier(TypeSpecifier spec)=0
virtual void insertUsedFile(const FileDef *)=0
virtual void setTagLessReference(const ClassDef *cd)=0
virtual void setUsedOnly(bool b)=0
virtual void sortMemberLists()=0
virtual void setProtection(Protection p)=0
virtual void setTypeConstraints(const ArgumentList &al)=0
virtual void overrideInheritanceGraph(CLASS_GRAPH_t e)=0
virtual void setAnonymousEnumType()=0
virtual void setCompoundType(CompoundType t)=0
virtual void distributeMemberGroupDocumentation()=0
virtual void setMetaData(const DString &md)=0
virtual void findSectionsInDocumentation()=0
virtual void insertMember(MemberDef *)=0
virtual void sortAllMembersList()=0
virtual void mergeMembers()=0
virtual void setIsStatic(bool b)=0
virtual void addMembersToTemplateInstance(const ClassDef *cd, const ArgumentList &templateArguments, const DString &templSpec)=0
virtual void insertSubClass(ClassDef *, Protection p, Specifier s, const DString &t=DString())=0
virtual void addUsedByClass(ClassDef *cd, const DString &accessName, Protection prot)=0
virtual void setSubGrouping(bool enabled)=0
virtual void setRequiresClause(const DString &req)=0
virtual void insertBaseClass(ClassDef *, const DString &name, Protection p, Specifier s, const DString &t=DString())=0
virtual void addDocPart(const DString &doc, int lineNr, size_t colNr)=0
virtual void addCodePart(const DString &code, int lineNr, size_t colNr)=0
virtual void setFileDef(FileDef *fd)=0
virtual void writeTagFile(TextStream &)=0
virtual void writeDocumentation(OutputList &ol)=0
virtual void setGroupId(int id)=0
virtual void setInitializer(const DString &init)=0
virtual void findSectionsInDocumentation()=0
virtual void setTemplateArguments(const ArgumentList &al)=0
A String class for use with Doxygen wrapping std::string and adding some additional functionality off...
DString & setNum(short n)
void resize(size_t newlen)
size_t rfind(char c, size_t pos=npos) const
DString fill(char c, size_t len)
Fills a string with a predefined character.
DString mid(size_t index, size_t len=npos) const
bool empty() const
Returns true iff the string is empty (std::string compatible alias for isEmpty()).
DString & replace(size_t index, size_t len, const char *s)
DString substr(size_t pos=0, size_t count=npos) const
Returns a substring of length count starting at pos.
static constexpr size_t npos
value used to indicate 'not found' or 'to the end of the string', matching std::string::npos
char & at(size_t i)
Returns a reference to the character at index i.
bool findAndRemoveWord(const char *word)
removes occurrences of whole word from this string, while keeping internal spaces and reducing multip...
DString right(size_t len) const
size_t size() const
Returns the length of the string, not counting the 0-terminator.
DString & prepend(const char *s)
int contains(char c, bool cs=true) const
size_t find(char c, size_t pos=0) const
DString & sprintf(const char *format,...)
int toInt(bool *ok=nullptr, int base=10) const
DString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
DString left(size_t len) const
const std::string & str() const
bool stripPrefix(const DString &prefix)
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
bool startsWith(const char *s) const
bool endsWith(const char *s) const
size_t length() const
Returns the length of the string, not counting the 0-terminator.
static void clearFlag(const DebugMask mask)
static bool isFlagSet(const DebugMask mask)
static void print(DebugMask mask, int prio, fmt::format_string< Args... > fmt, Args &&... args)
static double elapsedTime()
static bool setFlagStr(const DString &label)
static void setFlag(const DebugMask mask)
The common base class of all entity definitions found in the sources.
virtual DString briefDescription(bool abbreviate=false) const =0
virtual DString inbodyFile() const =0
virtual int getEndBodyLine() const =0
virtual DString briefFile() const =0
virtual SrcLangExt getLanguage() const =0
Returns the programming language this definition was written in.
virtual int docLine() const =0
virtual DString getDefFileName() const =0
virtual DString documentation() const =0
virtual bool isLinkable() const =0
virtual DString inbodyDocumentation() const =0
virtual int getDefLine() const =0
virtual DefType definitionType() const =0
virtual const DString & name() const =0
virtual const DString & localName() const =0
virtual int inbodyLine() const =0
virtual const FileDef * getBodyDef() const =0
virtual int briefLine() const =0
virtual bool hasDocumentation() const =0
virtual bool isLinkableInProject() const =0
virtual size_t getDefColumn() const =0
virtual bool isAnonymous() const =0
virtual DString displayName(bool includeScope=true) const =0
virtual DString qualifiedName() const =0
virtual bool isHidden() const =0
virtual DString anchor() const =0
virtual int getStartDefLine() const =0
virtual const GroupList & partOfGroups() const =0
virtual bool isArtificial() const =0
virtual Definition * getOuterScope() const =0
virtual DString docFile() const =0
virtual int getStartBodyLine() const =0
virtual bool isReference() const =0
virtual const Definition * findInnerCompound(const DString &name) const =0
virtual DString getOutputFileBase() const =0
virtual void mergeReferencedBy(const Definition *other)=0
virtual void setName(const DString &name)=0
virtual void setExported(bool b)=0
virtual void setBodySegment(int defLine, int bls, int ble)=0
virtual void setHidden(bool b)=0
virtual void setReference(const DString &r)=0
virtual void mergeReferences(const Definition *other)=0
virtual void setInbodyDocumentation(const DString &d, const DString &docFile, int docLine)=0
virtual void setDocumentation(const DString &d, const DString &docFile, int docLine, bool stripWhiteSpace=true)=0
virtual void addInnerCompound(Definition *d)=0
virtual void setDefFile(const DString &df, int defLine, size_t defColumn)=0
virtual void addSectionsToDefinition(const std::vector< const SectionInfo * > &anchorList)=0
virtual void setLanguage(SrcLangExt lang)=0
virtual void setOuterScope(Definition *d)=0
virtual void setArtificial(bool b)=0
virtual void setBriefDescription(const DString &b, const DString &briefFile, int briefLine)=0
virtual void makePartOfGroup(GroupDef *gd)=0
virtual void setBodyDef(const FileDef *fd)=0
virtual void setRequirementReferences(const RequirementRefs &rqli)=0
virtual void setId(const DString &name)=0
virtual void setRefItems(const RefItemVector &sli)=0
virtual void computeTooltip()=0
A model of a directory symbol.
virtual void overrideDirectoryGraph(bool e)=0
Class representing a directory in the file system.
static std::string currentDirPath()
std::string absPath() const
bool mkdir(const std::string &path, bool acceptsAbsPath=true) const
void setPath(const std::string &path)
bool remove(const std::string &path, bool acceptsAbsPath=true) const
DirIterator iterator() const
static std::string cleanDirPath(const std::string &path)
static bool setCurrent(const std::string &path)
A linked map of directories.
A class that generates docset files.
static DotManager * instance()
static NamespaceLinkedMap * namespaceLinkedMap
static ConceptLinkedMap * conceptLinkedMap
static bool suppressDocWarnings
static FileNameLinkedMap * plantUmlFileNameLinkedMap
static bool parseSourcesNeeded
static StringUnorderedSet inputPaths
static std::unique_ptr< PageDef > mainPage
static bool clangAssistedParsing
static StringUnorderedSet expandAsDefinedSet
static FileNameLinkedMap * inputNameLinkedMap
static DString filterDBFileName
static ParserManager * parserManager
static InputFileEncodingList inputFileEncodingList
static DString verifiedDotPath
static ClassLinkedMap * classLinkedMap
static MemberNameLinkedMap * functionNameLinkedMap
static PageLinkedMap * exampleLinkedMap
static FileNameLinkedMap * dotFileNameLinkedMap
static NamespaceDefMutable * globalScope
static FileNameLinkedMap * imageNameLinkedMap
static FileNameLinkedMap * mscFileNameLinkedMap
static FileNameLinkedMap * mermaidFileNameLinkedMap
static MemberGroupInfoMap memberGroupInfoMap
static IndexList * indexList
static StaticInitMap staticInitMap
static StringMap tagDestinationMap
static std::mutex countFlowKeywordsMutex
static ClassLinkedMap * hiddenClassLinkedMap
static FileNameLinkedMap * diaFileNameLinkedMap
static PageLinkedMap * pageLinkedMap
static bool generatingXmlOutput
static std::unique_ptr< NamespaceDef > globalNamespaceDef
static DString htmlFileExtension
static DefinesPerFileList macroDefinitions
static DirLinkedMap * dirLinkedMap
static NamespaceAliasInfoMap namespaceAliasMap
static MemberNameLinkedMap * memberNameLinkedMap
static SymbolMap< Definition > * symbolMap
static StringUnorderedSet tagFileSet
static FileNameLinkedMap * includeNameLinkedMap
static FileNameLinkedMap * exampleNameLinkedMap
static SearchIndexIntf searchIndex
static DirRelationLinkedMap dirRelations
static std::mutex addExampleMutex
static ClangUsrMap * clangUsrMap
static GroupLinkedMap * groupLinkedMap
Generator for Eclipse help files.
static EmojiEntityMapper & instance()
Returns the one and only instance of the Emoji entity mapper.
void writeEmojiFile(TextStream &t)
Writes the list of supported emojis to the given file.
Represents an unstructured piece of information, about an entity found in the sources.
TextStream initializer
initial value (for variables)
VhdlSpecifier vhdlSpec
VHDL specifiers.
bool subGrouping
automatically group class members?
RequirementRefs rqli
references to requirements
const std::vector< std::shared_ptr< Entry > > & children() const
GroupDocType groupDocType
int docLine
line number at which the documentation was found
DString includeName
include name (3 arg of \class)
DString bitfields
member's bit fields
ArgumentList typeConstr
where clause (C#) for type constraints
void markAsProcessed() const
int endBodyLine
line number where the definition ends
DString write
property write accessor
bool exported
is the symbol exported from a C++20 module
const TagInfo * tagInfo() const
DString includeFile
include file (2 arg of \class, must be unique)
DString fileName
file this entry was extracted from
ArgumentLists tArgLists
template argument declarations
DString docFile
file in which the documentation was found
MethodTypes mtype
signal, slot, (dcop) method, or property?
@ GROUPDOC_NORMAL
defgroup
DString args
member argument string
SrcLangExt lang
programming language in which this entry was found
DString inside
name of the class in which documents are found
DString doc
documentation block (partly parsed)
DString req
C++20 requires clause.
bool explicitExternal
explicitly defined as external?
DString brief
brief description (doc block)
std::vector< const SectionInfo * > anchors
list of anchors defined in this entry
RelatesType relatesType
how relates is handled
std::vector< Grouping > groups
list of groups this entry belongs to
CommandOverrides commandOverrides
store info for commands whose default can be overridden
int startLine
start line of entry in the source
size_t startColumn
start column of entry in the source
ArgumentList argList
member arguments as a list
int inbodyLine
line number at which the body doc was found
EntryType section
entry type (see Sections);
int bodyLine
line number of the body in the source
DString exception
throw specification
DString relates
related class (doc block)
int mGrpId
member group id
std::vector< BaseInfo > extends
list of base classes
DString inbodyFile
file in which the body doc was found
Specifier virt
virtualness of the entry
DString metaData
Slice metadata.
std::vector< std::string > qualifiers
qualifiers specified with the qualifier command
RefItemVector sli
special lists (test/todo/bug/deprecated/..) this entry is in
Protection protection
class protection
bool artificial
Artificially introduced item.
bool hidden
does this represent an entity that is hidden from the output
DString inbodyDocs
documentation inside the body of a function
int briefLine
line number at which the brief desc. was found
FileDef * fileDef() const
int initLines
define/variable initializer lines to show
TypeSpecifier spec
class/member specifiers
DString briefFile
file in which the brief desc. was found
DString read
property read accessor
Wrapper class for the Entry type.
constexpr bool isCompoundDoc() const noexcept
constexpr bool isFile() const noexcept
constexpr bool isDoc() const noexcept
ENTRY_TYPES constexpr bool isCompound() const noexcept
std::string to_string() const
static EntryType guessSection(const DString &name)
constexpr bool isScope() const noexcept
A class that generates a dynamic tree view side panel.
A model of a file symbol.
virtual void addUsingDeclaration(const Definition *d)=0
virtual void removeMember(MemberDef *md)=0
virtual void insertClass(ClassDef *cd)=0
virtual void setDiskName(const DString &name)=0
virtual void insertConcept(ConceptDef *cd)=0
virtual void overrideIncludeGraph(bool e)=0
virtual void writeSourceHeader(OutputList &ol)=0
virtual bool generateSourceFile() const =0
virtual DString absFilePath() const =0
virtual const DString & docName() const =0
virtual const LinkedRefMap< NamespaceDef > & getUsedNamespaces() const =0
virtual bool isSource() const =0
virtual void parseSource(ClangTUParser *clangParser)=0
virtual void getAllIncludeFilesRecursively(StringVector &incFiles) const =0
virtual void writeSourceFooter(OutputList &ol)=0
virtual void writeSourceBody(OutputList &ol, ClangTUParser *clangParser)=0
virtual void addUsingDirective(NamespaceDef *nd)=0
virtual void overrideIncludedByGraph(bool e)=0
virtual void insertMember(MemberDef *md)=0
virtual void insertNamespace(NamespaceDef *nd)=0
Minimal replacement for QFileInfo.
std::string readLink() const
bool match(const PatternList &patList, bool caseSenseNames, PatternElem *elem=nullptr, PatternGet getter=[](const std::string &s){ return s;}) const
Match the file name against a list of patterns.
std::string fileName() const
std::string dirPath(bool absPath=true) const
std::string absFilePath() const
Class representing all files with a certain base name.
Ordered dictionary of FileName objects.
DString showFileDefMatches(const DString &n) const
Returns a list of file definitions in fnMap that match the file name n.
FileDef * findFileDef(const DString &n, bool &ambig) const
Returns the file definition in fnMap that matches the file name n.
A model of a group of symbols.
virtual DString groupTitle() const =0
virtual void overrideGroupGraph(bool e)=0
virtual bool addClass(ClassDef *def)=0
virtual bool containsFile(const FileDef *def) const =0
virtual bool addNamespace(NamespaceDef *def)=0
virtual void setGroupScope(Definition *d)=0
virtual void addFile(FileDef *def)=0
virtual void setGroupTitle(const DString &newtitle)=0
virtual MemberList * getMemberList(MemberListType lt) const =0
virtual bool hasGroupTitle() const =0
Generator for HTML output.
static void writeSearchData(const DString &dir)
static void writeSearchPage()
static void writeHeaderFile(TextStream &t, const DString &cssname)
static void writeFooterFile(TextStream &t)
static void writeTabData()
Additional initialization after indices have been created.
static void writeExternalSearchPage()
static void writeStyleSheetFile(TextStream &t)
A class that generated the HTML Help specific files.
static const DString hhpFileName
static Index & instance()
void countDataStructures()
A list of index interfaces.
void addIndexItem(const Definition *context, const MemberDef *md, const DString §ionAnchor=DString(), const DString &title=DString())
void addIndex(As &&... args)
Add an index generator to the list, using a syntax similar to std::make_unique<T>().
void addImageFile(const DString &name)
Generator for LaTeX output.
static void writeFooterFile(TextStream &t)
static void writeStyleSheetFile(TextStream &t)
static void writeHeaderFile(TextStream &t)
void parse(const DString &fileName, const char *data=nullptr)
Parses a user provided layout.
static LayoutDocManager & instance()
Returns a reference to this singleton.
std::unique_ptr< RefList > Ptr
T * add(const char *k, Args &&... args)
const T * find(const std::string &key) const
Container class representing a vector of objects with keys.
const T * find(const std::string &key) const
Generator for Man page output.
A model of a class/file/namespace member symbol.
virtual DString requiresClause() const =0
virtual bool isFriend() const =0
virtual DString argsString() const =0
virtual bool isForeign() const =0
virtual bool isRelated() const =0
virtual DString definition() const =0
virtual const ClassDef * getCachedTypedefVal() const =0
virtual const ClassDef * getClassDef() const =0
virtual DString excpString() const =0
virtual const ArgumentList & templateArguments() const =0
virtual const DString & initializer() const =0
virtual GroupDef * getGroupDef()=0
virtual bool isCSharpProperty() const =0
virtual bool isTypedef() const =0
virtual const MemberVector & enumFieldList() const =0
virtual void moveTo(Definition *)=0
virtual const FileDef * getFileDef() const =0
virtual const ArgumentList & argumentList() const =0
virtual bool isStrongEnumValue() const =0
virtual VhdlSpecifier getVhdlSpecifiers() const =0
virtual bool isFunction() const =0
virtual bool isExternal() const =0
virtual int getMemberGroupId() const =0
virtual DString bitfieldString() const =0
virtual bool isStatic() const =0
virtual const MemberDef * reimplements() const =0
virtual StringVector getQualifiers() const =0
virtual bool isTypedefValCached() const =0
virtual bool isDocsForDefinition() const =0
virtual bool isDefine() const =0
virtual const NamespaceDef * getNamespaceDef() const =0
virtual bool isObjCProperty() const =0
virtual Protection protection() const =0
virtual TypeSpecifier getMemberSpecifiers() const =0
virtual bool isEnumerate() const =0
virtual MemberType memberType() const =0
virtual ClassDef * relatedAlso() const =0
virtual bool isVariable() const =0
virtual bool isStrong() const =0
virtual DString typeString() const =0
virtual Specifier virtualness(int count=0) const =0
virtual int redefineCount() const =0
virtual int initializerLines() const =0
virtual const MemberDef * getEnumScope() const =0
virtual bool isEnumValue() const =0
virtual bool isPrototype() const =0
virtual void setRequiresClause(const DString &req)=0
virtual void setClassDefOfAnonymousType(const ClassDef *cd)=0
virtual void setMemberClass(ClassDef *cd)=0
virtual void setProtection(Protection p)=0
virtual void setDefinition(const DString &d)=0
virtual void setMemberGroupId(int id)=0
virtual void setDocumentedEnumValues(bool value)=0
virtual void setMemberSpecifiers(TypeSpecifier s)=0
virtual ClassDefMutable * getClassDefMutable()=0
virtual void setArgsString(const DString &as)=0
virtual void setEnumScope(MemberDef *md, bool livesInsideEnum=false)=0
virtual void setDefinitionTemplateParameterLists(const ArgumentLists &lists)=0
virtual void invalidateTypedefValCache()=0
virtual void setVhdlSpecifiers(VhdlSpecifier s)=0
virtual void setEnumClassScope(ClassDef *cd)=0
virtual void setInitializer(const DString &i)=0
virtual void setMaxInitLines(int lines)=0
virtual void setInheritsDocsFrom(const MemberDef *md)=0
virtual void setPrototype(bool p, const DString &df, int line, size_t column)=0
virtual void setRelatedAlso(ClassDef *cd)=0
virtual void overrideReferencesRelation(bool e)=0
virtual void makeForeign()=0
virtual void overrideReferencedByRelation(bool e)=0
virtual void setDocsForDefinition(bool b)=0
virtual void overrideCallGraph(bool e)=0
virtual void overrideInlineSource(bool e)=0
virtual void setBitfields(const DString &s)=0
virtual void copyArgumentNames(const MemberDef *bmd)=0
virtual void overrideEnumValues(bool e)=0
virtual void mergeMemberSpecifiers(TypeSpecifier s)=0
virtual void addQualifiers(const StringVector &qualifiers)=0
virtual void setExplicitExternal(bool b, const DString &df, int line, size_t column)=0
virtual void insertEnumField(MemberDef *md)=0
virtual void moveDeclArgumentList(std::unique_ptr< ArgumentList > al)=0
virtual void setDeclFile(const DString &df, int line, size_t column)=0
virtual void setAnonymousEnumType(const MemberDef *md)=0
virtual void overrideCallerGraph(bool e)=0
virtual void setReimplements(MemberDef *md)=0
virtual void invalidateCachedArgumentTypes()=0
virtual void moveArgumentList(std::unique_ptr< ArgumentList > al)=0
virtual void makeRelated()=0
virtual void insertReimplementedBy(MemberDef *md)=0
A list of MemberDef objects as shown in documentation sections.
Wrapper class for the MemberListType type.
Ordered dictionary of MemberName objects.
MemberName::Ptr take(const DString &key, const MemberDef *value)
const MemberDef * findRev(const DString &name) const
const MemberDef * find(const DString &name) const
void run()
Run mmdc tool for all collected diagrams.
static MermaidManager & instance()
static ModuleManager & instance()
void addDocs(const Entry *root)
void addConceptToModule(const Entry *root, ConceptDef *cd)
void addClassToModule(const Entry *root, ClassDef *cd)
void addMemberToModule(const Entry *root, MemberDef *md)
void writeDocumentation(OutputList &ol)
void addMembersToMemberGroup()
void findSectionsInDocumentation()
void distributeMemberGroupDocumentation()
An abstract interface of a namespace symbol.
virtual const LinkedRefMap< NamespaceDef > & getUsedNamespaces() const =0
virtual bool isInline() const =0
virtual void insertUsedFile(FileDef *fd)=0
virtual void findSectionsInDocumentation()=0
virtual void countMembers()=0
virtual void addUsingDirective(NamespaceDef *nd)=0
virtual void setFileName(const DString &fn)=0
virtual void insertMember(MemberDef *md)=0
virtual void setMetaData(const DString &m)=0
virtual void addUsingDeclaration(const Definition *d)=0
virtual void distributeMemberGroupDocumentation()=0
virtual void writeTagFile(TextStream &)=0
virtual void writeDocumentation(OutputList &ol)=0
virtual void setInline(bool isInline)=0
virtual void computeAnchors()=0
virtual void combineUsingRelations(NamespaceDefSet &visitedNamespace)=0
virtual void sortMemberLists()=0
virtual void addMembersToMemberGroup()=0
void parseInput(const DString &, const char *, const std::shared_ptr< Entry > &, ClangTUParser *) override
Parses a single input file with the goal to build an Entry tree.
void parsePrototype(const DString &) override
Callback function called by the comment block scanner.
bool needsPreprocessing(const DString &) const override
Returns true if the language identified by extension needs the C preprocessor to be run before feed t...
Abstract interface for outline parsers.
virtual bool needsPreprocessing(const DString &extension) const =0
Returns true if the language identified by extension needs the C preprocessor to be run before feed t...
virtual void parseInput(const DString &fileName, const char *fileBuf, const std::shared_ptr< Entry > &root, ClangTUParser *clangParser)=0
Parses a single input file with the goal to build an Entry tree.
Class representing a list of output generators that are written to in parallel.
void disable(OutputType o)
void enable(OutputType o)
void docify(const DString &s)
void writeStyleInfo(int part)
void generateDoc(const DString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const DString &docStr, const DocOptions &options)
A model of a page symbol.
virtual void setLocalToc(const LocalToc &tl)=0
virtual void setFileName(const DString &name)=0
virtual void setShowLineNo(bool)=0
virtual void setPageScope(Definition *)=0
virtual const GroupDef * getGroupDef() const =0
Manages programming language parsers.
std::unique_ptr< CodeParserInterface > getCodeParser(const DString &extension)
Gets the interface to the parser associated with a given extension.
void registerParser(const DString &name, const OutlineParserFactory &outlineParserFactory, const CodeParserFactory &codeParserFactory)
Registers an additional parser.
std::unique_ptr< OutlineParserInterface > getOutlineParser(const DString &extension)
Gets the interface to the parser associated with a given extension.
static PlantumlManager & instance()
void run()
Run plant UML tool for all images.
void processFile(const DString &fileName, const std::string &input, std::string &output)
void addSearchDir(const DString &dir)
static DString getQchFileName()
static const DString qhpFileName
Generator for RTF output.
static bool preProcessFileInplace(const DString &path, const DString &name)
This is an API to a VERY brittle RTF preprocessor that combines nested RTF files.
static void writeStyleSheetFile(TextStream &t)
static void writeExtensionsFile(TextStream &t)
static RefListManager & instance()
static RequirementManager & instance()
void writeTagFile(TextStream &tagFile)
void addRequirement(Entry *e)
Abstract proxy interface for non-javascript based search indices.
void addWord(const DString &word, bool hiPriority)
void setCurrentDoc(const Definition *ctx, const DString &anchor, bool isSourceFile)
void write(const DString &file)
class that provide information about a section.
SectionInfo * replace(const DString &label, const DString &fileName, int lineNr, const DString &title, SectionType type, int level, const DString &ref=DString())
SectionInfo * add(const SectionInfo &si)
static SectionManager & instance()
returns a reference to the singleton
static constexpr int Page
std::vector< stat > stats
void begin(const char *name)
std::chrono::steady_clock::time_point startTime
static void showCacheUsage()
Show usage of the type lookup cache.
static void clearTypeLookupCache(ClearScope scope)
ClassDefMutable * resolveClassMutable(const Definition *scope, const DString &name, bool mayBeUnlinkable=false, bool mayBeHidden=false)
Wrapper around resolveClass that returns a mutable interface to the class object or a nullptr if the ...
const ClassDef * resolveClass(const Definition *scope, const DString &name, bool maybeUnlinkable=false, bool mayBeHidden=false)
Find the class definition matching name within the scope set.
const Definition * resolveSymbol(const Definition *scope, const DString &name, const DString &args=DString(), bool checkCV=false, bool insideCode=false, bool onlyLinkable=false)
Find the symbool definition matching name within the scope set.
DString getTemplateSpec() const
In case a call to resolveClass() points to a template specialization, the template part is return via...
const MemberDef * getTypedef() const
In case a call to resolveClass() resolves to a type member (e.g. an enum) this method will return it.
This struct is used to capture the tag file information for an Entry.
Text streaming class that buffers data.
std::string str() const
Return the contents of the buffer as a std::string object.
Class managing a pool of worker threads.
auto queue(F &&f, Args &&... args) -> std::future< decltype(f(args...))>
Queue the callable function f for the threads to execute.
virtual DString trOverloadText()=0
virtual DString trPage(bool first_capital, bool singular)=0
virtual DString trMainPage()=0
Wrapper class for a number of boolean properties.
std::string to_string() const
static void correctMemberProperties(MemberDefMutable *md)
static void computeVhdlComponentRelations()
ClassDefMutable * toClassDefMutable(Definition *d)
ClassDef * getClass(const DString &n)
std::unique_ptr< ClassDef > createClassDefAlias(const Definition *newScope, const ClassDef *cd)
std::unique_ptr< ClassDef > createClassDef(const DString &fileName, int startLine, size_t startColumn, const DString &name, ClassDef::CompoundType ct, const DString &ref, const DString &fName, bool isSymbol, bool isJavaEnum)
Factory method to create a new ClassDef object.
ClassDef * toClassDef(Definition *d)
std::unordered_set< const ClassDef * > ClassDefSet
std::map< std::string, int > TemplateNameMap
ClassDefMutable * getClassMutable(const DString &key)
Class representing a regular expression.
Class to iterate through matches.
Object representing the matching results.
ConceptDefMutable * toConceptDefMutable(Definition *d)
std::unique_ptr< ConceptDef > createConceptDef(const DString &fileName, int startLine, size_t startColumn, const DString &name, const DString &tagRef, const DString &tagFile)
ConceptDefMutable * getConceptMutable(const DString &key)
#define Config_getInt(name)
#define Config_getList(name)
#define Config_updateString(name, value)
#define Config_updateBool(name, value)
#define Config_getBool(name)
#define Config_getString(name)
#define Config_updateList(name,...)
#define Config_getEnum(name)
std::set< std::string > StringSet
std::unordered_set< std::string > StringUnorderedSet
std::map< std::string, std::string > StringMap
std::vector< std::string > StringVector
void parseFuncDecl(const DString &decl, const SrcLangExt lang, DString &clName, DString &type, DString &name, DString &args, DString &funcTempList, DString &exceptions)
std::unique_ptr< ArgumentList > stringToArgumentList(SrcLangExt lang, const DString &argsString, DString *extraTypeChars=nullptr)
std::unordered_map< std::string, DefineList > DefinesPerFileList
Definition * toDefinition(DefinitionMutable *dm)
DefinitionMutable * toDefinitionMutable(Definition *d)
DirIterator begin(DirIterator it) noexcept
DirIterator end(const DirIterator &) noexcept
void computeDirDependencies()
void generateDirDocs(OutputList &ol)
#define AUTO_TRACE_ADD(...)
#define AUTO_TRACE_EXIT(...)
constexpr DocNodeVariant * parent(DocNodeVariant *n)
returns the parent node of a given node n or nullptr if the node has no parent.
static void findInheritedTemplateInstances()
void printNavTree(Entry *root, int indent)
static void addClassToContext(const Entry *root)
static void makeTemplateInstanceRelation(const Entry *root, ClassDefMutable *cd)
static StringUnorderedSet g_pathsVisited(1009)
static void buildGroupList(const Entry *root)
static void insertMemberAlias(Definition *outerScope, const MemberDef *md)
static void findUsingDeclarations(const Entry *root, bool filterPythonPackages)
static void flushCachedTemplateRelations()
static void copyLatexStyleSheet()
static void generateDocsForClassList(const std::vector< ClassDefMutable * > &classList)
static int findFunctionPtr(const std::string &type, SrcLangExt lang, int *pLength=nullptr)
static bool isSpecialization(const ArgumentLists &srcTempArgLists, const ArgumentLists &dstTempArgLists)
static void computeTemplateClassRelations()
static std::string resolveSymlink(const std::string &path)
void adjustConfiguration()
adjust globals that depend on configuration settings.
static void findDEV(const MemberNameLinkedMap &mnsd)
static void runQHelpGenerator()
static void addConceptToContext(const Entry *root)
static void addRelatedPage(Entry *root)
static StringVector g_inputFiles
static void generateXRefPages()
static Definition * buildScopeFromQualifiedName(const DString &name_, SrcLangExt lang, const TagInfo *tagInfo)
static void findUsingDeclImports(const Entry *root)
static void copyStyleSheet()
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 addIncludeFile(DefMutable *def, FileDef *ifd, const Entry *root)
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.