30#include <unordered_map>
123#pragma GCC diagnostic push
124#pragma GCC diagnostic ignored "-Wshadow"
126#include <clang/Basic/Version.h>
128#pragma GCC diagnostic pop
135#if !defined(_WIN32) || defined(__CYGWIN__)
203{
"template class",
"template struct",
"class",
"struct",
"union",
"interface",
"exception" };
240 stats.emplace_back(name,0);
241 startTime = std::chrono::steady_clock::now();
245 std::chrono::steady_clock::time_point endTime = std::chrono::steady_clock::now();
246 stats.back().elapsed =
static_cast<double>(std::chrono::duration_cast<
247 std::chrono::microseconds>(endTime -
startTime).count())/1000000.0;
258 msg(
"----------------------\n");
259 for (
const auto &s :
stats)
261 msg(
"Spent {:.6f} seconds in {}",s.elapsed,s.name);
326 if (!includeFile.
empty() && includeFile.
at(0)==
'"')
329 includeFile=includeFile.
mid(1,includeFile.
length()-2);
331 else if (!includeFile.
empty() && includeFile.
at(0)==
'<')
334 includeFile=includeFile.
mid(1,includeFile.
length()-2);
341 if (!includeFile.
empty() &&
346 text.
sprintf(
"the name '%s' supplied as "
347 "the argument of the \\class, \\struct, \\union, or \\headerfile command ",
352 text+=
"matches the following input files:\n";
355 text+=
"Please use a more specific name by "
356 "including a (larger) part of the path!";
360 text+=
"is not an input file";
364 else if (includeFile.
empty() && ifd &&
378 if (iName.
at(0)==
'<') local=
false;
379 else if (iName.
at(0)==
'"') local=
true;
380 if (iName.
at(0)==
'"' || iName.
at(0)==
'<')
404 def->setIncludeFile(
nullptr,iName,local,
true);
427 scope+=
"::"+pd->
name();
470 ((!includeExternal && root->
tagInfo()==
nullptr) ||
471 ( includeExternal && root->
tagInfo()!=
nullptr))
474 AUTO_TRACE(
"additional={} includeExternal={}",additional,includeExternal);
490 "group {}: ignoring title \"{}\" that does not match old title \"{}\"",
511 std::unique_ptr<GroupDef>(
518 std::unique_ptr<GroupDef>(
569 scope+=
"::"+gd->
name();
621 bool save_ambig = ambig;
625 size_t newIndex=fn.
rfind(
'/');
632 fn = fn.
left(newIndex)+
"/"+root->
name;
635 if (!fd) ambig = save_ambig;
667 "Found non-existing group '{}' for the command '{}', ignoring command",
676 text.
sprintf(
"the name '%s' supplied as "
677 "the argument in the \\file statement ",
681 text+=
"matches the following input files:\n";
684 text+=
"Please use a more specific name by "
685 "including a (larger) part of the path!";
689 text+=
"is not an input file";
703 for (
size_t i=0;i<l;i++)
707 else if (c==
')' && round>0) round--;
708 else if (c==
'<' && round==0) count++;
713 if (c==
'>' && round==0 && count>0) count--;
736 if (idx==-1)
return prevScope;
738 if (nsName.
empty())
return prevScope;
739 if (!fullScope.
empty()) fullScope+=
"::";
744 if (nd==
nullptr) cd =
getClass(fullScope);
745 if (nd==
nullptr && cd)
757 "[generated]",1,1,fullScope,
775 if (prevScopeMutable)
807 int p=i1+l1,l2=0,i2=0;
810 DString nestedNameSpecifier = scope.
mid(i1,l1);
815 if (resultScope==
nullptr)
826 if (resultScope!=
nullptr)
break;
885 auto alIt = tArgLists.begin();
902 return alIt!=tArgLists.end() ?
903 std::make_unique<ArgumentList>(*alIt) :
904 std::unique_ptr<ArgumentList>();
912 if (specifier.isStruct())
914 else if (specifier.isUnion())
916 else if (specifier.isCategory())
918 else if (specifier.isInterface())
920 else if (specifier.isProtocol())
922 else if (specifier.isException())
924 else if (specifier.isService())
926 else if (specifier.isSingleton())
929 if (section.isUnionDoc())
931 else if (section.isStructDoc())
933 else if (section.isInterfaceDoc())
935 else if (section.isProtocolDoc())
937 else if (section.isCategoryDoc())
939 else if (section.isExceptionDoc())
941 else if (section.isServiceDoc())
943 else if (section.isSingletonDoc())
971 DString qualifiedName = fullName;
974 qualifiedName.
prepend(scName+
"::");
980 AUTO_TRACE_ADD(
"Found class with name '{}', qualifiedName '{}'", cd ? cd->
name() : root->
name, qualifiedName);
1035 AUTO_TRACE_ADD(
"New class: fullname '{}' namespace '{}' name='{}' brief='{}' docs='{}'",
1052 std::unique_ptr<ArgumentList> tArgList;
1054 if ((root->
lang==SrcLangExt::CSharp || root->
lang==SrcLangExt::Java) &&
1069 fullName=fullName.
left(i);
1080 fullName,sec,tagName,refFileName,
true,root->
spec.isEnum()) ));
1083 AUTO_TRACE_ADD(
"New class '{}' type={} #tArgLists={} tagInfo={} hidden={} artificial={}",
1120 AUTO_TRACE_ADD(
"Class {} not added, already exists as alias", fullName);
1128 if (!root->
spec.isForwardDecl())
1190 qualifiedName.
prepend(scName+
"::");
1196 AUTO_TRACE_ADD(
"Found concept with name '{}' (qualifiedName='{}')", cd ? cd->
name() : root->
name, qualifiedName);
1200 qualifiedName=cd->
name();
1214 AUTO_TRACE_ADD(
"New concept: fullname '{}' namespace '{}' name='{}' brief='{}' docs='{}'",
1215 qualifiedName,namespaceName,className,root->
brief,root->
doc);
1236 qualifiedName,tagName,refFileName)));
1240 qualifiedName,root->
tArgLists.size(),fmt::ptr(tagInfo));
1271 for (
const auto &ce : root->
children())
1274 if (ce->section.isConceptDocPart())
1279 if (!ce->brief.empty())
1281 cd->
addDocPart(ce->brief,ce->startLine,ce->startColumn);
1284 if (!ce->doc.empty())
1286 cd->
addDocPart(ce->doc,ce->startLine,ce->startColumn);
1290 else if (ce->section.isConceptCodePart())
1292 cd->
addCodePart(ce->initializer.str(),ce->startLine,ce->startColumn);
1299 AUTO_TRACE_ADD(
"Concept '{}' not added, already exists (as alias)", qualifiedName);
1306 for (
const auto &ce : root->
children())
1308 if (ce->section.isConceptDocPart())
1328 if (root->
section.isModuleDoc())
1338 if (root->
section.isConcept())
1348 if (root->
section.isConceptDoc())
1367 if (cd!=ocd && cd->groupId()==ocd->groupId() &&
1368 !cd->partOfGroups().empty() && ocd->partOfGroups().empty())
1373 for (
const auto &gd : cd->partOfGroups())
1379 gd->addConcept(ocd.get());
1404 aliasFullName(name),aliasCd(std::move(cd)), aliasContext(ctx) {}
1406 std::unique_ptr<ClassDef> aliasCd;
1409 std::vector<ClassAlias> aliases;
1413 if (cd && visitedClasses.find(icd.get())==visitedClasses.end())
1419 name,icd->getFileDef(),
nullptr);
1445 aliases.emplace_back(aliasFullName,std::move(aliasCd),dm);
1456 visitedClasses.insert(icd.get());
1466 for (
auto &alias : aliases)
1471 alias.aliasContext->addInnerCompound(aliasCd);
1480 if (cd && visitedClasses.find(icd.get())==visitedClasses.end())
1502 "Incomplete input: scope for class {} not found!{}",name,
1503 name.
startsWith(
"std::") ?
" Try enabling BUILTIN_STL_SUPPORT." :
""
1522 if (visitedClasses.find(cd.get())==visitedClasses.end() && !cd->partOfGroups().empty())
1526 for (
auto &ncd : cd->getClasses())
1537 visitedClasses.insert(cd.get());
1544template<
typename Container>
1546 const Container *cd,
1552 MemberList *eiml = cd->getMemberList(mlFilter);
1555 for (
const auto &eimd : *eiml)
1557 DString vtype = eimd->typeString();
1578 const char *p = n.
data()+sn;
1582 if (!isdigit(c) && c!=
'@' && c!=
':')
break;
1588 DString fullName = n+
"."+fieldName;
1607 if (hasNamedVariable)
1620 else if (outerScope)
1640 auto newMd =
createMemberDef(md->getDefFileName(),md->getDefLine(),md->getDefColumn(),
1641 md->typeString(),md->name(),md->argsString(),md->excpString(),
1642 md->protection(),md->virtualness(),md->isStatic(),Relationship::Member,
1651 imd->
setId(md->id());
1666 static auto memberListPairs = std::array<std::pair<MemberListType,MemberListType>,3>{{
1667 { MemberListType::PubAttribs(), MemberListType::PubTypes() },
1668 { MemberListType::ProAttribs(), MemberListType::ProTypes() },
1669 { MemberListType::PriAttribs(), MemberListType::PriTypes() }
1671 for (
auto [attribs,types] : memberListPairs)
1676 for (
const auto &md : *ml)
1680 if (!hasNamedVariable && root)
1733 for (
const auto &md : *ml)
1741 if (md->isEnumerate() && md->name().startsWith(
"@"))
1743 for (
const auto &emd : md->enumFieldList())
1762template<
typename Container,
typename TagContainer>
1764 const Container *def,
1765 const TagContainer *tagParent,
1770template<
typename Container,
typename TagContainer>
1772 const Container *def,
1773 const TagContainer *tagParent,
1778 AUTO_TRACE(
"count={} name={}\n",count,def->name());
1781 MemberList *ml = def->getMemberList(varFilter);
1786 std::vector<MemberDef *> members;
1787 for (
const auto &md : *ml)
1789 members.push_back(md);
1791 for (
const auto &md : members)
1797 MemberList *pml = tagParent->getMemberList(varFilter);
1800 for (
const auto &pmd : *pml)
1802 if (pmd->name()==md->name())
1813 bool hasNamedVariable = pmdm==
nullptr || !pmdm->
isAnonymous();
1815 DString type = md->typeString();
1821 std::vector<const ClassDef *> candidates;
1822 for (
const auto &icd : def->getClasses())
1824 candidates.push_back(icd);
1826 for (
const auto &icd : candidates)
1832 if (md->isAnonymous()) name =
"__unnamed" +
DString().
setNum(pos++)+
"__";
1838 processTagLessClasses(ncd,icd,ncd,MemberListType::PubAttribs(),MemberListType::PubTypes(),name,count+1);
1856 ml = def->getMemberList(typeFilter);
1859 for (
const auto &md : *ml)
1877template<
typename Container,
typename TagContainer>
1879 const Container *def,
1880 const TagContainer *tagParent,
1885 if (varFilter==MemberListType::PubAttribs())
1897template<
typename Container>
1900 for (
const auto &icd : cd->getClasses())
1908 candidates.insert(cd);
1913 std::set<const Definition *> candidates;
1923 const FileDef *fd = cd->getFileDef();
1938 for (
const auto &d : candidates)
1944 processTagLessClasses(nd,nd,nd,MemberListType::DecVarMembers(),MemberListType::DecEnumMembers(),
"",0);
1949 processTagLessClasses(fd,fd,fd,MemberListType::DecVarMembers(),MemberListType::DecEnumMembers(),
"",0);
1966 (root->
section.isNamespace() ||
1967 root->
section.isNamespaceDoc() ||
1976 if (root->
section.isPackageDoc())
1982 if (!fullName.
empty())
2041 root->
type,root->
spec.isPublished())));
2109 DString aliasName = aliasNd->name();
2138 for (
auto &und : unl)
2140 DString uScope=und->name()+
"::";
2142 if (usingNd!=
nullptr)
break;
2149 if (root->
section.isUsingDir())
2167 (fd==
nullptr || fd->
getLanguage()!=SrcLangExt::Java)
2171 if (!nsName.
empty())
2181 int scopeOffset =
static_cast<int>(nsName.
length());
2194 size_t o = nsName.
rfind(
"::",scopeOffset-1);
2197 }
while (scopeOffset>=0 && usingNd==
nullptr);
2199 if (usingNd==
nullptr && nd)
2203 while (pnd && usingNd==
nullptr)
2220 if (usingNd==
nullptr && fd)
2293 if (root->
section.isUsingDecl() &&
2306 if (root->
section.isUsingDecl() &&
2308 (!filterPythonPackages || (root->
lang==SrcLangExt::Python && root->
fileName.
endsWith(
"__init__.py")))
2311 AUTO_TRACE(
"Found using declaration '{}' at line {} of {} inside section {}",
2325 if (!scName.
empty())
2341 if (nd==
nullptr) scope = fd;
2411 AUTO_TRACE(
"creating new member {} for class {}",memName,cd->
name());
2422 newMmd->setMemberClass(cd);
2440 newMmd->addSectionsToDefinition(root->
anchors);
2446 newMmd->setMemberGroupId(root->
mGrpId);
2449 newMmd->setLanguage(root->
lang);
2450 newMmd->setId(root->
id);
2459 if (root->
section.isUsingDecl() &&
2486 for (
auto &mi : *mni)
2489 if (md && md->
protection()!=Protection::Private)
2504 for (
const auto ©Cd : it->second)
2517 else if (root->
section.isUsingDecl() &&
2519 root->
lang==SrcLangExt::Cpp
2552 memName = root->
name;
2574 newMmd->setNamespace(nd);
2579 newMmd->setFileDef(fd);
2598 newMmd->addSectionsToDefinition(root->
anchors);
2604 newMmd->setMemberGroupId(root->
mGrpId);
2607 newMmd->setLanguage(root->
lang);
2608 newMmd->setId(root->
id);
2616 if (nd && aliasMd.get())
2620 if (fd && aliasMd.get())
2649 if (nd) ncdm->
moveTo(nd);
2678 aliasFullName = aliasCd->localName();
2682 aliasFullName = nd->
qualifiedName()+
"::"+aliasCd->localName();
2714 for (
const auto &fd : *fn)
2717 fd->addIncludedUsingDirectives(visitedFiles);
2737 if (lang==SrcLangExt::Java || lang==SrcLangExt::CSharp)
2742 AUTO_TRACE(
"class variable: file='{}' type='{}' scope='{}' name='{}' args='{}' prot={} mtype={} lang={} init='{}'",
2748 if (related!=Relationship::Member || mtype==MemberType::Friend ||
Config_getBool(HIDE_SCOPE_NAMES))
2750 if (root->
spec.isAlias())
2752 if (lang==SrcLangExt::Python)
2754 def=
"type "+name+args;
2763 def=type+
" "+name+args;
2768 if (root->
spec.isAlias())
2770 if (lang==SrcLangExt::Python)
2772 def=
"type "+qualScope+scopeSeparator+name+args;
2776 def=
"using "+qualScope+scopeSeparator+name;
2781 def=type+
" "+qualScope+scopeSeparator+name+args;
2793 def=qualScope+scopeSeparator+name+args;
2804 for (
const auto &imd : *mn)
2816 if (root->
lang==SrcLangExt::ObjC &&
2817 root->
mtype==MethodTypes::Property &&
2841 prot,Specifier::Normal,root->
isStatic,related,
2845 mmd->setTagInfo(root->
tagInfo());
2846 mmd->setMemberClass(cd);
2850 mmd->setDefinition(def);
2852 mmd->addSectionsToDefinition(root->
anchors);
2856 mmd->setMemberGroupId(root->
mGrpId);
2857 mmd->setMemberSpecifiers(root->
spec);
2858 mmd->setVhdlSpecifiers(root->
vhdlSpec);
2859 mmd->setReadAccessor(root->
read);
2860 mmd->setWriteAccessor(root->
write);
2862 mmd->setHidden(root->
hidden);
2864 mmd->setLanguage(root->
lang);
2865 mmd->setId(root->
id);
2868 mmd->setBodyDef(root->
fileDef());
2874 mmd->setRefItems(root->
sli);
2875 mmd->setRequirementReferences(root->
rqli);
2880 if (mtype==MemberType::Typedef)
2903 AUTO_TRACE(
"global variable: file='{}' type='{}' scope='{}' name='{}' args='{}' prot={} mtype={} lang={} init='{}'",
2909 if (mtype==MemberType::Typedef &&
Config_getBool(TYPEDEF_HIDES_STRUCT))
2915 static const reg::Ex re(R
"(\a\w*)");
2917 const std::string &typ = ttype.
str();
2920 DString typeValue = match.str();
2955 if (root->
spec.isAlias())
2957 if (lang==SrcLangExt::Python)
2959 def=
"type "+nd->
name()+sep+name+args;
2963 def=
"using "+nd->
name()+sep+name;
2968 def=type+
" "+nd->
name()+sep+name+args;
2973 def=nd->
name()+sep+name+args;
2980 if (name.
at(0)==
'@')
2986 if (root->
spec.isAlias())
2988 if (root->
lang==SrcLangExt::Python)
2990 def=
"type "+root->
name+args;
2994 def=
"using "+root->
name;
2999 def=type+
" "+name+args;
3020 for (
const auto &imd : *mn)
3034 bool isPHPArray = md->
getLanguage()==SrcLangExt::PHP &&
3037 bool staticsInDifferentFiles =
3043 !staticsInDifferentFiles
3085 mmd->setTagInfo(root->
tagInfo());
3086 mmd->setMemberSpecifiers(root->
spec);
3087 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3091 mmd->addSectionsToDefinition(root->
anchors);
3094 mmd->setMemberGroupId(root->
mGrpId);
3095 mmd->setDefinition(def);
3096 mmd->setLanguage(root->
lang);
3097 mmd->setId(root->
id);
3105 mmd->setBodyDef(fd);
3111 mmd->setRefItems(root->
sli);
3112 mmd->setRequirementReferences(root->
rqli);
3115 mmd->setNamespace(nd);
3123 mmd->setFileDef(fd);
3129 if (mtype==MemberType::Typedef)
3151 if (lang == SrcLangExt::Fortran || lang == SrcLangExt::VHDL)
3156 static const reg::Ex re(R
"(\([^)]*[*&^][^)]*\))");
3158 size_t i=std::string::npos;
3162 i = match.position();
3165 if (i!=std::string::npos)
3167 size_t di = type.find(
"decltype(");
3168 if (di!=std::string::npos && di<i)
3170 i = std::string::npos;
3173 size_t bb=type.find(
'<');
3174 size_t be=type.rfind(
'>');
3175 bool templFp =
false;
3176 if (be!=std::string::npos) {
3177 size_t cc_ast = type.find(
"::*");
3178 size_t cc_amp = type.find(
"::&");
3179 templFp = (cc_ast != std::string::npos && cc_ast>be) || (cc_amp != std::string::npos && cc_amp>be);
3182 if (!type.empty() &&
3183 i!=std::string::npos &&
3184 type.find(
"operator")==std::string::npos &&
3185 (type.find(
")(")==std::string::npos || type.find(
"typedef ")!=std::string::npos) &&
3187 (!((bb!=std::string::npos && bb<i) && (be!=std::string::npos && i<be)) || templFp)
3190 if (pLength) *pLength=
static_cast<int>(l);
3193 return static_cast<int>(i);
3210 bool result =
false;
3211 bool typeIsClass =
false;
3212 bool typePtrType =
false;
3249 typeIsClass = resolver.
resolveClass(ctx,type)!=
nullptr;
3267 static const reg::Ex initChars(R
"([\d"'&*!^]+)");
3271 std::string name = a.
name.
str();
3272 if (
reg::search(name,match,initChars) && match.position()==0)
3304 std::string atype = a.
type.
str();
3305 if (
reg::search(atype,match,initChars) && match.position()==0)
3312 if (resType.empty()) resType=atype;
3313 static const reg::Ex idChars(R
"(\a\w*)");
3314 if (
reg::search(resType,match,idChars) && match.position()==0)
3316 resType=match.str();
3317 if (resType==
"int" || resType==
"long" ||
3318 resType==
"float" || resType==
"double" ||
3319 resType==
"char" || resType==
"void" ||
3320 resType==
"signed" || resType==
"unsigned" ||
3321 resType==
"const" || resType==
"volatile" )
3358 bool insideString=
false;
3359 bool insideChar=
false;
3361 while (e<len && brCount!=0)
3367 if (!insideString && !insideChar)
3369 if (e<len-1 && s.
at(e+1)==
'<')
3371 else if (roundCount==0)
3376 if (!insideString && !insideChar)
3378 if (e<len-1 && s.
at(e+1)==
'>')
3380 else if (roundCount==0)
3385 if (!insideString && !insideChar)
3389 if (!insideString && !insideChar)
3395 if (insideString && pc!=
'\\')
3404 if (insideChar && pc!=
'\\')
3414 return brCount==0 ?
static_cast<int>(e) : -1;
3423 AUTO_TRACE(
"VARIABLE_SEC: type='{}' name='{}' args='{}' bodyLine={} endBodyLine={} mGrpId={} relates='{}'",
3438 std::string sargs = args.
str();
3439 static const reg::Ex reName(R
"(\a\w*)");
3444 sargs = match.suffix().str();
3445 size_t j = sargs.find(
')');
3446 if (j!=std::string::npos) args=sargs.
substr(0,j);
3457 size_t ai = type.
find(
'[',ii);
3470 AUTO_TRACE_ADD(
"after correction: type='{}' name='{}' args='{}'",type,name,args);
3483 bool variableTemplateSpecialization = index!=-1 && !root->
tArgLists.empty() &&
3486 if (qualifiedGroupMember || variableTemplateSpecialization)
3489 if (variableTemplateSpecialization)
3499 scope=name.
left(index);
3500 name=name.
mid(index+2);
3508 if (!scopeName.
empty())
3520 bool isRelated=
false;
3521 bool isMemberOf=
false;
3524 if (root->
lang==SrcLangExt::CSharp)
3537 for (
size_t i=0;i<name.
length()-1;i++)
3539 if (name[i]==
':' && name[i+1]==
':')
3541 p=
static_cast<int>(i);
3543 else if (name[i]==
'<')
3548 if (e!=-1) i=
static_cast<int>(e);
3566 Relationship::Member
3587 mtype=MemberType::EnumValue;
3589 mtype=MemberType::Typedef;
3590 else if (type_s.
startsWith(
"friend ") || type_s==
"friend")
3591 mtype=MemberType::Friend;
3592 else if (root->
mtype==MethodTypes::Property)
3593 mtype=MemberType::Property;
3594 else if (root->
mtype==MethodTypes::Event)
3595 mtype=MemberType::Event;
3597 mtype=sliceOpt ? MemberType::Sequence : MemberType::Typedef;
3599 mtype=sliceOpt ? MemberType::Dictionary : MemberType::Typedef;
3604 isMemberOf=(root->
relatesType==RelatesType::MemberOf);
3615 Relationship relationship = isMemberOf ? Relationship::Foreign :
3616 isRelated ? Relationship::Related :
3617 Relationship::Member ;
3630 else if (!name.
empty())
3656 scope=rname.
left(index);
3657 rname=rname.
mid(index+2);
3669 for (
auto &imd : *mn)
3671 if (!imd->isTypedef())
3680 bool notBothGrouped = root->
groups.empty() || imd->getGroupDef()==
nullptr;
3681 bool bothSameScope = (!cd && !nd) || (cd && imd->getClassDef() == cd) || (nd && imd->getNamespaceDef() == nd);
3684 if (notBothGrouped && bothSameScope && imd->typeString()==rtype)
3732 for (
const auto &e : root->
children())
3733 if (!e->section.isEnum())
3750 for (
const auto &e : root->
children())
3751 if (!e->section.isEnum())
3768 for (
const auto &e : root->
children())
3769 if (!e->section.isEnum())
3784 (root->
section.isVariable() &&
3787 (root->
section.isFunction() &&
3790 (root->
section.isFunction() &&
3799 for (
const auto &e : root->
children())
3800 if (!e->section.isEnum())
3815 enum MemberType type = root->
section.isExportedInterface() ? MemberType::Interface : MemberType::Service;
3826 mmd->setTagInfo(root->
tagInfo());
3827 mmd->setMemberClass(cd);
3829 mmd->setDocsForDefinition(
false);
3833 mmd->setMemberSpecifiers(root->
spec);
3834 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3835 mmd->setMemberGroupId(root->
mGrpId);
3837 mmd->setLanguage(root->
lang);
3838 mmd->setBodyDef(fd);
3839 mmd->setFileDef(fd);
3840 mmd->addSectionsToDefinition(root->
anchors);
3842 mmd->setDefinition(def);
3847 AUTO_TRACE(
"Interface member: fileName='{}' type='{}' name='{}' mtype='{}' prot={} virt={} state={} proto={} def='{}'",
3855 root->
spec.isOptional() ? Protection::Protected : Protection::Public, Specifier::Normal);
3865 mmd->setRefItems(root->
sli);
3866 mmd->setRequirementReferences(root->
rqli);
3875 if (root->
section.isExportedInterface() || root->
section.isIncludedService())
3877 AUTO_TRACE(
"Exported interface/included service: type='{}' scope='{}' name='{}' args='{}'"
3878 " relates='{}' relatesType='{}' file='{}' line={} bodyLine={} #tArgLists={}"
3879 " mGrpId={} spec={} proto={} docFile='{}'",
3902 else if (rname.
empty())
3905 "Illegal member name found.");
3911 case SrcLangExt::Unknown:
3912 case SrcLangExt::IDL:
3941 if (isFriend) mtype=MemberType::Friend;
3942 else if (root->
mtype==MethodTypes::Signal) mtype=MemberType::Signal;
3943 else if (root->
mtype==MethodTypes::Slot) mtype=MemberType::Slot;
3944 else if (root->
mtype==MethodTypes::DCOP) mtype=MemberType::DCOP;
3949 if ((fd==
nullptr || fd->
getLanguage()==SrcLangExt::Cpp) &&
3953 (j!=i+2 || name.
at(i+1)!=
'=')
3971 root->
relatesType==RelatesType::MemberOf ? Relationship::Foreign :
3972 Relationship::Related ;
3982 mmd->setTagInfo(root->
tagInfo());
3983 mmd->setMemberClass(cd);
3985 mmd->setDocsForDefinition(!root->
proto);
3989 mmd->setMemberSpecifiers(spec);
3990 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3991 mmd->setMemberGroupId(root->
mGrpId);
3993 mmd->setLanguage(root->
lang);
3994 mmd->setRequiresClause(root->
req);
3995 mmd->setId(root->
id);
3996 mmd->setBodyDef(fd);
3997 mmd->setFileDef(fd);
3998 mmd->addSectionsToDefinition(root->
anchors);
4004 if (scopeSeparator!=
"::")
4006 qualScope =
substitute(qualScope,
"::",scopeSeparator);
4008 if (lang==SrcLangExt::PHP)
4011 scopeSeparator=
"::";
4028 def=type+
" "+qualScope+scopeSeparator+name;
4032 def=qualScope+scopeSeparator+name;
4036 mmd->setDefinition(def);
4040 AUTO_TRACE(
"function member: type='{}' scope='{}' name='{}' args='{}' proto={} def='{}'",
4041 type, qualScope, rname, args, root->
proto, def);
4051 mmd->setRefItems(root->
sli);
4052 mmd->setRequirementReferences(root->
rqli);
4072 MemberType::Function,
4076 mmd->setTagInfo(root->
tagInfo());
4077 mmd->setLanguage(root->
lang);
4078 mmd->setId(root->
id);
4083 mmd->setDocsForDefinition(!root->
proto);
4089 mmd->addSectionsToDefinition(root->
anchors);
4090 mmd->setMemberSpecifiers(root->
spec);
4091 mmd->setVhdlSpecifiers(root->
vhdlSpec);
4092 mmd->setMemberGroupId(root->
mGrpId);
4093 mmd->setRequiresClause(root->
req);
4104 if (!nscope.
empty())
4129 def=root->
type+
" "+scope+name;
4135 AUTO_TRACE(
"new non-member function type='{}' scope='{}' name='{}' args='{}' proto={} def='{}'",
4137 mmd->setDefinition(def);
4141 mmd->setRefItems(root->
sli);
4142 mmd->setRequirementReferences(root->
rqli);
4146 mmd->setNamespace(nd);
4153 mmd->setFileDef(fd);
4174 if (root->
section.isFunction())
4176 AUTO_TRACE(
"member function: type='{}' scope='{}' name='{}' args='{}' relates='{}' relatesType='{}'"
4177 " file='{}' line={} bodyLine={} #tArgLists={} mGrpId={}"
4178 " spec={} proto={} docFile='{}'",
4193 scope=rname.
left(index);
4194 rname=rname.
mid(index+2);
4203 if (root->
lang==SrcLangExt::CSharp)
4214 size_t memIndex=rname.
rfind(
"::");
4217 if (cd && scope+
"::"==rname.
left(scope.
length()+2))
4223 bool isMember=
false;
4226 size_t ts=rname.
find(
'<');
4227 size_t te=rname.
find(
'>');
4245 isMember=memIndex<ts || memIndex>te;
4285 for (
const auto &imd : *mn)
4298 fullScope.
prepend(parentScope);
4304 if (mnd) nsName = mnd->
name();
4305 if (rnd) rnsName = rnd->
name();
4313 bool sameTemplateArgs =
true;
4314 bool matchingReturnTypes =
true;
4315 bool sameRequiresClause =
true;
4321 matchingReturnTypes =
false;
4325 sameRequiresClause =
false;
4331 sameTemplateArgs =
false;
4334 bool staticsInDifferentFiles =
4337 if (sameTemplateArgs &&
4338 matchingReturnTypes &&
4339 sameRequiresClause &&
4340 !staticsInDifferentFiles &&
4347 if (!root->
groups.empty() && !root->
groups.front().groupname.empty())
4354 found=(mnd && rnd && nsName==rnsName) ||
4355 ((mnd==
nullptr && rnd==
nullptr && mfd!=
nullptr &&
4360 if (!found && gd && gd==md->
getGroupDef() && nsName==rnsName)
4366 AUTO_TRACE_ADD(
"combining function with prototype found={} in namespace '{}'",found,nsName);
4465 else if (rname.
empty())
4468 "Illegal member name found."
4486 for (
const auto &ifmd : *fn)
4490 for (
const auto &immd : *mn)
4506 AUTO_TRACE_ADD(
"Merging related global and member '{}' isFriend={} isRelated={} isFunction={}",
4583 for (
const auto &imdec : *mn)
4591 for (
const auto &imdef : *mn)
4594 if (mdef && mdec!=mdef &&
4614 for (
const auto &imd : *mn)
4630 if (mdef && mdec)
break;
4638 mdec->getOuterScope(),mdec->getFileDef(),mdec->typeString(),
const_cast<ArgumentList*
>(&mdecAl),
4645 mdec->mergeReferences(mdef);
4647 mdec->mergeReferencedBy(mdef);
4664 for (
const auto &imd : *mn)
4675 for (
const auto &irmd : *rmn)
4709 size_t i=qualifiedName.rfind(
"::");
4710 if (i!=std::string::npos)
4717 for (
const auto &imd : *mn)
4743 std::map<std::string,int> templateNames;
4745 for (
const Argument &arg : templateArguments)
4747 static const reg::Ex re(R
"(\a[\w:]*)");
4750 for (; it!=
end ; ++it)
4752 const auto &match = *it;
4753 std::string n = match.str();
4754 if (n==arg.name.str())
4756 if (templateNames.find(n)==templateNames.end())
4758 templateNames.emplace(n,count);
4763 return templateNames;
4778 if (context && cd!=context)
4783 if (result==
nullptr)
4788 if (result==
nullptr)
4817 for (
auto &mi : *mni)
4825 if (!typedefValue.
empty())
4827 type = typedefValue;
4846 usedClassName = typeCd->
name();
4856 if (templateNames.empty())
4860 BaseInfo bi(usedName,Protection::Public,Specifier::Normal);
4865 if (arg.name==usedName)
4869 if (usedCd==
nullptr)
4920 if (!found && !type.
empty())
4979 if (templateNames.empty())
4995 bool b =
Config_getBool(HIDE_UNDOC_RELATIONS) ? true : isArtificial;
5017 AUTO_TRACE(
"Derived from template '{}' with parameters '{}' isArtificial={}",
5018 templateClass->
name(),templSpec,isArtificial);
5021 bool existingClass = templSpec==tempArgsStr;
5022 if (existingClass)
return;
5024 bool freshInstance=
false;
5041 for (
auto it=it_pair.first ; it!=it_pair.second ; ++it)
5043 const Entry *templateRoot = it->second;
5044 AUTO_TRACE_ADD(
"template root found '{}' templSpec='{}'",templateRoot->
name,templSpec);
5050 isArtificial,templArgs.get(),templateNames);
5074 templateClassName,
true,
true);
5075 AUTO_TRACE_ADD(
"templateClassName={} baseClass={}",templateClassName,baseClass?baseClass->
name():
"<none>");
5104 if (name.
empty())
return 0;
5105 int l =
static_cast<int>(name.
length());
5111 while (count>0 && i>=0)
5116 case '>':
if (!insideQuote) count++;
break;
5117 case '<':
if (!insideQuote) count--;
break;
5118 case '\'':
if (!insideQuote) insideQuote=c;
5119 else if (insideQuote==c && (i<0 || name[i]!=
'\\')) insideQuote=0;
5121 case '"':
if (!insideQuote) insideQuote=c;
5122 else if (insideQuote==c && (i<0 || name[i]!=
'\\')) insideQuote=0;
5142 AUTO_TRACE(
"name={} base={} isArtificial={} mode={}",cd->
name(),bi->
name,isArtificial,(
int)mode);
5145 bool explicitGlobalScope=
false;
5148 biName=biName.
mid(2);
5149 explicitGlobalScope=
true;
5153 bool lastParent=
false;
5158 int scopeOffset=explicitGlobalScope ? 0 :
static_cast<int>(scopeName.
length());
5167 baseClassName.
prepend(scopeName.
left(scopeOffset)+
"::");
5169 if (root->
lang==SrcLangExt::CSharp)
5196 || explicitGlobalScope
5199 || (root->
lang==SrcLangExt::IDL &&
5200 (root->
section.isExportedInterface() ||
5201 root->
section.isIncludedService()))
5204 AUTO_TRACE_ADD(
"class relation '{}' inherited/used by '{}' found prot={} virt={} templSpec='{}'",
5205 baseClassName, root->
name, bi->
prot, bi->
virt, templSpec);
5208 size_t si=baseClassName.
rfind(
"::",i);
5210 if (baseClass==
nullptr &&
static_cast<size_t>(i)!=baseClassName.
length())
5220 baseClassName = baseClassName.
left(i)+baseClassName.
mid(e);
5231 else if (baseClass && !templSpec.
empty())
5242 baseClass = templClass;
5260 found=baseClass!=
nullptr && baseClass!=cd;
5270 found = baseClass!=
nullptr && baseClass!=cd;
5282 found = baseClass!=
nullptr && baseClass!=cd;
5285 bool isATemplateArgument = templateNames.find(biName.
str())!=templateNames.end();
5290 AUTO_TRACE_ADD(
"Documented base class '{}' templSpec='{}'",biName,templSpec);
5308 if (baseClassTypeDef==
nullptr)
5318 if (baseClassTypeDef)
5327 AUTO_TRACE_ADD(
"insertBaseClass name={} prot={} virt={} templSpec={}",usedName,prot,bi->
virt,templSpec);
5335 "Detected potential recursive class relation "
5336 "between class {} and base class {}!",
5343 else if (mode==
Undocumented && (scopeOffset==0 || isATemplateArgument))
5345 AUTO_TRACE_ADD(
"New undocumented base class '{}' baseClassName='{}' templSpec='{}' isArtificial={}",
5346 biName,baseClassName,templSpec,isArtificial);
5348 if (isATemplateArgument)
5351 if (baseClass==
nullptr)
5370 if (baseClass==
nullptr)
5381 si = baseClassName.
rfind(
"::");
5397 biName=
"<"+biName.
left(biName.
length()-2)+
">";
5401 AUTO_TRACE_ADD(
"insertBaseClass name={} prot={} virt={} templSpec={}",biName,bi->
prot,bi->
virt,templSpec);
5411 if (scope!=baseClass)
5437 "Detected potential recursive class relation "
5438 "between class {} and base class {}!",
5439 root->
name,baseClassName
5452 size_t o = scopeName.
rfind(
"::",scopeOffset-1);
5456 }
while (scopeOffset>=0);
5458 if (parentNode==
nullptr)
5464 parentNode=parentNode->
parent();
5466 }
while (lastParent);
5486 bool hasExtends = !root->
extends.empty();
5487 if (hasExtends)
return true;
5514 if (root->
lang==SrcLangExt::CSharp)
5520 bName = bName.
left(i);
5585 if (!nd->hasDocumentation())
5588 nd->getLanguage() == SrcLangExt::Fortran) &&
5592 warn_undoc(nd->getDefFileName(),nd->getDefLine(),
"{} {} is not documented.",
5593 nd->getLanguage() == SrcLangExt::Fortran ?
"Module" :
"Namespace",
5643 DString templSpec = ti.templSpec;
5657 for (
const auto &tn_kv : templateNames)
5659 size_t templIndex = tn_kv.second;
5661 bool hasActArg=
false;
5662 if (templIndex<templArgs->size())
5664 actArg=templArgs->at(templIndex);
5668 baseClassNames.find(actArg.
type.
str())!=baseClassNames.end() &&
5669 actualTemplateNames.find(actArg.
type.
str())==actualTemplateNames.end()
5672 actualTemplateNames.emplace(actArg.
type.
str(),
static_cast<int>(templIndex));
5707 for (
const auto &fd : *fn)
5709 fd->computeAnchors();
5722 gd->computeAnchors();
5729template<
typename Func>
5752 for (
const auto &fd : *fn)
5825 if (md==
nullptr)
return;
5826 AUTO_TRACE(
"scope='{}' name='{}' args='{}' funcDecl='{}' mSpec={}",
5841 fullName = cd->
name();
5843 fullName = nd->
name();
5845 if (!fullName.
empty()) fullName+=
"::";
5846 fullName+=md->
name();
5952 "member {} belongs to two different groups. The second one found here will be ignored.",
5990 return allowNoGroup;
5993 for (
const auto &g : root->
groups)
5995 if (g.groupname == gd->
name())
6018 AUTO_TRACE(
"namespace='{}' type='{}' name='{}' tempArg='{}' decl='{}'",namespaceName,type,name,tempArg,decl);
6020 if (n.
empty())
return false;
6032 for (
const auto &md : *mn)
6043 if (md->isAlias() && md->getOuterScope() &&
6050 nd = md->getNamespaceDef();
6054 size_t enumNamePos=0;
6055 if (nd && md->isEnumValue() && (enumNamePos=namespaceName.
rfind(
"::"))!=
DString::npos)
6057 DString enumName = namespaceName.
mid(enumNamePos+2);
6058 if (namespaceName.
left(enumNamePos)==nd->
name())
6063 for (
const auto &emd : *enumMn)
6065 found = emd->isStrong() && md->getEnumScope()==emd.get();
6079 else if (nd==
nullptr && md->isEnumValue())
6084 for (
const auto &emd : *enumMn)
6086 found = emd->isStrong() && md->getEnumScope()==emd.get();
6109 if ((namespaceName.
empty() && nd==
nullptr) ||
6110 (nd && nd->
name()==namespaceName) ||
6114 AUTO_TRACE_ADD(
"Try to add member '{}' to scope '{}'",md->name(),namespaceName);
6122 md->isVariable() || md->isTypedef() ||
6123 matchArguments2(md->getOuterScope(),md->getFileDef(),md->typeString(),&mdAl,
6130 if (matching && !root->
tArgLists.empty())
6149 if (matching && md->isStatic() &&
6150 md->getDefFileName()!=root->
fileName &&
6158 if (!md->templateArguments().empty() && !root->
tArgLists.empty())
6163 if (md->templateArguments().size()!=root->
tArgLists.back().size() ||
6164 md->typeString()!=type ||
6165 md->requiresClause()!=root->
req)
6181 if (!found && root->
relatesType!=RelatesType::Duplicate && root->
section.isFunction())
6185 DString warnMsg =
"no matching file member found for \n"+fullFuncDecl;
6188 warnMsg+=
"\nPossible candidates:";
6189 for (
const auto &md : *mn)
6193 warnMsg+=
"' " +
warn_line(md->getDefFileName(),md->getDefLine());
6201 if (root->
type!=
"friend class" &&
6202 root->
type!=
"friend struct" &&
6203 root->
type!=
"friend union" &&
6204 root->
type!=
"friend" &&
6210 "documented symbol '{}' was not declared or defined.",
qPrint(decl)
6222 auto srcIt = srcTempArgLists.begin();
6223 auto dstIt = dstTempArgLists.begin();
6224 while (srcIt!=srcTempArgLists.end() && dstIt!=dstTempArgLists.end())
6226 if ((*srcIt).size()!=(*dstIt).size())
return true;
6240 result = cd->templateArguments().hasParameters() || cd->templateMaster()!=
nullptr ||
6250 const std::string &src
6254 static const reg::Ex re(R
"(\a\w*)");
6259 for (; it!=
end ; ++it)
6261 const auto &match = *it;
6262 size_t i = match.position();
6263 size_t l = match.length();
6265 dst+=src.substr(p,i-p);
6266 std::string name=match.str();
6268 auto srcIt = srcTempArgLists.begin();
6269 auto dstIt = dstTempArgLists.begin();
6270 while (srcIt!=srcTempArgLists.end() && !found)
6273 std::vector<Argument>::const_iterator tdaIt;
6274 if (dstIt!=dstTempArgLists.end())
6277 tdaIt = tdAli->
begin();
6282 for (
auto tsaIt = tsaLi.
begin(); tsaIt!=tsaLi.
end() && !found; ++tsaIt)
6286 if (tdAli && tdaIt!=tdAli->
end())
6302 else if (tdaType.
startsWith(
"typename ")) vc=9;
6305 tdaName = tdaType.
mid(vc);
6307 if (!tdaName.
empty())
6338 auto dstIt = dst.
begin();
6343 if (dstIt == dst.
end())
6347 da.
array = dstArray;
6355 da.
array = dstArray;
6363 srcTempArgLists,dstTempArgLists,
6389 funcType,funcName,funcArgs,exceptions,
6393 mmd->setTagInfo(root->
tagInfo());
6394 mmd->setLanguage(root->
lang);
6395 mmd->setId(root->
id);
6396 mmd->makeImplementationDetail();
6397 mmd->setMemberClass(cd);
6398 mmd->setDefinition(funcDecl);
6404 mmd->setDocsForDefinition(!root->
proto);
6406 mmd->addSectionsToDefinition(root->
anchors);
6410 mmd->setMemberSpecifiers(spec);
6411 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6412 mmd->setMemberGroupId(root->
mGrpId);
6415 mmd->setRefItems(root->
sli);
6416 mmd->setRequirementReferences(root->
rqli);
6453 bool memFound=
false;
6454 for (
const auto &imd : *mn)
6457 if (md==
nullptr)
continue;
6459 if (cd==
nullptr)
continue;
6471 size_t enumNamePos=0;
6474 DString enumName = className.
mid(enumNamePos+2);
6476 if (!namespaceName.
empty()) fullScope.
prepend(namespaceName+
"::");
6477 if (fullScope==cd->
name())
6483 for (
const auto &emd : *enumMn)
6485 memFound = emd->isStrong() && md->
getEnumScope()==emd.get();
6491 if (memFound)
break;
6496 if (memFound)
break;
6514 if (!templAl.
empty())
6516 declTemplArgs.push_back(templAl);
6524 bool substDone=
false;
6531 if (declTemplArgs.size()>0 && declTemplArgs.size()==defTemplArgs.size())
6554 AUTO_TRACE_ADD(
"matching '{}'<=>'{}' className='{}' namespaceName='{}' result={}",
6583 AUTO_TRACE_ADD(
"Comparing return types '{}'<->'{}' #args {}<->{}",
6591 else if (defTemplArgs.size()>declTemplArgs.size())
6593 AUTO_TRACE_ADD(
"Different number of template arguments {} vs {}",defTemplArgs.size(),declTemplArgs.size());
6599 bool rootIsUserDoc = root->
section.isMemberDoc();
6602 bool classOrMdIsTemplate = mdIsTemplate || classIsTemplate;
6603 bool rootIsTemplate = !root->
tArgLists.empty();
6605 if (!rootIsUserDoc &&
6606 (mdIsTemplate || rootIsTemplate) &&
6607 ((classOrMdIsTemplate && !rootIsTemplate) || (!classOrMdIsTemplate && rootIsTemplate))
6612 AUTO_TRACE_ADD(
"Comparing return types: template v.s. non-template");
6616 AUTO_TRACE_ADD(
"Match results of matchArguments2='{}' substDone='{}'",matching,substDone);
6627 if (!funcTempList.
empty() &&
6647 else if (cd && cd!=tcd)
6653 if (memFound)
break;
6657 addLocalObjCMethod(root,scopeName,funcType,funcName,funcArgs,exceptions,funcDecl,spec);
6660 if (count==0 && !(isFriend && funcType==
"class"))
6663 const ClassDef *ecd =
nullptr, *ucd =
nullptr;
6664 MemberDef *emd =
nullptr, *umd =
nullptr;
6666 for (
const auto &md : *mn)
6688 AUTO_TRACE_ADD(
"new candidate className='{}' scope='{}' args='{}': exact match",
6689 className,ccd->
name(),md->argsString());
6695 AUTO_TRACE_ADD(
"new candidate className='{}' scope='{}' args='{}': no match",
6696 className,ccd->
name(),md->argsString());
6701 bool strictProtoMatching =
Config_getBool(STRICT_PROTO_MATCHING);
6702 if (!strictProtoMatching)
6704 if (candidates==1 && ucd && umd)
6711 else if (candidates>1 && ecd && emd)
6722 if (noMatchCount>1) warnMsg+=
"uniquely ";
6723 warnMsg+=
"matching class member found for \n";
6727 warnMsg+=
" template ";
6732 DString fullFuncDecl=funcDecl;
6736 warnMsg+=fullFuncDecl;
6738 if (candidates>0 || noMatchCount>=1)
6740 warnMsg+=
"\nPossible candidates:";
6746 for (
const auto &md : *mn)
6748 const ClassDef *cd=md->getClassDef();
6762 warnMsg+=
"template ";
6767 if (!md->typeString().empty())
6769 warnMsg+=md->typeString();
6773 if (!qScope.
empty())
6774 warnMsg+=qScope+
"::"+md->name();
6775 warnMsg+=md->argsString();
6776 warnMsg+=
"' " +
warn_line(md->getDefFileName(),md->getDefLine());
6797 AUTO_TRACE(
"funcType={} funcName={} funcArgs={} funcDecl={} spec={}",funcType,funcName,funcArgs,funcDecl,spec);
6799 for (
const auto &md : *mn)
6801 if (md->getClassDef()==cd)
6813 funcType,funcName,funcArgs,exceptions,
6819 mmd->setTagInfo(root->
tagInfo());
6820 mmd->setLanguage(root->
lang);
6821 mmd->setId(root->
id);
6822 mmd->setMemberClass(cd);
6823 mmd->setTemplateSpecialization(
true);
6825 mmd->setDefinition(funcDecl);
6831 mmd->setDocsForDefinition(!root->
proto);
6833 mmd->addSectionsToDefinition(root->
anchors);
6837 mmd->setMemberSpecifiers(spec);
6838 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6839 mmd->setMemberGroupId(root->
mGrpId);
6841 mmd->setRefItems(root->
sli);
6842 mmd->setRequirementReferences(root->
rqli);
6857 bool sameClass=
false;
6862 [](
const auto &md1,
const auto &md2)
6863 { return md1->getClassDef()->name()==md2->getClassDef()->name(); });
6869 if (cd==
nullptr)
return;
6872 if (root->
mtype==MethodTypes::Signal) mtype=MemberType::Signal;
6873 else if (root->
mtype==MethodTypes::Slot) mtype=MemberType::Slot;
6874 else if (root->
mtype==MethodTypes::DCOP) mtype=MemberType::DCOP;
6877 std::unique_ptr<ArgumentList> tArgList =
6882 funcType,funcName,funcArgs,exceptions,
6886 mmd->setTagInfo(root->
tagInfo());
6887 mmd->setLanguage(root->
lang);
6888 mmd->setId(root->
id);
6890 mmd->setMemberClass(cd);
6891 mmd->setDefinition(funcDecl);
6900 mmd->setDocsForDefinition(!root->
proto);
6902 mmd->addSectionsToDefinition(root->
anchors);
6906 mmd->setMemberSpecifiers(spec);
6907 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6908 mmd->setMemberGroupId(root->
mGrpId);
6911 mmd->setRefItems(root->
sli);
6912 mmd->setRequirementReferences(root->
rqli);
6971 AUTO_TRACE(
"root='{}' funcDecl='{}' related='{}' overload={} isFunc={} mGrpId={} #tArgList={} spec={} lang={}",
6984 bool isRelated=
false;
6985 bool isMemberOf=
false;
6986 bool isFriend=
false;
6999 spec.setInline(
true);
7004 spec.setExplicit(
true);
7009 spec.setMutable(
true);
7014 spec.setThreadLocal(
true);
7031 if (!funcDecl.
empty() && funcDecl[0]!=
' ') funcDecl.
prepend(
" ");
7043 if (isFriend && funcDecl.
startsWith(
"class "))
7046 funcDecl=funcDecl.
mid(6);
7047 funcName = funcDecl;
7049 else if (isFriend && funcDecl.
startsWith(
"struct "))
7051 funcDecl=funcDecl.
mid(7);
7052 funcName = funcDecl;
7058 funcArgs,funcTempList,exceptions
7066 AUTO_TRACE_ADD(
"scopeName='{}' className='{}' namespaceName='{}' funcType='{}' funcName='{}' funcArgs='{}'",
7067 scopeName,className,namespaceName,funcType,funcName,funcArgs);
7068 if (!relates.
empty())
7071 isMemberOf=(root->
relatesType == RelatesType::MemberOf);
7078 scopeName = relates;
7088 if (!scopeName.
empty() &&
7091 scopeName = joinedName;
7105 DString joinedName = fnd->name()+
"::"+scopeName;
7108 scopeName=joinedName;
7135 AUTO_TRACE_ADD(
"scopeName='{}' className='{}' namespaceName='{}'",scopeName,className,namespaceName);
7140 if (!namespaceName.
empty())
7142 if (className.
empty())
7144 scopeName=namespaceName;
7146 else if (!relates.
empty() ||
7149 scopeName=namespaceName+
"::"+className;
7153 scopeName=className;
7156 else if (!className.
empty())
7158 scopeName=className;
7162 DString tempScopeName=scopeName;
7166 if (funcSpec.
empty())
7168 uint32_t argListIndex=0;
7173 tempScopeName=scopeName+funcSpec;
7181 if (!scopeName.
empty() && !isRelated && !isFriend && !
Config_getBool(HIDE_SCOPE_NAMES) && root->
lang!=SrcLangExt::Python)
7183 if (!funcType.
empty())
7187 funcDecl=funcType+
" "+tempScopeName+
"::"+funcName+funcTempList;
7191 funcDecl=funcType+
" "+tempScopeName+
"::"+funcName+funcArgs;
7198 funcDecl=tempScopeName+
"::"+funcName+funcTempList;
7202 funcDecl=tempScopeName+
"::"+funcName+funcArgs;
7208 if (!funcType.
empty())
7212 funcDecl=funcType+
" "+funcName+funcTempList;
7216 funcDecl=funcType+
" "+funcName+funcArgs;
7223 funcDecl=funcName+funcTempList;
7227 funcDecl=funcName+funcArgs;
7232 if (funcType==
"template class" && !funcTempList.
empty())
7235 AUTO_TRACE_ADD(
"Parse results: namespaceName='{}' className=`{}` funcType='{}' funcSpec='{}' "
7236 " funcName='{}' funcArgs='{}' funcTempList='{}' funcDecl='{}' relates='{}'"
7237 " exceptions='{}' isRelated={} isMemberOf={} isFriend={} isFunc={}",
7238 namespaceName, className, funcType, funcSpec,
7239 funcName, funcArgs, funcTempList, funcDecl, relates,
7240 exceptions, isRelated, isMemberOf, isFriend, isFunc);
7242 if (!funcName.
empty())
7246 bool strongEnum =
false;
7250 for (
const auto &imd : *mn)
7261 if (!namespaceName.
empty())
7263 namespaceName+=
"::"+className;
7267 namespaceName=className;
7275 funcName =
substitute(funcName,className+
"::",
"");
7278 if (!funcTempList.
empty())
7286 if (!isRelated && !strongEnum && mn)
7289 if (!className.
empty())
7291 if (funcSpec.
empty())
7294 funcArgs,funcTempList,exceptions,
7295 type,args,isFriend,spec,relates,funcDecl,overloaded,isFunc);
7307 else if (overloaded)
7309 addOverloaded(root,mn,funcType,funcName,funcArgs,funcDecl,exceptions,spec);
7313 if (!
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec))
7315 DString fullFuncDecl=funcDecl;
7318 "Cannot determine class for function\n{}",
7324 else if (isRelated && !relates.
empty())
7326 AUTO_TRACE_ADD(
"related function scopeName='{}' className='{}'",scopeName,className);
7327 if (className.
empty()) className=relates;
7331 bool newMember=
true;
7337 for (
const auto &imd : *mn)
7371 mn->
push_back(std::move(mdDefineTaken));
7385 for (
const auto &irmd : *mn)
7406 addMemberDocs(root,rmd_found,funcDecl,
nullptr,overloaded,spec);
7414 switch (root->
mtype)
7416 case MethodTypes::Method: mtype = MemberType::Function;
break;
7417 case MethodTypes::Signal: mtype = MemberType::Signal;
break;
7418 case MethodTypes::Slot: mtype = MemberType::Slot;
break;
7419 case MethodTypes::DCOP: mtype = MemberType::DCOP;
break;
7420 case MethodTypes::Property: mtype = MemberType::Property;
break;
7421 case MethodTypes::Event: mtype = MemberType::Event;
break;
7435 funcType,funcName,funcArgs,exceptions,
7438 isMemberOf ? Relationship::Foreign : Relationship::Related,
7458 mmd->setDefinitionTemplateParameterLists(root->
tArgLists);
7460 mmd->setTagInfo(root->
tagInfo());
7475 for (
const auto &irmd : *rmn)
7506 mmd->setBodyDef(fd);
7513 mmd->setMemberClass(cd);
7514 mmd->setMemberSpecifiers(spec);
7515 mmd->setVhdlSpecifiers(root->
vhdlSpec);
7516 mmd->setDefinition(funcDecl);
7521 mmd->setDocsForDefinition(!root->
proto);
7524 mmd->addSectionsToDefinition(root->
anchors);
7525 mmd->setMemberGroupId(root->
mGrpId);
7526 mmd->setLanguage(root->
lang);
7527 mmd->setId(root->
id);
7531 mmd->setRefItems(root->
sli);
7532 mmd->setRequirementReferences(root->
rqli);
7533 if (root->
relatesType==RelatesType::Duplicate) mmd->setRelatedAlso(cd);
7541 if (!
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec))
7543 DString fullFuncDecl=funcDecl;
7546 "Cannot determine file/namespace for relatedalso function\n{}",
7560 addLocalObjCMethod(root,scopeName,funcType,funcName,funcArgs,exceptions,funcDecl,spec);
7564 bool globMem =
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec);
7565 if (className.
empty() && !globMem)
7569 else if (!className.
empty() && !globMem)
7572 "member '{}' of class '{}' cannot be found",
7573 funcName,className);
7591 AUTO_TRACE(
"root->type='{}' root->inside='{}' root->name='{}' root->args='{}' section={} root->spec={} root->mGrpId={}",
7606 type=type.
left(i+l);
7617 if (root->
section.isMemberDoc())
7643 else if (root->
section.isOverloadDoc())
7657 (root->
section.isVariable() &&
7675 type+
" "+root->
name,
7679 else if (!type.
empty())
7708 else if (root->
section.isVariableDoc())
7720 else if (root->
section.isExportedInterface() ||
7721 root->
section.isIncludedService())
7727 type +
" " + root->
name,
7740 if (root->
section.isMemberDoc() ||
7741 root->
section.isOverloadDoc() ||
7744 root->
section.isVariableDoc() ||
7746 root->
section.isIncludedService() ||
7747 root->
section.isExportedInterface()
7757 for (
const auto &e : root->
children())
7759 if (!e->section.isEnum())
7771 for (
const auto &objCImpl : root->
children())
7773 if (objCImpl->section.isObjcImpl())
7775 for (
const auto &objCMethod : objCImpl->children())
7777 if (objCMethod->section.isFunction())
7781 objCMethod->relates,
7784 objCMethod->type+
" "+objCImpl->name+
"::"+objCMethod->name+
" "+objCMethod->args,
7786 objCMethod->section=EntryType::makeEmpty();
7805 bool isGlobal =
false;
7806 bool isRelated =
false;
7807 bool isMemberOf =
false;
7816 if (root->
lang==SrcLangExt::CSharp)
7839 isMemberOf=(root->
relatesType==RelatesType::MemberOf);
7847 if (cd && !name.
empty())
7874 isMemberOf ? Relationship::Foreign : isRelated ? Relationship::Related : Relationship::Member,
7875 MemberType::Enumeration,
7878 mmd->setTagInfo(root->
tagInfo());
7879 mmd->setLanguage(root->
lang);
7880 mmd->setId(root->
id);
7881 if (!isGlobal) mmd->setMemberClass(cd);
else mmd->setFileDef(fd);
7883 mmd->setBodyDef(root->
fileDef());
7884 mmd->setMemberSpecifiers(root->
spec);
7885 mmd->setVhdlSpecifiers(root->
vhdlSpec);
7886 mmd->setEnumBaseType(root->
args);
7889 mmd->addSectionsToDefinition(root->
anchors);
7890 mmd->setMemberGroupId(root->
mGrpId);
7894 mmd->setRefItems(root->
sli);
7895 mmd->setRequirementReferences(root->
rqli);
7901 if (!baseType.
empty())
7910 mmd->setDefinition(name+baseType);
7914 mmd->setDefinition(nd->
name()+
"::"+name+baseType);
7918 mmd->setNamespace(nd);
7925 if (isGlobal && (nd==
nullptr || !nd->
isAnonymous()))
7927 if (!defSet) mmd->setDefinition(name+baseType);
7928 if (fd==
nullptr && root->
parent())
7934 mmd->setFileDef(fd);
7942 mmd->setDefinition(name+baseType);
7946 mmd->setDefinition(cd->
name()+
"::"+name+baseType);
7952 mmd->setDocsForDefinition(!root->
proto);
7982 bool isGlobal =
false;
7983 bool isRelated =
false;
7992 if (root->
lang==SrcLangExt::CSharp)
8007 if (root->
lang==SrcLangExt::CSharp)
8026 if (cd && !name.
empty())
8053 struct EnumValueInfo
8055 EnumValueInfo(
const DString &n,std::unique_ptr<MemberDef> &&md) :
8056 name(n), member(std::move(md)) {}
8058 std::unique_ptr<MemberDef> member;
8060 std::vector< EnumValueInfo > extraMembers;
8062 for (
const auto &imd : *mn)
8069 for (
const auto &e : root->
children())
8072 bool isJavaLike = sle==SrcLangExt::CSharp || sle==SrcLangExt::Java || sle==SrcLangExt::XML;
8073 if ( isJavaLike || root->
spec.isStrong())
8075 if (sle == SrcLangExt::Cpp && e->section.isDefine())
continue;
8082 if (
size_t i = qualifiedName.
rfind(
"::"); i!=
DString::npos && sle==SrcLangExt::CSharp)
8088 qualifiedName=
substitute(qualifiedName,
"::",
".");
8092 DString fileName = e->fileName;
8093 if (fileName.
empty() && e->tagInfo())
8095 fileName = e->tagInfo()->tagName;
8099 fileName,e->startLine,e->startColumn,
8100 e->type,e->name,e->args,
DString(),
8101 e->protection, Specifier::Normal,e->isStatic,Relationship::Member,
8108 fmmd->setNamespace(mnd);
8112 fmmd->setTagInfo(e->tagInfo());
8113 fmmd->setLanguage(e->lang);
8114 fmmd->setBodySegment(e->startLine,e->bodyLine,e->endBodyLine);
8115 fmmd->setBodyDef(e->fileDef());
8117 fmmd->setDocumentation(e->doc,e->docFile,e->docLine);
8118 fmmd->setBriefDescription(e->brief,e->briefFile,e->briefLine);
8119 fmmd->addSectionsToDefinition(e->anchors);
8120 fmmd->setInitializer(e->initializer.str());
8121 fmmd->setMaxInitLines(e->initLines);
8122 fmmd->setMemberGroupId(e->mGrpId);
8123 fmmd->setExplicitExternal(e->explicitExternal,fileName,e->startLine,e->startColumn);
8124 fmmd->setRefItems(e->sli);
8125 fmmd->setRequirementReferences(e->rqli);
8128 fmmd->setEnumScope(md,
true);
8129 extraMembers.emplace_back(e->name,std::move(fmd));
8138 if (!e->name.empty() && (fmn=emnsd->
find(e->name)))
8141 for (
const auto &ifmd : *fmn)
8172 else if (isRelated && cd)
8204 for (
auto &e : extraMembers)
8250 if (gd==
nullptr && !root->
groups.empty())
8264 for (
const auto &g : root->
groups)
8283 "Found non-existing group '{}' for the command '{}', ignoring command",
8297 if (root->
section.isEnumDoc() &&
8322 AUTO_TRACE(
"Found docs for enum with name '{}' and scope '{}' in context '{}' cd='{}', nd='{}' fd='{}'",
8336 for (
const auto &imd : *mn)
8351 else if (cd==
nullptr && mcd==
nullptr && nd!=
nullptr && mnd==nd)
8358 else if (cd==
nullptr && nd==
nullptr && mcd==
nullptr && mnd==
nullptr && fd==mfd)
8383 for (
const auto &mn : mnsd)
8386 for (
const auto &imd : *mn)
8391 int documentedEnumValues=0;
8395 if (fmd->isLinkableInProject()) documentedEnumValues++;
8421 for (
const auto &md : *mn)
8423 index.addClassMemberNameToIndex(md.get());
8424 if (md->getModuleDef())
8426 index.addModuleMemberNameToIndex(md.get());
8434 for (
const auto &md : *mn)
8436 if (md->getNamespaceDef())
8438 index.addNamespaceMemberNameToIndex(md.get());
8442 index.addFileMemberNameToIndex(md.get());
8444 if (md->getModuleDef())
8446 index.addModuleMemberNameToIndex(md.get());
8451 index.sortMemberIndexLists();
8460 if (cd->isLinkableInProject())
8473 if (cd->isLinkableInProject())
8486 if (nd->isLinkableInProject())
8499 for (
const auto &fd : *fn)
8515 std::string s = title.str();
8516 static const reg::Ex re(R
"(\a[\w-]*)");
8519 for (; it!=
end ; ++it)
8521 const auto &match = *it;
8522 std::string matchStr = match.str();
8530 if (gd->isLinkableInProject())
8532 addWordsForTitle(gd.get(),gd->anchor(),gd->groupTitle());
8538 if (pd->isLinkableInProject())
8540 addWordsForTitle(pd.get(),pd->anchor(),pd->title());
8549 auto addMemberToSearchIndex = [](
const MemberDef *md)
8555 DString qn=md->qualifiedName();
8560 if (md->getClassDef())
8564 if (md->getNamespaceDef())
8575 if (md->getGroupDef()) scope = md->getGroupDef();
8576 else if (md->getClassDef()) scope = md->getClassDef();
8577 else if (md->getNamespaceDef()) scope = md->getNamespaceDef();
8578 else if (md->getFileDef()) scope = md->getFileDef();
8582 auto addMemberToIndices = [addMemberToSearchIndex,getScope](
const MemberDef *md)
8584 if (md->isLinkableInProject())
8586 if (!(md->isEnumerate() && md->isAnonymous()))
8589 addMemberToSearchIndex(md);
8591 if (md->isEnumerate())
8593 for (
const auto &fmd : md->enumFieldList())
8596 addMemberToSearchIndex(fmd);
8606 for (
const auto &md : *mn)
8608 addMemberToIndices(md.get());
8615 for (
const auto &md : *mn)
8617 addMemberToIndices(md.get());
8630 for (
const auto &imd : *mn)
8643 for (
const auto &imd : *mn)
8660 for (
const auto &imd : *mn)
8669 const auto &bmni = bmn.
find(mn->memberName());
8672 for (
const auto &ibmd : *bmni)
8680 lang==SrcLangExt::Python ||
8681 lang==SrcLangExt::Java ||
8682 lang==SrcLangExt::PHP ||
8693 lang==SrcLangExt::Python ||
8700 if (lang==SrcLangExt::Python && md->
name().
startsWith(
"__"))
continue;
8740 if (cd->isLinkable())
8742 for (
const auto &bcd : cd->baseClasses())
8758 for (
const auto &ti : cd->getTemplateInstances())
8783 AUTO_TRACE_ADD(
"merging members of category {} into {}",cd->name(),baseClass->
name());
8798 cd->subClasses().empty() &&
8799 !cd->baseClasses().empty())
8830 msg(
"Generating code for file {}...\n",fd->
docName());
8835 else if (parseSources)
8837 msg(
"Parsing code for file {}...\n",fd->
docName());
8853 for (
const auto &fd : *fn)
8861 for (
const auto &fd : *fn)
8870 clangParser->parse();
8871 processSourceFile(fd.get(),*
g_outputList,clangParser.get());
8873 for (
auto incFile : clangParser->filesInSameTU())
8875 if (filesToProcess.find(incFile)!=filesToProcess.end() &&
8877 processedFiles.
find(incFile)==processedFiles.end())
8884 processSourceFile(ifd,*
g_outputList,clangParser.get());
8885 processedFiles.insert(incFile);
8896 for (
const auto &fd : *fn)
8898 if (processedFiles.find(fd->
absFilePath().
str())==processedFiles.end())
8903 clangParser->parse();
8904 processSourceFile(fd.get(),*
g_outputList,clangParser.get());
8917 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8920 msg(
"Generating code files using {} threads.\n",numThreads);
8921 struct SourceContext
8924 : fd(fd_), generateSourceFile(gen_), ol(ol_) {}
8926 bool generateSourceFile;
8930 std::vector< std::future< std::shared_ptr<SourceContext> > > results;
8933 for (
const auto &fd : *fn)
8936 auto ctx = std::make_shared<SourceContext>(fd.get(),generateSourceFile,*
g_outputList);
8937 auto processFile = [ctx]()
8939 if (ctx->generateSourceFile)
8941 msg(
"Generating code for file {}...\n",ctx->fd->docName());
8945 msg(
"Parsing code for file {}...\n",ctx->fd->docName());
8948 ctx->fd->getAllIncludeFilesRecursively(filesInSameTu);
8949 if (ctx->generateSourceFile)
8951 ctx->fd->writeSourceHeader(ctx->ol);
8952 ctx->fd->writeSourceBody(ctx->ol,
nullptr);
8953 ctx->fd->writeSourceFooter(ctx->ol);
8958 ctx->fd->parseSource(
nullptr);
8962 results.emplace_back(threadPool.
queue(processFile));
8965 for (
auto &f : results)
8974 for (
const auto &fd : *fn)
8994 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
9000 : fd(fd_), ol(ol_) {}
9005 std::vector< std::future< std::shared_ptr<DocContext> > > results;
9008 for (
const auto &fd : *fn)
9010 bool doc = fd->isLinkableInProject();
9013 auto ctx = std::make_shared<DocContext>(fd.get(),*
g_outputList);
9014 auto processFile = [ctx]() {
9015 msg(
"Generating docs for file {}...\n",ctx->fd->docName());
9016 ctx->fd->writeDocumentation(ctx->ol);
9019 results.emplace_back(threadPool.
queue(processFile));
9023 for (
auto &f : results)
9032 for (
const auto &fd : *fn)
9034 bool doc = fd->isLinkableInProject();
9037 msg(
"Generating docs for file {}...\n",fd->docName());
9056 const_cast<FileDef*
>(fd)->addSourceRef(cd->getStartDefLine(),cd.get(),
nullptr);
9065 const_cast<FileDef*
>(fd)->addSourceRef(cd->getStartDefLine(),cd.get(),
nullptr);
9074 const_cast<FileDef*
>(fd)->addSourceRef(nd->getStartDefLine(),nd.get(),
nullptr);
9081 for (
const auto &md : *mn)
9090 md->isLinkableInProject() &&
9096 const_cast<FileDef*
>(fd)->addSourceRef(md->getStartDefLine(),md->getOuterScope(),md.get());
9102 for (
const auto &md : *mn)
9112 md->isLinkableInProject() &&
9118 const_cast<FileDef*
>(fd)->addSourceRef(md->getStartDefLine(),md->getOuterScope(),md.get());
9135 for (
const auto &def : it->second)
9138 def.fileName,def.lineNr,def.columnNr,
9139 "#define",def.name,def.args,
DString(),
9140 Protection::Public,Specifier::Normal,
false,Relationship::Member,MemberType::Define,
9144 if (!def.args.empty())
9148 mmd->setInitializer(def.definition);
9149 mmd->setFileDef(def.fileDef);
9150 mmd->setDefinition(
"#define "+def.name);
9155 const MemberList *defMl = def.fileDef->getMemberList(MemberListType::DocDefineMembers());
9164 def.fileDef->insertMember(md.get());
9166 AUTO_TRACE_ADD(
"adding macro {} with definition {}",def.name,def.definition);
9200 for (
const auto &fd : *fn)
9202 fd->sortMemberLists();
9209 gd->sortMemberLists();
9226 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
9230 std::vector < std::future< void > > results;
9234 for (
const auto &def : symList)
9237 if (dm && !
isSymbolHidden(def) && !def->isArtificial() && def->isLinkableInProject())
9239 auto processTooltip = [dm]() {
9242 results.emplace_back(threadPool.
queue(processTooltip));
9247 for (
auto &f : results)
9256 for (
const auto &def : symList)
9259 if (dm && !
isSymbolHidden(def) && !def->isArtificial() && def->isLinkableInProject())
9306 for (
const auto &fd : *fn)
9328 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
9334 : cd(cd_), ol(ol_) {}
9339 std::vector< std::future< std::shared_ptr<DocContext> > > results;
9340 for (
const auto &cd : classList)
9343 if (cd->getOuterScope()==
nullptr ||
9347 auto ctx = std::make_shared<DocContext>(cd,*
g_outputList);
9348 auto processFile = [ctx]()
9350 msg(
"Generating docs for compound {}...\n",ctx->cd->displayName());
9354 if (!ctx->cd->isHidden() && !ctx->cd->isEmbeddedInOuterScope() &&
9355 ctx->cd->isLinkableInProject() && !ctx->cd->isImplicitTemplateInstance())
9357 ctx->cd->writeDocumentation(ctx->ol);
9358 ctx->cd->writeMemberList(ctx->ol);
9362 ctx->cd->writeDocumentationForInnerClasses(ctx->ol);
9365 results.emplace_back(threadPool.
queue(processFile));
9368 for (
auto &f : results)
9375 for (
const auto &cd : classList)
9379 if (cd->getOuterScope()==
nullptr ||
9385 if ( !cd->isHidden() && !cd->isEmbeddedInOuterScope() &&
9386 cd->isLinkableInProject() && !cd->isImplicitTemplateInstance())
9388 msg(
"Generating docs for compound {}...\n",cd->displayName());
9403 for (
const auto &innerCdi : cd->
getClasses())
9408 AUTO_TRACE(
"innerCd={} isLinkable={} isImplicitTemplateInstance={} protectLevelVisible={} embeddedInOuterScope={}",
9417 list.push_back(innerCd);
9425 std::vector<ClassDefMutable*> classList;
9474 for (
const auto &imd : *mn)
9510 for (
const auto &fd : *fn)
9512 fd->combineUsingRelations();
9544 for (
const auto &fd : *fn)
9546 fd->addMembersToMemberGroup();
9561 gd->addMembersToMemberGroup();
9582 for (
const auto &fd : *fn)
9584 fd->distributeMemberGroupDocumentation();
9599 gd->distributeMemberGroupDocumentation();
9629 for (
const auto &fd : *fn)
9631 fd->findSectionsInDocumentation();
9646 gd->findSectionsInDocumentation();
9651 pd->findSectionsInDocumentation();
9656 dd->findSectionsInDocumentation();
9679 for (
const auto &ifmd : *fn)
9693 for (
const auto &imd : *nm)
9724 for (
const auto &imd : *nm)
9744 return fd->absFilePath() == root->
fileName;
9789 Protection::Public,Specifier::Normal,
false,Relationship::Member,MemberType::Define,
9792 mmd->setTagInfo(root->
tagInfo());
9793 mmd->setLanguage(root->
lang);
9805 for (
const auto &md : *mn)
9807 if (md->memberType()==MemberType::Define) count++;
9811 for (
const auto &imd : *mn)
9814 if (md && md->
memberType()==MemberType::Define)
9829 for (
const auto &imd : *mn)
9832 if (md && md->
memberType()==MemberType::Define)
9856 warn(root->
fileName,root->
startLine,
"found documented #define {} but ignoring it because ENABLE_PREPROCESSING is NO.", root->
name);
9870 normalizedName =
substitute(normalizedName,
"\\",
"/");
9873 if (root->
docFile==normalizedName)
9877 normalizedName=normalizedName.
left(lastSlashPos);
9880 if (normalizedName.
at(normalizedName.
length()-1)!=
'/')
9882 normalizedName+=
'/';
9884 DirDef *matchingDir=
nullptr;
9888 if (dir->name().right(normalizedName.
length())==normalizedName)
9893 "\\dir command matches multiple directories.\n"
9894 " Applying the command for directory {}\n"
9895 " Ignoring the command for directory {}",
9896 matchingDir->
name(),dir->name()
9901 matchingDir=dir.get();
9918 warn(root->
fileName,root->
startLine,
"No matching directory found for command \\dir {}",normalizedName);
9927 if (root->
section.isRequirementDoc())
9939 if (root->
section.isPageDoc())
9946 else if (root->
section.isMainpageDoc())
9966 if (root->
section.isMainpageDoc())
9999 else if (si->
lineNr() != -1)
10001 warn(root->
fileName,root->
startLine,
"multiple use of section label '{}' for main page, (first occurrence: {}, line {})",
10006 warn(root->
fileName,root->
startLine,
"multiple use of section label '{}' for main page, (first occurrence: {})",
10023 else if (root->
tagInfo()==
nullptr)
10026 "found more than one \\mainpage comment block! (first occurrence: {}, line {}), Skipping current block!",
10036 if (root->
section.isMainpageDoc())
10060 term(
"page defined {} with label {} is a direct "
10061 "subpage of itself! Please remove this cyclic dependency.\n",
10085 term(
"page defined {} with label {} is a subpage "
10086 "of itself! Please remove this cyclic dependency.\n",
10087 warn_line(pd->docFile(),pd->docLine()),pd->name());
10112 DString label=
"_"+rl->listName();
10113 if (si->label().left(label.
length())==label)
10115 si->setFileName(rl->listName());
10116 si->setGenerated(
true);
10122 if (!si->generated())
10126 if (!si->fileName().empty() &&
10133 if (si->definition())
10140 gd = (
toMemberDef(si->definition()))->getGroupDef();
10170 if (!pd->getGroupDef() && !pd->isReference())
10172 msg(
"Generating docs for page {}...\n",pd->name());
10187 warn(root->
fileName,root->
startLine,
"Example {} was already documented. Ignoring documentation found here.",root->
name);
10215 indentStr.
fill(
' ',indent);
10217 indentStr.
empty()?
"":indentStr,
10222 for (
const auto &e : root->
children())
10240 si->label(),si->fileName(),si->title(),si->type().level(),si->ref());
10254 msg(
"Generating docs for example {}...\n",pd->name());
10256 if (lang != SrcLangExt::Unknown)
10260 intf->resetCodeParserState();
10262 DString n=pd->getOutputFileBase();
10269 if (pd->showLineNo())
10271 lineNoOptStr=
"{lineno}";
10277 (pd->briefDescription().empty()?
"":pd->briefDescription()+
"\n\n")+
10278 pd->documentation()+
"\n\n\\include"+lineNoOptStr+
" "+pd->name(),
10280 .setIndexWords(
true)
10281 .setExample(pd->name()));
10294 if (!gd->isReference())
10306 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10312 : cdm(cdm_), ol(ol_) {}
10317 std::vector< std::future< std::shared_ptr<DocContext> > > results;
10319 for (
const auto &cd : classList)
10324 auto ctx = std::make_shared<DocContext>(cdm,*
g_outputList);
10325 auto processFile = [ctx]()
10327 if ( ( ctx->cdm->isLinkableInProject() &&
10328 !ctx->cdm->isImplicitTemplateInstance()
10331 && !ctx->cdm->isHidden() && !ctx->cdm->isEmbeddedInOuterScope()
10334 msg(
"Generating docs for compound {}...\n",ctx->cdm->displayName());
10335 ctx->cdm->writeDocumentation(ctx->ol);
10336 ctx->cdm->writeMemberList(ctx->ol);
10338 ctx->cdm->writeDocumentationForInnerClasses(ctx->ol);
10341 results.emplace_back(threadPool.
queue(processFile));
10345 for (
auto &f : results)
10347 auto ctx = f.get();
10353 for (
const auto &cd : classList)
10358 if ( ( cd->isLinkableInProject() &&
10359 !cd->isImplicitTemplateInstance()
10362 && !cd->isHidden() && !cd->isEmbeddedInOuterScope()
10365 msg(
"Generating docs for compound {}...\n",cd->displayName());
10379 for (
const auto &cd : conceptList)
10384 msg(
"Generating docs for concept {}...\n",cd->name());
10399 if (nd->isLinkableInProject())
10404 msg(
"Generating docs for namespace {}\n",nd->displayName());
10442 DString cmd=qhgLocation+
" -v 2>&1";
10447 err(
"could not execute {}\n",qhgLocation);
10451 const size_t bufSize = 1024;
10452 char inBuf[bufSize+1];
10453 size_t numRead=fread(inBuf,1,bufSize,f);
10454 inBuf[numRead] =
'\0';
10459 static const reg::Ex versionReg(R
"(Qt (\d+)\.(\d+)\.(\d+))");
10461 std::string s = inBuf;
10468 if (qtVersion>0 && (qtVersion<60000 || qtVersion >= 60205))
10477 err(
"could not execute {}\n",qhgLocation);
10481 std::string output;
10482 while ((numRead=fread(inBuf,1,bufSize,f))>0)
10484 inBuf[numRead] =
'\0';
10507 if (!dotPath.
empty())
10516 warn_uncond(
"the dot tool could not be found as '{}'\n",dotPath);
10522 dotPath = fi.
dirPath() +
"/" + dotPath;
10526 size_t l=dotPath.
length();
10527 for (
size_t i=0;i<l;i++)
if (dotPath.
at(i)==
'/') dotPath.
at(i)=
'\\';
10546 bool updateOnly=
false)
10550 bool writeToStdout=configFile==
"-";
10555 if (!writeToStdout)
10559 msg(
"\n\nConfiguration file '{}' created.\n\n",configFile);
10560 msg(
"Now edit the configuration file and enter\n\n");
10561 if (configFile!=
"Doxyfile" && configFile!=
"doxyfile")
10562 msg(
" doxygen {}\n\n",configFile);
10564 msg(
" doxygen\n\n");
10565 msg(
"to generate the documentation for your project\n\n");
10569 msg(
"\n\nConfiguration file '{}' updated.\n\n",configFile);
10575 term(
"Cannot open file {} for writing\n",configFile);
10590 term(
"Cannot open stdout for writing\n");
10605 if (fileName.
empty() || destName.
empty())
return;
10610 fileName = tagLine;
10616 err(
"Tag file '{}' does not exist or is not a file. Skipping it...\n",fileName);
10624 if (!destName.
empty())
10627 msg(
"Reading tag file '{}', location '{}'...\n",fileName,destName);
10631 msg(
"Reading tag file '{}'...\n",fileName);
10641 for (
const auto &sheet : latexExtraStyleSheet)
10643 std::string fileName = sheet;
10644 if (!fileName.empty())
10649 err(
"Style sheet '{}' specified by LATEX_EXTRA_STYLESHEET does not exist!\n",fileName);
10651 else if (fi.
isDir())
10653 err(
"Style sheet '{}' specified by LATEX_EXTRA_STYLESHEET is a directory, it has to be a file!\n", fileName);
10672 if (!htmlStyleSheet.
empty())
10679 err(
"Style sheet '{}' specified by HTML_STYLESHEET does not exist!\n",htmlStyleSheet);
10682 else if (fi.
isDir())
10684 err(
"Style sheet '{}' specified by HTML_STYLESHEET is a directory, it has to be a file!\n",htmlStyleSheet);
10690 copyFile(htmlStyleSheet,destFileName);
10695 for (
const auto &sheet : htmlExtraStyleSheet)
10703 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET does not exist!\n",fileName);
10707 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET is already a built-in stylesheet. Please use a different name\n",fi.
fileName());
10709 else if (fi.
isDir())
10711 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET is a directory, it has to be a file!\n",fileName);
10725 if (!projectLogo.
empty())
10730 err(
"Project logo '{}' specified by PROJECT_LOGO does not exist!\n",projectLogo);
10733 else if (fi.
isDir())
10735 err(
"Project logo '{}' specified by PROJECT_LOGO is a directory, it has to be a file!\n",projectLogo);
10741 copyFile(projectLogo,destFileName);
10750 if (!projectIcon.
empty())
10755 err(
"Project icon '{}' specified by PROJECT_ICON does not exist!\n",projectIcon);
10758 else if (fi.
isDir())
10760 err(
"Project icon '{}' specified by PROJECT_ICON is a directory, it has to be a file!\n",projectIcon);
10766 copyFile(projectIcon,destFileName);
10774 for (
const auto &fileName : files)
10776 if (!fileName.empty())
10781 err(
"Extra file '{}' specified in {} does not exist!\n", fileName,filesOption);
10783 else if (fi.
isDir())
10785 err(
"Extra file '{}' specified in {} is a directory, it has to be a file!\n", fileName,filesOption);
10805 FileEntry(
const DString &p,
FileDef *fd) : path(p), fileDef(fd) {}
10811 std::vector<FileEntry> fileEntries;
10812 for (
const auto &fd : *fn)
10814 if (!fd->isReference())
10816 fileEntries.emplace_back(fd->getPath(),fd.get());
10820 size_t size = fileEntries.size();
10824 FileDef *fd = fileEntries[0].fileDef;
10830 std::stable_sort(fileEntries.begin(),
10832 [](
const FileEntry &fe1,
const FileEntry &fe2)
10833 { return dstricmp_sort(fe1.path,fe2.path)<0; }
10838 const FileEntry &first = fileEntries[0];
10839 const FileEntry &last = fileEntries[size-1];
10840 int first_path_size =
static_cast<int>(first.path.size())-1;
10841 int last_path_size =
static_cast<int>(last.path.size())-1;
10844 for (i=0;i<first_path_size && i<last_path_size;i++)
10846 if (first.path[i]==
'/') j=i;
10847 if (first.path[i]!=last.path[i])
break;
10849 if (i==first_path_size && i<last_path_size && last.path[i]==
'/')
10854 else if (i==last_path_size && i<first_path_size && first.path[i]==
'/')
10861 for (
auto &fileEntry : fileEntries)
10863 DString prefix = fileEntry.path.right(fileEntry.path.length()-j-1);
10864 fileEntry.fileDef->setName(
prefix+fn->fileName());
10866 fileEntry.fileDef->setDiskName(
prefix+fn->fileName());
10880 size_t sep = fileName.
rfind(
'/');
10881 size_t ei = fileName.
rfind(
'.');
10884 extension=fileName.
mid(ei);
10888 extension =
".no_extension";
10903 extension=fileName.
mid(ei);
10907 extension =
".no_extension";
10911 std::string preBuf;
10918 for (
const auto &s : includePath)
10924 msg(
"Preprocessing {}...\n",fn);
10931 msg(
"Reading {}...\n",fn);
10936 std::string convBuf;
10937 convBuf.reserve(preBuf.size()+1024);
10942 std::shared_ptr<Entry> fileRoot = std::make_shared<Entry>();
10946 if (newTU) clangParser->
parse();
10949 parser.
parseInput(fileName,convBuf.
data(),fileRoot,clangParser);
10950 fileRoot->setFileDef(fd);
10967 filesToProcess.insert(s);
10970 std::mutex processedFilesLock;
10972 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10973 msg(
"Processing input using {} threads.\n",numThreads);
10975 using FutureType = std::vector< std::shared_ptr<Entry> >;
10976 std::vector< std::future< FutureType > > results;
10979 bool ambig =
false;
10986 auto processFile = [qs,&filesToProcess,&processedFilesLock,&processedFiles]() {
10987 bool ambig_l =
false;
10988 std::vector< std::shared_ptr<Entry> > roots;
10992 auto fileRoot {
parseFile(*parser.get(),fd_l,qs,clangParser.get(),
true) };
10993 roots.push_back(fileRoot);
10997 for (
auto incFile : clangParser->filesInSameTU())
11000 if (filesToProcess.find(incFile)!=filesToProcess.end())
11002 bool needsToBeProcessed =
false;
11004 std::lock_guard<std::mutex> lock(processedFilesLock);
11005 needsToBeProcessed = processedFiles.find(incFile)==processedFiles.end();
11006 if (needsToBeProcessed) processedFiles.insert(incFile);
11008 if (qincFile!=qs && needsToBeProcessed)
11014 fileRoot =
parseFile(*parser.get(),ifd,qincFile,clangParser.get(),
false);
11015 roots.push_back(fileRoot);
11023 results.emplace_back(threadPool.
queue(processFile));
11027 for (
auto &f : results)
11032 root->moveToSubEntryAndKeep(e);
11039 if (processedFiles.find(s)==processedFiles.end())
11042 auto processFile = [s]() {
11043 bool ambig =
false;
11045 std::vector< std::shared_ptr<Entry> > roots;
11052 auto fileRoot =
parseFile(*parser.get(),fd,qs,clangParser.get(),
true);
11053 roots.push_back(fileRoot);
11057 auto fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
11058 roots.push_back(fileRoot);
11062 results.emplace_back(threadPool.
queue(processFile));
11066 for (
auto &f : results)
11071 root->moveToSubEntryAndKeep(e);
11078 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
11079 msg(
"Processing input using {} threads.\n",numThreads);
11081 using FutureType = std::shared_ptr<Entry>;
11082 std::vector< std::future< FutureType > > results;
11086 auto processFile = [s]() {
11087 bool ambig =
false;
11091 auto fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
11095 results.emplace_back(threadPool.
queue(processFile));
11098 for (
auto &f : results)
11100 root->moveToSubEntryAndKeep(f.get());
11118 filesToProcess.insert(s);
11124 bool ambig =
false;
11132 auto fileRoot =
parseFile(*parser.get(),fd,qs,clangParser.get(),
true);
11133 root->moveToSubEntryAndKeep(fileRoot);
11134 processedFiles.insert(s);
11138 for (
auto incFile : clangParser->filesInSameTU())
11141 if (filesToProcess.find(incFile)!=filesToProcess.end() &&
11142 processedFiles.find(incFile)==processedFiles.end())
11148 fileRoot =
parseFile(*parser.get(),ifd,incFile,clangParser.get(),
false);
11149 root->moveToSubEntryAndKeep(fileRoot);
11150 processedFiles.insert(incFile);
11159 if (processedFiles.find(s)==processedFiles.end())
11161 bool ambig =
false;
11168 auto fileRoot =
parseFile(*parser.get(),fd,qs,clangParser.get(),
true);
11169 root->moveToSubEntryAndKeep(fileRoot);
11174 std::shared_ptr<Entry> fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
11175 root->moveToSubEntryAndKeep(fileRoot);
11177 processedFiles.insert(s);
11186 bool ambig =
false;
11191 std::shared_ptr<Entry> fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
11192 root->moveToSubEntryAndKeep(std::move(fileRoot));
11212 sepPos = result.
find(
'/',2);
11214 sepPos = result.
find(
'/',sepPos+1);
11216 sepPos = result.
find(
'/',sepPos+1);
11219 if (nonSymlinks.find(
prefix.str())==nonSymlinks.end())
11236 target+=result.
mid(sepPos);
11239 if (known.find(result.
str())!=known.end())
return std::string();
11240 known.insert(result.
str());
11253 nonSymlinks.insert(
prefix.str());
11278 bool errorIfNotExist,
11285 if (paths && !dirName.empty())
11287 paths->insert(dirName);
11293 if (dirName.empty())
11308 msg(
"Searching for files in directory {}\n", fi->
absFilePath());
11319 for (
const auto &dirEntry : dir.
iterator())
11321 entries.push_back(dirEntry.path());
11323 std::sort(entries.begin(),entries.end());
11325 for (
const auto &entryPath : entries)
11328 auto checkPatterns = [&]() ->
bool
11330 return (patList==
nullptr || cfi.
match(*patList,caseSenseNames)) &&
11331 (exclPatList==
nullptr || !cfi.
match(*exclPatList,caseSenseNames)) &&
11332 (killSet==
nullptr || killSet->find(cfi.
absFilePath())==killSet->end());
11335 if (exclSet==
nullptr || exclSet->find(cfi.
absFilePath())==exclSet->end())
11343 if (errorIfNotExist && checkPatterns())
11348 else if (cfi.
isFile() && checkPatterns())
11351 std::string path=cfi.
dirPath()+
"/";
11352 std::string fullName=path+name;
11359 fn = fnMap->
add(name);
11360 fn->push_back(std::move(fd));
11363 dirResultList.push_back(fullName);
11364 if (resultSet) resultSet->insert(fullName);
11365 if (killSet) killSet->insert(fullName);
11367 else if (recursive &&
11369 (exclPatList==
nullptr || !cfi.
match(*exclPatList,caseSenseNames)) &&
11374 patList,exclPatList,&dirResultList,resultSet,errorIfNotExist,
11375 recursive,killSet,paths);
11379 if (resultList && !dirResultList.empty())
11382 std::stable_sort(dirResultList.begin(),
11383 dirResultList.end(),
11384 [](
const auto &f1,
const auto &f2) { return dstricmp_sort(f1.c_str(),f2.c_str())<0; });
11387 resultList->insert(resultList->end(), dirResultList.begin(), dirResultList.end());
11404 bool errorIfNotExist,
11411 if (s.
empty())
return;
11418 if (exclSet==
nullptr || exclSet->find(fi.
absFilePath())==exclSet->end())
11425 if (errorIfNotExist)
11427 warn_uncond(
"source '{}' is not a readable file or directory... skipping.\n",s);
11432 std::string dirPath = fi.
dirPath(
true);
11434 if (paths && !dirPath.empty())
11436 paths->insert(dirPath);
11439 if (killSet==
nullptr || killSet->find(filePath)==killSet->end())
11448 fn->push_back(std::move(fd));
11451 if (resultList || resultSet)
11453 if (resultList) resultList->push_back(filePath);
11454 if (resultSet) resultSet->insert(filePath);
11460 else if (fi.
isDir())
11462 readDir(&fi,fnMap,exclSet,patList,
11463 exclPatList,resultList,resultSet,errorIfNotExist,
11464 recursive,killSet,paths);
11478 anchor=
":"+md->
anchor();
11487 t <<
"REPLACE INTO symbols (symbol_id,scope_id,name,file,line) VALUES('"
11488 << fn+anchor <<
"','"
11490 << d->
name() <<
"','"
11504 for (
const auto &def : symList)
11516 msg(
"Developer parameters:\n");
11517 msg(
" -m dump symbol map\n");
11518 msg(
" -b making messages output unbuffered\n");
11519 msg(
" -c <file> process input file as a comment block and produce HTML output\n");
11521 msg(
" -t [<file|stdout|stderr>] trace debug info to file, stdout, or stderr (default file stdout)\n");
11522 msg(
" -t_time [<file|stdout|stderr>] trace debug info to file, stdout, or stderr (default file stdout),\n"
11523 " and include time and thread information\n");
11525 msg(
" -d <level> enable a debug level, such as (multiple invocations of -d are possible):\n");
11536 DString versionString = getFullVersion();
11537 msg(
"{}\n",versionString);
11541 if (!extVers.
empty()) extVers+=
", ";
11542 extVers +=
"sqlite3 ";
11543 extVers += sqlite3_libversion();
11545 if (!extVers.
empty()) extVers+=
", ";
11546 extVers +=
"clang support ";
11547 extVers += CLANG_VERSION_STRING;
11549 if (!extVers.
empty())
11553 extVers = extVers.
replace(lastComma,1,
" and");
11555 msg(
" with {}.\n",extVers);
11566 msg(
"Doxygen version {0}\nCopyright Dimitri van Heesch 1997-2025\n\n"
11567 "You can use Doxygen in a number of ways:\n\n"
11568 "1) Use Doxygen to generate a template configuration file*:\n"
11569 " {1} [-s] -g [configName]\n\n"
11570 "2) Use Doxygen to update an old configuration file*:\n"
11571 " {1} [-s] -u [configName]\n\n"
11572 "3) Use Doxygen to generate documentation using an existing "
11573 "configuration file*:\n"
11574 " {1} [configName]\n\n"
11575 "4) Use Doxygen to generate a template file controlling the layout of the\n"
11576 " generated documentation:\n"
11577 " {1} -l [layoutFileName]\n\n"
11578 " In case layoutFileName is omitted DoxygenLayout.xml will be used as filename.\n"
11579 " If - is used for layoutFileName Doxygen will write to standard output.\n\n"
11580 "5) Use Doxygen to generate a template style sheet file for RTF, HTML or Latex.\n"
11581 " RTF: {1} -w rtf styleSheetFile\n"
11582 " HTML: {1} -w html headerFile footerFile styleSheetFile [configFile]\n"
11583 " LaTeX: {1} -w latex headerFile footerFile styleSheetFile [configFile]\n\n"
11584 "6) Use Doxygen to generate a rtf extensions file\n"
11585 " {1} -e rtf extensionsFile\n\n"
11586 " If - is used for extensionsFile Doxygen will write to standard output.\n\n"
11587 "7) Use Doxygen to compare the used configuration file with the template configuration file\n"
11588 " {1} -x [configFile]\n\n"
11589 " Use Doxygen to compare the used configuration file with the template configuration file\n"
11590 " without replacing the environment variables or CMake type replacement variables\n"
11591 " {1} -x_noenv [configFile]\n\n"
11592 "8) Use Doxygen to show a list of built-in emojis.\n"
11593 " {1} -f emoji outputFileName\n\n"
11594 " If - is used for outputFileName Doxygen will write to standard output.\n\n"
11595 "*) If -s is specified the comments of the configuration items in the config file will be omitted.\n"
11596 " If configName is omitted 'Doxyfile' will be used as a default.\n"
11597 " If - is used for configFile Doxygen will write / read the configuration to /from standard output / input.\n\n"
11598 "If -q is used for a Doxygen documentation run, Doxygen will see this as if QUIET=YES has been set.\n\n"
11599 "-v print version string, -V print extended version information\n"
11600 "-h,-? prints usage help information\n"
11601 "{1} -d prints additional usage flags for debugging purposes\n",versionString,name);
11608static const char *
getArg(
int argc,
char **argv,
int &optInd)
11611 if (
dstrlen(&argv[optInd][2])>0)
11612 s=&argv[optInd][2];
11613 else if (optInd+1<argc && argv[optInd+1][0]!=
'-')
11632 return []() {
return std::make_unique<T>(); };
11640 std::setlocale(LC_ALL,
"");
11641 std::setlocale(LC_CTYPE,
"C");
11642 std::setlocale(LC_NUMERIC,
"C");
11740 DString versionString = getFullVersion();
11743 auto writeFile = [](
const char *fileName,std::function<void(
TextStream&)> func) ->
bool
11763 bool genConfig=
false;
11764 bool shortList=
false;
11765 bool traceTiming=
false;
11767 bool updateConfig=
false;
11768 bool quiet =
false;
11769 while (optInd<argc && argv[optInd][0]==
'-' &&
11770 (isalpha(argv[optInd][1]) || argv[optInd][1]==
'?' ||
11771 argv[optInd][1]==
'-')
11774 switch(argv[optInd][1])
11784 if (optInd+1>=argc)
11786 layoutName=
"DoxygenLayout.xml";
11790 layoutName=argv[optInd+1];
11798 if (optInd+1>=argc)
11800 msg(
"option \"-c\" is missing the file name to read\n");
11816 if (debugLabel.
empty())
11825 msg(
"option \"-d\" has unknown debug specifier: \"{}\".\n",debugLabel);
11835 if (!strcmp(argv[optInd]+1,
"t_time"))
11837 traceTiming =
true;
11839 else if (!strcmp(argv[optInd]+1,
"t"))
11841 traceTiming =
false;
11845 err(
"option should be \"-t\" or \"-t_time\", found: \"{}\".\n",argv[optInd]);
11849 if (optInd+1>=argc || argv[optInd+1][0] ==
'-')
11851 traceName=
"stdout";
11855 traceName=argv[optInd+1];
11859 err(
"support for option \"-t\" has not been compiled in (use a debug build or a release build with tracing enabled).\n");
11870 err(
"option should be \"-x\" or \"-x_noenv\", found: \"{}\".\n",argv[optInd]);
11884 if (formatName.
empty())
11886 err(
"option \"-e\" is missing format specifier rtf.\n");
11892 if (optInd+1>=argc)
11894 err(
"option \"-e rtf\" is missing an extensions file name\n");
11902 err(
"option \"-e\" has invalid format specifier.\n");
11910 if (listName.
empty())
11912 err(
"option \"-f\" is missing list specifier.\n");
11918 if (optInd+1>=argc)
11920 err(
"option \"-f emoji\" is missing an output file name\n");
11928 err(
"option \"-f\" has invalid list specifier.\n");
11936 if (formatName.
empty())
11938 err(
"option \"-w\" is missing format specifier rtf, html or latex\n");
11944 if (optInd+1>=argc)
11946 err(
"option \"-w rtf\" is missing a style sheet file name\n");
11952 err(
"error opening RTF style sheet file {}!\n",argv[optInd+1]);
11962 if (optInd+4<argc ||
FileInfo(
"Doxyfile").exists() ||
FileInfo(
"doxyfile").exists())
11968 err(
"error opening or reading configuration file {}!\n",argv[optInd+4]);
11973 if (optInd+3>=argc)
11975 err(
"option \"-w html\" does not have enough arguments\n");
11992 if (optInd+4<argc ||
FileInfo(
"Doxyfile").exists() ||
FileInfo(
"doxyfile").exists())
11997 err(
"error opening or reading configuration file {}!\n",argv[optInd+4]);
12002 if (optInd+3>=argc)
12004 err(
"option \"-w latex\" does not have enough arguments\n");
12020 err(
"Illegal format specifier \"{}\": should be one of rtf, html or latex\n",formatName);
12040 if (
dstrcmp(&argv[optInd][2],
"help")==0)
12042 usage(argv[0],versionString);
12045 else if (
dstrcmp(&argv[optInd][2],
"version")==0)
12051 else if ((
dstrcmp(&argv[optInd][2],
"Version")==0) ||
12052 (
dstrcmp(&argv[optInd][2],
"VERSION")==0))
12060 err(
"Unknown option \"-{}\"\n",&argv[optInd][1]);
12061 usage(argv[0],versionString);
12066 setvbuf(stdout,
nullptr,_IONBF,0);
12073 usage(argv[0],versionString);
12077 err(
"Unknown option \"-{:c}\"\n",argv[optInd][1]);
12078 usage(argv[0],versionString);
12089 TRACE(
"Doxygen version used: {}",getFullVersion());
12092 FileInfo configFileInfo1(
"Doxyfile"),configFileInfo2(
"doxyfile");
12095 if (configFileInfo1.exists())
12097 configName=
"Doxyfile";
12099 else if (configFileInfo2.
exists())
12101 configName=
"doxyfile";
12103 else if (genConfig)
12105 configName=
"Doxyfile";
12109 err(
"Doxyfile not found and no input file specified!\n");
12110 usage(argv[0],versionString);
12117 if (fi.
exists() ||
dstrcmp(argv[optInd],
"-")==0 || genConfig)
12119 configName=argv[optInd];
12123 err(
"configuration file {} not found!\n",argv[optInd]);
12124 usage(argv[0],versionString);
12138 err(
"could not open or read configuration file {}!\n",configName);
12210 for (
const auto &mapping : extMaps)
12228 err(
"Failed to map file extension '{}' to unsupported language '{}'.\n"
12229 "Check the EXTENSION_MAPPING setting in the config file.\n",
12234 msg(
"Adding custom extension mapping: '{}' will be treated as language '{}'\n",
12243 if (cd==
reinterpret_cast<void *
>(-1))
12245 term(
"unsupported character conversion: '{}'->'UTF-8': {}\n"
12246 "Check the 'INPUT_ENCODING' setting in the config file!\n",
12256 for (
const auto &mapping : fileEncod)
12272 if (cd==
reinterpret_cast<void *
>(-1))
12274 term(
"unsupported character conversion: '{}'->'UTF-8': {}\n"
12275 "Check the 'INPUT_FILE_ENCODING' setting in the config file!\n",
12276 encoding,strerror(errno));
12289 for (
const auto &s : expandAsDefinedList)
12307 signal(SIGINT,SIG_DFL);
12309 msg(
"Cleaning up...\n");
12324 if (generateTagFile.
empty())
return;
12329 err(
"cannot open tag file {} for writing\n", generateTagFile);
12333 tagFile <<
"<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>\n";
12334 tagFile <<
"<tagfile doxygen_version=\"" << getDoxygenVersion() <<
"\"";
12335 std::string gitVersion = getGitVersion();
12336 if (!gitVersion.empty())
12338 tagFile <<
" doxygen_gitid=\"" << gitVersion <<
"\"";
12345 for (
const auto &fd : *fn)
12347 if (fd->isLinkableInProject()) fd->writeTagFile(tagFile);
12380 if (gd->isLinkableInProject()) gd->writeTagFile(tagFile);
12385 if (mod->isLinkableInProject()) mod->writeTagFile(tagFile);
12390 if (pd->isLinkableInProject()) pd->writeTagFile(tagFile);
12397 if (dd->isLinkableInProject()) dd->writeTagFile(tagFile);
12401 tagFile <<
"</tagfile>\n";
12409 msg(
"Exiting...\n");
12418 const DString &formatDirName,
12419 const char *defaultDirName)
12421 DString result = formatDirName;
12422 if (result.
empty())
12424 result = baseDirName + defaultDirName;
12426 else if (formatDirName[0]!=
'/' && (formatDirName.
length()==1 || formatDirName[1]!=
':'))
12428 result.
prepend(baseDirName+
"/");
12430 Dir formatDir(result.
str());
12433 term(
"Could not create output directory {}\n", result);
12447 g_s.
begin(
"Searching for include files...\n");
12450 for (
const auto &s : includePathList)
12468 g_s.
begin(
"Searching for example files...\n");
12471 for (
const auto &s : examplePathList)
12487 g_s.
begin(
"Searching for images...\n");
12490 for (
const auto &s : imagePathList)
12505 g_s.
begin(
"Searching for dot files...\n");
12508 for (
const auto &s : dotFileList)
12523 g_s.
begin(
"Searching for msc files...\n");
12526 for (
const auto &s : mscFileList)
12541 g_s.
begin(
"Searching for dia files...\n");
12544 for (
const auto &s : diaFileList)
12559 g_s.
begin(
"Searching for plantuml files...\n");
12562 for (
const auto &s : plantUmlFileList)
12577 g_s.
begin(
"Searching for mermaid files...\n");
12580 for (
const auto &s : mermaidFileList)
12595 g_s.
begin(
"Searching for files to exclude\n");
12597 for (
const auto &s : excludeList)
12616 g_s.
begin(
"Searching INPUT for files to process...\n");
12620 for (
const auto &s : inputList)
12623 size_t l = path.
length();
12627 if (path.
at(l-1)==
'\\' || path.
at(l-1)==
'/') path=path.
left(l-1);
12648 if (fileName->size()>1)
12650 std::stable_sort(fileName->begin(),fileName->end(),[](
const auto &f1,
const auto &f2)
12652 return dstricmp_sort(f1->absFilePath(),f2->absFilePath())<0;
12658 [](
const auto &f1,
const auto &f2)
12660 return dstricmp_sort(f1->front()->absFilePath(),f2->front()->absFilePath())<0;
12664 warn_uncond(
"No files to be processed, please check your settings, in particular INPUT, FILE_PATTERNS, and RECURSIVE\n");
12675 if (mdfileAsMainPage.
empty())
return;
12679 warn_uncond(
"Specified markdown mainpage '{}' does not exist\n",mdfileAsMainPage);
12682 bool ambig =
false;
12685 warn_uncond(
"Specified markdown mainpage '{}' has not been defined as input file\n",mdfileAsMainPage);
12704 DString versionString = getFullVersion();
12705 msg(
"Doxygen version used: {}\n",versionString);
12715 if (outputDirectory.
empty())
12721 Dir dir(outputDirectory.
str());
12725 if (!dir.
mkdir(outputDirectory.
str()))
12727 term(
"tag OUTPUT_DIRECTORY: Output directory '{}' does not "
12728 "exist and cannot be created\n",outputDirectory);
12732 msg(
"Notice: Output directory '{}' does not exist. "
12733 "I have created it for you.\n", outputDirectory);
12781 bool generateSitemap = !sitemapUrl.
empty();
12782 if (generateSitemap && !sitemapUrl.
endsWith(
"/"))
12789 bool generateEclipseHelp =
Config_getBool(GENERATE_ECLIPSEHELP);
12803 if (generateDocbook)
12843 if (curFontPath.
empty())
12847 if (!curFontPath.
empty())
12850 newFontPath+=curFontPath;
12866 bool defaultLayoutUsed =
false;
12867 if (layoutFileName.
empty())
12870 defaultLayoutUsed =
true;
12872 AUTO_TRACE_ADD(
"defaultLayoutUsed={}, layoutFileName={}",defaultLayoutUsed,layoutFileName);
12877 msg(
"Parsing layout file {}...\n",layoutFileName);
12880 else if (!defaultLayoutUsed)
12882 warn_uncond(
"failed to open layout file '{}' for reading! Using default settings.\n",layoutFileName);
12892 if (generateHtml) exclPatterns.push_back(htmlOutput.
str());
12893 if (generateDocbook) exclPatterns.push_back(docbookOutput.
str());
12894 if (generateXml) exclPatterns.push_back(xmlOutput.
str());
12895 if (generateLatex) exclPatterns.push_back(latexOutput.
str());
12896 if (generateRtf) exclPatterns.push_back(rtfOutput.
str());
12897 if (generateMan) exclPatterns.push_back(manOutput.
str());
12917 if (generateDocbook)
12928 std::shared_ptr<Entry> root = std::make_shared<Entry>();
12932 msg(
"Reading and parsing tag files\n");
12934 for (
const auto &s : tagFileList)
12986 g_s.
begin(
"Building macro definition list...\n");
12990 g_s.
begin(
"Building group list...\n");
12995 g_s.
begin(
"Building directory list...\n");
13000 g_s.
begin(
"Building namespace list...\n");
13005 g_s.
begin(
"Building file list...\n");
13009 g_s.
begin(
"Building class list...\n");
13013 g_s.
begin(
"Building concept list...\n");
13021 g_s.
begin(
"Computing nesting relations for classes...\n");
13034 g_s.
begin(
"Associating documentation with classes...\n");
13038 g_s.
begin(
"Associating documentation with concepts...\n");
13043 g_s.
begin(
"Associating documentation with modules...\n");
13047 g_s.
begin(
"Building example list...\n");
13051 g_s.
begin(
"Searching for enumerations...\n");
13059 g_s.
begin(
"Searching for documented typedefs...\n");
13065 g_s.
begin(
"Searching for documented sequences...\n");
13069 g_s.
begin(
"Searching for documented dictionaries...\n");
13074 g_s.
begin(
"Searching for members imported via using declarations...\n");
13081 g_s.
begin(
"Searching for included using directives...\n");
13085 g_s.
begin(
"Searching for documented variables...\n");
13089 g_s.
begin(
"Building interface member list...\n");
13092 g_s.
begin(
"Building member list...\n");
13096 g_s.
begin(
"Searching for friends...\n");
13100 g_s.
begin(
"Searching for documented defines...\n");
13104 g_s.
begin(
"Computing class inheritance relations...\n");
13109 g_s.
begin(
"Computing class usage relations...\n");
13113 g_s.
begin(
"Flushing cached template relations that have become invalid...\n");
13117 g_s.
begin(
"Warn for undocumented namespaces...\n");
13121 g_s.
begin(
"Computing class relations...\n");
13132 g_s.
begin(
"Add enum values to enums...\n");
13137 g_s.
begin(
"Searching for member function documentation...\n");
13149 g_s.
begin(
"Creating members for template instances...\n");
13153 g_s.
begin(
"Searching for tag less structs...\n");
13157 g_s.
begin(
"Building page list...\n");
13161 g_s.
begin(
"Building requirements list...\n");
13165 g_s.
begin(
"Search for main page...\n");
13170 g_s.
begin(
"Computing page relations...\n");
13175 g_s.
begin(
"Determining the scope of groups...\n");
13179 g_s.
begin(
"Computing module relations...\n");
13181 mm.resolvePartitions();
13182 mm.resolveImports();
13183 mm.collectExportedSymbols();
13202 return i==0 ?
dstricmp_sort(c1->name(), c2->name())<0 : i<0;
13237 g_s.
begin(
"Determining which enums are documented\n");
13241 g_s.
begin(
"Computing member relations...\n");
13246 g_s.
begin(
"Building full member lists recursively...\n");
13250 g_s.
begin(
"Adding members to member groups.\n");
13256 g_s.
begin(
"Distributing member group documentation.\n");
13261 g_s.
begin(
"Computing member references...\n");
13267 g_s.
begin(
"Inheriting documentation...\n");
13275 g_s.
begin(
"Generating disk names...\n");
13279 g_s.
begin(
"Adding source references...\n");
13283 g_s.
begin(
"Adding xrefitems...\n");
13288 g_s.
begin(
"Adding requirements...\n");
13293 g_s.
begin(
"Sorting member lists...\n");
13297 g_s.
begin(
"Setting anonymous enum type...\n");
13301 g_s.
begin(
"Computing dependencies between directories...\n");
13305 g_s.
begin(
"Generating citations page...\n");
13309 g_s.
begin(
"Counting data structures...\n");
13313 g_s.
begin(
"Resolving user defined references...\n");
13317 g_s.
begin(
"Finding anchors and sections in the documentation...\n");
13321 g_s.
begin(
"Transferring function references...\n");
13325 g_s.
begin(
"Combining using relations...\n");
13330 g_s.
begin(
"Adding members to index pages...\n");
13335 g_s.
begin(
"Correcting members for VHDL...\n");
13339 g_s.
begin(
"Computing tooltip texts...\n");
13347 [](
const auto &g1,
const auto &g2)
13348 {
return g1->groupTitle() < g2->groupTitle(); });
13352 gd->sortSubGroups();
13396 if (generateDocbook)
13416 err(
"USE_HTAGS is YES but htags(1) failed. \n");
13418 err(
"htags(1) ended normally but failed to load the filemap. \n");
13425 g_s.
begin(
"Generating style sheet...\n");
13433 g_s.
begin(
"Generating search indices...\n");
13434 if (searchEngine && !serverBasedSearch && generateHtml)
13442 if (generateHtml && searchEngine)
13445 Dir searchDir(searchDirName.
str());
13446 if (!searchDir.
exists() && !searchDir.
mkdir(searchDirName.
str()))
13448 term(
"Could not create search results directory '{}' $PWD='{}'\n",
13452 if (!serverBasedSearch)
13474 if (generateDocbook)
13490 g_s.
begin(
"Generating images for formulas in HTML...\n");
13497 g_s.
begin(
"Generating images for formulas in RTF...\n");
13504 g_s.
begin(
"Generating images for formulas in Docbook...\n");
13509 g_s.
begin(
"Generating example documentation...\n");
13513 g_s.
begin(
"Generating file sources...\n");
13517 g_s.
begin(
"Counting members...\n");
13523 g_s.
begin(
"Generating file documentation...\n");
13527 g_s.
begin(
"Generating page documentation...\n");
13531 g_s.
begin(
"Generating group documentation...\n");
13535 g_s.
begin(
"Generating class documentation...\n");
13539 g_s.
begin(
"Generating concept documentation...\n");
13543 g_s.
begin(
"Generating module documentation...\n");
13547 g_s.
begin(
"Generating namespace documentation...\n");
13553 g_s.
begin(
"Generating graph info page...\n");
13558 g_s.
begin(
"Generating directory documentation...\n");
13567 g_s.
begin(
"finalizing index lists...\n");
13571 g_s.
begin(
"writing tag file...\n");
13577 g_s.
begin(
"Generating XML output...\n");
13585 g_s.
begin(
"Generating SQLITE3 output...\n");
13592 g_s.
begin(
"Generating AutoGen DEF output...\n");
13598 g_s.
begin(
"Generating Perl module output...\n");
13602 if (generateHtml && searchEngine && serverBasedSearch)
13604 g_s.
begin(
"Generating search index\n");
13614 if (searchDataFile.
empty())
13616 searchDataFile=
"searchdata.xml";
13629 g_s.
begin(
"Combining RTF output...\n");
13632 err(
"An error occurred during post-processing the RTF files!\n");
13639 g_s.
begin(
"Running plantuml with JAVA...\n");
13646 g_s.
begin(
"Running mermaid (mmdc)...\n");
13658 if (generateHtml &&
13662 g_s.
begin(
"Running html help compiler...\n");
13667 if ( generateHtml &&
13671 g_s.
begin(
"Running qhelpgenerator...\n");
13684 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
13685 if (numThreads<1) numThreads=1;
13686 msg(
"Total elapsed time: {:.6f} seconds\n(of which an average of {:.6f} seconds per thread waiting for external tools to finish)\n",
13693 msg(
"finished...\n");
13698 msg(
"finished...\n");
This class contains the information about the argument of a function or template.
This class represents an function or template argument list.
RefQualifierType refQualifier() const
bool noParameters() const
bool pureSpecifier() const
bool hasParameters() const
DString trailingReturnType() const
void setPureSpecifier(bool b)
bool constSpecifier() const
void setTrailingReturnType(const DString &s)
void push_back(const Argument &a)
void setConstSpecifier(bool b)
void setRefQualifier(RefQualifierType t)
void setIsDeleted(bool b)
bool volatileSpecifier() const
void setNoParameters(bool b)
void setVolatileSpecifier(bool b)
static CitationManager & instance()
void clear()
clears the database
void generatePage()
Generate the citations page.
std::unique_ptr< ClangTUParser > createTUParser(const FileDef *fd) const
static ClangParser * instance()
Returns the one and only instance of the class.
Clang parser object for a single translation unit, which consists of a source file and the directly o...
void switchToFile(const FileDef *fd)
Switches to another file within the translation unit started with start().
void parse()
Parse the file given at construction time as a translation unit This file should already be preproces...
A abstract class representing of a compound symbol.
virtual DString requiresClause() const =0
virtual const MemberDef * getMemberByName(const DString &) const =0
Returns the member with the given name.
virtual const ArgumentList & templateArguments() const =0
Returns the template arguments of this class.
virtual void writeDocumentation(OutputList &ol) const =0
virtual void writeMemberList(OutputList &ol) const =0
virtual bool isTemplate() const =0
Returns true if this class is a template.
virtual const BaseClassList & baseClasses() const =0
Returns the list of base classes from which this class directly inherits.
virtual int isBaseClass(const ClassDef *bcd, bool followInstances, const DString &templSpec=DString()) const =0
Returns true iff bcd is a direct or indirect base class of this class.
virtual const TemplateInstanceList & getTemplateInstances() const =0
Returns a sorted dictionary with all template instances found for this template class.
virtual ArgumentLists getTemplateParameterLists() const =0
Returns the template parameter lists that form the template declaration of this class.
virtual Protection protection() const =0
Return the protection level (Public,Protected,Private) in which this compound was found.
virtual DString compoundTypeString() const =0
Returns the type of compound as a string.
virtual MemberList * getMemberList(MemberListType lt) const =0
Returns the members in the list identified by lt.
virtual std::unique_ptr< ClassDef > deepCopy(const DString &name) const =0
virtual bool isForwardDeclared() const =0
Returns true if this class represents a forward declaration of a template class.
virtual bool isSubClass(ClassDef *bcd, int level=0) const =0
Returns true iff bcd is a direct or indirect sub class of this class.
virtual void moveTo(Definition *)=0
virtual const TemplateNameMap & getTemplateBaseClassNames() const =0
virtual DString qualifiedNameWithTemplateParameters(const ArgumentLists *actualParams=nullptr, uint32_t *actualParamIndex=nullptr) const =0
virtual bool isEmbeddedInOuterScope() const =0
virtual const MemberNameInfoLinkedMap & memberNameInfoLinkedMap() const =0
Returns a dictionary of all members.
virtual bool isImplicitTemplateInstance() const =0
virtual const ClassDef * templateMaster() const =0
Returns the template master of which this class is an instance.
CompoundType
The various compound types.
virtual CompoundType compoundType() const =0
Returns the type of compound this is, i.e. class/struct/union/...
virtual bool containsOverload(const MemberDef *md) const =0
virtual ClassLinkedRefMap getClasses() const =0
returns the classes nested into this class
virtual FileDef * getFileDef() const =0
Returns the file in which this compound's definition can be found.
virtual void writeTagFile(TextStream &) const =0
virtual void writeDocumentationForInnerClasses(OutputList &ol) const =0
virtual void computeAnchors()=0
virtual void addTypeConstraints()=0
virtual void overrideCollaborationGraph(bool e)=0
virtual void addUsedClass(ClassDef *cd, const DString &accessName, Protection prot)=0
virtual void insertExplicitTemplateInstance(ClassDef *instance, const DString &spec)=0
virtual void countMembers()=0
virtual void addMembersToMemberGroup()=0
virtual void setPrimaryConstructorParams(const ArgumentList &list)=0
virtual void setTemplateBaseClassNames(const TemplateNameMap &templateNames)=0
virtual ClassDef * insertTemplateInstance(const DString &fileName, int startLine, size_t startColumn, const DString &templSpec, bool &freshInstance)=0
virtual void setClassName(const DString &name)=0
virtual void setFileDef(FileDef *fd)=0
virtual void reclassifyMember(MemberDefMutable *md, MemberType t)=0
virtual void setTemplateArguments(const ArgumentList &al)=0
virtual void setTemplateMaster(const ClassDef *tm)=0
virtual void makeTemplateArgument(bool b=true)=0
virtual void mergeCategory(ClassDef *category)=0
virtual void addQualifiers(const StringVector &qualifiers)=0
virtual void setClassSpecifier(TypeSpecifier spec)=0
virtual void insertUsedFile(const FileDef *)=0
virtual void setTaglessParent(const ClassDef *cd)=0
virtual void setUsedOnly(bool b)=0
virtual void sortMemberLists()=0
virtual void setProtection(Protection p)=0
virtual void setTypeConstraints(const ArgumentList &al)=0
virtual void overrideInheritanceGraph(CLASS_GRAPH_t e)=0
virtual void setAnonymousEnumType()=0
virtual void setCompoundType(CompoundType t)=0
virtual void distributeMemberGroupDocumentation()=0
virtual void setMetaData(const DString &md)=0
virtual void findSectionsInDocumentation()=0
virtual void insertMember(MemberDef *)=0
virtual void sortAllMembersList()=0
virtual void mergeMembers()=0
virtual void setIsStatic(bool b)=0
virtual void addMembersToTemplateInstance(const ClassDef *cd, const ArgumentList &templateArguments, const DString &templSpec)=0
virtual void insertSubClass(ClassDef *, Protection p, Specifier s, const DString &t=DString())=0
virtual void addUsedByClass(ClassDef *cd, const DString &accessName, Protection prot)=0
virtual void setSubGrouping(bool enabled)=0
virtual void setRequiresClause(const DString &req)=0
virtual void insertBaseClass(ClassDef *, const DString &name, Protection p, Specifier s, const DString &t=DString())=0
virtual void setHasNamedVariable(bool b)=0
virtual void addDocPart(const DString &doc, int lineNr, size_t colNr)=0
virtual void addCodePart(const DString &code, int lineNr, size_t colNr)=0
virtual void setFileDef(FileDef *fd)=0
virtual void writeTagFile(TextStream &)=0
virtual void writeDocumentation(OutputList &ol)=0
virtual void setGroupId(int id)=0
virtual void setInitializer(const DString &init)=0
virtual void findSectionsInDocumentation()=0
virtual void setTemplateArguments(const ArgumentList &al)=0
A String class for use with Doxygen wrapping std::string and adding some additional functionality off...
DString & setNum(short n)
void resize(size_t newlen)
size_t rfind(char c, size_t pos=npos) const
DString fill(char c, size_t len)
Fills a string with a predefined character.
DString mid(size_t index, size_t len=npos) const
bool empty() const
Returns true iff the string is empty (std::string compatible alias for isEmpty()).
DString & replace(size_t index, size_t len, const char *s)
DString substr(size_t pos=0, size_t count=npos) const
Returns a substring of length count starting at pos.
static constexpr size_t npos
value used to indicate 'not found' or 'to the end of the string', matching std::string::npos
char & at(size_t i)
Returns a reference to the character at index i.
bool findAndRemoveWord(const char *word)
removes occurrences of whole word from this string, while keeping internal spaces and reducing multip...
DString right(size_t len) const
size_t size() const
Returns the length of the string, not counting the 0-terminator.
DString & prepend(const char *s)
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 setFileDef(FileDef *fd)=0
virtual void setPrototype(bool p, const DString &df, int line, size_t column)=0
virtual void setRelatedAlso(ClassDef *cd)=0
virtual void setAnonymousMemberForDeclaration(const MemberDef *md)=0
virtual void overrideReferencesRelation(bool e)=0
virtual void setAnonymousMemberForDetails(const MemberDef *md)=0
virtual void makeForeign()=0
virtual void overrideReferencedByRelation(bool e)=0
virtual void setDocsForDefinition(bool b)=0
virtual void overrideCallGraph(bool e)=0
virtual void overrideInlineSource(bool e)=0
virtual void setBitfields(const DString &s)=0
virtual void copyArgumentNames(const MemberDef *bmd)=0
virtual void overrideEnumValues(bool e)=0
virtual void mergeMemberSpecifiers(TypeSpecifier s)=0
virtual void addQualifiers(const StringVector &qualifiers)=0
virtual void setExplicitExternal(bool b, const DString &df, int line, size_t column)=0
virtual void insertEnumField(MemberDef *md)=0
virtual void moveDeclArgumentList(std::unique_ptr< ArgumentList > al)=0
virtual void setDeclFile(const DString &df, int line, size_t column)=0
virtual void setAnonymousEnumType(const MemberDef *md)=0
virtual void overrideCallerGraph(bool e)=0
virtual void setReimplements(MemberDef *md)=0
virtual void invalidateCachedArgumentTypes()=0
virtual void setNamespace(NamespaceDef *nd)=0
virtual void moveArgumentList(std::unique_ptr< ArgumentList > al)=0
virtual void makeRelated()=0
virtual void insertReimplementedBy(MemberDef *md)=0
virtual void setAnchor()=0
A list of MemberDef objects as shown in documentation sections.
Wrapper class for the MemberListType type.
Ordered dictionary of MemberName objects.
MemberName::Ptr take(const DString &key, const MemberDef *value)
const MemberDef * findRev(const DString &name) const
const MemberDef * find(const DString &name) const
void run()
Run mmdc tool for all collected diagrams.
static MermaidManager & instance()
static ModuleManager & instance()
void addDocs(const Entry *root)
void addConceptToModule(const Entry *root, ConceptDef *cd)
void addClassToModule(const Entry *root, ClassDef *cd)
void addMemberToModule(const Entry *root, MemberDef *md)
void writeDocumentation(OutputList &ol)
void addMembersToMemberGroup()
void findSectionsInDocumentation()
void distributeMemberGroupDocumentation()
An abstract interface of a namespace symbol.
virtual const LinkedRefMap< NamespaceDef > & getUsedNamespaces() const =0
virtual bool isInline() const =0
virtual void insertUsedFile(FileDef *fd)=0
virtual void findSectionsInDocumentation()=0
virtual void countMembers()=0
virtual void addUsingDirective(NamespaceDef *nd)=0
virtual void setFileName(const DString &fn)=0
virtual void insertMember(MemberDef *md)=0
virtual void setMetaData(const DString &m)=0
virtual void addUsingDeclaration(const Definition *d)=0
virtual void distributeMemberGroupDocumentation()=0
virtual void writeTagFile(TextStream &)=0
virtual void writeDocumentation(OutputList &ol)=0
virtual void setInline(bool isInline)=0
virtual void computeAnchors()=0
virtual void combineUsingRelations(NamespaceDefSet &visitedNamespace)=0
virtual void sortMemberLists()=0
virtual void addMembersToMemberGroup()=0
void parseInput(const DString &, const char *, const std::shared_ptr< Entry > &, ClangTUParser *) override
Parses a single input file with the goal to build an Entry tree.
void parsePrototype(const DString &) override
Callback function called by the comment block scanner.
bool needsPreprocessing(const DString &) const override
Returns true if the language identified by extension needs the C preprocessor to be run before feed t...
Abstract interface for outline parsers.
virtual bool needsPreprocessing(const DString &extension) const =0
Returns true if the language identified by extension needs the C preprocessor to be run before feed t...
virtual void parseInput(const DString &fileName, const char *fileBuf, const std::shared_ptr< Entry > &root, ClangTUParser *clangParser)=0
Parses a single input file with the goal to build an Entry tree.
Class representing a list of output generators that are written to in parallel.
void disable(OutputType o)
void enable(OutputType o)
void docify(const DString &s)
void writeStyleInfo(int part)
void generateDoc(const DString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const DString &docStr, const DocOptions &options)
A model of a page symbol.
virtual void setLocalToc(const LocalToc &tl)=0
virtual void setFileName(const DString &name)=0
virtual void setShowLineNo(bool)=0
virtual void setPageScope(Definition *)=0
virtual const GroupDef * getGroupDef() const =0
Manages programming language parsers.
std::unique_ptr< CodeParserInterface > getCodeParser(const DString &extension)
Gets the interface to the parser associated with a given extension.
void registerParser(const DString &name, const OutlineParserFactory &outlineParserFactory, const CodeParserFactory &codeParserFactory)
Registers an additional parser.
std::unique_ptr< OutlineParserInterface > getOutlineParser(const DString &extension)
Gets the interface to the parser associated with a given extension.
static PlantumlManager & instance()
void run()
Run plant UML tool for all images.
void processFile(const DString &fileName, const std::string &input, std::string &output)
void addSearchDir(const DString &dir)
static DString getQchFileName()
static const DString qhpFileName
Generator for RTF output.
static bool preProcessFileInplace(const DString &path, const DString &name)
This is an API to a VERY brittle RTF preprocessor that combines nested RTF files.
static void writeStyleSheetFile(TextStream &t)
static void writeExtensionsFile(TextStream &t)
static RefListManager & instance()
static RequirementManager & instance()
void writeTagFile(TextStream &tagFile)
void addRequirement(Entry *e)
Abstract proxy interface for non-javascript based search indices.
void addWord(const DString &word, bool hiPriority)
void setCurrentDoc(const Definition *ctx, const DString &anchor, bool isSourceFile)
void write(const DString &file)
class that provide information about a section.
SectionInfo * replace(const DString &label, const DString &fileName, int lineNr, const DString &title, SectionType type, int level, const DString &ref=DString())
SectionInfo * add(const SectionInfo &si)
static SectionManager & instance()
returns a reference to the singleton
static constexpr int Page
std::vector< stat > stats
void begin(const char *name)
std::chrono::steady_clock::time_point startTime
static void showCacheUsage()
Show usage of the type lookup cache.
static void clearTypeLookupCache(ClearScope scope)
ClassDefMutable * resolveClassMutable(const Definition *scope, const DString &name, bool mayBeUnlinkable=false, bool mayBeHidden=false)
Wrapper around resolveClass that returns a mutable interface to the class object or a nullptr if the ...
const ClassDef * resolveClass(const Definition *scope, const DString &name, bool maybeUnlinkable=false, bool mayBeHidden=false)
Find the class definition matching name within the scope set.
const Definition * resolveSymbol(const Definition *scope, const DString &name, const DString &args=DString(), bool checkCV=false, bool insideCode=false, bool onlyLinkable=false)
Find the symbool definition matching name within the scope set.
DString getTemplateSpec() const
In case a call to resolveClass() points to a template specialization, the template part is return via...
const MemberDef * getTypedef() const
In case a call to resolveClass() resolves to a type member (e.g. an enum) this method will return it.
This struct is used to capture the tag file information for an Entry.
Text streaming class that buffers data.
std::string str() const
Return the contents of the buffer as a std::string object.
Class managing a pool of worker threads.
auto queue(F &&f, Args &&... args) -> std::future< decltype(f(args...))>
Queue the callable function f for the threads to execute.
virtual DString trOverloadText()=0
virtual DString trPage(bool first_capital, bool singular)=0
virtual DString trMainPage()=0
Wrapper class for a number of boolean properties.
std::string to_string() const
static void correctMemberProperties(MemberDefMutable *md)
static void computeVhdlComponentRelations()
ClassDefMutable * toClassDefMutable(Definition *d)
ClassDef * getClass(const DString &n)
std::unique_ptr< ClassDef > createClassDefAlias(const Definition *newScope, const ClassDef *cd)
std::unique_ptr< ClassDef > createClassDef(const DString &fileName, int startLine, size_t startColumn, const DString &name, ClassDef::CompoundType ct, const DString &ref, const DString &fName, bool isSymbol, bool isJavaEnum)
Factory method to create a new ClassDef object.
ClassDef * toClassDef(Definition *d)
std::unordered_set< const ClassDef * > ClassDefSet
std::map< std::string, int > TemplateNameMap
ClassDefMutable * getClassMutable(const DString &key)
Class representing a regular expression.
Class to iterate through matches.
Object representing the matching results.
ConceptDefMutable * toConceptDefMutable(Definition *d)
std::unique_ptr< ConceptDef > createConceptDef(const DString &fileName, int startLine, size_t startColumn, const DString &name, const DString &tagRef, const DString &tagFile)
ConceptDefMutable * getConceptMutable(const DString &key)
#define Config_getInt(name)
#define Config_getList(name)
#define Config_updateString(name, value)
#define Config_updateBool(name, value)
#define Config_getBool(name)
#define Config_getString(name)
#define Config_updateList(name,...)
#define Config_getEnum(name)
std::set< std::string > StringSet
std::unordered_set< std::string > StringUnorderedSet
std::map< std::string, std::string > StringMap
std::vector< std::string > StringVector
void parseFuncDecl(const DString &decl, const SrcLangExt lang, DString &clName, DString &type, DString &name, DString &args, DString &funcTempList, DString &exceptions)
std::unique_ptr< ArgumentList > stringToArgumentList(SrcLangExt lang, const DString &argsString, DString *extraTypeChars=nullptr)
std::unordered_map< std::string, DefineList > DefinesPerFileList
Definition * toDefinition(DefinitionMutable *dm)
DefinitionMutable * toDefinitionMutable(Definition *d)
DirIterator begin(DirIterator it) noexcept
DirIterator end(const DirIterator &) noexcept
void computeDirDependencies()
void generateDirDocs(OutputList &ol)
#define AUTO_TRACE_ADD(...)
#define AUTO_TRACE_EXIT(...)
constexpr DocNodeVariant * parent(DocNodeVariant *n)
returns the parent node of a given node n or nullptr if the node has no parent.
static void findInheritedTemplateInstances()
void printNavTree(Entry *root, int indent)
static void addClassToContext(const Entry *root)
static void makeTemplateInstanceRelation(const Entry *root, ClassDefMutable *cd)
static StringUnorderedSet g_pathsVisited(1009)
static void buildGroupList(const Entry *root)
static void insertMemberAlias(Definition *outerScope, const MemberDef *md)
static void findUsingDeclarations(const Entry *root, bool filterPythonPackages)
static void flushCachedTemplateRelations()
static void copyLatexStyleSheet()
static void generateDocsForClassList(const std::vector< ClassDefMutable * > &classList)
static int findFunctionPtr(const std::string &type, SrcLangExt lang, int *pLength=nullptr)
static bool isSpecialization(const ArgumentLists &srcTempArgLists, const ArgumentLists &dstTempArgLists)
static void computeTemplateClassRelations()
static std::string resolveSymlink(const std::string &path)
void adjustConfiguration()
adjust globals that depend on configuration settings.
static void findDEV(const MemberNameLinkedMap &mnsd)
static void runQHelpGenerator()
static void addConceptToContext(const Entry *root)
static void addRelatedPage(Entry *root)
static StringVector g_inputFiles
static void generateXRefPages()
static Definition * buildScopeFromQualifiedName(const DString &name_, SrcLangExt lang, const TagInfo *tagInfo)
static void findUsingDeclImports(const Entry *root)
static void copyStyleSheet()
static void addIncludeFile(Def *def, FileDef *ifd, const Entry *root)
FindBaseClassRelation_Mode
void distributeClassGroupRelations()
static void generateGroupDocs()
static void findDirDocumentation(const Entry *root)
void checkConfiguration()
check and resolve config options
static bool findClassRelation(const Entry *root, Definition *context, ClassDefMutable *cd, const BaseInfo *bi, const TemplateNameMap &templateNames, FindBaseClassRelation_Mode mode, bool isArtificial)
static void resolveTemplateInstanceInType(const Entry *root, const Definition *scope, const MemberDef *md)
static void organizeSubGroupsFiltered(const Entry *root, bool additional)
static void warnUndocumentedNamespaces()
static TemplateNameMap getTemplateArgumentsInName(const ArgumentList &templateArguments, const std::string &name)
static void buildConceptList(const Entry *root)
static void addMemberSpecialization(const Entry *root, MemberName *mn, ClassDefMutable *cd, const DString &funcType, const DString &funcName, const DString &funcArgs, const DString &funcDecl, const DString &exceptions, TypeSpecifier spec)
static void resolveClassNestingRelations()
static void generateNamespaceConceptDocs(const ConceptLinkedRefMap &conceptList)
static MemberDef * addVariableToFile(const Entry *root, MemberType mtype, const DString &scope, const DString &type, const DString &name, const DString &args)
static void findClassEntries(const Entry *root)
static void vhdlCorrectMemberProperties()
static void addMemberFunction(const Entry *root, MemberName *mn, const DString &scopeName, const DString &namespaceName, const DString &className, const DString &funcTyp, const DString &funcName, const DString &funcArgs, const DString &funcTempList, const DString &exceptions, const DString &type, const DString &args, bool isFriend, TypeSpecifier spec, const DString &relates, const DString &funcDecl, bool overloaded, bool isFunc)
static void generateExampleDocs()
static void stopDoxygen(int)
static void substituteTemplatesInArgList(const ArgumentLists &srcTempArgLists, const ArgumentLists &dstTempArgLists, const ArgumentList &src, ArgumentList &dst)
static void copyLogo(const DString &outputOption, bool toIndex)
static void computeMemberReferences()
static void transferRelatedFunctionDocumentation()
static void addMembersToMemberGroup()
static void findMainPageTagFiles(Entry *root)
static void addLocalObjCMethod(const Entry *root, const DString &scopeName, const DString &funcType, const DString &funcName, const DString &funcArgs, const DString &exceptions, const DString &funcDecl, TypeSpecifier spec)
static void distributeConceptGroups()
static NamespaceDef * findUsedNamespace(const LinkedRefMap< NamespaceDef > &unl, const DString &name)
static void transferFunctionDocumentation()
static void setAnonymousEnumType()
static void sortMemberLists()
static void findMember(const Entry *root, const DString &relates, const DString &type, const DString &args, DString funcDecl, bool overloaded, bool isFunc)
static void createTemplateInstanceMembers()
void transferStaticInstanceInitializers()
static void findObjCMethodDefinitions(const Entry *root)
static void addMemberDocs(const Entry *root, MemberDefMutable *md, const DString &funcDecl, const ArgumentList *al, bool over_load, TypeSpecifier spec)
static void dumpSymbolMap()
static void buildTypedefList(const Entry *root)
static void findGroupScope(const Entry *root)
static void generateFileDocs()
static int findEndOfTemplate(const DString &s, size_t startPos)
static void findDefineDocumentation(Entry *root)
static void findUsedClassesForClass(const Entry *root, Definition *context, ClassDefMutable *masterCd, ClassDefMutable *instanceCd, bool isArtificial, const ArgumentList *actualArgs=nullptr, const TemplateNameMap &templateNames=TemplateNameMap())
static void findMemberDocumentation(const Entry *root)
static void distributeMemberGroupDocumentation()
static void generateNamespaceClassDocs(const ClassLinkedRefMap &classList)
static void addEnumValuesToEnums(const Entry *root)
static void generatePageDocs()
static void resolveUserReferences()
static void buildRequirementsList(Entry *root)
static void compareDoxyfile(Config::CompareMode diffList)
static void addPageToContext(PageDef *pd, Entry *root)
static std::shared_ptr< Entry > parseFile(OutlineParserInterface &parser, FileDef *fd, const DString &fn, ClangTUParser *clangParser, bool newTU)
static void buildVarList(const Entry *root)
static void copyIcon(const DString &outputOption, bool toIndex)
static void buildSequenceList(const Entry *root)
static void generateFileSources()
static void copyExtraFiles(StringVector files, const DString &filesOption, const DString &outputOption, bool toIndex)
static void generateClassDocs()
static int findTemplateSpecializationPosition(const DString &name)
static void buildNamespaceList(const Entry *root)
static void findIncludedUsingDirectives()
static void addDefineDoc(const Entry *root, MemberDefMutable *md)
static void countMembers()
static ClassDef * findClassWithinClassContext(Definition *context, ClassDef *cd, const DString &name)
static void organizeSubGroups(const Entry *root)
static void applyMemberOverrideOptions(const Entry *root, MemberDefMutable *md)
static void addOverloaded(const Entry *root, MemberName *mn, const DString &funcType, const DString &funcName, const DString &funcArgs, const DString &funcDecl, const DString &exceptions, TypeSpecifier spec)
static void findFriends()
static void findEnums(const Entry *root)
static void generateConfigFile(const DString &configFile, bool shortList, bool updateOnly=false)
static DString g_commentFileName
static void dumpSymbol(TextStream &t, Definition *d)
static void addClassAndNestedClasses(std::vector< ClassDefMutable * > &list, ClassDefMutable *cd)
static ClassDefMutable * createTagLessInstance(const Definition *root, const ClassDef *templ, const DString &fieldName, bool hasNamedVariable)
static void addEnumDocs(const Entry *root, MemberDefMutable *md)
static void addListReferences()
static void exitDoxygen() noexcept
static bool findGlobalMember(const Entry *root, const DString &namespaceName, const DString &type, const DString &name, const DString &tempArg, const DString &, const DString &decl, TypeSpecifier)
static bool isClassSection(const Entry *root)
static void processTagLessClasses(const Definition *root, const Container *def, const TagContainer *tagParent, MemberListType varFilter, MemberListType typeFilter, const DString &prefix, int count)
Look through the members of class cd and its public members.
static void buildGroupListFiltered(const Entry *root, bool additional, bool includeExternal)
static void runHtmlHelpCompiler()
static void addMembersToIndex()
static bool g_dumpSymbolMap
static void version(const bool extended)
static OutputList * g_outputList
static DString extractClassName(const Entry *root)
static void findMainPage(Entry *root)
static ClassDef::CompoundType convertToCompoundType(EntryType section, TypeSpecifier specifier)
DString stripTemplateSpecifiers(const DString &s)
static void findUsingDirectives(const Entry *root)
static void addInterfaceOrServiceToServiceOrSingleton(const Entry *root, ClassDefMutable *cd, DString const &rname)
static bool g_successfulRun
static bool tryAddEnumDocsToGroupMember(const Entry *root, const DString &name)
static void addSourceReferences()
static void associateVariableWithAnonymousEnumType(const MemberDef *md, const Container *cd, const MemberDef *enumTypeMember, MemberListType mlFilter)
static void createUsingMemberImportForClass(const Entry *root, ClassDefMutable *cd, const MemberDef *md, const DString &fileName, const DString &memName)
static DString substituteTemplatesInString(const ArgumentLists &srcTempArgLists, const ArgumentLists &dstTempArgLists, const std::string &src)
std::function< std::unique_ptr< T >() > make_parser_factory()
static void buildExampleList(Entry *root)
static void inheritDocumentation()
static void flushUnresolvedRelations()
static bool isSymbolHidden(const Definition *d)
void readConfiguration(int argc, char **argv)
static void readDir(FileInfo *fi, FileNameLinkedMap *fnMap, StringUnorderedSet *exclSet, const StringVector *patList, const StringVector *exclPatList, StringVector *resultList, StringUnorderedSet *resultSet, bool errorIfNotExist, bool recursive, StringUnorderedSet *killSet, StringUnorderedSet *paths)
static void findTemplateInstanceRelation(const Entry *root, Definition *context, ClassDefMutable *templateClass, const DString &templSpec, const TemplateNameMap &templateNames, bool isArtificial)
static void findDocumentedEnumValues()
static void findTagLessClasses()
static void generateDiskNames()
static void addToIndices()
static void computeClassRelations()
static void buildFunctionList(const Entry *root)
static void checkPageRelations()
static void addGlobalFunction(const Entry *root, const DString &rname, const DString &sc)
static void findModuleDocumentation(const Entry *root)
static MemberDef * addVariableToClass(const Entry *root, ClassDefMutable *cd, MemberType mtype, const DString &type, const DString &name, const DString &args, Protection prot, Relationship related)
static void readTagFile(const std::shared_ptr< Entry > &root, const DString &tagLine)
static void findEnumDocumentation(const Entry *root)
static void computePageRelations(Entry *root)
static void processTagLessClassesForList(const Definition *root, const Container *def, const TagContainer *tagParent, MemberListType varFilter, MemberListType typeFilter, const DString &prefix, int count)
static void addMethodToClass(const Entry *root, ClassDefMutable *cd, const DString &rtype, const DString &rname, const DString &rargs, bool isFriend, Protection protection, bool stat, Specifier virt, TypeSpecifier spec, const DString &relates)
static bool isVarWithConstructor(const Entry *root)
static StringSet g_usingDeclarations
static void buildDictionaryList(const Entry *root)
static bool haveEqualFileNames(const Entry *root, const MemberDef *md)
void readFileOrDirectory(const DString &s, FileNameLinkedMap *fnMap, StringUnorderedSet *exclSet, const StringVector *patList, const StringVector *exclPatList, StringVector *resultList, StringUnorderedSet *resultSet, bool recursive, bool errorIfNotExist, StringUnorderedSet *killSet, StringUnorderedSet *paths)
static void generateNamespaceDocs()
static void buildClassDocList(const Entry *root)
static void buildPageList(Entry *root)
static void writeTagFile()
static void addRequirementReferences()
static void computeVerifiedDotPath()
static bool g_singleComment
static void findSectionsInDocumentation()
static void mergeCategories()
static const StringUnorderedSet g_compoundKeywords
static bool scopeIsTemplate(const Definition *d)
static void buildFileList(const Entry *root)
static void buildClassList(const Entry *root)
static void usage(const DString &name, const DString &versionString)
static void findUsedTemplateInstances()
static void computeTooltipTexts()
static void addVariable(const Entry *root, int isFuncPtr=-1)
static void findBaseClassesForClass(const Entry *root, Definition *context, ClassDefMutable *masterCd, ClassDefMutable *instanceCd, FindBaseClassRelation_Mode mode, bool isArtificial, const ArgumentList *actualArgs=nullptr, const TemplateNameMap &templateNames=TemplateNameMap())
static void parseFilesSingleThreading(const std::shared_ptr< Entry > &root)
parse the list of input files
static void buildCompleteMemberLists()
static const ClassDef * findClassDefinition(FileDef *fd, NamespaceDef *nd, const DString &scopeName)
static void filterMemberDocumentation(const Entry *root, const DString &relates)
static void generateConceptDocs()
static bool isRecursiveBaseClass(const DString &scope, const DString &name)
static std::unique_ptr< OutlineParserInterface > getParserForFile(const DString &fn)
static void combineUsingRelations()
static const char * getArg(int argc, char **argv, int &optInd)
std::unique_ptr< ArgumentList > getTemplateArgumentsFromName(const DString &name, const ArgumentLists &tArgLists)
static void checkMarkdownMainfile()
static std::unordered_map< std::string, std::vector< ClassDefMutable * > > g_usingClassMap
static void buildConceptDocList(const Entry *root)
static bool isEntryInGroupOfMember(const Entry *root, const MemberDef *md, bool allowNoGroup=false)
static void applyToAllDefinitions(Func func)
static void parseFilesMultiThreading(const std::shared_ptr< Entry > &root)
parse the list of input files
static DString createOutputDirectory(const DString &baseDirName, const DString &formatDirName, const char *defaultDirName)
static void transferFunctionReferences()
static void buildDefineList()
static void buildInterfaceAndServiceList(const Entry *root)
static Definition * findScopeFromQualifiedName(NamespaceDefMutable *startScope, const DString &n, FileDef *fileScope, const TagInfo *tagInfo)
static void computeMemberRelations()
static void buildListOfUsingDecls(const Entry *root)
static 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.