22#include <unordered_map>
120#pragma GCC diagnostic push
121#pragma GCC diagnostic ignored "-Wshadow"
123#include <clang/Basic/Version.h>
125#pragma GCC diagnostic pop
132#if !defined(_WIN32) || defined(__CYGWIN__)
200{
"template class",
"template struct",
"class",
"struct",
"union",
"interface",
"exception" };
237 stats.emplace_back(name,0);
238 startTime = std::chrono::steady_clock::now();
242 std::chrono::steady_clock::time_point endTime = std::chrono::steady_clock::now();
243 stats.back().elapsed =
static_cast<double>(std::chrono::duration_cast<
244 std::chrono::microseconds>(endTime -
startTime).count())/1000000.0;
255 msg(
"----------------------\n");
256 for (
const auto &s :
stats)
258 msg(
"Spent {:.6f} seconds in {}",s.elapsed,s.name);
321 scope+=
"::"+pd->
name();
364 ((!includeExternal && root->
tagInfo()==
nullptr) ||
365 ( includeExternal && root->
tagInfo()!=
nullptr))
368 AUTO_TRACE(
"additional={} includeExternal={}",additional,includeExternal);
384 "group {}: ignoring title \"{}\" that does not match old title \"{}\"",
404 std::unique_ptr<GroupDef>(
411 std::unique_ptr<GroupDef>(
461 scope+=
"::"+gd->
name();
513 bool save_ambig = ambig;
524 fn = fn.
left(newIndex)+
"/"+root->
name;
527 if (!fd) ambig = save_ambig;
558 "Found non-existing group '{}' for the command '{}', ignoring command",
567 text.
sprintf(
"the name '%s' supplied as "
568 "the argument in the \\file statement ",
572 text+=
"matches the following input files:\n";
575 text+=
"Please use a more specific name by "
576 "including a (larger) part of the path!";
580 text+=
"is not an input file";
588template<
class DefMutable>
602 if (!includeFile.
isEmpty() && includeFile.
at(0)==
'"')
605 includeFile=includeFile.
mid(1,includeFile.
length()-2);
607 else if (!includeFile.
isEmpty() && includeFile.
at(0)==
'<')
610 includeFile=includeFile.
mid(1,includeFile.
length()-2);
622 text.
sprintf(
"the name '%s' supplied as "
623 "the argument of the \\class, \\struct, \\union, or \\include command ",
628 text+=
"matches the following input files:\n";
631 text+=
"Please use a more specific name by "
632 "including a (larger) part of the path!";
636 text+=
"is not an input file";
640 else if (includeFile.
isEmpty() && ifd &&
654 if (iName.
at(0)==
'<') local=
FALSE;
655 else if (iName.
at(0)==
'"') local=
TRUE;
656 if (iName.
at(0)==
'"' || iName.
at(0)==
'<')
679 cd->setIncludeFile(
nullptr,iName,local,
TRUE);
692 for (
size_t i=0;i<l;i++)
696 else if (c==
')' && round>0) round--;
697 else if (c==
'<' && round==0) count++;
702 if (c==
'>' && round==0 && count>0) count--;
725 if (idx==-1)
return prevScope;
727 if (nsName.
isEmpty())
return prevScope;
728 if (!fullScope.
isEmpty()) fullScope+=
"::";
733 if (nd==
nullptr) cd =
getClass(fullScope);
734 if (nd==
nullptr && cd)
738 else if (nd==
nullptr && cd==
nullptr && fullScope.
find(
'<')==-1)
746 "[generated]",1,1,fullScope,
764 if (prevScopeMutable)
796 int p=i1+l1,l2=0,i2=0;
804 if (resultScope==
nullptr)
815 if (resultScope!=
nullptr)
break;
874 auto alIt = tArgLists.begin();
875 while ((i=name.
find(
"::",p))!=-1 && alIt!=tArgLists.end())
891 return alIt!=tArgLists.end() ?
892 std::make_unique<ArgumentList>(*alIt) :
893 std::unique_ptr<ArgumentList>();
901 if (specifier.isStruct())
903 else if (specifier.isUnion())
905 else if (specifier.isCategory())
907 else if (specifier.isInterface())
909 else if (specifier.isProtocol())
911 else if (specifier.isException())
913 else if (specifier.isService())
915 else if (specifier.isSingleton())
918 if (section.isUnionDoc())
920 else if (section.isStructDoc())
922 else if (section.isInterfaceDoc())
924 else if (section.isProtocolDoc())
926 else if (section.isCategoryDoc())
928 else if (section.isExceptionDoc())
930 else if (section.isServiceDoc())
932 else if (section.isSingletonDoc())
953 int idx=fullName.
find(
'>');
954 if (idx!=-1 && root->
lang==SrcLangExt::CSharp)
964 qualifiedName.
prepend(scName+
"::");
970 AUTO_TRACE_ADD(
"Found class with name '{}', qualifiedName '{}'", cd ? cd->
name() : root->
name, qualifiedName);
1025 AUTO_TRACE_ADD(
"New class: fullname '{}' namespace '{}' name='{}' brief='{}' docs='{}'",
1035 if (fullName.
find(
"::")!=-1)
1042 std::unique_ptr<ArgumentList> tArgList;
1044 if ((root->
lang==SrcLangExt::CSharp || root->
lang==SrcLangExt::Java) &&
1045 (i=fullName.
find(
'<'))!=-1)
1050 if (i!=-1 && root->
lang==SrcLangExt::CSharp)
1059 fullName=fullName.
left(i);
1070 fullName,sec,tagName,refFileName,
TRUE,root->
spec.isEnum()) ));
1073 AUTO_TRACE_ADD(
"New class '{}' type={} #tArgLists={} tagInfo={} hidden={} artificial={}",
1110 AUTO_TRACE_ADD(
"Class {} not added, already exists as alias", fullName);
1118 if (!root->
spec.isForwardDecl())
1180 qualifiedName.
prepend(scName+
"::");
1186 AUTO_TRACE_ADD(
"Found concept with name '{}' (qualifiedName='{}')", cd ? cd->
name() : root->
name, qualifiedName);
1190 qualifiedName=cd->
name();
1204 AUTO_TRACE_ADD(
"New concept: fullname '{}' namespace '{}' name='{}' brief='{}' docs='{}'",
1205 qualifiedName,namespaceName,className,root->
brief,root->
doc);
1214 if (qualifiedName.
find(
"::")!=-1)
1226 qualifiedName,tagName,refFileName)));
1230 qualifiedName,root->
tArgLists.size(),fmt::ptr(tagInfo));
1261 for (
const auto &ce : root->
children())
1264 if (ce->section.isConceptDocPart())
1269 if (!ce->brief.isEmpty())
1271 cd->
addDocPart(ce->brief,ce->startLine,ce->startColumn);
1274 if (!ce->doc.isEmpty())
1276 cd->
addDocPart(ce->doc,ce->startLine,ce->startColumn);
1280 else if (ce->section.isConceptCodePart())
1282 cd->
addCodePart(ce->initializer.str(),ce->startLine,ce->startColumn);
1289 AUTO_TRACE_ADD(
"Concept '{}' not added, already exists (as alias)", qualifiedName);
1296 for (
const auto &ce : root->
children())
1298 if (ce->section.isConceptDocPart())
1318 if (root->
section.isModuleDoc())
1328 if (root->
section.isConcept())
1338 if (root->
section.isConceptDoc())
1357 if (cd!=ocd && cd->groupId()==ocd->groupId() &&
1358 !cd->partOfGroups().empty() && ocd->partOfGroups().empty())
1363 for (
const auto &gd : cd->partOfGroups())
1369 gd->addConcept(ocd.get());
1394 aliasFullName(name),aliasCd(std::move(cd)), aliasContext(ctx) {}
1396 std::unique_ptr<ClassDef> aliasCd;
1399 std::vector<ClassAlias> aliases;
1403 if (cd && visitedClasses.find(icd.get())==visitedClasses.end())
1409 name,icd->getFileDef(),
nullptr);
1435 aliases.emplace_back(aliasFullName,std::move(aliasCd),dm);
1446 visitedClasses.insert(icd.get());
1456 for (
auto &alias : aliases)
1461 alias.aliasContext->addInnerCompound(aliasCd);
1470 if (cd && visitedClasses.find(icd.get())==visitedClasses.end())
1488 "Incomplete input: scope for class {} not found!{}",name,
1489 name.
startsWith(
"std::") ?
" Try enabling BUILTIN_STL_SUPPORT." :
""
1507 if (visitedClasses.find(cd.get())==visitedClasses.end() && !cd->partOfGroups().empty())
1511 for (
auto &ncd : cd->getClasses())
1522 visitedClasses.insert(cd.get());
1533 (root->
section.isNamespace() ||
1534 root->
section.isNamespaceDoc() ||
1543 if (root->
section.isPackageDoc())
1607 root->
type,root->
spec.isPublished())));
1674 QCString aliasName = aliasNd->name();
1703 for (
auto &und : unl)
1707 if (usingNd!=
nullptr)
break;
1714 if (root->
section.isUsingDir())
1732 (fd==
nullptr || fd->
getLanguage()!=SrcLangExt::Java)
1746 int scopeOffset =
static_cast<int>(nsName.
length());
1757 else if ((scopeOffset=nsName.
findRev(
"::",scopeOffset-1))==-1)
1761 }
while (scopeOffset>=0 && usingNd==
nullptr);
1763 if (usingNd==
nullptr && nd)
1767 while (pnd && usingNd==
nullptr)
1784 if (usingNd==
nullptr && fd)
1857 if (root->
section.isUsingDecl() &&
1870 if (root->
section.isUsingDecl() &&
1872 (!filterPythonPackages || (root->
lang==SrcLangExt::Python && root->
fileName.
endsWith(
"__init__.py")))
1875 AUTO_TRACE(
"Found using declaration '{}' at line {} of {} inside section {}",
1905 if (nd==
nullptr) scope = fd;
1975 AUTO_TRACE(
"creating new member {} for class {}",memName,cd->
name());
1986 newMmd->setMemberClass(cd);
2004 newMmd->addSectionsToDefinition(root->
anchors);
2010 newMmd->setMemberGroupId(root->
mGrpId);
2013 newMmd->setLanguage(root->
lang);
2014 newMmd->setId(root->
id);
2023 if (root->
section.isUsingDecl() &&
2050 for (
auto &mi : *mni)
2053 if (md && md->
protection()!=Protection::Private)
2068 for (
const auto ©Cd : it->second)
2081 else if (root->
section.isUsingDecl() &&
2083 root->
lang==SrcLangExt::Cpp
2116 memName = root->
name;
2138 newMmd->setNamespace(nd);
2143 newMmd->setFileDef(fd);
2162 newMmd->addSectionsToDefinition(root->
anchors);
2168 newMmd->setMemberGroupId(root->
mGrpId);
2171 newMmd->setLanguage(root->
lang);
2172 newMmd->setId(root->
id);
2180 if (nd && aliasMd.get())
2184 if (fd && aliasMd.get())
2213 if (nd) ncdm->
moveTo(nd);
2242 aliasFullName = aliasCd->localName();
2246 aliasFullName = nd->
qualifiedName()+
"::"+aliasCd->localName();
2278 for (
const auto &fd : *fn)
2281 fd->addIncludedUsingDirectives(visitedFiles);
2303 if (lang==SrcLangExt::Java || lang==SrcLangExt::CSharp)
2308 AUTO_TRACE(
"class variable: file='{}' type='{}' scope='{}' name='{}' args='{}' prot={} mtype={} lang={} ann={} init='{}'",
2314 if (related!=Relationship::Member || mtype==MemberType::Friend ||
Config_getBool(HIDE_SCOPE_NAMES))
2316 if (root->
spec.isAlias())
2318 if (lang==SrcLangExt::Python)
2320 def=
"type "+name+args;
2329 def=type+
" "+name+args;
2334 if (root->
spec.isAlias())
2336 if (lang==SrcLangExt::Python)
2338 def=
"type "+qualScope+scopeSeparator+name+args;
2342 def=
"using "+qualScope+scopeSeparator+name;
2347 def=type+
" "+qualScope+scopeSeparator+name+args;
2359 def=qualScope+scopeSeparator+name+args;
2370 for (
const auto &imd : *mn)
2382 if (root->
lang==SrcLangExt::ObjC &&
2383 root->
mtype==MethodTypes::Property &&
2407 prot,Specifier::Normal,root->
isStatic,related,
2411 mmd->setTagInfo(root->
tagInfo());
2412 mmd->setMemberClass(cd);
2416 mmd->setDefinition(def);
2418 mmd->addSectionsToDefinition(root->
anchors);
2419 mmd->setFromAnonymousScope(fromAnnScope);
2420 mmd->setFromAnonymousMember(fromAnnMemb);
2433 mmd->setMemberGroupId(root->
mGrpId);
2434 mmd->setMemberSpecifiers(root->
spec);
2435 mmd->setVhdlSpecifiers(root->
vhdlSpec);
2436 mmd->setReadAccessor(root->
read);
2437 mmd->setWriteAccessor(root->
write);
2439 mmd->setHidden(root->
hidden);
2441 mmd->setLanguage(root->
lang);
2442 mmd->setId(root->
id);
2445 mmd->setBodyDef(root->
fileDef());
2450 mmd->setRefItems(root->
sli);
2451 mmd->setRequirementReferences(root->
rqli);
2456 if (mtype==MemberType::Typedef)
2481 AUTO_TRACE(
"global variable: file='{}' type='{}' scope='{}' name='{}' args='{}' prot={} mtype={} lang={} init='{}'",
2487 if (mtype==MemberType::Typedef &&
Config_getBool(TYPEDEF_HIDES_STRUCT))
2493 static const reg::Ex re(R
"(\a\w*)");
2495 const std::string &typ = ttype.
str();
2517 if (scope.
find(
'@')!=-1)
return nullptr;
2533 if (root->
spec.isAlias())
2535 if (lang==SrcLangExt::Python)
2537 def=
"type "+nd->
name()+sep+name+args;
2541 def=
"using "+nd->
name()+sep+name;
2546 def=type+
" "+nd->
name()+sep+name+args;
2551 def=nd->
name()+sep+name+args;
2558 if (name.
at(0)==
'@')
2564 if (root->
spec.isAlias())
2566 if (root->
lang==SrcLangExt::Python)
2568 def=
"type "+root->
name+args;
2572 def=
"using "+root->
name;
2577 def=type+
" "+name+args;
2598 for (
const auto &imd : *mn)
2612 bool isPHPArray = md->
getLanguage()==SrcLangExt::PHP &&
2615 bool staticsInDifferentFiles =
2621 !staticsInDifferentFiles
2663 mmd->setTagInfo(root->
tagInfo());
2664 mmd->setMemberSpecifiers(root->
spec);
2665 mmd->setVhdlSpecifiers(root->
vhdlSpec);
2669 mmd->addSectionsToDefinition(root->
anchors);
2670 mmd->setFromAnonymousScope(fromAnnScope);
2671 mmd->setFromAnonymousMember(fromAnnMemb);
2682 mmd->setMemberGroupId(root->
mGrpId);
2683 mmd->setDefinition(def);
2684 mmd->setLanguage(root->
lang);
2685 mmd->setId(root->
id);
2693 mmd->setBodyDef(fd);
2698 mmd->setRefItems(root->
sli);
2699 mmd->setRequirementReferences(root->
rqli);
2702 mmd->setNamespace(nd);
2710 mmd->setFileDef(fd);
2716 if (mtype==MemberType::Typedef)
2738 if (lang == SrcLangExt::Fortran || lang == SrcLangExt::VHDL)
2743 static const reg::Ex re(R
"(\([^)]*[*&^][^)]*\))");
2745 size_t i=std::string::npos;
2749 i = match.position();
2752 if (i!=std::string::npos)
2754 size_t di = type.find(
"decltype(");
2755 if (di!=std::string::npos && di<i)
2757 i = std::string::npos;
2760 size_t bb=type.find(
'<');
2761 size_t be=type.rfind(
'>');
2762 bool templFp =
false;
2763 if (be!=std::string::npos) {
2764 size_t cc_ast = type.find(
"::*");
2765 size_t cc_amp = type.find(
"::&");
2766 templFp = (cc_ast != std::string::npos && cc_ast>be) || (cc_amp != std::string::npos && cc_amp>be);
2769 if (!type.empty() &&
2770 i!=std::string::npos &&
2771 type.find(
"operator")==std::string::npos &&
2772 (type.find(
")(")==std::string::npos || type.find(
"typedef ")!=std::string::npos) &&
2774 (!(bb<i && i<be) || templFp)
2777 if (pLength) *pLength=
static_cast<int>(l);
2780 return static_cast<int>(i);
2797 bool result =
false;
2798 bool typeIsClass =
false;
2799 bool typePtrType =
false;
2833 typePtrType = type.
find(
'*')!=-1 || type.
find(
'&')!=-1;
2836 typeIsClass = resolver.
resolveClass(ctx,type)!=
nullptr;
2838 if (!typeIsClass && (ti=type.
find(
'<'))!=-1)
2855 static const reg::Ex initChars(R
"([\d"'&*!^]+)");
2859 std::string name = a.
name.
str();
2860 if (
reg::search(name,match,initChars) && match.position()==0)
2892 std::string atype = a.
type.
str();
2893 if (
reg::search(atype,match,initChars) && match.position()==0)
2900 if (resType.empty()) resType=atype;
2901 static const reg::Ex idChars(R
"(\a\w*)");
2902 if (
reg::search(resType,match,idChars) && match.position()==0)
2904 resType=match.str();
2905 if (resType==
"int" || resType==
"long" ||
2906 resType==
"float" || resType==
"double" ||
2907 resType==
"char" || resType==
"void" ||
2908 resType==
"signed" || resType==
"unsigned" ||
2909 resType==
"const" || resType==
"volatile" )
2946 bool insideString=
FALSE;
2947 bool insideChar=
FALSE;
2949 while (e<len && brCount!=0)
2955 if (!insideString && !insideChar)
2957 if (e<len-1 && s.
at(e+1)==
'<')
2959 else if (roundCount==0)
2964 if (!insideString && !insideChar)
2966 if (e<len-1 && s.
at(e+1)==
'>')
2968 else if (roundCount==0)
2973 if (!insideString && !insideChar)
2977 if (!insideString && !insideChar)
2983 if (insideString && pc!=
'\\')
2992 if (insideChar && pc!=
'\\')
3002 return brCount==0 ?
static_cast<int>(e) : -1;
3011 AUTO_TRACE(
"VARIABLE_SEC: type='{}' name='{}' args='{}' bodyLine={} endBodyLine={} mGrpId={} relates='{}'",
3018 if (type.
isEmpty() && name.
find(
"operator")==-1 &&
3019 (name.
find(
'*')!=-1 || name.
find(
'&')!=-1))
3026 std::string sargs = args.
str();
3027 static const reg::Ex reName(R
"(\a\w*)");
3032 sargs = match.suffix().str();
3033 size_t j = sargs.find(
')');
3034 if (j!=std::string::npos) args=sargs.substr(0,j);
3044 int ai = type.
find(
'[',i);
3050 else if (type.
find(
')',i)!=-1)
3057 AUTO_TRACE_ADD(
"after correction: type='{}' name='{}' args='{}'",type,name,args);
3068 scope=name.
left(index);
3069 name=name.
mid(index+2);
3089 bool isRelated=
FALSE;
3090 bool isMemberOf=
FALSE;
3093 if (root->
lang==SrcLangExt::CSharp)
3106 for (
size_t i=0;i<name.
length()-1;i++)
3108 if (name[i]==
':' && name[i+1]==
':')
3110 p=
static_cast<int>(i);
3112 else if (name[i]==
'<')
3117 if (e!=-1) i=
static_cast<int>(e);
3123 if (type==
"friend class" || type==
"friend struct" ||
3124 type==
"friend union")
3138 Relationship::Member
3159 mtype=MemberType::EnumValue;
3161 mtype=MemberType::Typedef;
3163 mtype=MemberType::Friend;
3164 else if (root->
mtype==MethodTypes::Property)
3165 mtype=MemberType::Property;
3166 else if (root->
mtype==MethodTypes::Event)
3167 mtype=MemberType::Event;
3168 else if (type.
find(
"sequence<") != -1)
3169 mtype=sliceOpt ? MemberType::Sequence : MemberType::Typedef;
3170 else if (type.
find(
"dictionary<") != -1)
3171 mtype=sliceOpt ? MemberType::Dictionary : MemberType::Typedef;
3176 isMemberOf=(root->
relatesType==RelatesType::MemberOf);
3194 int si=scope.
find(
'@');
3198 Relationship relationship = isMemberOf ? Relationship::Foreign :
3199 isRelated ? Relationship::Related :
3200 Relationship::Member ;
3205 pScope = scope.
left(std::max(si-2,0));
3207 pScope.
prepend(annScopePrefix);
3208 else if (annScopePrefix.
length()>2)
3209 pScope=annScopePrefix.
left(annScopePrefix.
length()-2);
3210 if (name.
at(0)!=
'@')
3214 AUTO_TRACE_ADD(
"Adding member '{}' in anonymous scope to parent scope '{}'",name,pScope);
3230 if (mtype==MemberType::Variable)
3232 AUTO_TRACE_ADD(
"Adding member '{}' in anonymous scope to global scope",name);
3278 scope=rname.
left(index);
3279 rname=rname.
mid(index+2);
3291 for (
auto &imd : *mn)
3293 if (!imd->isTypedef())
3302 bool notBothGrouped = root->
groups.empty() || imd->getGroupDef()==
nullptr;
3303 bool bothSameScope = (!cd && !nd) || (cd && imd->getClassDef() == cd) || (nd && imd->getNamespaceDef() == nd);
3306 if (notBothGrouped && bothSameScope && imd->typeString()==rtype)
3354 for (
const auto &e : root->
children())
3355 if (!e->section.isEnum())
3372 for (
const auto &e : root->
children())
3373 if (!e->section.isEnum())
3390 for (
const auto &e : root->
children())
3391 if (!e->section.isEnum())
3406 (root->
section.isVariable() &&
3409 (root->
section.isFunction() &&
3412 (root->
section.isFunction() &&
3421 for (
const auto &e : root->
children())
3422 if (!e->section.isEnum())
3437 enum MemberType type = root->
section.isExportedInterface() ? MemberType::Interface : MemberType::Service;
3448 mmd->setTagInfo(root->
tagInfo());
3449 mmd->setMemberClass(cd);
3451 mmd->setDocsForDefinition(
false);
3455 mmd->setMemberSpecifiers(root->
spec);
3456 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3457 mmd->setMemberGroupId(root->
mGrpId);
3459 mmd->setLanguage(root->
lang);
3460 mmd->setBodyDef(fd);
3461 mmd->setFileDef(fd);
3462 mmd->addSectionsToDefinition(root->
anchors);
3464 mmd->setDefinition(def);
3468 AUTO_TRACE(
"Interface member: fileName='{}' type='{}' name='{}' mtype='{}' prot={} virt={} state={} proto={} def='{}'",
3476 root->
spec.isOptional() ? Protection::Protected : Protection::Public, Specifier::Normal);
3486 mmd->setRefItems(root->
sli);
3487 mmd->setRequirementReferences(root->
rqli);
3496 if (root->
section.isExportedInterface() || root->
section.isIncludedService())
3498 AUTO_TRACE(
"Exported interface/included service: type='{}' scope='{}' name='{}' args='{}'"
3499 " relates='{}' relatesType='{}' file='{}' line={} bodyLine={} #tArgLists={}"
3500 " mGrpId={} spec={} proto={} docFile='{}'",
3526 "Illegal member name found.");
3532 case SrcLangExt::Unknown:
3533 case SrcLangExt::IDL:
3562 if (isFriend) mtype=MemberType::Friend;
3563 else if (root->
mtype==MethodTypes::Signal) mtype=MemberType::Signal;
3564 else if (root->
mtype==MethodTypes::Slot) mtype=MemberType::Slot;
3565 else if (root->
mtype==MethodTypes::DCOP) mtype=MemberType::DCOP;
3570 if ((fd==
nullptr || fd->
getLanguage()==SrcLangExt::Cpp) &&
3572 (i=name.
find(
'<'))!=-1 &&
3573 (j=name.
find(
'>'))!=-1 &&
3574 (j!=i+2 || name.
at(i+1)!=
'=')
3592 root->
relatesType==RelatesType::MemberOf ? Relationship::Foreign :
3593 Relationship::Related ;
3603 mmd->setTagInfo(root->
tagInfo());
3604 mmd->setMemberClass(cd);
3606 mmd->setDocsForDefinition(!root->
proto);
3610 mmd->setMemberSpecifiers(spec);
3611 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3612 mmd->setMemberGroupId(root->
mGrpId);
3614 mmd->setLanguage(root->
lang);
3615 mmd->setRequiresClause(root->
req);
3616 mmd->setId(root->
id);
3617 mmd->setBodyDef(fd);
3618 mmd->setFileDef(fd);
3619 mmd->addSectionsToDefinition(root->
anchors);
3624 if (scopeSeparator!=
"::")
3626 qualScope =
substitute(qualScope,
"::",scopeSeparator);
3628 if (lang==SrcLangExt::PHP)
3631 scopeSeparator=
"::";
3648 def=type+
" "+qualScope+scopeSeparator+name;
3652 def=qualScope+scopeSeparator+name;
3656 mmd->setDefinition(def);
3660 AUTO_TRACE(
"function member: type='{}' scope='{}' name='{}' args='{}' proto={} def='{}'",
3661 type, qualScope, rname, args, root->
proto, def);
3671 mmd->setRefItems(root->
sli);
3672 mmd->setRequirementReferences(root->
rqli);
3692 MemberType::Function,
3696 mmd->setTagInfo(root->
tagInfo());
3697 mmd->setLanguage(root->
lang);
3698 mmd->setId(root->
id);
3703 mmd->setDocsForDefinition(!root->
proto);
3709 mmd->addSectionsToDefinition(root->
anchors);
3710 mmd->setMemberSpecifiers(root->
spec);
3711 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3712 mmd->setMemberGroupId(root->
mGrpId);
3713 mmd->setRequiresClause(root->
req);
3748 def=root->
type+
" "+scope+name;
3754 AUTO_TRACE(
"new non-member function type='{}' scope='{}' name='{}' args='{}' proto={} def='{}'",
3756 mmd->setDefinition(def);
3760 mmd->setRefItems(root->
sli);
3761 mmd->setRequirementReferences(root->
rqli);
3765 mmd->setNamespace(nd);
3772 mmd->setFileDef(fd);
3793 if (root->
section.isFunction())
3795 AUTO_TRACE(
"member function: type='{}' scope='{}' name='{}' args='{}' relates='{}' relatesType='{}'"
3796 " file='{}' line={} bodyLine={} #tArgLists={} mGrpId={}"
3797 " spec={} proto={} docFile='{}'",
3802 bool isFriend=root->
type==
"friend" || root->
type.
find(
"friend ")!=-1;
3812 scope=rname.
left(index);
3813 rname=rname.
mid(index+2);
3822 if (root->
lang==SrcLangExt::CSharp)
3833 int memIndex=rname.
findRev(
"::");
3836 if (cd && scope+
"::"==rname.
left(scope.
length()+2))
3842 bool isMember=
FALSE;
3845 int ts=rname.
find(
'<');
3846 int te=rname.
find(
'>');
3847 if (memIndex>0 && (ts==-1 || te==-1))
3864 isMember=memIndex<ts || memIndex>te;
3904 for (
const auto &imd : *mn)
3917 fullScope.
prepend(parentScope);
3923 if (mnd) nsName = mnd->
name();
3924 if (rnd) rnsName = rnd->
name();
3932 bool sameTemplateArgs =
TRUE;
3933 bool matchingReturnTypes =
TRUE;
3934 bool sameRequiresClause =
TRUE;
3940 matchingReturnTypes =
FALSE;
3944 sameRequiresClause =
FALSE;
3950 sameTemplateArgs =
FALSE;
3953 bool staticsInDifferentFiles =
3956 if (sameTemplateArgs &&
3957 matchingReturnTypes &&
3958 sameRequiresClause &&
3959 !staticsInDifferentFiles &&
3966 if (!root->
groups.empty() && !root->
groups.front().groupname.isEmpty())
3973 found=(mnd && rnd && nsName==rnsName) ||
3974 ((mnd==
nullptr && rnd==
nullptr && mfd!=
nullptr &&
3979 if (!found && gd && gd==md->
getGroupDef() && nsName==rnsName)
3985 AUTO_TRACE_ADD(
"combining function with prototype found={} in namespace '{}'",found,nsName);
4087 "Illegal member name found."
4105 for (
const auto &ifmd : *fn)
4109 for (
const auto &immd : *mn)
4125 AUTO_TRACE_ADD(
"Merging related global and member '{}' isFriend={} isRelated={} isFunction={}",
4202 for (
const auto &imdec : *mn)
4210 for (
const auto &imdef : *mn)
4213 if (mdef && mdec!=mdef &&
4233 for (
const auto &imd : *mn)
4249 if (mdef && mdec)
break;
4257 mdec->getOuterScope(),mdec->getFileDef(),mdec->typeString(),
const_cast<ArgumentList*
>(&mdecAl),
4264 mdec->mergeReferences(mdef);
4266 mdec->mergeReferencedBy(mdef);
4283 for (
const auto &imd : *mn)
4294 for (
const auto &irmd : *rmn)
4328 size_t i=qualifiedName.rfind(
"::");
4329 if (i!=std::string::npos)
4331 QCString scope = qualifiedName.substr(0,i);
4332 QCString name = qualifiedName.substr(i+2);
4336 for (
const auto &imd : *mn)
4362 std::map<std::string,int> templateNames;
4364 for (
const Argument &arg : templateArguments)
4366 static const reg::Ex re(R
"(\a[\w:]*)");
4369 for (; it!=
end ; ++it)
4371 const auto &match = *it;
4372 std::string n = match.str();
4373 if (n==arg.name.str())
4375 if (templateNames.find(n)==templateNames.end())
4377 templateNames.emplace(n,count);
4382 return templateNames;
4397 if (context && cd!=context)
4402 if (result==
nullptr)
4407 if (result==
nullptr)
4436 for (
auto &mi : *mni)
4446 type = typedefValue;
4465 usedClassName = typeCd->
name();
4475 if (templateNames.empty())
4479 BaseInfo bi(usedName,Protection::Public,Specifier::Normal);
4484 if (arg.name==usedName)
4488 if (usedCd==
nullptr)
4539 if (!found && !type.
isEmpty())
4598 if (templateNames.empty())
4636 AUTO_TRACE(
"Derived from template '{}' with parameters '{}' isArtificial={}",
4637 templateClass->
name(),templSpec,isArtificial);
4640 bool existingClass = templSpec==tempArgsStr;
4641 if (existingClass)
return;
4643 bool freshInstance=
FALSE;
4660 for (
auto it=it_pair.first ; it!=it_pair.second ; ++it)
4662 const Entry *templateRoot = it->second;
4663 AUTO_TRACE_ADD(
"template root found '{}' templSpec='{}'",templateRoot->
name,templSpec);
4669 isArtificial,templArgs.get(),templateNames);
4688 int ti=ttype.
find(
'<');
4694 templateClassName,
true,
true);
4695 AUTO_TRACE_ADD(
"templateClassName={} baseClass={}",templateClassName,baseClass?baseClass->
name():
"<none>");
4714 int index=n.
find(
'<');
4726 int l =
static_cast<int>(name.
length());
4732 while (count>0 && i>=0)
4737 case '>':
if (!insideQuote) count++;
break;
4738 case '<':
if (!insideQuote) count--;
break;
4739 case '\'':
if (!insideQuote) insideQuote=c;
4740 else if (insideQuote==c && (i<0 || name[i]!=
'\\')) insideQuote=0;
4742 case '"':
if (!insideQuote) insideQuote=c;
4743 else if (insideQuote==c && (i<0 || name[i]!=
'\\')) insideQuote=0;
4763 AUTO_TRACE(
"name={} base={} isArtificial={} mode={}",cd->
name(),bi->
name,isArtificial,(
int)mode);
4766 bool explicitGlobalScope=
FALSE;
4770 explicitGlobalScope=
TRUE;
4774 bool lastParent=
FALSE;
4779 int scopeOffset=explicitGlobalScope ? 0 :
static_cast<int>(scopeName.
length());
4788 baseClassName.
prepend(scopeName.
left(scopeOffset)+
"::");
4790 if (root->
lang==SrcLangExt::CSharp)
4817 || explicitGlobalScope
4820 || (root->
lang==SrcLangExt::IDL &&
4821 (root->
section.isExportedInterface() ||
4822 root->
section.isIncludedService()))
4825 AUTO_TRACE_ADD(
"class relation '{}' inherited/used by '{}' found prot={} virt={} templSpec='{}'",
4826 baseClassName, root->
name, bi->
prot, bi->
virt, templSpec);
4829 int si=baseClassName.
findRev(
"::",i);
4831 if (baseClass==
nullptr &&
static_cast<size_t>(i)!=baseClassName.
length())
4841 baseClassName = baseClassName.
left(i)+baseClassName.
right(baseClassName.
length()-e);
4852 else if (baseClass && !templSpec.
isEmpty())
4863 baseClass = templClass;
4871 if (!found && si!=-1)
4881 found=baseClass!=
nullptr && baseClass!=cd;
4891 found = baseClass!=
nullptr && baseClass!=cd;
4903 found = baseClass!=
nullptr && baseClass!=cd;
4906 bool isATemplateArgument = templateNames.find(biName.
str())!=templateNames.end();
4911 AUTO_TRACE_ADD(
"Documented base class '{}' templSpec='{}'",biName,templSpec);
4929 if (baseClassTypeDef==
nullptr)
4939 if (baseClassTypeDef)
4948 AUTO_TRACE_ADD(
"insertBaseClass name={} prot={} virt={} templSpec={}",usedName,prot,bi->
virt,templSpec);
4956 "Detected potential recursive class relation "
4957 "between class {} and base class {}!",
4964 else if (mode==
Undocumented && (scopeOffset==0 || isATemplateArgument))
4966 AUTO_TRACE_ADD(
"New undocumented base class '{}' baseClassName='{}' templSpec='{}' isArtificial={}",
4967 biName,baseClassName,templSpec,isArtificial);
4969 if (isATemplateArgument)
4972 if (baseClass==
nullptr)
4991 if (baseClass==
nullptr)
5002 si = baseClassName.
findRev(
"::");
5018 biName=
"<"+biName.
left(biName.
length()-2)+
">";
5022 AUTO_TRACE_ADD(
"insertBaseClass name={} prot={} virt={} templSpec={}",biName,bi->
prot,bi->
virt,templSpec);
5032 if (scope!=baseClass)
5058 "Detected potential recursive class relation "
5059 "between class {} and base class {}!",
5060 root->
name,baseClassName
5071 else if ((scopeOffset=scopeName.
findRev(
"::",scopeOffset-1))==-1)
5076 }
while (scopeOffset>=0);
5078 if (parentNode==
nullptr)
5084 parentNode=parentNode->
parent();
5086 }
while (lastParent);
5106 bool hasExtends = !root->
extends.empty();
5107 if (hasExtends)
return TRUE;
5131 if ((root->
lang==SrcLangExt::CSharp || root->
lang==SrcLangExt::Java) &&
5132 (i=bName.
find(
'<'))!=-1)
5136 if (root->
lang==SrcLangExt::CSharp)
5142 bName = bName.
left(i);
5174 if (i!=-1 && j!=-1 && k==-1 && root->
lang!=SrcLangExt::CSharp && root->
lang!=SrcLangExt::Java)
5207 if (!nd->hasDocumentation())
5210 nd->getLanguage() == SrcLangExt::Fortran) &&
5214 warn_undoc(nd->getDefFileName(),nd->getDefLine(),
"{} {} is not documented.",
5215 nd->getLanguage() == SrcLangExt::Fortran ?
"Module" :
"Namespace",
5279 for (
const auto &tn_kv : templateNames)
5281 size_t templIndex = tn_kv.second;
5283 bool hasActArg=
FALSE;
5284 if (templIndex<templArgs->size())
5286 actArg=templArgs->at(templIndex);
5290 baseClassNames.find(actArg.
type.
str())!=baseClassNames.end() &&
5291 actualTemplateNames.find(actArg.
type.
str())==actualTemplateNames.end()
5294 actualTemplateNames.emplace(actArg.
type.
str(),
static_cast<int>(templIndex));
5329 for (
const auto &fd : *fn)
5331 fd->computeAnchors();
5344 gd->computeAnchors();
5351template<
typename Func>
5374 for (
const auto &fd : *fn)
5447 if (md==
nullptr)
return;
5448 AUTO_TRACE(
"scope='{}' name='{}' args='{}' funcDecl='{}' mSpec={}",
5463 fullName = cd->
name();
5465 fullName = nd->
name();
5467 if (!fullName.
isEmpty()) fullName+=
"::";
5468 fullName+=md->
name();
5573 "member {} belongs to two different groups. The second one found here will be ignored.",
5611 return allowNoGroup;
5614 for (
const auto &g : root->
groups)
5616 if (g.groupname == gd->
name())
5639 AUTO_TRACE(
"namespace='{}' type='{}' name='{}' tempArg='{}' decl='{}'",namespaceName,type,name,tempArg,decl);
5653 for (
const auto &md : *mn)
5664 if (md->isAlias() && md->getOuterScope() &&
5671 nd = md->getNamespaceDef();
5676 if (nd && md->isEnumValue() && (enumNamePos=namespaceName.
findRev(
"::"))!=-1)
5678 QCString enumName = namespaceName.
mid(enumNamePos+2);
5679 if (namespaceName.
left(enumNamePos)==nd->
name())
5684 for (
const auto &emd : *enumMn)
5686 found = emd->isStrong() && md->getEnumScope()==emd.get();
5700 else if (nd==
nullptr && md->isEnumValue())
5705 for (
const auto &emd : *enumMn)
5707 found = emd->isStrong() && md->getEnumScope()==emd.get();
5730 if ((namespaceName.
isEmpty() && nd==
nullptr) ||
5731 (nd && nd->
name()==namespaceName) ||
5735 AUTO_TRACE_ADD(
"Try to add member '{}' to scope '{}'",md->name(),namespaceName);
5743 md->isVariable() || md->isTypedef() ||
5744 matchArguments2(md->getOuterScope(),md->getFileDef(),md->typeString(),&mdAl,
5751 if (matching && !root->
tArgLists.empty())
5770 if (matching && md->isStatic() &&
5771 md->getDefFileName()!=root->
fileName &&
5779 if (!md->templateArguments().empty() && !root->
tArgLists.empty())
5784 if (md->templateArguments().size()!=root->
tArgLists.back().size() ||
5785 md->typeString()!=type ||
5786 md->requiresClause()!=root->
req)
5802 if (!found && root->
relatesType!=RelatesType::Duplicate && root->
section.isFunction())
5806 QCString warnMsg =
"no matching file member found for \n"+fullFuncDecl;
5809 warnMsg+=
"\nPossible candidates:";
5810 for (
const auto &md : *mn)
5814 warnMsg+=
"' " +
warn_line(md->getDefFileName(),md->getDefLine());
5822 if (root->
type!=
"friend class" &&
5823 root->
type!=
"friend struct" &&
5824 root->
type!=
"friend union" &&
5825 root->
type!=
"friend" &&
5831 "documented symbol '{}' was not declared or defined.",
qPrint(decl)
5843 auto srcIt = srcTempArgLists.begin();
5844 auto dstIt = dstTempArgLists.begin();
5845 while (srcIt!=srcTempArgLists.end() && dstIt!=dstTempArgLists.end())
5847 if ((*srcIt).size()!=(*dstIt).size())
return TRUE;
5861 result = cd->templateArguments().hasParameters() || cd->templateMaster()!=
nullptr ||
5871 const std::string &src
5875 static const reg::Ex re(R
"(\a\w*)");
5880 for (; it!=
end ; ++it)
5882 const auto &match = *it;
5883 size_t i = match.position();
5884 size_t l = match.length();
5886 dst+=src.substr(p,i-p);
5887 std::string name=match.str();
5889 auto srcIt = srcTempArgLists.begin();
5890 auto dstIt = dstTempArgLists.begin();
5891 while (srcIt!=srcTempArgLists.end() && !found)
5894 std::vector<Argument>::const_iterator tdaIt;
5895 if (dstIt!=dstTempArgLists.end())
5898 tdaIt = tdAli->
begin();
5903 for (
auto tsaIt = tsaLi.
begin(); tsaIt!=tsaLi.
end() && !found; ++tsaIt)
5907 if (tdAli && tdaIt!=tdAli->
end())
5923 else if (tdaType.
startsWith(
"typename ")) vc=9;
5926 tdaName = tdaType.
mid(vc);
5959 auto dstIt = dst.
begin();
5964 if (dstIt == dst.
end())
5968 da.
array = dstArray;
5976 da.
array = dstArray;
5984 srcTempArgLists,dstTempArgLists,
6010 funcType,funcName,funcArgs,exceptions,
6014 mmd->setTagInfo(root->
tagInfo());
6015 mmd->setLanguage(root->
lang);
6016 mmd->setId(root->
id);
6017 mmd->makeImplementationDetail();
6018 mmd->setMemberClass(cd);
6019 mmd->setDefinition(funcDecl);
6025 mmd->setDocsForDefinition(!root->
proto);
6027 mmd->addSectionsToDefinition(root->
anchors);
6031 mmd->setMemberSpecifiers(spec);
6032 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6033 mmd->setMemberGroupId(root->
mGrpId);
6036 mmd->setRefItems(root->
sli);
6037 mmd->setRequirementReferences(root->
rqli);
6073 bool memFound=
FALSE;
6074 for (
const auto &imd : *mn)
6077 if (md==
nullptr)
continue;
6079 if (cd==
nullptr)
continue;
6096 if (!namespaceName.
isEmpty()) fullScope.
prepend(namespaceName+
"::");
6097 if (fullScope==cd->
name())
6103 for (
const auto &emd : *enumMn)
6105 memFound = emd->isStrong() && md->
getEnumScope()==emd.get();
6111 if (memFound)
break;
6116 if (memFound)
break;
6134 if (!templAl.
empty())
6136 declTemplArgs.push_back(templAl);
6144 bool substDone=
false;
6151 if (declTemplArgs.size()>0 && declTemplArgs.size()==defTemplArgs.size())
6174 AUTO_TRACE_ADD(
"matching '{}'<=>'{}' className='{}' namespaceName='{}' result={}",
6203 AUTO_TRACE_ADD(
"Comparing return types '{}'<->'{}' #args {}<->{}",
6211 else if (defTemplArgs.size()>declTemplArgs.size())
6213 AUTO_TRACE_ADD(
"Different number of template arguments {} vs {}",defTemplArgs.size(),declTemplArgs.size());
6219 bool rootIsUserDoc = root->
section.isMemberDoc();
6222 bool classOrMdIsTemplate = mdIsTemplate || classIsTemplate;
6223 bool rootIsTemplate = !root->
tArgLists.empty();
6225 if (!rootIsUserDoc &&
6226 (mdIsTemplate || rootIsTemplate) &&
6227 ((classOrMdIsTemplate && !rootIsTemplate) || (!classOrMdIsTemplate && rootIsTemplate))
6232 AUTO_TRACE_ADD(
"Comparing return types: template v.s. non-template");
6236 AUTO_TRACE_ADD(
"Match results of matchArguments2='{}' substDone='{}'",matching,substDone);
6247 if (!funcTempList.
isEmpty() &&
6267 else if (cd && cd!=tcd)
6273 if (memFound)
break;
6277 addLocalObjCMethod(root,scopeName,funcType,funcName,funcArgs,exceptions,funcDecl,spec);
6280 if (count==0 && !(isFriend && funcType==
"class"))
6283 const ClassDef *ecd =
nullptr, *ucd =
nullptr;
6284 MemberDef *emd =
nullptr, *umd =
nullptr;
6286 for (
const auto &md : *mn)
6308 AUTO_TRACE_ADD(
"new candidate className='{}' scope='{}' args='{}': exact match",
6309 className,ccd->
name(),md->argsString());
6315 AUTO_TRACE_ADD(
"new candidate className='{}' scope='{}' args='{}': no match",
6316 className,ccd->
name(),md->argsString());
6321 bool strictProtoMatching =
Config_getBool(STRICT_PROTO_MATCHING);
6322 if (!strictProtoMatching)
6324 if (candidates==1 && ucd && umd)
6331 else if (candidates>1 && ecd && emd)
6342 if (noMatchCount>1) warnMsg+=
"uniquely ";
6343 warnMsg+=
"matching class member found for \n";
6347 warnMsg+=
" template ";
6356 warnMsg+=fullFuncDecl;
6358 if (candidates>0 || noMatchCount>=1)
6360 warnMsg+=
"\nPossible candidates:";
6366 for (
const auto &md : *mn)
6368 const ClassDef *cd=md->getClassDef();
6382 warnMsg+=
"template ";
6387 if (!md->typeString().isEmpty())
6389 warnMsg+=md->typeString();
6394 warnMsg+=qScope+
"::"+md->name();
6395 warnMsg+=md->argsString();
6396 warnMsg+=
"' " +
warn_line(md->getDefFileName(),md->getDefLine());
6417 AUTO_TRACE(
"funcType={} funcName={} funcArgs={} funcDecl={} spec={}",funcType,funcName,funcArgs,funcDecl,spec);
6419 for (
const auto &md : *mn)
6421 if (md->getClassDef()==cd)
6433 funcType,funcName,funcArgs,exceptions,
6439 mmd->setTagInfo(root->
tagInfo());
6440 mmd->setLanguage(root->
lang);
6441 mmd->setId(root->
id);
6442 mmd->setMemberClass(cd);
6443 mmd->setTemplateSpecialization(
TRUE);
6445 mmd->setDefinition(funcDecl);
6451 mmd->setDocsForDefinition(!root->
proto);
6453 mmd->addSectionsToDefinition(root->
anchors);
6457 mmd->setMemberSpecifiers(spec);
6458 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6459 mmd->setMemberGroupId(root->
mGrpId);
6461 mmd->setRefItems(root->
sli);
6462 mmd->setRequirementReferences(root->
rqli);
6476 bool sameClass=
false;
6481 [](
const auto &md1,
const auto &md2)
6482 { return md1->getClassDef()->name()==md2->getClassDef()->name(); });
6488 if (cd==
nullptr)
return;
6491 if (root->
mtype==MethodTypes::Signal) mtype=MemberType::Signal;
6492 else if (root->
mtype==MethodTypes::Slot) mtype=MemberType::Slot;
6493 else if (root->
mtype==MethodTypes::DCOP) mtype=MemberType::DCOP;
6496 std::unique_ptr<ArgumentList> tArgList =
6501 funcType,funcName,funcArgs,exceptions,
6505 mmd->setTagInfo(root->
tagInfo());
6506 mmd->setLanguage(root->
lang);
6507 mmd->setId(root->
id);
6509 mmd->setMemberClass(cd);
6510 mmd->setDefinition(funcDecl);
6519 mmd->setDocsForDefinition(!root->
proto);
6521 mmd->addSectionsToDefinition(root->
anchors);
6525 mmd->setMemberSpecifiers(spec);
6526 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6527 mmd->setMemberGroupId(root->
mGrpId);
6530 mmd->setRefItems(root->
sli);
6531 mmd->setRequirementReferences(root->
rqli);
6589 AUTO_TRACE(
"root='{}' funcDecl='{}' related='{}' overload={} isFunc={} mGrpId={} #tArgList={} spec={} lang={}",
6602 bool isRelated=
false;
6603 bool isMemberOf=
false;
6604 bool isFriend=
false;
6617 spec.setInline(
true);
6622 spec.setExplicit(
true);
6627 spec.setMutable(
true);
6632 spec.setThreadLocal(
true);
6643 while ((sep=funcDecl.
find(
';'))!=-1)
6649 if (!funcDecl.
isEmpty() && funcDecl[0]!=
' ') funcDecl.
prepend(
" ");
6661 if (isFriend && funcDecl.
startsWith(
"class "))
6665 funcName = funcDecl;
6667 else if (isFriend && funcDecl.
startsWith(
"struct "))
6670 funcName = funcDecl;
6676 funcArgs,funcTempList,exceptions
6684 AUTO_TRACE_ADD(
"scopeName='{}' className='{}' namespaceName='{}' funcType='{}' funcName='{}' funcArgs='{}'",
6685 scopeName,className,namespaceName,funcType,funcName,funcArgs);
6689 isMemberOf=(root->
relatesType == RelatesType::MemberOf);
6696 scopeName = relates;
6709 scopeName = joinedName;
6723 QCString joinedName = fnd->name()+
"::"+scopeName;
6726 scopeName=joinedName;
6753 AUTO_TRACE_ADD(
"scopeName='{}' className='{}' namespaceName='{}'",scopeName,className,namespaceName);
6762 scopeName=namespaceName;
6764 else if (!relates.
isEmpty() ||
6767 scopeName=namespaceName+
"::"+className;
6771 scopeName=className;
6774 else if (!className.
isEmpty())
6776 scopeName=className;
6786 uint32_t argListIndex=0;
6791 tempScopeName=scopeName+funcSpec;
6799 if (!scopeName.
isEmpty() && !isRelated && !isFriend && !
Config_getBool(HIDE_SCOPE_NAMES) && root->
lang!=SrcLangExt::Python)
6805 funcDecl=funcType+
" "+tempScopeName+
"::"+funcName+funcTempList;
6809 funcDecl=funcType+
" "+tempScopeName+
"::"+funcName+funcArgs;
6816 funcDecl=tempScopeName+
"::"+funcName+funcTempList;
6820 funcDecl=tempScopeName+
"::"+funcName+funcArgs;
6830 funcDecl=funcType+
" "+funcName+funcTempList;
6834 funcDecl=funcType+
" "+funcName+funcArgs;
6841 funcDecl=funcName+funcTempList;
6845 funcDecl=funcName+funcArgs;
6850 if (funcType==
"template class" && !funcTempList.
isEmpty())
6853 AUTO_TRACE_ADD(
"Parse results: namespaceName='{}' className=`{}` funcType='{}' funcSpec='{}' "
6854 " funcName='{}' funcArgs='{}' funcTempList='{}' funcDecl='{}' relates='{}'"
6855 " exceptions='{}' isRelated={} isMemberOf={} isFriend={} isFunc={}",
6856 namespaceName, className, funcType, funcSpec,
6857 funcName, funcArgs, funcTempList, funcDecl, relates,
6858 exceptions, isRelated, isMemberOf, isFriend, isFunc);
6864 bool strongEnum =
false;
6868 for (
const auto &imd : *mn)
6881 namespaceName+=
"::"+className;
6885 namespaceName=className;
6893 funcName =
substitute(funcName,className+
"::",
"");
6904 if (!isRelated && !strongEnum && mn)
6912 funcArgs,funcTempList,exceptions,
6913 type,args,isFriend,spec,relates,funcDecl,overloaded,isFunc);
6925 else if (overloaded)
6927 addOverloaded(root,mn,funcType,funcName,funcArgs,funcDecl,exceptions,spec);
6931 if (!
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec))
6936 "Cannot determine class for function\n{}",
6942 else if (isRelated && !relates.
isEmpty())
6944 AUTO_TRACE_ADD(
"related function scopeName='{}' className='{}'",scopeName,className);
6945 if (className.
isEmpty()) className=relates;
6949 bool newMember=
TRUE;
6955 for (
const auto &imd : *mn)
6989 mn->
push_back(std::move(mdDefineTaken));
7003 for (
const auto &irmd : *mn)
7024 addMemberDocs(root,rmd_found,funcDecl,
nullptr,overloaded,spec);
7032 switch (root->
mtype)
7034 case MethodTypes::Method: mtype = MemberType::Function;
break;
7035 case MethodTypes::Signal: mtype = MemberType::Signal;
break;
7036 case MethodTypes::Slot: mtype = MemberType::Slot;
break;
7037 case MethodTypes::DCOP: mtype = MemberType::DCOP;
break;
7038 case MethodTypes::Property: mtype = MemberType::Property;
break;
7039 case MethodTypes::Event: mtype = MemberType::Event;
break;
7053 funcType,funcName,funcArgs,exceptions,
7056 isMemberOf ? Relationship::Foreign : Relationship::Related,
7076 mmd->setDefinitionTemplateParameterLists(root->
tArgLists);
7078 mmd->setTagInfo(root->
tagInfo());
7092 for (
const auto &irmd : *rmn)
7123 mmd->setBodyDef(fd);
7130 mmd->setMemberClass(cd);
7131 mmd->setMemberSpecifiers(spec);
7132 mmd->setVhdlSpecifiers(root->
vhdlSpec);
7133 mmd->setDefinition(funcDecl);
7138 mmd->setDocsForDefinition(!root->
proto);
7141 mmd->addSectionsToDefinition(root->
anchors);
7142 mmd->setMemberGroupId(root->
mGrpId);
7143 mmd->setLanguage(root->
lang);
7144 mmd->setId(root->
id);
7148 mmd->setRefItems(root->
sli);
7149 mmd->setRequirementReferences(root->
rqli);
7150 if (root->
relatesType==RelatesType::Duplicate) mmd->setRelatedAlso(cd);
7158 if (!
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec))
7163 "Cannot determine file/namespace for relatedalso function\n{}",
7177 addLocalObjCMethod(root,scopeName,funcType,funcName,funcArgs,exceptions,funcDecl,spec);
7181 bool globMem =
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec);
7182 if (className.
isEmpty() && !globMem)
7186 else if (!className.
isEmpty() && !globMem)
7189 "member '{}' of class '{}' cannot be found",
7190 funcName,className);
7208 AUTO_TRACE(
"root->type='{}' root->inside='{}' root->name='{}' root->args='{}' section={} root->spec={} root->mGrpId={}",
7223 type=type.
left(i+l);
7234 if (root->
section.isMemberDoc())
7260 else if (root->
section.isOverloadDoc())
7274 (root->
section.isVariable() &&
7286 if (type==
"friend class" || type==
"friend struct" ||
7287 type==
"friend union")
7293 type+
" "+root->
name,
7326 else if (root->
section.isVariableDoc())
7338 else if (root->
section.isExportedInterface() ||
7339 root->
section.isIncludedService())
7345 type +
" " + root->
name,
7358 if (root->
section.isMemberDoc() ||
7359 root->
section.isOverloadDoc() ||
7362 root->
section.isVariableDoc() ||
7364 root->
section.isIncludedService() ||
7365 root->
section.isExportedInterface()
7375 for (
const auto &e : root->
children())
7377 if (!e->section.isEnum())
7389 for (
const auto &objCImpl : root->
children())
7391 if (objCImpl->section.isObjcImpl())
7393 for (
const auto &objCMethod : objCImpl->children())
7395 if (objCMethod->section.isFunction())
7399 objCMethod->relates,
7402 objCMethod->type+
" "+objCImpl->name+
"::"+objCMethod->name+
" "+objCMethod->args,
7404 objCMethod->section=EntryType::makeEmpty();
7423 bool isGlobal =
false;
7424 bool isRelated =
false;
7425 bool isMemberOf =
false;
7435 if (root->
lang==SrcLangExt::CSharp)
7458 isMemberOf=(root->
relatesType==RelatesType::MemberOf);
7493 isMemberOf ? Relationship::Foreign : isRelated ? Relationship::Related : Relationship::Member,
7494 MemberType::Enumeration,
7497 mmd->setTagInfo(root->
tagInfo());
7498 mmd->setLanguage(root->
lang);
7499 mmd->setId(root->
id);
7500 if (!isGlobal) mmd->setMemberClass(cd);
else mmd->setFileDef(fd);
7502 mmd->setBodyDef(root->
fileDef());
7503 mmd->setMemberSpecifiers(root->
spec);
7504 mmd->setVhdlSpecifiers(root->
vhdlSpec);
7505 mmd->setEnumBaseType(root->
args);
7508 mmd->addSectionsToDefinition(root->
anchors);
7509 mmd->setMemberGroupId(root->
mGrpId);
7513 mmd->setRefItems(root->
sli);
7514 mmd->setRequirementReferences(root->
rqli);
7528 mmd->setDefinition(name+baseType);
7532 mmd->setDefinition(nd->
name()+
"::"+name+baseType);
7536 mmd->setNamespace(nd);
7543 if (isGlobal && (nd==
nullptr || !nd->
isAnonymous()))
7545 if (!defSet) mmd->setDefinition(name+baseType);
7546 if (fd==
nullptr && root->
parent())
7552 mmd->setFileDef(fd);
7560 mmd->setDefinition(name+baseType);
7564 mmd->setDefinition(cd->
name()+
"::"+name+baseType);
7570 mmd->setDocsForDefinition(!root->
proto);
7600 bool isGlobal =
false;
7601 bool isRelated =
false;
7611 if (root->
lang==SrcLangExt::CSharp)
7626 if (root->
lang==SrcLangExt::CSharp)
7672 struct EnumValueInfo
7674 EnumValueInfo(
const QCString &n,std::unique_ptr<MemberDef> &&md) :
7675 name(n), member(std::move(md)) {}
7677 std::unique_ptr<MemberDef> member;
7679 std::vector< EnumValueInfo > extraMembers;
7681 for (
const auto &imd : *mn)
7688 for (
const auto &e : root->
children())
7691 bool isJavaLike = sle==SrcLangExt::CSharp || sle==SrcLangExt::Java || sle==SrcLangExt::XML;
7692 if ( isJavaLike || root->
spec.isStrong())
7694 if (sle == SrcLangExt::Cpp && e->section.isDefine())
continue;
7701 i = qualifiedName.
findRev(
"::");
7702 if (i!=-1 && sle==SrcLangExt::CSharp)
7708 qualifiedName=
substitute(qualifiedName,
"::",
".");
7713 if (fileName.
isEmpty() && e->tagInfo())
7715 fileName = e->tagInfo()->tagName;
7719 fileName,e->startLine,e->startColumn,
7720 e->type,e->name,e->args,
QCString(),
7721 e->protection, Specifier::Normal,e->isStatic,Relationship::Member,
7728 fmmd->setNamespace(mnd);
7732 fmmd->setTagInfo(e->tagInfo());
7733 fmmd->setLanguage(e->lang);
7734 fmmd->setBodySegment(e->startLine,e->bodyLine,e->endBodyLine);
7735 fmmd->setBodyDef(e->fileDef());
7737 fmmd->setDocumentation(e->doc,e->docFile,e->docLine);
7738 fmmd->setBriefDescription(e->brief,e->briefFile,e->briefLine);
7739 fmmd->addSectionsToDefinition(e->anchors);
7740 fmmd->setInitializer(e->initializer.str());
7741 fmmd->setMaxInitLines(e->initLines);
7742 fmmd->setMemberGroupId(e->mGrpId);
7743 fmmd->setExplicitExternal(e->explicitExternal,fileName,e->startLine,e->startColumn);
7744 fmmd->setRefItems(e->sli);
7745 fmmd->setRequirementReferences(e->rqli);
7748 fmmd->setEnumScope(md,
TRUE);
7749 extraMembers.emplace_back(e->name,std::move(fmd));
7758 if (!e->name.isEmpty() && (fmn=emnsd->
find(e->name)))
7761 for (
const auto &ifmd : *fmn)
7792 else if (isRelated && cd)
7824 for (
auto &e : extraMembers)
7870 if (gd==
nullptr && !root->
groups.empty())
7884 for (
const auto &g : root->
groups)
7903 "Found non-existing group '{}' for the command '{}', ignoring command",
7917 if (root->
section.isEnumDoc() &&
7943 AUTO_TRACE(
"Found docs for enum with name '{}' and scope '{}' in context '{}' cd='{}', nd='{}' fd='{}'",
7957 for (
const auto &imd : *mn)
7972 else if (cd==
nullptr && mcd==
nullptr && nd!=
nullptr && mnd==nd)
7979 else if (cd==
nullptr && nd==
nullptr && mcd==
nullptr && mnd==
nullptr && fd==mfd)
8004 for (
const auto &mn : mnsd)
8007 for (
const auto &imd : *mn)
8012 int documentedEnumValues=0;
8016 if (fmd->isLinkableInProject()) documentedEnumValues++;
8042 for (
const auto &md : *mn)
8044 index.addClassMemberNameToIndex(md.get());
8045 if (md->getModuleDef())
8047 index.addModuleMemberNameToIndex(md.get());
8055 for (
const auto &md : *mn)
8057 if (md->getNamespaceDef())
8059 index.addNamespaceMemberNameToIndex(md.get());
8063 index.addFileMemberNameToIndex(md.get());
8065 if (md->getModuleDef())
8067 index.addModuleMemberNameToIndex(md.get());
8072 index.sortMemberIndexLists();
8081 if (cd->isLinkableInProject())
8094 if (cd->isLinkableInProject())
8107 if (nd->isLinkableInProject())
8120 for (
const auto &fd : *fn)
8136 std::string s = title.str();
8137 static const reg::Ex re(R
"(\a[\w-]*)");
8140 for (; it!=
end ; ++it)
8142 const auto &match = *it;
8143 std::string matchStr = match.str();
8151 if (gd->isLinkableInProject())
8153 addWordsForTitle(gd.get(),gd->anchor(),gd->groupTitle());
8159 if (pd->isLinkableInProject())
8161 addWordsForTitle(pd.get(),pd->anchor(),pd->title());
8181 if (md->getClassDef())
8185 if (md->getNamespaceDef())
8196 if (md->getGroupDef()) scope = md->getGroupDef();
8197 else if (md->getClassDef()) scope = md->getClassDef();
8198 else if (md->getNamespaceDef()) scope = md->getNamespaceDef();
8199 else if (md->getFileDef()) scope = md->getFileDef();
8205 if (md->isLinkableInProject())
8207 if (!(md->isEnumerate() && md->isAnonymous()))
8212 if (md->isEnumerate())
8214 for (
const auto &fmd : md->enumFieldList())
8227 for (
const auto &md : *mn)
8229 addMemberToIndices(md.get());
8236 for (
const auto &md : *mn)
8238 addMemberToIndices(md.get());
8251 for (
const auto &imd : *mn)
8264 for (
const auto &imd : *mn)
8281 for (
const auto &imd : *mn)
8290 const auto &bmni = bmn.
find(mn->memberName());
8293 for (
const auto &ibmd : *bmni)
8301 lang==SrcLangExt::Python ||
8302 lang==SrcLangExt::Java ||
8303 lang==SrcLangExt::PHP ||
8314 lang==SrcLangExt::Python ||
8321 if (lang==SrcLangExt::Python && md->
name().
startsWith(
"__"))
continue;
8361 if (cd->isLinkable())
8363 for (
const auto &bcd : cd->baseClasses())
8379 for (
const auto &ti : cd->getTemplateInstances())
8398 int i=cd->name().find(
'(');
8405 AUTO_TRACE_ADD(
"merging members of category {} into {}",cd->name(),baseClass->
name());
8420 cd->subClasses().empty() &&
8421 !cd->baseClasses().empty())
8452 msg(
"Generating code for file {}...\n",fd->
docName());
8457 else if (parseSources)
8459 msg(
"Parsing code for file {}...\n",fd->
docName());
8475 for (
const auto &fd : *fn)
8483 for (
const auto &fd : *fn)
8492 clangParser->parse();
8493 processSourceFile(fd.get(),*
g_outputList,clangParser.get());
8495 for (
auto incFile : clangParser->filesInSameTU())
8497 if (filesToProcess.find(incFile)!=filesToProcess.end() &&
8499 processedFiles.
find(incFile)==processedFiles.end())
8506 processSourceFile(ifd,*
g_outputList,clangParser.get());
8507 processedFiles.insert(incFile);
8518 for (
const auto &fd : *fn)
8520 if (processedFiles.find(fd->
absFilePath().
str())==processedFiles.end())
8525 clangParser->parse();
8526 processSourceFile(fd.get(),*
g_outputList,clangParser.get());
8539 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8542 msg(
"Generating code files using {} threads.\n",numThreads);
8543 struct SourceContext
8546 : fd(fd_), generateSourceFile(gen_), ol(ol_) {}
8548 bool generateSourceFile;
8552 std::vector< std::future< std::shared_ptr<SourceContext> > > results;
8555 for (
const auto &fd : *fn)
8558 auto ctx = std::make_shared<SourceContext>(fd.get(),generateSourceFile,*
g_outputList);
8559 auto processFile = [ctx]()
8561 if (ctx->generateSourceFile)
8563 msg(
"Generating code for file {}...\n",ctx->fd->docName());
8567 msg(
"Parsing code for file {}...\n",ctx->fd->docName());
8570 ctx->fd->getAllIncludeFilesRecursively(filesInSameTu);
8571 if (ctx->generateSourceFile)
8573 ctx->fd->writeSourceHeader(ctx->ol);
8574 ctx->fd->writeSourceBody(ctx->ol,
nullptr);
8575 ctx->fd->writeSourceFooter(ctx->ol);
8580 ctx->fd->parseSource(
nullptr);
8584 results.emplace_back(threadPool.
queue(processFile));
8587 for (
auto &f : results)
8596 for (
const auto &fd : *fn)
8616 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8622 : fd(fd_), ol(ol_) {}
8627 std::vector< std::future< std::shared_ptr<DocContext> > > results;
8630 for (
const auto &fd : *fn)
8632 bool doc = fd->isLinkableInProject();
8635 auto ctx = std::make_shared<DocContext>(fd.get(),*
g_outputList);
8636 auto processFile = [ctx]() {
8637 msg(
"Generating docs for file {}...\n",ctx->fd->docName());
8638 ctx->fd->writeDocumentation(ctx->ol);
8641 results.emplace_back(threadPool.
queue(processFile));
8645 for (
auto &f : results)
8654 for (
const auto &fd : *fn)
8656 bool doc = fd->isLinkableInProject();
8659 msg(
"Generating docs for file {}...\n",fd->docName());
8678 const_cast<FileDef*
>(fd)->addSourceRef(cd->getStartDefLine(),cd.get(),
nullptr);
8687 const_cast<FileDef*
>(fd)->addSourceRef(cd->getStartDefLine(),cd.get(),
nullptr);
8696 const_cast<FileDef*
>(fd)->addSourceRef(nd->getStartDefLine(),nd.get(),
nullptr);
8703 for (
const auto &md : *mn)
8712 md->isLinkableInProject() &&
8718 const_cast<FileDef*
>(fd)->addSourceRef(md->getStartDefLine(),md->getOuterScope(),md.get());
8724 for (
const auto &md : *mn)
8734 md->isLinkableInProject() &&
8740 const_cast<FileDef*
>(fd)->addSourceRef(md->getStartDefLine(),md->getOuterScope(),md.get());
8752 for (
const auto &md : *mn)
8763 for (
const auto &md : *mn)
8785 for (
const auto &def : it->second)
8788 def.fileName,def.lineNr,def.columnNr,
8789 "#define",def.name,def.args,
QCString(),
8790 Protection::Public,Specifier::Normal,
FALSE,Relationship::Member,MemberType::Define,
8794 if (!def.args.isEmpty())
8798 mmd->setInitializer(def.definition);
8799 mmd->setFileDef(def.fileDef);
8800 mmd->setDefinition(
"#define "+def.name);
8805 const MemberList *defMl = def.fileDef->getMemberList(MemberListType::DocDefineMembers());
8814 def.fileDef->insertMember(md.get());
8816 AUTO_TRACE_ADD(
"adding macro {} with definition {}",def.name,def.definition);
8850 for (
const auto &fd : *fn)
8852 fd->sortMemberLists();
8859 gd->sortMemberLists();
8876 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8880 std::vector < std::future< void > > results;
8884 for (
const auto &def : symList)
8887 if (dm && !
isSymbolHidden(def) && !def->isArtificial() && def->isLinkableInProject())
8889 auto processTooltip = [dm]() {
8892 results.emplace_back(threadPool.
queue(processTooltip));
8897 for (
auto &f : results)
8906 for (
const auto &def : symList)
8909 if (dm && !
isSymbolHidden(def) && !def->isArtificial() && def->isLinkableInProject())
8956 for (
const auto &fd : *fn)
8978 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8984 : cd(cd_), ol(ol_) {}
8989 std::vector< std::future< std::shared_ptr<DocContext> > > results;
8990 for (
const auto &cd : classList)
8993 if (cd->getOuterScope()==
nullptr ||
8997 auto ctx = std::make_shared<DocContext>(cd,*
g_outputList);
8998 auto processFile = [ctx]()
9000 msg(
"Generating docs for compound {}...\n",ctx->cd->displayName());
9004 if (!ctx->cd->isHidden() && !ctx->cd->isEmbeddedInOuterScope() &&
9005 ctx->cd->isLinkableInProject() && !ctx->cd->isImplicitTemplateInstance())
9007 ctx->cd->writeDocumentation(ctx->ol);
9008 ctx->cd->writeMemberList(ctx->ol);
9012 ctx->cd->writeDocumentationForInnerClasses(ctx->ol);
9015 results.emplace_back(threadPool.
queue(processFile));
9018 for (
auto &f : results)
9025 for (
const auto &cd : classList)
9029 if (cd->getOuterScope()==
nullptr ||
9035 if ( !cd->isHidden() && !cd->isEmbeddedInOuterScope() &&
9036 cd->isLinkableInProject() && !cd->isImplicitTemplateInstance())
9038 msg(
"Generating docs for compound {}...\n",cd->displayName());
9053 for (
const auto &innerCdi : cd->
getClasses())
9058 AUTO_TRACE(
"innerCd={} isLinkable={} isImplicitTemplateInstance={} protectLevelVisible={} embeddedInOuterScope={}",
9067 list.push_back(innerCd);
9075 std::vector<ClassDefMutable*> classList;
9124 for (
const auto &imd : *mn)
9160 for (
const auto &fd : *fn)
9162 fd->combineUsingRelations();
9194 for (
const auto &fd : *fn)
9196 fd->addMembersToMemberGroup();
9211 gd->addMembersToMemberGroup();
9232 for (
const auto &fd : *fn)
9234 fd->distributeMemberGroupDocumentation();
9249 gd->distributeMemberGroupDocumentation();
9279 for (
const auto &fd : *fn)
9281 fd->findSectionsInDocumentation();
9296 gd->findSectionsInDocumentation();
9301 pd->findSectionsInDocumentation();
9306 dd->findSectionsInDocumentation();
9329 for (
const auto &ifmd : *fn)
9343 for (
const auto &imd : *nm)
9374 for (
const auto &imd : *nm)
9394 return fd->absFilePath() == root->
fileName;
9439 Protection::Public,Specifier::Normal,
FALSE,Relationship::Member,MemberType::Define,
9442 mmd->setTagInfo(root->
tagInfo());
9443 mmd->setLanguage(root->
lang);
9455 for (
const auto &md : *mn)
9457 if (md->memberType()==MemberType::Define) count++;
9461 for (
const auto &imd : *mn)
9464 if (md && md->
memberType()==MemberType::Define)
9479 for (
const auto &imd : *mn)
9482 if (md && md->
memberType()==MemberType::Define)
9506 warn(root->
fileName,root->
startLine,
"found documented #define {} but ignoring it because ENABLE_PREPROCESSING is NO.", root->
name);
9520 normalizedName =
substitute(normalizedName,
"\\",
"/");
9523 if (root->
docFile==normalizedName)
9525 int lastSlashPos=normalizedName.
findRev(
'/');
9526 if (lastSlashPos!=-1)
9528 normalizedName=normalizedName.
left(lastSlashPos);
9531 if (normalizedName.
at(normalizedName.
length()-1)!=
'/')
9533 normalizedName+=
'/';
9535 DirDef *matchingDir=
nullptr;
9539 if (dir->name().right(normalizedName.
length())==normalizedName)
9544 "\\dir command matches multiple directories.\n"
9545 " Applying the command for directory {}\n"
9546 " Ignoring the command for directory {}",
9547 matchingDir->
name(),dir->name()
9552 matchingDir=dir.get();
9569 warn(root->
fileName,root->
startLine,
"No matching directory found for command \\dir {}",normalizedName);
9578 if (root->
section.isRequirementDoc())
9590 if (root->
section.isPageDoc())
9597 else if (root->
section.isMainpageDoc())
9617 if (root->
section.isMainpageDoc())
9650 else if (si->
lineNr() != -1)
9652 warn(root->
fileName,root->
startLine,
"multiple use of section label '{}' for main page, (first occurrence: {}, line {})",
9657 warn(root->
fileName,root->
startLine,
"multiple use of section label '{}' for main page, (first occurrence: {})",
9674 else if (root->
tagInfo()==
nullptr)
9677 "found more than one \\mainpage comment block! (first occurrence: {}, line {}), Skipping current block!",
9687 if (root->
section.isMainpageDoc())
9711 term(
"page defined {} with label {} is a direct "
9712 "subpage of itself! Please remove this cyclic dependency.\n",
9736 term(
"page defined {} with label {} is a subpage "
9737 "of itself! Please remove this cyclic dependency.\n",
9738 warn_line(pd->docFile(),pd->docLine()),pd->name());
9764 if (si->label().left(label.
length())==label)
9766 si->setFileName(rl->listName());
9767 si->setGenerated(
TRUE);
9773 if (!si->generated())
9777 if (!si->fileName().isEmpty() &&
9784 if (si->definition())
9791 gd = (
toMemberDef(si->definition()))->getGroupDef();
9821 if (!pd->getGroupDef() && !pd->isReference())
9823 msg(
"Generating docs for page {}...\n",pd->name());
9838 warn(root->
fileName,root->
startLine,
"Example {} was already documented. Ignoring documentation found here.",root->
name);
9866 indentStr.
fill(
' ',indent);
9868 indentStr.
isEmpty()?
"":indentStr,
9873 for (
const auto &e : root->
children())
9891 si->label(),si->fileName(),si->title(),si->type().level(),si->ref());
9905 msg(
"Generating docs for example {}...\n",pd->name());
9907 if (lang != SrcLangExt::Unknown)
9911 intf->resetCodeParserState();
9913 QCString n=pd->getOutputFileBase();
9920 if (pd->showLineNo())
9922 lineNoOptStr=
"{lineno}";
9928 (pd->briefDescription().isEmpty()?
"":pd->briefDescription()+
"\n\n")+
9929 pd->documentation()+
"\n\n\\include"+lineNoOptStr+
" "+pd->name(),
9931 .setIndexWords(
true)
9932 .setExample(pd->name()));
9945 if (!gd->isReference())
9957 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
9963 : cdm(cdm_), ol(ol_) {}
9968 std::vector< std::future< std::shared_ptr<DocContext> > > results;
9970 for (
const auto &cd : classList)
9975 auto ctx = std::make_shared<DocContext>(cdm,*
g_outputList);
9976 auto processFile = [ctx]()
9978 if ( ( ctx->cdm->isLinkableInProject() &&
9979 !ctx->cdm->isImplicitTemplateInstance()
9982 && !ctx->cdm->isHidden() && !ctx->cdm->isEmbeddedInOuterScope()
9985 msg(
"Generating docs for compound {}...\n",ctx->cdm->displayName());
9986 ctx->cdm->writeDocumentation(ctx->ol);
9987 ctx->cdm->writeMemberList(ctx->ol);
9989 ctx->cdm->writeDocumentationForInnerClasses(ctx->ol);
9992 results.emplace_back(threadPool.
queue(processFile));
9996 for (
auto &f : results)
10004 for (
const auto &cd : classList)
10009 if ( ( cd->isLinkableInProject() &&
10010 !cd->isImplicitTemplateInstance()
10013 && !cd->isHidden() && !cd->isEmbeddedInOuterScope()
10016 msg(
"Generating docs for compound {}...\n",cd->displayName());
10030 for (
const auto &cd : conceptList)
10035 msg(
"Generating docs for concept {}...\n",cd->name());
10050 if (nd->isLinkableInProject())
10055 msg(
"Generating docs for namespace {}\n",nd->displayName());
10093 QCString cmd=qhgLocation+
" -v 2>&1";
10098 err(
"could not execute {}\n",qhgLocation);
10102 const size_t bufSize = 1024;
10103 char inBuf[bufSize+1];
10104 size_t numRead=fread(inBuf,1,bufSize,f);
10105 inBuf[numRead] =
'\0';
10110 static const reg::Ex versionReg(R
"(Qt (\d+)\.(\d+)\.(\d+))");
10112 std::string s = inBuf;
10119 if (qtVersion>0 && (qtVersion<60000 || qtVersion >= 60205))
10128 err(
"could not execute {}\n",qhgLocation);
10132 std::string output;
10133 while ((numRead=fread(inBuf,1,bufSize,f))>0)
10135 inBuf[numRead] =
'\0';
10167 warn_uncond(
"the dot tool could not be found as '{}'\n",dotPath);
10173 size_t l=dotPath.
length();
10174 for (
size_t i=0;i<l;i++)
if (dotPath.
at(i)==
'/') dotPath.
at(i)=
'\\';
10193 bool updateOnly=
FALSE)
10197 bool writeToStdout=configFile==
"-";
10202 if (!writeToStdout)
10206 msg(
"\n\nConfiguration file '{}' created.\n\n",configFile);
10207 msg(
"Now edit the configuration file and enter\n\n");
10208 if (configFile!=
"Doxyfile" && configFile!=
"doxyfile")
10209 msg(
" doxygen {}\n\n",configFile);
10211 msg(
" doxygen\n\n");
10212 msg(
"to generate the documentation for your project\n\n");
10216 msg(
"\n\nConfiguration file '{}' updated.\n\n",configFile);
10222 term(
"Cannot open file {} for writing\n",configFile);
10237 term(
"Cannot open stdout for writing\n");
10248 int eqPos = tagLine.
find(
'=');
10258 fileName = tagLine;
10264 err(
"Tag file '{}' does not exist or is not a file. Skipping it...\n",fileName);
10275 msg(
"Reading tag file '{}', location '{}'...\n",fileName,destName);
10279 msg(
"Reading tag file '{}'...\n",fileName);
10289 for (
const auto &sheet : latexExtraStyleSheet)
10291 std::string fileName = sheet;
10292 if (!fileName.empty())
10297 err(
"Style sheet '{}' specified by LATEX_EXTRA_STYLESHEET does not exist!\n",fileName);
10299 else if (fi.
isDir())
10301 err(
"Style sheet '{}' specified by LATEX_EXTRA_STYLESHEET is a directory, it has to be a file!\n", fileName);
10320 if (!htmlStyleSheet.
isEmpty())
10327 err(
"Style sheet '{}' specified by HTML_STYLESHEET does not exist!\n",htmlStyleSheet);
10330 else if (fi.
isDir())
10332 err(
"Style sheet '{}' specified by HTML_STYLESHEET is a directory, it has to be a file!\n",htmlStyleSheet);
10338 copyFile(htmlStyleSheet,destFileName);
10343 for (
const auto &sheet : htmlExtraStyleSheet)
10351 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET does not exist!\n",fileName);
10355 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET is already a built-in stylesheet. Please use a different name\n",fi.
fileName());
10357 else if (fi.
isDir())
10359 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET is a directory, it has to be a file!\n",fileName);
10378 err(
"Project logo '{}' specified by PROJECT_LOGO does not exist!\n",projectLogo);
10381 else if (fi.
isDir())
10383 err(
"Project logo '{}' specified by PROJECT_LOGO is a directory, it has to be a file!\n",projectLogo);
10389 copyFile(projectLogo,destFileName);
10403 err(
"Project icon '{}' specified by PROJECT_ICON does not exist!\n",projectIcon);
10406 else if (fi.
isDir())
10408 err(
"Project icon '{}' specified by PROJECT_ICON is a directory, it has to be a file!\n",projectIcon);
10414 copyFile(projectIcon,destFileName);
10422 for (
const auto &fileName : files)
10424 if (!fileName.empty())
10429 err(
"Extra file '{}' specified in {} does not exist!\n", fileName,filesOption);
10431 else if (fi.
isDir())
10433 err(
"Extra file '{}' specified in {} is a directory, it has to be a file!\n", fileName,filesOption);
10459 std::vector<FileEntry> fileEntries;
10460 for (
const auto &fd : *fn)
10462 if (!fd->isReference())
10464 fileEntries.emplace_back(fd->getPath(),fd.get());
10468 size_t size = fileEntries.size();
10472 FileDef *fd = fileEntries[0].fileDef;
10478 std::stable_sort(fileEntries.begin(),
10480 [](
const FileEntry &fe1,
const FileEntry &fe2)
10481 { return qstricmp_sort(fe1.path,fe2.path)<0; }
10486 const FileEntry &first = fileEntries[0];
10487 const FileEntry &last = fileEntries[size-1];
10488 int first_path_size =
static_cast<int>(first.path.size())-1;
10489 int last_path_size =
static_cast<int>(last.path.size())-1;
10492 for (i=0;i<first_path_size && i<last_path_size;i++)
10494 if (first.path[i]==
'/') j=i;
10495 if (first.path[i]!=last.path[i])
break;
10497 if (i==first_path_size && i<last_path_size && last.path[i]==
'/')
10502 else if (i==last_path_size && i<first_path_size && first.path[i]==
'/')
10509 for (
auto &fileEntry : fileEntries)
10511 QCString prefix = fileEntry.path.right(fileEntry.path.length()-j-1);
10512 fileEntry.fileDef->setName(
prefix+fn->fileName());
10514 fileEntry.fileDef->setDiskName(
prefix+fn->fileName());
10528 int sep = fileName.
findRev(
'/');
10529 int ei = fileName.
findRev(
'.');
10530 if (ei!=-1 && (sep==-1 || ei>sep))
10536 extension =
".no_extension";
10549 int ei = fileName.
findRev(
'.');
10556 extension =
".no_extension";
10560 std::string preBuf;
10567 for (
const auto &s : includePath)
10573 msg(
"Preprocessing {}...\n",fn);
10580 msg(
"Reading {}...\n",fn);
10585 std::string convBuf;
10586 convBuf.reserve(preBuf.size()+1024);
10591 std::shared_ptr<Entry> fileRoot = std::make_shared<Entry>();
10595 if (newTU) clangParser->
parse();
10598 parser.
parseInput(fileName,convBuf.
data(),fileRoot,clangParser);
10599 fileRoot->setFileDef(fd);
10616 filesToProcess.insert(s);
10619 std::mutex processedFilesLock;
10621 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10622 msg(
"Processing input using {} threads.\n",numThreads);
10624 using FutureType = std::vector< std::shared_ptr<Entry> >;
10625 std::vector< std::future< FutureType > > results;
10628 bool ambig =
false;
10635 auto processFile = [qs,&filesToProcess,&processedFilesLock,&processedFiles]() {
10636 bool ambig_l =
false;
10637 std::vector< std::shared_ptr<Entry> > roots;
10641 auto fileRoot {
parseFile(*parser.get(),fd_l,qs,clangParser.get(),
true) };
10642 roots.push_back(fileRoot);
10646 for (
auto incFile : clangParser->filesInSameTU())
10649 if (filesToProcess.find(incFile)!=filesToProcess.end())
10651 bool needsToBeProcessed =
false;
10653 std::lock_guard<std::mutex> lock(processedFilesLock);
10654 needsToBeProcessed = processedFiles.find(incFile)==processedFiles.end();
10655 if (needsToBeProcessed) processedFiles.insert(incFile);
10657 if (qincFile!=qs && needsToBeProcessed)
10663 fileRoot =
parseFile(*parser.get(),ifd,qincFile,clangParser.get(),
false);
10664 roots.push_back(fileRoot);
10672 results.emplace_back(threadPool.
queue(processFile));
10676 for (
auto &f : results)
10681 root->moveToSubEntryAndKeep(e);
10688 if (processedFiles.find(s)==processedFiles.end())
10691 auto processFile = [s]() {
10692 bool ambig =
false;
10694 std::vector< std::shared_ptr<Entry> > roots;
10701 auto fileRoot =
parseFile(*parser.get(),fd,qs,clangParser.get(),
true);
10702 roots.push_back(fileRoot);
10706 auto fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
10707 roots.push_back(fileRoot);
10711 results.emplace_back(threadPool.
queue(processFile));
10715 for (
auto &f : results)
10720 root->moveToSubEntryAndKeep(e);
10727 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10728 msg(
"Processing input using {} threads.\n",numThreads);
10730 using FutureType = std::shared_ptr<Entry>;
10731 std::vector< std::future< FutureType > > results;
10735 auto processFile = [s]() {
10736 bool ambig =
false;
10740 auto fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
10744 results.emplace_back(threadPool.
queue(processFile));
10747 for (
auto &f : results)
10749 root->moveToSubEntryAndKeep(f.get());
10767 filesToProcess.insert(s);
10773 bool ambig =
false;
10781 auto fileRoot =
parseFile(*parser.get(),fd,qs,clangParser.get(),
true);
10782 root->moveToSubEntryAndKeep(fileRoot);
10783 processedFiles.insert(s);
10787 for (
auto incFile : clangParser->filesInSameTU())
10790 if (filesToProcess.find(incFile)!=filesToProcess.end() &&
10791 processedFiles.find(incFile)==processedFiles.end())
10797 fileRoot =
parseFile(*parser.get(),ifd,incFile,clangParser.get(),
false);
10798 root->moveToSubEntryAndKeep(fileRoot);
10799 processedFiles.insert(incFile);
10808 if (processedFiles.find(s)==processedFiles.end())
10810 bool ambig =
false;
10817 auto fileRoot =
parseFile(*parser.get(),fd,qs,clangParser.get(),
true);
10818 root->moveToSubEntryAndKeep(fileRoot);
10823 std::shared_ptr<Entry> fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
10824 root->moveToSubEntryAndKeep(fileRoot);
10826 processedFiles.insert(s);
10835 bool ambig =
false;
10840 std::shared_ptr<Entry> fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
10841 root->moveToSubEntryAndKeep(std::move(fileRoot));
10861 sepPos = result.
find(
'/',2);
10863 sepPos = result.
find(
'/',sepPos+1);
10865 sepPos = result.
find(
'/',sepPos+1);
10868 if (nonSymlinks.find(
prefix.str())==nonSymlinks.end())
10885 target+=result.
mid(sepPos);
10888 if (known.find(result.
str())!=known.end())
return std::string();
10889 known.insert(result.
str());
10902 nonSymlinks.insert(
prefix.str());
10908 while (sepPos!=-1);
10927 bool errorIfNotExist,
10934 if (paths && !dirName.empty())
10936 paths->insert(dirName);
10942 if (dirName.empty())
10957 msg(
"Searching for files in directory {}\n", fi->
absFilePath());
10962 for (
const auto &dirEntry : dir.
iterator())
10965 auto checkPatterns = [&]() ->
bool
10967 return (patList==
nullptr ||
patternMatch(cfi,*patList)) &&
10968 (exclPatList==
nullptr || !
patternMatch(cfi,*exclPatList)) &&
10969 (killSet==
nullptr || killSet->find(cfi.
absFilePath())==killSet->end());
10972 if (exclSet==
nullptr || exclSet->find(cfi.
absFilePath())==exclSet->end())
10980 if (errorIfNotExist && checkPatterns())
10985 else if (cfi.
isFile() && checkPatterns())
10988 std::string path=cfi.
dirPath()+
"/";
10989 std::string fullName=path+name;
10996 fn = fnMap->
add(name);
10997 fn->push_back(std::move(fd));
11000 dirResultList.push_back(fullName);
11001 if (resultSet) resultSet->insert(fullName);
11002 if (killSet) killSet->insert(fullName);
11004 else if (recursive &&
11006 (exclPatList==
nullptr || !
patternMatch(cfi,*exclPatList)) &&
11011 patList,exclPatList,&dirResultList,resultSet,errorIfNotExist,
11012 recursive,killSet,paths);
11016 if (resultList && !dirResultList.empty())
11019 std::stable_sort(dirResultList.begin(),
11020 dirResultList.end(),
11021 [](
const auto &f1,
const auto &f2) { return qstricmp_sort(f1.c_str(),f2.c_str())<0; });
11024 resultList->insert(resultList->end(), dirResultList.begin(), dirResultList.end());
11041 bool errorIfNotExist,
11055 if (exclSet==
nullptr || exclSet->find(fi.
absFilePath())==exclSet->end())
11062 if (errorIfNotExist)
11064 warn_uncond(
"source '{}' is not a readable file or directory... skipping.\n",s);
11069 std::string dirPath = fi.
dirPath(
true);
11071 if (paths && !dirPath.empty())
11073 paths->insert(dirPath);
11076 if (killSet==
nullptr || killSet->find(filePath)==killSet->end())
11085 fn->push_back(std::move(fd));
11088 if (resultList || resultSet)
11090 if (resultList) resultList->push_back(filePath);
11091 if (resultSet) resultSet->insert(filePath);
11097 else if (fi.
isDir())
11099 readDir(&fi,fnMap,exclSet,patList,
11100 exclPatList,resultList,resultSet,errorIfNotExist,
11101 recursive,killSet,paths);
11115 anchor=
":"+md->
anchor();
11124 t <<
"REPLACE INTO symbols (symbol_id,scope_id,name,file,line) VALUES('"
11125 << fn+anchor <<
"','"
11127 << d->
name() <<
"','"
11141 for (
const auto &def : symList)
11153 msg(
"Developer parameters:\n");
11154 msg(
" -m dump symbol map\n");
11155 msg(
" -b making messages output unbuffered\n");
11156 msg(
" -c <file> process input file as a comment block and produce HTML output\n");
11158 msg(
" -t [<file|stdout|stderr>] trace debug info to file, stdout, or stderr (default file stdout)\n");
11159 msg(
" -t_time [<file|stdout|stderr>] trace debug info to file, stdout, or stderr (default file stdout),\n"
11160 " and include time and thread information\n");
11162 msg(
" -d <level> enable a debug level, such as (multiple invocations of -d are possible):\n");
11173 QCString versionString = getFullVersion();
11174 msg(
"{}\n",versionString);
11178 if (!extVers.
isEmpty()) extVers+=
", ";
11179 extVers +=
"sqlite3 ";
11180 extVers += sqlite3_libversion();
11182 if (!extVers.
isEmpty()) extVers+=
", ";
11183 extVers +=
"clang support ";
11184 extVers += CLANG_VERSION_STRING;
11188 int lastComma = extVers.
findRev(
',');
11189 if (lastComma != -1) extVers = extVers.
replace(lastComma,1,
" and");
11190 msg(
" with {}.\n",extVers);
11201 msg(
"Doxygen version {0}\nCopyright Dimitri van Heesch 1997-2025\n\n"
11202 "You can use Doxygen in a number of ways:\n\n"
11203 "1) Use Doxygen to generate a template configuration file*:\n"
11204 " {1} [-s] -g [configName]\n\n"
11205 "2) Use Doxygen to update an old configuration file*:\n"
11206 " {1} [-s] -u [configName]\n\n"
11207 "3) Use Doxygen to generate documentation using an existing "
11208 "configuration file*:\n"
11209 " {1} [configName]\n\n"
11210 "4) Use Doxygen to generate a template file controlling the layout of the\n"
11211 " generated documentation:\n"
11212 " {1} -l [layoutFileName]\n\n"
11213 " In case layoutFileName is omitted DoxygenLayout.xml will be used as filename.\n"
11214 " If - is used for layoutFileName Doxygen will write to standard output.\n\n"
11215 "5) Use Doxygen to generate a template style sheet file for RTF, HTML or Latex.\n"
11216 " RTF: {1} -w rtf styleSheetFile\n"
11217 " HTML: {1} -w html headerFile footerFile styleSheetFile [configFile]\n"
11218 " LaTeX: {1} -w latex headerFile footerFile styleSheetFile [configFile]\n\n"
11219 "6) Use Doxygen to generate a rtf extensions file\n"
11220 " {1} -e rtf extensionsFile\n\n"
11221 " If - is used for extensionsFile Doxygen will write to standard output.\n\n"
11222 "7) Use Doxygen to compare the used configuration file with the template configuration file\n"
11223 " {1} -x [configFile]\n\n"
11224 " Use Doxygen to compare the used configuration file with the template configuration file\n"
11225 " without replacing the environment variables or CMake type replacement variables\n"
11226 " {1} -x_noenv [configFile]\n\n"
11227 "8) Use Doxygen to show a list of built-in emojis.\n"
11228 " {1} -f emoji outputFileName\n\n"
11229 " If - is used for outputFileName Doxygen will write to standard output.\n\n"
11230 "*) If -s is specified the comments of the configuration items in the config file will be omitted.\n"
11231 " If configName is omitted 'Doxyfile' will be used as a default.\n"
11232 " If - is used for configFile Doxygen will write / read the configuration to /from standard output / input.\n\n"
11233 "If -q is used for a Doxygen documentation run, Doxygen will see this as if QUIET=YES has been set.\n\n"
11234 "-v print version string, -V print extended version information\n"
11235 "-h,-? prints usage help information\n"
11236 "{1} -d prints additional usage flags for debugging purposes\n",versionString,name);
11243static const char *
getArg(
int argc,
char **argv,
int &optInd)
11246 if (
qstrlen(&argv[optInd][2])>0)
11247 s=&argv[optInd][2];
11248 else if (optInd+1<argc && argv[optInd+1][0]!=
'-')
11267 return []() {
return std::make_unique<T>(); };
11275 std::setlocale(LC_ALL,
"");
11276 std::setlocale(LC_CTYPE,
"C");
11277 std::setlocale(LC_NUMERIC,
"C");
11375 QCString versionString = getFullVersion();
11378 auto writeFile = [](
const char *fileName,std::function<void(
TextStream&)> func) ->
bool
11398 bool genConfig=
false;
11399 bool shortList=
false;
11400 bool traceTiming=
false;
11402 bool updateConfig=
false;
11403 bool quiet =
false;
11404 while (optInd<argc && argv[optInd][0]==
'-' &&
11405 (isalpha(argv[optInd][1]) || argv[optInd][1]==
'?' ||
11406 argv[optInd][1]==
'-')
11409 switch(argv[optInd][1])
11419 if (optInd+1>=argc)
11421 layoutName=
"DoxygenLayout.xml";
11425 layoutName=argv[optInd+1];
11433 if (optInd+1>=argc)
11435 msg(
"option \"-c\" is missing the file name to read\n");
11460 msg(
"option \"-d\" has unknown debug specifier: \"{}\".\n",debugLabel);
11470 if (!strcmp(argv[optInd]+1,
"t_time"))
11472 traceTiming =
true;
11474 else if (!strcmp(argv[optInd]+1,
"t"))
11476 traceTiming =
false;
11480 err(
"option should be \"-t\" or \"-t_time\", found: \"{}\".\n",argv[optInd]);
11484 if (optInd+1>=argc || argv[optInd+1][0] ==
'-')
11486 traceName=
"stdout";
11490 traceName=argv[optInd+1];
11494 err(
"support for option \"-t\" has not been compiled in (use a debug build or a release build with tracing enabled).\n");
11505 err(
"option should be \"-x\" or \"-x_noenv\", found: \"{}\".\n",argv[optInd]);
11521 err(
"option \"-e\" is missing format specifier rtf.\n");
11527 if (optInd+1>=argc)
11529 err(
"option \"-e rtf\" is missing an extensions file name\n");
11537 err(
"option \"-e\" has invalid format specifier.\n");
11547 err(
"option \"-f\" is missing list specifier.\n");
11553 if (optInd+1>=argc)
11555 err(
"option \"-f emoji\" is missing an output file name\n");
11563 err(
"option \"-f\" has invalid list specifier.\n");
11573 err(
"option \"-w\" is missing format specifier rtf, html or latex\n");
11579 if (optInd+1>=argc)
11581 err(
"option \"-w rtf\" is missing a style sheet file name\n");
11587 err(
"error opening RTF style sheet file {}!\n",argv[optInd+1]);
11597 if (optInd+4<argc ||
FileInfo(
"Doxyfile").exists() ||
FileInfo(
"doxyfile").exists())
11603 err(
"error opening or reading configuration file {}!\n",argv[optInd+4]);
11608 if (optInd+3>=argc)
11610 err(
"option \"-w html\" does not have enough arguments\n");
11627 if (optInd+4<argc ||
FileInfo(
"Doxyfile").exists() ||
FileInfo(
"doxyfile").exists())
11632 err(
"error opening or reading configuration file {}!\n",argv[optInd+4]);
11637 if (optInd+3>=argc)
11639 err(
"option \"-w latex\" does not have enough arguments\n");
11655 err(
"Illegal format specifier \"{}\": should be one of rtf, html or latex\n",formatName);
11675 if (
qstrcmp(&argv[optInd][2],
"help")==0)
11677 usage(argv[0],versionString);
11680 else if (
qstrcmp(&argv[optInd][2],
"version")==0)
11686 else if ((
qstrcmp(&argv[optInd][2],
"Version")==0) ||
11687 (
qstrcmp(&argv[optInd][2],
"VERSION")==0))
11695 err(
"Unknown option \"-{}\"\n",&argv[optInd][1]);
11696 usage(argv[0],versionString);
11701 setvbuf(stdout,
nullptr,_IONBF,0);
11708 usage(argv[0],versionString);
11712 err(
"Unknown option \"-{:c}\"\n",argv[optInd][1]);
11713 usage(argv[0],versionString);
11724 TRACE(
"Doxygen version used: {}",getFullVersion());
11727 FileInfo configFileInfo1(
"Doxyfile"),configFileInfo2(
"doxyfile");
11730 if (configFileInfo1.exists())
11732 configName=
"Doxyfile";
11734 else if (configFileInfo2.
exists())
11736 configName=
"doxyfile";
11738 else if (genConfig)
11740 configName=
"Doxyfile";
11744 err(
"Doxyfile not found and no input file specified!\n");
11745 usage(argv[0],versionString);
11752 if (fi.
exists() ||
qstrcmp(argv[optInd],
"-")==0 || genConfig)
11754 configName=argv[optInd];
11758 err(
"configuration file {} not found!\n",argv[optInd]);
11759 usage(argv[0],versionString);
11773 err(
"could not open or read configuration file {}!\n",configName);
11845 for (
const auto &mapping : extMaps)
11848 int i=mapStr.
find(
'=');
11864 err(
"Failed to map file extension '{}' to unsupported language '{}'.\n"
11865 "Check the EXTENSION_MAPPING setting in the config file.\n",
11870 msg(
"Adding custom extension mapping: '{}' will be treated as language '{}'\n",
11879 if (cd==
reinterpret_cast<void *
>(-1))
11881 term(
"unsupported character conversion: '{}'->'UTF-8': {}\n"
11882 "Check the 'INPUT_ENCODING' setting in the config file!\n",
11892 for (
const auto &mapping : fileEncod)
11895 int i=mapStr.
find(
'=');
11909 if (cd==
reinterpret_cast<void *
>(-1))
11911 term(
"unsupported character conversion: '{}'->'UTF-8': {}\n"
11912 "Check the 'INPUT_FILE_ENCODING' setting in the config file!\n",
11913 encoding,strerror(errno));
11926 for (
const auto &s : expandAsDefinedList)
11944 signal(SIGINT,SIG_DFL);
11946 msg(
"Cleaning up...\n");
11961 if (generateTagFile.
isEmpty())
return;
11966 err(
"cannot open tag file {} for writing\n", generateTagFile);
11970 tagFile <<
"<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>\n";
11971 tagFile <<
"<tagfile doxygen_version=\"" << getDoxygenVersion() <<
"\"";
11972 std::string gitVersion = getGitVersion();
11973 if (!gitVersion.empty())
11975 tagFile <<
" doxygen_gitid=\"" << gitVersion <<
"\"";
11982 for (
const auto &fd : *fn)
11984 if (fd->isLinkableInProject()) fd->writeTagFile(tagFile);
12017 if (gd->isLinkableInProject()) gd->writeTagFile(tagFile);
12022 if (mod->isLinkableInProject()) mod->writeTagFile(tagFile);
12027 if (pd->isLinkableInProject()) pd->writeTagFile(tagFile);
12034 if (dd->isLinkableInProject()) dd->writeTagFile(tagFile);
12038 tagFile <<
"</tagfile>\n";
12046 msg(
"Exiting...\n");
12056 const char *defaultDirName)
12061 result = baseDirName + defaultDirName;
12063 else if (formatDirName[0]!=
'/' && (formatDirName.
length()==1 || formatDirName[1]!=
':'))
12065 result.
prepend(baseDirName+
"/");
12067 Dir formatDir(result.
str());
12070 term(
"Could not create output directory {}\n", result);
12084 g_s.begin(
"Searching for include files...\n");
12087 for (
const auto &s : includePathList)
12105 g_s.begin(
"Searching for example files...\n");
12108 for (
const auto &s : examplePathList)
12123 g_s.begin(
"Searching for images...\n");
12126 for (
const auto &s : imagePathList)
12141 g_s.begin(
"Searching for dot files...\n");
12144 for (
const auto &s : dotFileList)
12159 g_s.begin(
"Searching for msc files...\n");
12162 for (
const auto &s : mscFileList)
12177 g_s.begin(
"Searching for dia files...\n");
12180 for (
const auto &s : diaFileList)
12195 g_s.begin(
"Searching for plantuml files...\n");
12198 for (
const auto &s : plantUmlFileList)
12213 g_s.begin(
"Searching for mermaid files...\n");
12216 for (
const auto &s : mermaidFileList)
12231 g_s.begin(
"Searching for files to exclude\n");
12233 for (
const auto &s : excludeList)
12251 g_s.begin(
"Searching INPUT for files to process...\n");
12255 for (
const auto &s : inputList)
12258 size_t l = path.
length();
12262 if (path.
at(l-1)==
'\\' || path.
at(l-1)==
'/') path=path.
left(l-1);
12282 if (fileName->size()>1)
12284 std::stable_sort(fileName->begin(),fileName->end(),[](
const auto &f1,
const auto &f2)
12286 return qstricmp_sort(f1->absFilePath(),f2->absFilePath())<0;
12292 [](
const auto &f1,
const auto &f2)
12294 return qstricmp_sort(f1->front()->absFilePath(),f2->front()->absFilePath())<0;
12298 warn_uncond(
"No files to be processed, please check your settings, in particular INPUT, FILE_PATTERNS, and RECURSIVE\n");
12309 if (mdfileAsMainPage.
isEmpty())
return;
12313 warn_uncond(
"Specified markdown mainpage '{}' does not exist\n",mdfileAsMainPage);
12316 bool ambig =
false;
12319 warn_uncond(
"Specified markdown mainpage '{}' has not been defined as input file\n",mdfileAsMainPage);
12338 QCString versionString = getFullVersion();
12339 msg(
"Doxygen version used: {}\n",versionString);
12349 if (outputDirectory.
isEmpty())
12355 Dir dir(outputDirectory.
str());
12359 if (!dir.
mkdir(outputDirectory.
str()))
12361 term(
"tag OUTPUT_DIRECTORY: Output directory '{}' does not "
12362 "exist and cannot be created\n",outputDirectory);
12366 msg(
"Notice: Output directory '{}' does not exist. "
12367 "I have created it for you.\n", outputDirectory);
12415 bool generateSitemap = !sitemapUrl.
isEmpty();
12416 if (generateSitemap && !sitemapUrl.
endsWith(
"/"))
12423 bool generateEclipseHelp =
Config_getBool(GENERATE_ECLIPSEHELP);
12437 if (generateDocbook)
12484 newFontPath+=curFontPath;
12500 bool defaultLayoutUsed =
FALSE;
12501 if (layoutFileName.
isEmpty())
12504 defaultLayoutUsed =
TRUE;
12506 AUTO_TRACE_ADD(
"defaultLayoutUsed={}, layoutFileName={}",defaultLayoutUsed,layoutFileName);
12511 msg(
"Parsing layout file {}...\n",layoutFileName);
12514 else if (!defaultLayoutUsed)
12516 warn_uncond(
"failed to open layout file '{}' for reading! Using default settings.\n",layoutFileName);
12526 if (generateHtml) exclPatterns.push_back(htmlOutput.
str());
12527 if (generateDocbook) exclPatterns.push_back(docbookOutput.
str());
12528 if (generateXml) exclPatterns.push_back(xmlOutput.
str());
12529 if (generateLatex) exclPatterns.push_back(latexOutput.
str());
12530 if (generateRtf) exclPatterns.push_back(rtfOutput.
str());
12531 if (generateMan) exclPatterns.push_back(manOutput.
str());
12551 if (generateDocbook)
12562 std::shared_ptr<Entry> root = std::make_shared<Entry>();
12566 msg(
"Reading and parsing tag files\n");
12568 for (
const auto &s : tagFileList)
12580 g_s.begin(
"Parsing files\n");
12620 g_s.begin(
"Building macro definition list...\n");
12624 g_s.begin(
"Building group list...\n");
12629 g_s.begin(
"Building directory list...\n");
12634 g_s.begin(
"Building namespace list...\n");
12639 g_s.begin(
"Building file list...\n");
12643 g_s.begin(
"Building class list...\n");
12647 g_s.begin(
"Building concept list...\n");
12655 g_s.begin(
"Computing nesting relations for classes...\n");
12668 g_s.begin(
"Associating documentation with classes...\n");
12672 g_s.begin(
"Associating documentation with concepts...\n");
12677 g_s.begin(
"Associating documentation with modules...\n");
12681 g_s.begin(
"Building example list...\n");
12685 g_s.begin(
"Searching for enumerations...\n");
12693 g_s.begin(
"Searching for documented typedefs...\n");
12699 g_s.begin(
"Searching for documented sequences...\n");
12703 g_s.begin(
"Searching for documented dictionaries...\n");
12708 g_s.begin(
"Searching for members imported via using declarations...\n");
12715 g_s.begin(
"Searching for included using directives...\n");
12719 g_s.begin(
"Searching for documented variables...\n");
12723 g_s.begin(
"Building interface member list...\n");
12726 g_s.begin(
"Building member list...\n");
12730 g_s.begin(
"Searching for friends...\n");
12734 g_s.begin(
"Searching for documented defines...\n");
12738 g_s.begin(
"Computing class inheritance relations...\n");
12743 g_s.begin(
"Computing class usage relations...\n");
12747 g_s.begin(
"Flushing cached template relations that have become invalid...\n");
12751 g_s.begin(
"Warn for undocumented namespaces...\n");
12755 g_s.begin(
"Computing class relations...\n");
12766 g_s.begin(
"Add enum values to enums...\n");
12771 g_s.begin(
"Searching for member function documentation...\n");
12783 g_s.begin(
"Creating members for template instances...\n");
12787 g_s.begin(
"Building page list...\n");
12791 g_s.begin(
"Building requirements list...\n");
12795 g_s.begin(
"Search for main page...\n");
12800 g_s.begin(
"Computing page relations...\n");
12805 g_s.begin(
"Determining the scope of groups...\n");
12809 g_s.begin(
"Computing module relations...\n");
12811 mm.resolvePartitions();
12812 mm.resolveImports();
12813 mm.collectExportedSymbols();
12832 return i==0 ?
qstricmp_sort(c1->name(), c2->name())<0 : i<0;
12846 g_s.begin(
"Sorting lists...\n");
12867 g_s.begin(
"Determining which enums are documented\n");
12871 g_s.begin(
"Computing member relations...\n");
12877 g_s.begin(
"Building full member lists recursively...\n");
12881 g_s.begin(
"Adding members to member groups.\n");
12887 g_s.begin(
"Distributing member group documentation.\n");
12892 g_s.begin(
"Computing member references...\n");
12898 g_s.begin(
"Inheriting documentation...\n");
12906 g_s.begin(
"Generating disk names...\n");
12910 g_s.begin(
"Adding source references...\n");
12914 g_s.begin(
"Adding xrefitems...\n");
12919 g_s.begin(
"Adding requirements...\n");
12924 g_s.begin(
"Sorting member lists...\n");
12928 g_s.begin(
"Setting anonymous enum type...\n");
12932 g_s.begin(
"Computing dependencies between directories...\n");
12936 g_s.begin(
"Generating citations page...\n");
12940 g_s.begin(
"Counting data structures...\n");
12944 g_s.begin(
"Resolving user defined references...\n");
12948 g_s.begin(
"Finding anchors and sections in the documentation...\n");
12952 g_s.begin(
"Transferring function references...\n");
12956 g_s.begin(
"Combining using relations...\n");
12961 g_s.begin(
"Adding members to index pages...\n");
12966 g_s.begin(
"Correcting members for VHDL...\n");
12970 g_s.begin(
"Computing tooltip texts...\n");
12978 [](
const auto &g1,
const auto &g2)
12979 {
return g1->groupTitle() < g2->groupTitle(); });
12983 gd->sortSubGroups();
13027 if (generateDocbook)
13047 err(
"USE_HTAGS is YES but htags(1) failed. \n");
13049 err(
"htags(1) ended normally but failed to load the filemap. \n");
13056 g_s.begin(
"Generating style sheet...\n");
13064 g_s.begin(
"Generating search indices...\n");
13065 if (searchEngine && !serverBasedSearch && generateHtml)
13073 if (generateHtml && searchEngine)
13076 Dir searchDir(searchDirName.
str());
13077 if (!searchDir.
exists() && !searchDir.
mkdir(searchDirName.
str()))
13079 term(
"Could not create search results directory '{}' $PWD='{}'\n",
13083 if (!serverBasedSearch)
13105 if (generateDocbook)
13121 g_s.begin(
"Generating images for formulas in HTML...\n");
13128 g_s.begin(
"Generating images for formulas in RTF...\n");
13135 g_s.begin(
"Generating images for formulas in Docbook...\n");
13140 g_s.begin(
"Generating example documentation...\n");
13144 g_s.begin(
"Generating file sources...\n");
13148 g_s.begin(
"Counting members...\n");
13154 g_s.begin(
"Generating file documentation...\n");
13158 g_s.begin(
"Generating page documentation...\n");
13162 g_s.begin(
"Generating group documentation...\n");
13166 g_s.begin(
"Generating class documentation...\n");
13170 g_s.begin(
"Generating concept documentation...\n");
13174 g_s.begin(
"Generating module documentation...\n");
13178 g_s.begin(
"Generating namespace documentation...\n");
13184 g_s.begin(
"Generating graph info page...\n");
13189 g_s.begin(
"Generating directory documentation...\n");
13198 g_s.begin(
"finalizing index lists...\n");
13202 g_s.begin(
"writing tag file...\n");
13208 g_s.begin(
"Generating XML output...\n");
13216 g_s.begin(
"Generating SQLITE3 output...\n");
13223 g_s.begin(
"Generating AutoGen DEF output...\n");
13229 g_s.begin(
"Generating Perl module output...\n");
13233 if (generateHtml && searchEngine && serverBasedSearch)
13235 g_s.begin(
"Generating search index\n");
13245 if (searchDataFile.
isEmpty())
13247 searchDataFile=
"searchdata.xml";
13260 g_s.begin(
"Combining RTF output...\n");
13263 err(
"An error occurred during post-processing the RTF files!\n");
13270 g_s.begin(
"Running plantuml with JAVA...\n");
13277 g_s.begin(
"Running mermaid (mmdc)...\n");
13284 g_s.begin(
"Running dot...\n");
13289 if (generateHtml &&
13293 g_s.begin(
"Running html help compiler...\n");
13298 if ( generateHtml &&
13302 g_s.begin(
"Running qhelpgenerator...\n");
13315 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
13316 if (numThreads<1) numThreads=1;
13317 msg(
"Total elapsed time: {:.6f} seconds\n(of which an average of {:.6f} seconds per thread waiting for external tools to finish)\n",
13324 msg(
"finished...\n");
13329 msg(
"finished...\n");
std::vector< ArgumentList > ArgumentLists
This class represents an function or template argument list.
RefQualifierType refQualifier() const
bool noParameters() const
bool pureSpecifier() const
void setTrailingReturnType(const QCString &s)
bool hasParameters() const
QCString trailingReturnType() const
void setPureSpecifier(bool b)
bool constSpecifier() const
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 const ArgumentList & templateArguments() const =0
Returns the template arguments of this class.
virtual QCString compoundTypeString() const =0
Returns the type of compound as a string.
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 const MemberDef * getMemberByName(const QCString &) const =0
Returns the member with the given name.
virtual const TemplateInstanceList & getTemplateInstances() const =0
Returns a sorted dictionary with all template instances found for this template class.
virtual int isBaseClass(const ClassDef *bcd, bool followInstances, const QCString &templSpec=QCString()) const =0
Returns TRUE iff bcd is a direct or indirect base class of this 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 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 bool isEmbeddedInOuterScope() const =0
virtual const MemberNameInfoLinkedMap & memberNameInfoLinkedMap() const =0
Returns a dictionary of all members.
virtual bool isImplicitTemplateInstance() const =0
virtual QCString qualifiedNameWithTemplateParameters(const ArgumentLists *actualParams=nullptr, uint32_t *actualParamIndex=nullptr) const =0
virtual std::unique_ptr< ClassDef > deepCopy(const QCString &name) 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 namespace this compound is in, or 0 if it has a global scope.
virtual QCString requiresClause() const =0
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 setClassName(const QCString &name)=0
virtual void countMembers()=0
virtual void addMembersToMemberGroup()=0
virtual void makeTemplateArgument(bool b=TRUE)=0
virtual void setPrimaryConstructorParams(const ArgumentList &list)=0
virtual void setTemplateBaseClassNames(const TemplateNameMap &templateNames)=0
virtual void insertExplicitTemplateInstance(ClassDef *instance, const QCString &spec)=0
virtual void setMetaData(const QCString &md)=0
virtual void setFileDef(FileDef *fd)=0
virtual void addUsedClass(ClassDef *cd, const QCString &accessName, Protection prot)=0
virtual void reclassifyMember(MemberDefMutable *md, MemberType t)=0
virtual ClassDef * insertTemplateInstance(const QCString &fileName, int startLine, int startColumn, const QCString &templSpec, bool &freshInstance)=0
virtual void insertBaseClass(ClassDef *, const QCString &name, Protection p, Specifier s, const QCString &t=QCString())=0
virtual void setTemplateArguments(const ArgumentList &al)=0
virtual void setTemplateMaster(const ClassDef *tm)=0
virtual void mergeCategory(ClassDef *category)=0
virtual void addQualifiers(const StringVector &qualifiers)=0
virtual void setClassSpecifier(TypeSpecifier spec)=0
virtual void insertSubClass(ClassDef *, Protection p, Specifier s, const QCString &t=QCString())=0
virtual void insertUsedFile(const FileDef *)=0
virtual void setRequiresClause(const QCString &req)=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 findSectionsInDocumentation()=0
virtual void addUsedByClass(ClassDef *cd, const QCString &accessName, Protection prot)=0
virtual void insertMember(MemberDef *)=0
virtual void sortAllMembersList()=0
virtual void addMembersToTemplateInstance(const ClassDef *cd, const ArgumentList &templateArguments, const QCString &templSpec)=0
virtual void mergeMembers()=0
virtual void setIsStatic(bool b)=0
virtual void setSubGrouping(bool enabled)=0
virtual void addCodePart(const QCString &code, int lineNr, int colNr)=0
virtual void setFileDef(FileDef *fd)=0
virtual void writeTagFile(TextStream &)=0
virtual void setInitializer(const QCString &init)=0
virtual void addDocPart(const QCString &doc, int lineNr, int colNr)=0
virtual void writeDocumentation(OutputList &ol)=0
virtual void setGroupId(int id)=0
virtual void findSectionsInDocumentation()=0
virtual void setTemplateArguments(const ArgumentList &al)=0
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 QCString &label)
static void setFlag(const DebugMask mask)
The common base class of all entity definitions found in the sources.
virtual QCString docFile() const =0
virtual const QCString & localName() const =0
virtual int getEndBodyLine() const =0
virtual SrcLangExt getLanguage() const =0
Returns the programming language this definition was written in.
virtual int docLine() const =0
virtual QCString getDefFileName() const =0
virtual bool isLinkable() const =0
virtual int getDefLine() const =0
virtual DefType definitionType() const =0
virtual QCString anchor() 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 QCString briefDescription(bool abbreviate=FALSE) const =0
virtual bool isAnonymous() const =0
virtual bool isHidden() const =0
virtual const Definition * findInnerCompound(const QCString &name) const =0
virtual int getStartDefLine() const =0
virtual const GroupList & partOfGroups() const =0
virtual QCString documentation() const =0
virtual QCString qualifiedName() const =0
virtual QCString displayName(bool includeScope=TRUE) const =0
virtual bool isArtificial() const =0
virtual QCString briefFile() const =0
virtual QCString getOutputFileBase() const =0
virtual Definition * getOuterScope() const =0
virtual int getStartBodyLine() const =0
virtual int getDefColumn() const =0
virtual bool isReference() const =0
virtual QCString inbodyDocumentation() const =0
virtual QCString inbodyFile() const =0
virtual const QCString & name() const =0
virtual void mergeReferencedBy(const Definition *other)=0
virtual void setExported(bool b)=0
virtual void setBodySegment(int defLine, int bls, int ble)=0
virtual void setName(const QCString &name)=0
virtual void setHidden(bool b)=0
virtual void mergeReferences(const Definition *other)=0
virtual void setDocumentation(const QCString &d, const QCString &docFile, int docLine, bool stripWhiteSpace=TRUE)=0
virtual void setDefFile(const QCString &df, int defLine, int defColumn)=0
virtual void addInnerCompound(Definition *d)=0
virtual void addSectionsToDefinition(const std::vector< const SectionInfo * > &anchorList)=0
virtual void setInbodyDocumentation(const QCString &d, const QCString &docFile, int docLine)=0
virtual void setLanguage(SrcLangExt lang)=0
virtual void setOuterScope(Definition *d)=0
virtual void setArtificial(bool b)=0
virtual void setId(const QCString &name)=0
virtual void makePartOfGroup(GroupDef *gd)=0
virtual void setBodyDef(const FileDef *fd)=0
virtual void setBriefDescription(const QCString &b, const QCString &briefFile, int briefLine)=0
virtual void setReference(const QCString &r)=0
virtual void setRequirementReferences(const RequirementRefs &rqli)=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 ParserManager * parserManager
static InputFileEncodingList inputFileEncodingList
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 QCString verifiedDotPath
static MemberGroupInfoMap memberGroupInfoMap
static IndexList * indexList
static StaticInitMap staticInitMap
static StringMap tagDestinationMap
static std::mutex countFlowKeywordsMutex
static ClassLinkedMap * hiddenClassLinkedMap
static FileNameLinkedMap * diaFileNameLinkedMap
static QCString htmlFileExtension
static QCString filterDBFileName
static PageLinkedMap * pageLinkedMap
static bool generatingXmlOutput
static std::unique_ptr< NamespaceDef > globalNamespaceDef
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
QCString metaData
Slice metadata.
int docLine
line number at which the documentation was found
QCString bitfields
member's bit fields
ArgumentList typeConstr
where clause (C#) for type constraints
void markAsProcessed() const
int endBodyLine
line number where the definition ends
bool exported
is the symbol exported from a C++20 module
const TagInfo * tagInfo() const
QCString includeName
include name (3 arg of \class)
ArgumentLists tArgLists
template argument declarations
MethodTypes mtype
signal, slot, (dcop) method, or property?
@ GROUPDOC_NORMAL
defgroup
SrcLangExt lang
programming language in which this entry was found
QCString inbodyDocs
documentation inside the body of a function
int startColumn
start column of entry in the source
QCString relates
related class (doc block)
bool explicitExternal
explicitly defined as external?
std::vector< const SectionInfo * > anchors
list of anchors defined in this entry
QCString fileName
file this entry was extracted from
RelatesType relatesType
how relates is handled
QCString write
property write accessor
QCString args
member argument string
std::vector< Grouping > groups
list of groups this entry belongs to
CommandOverrides commandOverrides
store info for commands whose default can be overridden
QCString exception
throw specification
int startLine
start line of entry in the source
QCString req
C++20 requires clause.
ArgumentList argList
member arguments as a list
QCString includeFile
include file (2 arg of \class, must be unique)
int inbodyLine
line number at which the body doc was found
EntryType section
entry type (see Sections);
QCString briefFile
file in which the brief desc. was found
int bodyLine
line number of the body in the source
int mGrpId
member group id
std::vector< BaseInfo > extends
list of base classes
Specifier virt
virtualness of the entry
std::vector< std::string > qualifiers
qualifiers specified with the qualifier command
QCString doc
documentation block (partly parsed)
QCString read
property read accessor
RefItemVector sli
special lists (test/todo/bug/deprecated/..) this entry is in
QCString docFile
file in which the documentation was found
Protection protection
class protection
bool artificial
Artificially introduced item.
bool hidden
does this represent an entity that is hidden from the output
QCString brief
brief description (doc block)
int briefLine
line number at which the brief desc. was found
FileDef * fileDef() const
int initLines
define/variable initializer lines to show
QCString inbodyFile
file in which the body doc was found
TypeSpecifier spec
class/member specifiers
QCString inside
name of the class in which documents are found
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
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 insertConcept(ConceptDef *cd)=0
virtual void overrideIncludeGraph(bool e)=0
virtual void writeSourceHeader(OutputList &ol)=0
virtual bool generateSourceFile() const =0
virtual const LinkedRefMap< NamespaceDef > & getUsedNamespaces() const =0
virtual QCString absFilePath() const =0
virtual bool isSource() const =0
virtual void parseSource(ClangTUParser *clangParser)=0
virtual void getAllIncludeFilesRecursively(StringVector &incFiles) const =0
virtual void setDiskName(const QCString &name)=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 const QCString & docName() const =0
virtual void insertMember(MemberDef *md)=0
virtual void insertNamespace(NamespaceDef *nd)=0
Minimal replacement for QFileInfo.
std::string readLink() const
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.
A model of a group of symbols.
virtual QCString 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 MemberList * getMemberList(MemberListType lt) const =0
virtual void setGroupTitle(const QCString &newtitle)=0
virtual bool hasGroupTitle() const =0
Generator for HTML output.
static void writeSearchPage()
static void writeFooterFile(TextStream &t)
static void writeTabData()
Additional initialization after indices have been created.
static void writeSearchData(const QCString &dir)
static void writeExternalSearchPage()
static void writeStyleSheetFile(TextStream &t)
static void writeHeaderFile(TextStream &t, const QCString &cssname)
A class that generated the HTML Help specific files.
static const QCString hhpFileName
static Index & instance()
void countDataStructures()
A list of index interfaces.
Generator for LaTeX output.
static void writeFooterFile(TextStream &t)
static void writeStyleSheetFile(TextStream &t)
static void writeHeaderFile(TextStream &t)
static LayoutDocManager & instance()
Returns a reference to this singleton.
void parse(const QCString &fileName, const char *data=nullptr)
Parses a user provided layout.
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 QCString typeString() const =0
virtual QCString requiresClause() const =0
virtual bool isFriend() const =0
virtual bool isForeign() const =0
virtual QCString definition() const =0
virtual bool isRelated() const =0
virtual const ClassDef * getCachedTypedefVal() const =0
virtual QCString excpString() const =0
virtual const ClassDef * getClassDef() const =0
virtual const ArgumentList & templateArguments() 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 bool isStatic() const =0
virtual const MemberDef * reimplements() const =0
virtual StringVector getQualifiers() const =0
virtual QCString bitfieldString() 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 QCString argsString() 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 const QCString & initializer() const =0
virtual void setMemberClass(ClassDef *cd)=0
virtual void setProtection(Protection p)=0
virtual void setMemberGroupId(int id)=0
virtual void setDocumentedEnumValues(bool value)=0
virtual void setDefinition(const QCString &d)=0
virtual void setToAnonymousMember(MemberDef *m)=0
virtual ClassDefMutable * getClassDefMutable()=0
virtual void setExplicitExternal(bool b, const QCString &df, int line, int column)=0
virtual void setDefinitionTemplateParameterLists(const ArgumentLists &lists)=0
virtual void invalidateTypedefValCache()=0
virtual void setEnumScope(MemberDef *md, bool livesInsideEnum=FALSE)=0
virtual void setEnumClassScope(ClassDef *cd)=0
virtual void setMaxInitLines(int lines)=0
virtual void setInheritsDocsFrom(const MemberDef *md)=0
virtual void setRelatedAlso(ClassDef *cd)=0
virtual void setPrototype(bool p, const QCString &df, int line, int column)=0
virtual void overrideReferencesRelation(bool e)=0
virtual void makeForeign()=0
virtual void overrideReferencedByRelation(bool e)=0
virtual void setDocsForDefinition(bool b)=0
virtual void setRequiresClause(const QCString &req)=0
virtual void overrideCallGraph(bool e)=0
virtual void overrideInlineSource(bool e)=0
virtual void setArgsString(const QCString &as)=0
virtual void determineScopeForAnonymousMembers()=0
virtual void setInitializer(const QCString &i)=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 insertEnumField(MemberDef *md)=0
virtual void moveDeclArgumentList(std::unique_ptr< ArgumentList > al)=0
virtual void overrideCallerGraph(bool e)=0
virtual void setReimplements(MemberDef *md)=0
virtual void setDeclFile(const QCString &df, int line, int column)=0
virtual void invalidateCachedArgumentTypes()=0
virtual void moveArgumentList(std::unique_ptr< ArgumentList > al)=0
virtual void makeRelated()=0
virtual void insertReimplementedBy(MemberDef *md)=0
A list of MemberDef objects as shown in documentation sections.
Ordered dictionary of MemberName objects.
const MemberDef * find(const QCString &name) const
const MemberDef * findRev(const QCString &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 setMetaData(const QCString &m)=0
virtual void findSectionsInDocumentation()=0
virtual void countMembers()=0
virtual void addUsingDirective(NamespaceDef *nd)=0
virtual void insertMember(MemberDef *md)=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 setFileName(const QCString &fn)=0
virtual void sortMemberLists()=0
virtual void addMembersToMemberGroup()=0
bool needsPreprocessing(const QCString &) const override
Returns TRUE if the language identified by extension needs the C preprocessor to be run before feed t...
void parseInput(const QCString &, 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 QCString &) override
Callback function called by the comment block scanner.
Abstract interface for outline parsers.
virtual bool needsPreprocessing(const QCString &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 QCString &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.
A model of a page symbol.
virtual void setLocalToc(const LocalToc &tl)=0
virtual void setFileName(const QCString &name)=0
virtual void setShowLineNo(bool)=0
virtual void setPageScope(Definition *)=0
virtual const GroupDef * getGroupDef() const =0
Manages programming language parsers.
static PlantumlManager & instance()
void run()
Run plant UML tool for all images.
void processFile(const QCString &fileName, const std::string &input, std::string &output)
void addSearchDir(const QCString &dir)
This is an alternative implementation of QCString.
int find(char c, int index=0, bool cs=TRUE) const
QCString & prepend(const char *s)
int toInt(bool *ok=nullptr, int base=10) const
size_t length() const
Returns the length of the string, not counting the 0-terminator.
bool startsWith(const char *s) const
QCString mid(size_t index, size_t len=static_cast< size_t >(-1)) const
bool endsWith(const char *s) const
char & at(size_t i)
Returns a reference to the character at index i.
bool isEmpty() const
Returns TRUE iff the string is empty.
QCString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
QCString fill(char c, int len=-1)
Fills a string with a predefined character.
const std::string & str() const
QCString right(size_t len) const
size_t size() const
Returns the length of the string, not counting the 0-terminator.
QCString & sprintf(const char *format,...)
int findRev(char c, int index=-1, bool cs=TRUE) const
QCString & replace(size_t index, size_t len, const char *s)
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
QCString left(size_t len) const
int contains(char c, bool cs=TRUE) const
bool stripPrefix(const QCString &prefix)
static const QCString qhpFileName
static QCString getQchFileName()
Generator for RTF output.
static bool preProcessFileInplace(const QCString &path, const QCString &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.
class that provide information about a section.
QCString fileName() const
SectionInfo * replace(const QCString &label, const QCString &fileName, int lineNr, const QCString &title, SectionType type, int level, const QCString &ref=QCString())
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)
const Definition * resolveSymbol(const Definition *scope, const QCString &name, const QCString &args=QCString(), bool checkCV=false, bool insideCode=false, bool onlyLinkable=false)
Find the symbool definition matching name within the scope set.
const ClassDef * resolveClass(const Definition *scope, const QCString &name, bool maybeUnlinkable=false, bool mayBeHidden=false)
Find the class definition matching name within the scope set.
QCString getTemplateSpec() const
In case a call to resolveClass() points to a template specialization, the template part is return via...
ClassDefMutable * resolveClassMutable(const Definition *scope, const QCString &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 MemberDef * getTypedef() const
In case a call to resolveClass() resolves to a type member (e.g. an enum) this method will return it.
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.
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 QCString &n)
std::unique_ptr< ClassDef > createClassDefAlias(const Definition *newScope, const ClassDef *cd)
std::unique_ptr< ClassDef > createClassDef(const QCString &fileName, int startLine, int startColumn, const QCString &name, ClassDef::CompoundType ct, const QCString &ref, const QCString &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 QCString &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 QCString &fileName, int startLine, int startColumn, const QCString &name, const QCString &tagRef, const QCString &tagFile)
ConceptDefMutable * getConceptMutable(const QCString &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 QCString &decl, const SrcLangExt lang, QCString &clName, QCString &type, QCString &name, QCString &args, QCString &funcTempList, QCString &exceptions)
std::unique_ptr< ArgumentList > stringToArgumentList(SrcLangExt lang, const QCString &argsString, QCString *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 int findEndOfTemplate(const QCString &s, size_t startPos)
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 bool isRecursiveBaseClass(const QCString &scope, const QCString &name)
static void copyLatexStyleSheet()
static void generateDocsForClassList(const std::vector< ClassDefMutable * > &classList)
static std::shared_ptr< Entry > parseFile(OutlineParserInterface &parser, FileDef *fd, const QCString &fn, ClangTUParser *clangParser, bool newTU)
static int findFunctionPtr(const std::string &type, SrcLangExt lang, int *pLength=nullptr)
static bool isSpecialization(const ArgumentLists &srcTempArgLists, const ArgumentLists &dstTempArgLists)
static MemberDef * addVariableToClass(const Entry *root, ClassDefMutable *cd, MemberType mtype, const QCString &type, const QCString &name, const QCString &args, bool fromAnnScope, MemberDef *fromAnnMemb, Protection prot, Relationship related)
static void computeTemplateClassRelations()
static std::string resolveSymlink(const std::string &path)
void adjustConfiguration()
adjust globals that depend on configuration settings.
static void findDEV(const MemberNameLinkedMap &mnsd)
static void runQHelpGenerator()
static void addConceptToContext(const Entry *root)
static void addRelatedPage(Entry *root)
static void addIncludeFile(DefMutable *cd, FileDef *ifd, const Entry *root)
static StringVector g_inputFiles
static void copyExtraFiles(const StringVector &files, const QCString &filesOption, const QCString &outputOption, bool toIndex)
static void createUsingMemberImportForClass(const Entry *root, ClassDefMutable *cd, const MemberDef *md, const QCString &fileName, const QCString &memName)
static void generateXRefPages()
static void findUsingDeclImports(const Entry *root)
static void copyStyleSheet()
FindBaseClassRelation_Mode
void distributeClassGroupRelations()
static void generateGroupDocs()
static void findDirDocumentation(const Entry *root)
void checkConfiguration()
check and resolve config options
QCString stripTemplateSpecifiers(const QCString &s)
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 NamespaceDef * findUsedNamespace(const LinkedRefMap< NamespaceDef > &unl, const QCString &name)
static void buildConceptList(const Entry *root)
static void resolveClassNestingRelations()
static void generateNamespaceConceptDocs(const ConceptLinkedRefMap &conceptList)
static void findMember(const Entry *root, const QCString &relates, const QCString &type, const QCString &args, QCString funcDecl, bool overloaded, bool isFunc)
static void findClassEntries(const Entry *root)
static void addMemberFunction(const Entry *root, MemberName *mn, const QCString &scopeName, const QCString &namespaceName, const QCString &className, const QCString &funcTyp, const QCString &funcName, const QCString &funcArgs, const QCString &funcTempList, const QCString &exceptions, const QCString &type, const QCString &args, bool isFriend, TypeSpecifier spec, const QCString &relates, const QCString &funcDecl, bool overloaded, bool isFunc)
static void vhdlCorrectMemberProperties()
static void generateExampleDocs()
static void stopDoxygen(int)
static void findTemplateInstanceRelation(const Entry *root, Definition *context, ClassDefMutable *templateClass, const QCString &templSpec, const TemplateNameMap &templateNames, bool isArtificial)
static void substituteTemplatesInArgList(const ArgumentLists &srcTempArgLists, const ArgumentLists &dstTempArgLists, const ArgumentList &src, ArgumentList &dst)
static void computeMemberReferences()
static void generateConfigFile(const QCString &configFile, bool shortList, bool updateOnly=FALSE)
static void transferRelatedFunctionDocumentation()
static void addMembersToMemberGroup()
static bool tryAddEnumDocsToGroupMember(const Entry *root, const QCString &name)
static void addOverloaded(const Entry *root, MemberName *mn, const QCString &funcType, const QCString &funcName, const QCString &funcArgs, const QCString &funcDecl, const QCString &exceptions, TypeSpecifier spec)
static void findMainPageTagFiles(Entry *root)
static void distributeConceptGroups()
static void transferFunctionDocumentation()
static void setAnonymousEnumType()
static void sortMemberLists()
static void createTemplateInstanceMembers()
void transferStaticInstanceInitializers()
static void findObjCMethodDefinitions(const Entry *root)
static void dumpSymbolMap()
static void buildTypedefList(const Entry *root)
static void findGroupScope(const Entry *root)
static void generateFileDocs()
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 addLocalObjCMethod(const Entry *root, const QCString &scopeName, const QCString &funcType, const QCString &funcName, const QCString &funcArgs, const QCString &exceptions, const QCString &funcDecl, TypeSpecifier spec)
static bool findGlobalMember(const Entry *root, const QCString &namespaceName, const QCString &type, const QCString &name, const QCString &tempArg, const QCString &, const QCString &decl, TypeSpecifier)
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 void buildVarList(const Entry *root)
static void buildSequenceList(const Entry *root)
static void generateFileSources()
static QCString substituteTemplatesInString(const ArgumentLists &srcTempArgLists, const ArgumentLists &dstTempArgLists, const std::string &src)
static void usage(const QCString &name, const QCString &versionString)
static MemberDef * addVariableToFile(const Entry *root, MemberType mtype, const QCString &scope, const QCString &type, const QCString &name, const QCString &args, bool fromAnnScope, MemberDef *fromAnnMemb)
static void generateClassDocs()
static void buildNamespaceList(const Entry *root)
static void readTagFile(const std::shared_ptr< Entry > &root, const QCString &tagLine)
static void findIncludedUsingDirectives()
static void addDefineDoc(const Entry *root, MemberDefMutable *md)
static void addMemberDocs(const Entry *root, MemberDefMutable *md, const QCString &funcDecl, const ArgumentList *al, bool over_load, TypeSpecifier spec)
static void countMembers()
static void addInterfaceOrServiceToServiceOrSingleton(const Entry *root, ClassDefMutable *cd, QCString const &rname)
static void organizeSubGroups(const Entry *root)
static void applyMemberOverrideOptions(const Entry *root, MemberDefMutable *md)
static void findFriends()
static void findEnums(const Entry *root)
static void dumpSymbol(TextStream &t, Definition *d)
static void addClassAndNestedClasses(std::vector< ClassDefMutable * > &list, ClassDefMutable *cd)
static void addEnumDocs(const Entry *root, MemberDefMutable *md)
static void addListReferences()
static void exitDoxygen() noexcept
static bool isClassSection(const Entry *root)
static Definition * findScopeFromQualifiedName(NamespaceDefMutable *startScope, const QCString &n, FileDef *fileScope, const TagInfo *tagInfo)
static ClassDef * findClassWithinClassContext(Definition *context, ClassDef *cd, const QCString &name)
static void copyLogo(const QCString &outputOption, bool toIndex)
static void buildGroupListFiltered(const Entry *root, bool additional, bool includeExternal)
static void runHtmlHelpCompiler()
static QCString extractClassName(const Entry *root)
static void addMembersToIndex()
static bool g_dumpSymbolMap
static void version(const bool extended)
static void addGlobalFunction(const Entry *root, const QCString &rname, const QCString &sc)
static OutputList * g_outputList
static void findMainPage(Entry *root)
static ClassDef::CompoundType convertToCompoundType(EntryType section, TypeSpecifier specifier)
static void findUsingDirectives(const Entry *root)
std::unique_ptr< ArgumentList > getTemplateArgumentsFromName(const QCString &name, const ArgumentLists &tArgLists)
static bool g_successfulRun
static void addSourceReferences()
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 QCString g_commentFileName
static void findDocumentedEnumValues()
static void copyIcon(const QCString &outputOption, bool toIndex)
static void generateDiskNames()
static void addToIndices()
static void computeClassRelations()
static void buildFunctionList(const Entry *root)
static void checkPageRelations()
static void findModuleDocumentation(const Entry *root)
static void findEnumDocumentation(const Entry *root)
static void computePageRelations(Entry *root)
static void filterMemberDocumentation(const Entry *root, const QCString &relates)
static QCString createOutputDirectory(const QCString &baseDirName, const QCString &formatDirName, const char *defaultDirName)
static bool isVarWithConstructor(const Entry *root)
static StringSet g_usingDeclarations
static void determineScopeForAnonymousMembers()
static void buildDictionaryList(const Entry *root)
static bool haveEqualFileNames(const Entry *root, const MemberDef *md)
static void generateNamespaceDocs()
static void buildClassDocList(const Entry *root)
static void buildPageList(Entry *root)
static void writeTagFile()
static Definition * buildScopeFromQualifiedName(const QCString &name_, SrcLangExt lang, const TagInfo *tagInfo)
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 addMethodToClass(const Entry *root, ClassDefMutable *cd, const QCString &rtype, const QCString &rname, const QCString &rargs, bool isFriend, Protection protection, bool stat, Specifier virt, TypeSpecifier spec, const QCString &relates)
static std::unique_ptr< OutlineParserInterface > getParserForFile(const QCString &fn)
static void findUsedTemplateInstances()
static void computeTooltipTexts()
void readFileOrDirectory(const QCString &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 addVariable(const Entry *root, int isFuncPtr=-1)
static void addMemberSpecialization(const Entry *root, MemberName *mn, ClassDefMutable *cd, const QCString &funcType, const QCString &funcName, const QCString &funcArgs, const QCString &funcDecl, const QCString &exceptions, TypeSpecifier spec)
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 void generateConceptDocs()
static void combineUsingRelations()
static const char * getArg(int argc, char **argv, int &optInd)
static const ClassDef * findClassDefinition(FileDef *fd, NamespaceDef *nd, const QCString &scopeName)
static void checkMarkdownMainfile()
static std::unordered_map< std::string, std::vector< ClassDefMutable * > > g_usingClassMap
static void buildConceptDocList(const Entry *root)
static int findTemplateSpecializationPosition(const QCString &name)
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 void transferFunctionReferences()
static void buildDefineList()
static void buildInterfaceAndServiceList(const Entry *root)
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
std::unique_ptr< FileDef > createFileDef(const QCString &p, const QCString &n, const QCString &ref, const QCString &dn)
FileDef * toFileDef(Definition *d)
std::unordered_set< const FileDef * > FileDefSet
static void startScope(yyscan_t yyscanner)
start scope
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 QCString &fileName, int line, const QCString &name, const QCString &title, const QCString &refFileName)
void addConceptToGroups(const Entry *root, ConceptDef *cd)
void addMemberToGroups(const Entry *root, MemberDef *md)
void startTitle(OutputList &ol, const QCString &fileName, const DefinitionMutable *def)
void endFile(OutputList &ol, bool skipNavIndex, bool skipEndContents, const QCString &navPath)
void writeGraphInfo(OutputList &ol)
void endTitle(OutputList &ol, const QCString &fileName, const QCString &name)
void startFile(OutputList &ol, const QCString &name, bool isSource, const QCString &manName, const QCString &title, HighlightedItem hli, bool additionalIndices, const QCString &altSidebarName, int hierarchyLevel, const QCString &allMembersFile)
void writeIndexHierarchy(OutputList &ol)
Translator * theTranslator
void setTranslator(OUTPUT_LANGUAGE_t langName)
#define LATEX_STYLE_EXTENSION
void writeDefaultLayoutFile(const QCString &fileName)
std::unique_ptr< MemberDef > createMemberDefAlias(const Definition *newScope, const MemberDef *aliasMd)
MemberDefMutable * toMemberDefMutable(Definition *d)
void combineDeclarationAndDefinition(MemberDefMutable *mdec, MemberDefMutable *mdef)
MemberDef * toMemberDef(Definition *d)
std::unique_ptr< MemberDef > createMemberDef(const QCString &defFileName, int defLine, int defColumn, const QCString &type, const QCString &name, const QCString &args, const QCString &excp, Protection prot, Specifier virt, bool stat, Relationship related, MemberType t, const ArgumentList &tal, const ArgumentList &al, const QCString &metaData)
Factory method to create a new instance of a MemberDef.
std::unordered_map< int, std::unique_ptr< MemberGroupInfo > > MemberGroupInfoMap
QCString warn_line(const QCString &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)
bool parse(const QCString &fileName, bool update=FALSE, CompareMode compareMode=CompareMode::Full)
void writeTemplate(TextStream &t, bool shortList, bool updateOnly=FALSE)
void correctPath(const StringVector &list)
Correct a possible wrong PATH variable.
bool isAbsolutePath(const QCString &fileName)
FILE * popen(const QCString &name, const QCString &type)
std::ofstream openOutputStream(const QCString &name, bool append=false)
double getSysElapsedTime()
QCString pathListSeparator()
int system(const QCString &command, const QCString &args, bool commandHasConsole=true)
void setenv(const QCString &variable, const QCString &value)
const char * commandExtension()
QCString getenv(const QCString &variable)
QCString trunc(const QCString &s, size_t numChars=15)
void replaceNamespaceAliases(QCString &name)
std::unique_ptr< NamespaceDef > createNamespaceDefAlias(const Definition *newScope, const NamespaceDef *nd)
Factory method to create an alias of an existing namespace.
std::unique_ptr< NamespaceDef > createNamespaceDef(const QCString &defFileName, int defLine, int defColumn, const QCString &name, const QCString &ref, const QCString &refFile, const QCString &type, bool isPublished)
Factory method to create new NamespaceDef instance.
NamespaceDef * getResolvedNamespace(const QCString &name)
NamespaceDef * toNamespaceDef(Definition *d)
NamespaceDefMutable * toNamespaceDefMutable(Definition *d)
NamespaceDefMutable * getResolvedNamespaceMutable(const QCString &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 QCString &f, int l, const QCString &n, const QCString &d, const QCString &t)
void setPerlModDoxyfile(const QCString &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)
int qstricmp(const char *s1, const char *s2)
QCString substitute(const QCString &s, const QCString &src, const QCString &dst)
substitute all occurrences of src in s by dst
int qstricmp_sort(const char *str1, const char *str2)
const char * qPrint(const char *s)
uint32_t qstrlen(const char *str)
Returns the length of string str, or 0 if a null pointer is passed.
int qstrcmp(const char *str1, const char *str2)
void finalizeSearchIndexer()
static void addMemberToSearchIndex(const MemberDef *md)
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)
This class contains the information about the argument of a function or template.
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
QCString name
the name of the base class
Data associated with description found in the body.
QCString 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)
This struct is used to capture the tag file information for an Entry.
void parseTagFile(const std::shared_ptr< Entry > &root, const char *fullName)
void initTracing(const QCString &logFile, bool timing)
bool matchArguments2(const Definition *srcScope, const FileDef *srcFileScope, const QCString &srcReturnType, const ArgumentList *srcAl, const Definition *dstScope, const FileDef *dstFileScope, const QCString &dstReturnType, const ArgumentList *dstAl, bool checkCV, SrcLangExt lang)
QCString removeRedundantWhiteSpace(const QCString &s)
QCString mergeScopes(const QCString &leftScope, const QCString &rightScope)
QCString normalizeNonTemplateArgumentsInString(const QCString &name, const Definition *context, const ArgumentList &formalArgs)
SrcLangExt getLanguageFromFileName(const QCString &fileName, SrcLangExt defLang)
bool protectionLevelVisible(Protection prot)
bool matchTemplateArguments(const ArgumentList &srcAl, const ArgumentList &dstAl)
void addCodeOnlyMappings()
QCString substituteTemplateArgumentsInString(const QCString &nm, const ArgumentList &formalArgs, const ArgumentList *actualArgs)
int extractClassNameFromType(const QCString &type, int &pos, QCString &name, QCString &templSpec, SrcLangExt lang)
bool leftScopeMatch(const QCString &scope, const QCString &name)
QCString stripAnonymousNamespaceScope(const QCString &s)
QCString stripFromIncludePath(const QCString &path)
bool checkIfTypedef(const Definition *scope, const FileDef *fileScope, const QCString &n)
bool readInputFile(const QCString &fileName, std::string &contents, bool filter, bool isSourceCode)
read a file name fileName and optionally filter and transcode it
bool patternMatch(const FileInfo &fi, const StringVector &patList)
bool openOutputFile(const QCString &outFile, std::ofstream &f)
QCString tempArgListToString(const ArgumentList &al, SrcLangExt lang, bool includeDefault)
void addRefItem(const RefItemVector &sli, const QCString &key, const QCString &prefix, const QCString &name, const QCString &title, const QCString &args, const Definition *scope)
QCString showFileDefMatches(const FileNameLinkedMap *fnMap, const QCString &n)
QCString fileToString(const QCString &name, bool filter, bool isSourceCode)
QCString filterTitle(const QCString &title)
QCString resolveTypeDef(const Definition *context, const QCString &qualifiedName, const Definition **typedefContext)
bool checkExtension(const QCString &fName, const QCString &ext)
int computeQualifiedIndex(const QCString &name)
Return the index of the last :: in the string name that is still before the first <.
void initDefaultExtensionMapping()
bool findAndRemoveWord(QCString &sentence, const char *word)
removes occurrences of whole word from sentence, while keeps internal spaces and reducing multiple se...
QCString convertNameToFile(const QCString &name, bool allowDots, bool allowUnderscore)
QCString langToString(SrcLangExt lang)
Returns a string representation of lang.
EntryType guessSection(const QCString &name)
void extractNamespaceName(const QCString &scopeName, QCString &className, QCString &namespaceName, bool allowEmptyClass)
QCString argListToString(const ArgumentList &al, bool useCanonicalType, bool showDefVals)
QCString getLanguageSpecificSeparator(SrcLangExt lang, bool classScope)
Returns the scope separator to use given the programming language lang.
void mergeMemberOverrideOptions(MemberDefMutable *md1, MemberDefMutable *md2)
QCString mangleCSharpGenericName(const QCString &name)
QCString projectLogoFile()
void mergeArguments(ArgumentList &srcAl, ArgumentList &dstAl, bool forceNameOverwrite)
bool copyFile(const QCString &src, const QCString &dest)
Copies the contents of file with name src to the newly created file with name dest.
QCString stripTemplateSpecifiersFromScope(const QCString &fullName, bool parentOnly, QCString *pLastScopeStripped, QCString scopeName, bool allowArtificial)
QCString getOverloadDocs()
void cleanupInlineGraph()
int getPrefixIndex(const QCString &name)
bool rightScopeMatch(const QCString &scope, const QCString &name)
bool updateLanguageMapping(const QCString &extension, const QCString &language)
QCString getFileNameExtension(const QCString &fn)
QCString replaceAnonymousScopes(const QCString &s, const QCString &replacement)
FileDef * findFileDef(const FileNameLinkedMap *fnMap, const QCString &n, bool &ambig)
int getScopeFragment(const QCString &s, int p, int *l)
void addHtmlExtensionIfMissing(QCString &fName)
A bunch of utility functions.