22#include <unordered_map>
118#pragma GCC diagnostic push
119#pragma GCC diagnostic ignored "-Wshadow"
121#include <clang/Basic/Version.h>
123#pragma GCC diagnostic pop
130#if !defined(_WIN32) || defined(__CYGWIN__)
199{
"template class",
"template struct",
"class",
"struct",
"union",
"interface",
"exception" };
235 stats.emplace_back(name,0);
236 startTime = std::chrono::steady_clock::now();
240 std::chrono::steady_clock::time_point endTime = std::chrono::steady_clock::now();
241 stats.back().elapsed =
static_cast<double>(std::chrono::duration_cast<
242 std::chrono::microseconds>(endTime -
startTime).count())/1000000.0;
253 msg(
"----------------------\n");
254 for (
const auto &s :
stats)
256 msg(
"Spent {:.6f} seconds in {}",s.elapsed,s.name);
319 scope+=
"::"+pd->
name();
359 ((!includeExternal && root->
tagInfo()==
nullptr) ||
360 ( includeExternal && root->
tagInfo()!=
nullptr))
363 AUTO_TRACE(
"additional={} includeExternal={}",additional,includeExternal);
379 "group {}: ignoring title \"{}\" that does not match old title \"{}\"",
398 std::unique_ptr<GroupDef>(
405 std::unique_ptr<GroupDef>(
454 scope+=
"::"+gd->
name();
506 bool save_ambig = ambig;
517 fn = fn.
left(newIndex)+
"/"+root->
name;
520 if (!fd) ambig = save_ambig;
550 "Found non-existing group '{}' for the command '{}', ignoring command",
559 text.
sprintf(
"the name '%s' supplied as "
560 "the argument in the \\file statement ",
564 text+=
"matches the following input files:\n";
567 text+=
"Please use a more specific name by "
568 "including a (larger) part of the path!";
572 text+=
"is not an input file";
580template<
class DefMutable>
594 if (!includeFile.
isEmpty() && includeFile.
at(0)==
'"')
597 includeFile=includeFile.
mid(1,includeFile.
length()-2);
599 else if (!includeFile.
isEmpty() && includeFile.
at(0)==
'<')
602 includeFile=includeFile.
mid(1,includeFile.
length()-2);
614 text.
sprintf(
"the name '%s' supplied as "
615 "the argument of the \\class, \\struct, \\union, or \\include command ",
620 text+=
"matches the following input files:\n";
623 text+=
"Please use a more specific name by "
624 "including a (larger) part of the path!";
628 text+=
"is not an input file";
632 else if (includeFile.
isEmpty() && ifd &&
646 if (iName.
at(0)==
'<') local=
FALSE;
647 else if (iName.
at(0)==
'"') local=
TRUE;
648 if (iName.
at(0)==
'"' || iName.
at(0)==
'<')
671 cd->setIncludeFile(
nullptr,iName,local,
TRUE);
684 for (
size_t i=0;i<l;i++)
688 else if (c==
')' && round>0) round--;
689 else if (c==
'<' && round==0) count++;
694 if (c==
'>' && round==0 && count>0) count--;
717 if (idx==-1)
return prevScope;
719 if (nsName.
isEmpty())
return prevScope;
720 if (!fullScope.
isEmpty()) fullScope+=
"::";
725 if (nd==
nullptr) cd =
getClass(fullScope);
726 if (nd==
nullptr && cd)
730 else if (nd==
nullptr && cd==
nullptr && fullScope.
find(
'<')==-1)
738 "[generated]",1,1,fullScope,
756 if (prevScopeMutable)
788 int p=i1+l1,l2=0,i2=0;
796 if (resultScope==
nullptr)
807 if (resultScope!=
nullptr)
break;
866 auto alIt = tArgLists.begin();
867 while ((i=name.
find(
"::",p))!=-1 && alIt!=tArgLists.end())
883 return alIt!=tArgLists.end() ?
884 std::make_unique<ArgumentList>(*alIt) :
885 std::unique_ptr<ArgumentList>();
893 if (specifier.isStruct())
895 else if (specifier.isUnion())
897 else if (specifier.isCategory())
899 else if (specifier.isInterface())
901 else if (specifier.isProtocol())
903 else if (specifier.isException())
905 else if (specifier.isService())
907 else if (specifier.isSingleton())
910 if (section.isUnionDoc())
912 else if (section.isStructDoc())
914 else if (section.isInterfaceDoc())
916 else if (section.isProtocolDoc())
918 else if (section.isCategoryDoc())
920 else if (section.isExceptionDoc())
922 else if (section.isServiceDoc())
924 else if (section.isSingletonDoc())
945 int idx=fullName.
find(
'>');
946 if (idx!=-1 && root->
lang==SrcLangExt::CSharp)
956 qualifiedName.
prepend(scName+
"::");
962 AUTO_TRACE_ADD(
"Found class with name '{}', qualifiedName '{}'", cd ? cd->
name() : root->
name, qualifiedName);
1017 AUTO_TRACE_ADD(
"New class: fullname '{}' namespace '{}' name='{}' brief='{}' docs='{}'",
1027 if (fullName.
find(
"::")!=-1)
1034 std::unique_ptr<ArgumentList> tArgList;
1036 if ((root->
lang==SrcLangExt::CSharp || root->
lang==SrcLangExt::Java) && (i=fullName.
findRev(
'<'))!=-1)
1041 if (i!=-1 && root->
lang==SrcLangExt::CSharp)
1050 fullName=fullName.
left(i);
1061 fullName,sec,tagName,refFileName,
TRUE,root->
spec.isEnum()) ));
1064 AUTO_TRACE_ADD(
"New class '{}' type={} #tArgLists={} tagInfo={} hidden={} artificial={}",
1097 AUTO_TRACE_ADD(
"Class {} not added, already exists as alias", fullName);
1105 if (!root->
spec.isForwardDecl())
1166 qualifiedName.
prepend(scName+
"::");
1172 AUTO_TRACE_ADD(
"Found concept with name '{}' (qualifiedName='{}')", cd ? cd->
name() : root->
name, qualifiedName);
1176 qualifiedName=cd->
name();
1190 AUTO_TRACE_ADD(
"New concept: fullname '{}' namespace '{}' name='{}' brief='{}' docs='{}'",
1191 qualifiedName,namespaceName,className,root->
brief,root->
doc);
1200 if (qualifiedName.
find(
"::")!=-1)
1212 qualifiedName,tagName,refFileName)));
1216 qualifiedName,root->
tArgLists.size(),fmt::ptr(tagInfo));
1247 AUTO_TRACE_ADD(
"Concept '{}' not added, already exists (as alias)", qualifiedName);
1268 if (root->
section.isModuleDoc())
1278 if (root->
section.isConcept())
1288 if (root->
section.isConceptDoc())
1307 if (cd!=ocd && cd->groupId()==ocd->groupId() &&
1308 !cd->partOfGroups().empty() && ocd->partOfGroups().empty())
1313 for (
const auto &gd : cd->partOfGroups())
1319 gd->addConcept(ocd.get());
1344 aliasFullName(name),aliasCd(std::move(cd)), aliasContext(ctx) {}
1346 std::unique_ptr<ClassDef> aliasCd;
1349 std::vector<ClassAlias> aliases;
1353 if (cd && visitedClasses.find(icd.get())==visitedClasses.end())
1359 name,icd->getFileDef(),
nullptr);
1385 aliases.emplace_back(aliasFullName,std::move(aliasCd),dm);
1396 visitedClasses.insert(icd.get());
1406 for (
auto &alias : aliases)
1411 alias.aliasContext->addInnerCompound(aliasCd);
1420 if (cd && visitedClasses.find(icd.get())==visitedClasses.end())
1439 "Internal inconsistency: scope for class {} not "
1458 if (visitedClasses.find(cd.get())==visitedClasses.end() && !cd->partOfGroups().empty())
1462 for (
auto &ncd : cd->getClasses())
1473 visitedClasses.insert(cd.get());
1484 fullName+=
"."+fieldName;
1527 for (
const auto &md : *ml)
1530 auto newMd =
createMemberDef(md->getDefFileName(),md->getDefLine(),md->getDefColumn(),
1531 md->typeString(),md->name(),md->argsString(),md->excpString(),
1532 md->protection(),md->virtualness(),md->isStatic(),Relationship::Member,
1579 for (
const auto &md : *ml)
1582 if (type.
find(
"::@")!=-1)
1588 if (type.
find(icd->name())!=-1)
1591 if (md->isAnonymous()) name =
"__unnamed" +
QCString().
setNum(pos++)+
"__";
1611 for (
const auto &pmd : *pml)
1614 if (pmdm && pmd->
name()==md->name())
1634 if (icd->name().find(
"@")==-1)
1643 candidates.push_back(cdm);
1649 std::vector<ClassDefMutable *> candidates;
1661 for (
auto &cd : candidates)
1674 (root->
section.isNamespace() ||
1675 root->
section.isNamespaceDoc() ||
1684 if (root->
section.isPackageDoc())
1747 root->
type,root->
spec.isPublished())));
1813 QCString aliasName = aliasNd->name();
1842 for (
auto &und : unl)
1846 if (usingNd!=
nullptr)
break;
1853 if (root->
section.isUsingDir())
1871 (fd==
nullptr || fd->
getLanguage()!=SrcLangExt::Java)
1885 int scopeOffset =
static_cast<int>(nsName.
length());
1896 else if ((scopeOffset=nsName.
findRev(
"::",scopeOffset-1))==-1)
1900 }
while (scopeOffset>=0 && usingNd==
nullptr);
1902 if (usingNd==
nullptr && nd)
1906 while (pnd && usingNd==
nullptr)
1923 if (usingNd==
nullptr && fd)
1995 if (root->
section.isUsingDecl() &&
2008 if (root->
section.isUsingDecl() &&
2010 (!filterPythonPackages || (root->
lang==SrcLangExt::Python && root->
fileName.
endsWith(
"__init__.py")))
2013 AUTO_TRACE(
"Found using declaration '{}' at line {} of {} inside section {}",
2043 if (nd==
nullptr) scope = fd;
2113 AUTO_TRACE(
"creating new member {} for class {}",memName,cd->
name());
2124 newMmd->setMemberClass(cd);
2142 newMmd->addSectionsToDefinition(root->
anchors);
2148 newMmd->setMemberGroupId(root->
mGrpId);
2151 newMmd->setLanguage(root->
lang);
2152 newMmd->setId(root->
id);
2161 if (root->
section.isUsingDecl() &&
2188 for (
auto &mi : *mni)
2191 if (md && md->
protection()!=Protection::Private)
2206 for (
const auto ©Cd : it->second)
2219 else if (root->
section.isUsingDecl() &&
2221 root->
lang==SrcLangExt::Cpp
2254 memName = root->
name;
2276 newMmd->setNamespace(nd);
2281 newMmd->setFileDef(fd);
2300 newMmd->addSectionsToDefinition(root->
anchors);
2306 newMmd->setMemberGroupId(root->
mGrpId);
2309 newMmd->setLanguage(root->
lang);
2310 newMmd->setId(root->
id);
2318 if (nd && aliasMd.get())
2322 if (fd && aliasMd.get())
2351 if (nd) ncdm->
moveTo(nd);
2380 aliasFullName = aliasCd->localName();
2384 aliasFullName = nd->
qualifiedName()+
"::"+aliasCd->localName();
2416 for (
const auto &fd : *fn)
2419 fd->addIncludedUsingDirectives(visitedFiles);
2441 if (lang==SrcLangExt::Java || lang==SrcLangExt::CSharp)
2446 AUTO_TRACE(
"class variable: file='{}' type='{}' scope='{}' name='{}' args='{}' prot={} mtype={} lang={} ann={} init='{}'",
2454 if (root->
spec.isAlias())
2460 def=type+
" "+name+args;
2465 if (root->
spec.isAlias())
2467 def=
"using "+qualScope+scopeSeparator+name;
2471 def=type+
" "+qualScope+scopeSeparator+name+args;
2483 def=qualScope+scopeSeparator+name+args;
2494 for (
const auto &imd : *mn)
2506 if (root->
lang==SrcLangExt::ObjC &&
2507 root->
mtype==MethodTypes::Property &&
2531 prot,Specifier::Normal,root->
isStatic,related,
2535 mmd->setTagInfo(root->
tagInfo());
2536 mmd->setMemberClass(cd);
2540 mmd->setDefinition(def);
2542 mmd->addSectionsToDefinition(root->
anchors);
2543 mmd->setFromAnonymousScope(fromAnnScope);
2544 mmd->setFromAnonymousMember(fromAnnMemb);
2548 mmd->setInitializer(init.c_str());
2550 mmd->setMemberGroupId(root->
mGrpId);
2551 mmd->setMemberSpecifiers(root->
spec);
2552 mmd->setVhdlSpecifiers(root->
vhdlSpec);
2553 mmd->setReadAccessor(root->
read);
2554 mmd->setWriteAccessor(root->
write);
2556 mmd->setHidden(root->
hidden);
2558 mmd->setLanguage(root->
lang);
2559 mmd->setId(root->
id);
2562 mmd->setBodyDef(root->
fileDef());
2567 mmd->setRefItems(root->
sli);
2597 AUTO_TRACE(
"global variable: file='{}' type='{}' scope='{}' name='{}' args='{}' prot={} mtype={} lang={} init='{}'",
2609 static const reg::Ex re(R
"(\a\w*)");
2611 std::string typ = ttype.str();
2633 if (scope.
find(
'@')!=-1)
return nullptr;
2649 if (root->
spec.isAlias())
2651 def=
"using "+nd->
name()+sep+name;
2655 def=type+
" "+nd->
name()+sep+name+args;
2660 def=nd->
name()+sep+name+args;
2667 if (name.
at(0)==
'@')
2673 if (root->
spec.isAlias())
2675 def=
"using "+root->
name;
2679 def=type+
" "+name+args;
2700 for (
const auto &imd : *mn)
2714 bool isPHPArray = md->
getLanguage()==SrcLangExt::PHP &&
2717 bool staticsInDifferentFiles =
2723 !staticsInDifferentFiles
2764 mmd->setTagInfo(root->
tagInfo());
2765 mmd->setMemberSpecifiers(root->
spec);
2766 mmd->setVhdlSpecifiers(root->
vhdlSpec);
2770 mmd->addSectionsToDefinition(root->
anchors);
2771 mmd->setFromAnonymousScope(fromAnnScope);
2772 mmd->setFromAnonymousMember(fromAnnMemb);
2774 mmd->setInitializer(init.c_str());
2776 mmd->setMemberGroupId(root->
mGrpId);
2777 mmd->setDefinition(def);
2778 mmd->setLanguage(root->
lang);
2779 mmd->setId(root->
id);
2787 mmd->setBodyDef(fd);
2792 mmd->setRefItems(root->
sli);
2795 mmd->setNamespace(nd);
2803 mmd->setFileDef(fd);
2831 if (lang == SrcLangExt::Fortran || lang == SrcLangExt::VHDL)
2836 static const reg::Ex re(R
"(\([^)]*[*&^][^)]*\))");
2838 size_t i=std::string::npos;
2842 i = match.position();
2845 if (i!=std::string::npos)
2847 size_t di = type.find(
"decltype(");
2848 if (di!=std::string::npos && di<i)
2850 i = std::string::npos;
2853 size_t bb=type.find(
'<');
2854 size_t be=type.rfind(
'>');
2855 bool templFp =
false;
2856 if (be!=std::string::npos) {
2857 size_t cc_ast = type.find(
"::*");
2858 size_t cc_amp = type.find(
"::&");
2859 templFp = (cc_ast != std::string::npos && cc_ast>be) || (cc_amp != std::string::npos && cc_amp>be);
2862 if (!type.empty() &&
2863 i!=std::string::npos &&
2864 type.find(
"operator")==std::string::npos &&
2865 (type.find(
")(")==std::string::npos || type.find(
"typedef ")!=std::string::npos) &&
2867 (!(bb<i && i<be) || templFp)
2870 if (pLength) *pLength=
static_cast<int>(l);
2873 return static_cast<int>(i);
2890 bool result =
false;
2891 bool typeIsClass =
false;
2892 bool typePtrType =
false;
2926 typePtrType = type.
find(
'*')!=-1 || type.
find(
'&')!=-1;
2929 typeIsClass = resolver.
resolveClass(ctx,type)!=
nullptr;
2931 if (!typeIsClass && (ti=type.
find(
'<'))!=-1)
2948 static const reg::Ex initChars(R
"([\d"'&*!^]+)");
2952 std::string name = a.
name.
str();
2953 if (
reg::search(name,match,initChars) && match.position()==0)
2985 std::string atype = a.
type.
str();
2986 if (
reg::search(atype,match,initChars) && match.position()==0)
2993 if (resType.empty()) resType=atype;
2994 static const reg::Ex idChars(R
"(\a\w*)");
2995 if (
reg::search(resType,match,idChars) && match.position()==0)
2997 resType=match.str();
2998 if (resType==
"int" || resType==
"long" ||
2999 resType==
"float" || resType==
"double" ||
3000 resType==
"char" || resType==
"void" ||
3001 resType==
"signed" || resType==
"unsigned" ||
3002 resType==
"const" || resType==
"volatile" )
3032static int findEndOfTemplate(
const QCString &s,
size_t startPos)
3039 bool insideString=
FALSE;
3040 bool insideChar=
FALSE;
3042 while (e<len && brCount!=0)
3048 if (!insideString && !insideChar)
3050 if (e<len-1 && s.
at(e+1)==
'<')
3052 else if (roundCount==0)
3057 if (!insideString && !insideChar)
3059 if (e<len-1 && s.
at(e+1)==
'>')
3061 else if (roundCount==0)
3066 if (!insideString && !insideChar)
3070 if (!insideString && !insideChar)
3076 if (insideString && pc!=
'\\')
3085 if (insideChar && pc!=
'\\')
3095 return brCount==0 ?
static_cast<int>(e) : -1;
3104 AUTO_TRACE(
"VARIABLE_SEC: type='{}' name='{}' args='{}' bodyLine={} endBodyLine={} mGrpId={} relates='{}'",
3111 if (type.
isEmpty() && name.
find(
"operator")==-1 &&
3112 (name.
find(
'*')!=-1 || name.
find(
'&')!=-1))
3119 std::string sargs = args.
str();
3120 static const reg::Ex reName(R
"(\a\w*)");
3125 sargs = match.suffix().str();
3126 size_t j = sargs.find(
')');
3127 if (j!=std::string::npos) args=sargs.substr(0,j);
3137 int ai = type.
find(
'[',i);
3143 else if (type.
find(
')',i)!=-1)
3150 AUTO_TRACE_ADD(
"after correction: type='{}' name='{}' args='{}'",type,name,args);
3161 scope=name.
left(index);
3162 name=name.
mid(index+2);
3181 bool isRelated=
FALSE;
3182 bool isMemberOf=
FALSE;
3185 if (root->
lang==SrcLangExt::CSharp)
3198 for (
size_t i=0;i<name.
length()-1;i++)
3200 if (name[i]==
':' && name[i+1]==
':')
3202 p=
static_cast<int>(i);
3204 else if (name[i]==
'<')
3208 int e = findEndOfTemplate(name,i+1);
3209 if (e!=-1) i=
static_cast<int>(e);
3215 if (type==
"friend class" || type==
"friend struct" ||
3216 type==
"friend union")
3230 Relationship::Member
3256 else if (root->
mtype==MethodTypes::Property)
3258 else if (root->
mtype==MethodTypes::Event)
3260 else if (type.
find(
"sequence<") != -1)
3262 else if (type.
find(
"dictionary<") != -1)
3268 isMemberOf=(root->
relatesType==RelatesType::MemberOf);
3286 int si=scope.
find(
'@');
3290 bool inlineSimpleStructs =
Config_getBool(INLINE_SIMPLE_STRUCTS);
3291 Relationship relationship = isMemberOf ? Relationship::Foreign :
3292 isRelated ? Relationship::Related :
3293 Relationship::Member ;
3294 if (si!=-1 && !inlineSimpleStructs)
3298 pScope = scope.
left(std::max(si-2,0));
3300 pScope.
prepend(annScopePrefix);
3301 else if (annScopePrefix.
length()>2)
3302 pScope=annScopePrefix.
left(annScopePrefix.
length()-2);
3303 if (name.
at(0)!=
'@')
3371 scope=rname.
left(index);
3372 rname=rname.
mid(index+2);
3384 for (
auto &imd : *mn)
3386 if (!imd->isTypedef())
3395 bool notBothGrouped = root->
groups.empty() || imd->getGroupDef()==
nullptr;
3396 bool bothSameScope = (!cd && !nd) || (cd && imd->getClassDef() == cd) || (nd && imd->getNamespaceDef() == nd);
3399 if (notBothGrouped && bothSameScope && imd->typeString()==rtype)
3446 for (
const auto &e : root->
children())
3447 if (!e->section.isEnum())
3464 for (
const auto &e : root->
children())
3465 if (!e->section.isEnum())
3482 for (
const auto &e : root->
children())
3483 if (!e->section.isEnum())
3498 (root->
section.isVariable() &&
3501 (root->
section.isFunction() &&
3504 (root->
section.isFunction() &&
3513 for (
const auto &e : root->
children())
3514 if (!e->section.isEnum())
3540 mmd->setTagInfo(root->
tagInfo());
3541 mmd->setMemberClass(cd);
3543 mmd->setDocsForDefinition(
false);
3547 mmd->setMemberSpecifiers(root->
spec);
3548 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3549 mmd->setMemberGroupId(root->
mGrpId);
3551 mmd->setLanguage(root->
lang);
3552 mmd->setBodyDef(fd);
3553 mmd->setFileDef(fd);
3554 mmd->addSectionsToDefinition(root->
anchors);
3556 mmd->setDefinition(def);
3560 AUTO_TRACE(
"Interface member: fileName='{}' type='{}' name='{}' mtype='{}' prot={} virt={} state={} proto={} def='{}'",
3568 root->
spec.isOptional() ? Protection::Protected : Protection::Public, Specifier::Normal);
3578 mmd->setRefItems(root->
sli);
3587 if (root->
section.isExportedInterface() || root->
section.isIncludedService())
3589 AUTO_TRACE(
"Exported interface/included service: type='{}' scope='{}' name='{}' args='{}'"
3590 " relates='{}' relatesType='{}' file='{}' line={} bodyLine={} #tArgLists={}"
3591 " mGrpId={} spec={} proto={} docFile='{}'",
3617 "Illegal member name found.");
3623 case SrcLangExt::Unknown:
3624 case SrcLangExt::IDL:
3661 if ((fd==
nullptr || fd->
getLanguage()==SrcLangExt::Cpp) &&
3663 (i=name.
find(
'<'))!=-1 &&
3664 (j=name.
find(
'>'))!=-1 &&
3665 (j!=i+2 || name.
at(i+1)!=
'=')
3683 root->
relatesType==RelatesType::MemberOf ? Relationship::Foreign :
3684 Relationship::Related ;
3694 mmd->setTagInfo(root->
tagInfo());
3695 mmd->setMemberClass(cd);
3697 mmd->setDocsForDefinition(!root->
proto);
3701 mmd->setMemberSpecifiers(spec);
3702 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3703 mmd->setMemberGroupId(root->
mGrpId);
3705 mmd->setLanguage(root->
lang);
3706 mmd->setRequiresClause(root->
req);
3707 mmd->setId(root->
id);
3708 mmd->setBodyDef(fd);
3709 mmd->setFileDef(fd);
3710 mmd->addSectionsToDefinition(root->
anchors);
3715 if (scopeSeparator!=
"::")
3717 qualScope =
substitute(qualScope,
"::",scopeSeparator);
3719 if (lang==SrcLangExt::PHP)
3722 scopeSeparator=
"::";
3740 def=type+
" "+qualScope+scopeSeparator+name;
3744 def=qualScope+scopeSeparator+name;
3748 mmd->setDefinition(def);
3752 AUTO_TRACE(
"function member: type='{}' scope='{}' name='{}' args='{}' proto={} def='{}'",
3753 type, qualScope, rname, args, root->
proto, def);
3763 mmd->setRefItems(root->
sli);
3787 mmd->setTagInfo(root->
tagInfo());
3788 mmd->setLanguage(root->
lang);
3789 mmd->setId(root->
id);
3794 mmd->setDocsForDefinition(!root->
proto);
3800 mmd->addSectionsToDefinition(root->
anchors);
3801 mmd->setMemberSpecifiers(root->
spec);
3802 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3803 mmd->setMemberGroupId(root->
mGrpId);
3804 mmd->setRequiresClause(root->
req);
3839 def=root->
type+
" "+scope+name;
3845 AUTO_TRACE(
"new non-member function type='{}' scope='{}' name='{}' args='{}' proto={} def='{}'",
3847 mmd->setDefinition(def);
3851 mmd->setRefItems(root->
sli);
3855 mmd->setNamespace(nd);
3862 mmd->setFileDef(fd);
3883 if (root->
section.isFunction())
3885 AUTO_TRACE(
"member function: type='{}' scope='{}' name='{}' args='{}' relates='{}' relatesType='{}'"
3886 " file='{}' line={} bodyLine={} #tArgLists={} mGrpId={}"
3887 " spec={} proto={} docFile='{}'",
3892 bool isFriend=root->
type.
find(
"friend ")!=-1;
3902 scope=rname.
left(index);
3903 rname=rname.
mid(index+2);
3912 if (root->
lang==SrcLangExt::CSharp)
3923 int memIndex=rname.
findRev(
"::");
3926 if (cd && scope+
"::"==rname.
left(scope.
length()+2))
3932 bool isMember=
FALSE;
3935 int ts=rname.
find(
'<');
3936 int te=rname.
find(
'>');
3937 if (memIndex>0 && (ts==-1 || te==-1))
3954 isMember=memIndex<ts || memIndex>te;
3994 for (
const auto &imd : *mn)
4007 fullScope.
prepend(parentScope);
4013 if (mnd) nsName = mnd->
name();
4014 if (rnd) rnsName = rnd->
name();
4022 bool sameTemplateArgs =
TRUE;
4023 bool matchingReturnTypes =
TRUE;
4024 bool sameRequiresClause =
TRUE;
4030 matchingReturnTypes =
FALSE;
4034 sameRequiresClause =
FALSE;
4040 sameTemplateArgs =
FALSE;
4043 bool staticsInDifferentFiles =
4051 matchingReturnTypes &&
4052 sameRequiresClause &&
4053 !staticsInDifferentFiles
4057 if (!root->
groups.empty() && !root->
groups.front().groupname.isEmpty())
4064 found=(mnd && rnd && nsName==rnsName) ||
4065 ((mnd==
nullptr && rnd==
nullptr && mfd!=
nullptr &&
4076 AUTO_TRACE_ADD(
"combining function with prototype found={} in namespace '{}'",
found,nsName);
4178 "Illegal member name found."
4196 for (
const auto &ifmd : *fn)
4200 for (
const auto &immd : *mn)
4216 AUTO_TRACE_ADD(
"Merging related global and member '{}' isFriend={} isRelated={} isFunction={}",
4293 for (
const auto &imdec : *mn)
4301 for (
const auto &imdef : *mn)
4304 if (mdef && mdec!=mdef &&
4324 for (
const auto &imd : *mn)
4340 if (mdef && mdec)
break;
4348 mdec->getOuterScope(),mdec->getFileDef(),
const_cast<ArgumentList*
>(&mdecAl),
4355 mdec->mergeReferences(mdef);
4357 mdec->mergeReferencedBy(mdef);
4374 for (
const auto &imd : *mn)
4385 for (
const auto &irmd : *rmn)
4419 size_t i=qualifiedName.rfind(
"::");
4420 if (i!=std::string::npos)
4422 QCString scope = qualifiedName.substr(0,i);
4423 QCString name = qualifiedName.substr(i+2);
4427 for (
const auto &imd : *mn)
4453 std::map<std::string,int> templateNames;
4455 for (
const Argument &arg : templateArguments)
4457 static const reg::Ex re(R
"(\a[\w:]*)");
4460 for (; it!=
end ; ++it)
4462 const auto &match = *it;
4463 std::string n = match.str();
4464 if (n==arg.name.str())
4466 if (templateNames.find(n)==templateNames.end())
4468 templateNames.emplace(n,count);
4473 return templateNames;
4488 if (context && cd!=context)
4493 if (result==
nullptr)
4498 if (result==
nullptr)
4527 for (
auto &mi : *mni)
4537 type = typedefValue;
4556 usedClassName = typeCd->
name();
4559 int sp=usedClassName.
find(
'<');
4568 if (templateNames.empty())
4572 BaseInfo bi(usedName,Protection::Public,Specifier::Normal);
4577 if (arg.name==usedName)
4581 if (usedCd==
nullptr)
4691 if (templateNames.empty())
4729 AUTO_TRACE(
"Derived from template '{}' with parameters '{}' isArtificial={}",
4730 templateClass->
name(),templSpec,isArtificial);
4733 bool existingClass = templSpec==tempArgsStr;
4734 if (existingClass)
return;
4736 bool freshInstance=
FALSE;
4753 for (
auto it=it_pair.first ; it!=it_pair.second ; ++it)
4755 const Entry *templateRoot = it->second;
4756 AUTO_TRACE_ADD(
"template root found '{}' templSpec='{}'",templateRoot->
name,templSpec);
4762 isArtificial,templArgs.get(),templateNames);
4781 int ti=ttype.
find(
'<');
4787 templateClassName,
true,
true);
4788 AUTO_TRACE_ADD(
"templateClassName={} baseClass={}",templateClassName,baseClass?baseClass->
name():
"<none>");
4807 int index=n.
find(
'<');
4819 int l =
static_cast<int>(name.
length());
4825 while (count>0 && i>=0)
4830 case '>':
if (!insideQuote) count++;
break;
4831 case '<':
if (!insideQuote) count--;
break;
4832 case '\'':
if (!insideQuote) insideQuote=c;
4833 else if (insideQuote==c && (i<0 || name[i]!=
'\\')) insideQuote=0;
4835 case '"':
if (!insideQuote) insideQuote=c;
4836 else if (insideQuote==c && (i<0 || name[i]!=
'\\')) insideQuote=0;
4856 AUTO_TRACE(
"name={} base={} isArtificial={} mode={}",cd->
name(),bi->
name,isArtificial,(
int)mode);
4859 bool explicitGlobalScope=
FALSE;
4863 explicitGlobalScope=
TRUE;
4867 bool lastParent=
FALSE;
4872 int scopeOffset=explicitGlobalScope ? 0 :
static_cast<int>(scopeName.
length());
4881 baseClassName.
prepend(scopeName.
left(scopeOffset)+
"::");
4883 if (root->
lang==SrcLangExt::CSharp)
4910 || explicitGlobalScope
4913 || (root->
lang==SrcLangExt::IDL &&
4914 (root->
section.isExportedInterface() ||
4915 root->
section.isIncludedService()))
4918 AUTO_TRACE_ADD(
"class relation '{}' inherited/used by '{}' found prot={} virt={} templSpec='{}'",
4919 baseClassName, root->
name, bi->
prot, bi->
virt, templSpec);
4922 int si=baseClassName.
findRev(
"::",i);
4924 if (baseClass==
nullptr &&
static_cast<size_t>(i)!=baseClassName.
length())
4929 int e=findEndOfTemplate(baseClassName,i+1);
4934 baseClassName = baseClassName.
left(i)+baseClassName.
right(baseClassName.
length()-e);
4945 else if (baseClass && !templSpec.
isEmpty())
4956 baseClass = templClass;
4964 if (!
found && si!=-1)
4974 found=baseClass!=
nullptr && baseClass!=cd;
4984 found = baseClass!=
nullptr && baseClass!=cd;
4996 found = baseClass!=
nullptr && baseClass!=cd;
4999 bool isATemplateArgument = templateNames.find(biName.
str())!=templateNames.end();
5004 AUTO_TRACE_ADD(
"Documented base class '{}' templSpec='{}'",biName,templSpec);
5022 if (baseClassTypeDef==
nullptr)
5032 if (baseClassTypeDef)
5041 AUTO_TRACE_ADD(
"insertBaseClass name={} prot={} virt={} templSpec={}",usedName,prot,bi->
virt,templSpec);
5049 "Detected potential recursive class relation "
5050 "between class {} and base class {}!",
5057 else if (mode==
Undocumented && (scopeOffset==0 || isATemplateArgument))
5059 AUTO_TRACE_ADD(
"New undocumented base class '{}' baseClassName='{}' templSpec='{}' isArtificial={}",
5060 biName,baseClassName,templSpec,isArtificial);
5062 if (isATemplateArgument)
5065 if (baseClass==
nullptr)
5084 if (baseClass==
nullptr)
5095 si = baseClassName.
findRev(
"::");
5111 biName=
"<"+biName.
left(biName.
length()-2)+
">";
5115 AUTO_TRACE_ADD(
"insertBaseClass name={} prot={} virt={} templSpec={}",biName,bi->
prot,bi->
virt,templSpec);
5125 if (scope!=baseClass)
5151 "Detected potential recursive class relation "
5152 "between class {} and base class {}!",
5153 root->
name,baseClassName
5164 else if ((scopeOffset=scopeName.
findRev(
"::",scopeOffset-1))==-1)
5169 }
while (scopeOffset>=0);
5171 if (parentNode==
nullptr)
5177 parentNode=parentNode->
parent();
5179 }
while (lastParent);
5199 bool hasExtends = !root->
extends.empty();
5200 if (hasExtends)
return TRUE;
5224 if ((root->
lang==SrcLangExt::CSharp || root->
lang==SrcLangExt::Java) &&
5225 (i=bName.
find(
'<'))!=-1)
5229 if (root->
lang==SrcLangExt::CSharp)
5235 bName = bName.
left(i);
5265 if (i!=-1 && root->
lang!=SrcLangExt::CSharp && root->
lang!=SrcLangExt::Java)
5298 if (!nd->hasDocumentation())
5301 nd->getLanguage() == SrcLangExt::Fortran) &&
5305 warn_undoc(nd->getDefFileName(),nd->getDefLine(),
"{} {} is not documented.",
5306 nd->getLanguage() == SrcLangExt::Fortran ?
"Module" :
"Namespace",
5370 for (
const auto &tn_kv : templateNames)
5372 size_t templIndex = tn_kv.second;
5374 bool hasActArg=
FALSE;
5375 if (templIndex<templArgs->size())
5377 actArg=templArgs->at(templIndex);
5381 baseClassNames.find(actArg.
type.
str())!=baseClassNames.end() &&
5382 actualTemplateNames.find(actArg.
type.
str())==actualTemplateNames.end()
5385 actualTemplateNames.emplace(actArg.
type.
str(),
static_cast<int>(templIndex));
5420 for (
const auto &fd : *fn)
5422 fd->computeAnchors();
5435 gd->computeAnchors();
5455 for (
const auto &fd : *fn)
5457 fd->addListReferences();
5472 gd->addListReferences();
5477 QCString name = pd->getOutputFileBase();
5478 if (pd->getGroupDef())
5480 name = pd->getGroupDef()->getOutputFileBase();
5487 name,pd->title(),
QCString(),
nullptr);
5493 QCString name = dd->getOutputFileBase();
5502 name,dd->displayName(),
QCString(),
nullptr);
5531 if (md==
nullptr)
return;
5532 AUTO_TRACE(
"scope='{}' name='{}' args='{}' funcDecl='{}' mSpec={}",
5547 fullName = cd->
name();
5549 fullName = nd->
name();
5551 if (!fullName.
isEmpty()) fullName+=
"::";
5552 fullName+=md->
name();
5656 "member {} belongs to two different groups. The second one found here will be ignored.",
5691 return allowNoGroup;
5694 for (
const auto &g : root->
groups)
5696 if (g.groupname == gd->
name())
5719 AUTO_TRACE(
"namespace='{}' type='{}' name='{}' tempArg='{}' decl='{}'",namespaceName,type,name,tempArg,decl);
5733 for (
const auto &md : *mn)
5744 if (md->isAlias() && md->getOuterScope() &&
5751 nd = md->getNamespaceDef();
5756 if (nd && md->isEnumValue() && (enumNamePos=namespaceName.
findRev(
"::"))!=-1)
5758 QCString enumName = namespaceName.
mid(enumNamePos+2);
5759 if (namespaceName.
left(enumNamePos)==nd->
name())
5764 for (
const auto &emd : *enumMn)
5766 found = emd->isStrong() && md->getEnumScope()==emd.get();
5780 else if (nd==
nullptr && md->isEnumValue())
5785 for (
const auto &emd : *enumMn)
5787 found = emd->isStrong() && md->getEnumScope()==emd.get();
5810 if ((namespaceName.
isEmpty() && nd==
nullptr) ||
5811 (nd && nd->
name()==namespaceName) ||
5815 AUTO_TRACE_ADD(
"Try to add member '{}' to scope '{}'",md->name(),namespaceName);
5823 md->isVariable() || md->isTypedef() ||
5831 if (matching && !root->
tArgLists.empty())
5850 if (matching && md->isStatic() &&
5851 md->getDefFileName()!=root->
fileName &&
5859 if (!md->templateArguments().empty() && !root->
tArgLists.empty())
5863 if (md->templateArguments().size()!=root->
tArgLists.back().size() ||
5864 md->typeString()!=type ||
5865 md->requiresClause()!=root->
req)
5885 QCString warnMsg =
"no matching file member found for \n"+fullFuncDecl;
5888 warnMsg+=
"\nPossible candidates:";
5889 for (
const auto &md : *mn)
5893 warnMsg+=
"' " +
warn_line(md->getDefFileName(),md->getDefLine());
5901 if (root->
type!=
"friend class" &&
5902 root->
type!=
"friend struct" &&
5903 root->
type!=
"friend union" &&
5904 root->
type!=
"friend" &&
5910 "documented symbol '{}' was not declared or defined.",
qPrint(decl)
5922 auto srcIt = srcTempArgLists.begin();
5923 auto dstIt = dstTempArgLists.begin();
5924 while (srcIt!=srcTempArgLists.end() && dstIt!=dstTempArgLists.end())
5926 if ((*srcIt).size()!=(*dstIt).size())
return TRUE;
5940 result = cd->templateArguments().hasParameters() || cd->templateMaster()!=
nullptr ||
5950 const std::string &src
5954 static const reg::Ex re(R
"(\a\w*)");
5959 for (; it!=
end ; ++it)
5961 const auto &match = *it;
5962 size_t i = match.position();
5963 size_t l = match.length();
5965 dst+=src.substr(p,i-p);
5966 std::string name=match.str();
5968 auto srcIt = srcTempArgLists.begin();
5969 auto dstIt = dstTempArgLists.begin();
5970 while (srcIt!=srcTempArgLists.end() && !
found)
5973 std::vector<Argument>::const_iterator tdaIt;
5974 if (dstIt!=dstTempArgLists.end())
5977 tdaIt = tdAli->
begin();
5982 for (
auto tsaIt = tsaLi.
begin(); tsaIt!=tsaLi.
end() && !
found; ++tsaIt)
5986 if (tdAli && tdaIt!=tdAli->
end())
6002 else if (tdaType.
startsWith(
"typename ")) vc=9;
6005 tdaName = tdaType.
mid(vc);
6038 auto dstIt = dst.
begin();
6043 if (dstIt == dst.
end())
6047 da.
array = dstArray;
6055 da.
array = dstArray;
6063 srcTempArgLists,dstTempArgLists,
6089 funcType,funcName,funcArgs,exceptions,
6093 mmd->setTagInfo(root->
tagInfo());
6094 mmd->setLanguage(root->
lang);
6095 mmd->setId(root->
id);
6096 mmd->makeImplementationDetail();
6097 mmd->setMemberClass(cd);
6098 mmd->setDefinition(funcDecl);
6104 mmd->setDocsForDefinition(!root->
proto);
6106 mmd->addSectionsToDefinition(root->
anchors);
6110 mmd->setMemberSpecifiers(spec);
6111 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6112 mmd->setMemberGroupId(root->
mGrpId);
6115 mmd->setRefItems(root->
sli);
6151 bool memFound=
FALSE;
6152 for (
const auto &imd : *mn)
6155 if (md==
nullptr)
continue;
6157 if (cd==
nullptr)
continue;
6174 if (!namespaceName.
isEmpty()) fullScope.
prepend(namespaceName+
"::");
6175 if (fullScope==cd->
name())
6181 for (
const auto &emd : *enumMn)
6183 memFound = emd->isStrong() && md->
getEnumScope()==emd.get();
6189 if (memFound)
break;
6194 if (memFound)
break;
6212 if (!templAl.
empty())
6214 declTemplArgs.push_back(templAl);
6222 bool substDone=
FALSE;
6229 if (declTemplArgs.size()>0 && declTemplArgs.size()==defTemplArgs.size())
6245 AUTO_TRACE_ADD(
"matching '{}'<=>'{}' className='{}' namespaceName='{}'",
6269 AUTO_TRACE_ADD(
"Comparing return types '{}'<->'{}' #args {}<->{}",
6277 else if (defTemplArgs.size()>declTemplArgs.size())
6279 AUTO_TRACE_ADD(
"Different number of template arguments {} vs {}",defTemplArgs.size(),declTemplArgs.size());
6285 bool rootIsUserDoc = root->
section.isMemberDoc();
6288 bool classOrMdIsTemplate = mdIsTemplate || classIsTemplate;
6289 bool rootIsTemplate = !root->
tArgLists.empty();
6291 if (!rootIsUserDoc &&
6292 (mdIsTemplate || rootIsTemplate) &&
6293 ((classOrMdIsTemplate && !rootIsTemplate) || (!classOrMdIsTemplate && rootIsTemplate))
6298 AUTO_TRACE_ADD(
"Comparing return types: template v.s. non-template");
6302 AUTO_TRACE_ADD(
"Match results of matchArguments2='{}' substDone='{}'",matching,substDone);
6313 if (!funcTempList.
isEmpty() &&
6333 else if (cd && cd!=tcd)
6339 if (memFound)
break;
6343 addLocalObjCMethod(root,scopeName,funcType,funcName,funcArgs,exceptions,funcDecl,spec);
6346 if (count==0 && !(isFriend && funcType==
"class"))
6349 const ClassDef *ecd =
nullptr, *ucd =
nullptr;
6350 MemberDef *emd =
nullptr, *umd =
nullptr;
6352 for (
const auto &md : *mn)
6374 AUTO_TRACE_ADD(
"new candidate className='{}' scope='{}' args='{}': exact match",
6375 className,ccd->
name(),md->argsString());
6381 AUTO_TRACE_ADD(
"new candidate className='{}' scope='{}' args='{}': no match",
6382 className,ccd->
name(),md->argsString());
6387 bool strictProtoMatching =
Config_getBool(STRICT_PROTO_MATCHING);
6388 if (!strictProtoMatching)
6390 if (candidates==1 && ucd && umd)
6397 else if (candidates>1 && ecd && emd)
6408 if (noMatchCount>1) warnMsg+=
"uniquely ";
6409 warnMsg+=
"matching class member found for \n";
6413 warnMsg+=
" template ";
6422 warnMsg+=fullFuncDecl;
6424 if (candidates>0 || noMatchCount>=1)
6426 warnMsg+=
"\nPossible candidates:";
6432 for (
const auto &md : *mn)
6434 const ClassDef *cd=md->getClassDef();
6448 warnMsg+=
"template ";
6453 if (!md->typeString().isEmpty())
6455 warnMsg+=md->typeString();
6460 warnMsg+=qScope+
"::"+md->name();
6461 warnMsg+=md->argsString();
6462 warnMsg+=
"' " +
warn_line(md->getDefFileName(),md->getDefLine());
6483 AUTO_TRACE(
"funcType={} funcName={} funcArgs={} funcDecl={} spec={}",funcType,funcName,funcArgs,funcDecl,spec);
6485 for (
const auto &md : *mn)
6487 if (md->getClassDef()==cd)
6499 funcType,funcName,funcArgs,exceptions,
6505 mmd->setTagInfo(root->
tagInfo());
6506 mmd->setLanguage(root->
lang);
6507 mmd->setId(root->
id);
6508 mmd->setMemberClass(cd);
6509 mmd->setTemplateSpecialization(
TRUE);
6511 mmd->setDefinition(funcDecl);
6517 mmd->setDocsForDefinition(!root->
proto);
6519 mmd->addSectionsToDefinition(root->
anchors);
6523 mmd->setMemberSpecifiers(spec);
6524 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6525 mmd->setMemberGroupId(root->
mGrpId);
6527 mmd->setRefItems(root->
sli);
6541 bool sameClass=
false;
6546 [](
const auto &md1,
const auto &md2)
6547 { return md1->getClassDef()->name()==md2->getClassDef()->name(); });
6553 if (cd==
nullptr)
return;
6561 std::unique_ptr<ArgumentList> tArgList =
6566 funcType,funcName,funcArgs,exceptions,
6570 mmd->setTagInfo(root->
tagInfo());
6571 mmd->setLanguage(root->
lang);
6572 mmd->setId(root->
id);
6574 mmd->setMemberClass(cd);
6575 mmd->setDefinition(funcDecl);
6584 mmd->setDocsForDefinition(!root->
proto);
6586 mmd->addSectionsToDefinition(root->
anchors);
6590 mmd->setMemberSpecifiers(spec);
6591 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6592 mmd->setMemberGroupId(root->
mGrpId);
6595 mmd->setRefItems(root->
sli);
6653 AUTO_TRACE(
"root='{}' funcDecl='{}' related='{}' overload={} isFunc={} mGrpId={} #tArgList={} spec={} lang={}",
6666 bool isRelated=
false;
6667 bool isMemberOf=
false;
6668 bool isFriend=
false;
6681 spec.setInline(
true);
6686 spec.setExplicit(
true);
6691 spec.setMutable(
true);
6702 while ((sep=funcDecl.
find(
';'))!=-1)
6708 if (!funcDecl.
isEmpty() && funcDecl[0]!=
' ') funcDecl.
prepend(
" ");
6720 if (isFriend && funcDecl.
startsWith(
"class "))
6724 funcName = funcDecl;
6726 else if (isFriend && funcDecl.
startsWith(
"struct "))
6729 funcName = funcDecl;
6735 funcArgs,funcTempList,exceptions
6743 AUTO_TRACE_ADD(
"scopeName='{}' className='{}' namespaceName='{}' funcType='{}' funcName='{}' funcArgs='{}'",
6744 scopeName,className,namespaceName,funcType,funcName,funcArgs);
6748 isMemberOf=(root->
relatesType == RelatesType::MemberOf);
6755 scopeName = relates;
6768 scopeName = joinedName;
6782 QCString joinedName = fnd->name()+
"::"+scopeName;
6785 scopeName=joinedName;
6812 AUTO_TRACE_ADD(
"scopeName='{}' className='{}' namespaceName='{}'",scopeName,className,namespaceName);
6821 scopeName=namespaceName;
6823 else if (!relates.
isEmpty() ||
6826 scopeName=namespaceName+
"::"+className;
6830 scopeName=className;
6833 else if (!className.
isEmpty())
6835 scopeName=className;
6845 uint32_t argListIndex=0;
6850 tempScopeName=scopeName+funcSpec;
6864 funcDecl=funcType+
" "+tempScopeName+
"::"+funcName+funcTempList;
6868 funcDecl=funcType+
" "+tempScopeName+
"::"+funcName+funcArgs;
6875 funcDecl=tempScopeName+
"::"+funcName+funcTempList;
6879 funcDecl=tempScopeName+
"::"+funcName+funcArgs;
6889 funcDecl=funcType+
" "+funcName+funcTempList;
6893 funcDecl=funcType+
" "+funcName+funcArgs;
6900 funcDecl=funcName+funcTempList;
6904 funcDecl=funcName+funcArgs;
6909 if (funcType==
"template class" && !funcTempList.
isEmpty())
6912 AUTO_TRACE_ADD(
"Parse results: namespaceName='{}' className=`{}` funcType='{}' funcSpec='{}' "
6913 " funcName='{}' funcArgs='{}' funcTempList='{}' funcDecl='{}' relates='{}'"
6914 " exceptions='{}' isRelated={} isMemberOf={} isFriend={} isFunc={}",
6915 namespaceName, className, funcType, funcSpec,
6916 funcName, funcArgs, funcTempList, funcDecl, relates,
6917 exceptions, isRelated, isMemberOf, isFriend, isFunc);
6923 bool strongEnum =
false;
6927 for (
const auto &imd : *mn)
6940 namespaceName+=
"::"+className;
6944 namespaceName=className;
6952 funcName =
substitute(funcName,className+
"::",
"");
6963 if (!isRelated && !strongEnum && mn)
6971 funcArgs,funcTempList,exceptions,
6972 type,args,isFriend,spec,relates,funcDecl,overloaded,isFunc);
6984 else if (overloaded)
6986 addOverloaded(root,mn,funcType,funcName,funcArgs,funcDecl,exceptions,spec);
6990 if (!
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec))
6995 "Cannot determine class for function\n{}",
7001 else if (isRelated && !relates.
isEmpty())
7003 AUTO_TRACE_ADD(
"related function scopeName='{}' className='{}'",scopeName,className);
7004 if (className.
isEmpty()) className=relates;
7008 bool newMember=
TRUE;
7014 for (
const auto &imd : *mn)
7048 mn->
push_back(std::move(mdDefineTaken));
7062 for (
const auto &irmd : *mn)
7083 addMemberDocs(root,rmd_found,funcDecl,
nullptr,overloaded,spec);
7091 switch (root->
mtype)
7112 funcType,funcName,funcArgs,exceptions,
7115 isMemberOf ? Relationship::Foreign : Relationship::Related,
7135 mmd->setDefinitionTemplateParameterLists(root->
tArgLists);
7137 mmd->setTagInfo(root->
tagInfo());
7151 for (
const auto &irmd : *rmn)
7182 mmd->setBodyDef(fd);
7189 mmd->setMemberClass(cd);
7190 mmd->setMemberSpecifiers(spec);
7191 mmd->setVhdlSpecifiers(root->
vhdlSpec);
7192 mmd->setDefinition(funcDecl);
7197 mmd->setDocsForDefinition(!root->
proto);
7200 mmd->addSectionsToDefinition(root->
anchors);
7201 mmd->setMemberGroupId(root->
mGrpId);
7202 mmd->setLanguage(root->
lang);
7203 mmd->setId(root->
id);
7207 mmd->setRefItems(root->
sli);
7208 if (root->
relatesType==RelatesType::Duplicate) mmd->setRelatedAlso(cd);
7216 if (!
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec))
7221 "Cannot determine file/namespace for relatedalso function\n{}",
7235 addLocalObjCMethod(root,scopeName,funcType,funcName,funcArgs,exceptions,funcDecl,spec);
7239 bool globMem =
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec);
7240 if (className.
isEmpty() && !globMem)
7244 else if (!className.
isEmpty() && !globMem)
7247 "member '{}' of class '{}' cannot be found",
7248 funcName,className);
7266 AUTO_TRACE(
"root->type='{}' root->inside='{}' root->name='{}' root->args='{}' section={} root->spec={} root->mGrpId={}",
7281 type=type.
left(i+l);
7292 if (root->
section.isMemberDoc())
7318 else if (root->
section.isOverloadDoc())
7332 (root->
section.isVariable() &&
7344 if (type==
"friend class" || type==
"friend struct" ||
7345 type==
"friend union")
7351 type+
" "+root->
name,
7384 else if (root->
section.isVariableDoc())
7396 else if (root->
section.isExportedInterface() ||
7397 root->
section.isIncludedService())
7403 type +
" " + root->
name,
7416 if (root->
section.isMemberDoc() ||
7417 root->
section.isOverloadDoc() ||
7420 root->
section.isVariableDoc() ||
7422 root->
section.isIncludedService() ||
7423 root->
section.isExportedInterface()
7433 for (
const auto &e : root->
children())
7435 if (!e->section.isEnum())
7447 for (
const auto &objCImpl : root->
children())
7449 if (objCImpl->section.isObjcImpl())
7451 for (
const auto &objCMethod : objCImpl->children())
7453 if (objCMethod->section.isFunction())
7457 objCMethod->relates,
7460 objCMethod->type+
" "+objCImpl->name+
"::"+objCMethod->name+
" "+objCMethod->args,
7462 objCMethod->section=EntryType::makeEmpty();
7481 bool isGlobal =
false;
7482 bool isRelated =
false;
7483 bool isMemberOf =
false;
7493 if (root->
lang==SrcLangExt::CSharp)
7516 isMemberOf=(root->
relatesType==RelatesType::MemberOf);
7551 isMemberOf ? Relationship::Foreign : isRelated ? Relationship::Related : Relationship::Member,
7555 mmd->setTagInfo(root->
tagInfo());
7556 mmd->setLanguage(root->
lang);
7557 mmd->setId(root->
id);
7558 if (!isGlobal) mmd->setMemberClass(cd);
else mmd->setFileDef(fd);
7560 mmd->setBodyDef(root->
fileDef());
7561 mmd->setMemberSpecifiers(root->
spec);
7562 mmd->setVhdlSpecifiers(root->
vhdlSpec);
7563 mmd->setEnumBaseType(root->
args);
7566 mmd->addSectionsToDefinition(root->
anchors);
7567 mmd->setMemberGroupId(root->
mGrpId);
7571 mmd->setRefItems(root->
sli);
7585 mmd->setDefinition(name+baseType);
7589 mmd->setDefinition(nd->
name()+
"::"+name+baseType);
7593 mmd->setNamespace(nd);
7600 if (isGlobal && (nd==
nullptr || !nd->
isAnonymous()))
7602 if (!defSet) mmd->setDefinition(name+baseType);
7603 if (fd==
nullptr && root->
parent())
7609 mmd->setFileDef(fd);
7617 mmd->setDefinition(name+baseType);
7621 mmd->setDefinition(cd->
name()+
"::"+name+baseType);
7627 mmd->setDocsForDefinition(!root->
proto);
7657 bool isGlobal =
false;
7658 bool isRelated =
false;
7668 if (root->
lang==SrcLangExt::CSharp)
7683 if (root->
lang==SrcLangExt::CSharp)
7729 struct EnumValueInfo
7731 EnumValueInfo(
const QCString &n,std::unique_ptr<MemberDef> &&md) :
7732 name(n), member(std::move(md)) {}
7734 std::unique_ptr<MemberDef> member;
7736 std::vector< EnumValueInfo > extraMembers;
7738 for (
const auto &imd : *mn)
7745 for (
const auto &e : root->
children())
7748 bool isJavaLike = sle==SrcLangExt::CSharp || sle==SrcLangExt::Java || sle==SrcLangExt::XML;
7749 if ( isJavaLike || root->
spec.isStrong())
7751 if (sle == SrcLangExt::Cpp && e->section.isDefine())
continue;
7758 i = qualifiedName.
findRev(
"::");
7759 if (i!=-1 && sle==SrcLangExt::CSharp)
7765 qualifiedName=
substitute(qualifiedName,
"::",
".");
7770 if (fileName.
isEmpty() && e->tagInfo())
7772 fileName = e->tagInfo()->tagName;
7776 fileName,e->startLine,e->startColumn,
7777 e->type,e->name,e->args,
QCString(),
7778 e->protection, Specifier::Normal,e->isStatic,Relationship::Member,
7785 fmmd->setNamespace(mnd);
7789 fmmd->setTagInfo(e->tagInfo());
7790 fmmd->setLanguage(e->lang);
7791 fmmd->setBodySegment(e->startLine,e->bodyLine,e->endBodyLine);
7792 fmmd->setBodyDef(e->fileDef());
7794 fmmd->setDocumentation(e->doc,e->docFile,e->docLine);
7795 fmmd->setBriefDescription(e->brief,e->briefFile,e->briefLine);
7796 fmmd->addSectionsToDefinition(e->anchors);
7797 std::string init = e->initializer.str();
7798 fmmd->setInitializer(init.c_str());
7799 fmmd->setMaxInitLines(e->initLines);
7800 fmmd->setMemberGroupId(e->mGrpId);
7801 fmmd->setExplicitExternal(e->explicitExternal,fileName,e->startLine,e->startColumn);
7802 fmmd->setRefItems(e->sli);
7805 fmmd->setEnumScope(md,
TRUE);
7806 extraMembers.emplace_back(e->name,std::move(fmd));
7815 if (!e->name.isEmpty() && (fmn=emnsd->
find(e->name)))
7818 for (
const auto &ifmd : *fmn)
7849 else if (isRelated && cd)
7881 for (
auto &e : extraMembers)
7926 if (gd==
nullptr && !root->
groups.empty())
7940 for (
const auto &g : root->
groups)
7959 "Found non-existing group '{}' for the command '{}', ignoring command",
7973 if (root->
section.isEnumDoc() &&
7999 AUTO_TRACE(
"Found docs for enum with name '{}' and scope '{}' in context '{}' cd='{}', nd='{}' fd='{}'",
8013 for (
const auto &imd : *mn)
8028 else if (cd==
nullptr && mcd==
nullptr && nd!=
nullptr && mnd==nd)
8035 else if (cd==
nullptr && nd==
nullptr && mcd==
nullptr && mnd==
nullptr && fd==mfd)
8060 for (
const auto &mn : mnsd)
8063 for (
const auto &imd : *mn)
8068 int documentedEnumValues=0;
8072 if (fmd->isLinkableInProject()) documentedEnumValues++;
8098 for (
const auto &md : *mn)
8100 index.addClassMemberNameToIndex(md.get());
8101 if (md->getModuleDef())
8103 index.addModuleMemberNameToIndex(md.get());
8111 for (
const auto &md : *mn)
8113 if (md->getNamespaceDef())
8115 index.addNamespaceMemberNameToIndex(md.get());
8119 index.addFileMemberNameToIndex(md.get());
8121 if (md->getModuleDef())
8123 index.addModuleMemberNameToIndex(md.get());
8128 index.sortMemberIndexLists();
8137 if (cd->isLinkableInProject())
8150 if (cd->isLinkableInProject())
8163 if (nd->isLinkableInProject())
8176 for (
const auto &fd : *fn)
8192 std::string s = title.
str();
8193 static const reg::Ex re(R
"(\a[\w-]*)");
8196 for (; it!=
end ; ++it)
8198 const auto &match = *it;
8199 std::string matchStr = match.str();
8207 if (gd->isLinkableInProject())
8209 addWordsForTitle(gd.get(),gd->anchor(),gd->groupTitle());
8215 if (pd->isLinkableInProject())
8217 addWordsForTitle(pd.get(),pd->anchor(),pd->title());
8237 if (md->getClassDef())
8241 if (md->getNamespaceDef())
8252 if (md->getGroupDef()) scope = md->getGroupDef();
8253 else if (md->getClassDef()) scope = md->getClassDef();
8254 else if (md->getNamespaceDef()) scope = md->getNamespaceDef();
8255 else if (md->getFileDef()) scope = md->getFileDef();
8261 if (md->isLinkableInProject())
8263 if (!(md->isEnumerate() && md->isAnonymous()))
8268 if (md->isEnumerate())
8270 for (
const auto &fmd : md->enumFieldList())
8283 for (
const auto &md : *mn)
8285 addMemberToIndices(md.get());
8292 for (
const auto &md : *mn)
8294 addMemberToIndices(md.get());
8307 for (
const auto &imd : *mn)
8320 for (
const auto &imd : *mn)
8337 for (
const auto &imd : *mn)
8346 const auto &bmni = bmn.
find(mn->memberName());
8349 for (
const auto &ibmd : *bmni)
8357 lang==SrcLangExt::Python ||
8358 lang==SrcLangExt::Java ||
8359 lang==SrcLangExt::PHP ||
8370 lang==SrcLangExt::Python ||
8377 if (lang==SrcLangExt::Python && md->
name().
startsWith(
"__"))
continue;
8417 if (cd->isLinkable())
8419 for (
const auto &bcd : cd->baseClasses())
8435 for (
const auto &ti : cd->getTemplateInstances())
8454 int i=cd->name().find(
'(');
8461 AUTO_TRACE_ADD(
"merging members of category {} into {}",cd->name(),baseClass->
name());
8476 cd->subClasses().empty() &&
8477 !cd->baseClasses().empty())
8508 msg(
"Generating code for file {}...\n",fd->
docName());
8513 else if (parseSources)
8515 msg(
"Parsing code for file {}...\n",fd->
docName());
8531 for (
const auto &fd : *fn)
8539 for (
const auto &fd : *fn)
8548 clangParser->parse();
8549 processSourceFile(fd.get(),*
g_outputList,clangParser.get());
8551 for (
auto incFile : clangParser->filesInSameTU())
8553 if (filesToProcess.find(incFile)!=filesToProcess.end() &&
8555 processedFiles.
find(incFile)==processedFiles.end())
8562 processSourceFile(ifd,*
g_outputList,clangParser.get());
8563 processedFiles.insert(incFile);
8574 for (
const auto &fd : *fn)
8576 if (processedFiles.find(fd->
absFilePath().
str())==processedFiles.end())
8581 clangParser->parse();
8582 processSourceFile(fd.get(),*
g_outputList,clangParser.get());
8595 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8598 msg(
"Generating code files using {} threads.\n",numThreads);
8599 struct SourceContext
8602 : fd(fd_), generateSourceFile(gen_), ol(ol_) {}
8604 bool generateSourceFile;
8608 std::vector< std::future< std::shared_ptr<SourceContext> > > results;
8611 for (
const auto &fd : *fn)
8614 auto ctx = std::make_shared<SourceContext>(fd.get(),generateSourceFile,*
g_outputList);
8615 auto processFile = [ctx]()
8617 if (ctx->generateSourceFile)
8619 msg(
"Generating code for file {}...\n",ctx->fd->docName());
8623 msg(
"Parsing code for file {}...\n",ctx->fd->docName());
8626 ctx->fd->getAllIncludeFilesRecursively(filesInSameTu);
8627 if (ctx->generateSourceFile)
8629 ctx->fd->writeSourceHeader(ctx->ol);
8630 ctx->fd->writeSourceBody(ctx->ol,
nullptr);
8631 ctx->fd->writeSourceFooter(ctx->ol);
8636 ctx->fd->parseSource(
nullptr);
8640 results.emplace_back(threadPool.
queue(processFile));
8643 for (
auto &f : results)
8652 for (
const auto &fd : *fn)
8672 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8678 : fd(fd_), ol(ol_) {}
8683 std::vector< std::future< std::shared_ptr<DocContext> > > results;
8686 for (
const auto &fd : *fn)
8688 bool doc = fd->isLinkableInProject();
8691 auto ctx = std::make_shared<DocContext>(fd.get(),*
g_outputList);
8692 auto processFile = [ctx]() {
8693 msg(
"Generating docs for file {}...\n",ctx->fd->docName());
8694 ctx->fd->writeDocumentation(ctx->ol);
8697 results.emplace_back(threadPool.
queue(processFile));
8701 for (
auto &f : results)
8710 for (
const auto &fd : *fn)
8712 bool doc = fd->isLinkableInProject();
8715 msg(
"Generating docs for file {}...\n",fd->docName());
8734 const_cast<FileDef*
>(fd)->addSourceRef(cd->getStartDefLine(),cd.get(),
nullptr);
8743 const_cast<FileDef*
>(fd)->addSourceRef(cd->getStartDefLine(),cd.get(),
nullptr);
8752 const_cast<FileDef*
>(fd)->addSourceRef(nd->getStartDefLine(),nd.get(),
nullptr);
8759 for (
const auto &md : *mn)
8768 md->isLinkableInProject() &&
8774 const_cast<FileDef*
>(fd)->addSourceRef(md->getStartDefLine(),md->getOuterScope(),md.get());
8780 for (
const auto &md : *mn)
8790 md->isLinkableInProject() &&
8796 const_cast<FileDef*
>(fd)->addSourceRef(md->getStartDefLine(),md->getOuterScope(),md.get());
8813 for (
const auto &def : it->second)
8816 def.fileName,def.lineNr,def.columnNr,
8817 "#define",def.name,def.args,
QCString(),
8822 if (!def.args.isEmpty())
8826 mmd->setInitializer(def.definition);
8827 mmd->setFileDef(def.fileDef);
8828 mmd->setDefinition(
"#define "+def.name);
8833 def.fileDef->insertMember(md.get());
8835 AUTO_TRACE_ADD(
"adding macro {} with definition {}",def.name,def.definition);
8869 for (
const auto &fd : *fn)
8871 fd->sortMemberLists();
8878 gd->sortMemberLists();
8895 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8899 std::vector < std::future< void > > results;
8903 for (
const auto &def : symList)
8906 if (dm && !
isSymbolHidden(def) && !def->isArtificial() && def->isLinkableInProject())
8908 auto processTooltip = [dm]() {
8911 results.emplace_back(threadPool.
queue(processTooltip));
8916 for (
auto &f : results)
8925 for (
const auto &def : symList)
8928 if (dm && !
isSymbolHidden(def) && !def->isArtificial() && def->isLinkableInProject())
8975 for (
const auto &fd : *fn)
8997 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
9003 : cd(cd_), ol(ol_) {}
9008 std::vector< std::future< std::shared_ptr<DocContext> > > results;
9009 for (
const auto &cd : classList)
9012 if (cd->getOuterScope()==
nullptr ||
9016 auto ctx = std::make_shared<DocContext>(cd,*
g_outputList);
9017 auto processFile = [ctx]()
9019 msg(
"Generating docs for compound {}...\n",ctx->cd->displayName());
9023 if (!ctx->cd->isHidden() && !ctx->cd->isEmbeddedInOuterScope() &&
9024 ctx->cd->isLinkableInProject() && !ctx->cd->isImplicitTemplateInstance())
9026 ctx->cd->writeDocumentation(ctx->ol);
9027 ctx->cd->writeMemberList(ctx->ol);
9031 ctx->cd->writeDocumentationForInnerClasses(ctx->ol);
9034 results.emplace_back(threadPool.
queue(processFile));
9037 for (
auto &f : results)
9044 for (
const auto &cd : classList)
9048 if (cd->getOuterScope()==
nullptr ||
9054 if ( !cd->isHidden() && !cd->isEmbeddedInOuterScope() &&
9055 cd->isLinkableInProject() && !cd->isImplicitTemplateInstance())
9057 msg(
"Generating docs for compound {}...\n",cd->displayName());
9072 for (
const auto &innerCdi : cd->
getClasses())
9077 AUTO_TRACE(
"innerCd={} isLinkable={} isImplicitTemplateInstance={} protectLevelVisible={} embeddedInOuterScope={}",
9086 list.push_back(innerCd);
9094 std::vector<ClassDefMutable*> classList;
9143 for (
const auto &imd : *mn)
9179 for (
const auto &fd : *fn)
9181 fd->combineUsingRelations();
9213 for (
const auto &fd : *fn)
9215 fd->addMembersToMemberGroup();
9230 gd->addMembersToMemberGroup();
9251 for (
const auto &fd : *fn)
9253 fd->distributeMemberGroupDocumentation();
9268 gd->distributeMemberGroupDocumentation();
9298 for (
const auto &fd : *fn)
9300 fd->findSectionsInDocumentation();
9315 gd->findSectionsInDocumentation();
9320 pd->findSectionsInDocumentation();
9341 elementsToRemove.push_back(ci.first);
9344 for (
const auto &k : elementsToRemove)
9355 for (
const auto &ifmd : *fn)
9369 for (
const auto &imd : *nm)
9401 elementsToRemove.push_back(ci.first);
9404 for (
const auto &k : elementsToRemove)
9413 for (
const auto &ifmd : *fn)
9426 for (
const auto &imd : *nm)
9494 mmd->setTagInfo(root->
tagInfo());
9495 mmd->setLanguage(root->
lang);
9506 for (
const auto &md : *mn)
9512 for (
const auto &imd : *mn)
9530 for (
const auto &imd : *mn)
9557 warn(root->
fileName,root->
startLine,
"found documented #define {} but ignoring it because ENABLE_PREPROCESSING is NO.", root->
name);
9571 normalizedName =
substitute(normalizedName,
"\\",
"/");
9574 if (root->
docFile==normalizedName)
9576 int lastSlashPos=normalizedName.
findRev(
'/');
9577 if (lastSlashPos!=-1)
9579 normalizedName=normalizedName.
left(lastSlashPos);
9582 if (normalizedName.
at(normalizedName.
length()-1)!=
'/')
9584 normalizedName+=
'/';
9586 DirDef *matchingDir=
nullptr;
9590 if (dir->name().right(normalizedName.
length())==normalizedName)
9595 "\\dir command matches multiple directories.\n"
9596 " Applying the command for directory {}\n"
9597 " Ignoring the command for directory {}",
9598 matchingDir->
name(),dir->name()
9603 matchingDir=dir.get();
9618 warn(root->
fileName,root->
startLine,
"No matching directory found for command \\dir {}",normalizedName);
9630 if (root->
section.isPageDoc())
9637 else if (root->
section.isMainpageDoc())
9657 if (root->
section.isMainpageDoc())
9690 else if (si->
lineNr() != -1)
9692 warn(root->
fileName,root->
startLine,
"multiple use of section label '{}' for main page, (first occurrence: {}, line {})",
9697 warn(root->
fileName,root->
startLine,
"multiple use of section label '{}' for main page, (first occurrence: {})",
9714 else if (root->
tagInfo()==
nullptr)
9717 "found more than one \\mainpage comment block! (first occurrence: {}, line {}), Skipping current block!",
9727 if (root->
section.isMainpageDoc())
9751 term(
"page defined {} with label {} is a direct "
9752 "subpage of itself! Please remove this cyclic dependency.\n",
9776 term(
"page defined {} with label {} is a subpage "
9777 "of itself! Please remove this cyclic dependency.\n",
9778 warn_line(pd->docFile(),pd->docLine()),pd->name());
9804 if (si->label().left(label.
length())==label)
9806 si->setFileName(rl->listName());
9807 si->setGenerated(
TRUE);
9813 if (!si->generated())
9817 if (!si->fileName().isEmpty() &&
9824 if (si->definition())
9831 gd = (
toMemberDef(si->definition()))->getGroupDef();
9861 if (!pd->getGroupDef() && !pd->isReference())
9863 msg(
"Generating docs for page {}...\n",pd->name());
9878 warn(root->
fileName,root->
startLine,
"Example {} was already documented. Ignoring documentation found here.",root->
name);
9906 indentStr.
fill(
' ',indent);
9908 indentStr.
isEmpty()?
"":indentStr,
9913 for (
const auto &e : root->
children())
9931 si->label(),si->fileName(),si->title(),si->type().level(),si->ref());
9945 msg(
"Generating docs for example {}...\n",pd->name());
9947 if (lang != SrcLangExt::Unknown)
9951 intf->resetCodeParserState();
9953 QCString n=pd->getOutputFileBase();
9960 if (pd->showLineNo())
9962 lineNoOptStr=
"{lineno}";
9968 (pd->briefDescription().isEmpty()?
"":pd->briefDescription()+
"\n\n")+
9969 pd->documentation()+
"\n\n\\include"+lineNoOptStr+
" "+pd->name(),
9989 if (!gd->isReference())
10001 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10007 : cdm(cdm_), ol(ol_) {}
10012 std::vector< std::future< std::shared_ptr<DocContext> > > results;
10014 for (
const auto &cd : classList)
10019 auto ctx = std::make_shared<DocContext>(cdm,*
g_outputList);
10020 auto processFile = [ctx]()
10022 if ( ( ctx->cdm->isLinkableInProject() &&
10023 !ctx->cdm->isImplicitTemplateInstance()
10026 && !ctx->cdm->isHidden() && !ctx->cdm->isEmbeddedInOuterScope()
10029 msg(
"Generating docs for compound {}...\n",ctx->cdm->displayName());
10030 ctx->cdm->writeDocumentation(ctx->ol);
10031 ctx->cdm->writeMemberList(ctx->ol);
10033 ctx->cdm->writeDocumentationForInnerClasses(ctx->ol);
10036 results.emplace_back(threadPool.
queue(processFile));
10040 for (
auto &f : results)
10042 auto ctx = f.get();
10048 for (
const auto &cd : classList)
10053 if ( ( cd->isLinkableInProject() &&
10054 !cd->isImplicitTemplateInstance()
10057 && !cd->isHidden() && !cd->isEmbeddedInOuterScope()
10060 msg(
"Generating docs for compound {}...\n",cd->displayName());
10074 for (
const auto &cd : conceptList)
10079 msg(
"Generating docs for concept {}...\n",cd->name());
10094 if (nd->isLinkableInProject())
10099 msg(
"Generating docs for namespace {}\n",nd->displayName());
10137 QCString cmd=qhgLocation+
" -v 2>&1";
10142 err(
"could not execute {}\n",qhgLocation);
10146 const size_t bufSize = 1024;
10147 char inBuf[bufSize+1];
10148 size_t numRead=fread(inBuf,1,bufSize,f);
10149 inBuf[numRead] =
'\0';
10154 static const reg::Ex versionReg(R
"(Qt (\d+)\.(\d+)\.(\d+))");
10156 std::string s = inBuf;
10163 if (qtVersion>0 && (qtVersion<60000 || qtVersion >= 60205))
10172 err(
"could not execute {}\n",qhgLocation);
10176 std::string output;
10177 while ((numRead=fread(inBuf,1,bufSize,f))>0)
10179 inBuf[numRead] =
'\0';
10211 warn_uncond(
"the dot tool could not be found as '{}'\n",dotPath);
10217 size_t l=dotPath.
length();
10218 for (
size_t i=0;i<l;i++)
if (dotPath.
at(i)==
'/') dotPath.
at(i)=
'\\';
10237 bool updateOnly=
FALSE)
10241 bool writeToStdout=configFile==
"-";
10246 if (!writeToStdout)
10250 msg(
"\n\nConfiguration file '{}' created.\n\n",configFile);
10251 msg(
"Now edit the configuration file and enter\n\n");
10252 if (configFile!=
"Doxyfile" && configFile!=
"doxyfile")
10253 msg(
" doxygen {}\n\n",configFile);
10255 msg(
" doxygen\n\n");
10256 msg(
"to generate the documentation for your project\n\n");
10260 msg(
"\n\nConfiguration file '{}' updated.\n\n",configFile);
10266 term(
"Cannot open file {} for writing\n",configFile);
10281 term(
"Cannot open stdout for writing\n");
10292 int eqPos = tagLine.
find(
'=');
10302 fileName = tagLine;
10308 err(
"Tag file '{}' does not exist or is not a file. Skipping it...\n",fileName);
10319 msg(
"Reading tag file '{}', location '{}'...\n",fileName,destName);
10323 msg(
"Reading tag file '{}'...\n",fileName);
10333 for (
const auto &sheet : latexExtraStyleSheet)
10335 std::string fileName = sheet;
10336 if (!fileName.empty())
10341 err(
"Style sheet '{}' specified by LATEX_EXTRA_STYLESHEET does not exist!\n",fileName);
10343 else if (fi.
isDir())
10345 err(
"Style sheet '{}' specified by LATEX_EXTRA_STYLESHEET is a directory, it has to be a file!\n", fileName);
10364 if (!htmlStyleSheet.
isEmpty())
10371 err(
"Style sheet '{}' specified by HTML_STYLESHEET does not exist!\n",htmlStyleSheet);
10374 else if (fi.
isDir())
10376 err(
"Style sheet '{}' specified by HTML_STYLESHEET is a directory, it has to be a file!\n",htmlStyleSheet);
10382 copyFile(htmlStyleSheet,destFileName);
10387 for (
const auto &sheet : htmlExtraStyleSheet)
10395 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET does not exist!\n",fileName);
10399 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET is already a built-in stylesheet. Please use a different name\n",fi.
fileName());
10401 else if (fi.
isDir())
10403 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET is a directory, it has to be a file!\n",fileName);
10422 err(
"Project logo '{}' specified by PROJECT_LOGO does not exist!\n",projectLogo);
10425 else if (fi.
isDir())
10427 err(
"Project logo '{}' specified by PROJECT_LOGO is a directory, it has to be a file!\n",projectLogo);
10433 copyFile(projectLogo,destFileName);
10447 err(
"Project icon '{}' specified by PROJECT_ICON does not exist!\n",projectIcon);
10450 else if (fi.
isDir())
10452 err(
"Project icon '{}' specified by PROJECT_ICON is a directory, it has to be a file!\n",projectIcon);
10458 copyFile(projectIcon,destFileName);
10466 for (
const auto &fileName : files)
10468 if (!fileName.empty())
10473 err(
"Extra file '{}' specified in {} does not exist!\n", fileName,filesOption);
10475 else if (fi.
isDir())
10477 err(
"Extra file '{}' specified in {} is a directory, it has to be a file!\n", fileName,filesOption);
10503 std::vector<FileEntry> fileEntries;
10504 for (
const auto &fd : *fn)
10506 if (!fd->isReference())
10508 fileEntries.emplace_back(fd->getPath(),fd.get());
10512 size_t size = fileEntries.size();
10516 FileDef *fd = fileEntries[0].fileDef;
10522 std::stable_sort(fileEntries.begin(),
10524 [](
const FileEntry &fe1,
const FileEntry &fe2)
10525 { return qstricmp_sort(fe1.path,fe2.path)<0; }
10530 const FileEntry &first = fileEntries[0];
10531 const FileEntry &last = fileEntries[size-1];
10532 int first_path_size =
static_cast<int>(first.path.size())-1;
10533 int last_path_size =
static_cast<int>(last.path.size())-1;
10536 for (i=0;i<first_path_size && i<last_path_size;i++)
10538 if (first.path[i]==
'/') j=i;
10539 if (first.path[i]!=last.path[i])
break;
10541 if (i==first_path_size && i<last_path_size && last.path[i]==
'/')
10546 else if (i==last_path_size && i<first_path_size && first.path[i]==
'/')
10553 for (
auto &fileEntry : fileEntries)
10555 QCString prefix = fileEntry.path.right(fileEntry.path.length()-j-1);
10556 fileEntry.fileDef->setName(
prefix+fn->fileName());
10558 fileEntry.fileDef->setDiskName(
prefix+fn->fileName());
10572 int sep = fileName.
findRev(
'/');
10573 int ei = fileName.
findRev(
'.');
10574 if (ei!=-1 && (sep==-1 || ei>sep))
10580 extension =
".no_extension";
10593 int ei = fileName.
findRev(
'.');
10600 extension =
".no_extension";
10604 std::string preBuf;
10611 for (
const auto &s : includePath)
10617 msg(
"Preprocessing {}...\n",fn);
10624 msg(
"Reading {}...\n",fn);
10629 std::string convBuf;
10630 convBuf.reserve(preBuf.size()+1024);
10635 std::shared_ptr<Entry> fileRoot = std::make_shared<Entry>();
10639 if (newTU) clangParser->
parse();
10642 parser.
parseInput(fileName,convBuf.
data(),fileRoot,clangParser);
10643 fileRoot->setFileDef(fd);
10660 filesToProcess.insert(s);
10663 std::mutex processedFilesLock;
10665 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10666 msg(
"Processing input using {} threads.\n",numThreads);
10668 using FutureType = std::vector< std::shared_ptr<Entry> >;
10669 std::vector< std::future< FutureType > > results;
10672 bool ambig =
false;
10678 auto processFile = [s,&filesToProcess,&processedFilesLock,&processedFiles]() {
10679 bool ambig_l =
false;
10680 std::vector< std::shared_ptr<Entry> > roots;
10684 auto fileRoot {
parseFile(*parser.get(),fd_l,s.c_str(),clangParser.get(),
true) };
10685 roots.push_back(fileRoot);
10689 for (
auto incFile : clangParser->filesInSameTU())
10691 if (filesToProcess.find(incFile)!=filesToProcess.end())
10693 bool needsToBeProcessed =
false;
10695 std::lock_guard<std::mutex> lock(processedFilesLock);
10696 needsToBeProcessed = processedFiles.find(incFile)==processedFiles.end();
10697 if (needsToBeProcessed) processedFiles.insert(incFile);
10699 if (incFile!=s && needsToBeProcessed)
10705 fileRoot =
parseFile(*parser.get(),ifd,incFile.c_str(),clangParser.get(),
false);
10706 roots.push_back(fileRoot);
10714 results.emplace_back(threadPool.
queue(processFile));
10718 for (
auto &f : results)
10723 root->moveToSubEntryAndKeep(e);
10730 if (processedFiles.find(s)==processedFiles.end())
10733 auto processFile = [s]() {
10734 bool ambig =
false;
10735 std::vector< std::shared_ptr<Entry> > roots;
10742 auto fileRoot =
parseFile(*parser.get(),fd,s.c_str(),clangParser.get(),
true);
10743 roots.push_back(fileRoot);
10747 auto fileRoot =
parseFile(*parser.get(),fd,s.c_str(),
nullptr,
true);
10748 roots.push_back(fileRoot);
10752 results.emplace_back(threadPool.
queue(processFile));
10756 for (
auto &f : results)
10761 root->moveToSubEntryAndKeep(e);
10768 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10769 msg(
"Processing input using {} threads.\n",numThreads);
10771 using FutureType = std::shared_ptr<Entry>;
10772 std::vector< std::future< FutureType > > results;
10776 auto processFile = [s]() {
10777 bool ambig =
false;
10780 auto fileRoot =
parseFile(*parser.get(),fd,s.c_str(),
nullptr,
true);
10784 results.emplace_back(threadPool.
queue(processFile));
10787 for (
auto &f : results)
10789 root->moveToSubEntryAndKeep(f.get());
10807 filesToProcess.insert(s);
10813 bool ambig =
false;
10820 auto fileRoot =
parseFile(*parser.get(),fd,s.c_str(),clangParser.get(),
true);
10821 root->moveToSubEntryAndKeep(fileRoot);
10822 processedFiles.insert(s);
10826 for (
auto incFile : clangParser->filesInSameTU())
10829 if (filesToProcess.find(incFile)!=filesToProcess.end() &&
10830 processedFiles.find(incFile)==processedFiles.end())
10836 fileRoot =
parseFile(*parser.get(),ifd,incFile.c_str(),clangParser.get(),
false);
10837 root->moveToSubEntryAndKeep(fileRoot);
10838 processedFiles.insert(incFile);
10847 if (processedFiles.find(s)==processedFiles.end())
10849 bool ambig =
false;
10855 auto fileRoot =
parseFile(*parser.get(),fd,s.c_str(),clangParser.get(),
true);
10856 root->moveToSubEntryAndKeep(fileRoot);
10860 std::unique_ptr<OutlineParserInterface> parser {
getParserForFile(s.c_str()) };
10861 std::shared_ptr<Entry> fileRoot =
parseFile(*parser.get(),fd,s.c_str(),
nullptr,
true);
10862 root->moveToSubEntryAndKeep(fileRoot);
10864 processedFiles.insert(s);
10873 bool ambig =
false;
10876 std::unique_ptr<OutlineParserInterface> parser {
getParserForFile(s.c_str()) };
10877 std::shared_ptr<Entry> fileRoot =
parseFile(*parser.get(),fd,s.c_str(),
nullptr,
true);
10878 root->moveToSubEntryAndKeep(std::move(fileRoot));
10898 sepPos = result.
find(
'/',2);
10900 sepPos = result.
find(
'/',sepPos+1);
10902 sepPos = result.
find(
'/',sepPos+1);
10905 if (nonSymlinks.find(
prefix.str())==nonSymlinks.end())
10922 target+=result.
mid(sepPos);
10925 if (known.find(result.
str())!=known.end())
return std::string();
10926 known.insert(result.
str());
10939 nonSymlinks.insert(
prefix.str());
10945 while (sepPos!=-1);
10964 bool errorIfNotExist,
10971 if (paths && !dirName.empty())
10973 paths->insert(dirName);
10979 if (dirName.empty())
10994 msg(
"Searching for files in directory {}\n", fi->
absFilePath());
10999 for (
const auto &dirEntry : dir.
iterator())
11002 if (exclSet==
nullptr || exclSet->find(cfi.
absFilePath())==exclSet->end())
11010 if (errorIfNotExist)
11015 else if (cfi.
isFile() &&
11017 (exclPatList==
nullptr || !
patternMatch(cfi,*exclPatList)) &&
11018 (killSet==
nullptr || killSet->find(cfi.
absFilePath())==killSet->end())
11022 std::string path=cfi.
dirPath()+
"/";
11023 std::string fullName=path+name;
11031 fn->push_back(std::move(fd));
11034 dirResultList.push_back(fullName);
11035 if (resultSet) resultSet->insert(fullName);
11036 if (killSet) killSet->insert(fullName);
11038 else if (recursive &&
11040 (exclPatList==
nullptr || !
patternMatch(cfi,*exclPatList)) &&
11045 patList,exclPatList,&dirResultList,resultSet,errorIfNotExist,
11046 recursive,killSet,paths);
11050 if (resultList && !dirResultList.empty())
11053 std::stable_sort(dirResultList.begin(),
11054 dirResultList.end(),
11055 [](
const auto &f1,
const auto &f2) { return qstricmp_sort(f1.c_str(),f2.c_str())<0; });
11058 resultList->insert(resultList->end(), dirResultList.begin(), dirResultList.end());
11075 bool errorIfNotExist,
11089 if (exclSet==
nullptr || exclSet->find(fi.
absFilePath())==exclSet->end())
11096 if (errorIfNotExist)
11098 warn_uncond(
"source '{}' is not a readable file or directory... skipping.\n",s);
11103 std::string dirPath = fi.
dirPath(
true);
11105 if (paths && !dirPath.empty())
11107 paths->insert(dirPath);
11110 if (killSet==
nullptr || killSet->find(filePath)==killSet->end())
11119 fn->push_back(std::move(fd));
11122 if (resultList || resultSet)
11124 if (resultList) resultList->push_back(filePath);
11125 if (resultSet) resultSet->insert(filePath);
11131 else if (fi.
isDir())
11133 readDir(&fi,fnMap,exclSet,patList,
11134 exclPatList,resultList,resultSet,errorIfNotExist,
11135 recursive,killSet,paths);
11149 anchor=
":"+md->
anchor();
11158 t <<
"REPLACE INTO symbols (symbol_id,scope_id,name,file,line) VALUES('"
11159 << fn+anchor <<
"','"
11161 << d->
name() <<
"','"
11175 for (
const auto &def : symList)
11187 msg(
"Developer parameters:\n");
11188 msg(
" -m dump symbol map\n");
11189 msg(
" -b making messages output unbuffered\n");
11190 msg(
" -c <file> process input file as a comment block and produce HTML output\n");
11192 msg(
" -t [<file|stdout|stderr>] trace debug info to file, stdout, or stderr (default file stdout)\n");
11193 msg(
" -t_time [<file|stdout|stderr>] trace debug info to file, stdout, or stderr (default file stdout),\n"
11194 " and include time and thread information\n");
11196 msg(
" -d <level> enable a debug level, such as (multiple invocations of -d are possible):\n");
11207 QCString versionString = getFullVersion();
11208 msg(
"{}\n",versionString);
11212 if (!extVers.
isEmpty()) extVers+=
", ";
11213 extVers +=
"sqlite3 ";
11214 extVers += sqlite3_libversion();
11216 if (!extVers.
isEmpty()) extVers+=
", ";
11217 extVers +=
"clang support ";
11218 extVers += CLANG_VERSION_STRING;
11222 int lastComma = extVers.
findRev(
',');
11223 if (lastComma != -1) extVers = extVers.
replace(lastComma,1,
" and");
11224 msg(
" with {}.\n",extVers);
11235 msg(
"Doxygen version {0}\nCopyright Dimitri van Heesch 1997-2025\n\n"
11236 "You can use Doxygen in a number of ways:\n\n"
11237 "1) Use Doxygen to generate a template configuration file*:\n"
11238 " {1} [-s] -g [configName]\n\n"
11239 "2) Use Doxygen to update an old configuration file*:\n"
11240 " {1} [-s] -u [configName]\n\n"
11241 "3) Use Doxygen to generate documentation using an existing "
11242 "configuration file*:\n"
11243 " {1} [configName]\n\n"
11244 "4) Use Doxygen to generate a template file controlling the layout of the\n"
11245 " generated documentation:\n"
11246 " {1} -l [layoutFileName]\n\n"
11247 " In case layoutFileName is omitted DoxygenLayout.xml will be used as filename.\n"
11248 " If - is used for layoutFileName Doxygen will write to standard output.\n\n"
11249 "5) Use Doxygen to generate a template style sheet file for RTF, HTML or Latex.\n"
11250 " RTF: {1} -w rtf styleSheetFile\n"
11251 " HTML: {1}-w html headerFile footerFile styleSheetFile [configFile]\n"
11252 " LaTeX: {1} -w latex headerFile footerFile styleSheetFile [configFile]\n\n"
11253 "6) Use Doxygen to generate a rtf extensions file\n"
11254 " {1} -e rtf extensionsFile\n\n"
11255 " If - is used for extensionsFile Doxygen will write to standard output.\n\n"
11256 "7) Use Doxygen to compare the used configuration file with the template configuration file\n"
11257 " {1} -x [configFile]\n\n"
11258 " Use Doxygen to compare the used configuration file with the template configuration file\n"
11259 " without replacing the environment variables or CMake type replacement variables\n"
11260 " {1} -x_noenv [configFile]\n\n"
11261 "8) Use Doxygen to show a list of built-in emojis.\n"
11262 " {1} -f emoji outputFileName\n\n"
11263 " If - is used for outputFileName Doxygen will write to standard output.\n\n"
11264 "*) If -s is specified the comments of the configuration items in the config file will be omitted.\n"
11265 " If configName is omitted 'Doxyfile' will be used as a default.\n"
11266 " If - is used for configFile Doxygen will write / read the configuration to /from standard output / input.\n\n"
11267 "If -q is used for a Doxygen documentation run, Doxygen will see this as if QUIET=YES has been set.\n\n"
11268 "-v print version string, -V print extended version information\n"
11269 "-h,-? prints usage help information\n"
11270 "{1} -d prints additional usage flags for debugging purposes\n",versionString,name);
11277static const char *
getArg(
int argc,
char **argv,
int &optInd)
11280 if (
qstrlen(&argv[optInd][2])>0)
11281 s=&argv[optInd][2];
11282 else if (optInd+1<argc && argv[optInd+1][0]!=
'-')
11301 return []() {
return std::make_unique<T>(); };
11309 std::setlocale(LC_ALL,
"");
11310 std::setlocale(LC_CTYPE,
"C");
11311 std::setlocale(LC_NUMERIC,
"C");
11410 while (v!=0) v>>=1,r++;
11414 return std::max(0,std::min(r-16,9));
11419 QCString versionString = getFullVersion();
11422 auto writeFile = [](
const char *fileName,std::function<void(
TextStream&)> func) ->
bool
11442 bool genConfig=
false;
11443 bool shortList=
false;
11444 bool traceTiming=
false;
11446 bool updateConfig=
false;
11447 bool quiet =
false;
11448 while (optInd<argc && argv[optInd][0]==
'-' &&
11449 (isalpha(argv[optInd][1]) || argv[optInd][1]==
'?' ||
11450 argv[optInd][1]==
'-')
11453 switch(argv[optInd][1])
11463 if (optInd+1>=argc)
11465 layoutName=
"DoxygenLayout.xml";
11469 layoutName=argv[optInd+1];
11477 if (optInd+1>=argc)
11479 msg(
"option \"-c\" is missing the file name to read\n");
11504 msg(
"option \"-d\" has unknown debug specifier: \"{}\".\n",debugLabel);
11514 if (!strcmp(argv[optInd]+1,
"t_time"))
11516 traceTiming =
true;
11518 else if (!strcmp(argv[optInd]+1,
"t"))
11520 traceTiming =
false;
11524 err(
"option should be \"-t\" or \"-t_time\", found: \"{}\".\n",argv[optInd]);
11528 if (optInd+1>=argc || argv[optInd+1][0] ==
'-')
11530 traceName=
"stdout";
11534 traceName=argv[optInd+1];
11538 err(
"support for option \"-t\" has not been compiled in (use a debug build or a release build with tracing enabled).\n");
11549 err(
"option should be \"-x\" or \"-x_noenv\", found: \"{}\".\n",argv[optInd]);
11565 err(
"option \"-e\" is missing format specifier rtf.\n");
11571 if (optInd+1>=argc)
11573 err(
"option \"-e rtf\" is missing an extensions file name\n");
11581 err(
"option \"-e\" has invalid format specifier.\n");
11591 err(
"option \"-f\" is missing list specifier.\n");
11597 if (optInd+1>=argc)
11599 err(
"option \"-f emoji\" is missing an output file name\n");
11607 err(
"option \"-f\" has invalid list specifier.\n");
11617 err(
"option \"-w\" is missing format specifier rtf, html or latex\n");
11623 if (optInd+1>=argc)
11625 err(
"option \"-w rtf\" is missing a style sheet file name\n");
11631 err(
"error opening RTF style sheet file {}!\n",argv[optInd+1]);
11641 if (optInd+4<argc ||
FileInfo(
"Doxyfile").exists() ||
FileInfo(
"doxyfile").exists())
11647 err(
"error opening or reading configuration file {}!\n",argv[optInd+4]);
11652 if (optInd+3>=argc)
11654 err(
"option \"-w html\" does not have enough arguments\n");
11671 if (optInd+4<argc ||
FileInfo(
"Doxyfile").exists() ||
FileInfo(
"doxyfile").exists())
11676 err(
"error opening or reading configuration file {}!\n",argv[optInd+4]);
11681 if (optInd+3>=argc)
11683 err(
"option \"-w latex\" does not have enough arguments\n");
11699 err(
"Illegal format specifier \"{}\": should be one of rtf, html or latex\n",formatName);
11719 if (
qstrcmp(&argv[optInd][2],
"help")==0)
11721 usage(argv[0],versionString);
11724 else if (
qstrcmp(&argv[optInd][2],
"version")==0)
11730 else if ((
qstrcmp(&argv[optInd][2],
"Version")==0) ||
11731 (
qstrcmp(&argv[optInd][2],
"VERSION")==0))
11739 err(
"Unknown option \"-{}\"\n",&argv[optInd][1]);
11740 usage(argv[0],versionString);
11745 setvbuf(stdout,
nullptr,_IONBF,0);
11752 usage(argv[0],versionString);
11756 err(
"Unknown option \"-{:c}\"\n",argv[optInd][1]);
11757 usage(argv[0],versionString);
11768 TRACE(
"Doxygen version used: {}",getFullVersion());
11771 FileInfo configFileInfo1(
"Doxyfile"),configFileInfo2(
"doxyfile");
11774 if (configFileInfo1.exists())
11776 configName=
"Doxyfile";
11778 else if (configFileInfo2.
exists())
11780 configName=
"doxyfile";
11782 else if (genConfig)
11784 configName=
"Doxyfile";
11788 err(
"Doxyfile not found and no input file specified!\n");
11789 usage(argv[0],versionString);
11796 if (fi.
exists() ||
qstrcmp(argv[optInd],
"-")==0 || genConfig)
11798 configName=argv[optInd];
11802 err(
"configuration file {} not found!\n",argv[optInd]);
11803 usage(argv[0],versionString);
11817 err(
"could not open or read configuration file {}!\n",configName);
11888 for (
const auto &mapping : extMaps)
11890 QCString mapStr = mapping.c_str();
11891 int i=mapStr.
find(
'=');
11907 err(
"Failed to map file extension '{}' to unsupported language '{}'.\n"
11908 "Check the EXTENSION_MAPPING setting in the config file.\n",
11913 msg(
"Adding custom extension mapping: '{}' will be treated as language '{}'\n",
11922 if (cd==
reinterpret_cast<void *
>(-1))
11924 term(
"unsupported character conversion: '{}'->'UTF-8': {}\n"
11925 "Check the 'INPUT_ENCODING' setting in the config file!\n",
11935 for (
const auto &mapping : fileEncod)
11937 QCString mapStr = mapping.c_str();
11938 int i=mapStr.
find(
'=');
11952 if (cd==
reinterpret_cast<void *
>(-1))
11954 term(
"unsupported character conversion: '{}'->'UTF-8': {}\n"
11955 "Check the 'INPUT_FILE_ENCODING' setting in the config file!\n",
11956 encoding,strerror(errno));
11969 for (
const auto &s : expandAsDefinedList)
11987 signal(SIGINT,SIG_DFL);
11989 msg(
"Cleaning up...\n");
12004 if (generateTagFile.
isEmpty())
return;
12009 err(
"cannot open tag file {} for writing\n", generateTagFile);
12013 tagFile <<
"<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>\n";
12014 tagFile <<
"<tagfile doxygen_version=\"" << getDoxygenVersion() <<
"\"";
12015 std::string gitVersion = getGitVersion();
12016 if (!gitVersion.empty())
12018 tagFile <<
" doxygen_gitid=\"" << gitVersion <<
"\"";
12025 for (
const auto &fd : *fn)
12027 if (fd->isLinkableInProject()) fd->writeTagFile(tagFile);
12060 if (gd->isLinkableInProject()) gd->writeTagFile(tagFile);
12065 if (mod->isLinkableInProject()) mod->writeTagFile(tagFile);
12070 if (pd->isLinkableInProject()) pd->writeTagFile(tagFile);
12074 tagFile <<
"</tagfile>\n";
12082 msg(
"Exiting...\n");
12092 const char *defaultDirName)
12097 result = baseDirName + defaultDirName;
12099 else if (formatDirName[0]!=
'/' && (formatDirName.
length()==1 || formatDirName[1]!=
':'))
12101 result.
prepend(baseDirName+
"/");
12103 Dir formatDir(result.
str());
12106 term(
"Could not create output directory {}\n", result);
12120 g_s.begin(
"Searching for include files...\n");
12123 for (
const auto &s : includePathList)
12141 g_s.begin(
"Searching for example files...\n");
12144 for (
const auto &s : examplePathList)
12159 g_s.begin(
"Searching for images...\n");
12162 for (
const auto &s : imagePathList)
12177 g_s.begin(
"Searching for dot files...\n");
12180 for (
const auto &s : dotFileList)
12195 g_s.begin(
"Searching for msc files...\n");
12198 for (
const auto &s : mscFileList)
12213 g_s.begin(
"Searching for dia files...\n");
12216 for (
const auto &s : diaFileList)
12231 g_s.begin(
"Searching for plantuml files...\n");
12234 for (
const auto &s : plantUmlFileList)
12249 g_s.begin(
"Searching for files to exclude\n");
12251 for (
const auto &s : excludeList)
12269 g_s.begin(
"Searching INPUT for files to process...\n");
12273 for (
const auto &s : inputList)
12276 size_t l = path.
length();
12280 if (path.
at(l-1)==
'\\' || path.
at(l-1)==
'/') path=path.
left(l-1);
12300 [](
const auto &f1,
const auto &f2)
12306 if (fileName->size()>1)
12308 std::stable_sort(fileName->begin(),fileName->end(),[](
const auto &f1,
const auto &f2)
12310 return qstricmp_sort(f1->absFilePath(),f2->absFilePath())<0;
12316 warn_uncond(
"No files to be processed, please check your settings, in particular INPUT, FILE_PATTERNS, and RECURSIVE\n");
12327 if (mdfileAsMainPage.
isEmpty())
return;
12331 warn_uncond(
"Specified markdown mainpage '{}' does not exist\n",mdfileAsMainPage);
12334 bool ambig =
false;
12337 warn_uncond(
"Specified markdown mainpage '{}' has not been defined as input file\n",mdfileAsMainPage);
12356 QCString versionString = getFullVersion();
12357 msg(
"Doxygen version used: {}\n",versionString);
12367 if (outputDirectory.
isEmpty())
12373 Dir dir(outputDirectory.
str());
12377 if (!dir.
mkdir(outputDirectory.
str()))
12379 term(
"tag OUTPUT_DIRECTORY: Output directory '{}' does not "
12380 "exist and cannot be created\n",outputDirectory);
12384 msg(
"Notice: Output directory '{}' does not exist. "
12385 "I have created it for you.\n", outputDirectory);
12400 if (cacheSize<0) cacheSize=0;
12401 if (cacheSize>9) cacheSize=9;
12402 uint32_t lookupSize = 65536 << cacheSize;
12441 bool generateSitemap = !sitemapUrl.
isEmpty();
12442 if (generateSitemap && !sitemapUrl.
endsWith(
"/"))
12449 bool generateEclipseHelp =
Config_getBool(GENERATE_ECLIPSEHELP);
12463 if (generateDocbook)
12510 newFontPath+=curFontPath;
12526 bool defaultLayoutUsed =
FALSE;
12527 if (layoutFileName.
isEmpty())
12530 defaultLayoutUsed =
TRUE;
12532 AUTO_TRACE_ADD(
"defaultLayoutUsed={}, layoutFileName={}",defaultLayoutUsed,layoutFileName);
12537 msg(
"Parsing layout file {}...\n",layoutFileName);
12540 else if (!defaultLayoutUsed)
12542 warn_uncond(
"failed to open layout file '{}' for reading! Using default settings.\n",layoutFileName);
12552 if (generateHtml) exclPatterns.push_back(htmlOutput.
str());
12553 if (generateDocbook) exclPatterns.push_back(docbookOutput.
str());
12554 if (generateXml) exclPatterns.push_back(xmlOutput.
str());
12555 if (generateLatex) exclPatterns.push_back(latexOutput.
str());
12556 if (generateRtf) exclPatterns.push_back(rtfOutput.
str());
12557 if (generateMan) exclPatterns.push_back(manOutput.
str());
12577 if (generateDocbook)
12588 std::shared_ptr<Entry> root = std::make_shared<Entry>();
12592 msg(
"Reading and parsing tag files\n");
12594 for (
const auto &s : tagFileList)
12606 g_s.begin(
"Parsing files\n");
12646 g_s.begin(
"Building macro definition list...\n");
12650 g_s.begin(
"Building group list...\n");
12655 g_s.begin(
"Building directory list...\n");
12660 g_s.begin(
"Building namespace list...\n");
12665 g_s.begin(
"Building file list...\n");
12669 g_s.begin(
"Building class list...\n");
12673 g_s.begin(
"Building concept list...\n");
12681 g_s.begin(
"Computing nesting relations for classes...\n");
12694 g_s.begin(
"Associating documentation with classes...\n");
12698 g_s.begin(
"Associating documentation with concepts...\n");
12703 g_s.begin(
"Associating documentation with modules...\n");
12707 g_s.begin(
"Building example list...\n");
12711 g_s.begin(
"Searching for enumerations...\n");
12719 g_s.begin(
"Searching for documented typedefs...\n");
12725 g_s.begin(
"Searching for documented sequences...\n");
12729 g_s.begin(
"Searching for documented dictionaries...\n");
12734 g_s.begin(
"Searching for members imported via using declarations...\n");
12741 g_s.begin(
"Searching for included using directives...\n");
12745 g_s.begin(
"Searching for documented variables...\n");
12749 g_s.begin(
"Building interface member list...\n");
12752 g_s.begin(
"Building member list...\n");
12756 g_s.begin(
"Searching for friends...\n");
12760 g_s.begin(
"Searching for documented defines...\n");
12764 g_s.begin(
"Computing class inheritance relations...\n");
12769 g_s.begin(
"Computing class usage relations...\n");
12775 g_s.begin(
"Searching for tag less structs...\n");
12780 g_s.begin(
"Flushing cached template relations that have become invalid...\n");
12784 g_s.begin(
"Warn for undocumented namespaces...\n");
12788 g_s.begin(
"Computing class relations...\n");
12799 g_s.begin(
"Add enum values to enums...\n");
12804 g_s.begin(
"Searching for member function documentation...\n");
12816 g_s.begin(
"Creating members for template instances...\n");
12820 g_s.begin(
"Building page list...\n");
12824 g_s.begin(
"Search for main page...\n");
12829 g_s.begin(
"Computing page relations...\n");
12834 g_s.begin(
"Determining the scope of groups...\n");
12838 g_s.begin(
"Computing module relations...\n");
12840 mm.resolvePartitions();
12841 mm.resolveImports();
12842 mm.collectExportedSymbols();
12861 return i==0 ?
qstricmp_sort(c1->name(), c2->name())<0 : i<0;
12875 g_s.begin(
"Sorting lists...\n");
12896 g_s.begin(
"Determining which enums are documented\n");
12900 g_s.begin(
"Computing member relations...\n");
12905 g_s.begin(
"Building full member lists recursively...\n");
12909 g_s.begin(
"Adding members to member groups.\n");
12915 g_s.begin(
"Distributing member group documentation.\n");
12920 g_s.begin(
"Computing member references...\n");
12926 g_s.begin(
"Inheriting documentation...\n");
12934 g_s.begin(
"Generating disk names...\n");
12938 g_s.begin(
"Adding source references...\n");
12942 g_s.begin(
"Adding xrefitems...\n");
12947 g_s.begin(
"Sorting member lists...\n");
12951 g_s.begin(
"Setting anonymous enum type...\n");
12955 g_s.begin(
"Computing dependencies between directories...\n");
12959 g_s.begin(
"Generating citations page...\n");
12963 g_s.begin(
"Counting members...\n");
12967 g_s.begin(
"Counting data structures...\n");
12971 g_s.begin(
"Resolving user defined references...\n");
12975 g_s.begin(
"Finding anchors and sections in the documentation...\n");
12979 g_s.begin(
"Transferring function references...\n");
12983 g_s.begin(
"Combining using relations...\n");
12988 g_s.begin(
"Adding members to index pages...\n");
12993 g_s.begin(
"Correcting members for VHDL...\n");
12997 g_s.begin(
"Computing tooltip texts...\n");
13005 [](
const auto &g1,
const auto &g2)
13006 {
return g1->groupTitle() < g2->groupTitle(); });
13010 gd->sortSubGroups();
13054 if (generateDocbook)
13074 err(
"USE_HTAGS is YES but htags(1) failed. \n");
13076 err(
"htags(1) ended normally but failed to load the filemap. \n");
13083 g_s.begin(
"Generating style sheet...\n");
13091 g_s.begin(
"Generating search indices...\n");
13092 if (searchEngine && !serverBasedSearch && generateHtml)
13100 if (generateHtml && searchEngine)
13103 Dir searchDir(searchDirName.
str());
13104 if (!searchDir.
exists() && !searchDir.
mkdir(searchDirName.
str()))
13106 term(
"Could not create search results directory '{}' $PWD='{}'\n",
13110 if (!serverBasedSearch)
13132 if (generateDocbook)
13148 g_s.begin(
"Generating images for formulas in HTML...\n");
13155 g_s.begin(
"Generating images for formulas in RTF...\n");
13162 g_s.begin(
"Generating images for formulas in Docbook...\n");
13167 g_s.begin(
"Generating example documentation...\n");
13171 g_s.begin(
"Generating file sources...\n");
13175 g_s.begin(
"Generating file documentation...\n");
13179 g_s.begin(
"Generating page documentation...\n");
13183 g_s.begin(
"Generating group documentation...\n");
13187 g_s.begin(
"Generating class documentation...\n");
13191 g_s.begin(
"Generating concept documentation...\n");
13195 g_s.begin(
"Generating module documentation...\n");
13199 g_s.begin(
"Generating namespace documentation...\n");
13205 g_s.begin(
"Generating graph info page...\n");
13210 g_s.begin(
"Generating directory documentation...\n");
13219 g_s.begin(
"finalizing index lists...\n");
13223 g_s.begin(
"writing tag file...\n");
13229 g_s.begin(
"Generating XML output...\n");
13237 g_s.begin(
"Generating SQLITE3 output...\n");
13244 g_s.begin(
"Generating AutoGen DEF output...\n");
13250 g_s.begin(
"Generating Perl module output...\n");
13254 if (generateHtml && searchEngine && serverBasedSearch)
13256 g_s.begin(
"Generating search index\n");
13266 if (searchDataFile.
isEmpty())
13268 searchDataFile=
"searchdata.xml";
13281 g_s.begin(
"Combining RTF output...\n");
13284 err(
"An error occurred during post-processing the RTF files!\n");
13289 g_s.begin(
"Running plantuml with JAVA...\n");
13295 g_s.begin(
"Running dot...\n");
13300 if (generateHtml &&
13304 g_s.begin(
"Running html help compiler...\n");
13309 if ( generateHtml &&
13313 g_s.begin(
"Running qhelpgenerator...\n");
13320 msg(
"type lookup cache used {}/{} hits={} misses={}\n",
13325 msg(
"symbol lookup cache used {}/{} hits={} misses={}\n",
13332 int cacheParam = std::max(typeCacheParam,symbolCacheParam);
13335 msg(
"Note: based on cache misses the ideal setting for LOOKUP_CACHE_SIZE is {} at the cost of higher memory usage.\n",cacheParam);
13341 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
13342 if (numThreads<1) numThreads=1;
13343 msg(
"Total elapsed time: {:.6f} seconds\n(of which an average of {:.6f} seconds per thread waiting for external tools to finish)\n",
13350 msg(
"finished...\n");
13355 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 MemberList * getMemberList(MemberListType lt) const =0
Returns the members in the list identified by lt.
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.
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 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 addListReferences()=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 setTagLessReference(const ClassDef *cd)=0
virtual void setUsedOnly(bool b)=0
virtual void sortMemberLists()=0
virtual void setProtection(Protection p)=0
virtual void setTypeConstraints(const ArgumentList &al)=0
virtual void overrideInheritanceGraph(CLASS_GRAPH_t e)=0
virtual void setAnonymousEnumType()=0
virtual void setCompoundType(CompoundType t)=0
virtual void distributeMemberGroupDocumentation()=0
virtual void 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 setFileDef(FileDef *fd)=0
virtual void writeTagFile(TextStream &)=0
virtual void setInitializer(const QCString &init)=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 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 Cache< std::string, LookupInfo > * typeLookupCache
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 QCString verifiedDotPath
static MemberGroupInfoMap memberGroupInfoMap
static IndexList * indexList
static StaticInitMap staticInitMap
static Cache< std::string, LookupInfo > * symbolLookupCache
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?
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.
ENTRY_TYPES bool isCompound() const
std::string to_string() const
bool isCompoundDoc() const
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 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 setMemberSpecifiers(TypeSpecifier s)=0
virtual void setDefinition(const QCString &d)=0
virtual ClassDefMutable * getClassDefMutable()=0
virtual void setExplicitExternal(bool b, const QCString &df, int line, int column)=0
virtual void setAccessorType(ClassDef *cd, const QCString &t)=0
virtual void setDefinitionTemplateParameterLists(const ArgumentLists &lists)=0
virtual void invalidateTypedefValCache()=0
virtual void setBitfields(const QCString &s)=0
virtual void setVhdlSpecifiers(VhdlSpecifier s)=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 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.
MemberDef * find(const QCString &name)
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 addListReferences()=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
void fill(char c, int len=-1)
Fills a string with a predefined character.
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
const std::string & str() const
QCString & setNum(short n)
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()
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
const Definition * resolveSymbol(const Definition *scope, const QCString &name, const QCString &args=QCString(), bool checkCV=false, bool insideCode=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.
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.
Iterator class to iterator 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 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 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 processTagLessClasses(const ClassDef *rootCd, const ClassDef *cd, ClassDefMutable *tagParentCd, const QCString &prefix, int count)
Look through the members of class cd and its public members.
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 copyIcon(const QCString &outputOption)
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 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 copyLogo(const QCString &outputOption)
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 int computeIdealCacheParam(size_t v)
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 void copyExtraFiles(const StringVector &files, const QCString &filesOption, const QCString &outputOption)
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 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 findTagLessClasses()
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 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 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 ClassDefMutable * createTagLessInstance(const ClassDef *rootCd, const ClassDef *templ, const QCString &fieldName)
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 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, const QCString &manName, const QCString &title, HighlightedItem hli, bool additionalIndices, const QCString &altSidebarName, int hierarchyLevel)
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)
std::vector< RefItem * > RefItemVector
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
@ GROUPING_INGROUP
membership in group was defined by @ingroup
static const char * getGroupPriName(GroupPri_t priority)
GroupPri_t pri
priority of this definition
const Definition * definition
const MemberDef * typeDef
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)
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 removeAnonymousScopes(const QCString &str)
bool matchArguments2(const Definition *srcScope, const FileDef *srcFileScope, const ArgumentList *srcAl, const Definition *dstScope, const FileDef *dstFileScope, const ArgumentList *dstAl, bool checkCV, SrcLangExt lang)
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()
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.