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) &&
1037 (i=fullName.
find(
'<'))!=-1)
1042 if (i!=-1 && root->
lang==SrcLangExt::CSharp)
1051 fullName=fullName.
left(i);
1062 fullName,sec,tagName,refFileName,
TRUE,root->
spec.isEnum()) ));
1065 AUTO_TRACE_ADD(
"New class '{}' type={} #tArgLists={} tagInfo={} hidden={} artificial={}",
1098 AUTO_TRACE_ADD(
"Class {} not added, already exists as alias", fullName);
1106 if (!root->
spec.isForwardDecl())
1167 qualifiedName.
prepend(scName+
"::");
1173 AUTO_TRACE_ADD(
"Found concept with name '{}' (qualifiedName='{}')", cd ? cd->
name() : root->
name, qualifiedName);
1177 qualifiedName=cd->
name();
1191 AUTO_TRACE_ADD(
"New concept: fullname '{}' namespace '{}' name='{}' brief='{}' docs='{}'",
1192 qualifiedName,namespaceName,className,root->
brief,root->
doc);
1201 if (qualifiedName.
find(
"::")!=-1)
1213 qualifiedName,tagName,refFileName)));
1217 qualifiedName,root->
tArgLists.size(),fmt::ptr(tagInfo));
1248 AUTO_TRACE_ADD(
"Concept '{}' not added, already exists (as alias)", qualifiedName);
1269 if (root->
section.isModuleDoc())
1279 if (root->
section.isConcept())
1289 if (root->
section.isConceptDoc())
1308 if (cd!=ocd && cd->groupId()==ocd->groupId() &&
1309 !cd->partOfGroups().empty() && ocd->partOfGroups().empty())
1314 for (
const auto &gd : cd->partOfGroups())
1320 gd->addConcept(ocd.get());
1345 aliasFullName(name),aliasCd(std::move(cd)), aliasContext(ctx) {}
1347 std::unique_ptr<ClassDef> aliasCd;
1350 std::vector<ClassAlias> aliases;
1354 if (cd && visitedClasses.find(icd.get())==visitedClasses.end())
1360 name,icd->getFileDef(),
nullptr);
1386 aliases.emplace_back(aliasFullName,std::move(aliasCd),dm);
1397 visitedClasses.insert(icd.get());
1407 for (
auto &alias : aliases)
1412 alias.aliasContext->addInnerCompound(aliasCd);
1421 if (cd && visitedClasses.find(icd.get())==visitedClasses.end())
1439 "Incomplete input: scope for class {} not found!{}",name,
1440 name.
startsWith(
"std::") ?
" Try enabling BUILTIN_STL_SUPPORT." :
""
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);
2549 mmd->setMemberGroupId(root->
mGrpId);
2550 mmd->setMemberSpecifiers(root->
spec);
2551 mmd->setVhdlSpecifiers(root->
vhdlSpec);
2552 mmd->setReadAccessor(root->
read);
2553 mmd->setWriteAccessor(root->
write);
2555 mmd->setHidden(root->
hidden);
2557 mmd->setLanguage(root->
lang);
2558 mmd->setId(root->
id);
2561 mmd->setBodyDef(root->
fileDef());
2566 mmd->setRefItems(root->
sli);
2596 AUTO_TRACE(
"global variable: file='{}' type='{}' scope='{}' name='{}' args='{}' prot={} mtype={} lang={} init='{}'",
2608 static const reg::Ex re(R
"(\a\w*)");
2610 const std::string &typ = ttype.
str();
2632 if (scope.
find(
'@')!=-1)
return nullptr;
2648 if (root->
spec.isAlias())
2650 def=
"using "+nd->
name()+sep+name;
2654 def=type+
" "+nd->
name()+sep+name+args;
2659 def=nd->
name()+sep+name+args;
2666 if (name.
at(0)==
'@')
2672 if (root->
spec.isAlias())
2674 def=
"using "+root->
name;
2678 def=type+
" "+name+args;
2699 for (
const auto &imd : *mn)
2713 bool isPHPArray = md->
getLanguage()==SrcLangExt::PHP &&
2716 bool staticsInDifferentFiles =
2722 !staticsInDifferentFiles
2763 mmd->setTagInfo(root->
tagInfo());
2764 mmd->setMemberSpecifiers(root->
spec);
2765 mmd->setVhdlSpecifiers(root->
vhdlSpec);
2769 mmd->addSectionsToDefinition(root->
anchors);
2770 mmd->setFromAnonymousScope(fromAnnScope);
2771 mmd->setFromAnonymousMember(fromAnnMemb);
2774 mmd->setMemberGroupId(root->
mGrpId);
2775 mmd->setDefinition(def);
2776 mmd->setLanguage(root->
lang);
2777 mmd->setId(root->
id);
2785 mmd->setBodyDef(fd);
2790 mmd->setRefItems(root->
sli);
2793 mmd->setNamespace(nd);
2801 mmd->setFileDef(fd);
2829 if (lang == SrcLangExt::Fortran || lang == SrcLangExt::VHDL)
2834 static const reg::Ex re(R
"(\([^)]*[*&^][^)]*\))");
2836 size_t i=std::string::npos;
2840 i = match.position();
2843 if (i!=std::string::npos)
2845 size_t di = type.find(
"decltype(");
2846 if (di!=std::string::npos && di<i)
2848 i = std::string::npos;
2851 size_t bb=type.find(
'<');
2852 size_t be=type.rfind(
'>');
2853 bool templFp =
false;
2854 if (be!=std::string::npos) {
2855 size_t cc_ast = type.find(
"::*");
2856 size_t cc_amp = type.find(
"::&");
2857 templFp = (cc_ast != std::string::npos && cc_ast>be) || (cc_amp != std::string::npos && cc_amp>be);
2860 if (!type.empty() &&
2861 i!=std::string::npos &&
2862 type.find(
"operator")==std::string::npos &&
2863 (type.find(
")(")==std::string::npos || type.find(
"typedef ")!=std::string::npos) &&
2865 (!(bb<i && i<be) || templFp)
2868 if (pLength) *pLength=
static_cast<int>(l);
2871 return static_cast<int>(i);
2888 bool result =
false;
2889 bool typeIsClass =
false;
2890 bool typePtrType =
false;
2924 typePtrType = type.
find(
'*')!=-1 || type.
find(
'&')!=-1;
2927 typeIsClass = resolver.
resolveClass(ctx,type)!=
nullptr;
2929 if (!typeIsClass && (ti=type.
find(
'<'))!=-1)
2946 static const reg::Ex initChars(R
"([\d"'&*!^]+)");
2950 std::string name = a.
name.
str();
2951 if (
reg::search(name,match,initChars) && match.position()==0)
2983 std::string atype = a.
type.
str();
2984 if (
reg::search(atype,match,initChars) && match.position()==0)
2991 if (resType.empty()) resType=atype;
2992 static const reg::Ex idChars(R
"(\a\w*)");
2993 if (
reg::search(resType,match,idChars) && match.position()==0)
2995 resType=match.str();
2996 if (resType==
"int" || resType==
"long" ||
2997 resType==
"float" || resType==
"double" ||
2998 resType==
"char" || resType==
"void" ||
2999 resType==
"signed" || resType==
"unsigned" ||
3000 resType==
"const" || resType==
"volatile" )
3037 bool insideString=
FALSE;
3038 bool insideChar=
FALSE;
3040 while (e<len && brCount!=0)
3046 if (!insideString && !insideChar)
3048 if (e<len-1 && s.
at(e+1)==
'<')
3050 else if (roundCount==0)
3055 if (!insideString && !insideChar)
3057 if (e<len-1 && s.
at(e+1)==
'>')
3059 else if (roundCount==0)
3064 if (!insideString && !insideChar)
3068 if (!insideString && !insideChar)
3074 if (insideString && pc!=
'\\')
3083 if (insideChar && pc!=
'\\')
3093 return brCount==0 ?
static_cast<int>(e) : -1;
3102 AUTO_TRACE(
"VARIABLE_SEC: type='{}' name='{}' args='{}' bodyLine={} endBodyLine={} mGrpId={} relates='{}'",
3109 if (type.
isEmpty() && name.
find(
"operator")==-1 &&
3110 (name.
find(
'*')!=-1 || name.
find(
'&')!=-1))
3117 std::string sargs = args.
str();
3118 static const reg::Ex reName(R
"(\a\w*)");
3123 sargs = match.suffix().str();
3124 size_t j = sargs.find(
')');
3125 if (j!=std::string::npos) args=sargs.substr(0,j);
3135 int ai = type.
find(
'[',i);
3141 else if (type.
find(
')',i)!=-1)
3148 AUTO_TRACE_ADD(
"after correction: type='{}' name='{}' args='{}'",type,name,args);
3159 scope=name.
left(index);
3160 name=name.
mid(index+2);
3179 bool isRelated=
FALSE;
3180 bool isMemberOf=
FALSE;
3183 if (root->
lang==SrcLangExt::CSharp)
3196 for (
size_t i=0;i<name.
length()-1;i++)
3198 if (name[i]==
':' && name[i+1]==
':')
3200 p=
static_cast<int>(i);
3202 else if (name[i]==
'<')
3207 if (e!=-1) i=
static_cast<int>(e);
3213 if (type==
"friend class" || type==
"friend struct" ||
3214 type==
"friend union")
3228 Relationship::Member
3254 else if (root->
mtype==MethodTypes::Property)
3256 else if (root->
mtype==MethodTypes::Event)
3258 else if (type.
find(
"sequence<") != -1)
3260 else if (type.
find(
"dictionary<") != -1)
3266 isMemberOf=(root->
relatesType==RelatesType::MemberOf);
3284 int si=scope.
find(
'@');
3288 bool inlineSimpleStructs =
Config_getBool(INLINE_SIMPLE_STRUCTS);
3289 Relationship relationship = isMemberOf ? Relationship::Foreign :
3290 isRelated ? Relationship::Related :
3291 Relationship::Member ;
3292 if (si!=-1 && !inlineSimpleStructs)
3296 pScope = scope.
left(std::max(si-2,0));
3298 pScope.
prepend(annScopePrefix);
3299 else if (annScopePrefix.
length()>2)
3300 pScope=annScopePrefix.
left(annScopePrefix.
length()-2);
3301 if (name.
at(0)!=
'@')
3369 scope=rname.
left(index);
3370 rname=rname.
mid(index+2);
3382 for (
auto &imd : *mn)
3384 if (!imd->isTypedef())
3393 bool notBothGrouped = root->
groups.empty() || imd->getGroupDef()==
nullptr;
3394 bool bothSameScope = (!cd && !nd) || (cd && imd->getClassDef() == cd) || (nd && imd->getNamespaceDef() == nd);
3397 if (notBothGrouped && bothSameScope && imd->typeString()==rtype)
3444 for (
const auto &e : root->
children())
3445 if (!e->section.isEnum())
3462 for (
const auto &e : root->
children())
3463 if (!e->section.isEnum())
3480 for (
const auto &e : root->
children())
3481 if (!e->section.isEnum())
3496 (root->
section.isVariable() &&
3499 (root->
section.isFunction() &&
3502 (root->
section.isFunction() &&
3511 for (
const auto &e : root->
children())
3512 if (!e->section.isEnum())
3538 mmd->setTagInfo(root->
tagInfo());
3539 mmd->setMemberClass(cd);
3541 mmd->setDocsForDefinition(
false);
3545 mmd->setMemberSpecifiers(root->
spec);
3546 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3547 mmd->setMemberGroupId(root->
mGrpId);
3549 mmd->setLanguage(root->
lang);
3550 mmd->setBodyDef(fd);
3551 mmd->setFileDef(fd);
3552 mmd->addSectionsToDefinition(root->
anchors);
3554 mmd->setDefinition(def);
3558 AUTO_TRACE(
"Interface member: fileName='{}' type='{}' name='{}' mtype='{}' prot={} virt={} state={} proto={} def='{}'",
3566 root->
spec.isOptional() ? Protection::Protected : Protection::Public, Specifier::Normal);
3576 mmd->setRefItems(root->
sli);
3585 if (root->
section.isExportedInterface() || root->
section.isIncludedService())
3587 AUTO_TRACE(
"Exported interface/included service: type='{}' scope='{}' name='{}' args='{}'"
3588 " relates='{}' relatesType='{}' file='{}' line={} bodyLine={} #tArgLists={}"
3589 " mGrpId={} spec={} proto={} docFile='{}'",
3615 "Illegal member name found.");
3621 case SrcLangExt::Unknown:
3622 case SrcLangExt::IDL:
3659 if ((fd==
nullptr || fd->
getLanguage()==SrcLangExt::Cpp) &&
3661 (i=name.
find(
'<'))!=-1 &&
3662 (j=name.
find(
'>'))!=-1 &&
3663 (j!=i+2 || name.
at(i+1)!=
'=')
3681 root->
relatesType==RelatesType::MemberOf ? Relationship::Foreign :
3682 Relationship::Related ;
3692 mmd->setTagInfo(root->
tagInfo());
3693 mmd->setMemberClass(cd);
3695 mmd->setDocsForDefinition(!root->
proto);
3699 mmd->setMemberSpecifiers(spec);
3700 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3701 mmd->setMemberGroupId(root->
mGrpId);
3703 mmd->setLanguage(root->
lang);
3704 mmd->setRequiresClause(root->
req);
3705 mmd->setId(root->
id);
3706 mmd->setBodyDef(fd);
3707 mmd->setFileDef(fd);
3708 mmd->addSectionsToDefinition(root->
anchors);
3713 if (scopeSeparator!=
"::")
3715 qualScope =
substitute(qualScope,
"::",scopeSeparator);
3717 if (lang==SrcLangExt::PHP)
3720 scopeSeparator=
"::";
3737 def=type+
" "+qualScope+scopeSeparator+name;
3741 def=qualScope+scopeSeparator+name;
3745 mmd->setDefinition(def);
3749 AUTO_TRACE(
"function member: type='{}' scope='{}' name='{}' args='{}' proto={} def='{}'",
3750 type, qualScope, rname, args, root->
proto, def);
3760 mmd->setRefItems(root->
sli);
3784 mmd->setTagInfo(root->
tagInfo());
3785 mmd->setLanguage(root->
lang);
3786 mmd->setId(root->
id);
3791 mmd->setDocsForDefinition(!root->
proto);
3797 mmd->addSectionsToDefinition(root->
anchors);
3798 mmd->setMemberSpecifiers(root->
spec);
3799 mmd->setVhdlSpecifiers(root->
vhdlSpec);
3800 mmd->setMemberGroupId(root->
mGrpId);
3801 mmd->setRequiresClause(root->
req);
3836 def=root->
type+
" "+scope+name;
3842 AUTO_TRACE(
"new non-member function type='{}' scope='{}' name='{}' args='{}' proto={} def='{}'",
3844 mmd->setDefinition(def);
3848 mmd->setRefItems(root->
sli);
3852 mmd->setNamespace(nd);
3859 mmd->setFileDef(fd);
3880 if (root->
section.isFunction())
3882 AUTO_TRACE(
"member function: type='{}' scope='{}' name='{}' args='{}' relates='{}' relatesType='{}'"
3883 " file='{}' line={} bodyLine={} #tArgLists={} mGrpId={}"
3884 " spec={} proto={} docFile='{}'",
3889 bool isFriend=root->
type==
"friend" || root->
type.
find(
"friend ")!=-1;
3899 scope=rname.
left(index);
3900 rname=rname.
mid(index+2);
3909 if (root->
lang==SrcLangExt::CSharp)
3920 int memIndex=rname.
findRev(
"::");
3923 if (cd && scope+
"::"==rname.
left(scope.
length()+2))
3929 bool isMember=
FALSE;
3932 int ts=rname.
find(
'<');
3933 int te=rname.
find(
'>');
3934 if (memIndex>0 && (ts==-1 || te==-1))
3951 isMember=memIndex<ts || memIndex>te;
3991 for (
const auto &imd : *mn)
4004 fullScope.
prepend(parentScope);
4010 if (mnd) nsName = mnd->
name();
4011 if (rnd) rnsName = rnd->
name();
4019 bool sameTemplateArgs =
TRUE;
4020 bool matchingReturnTypes =
TRUE;
4021 bool sameRequiresClause =
TRUE;
4027 matchingReturnTypes =
FALSE;
4031 sameRequiresClause =
FALSE;
4037 sameTemplateArgs =
FALSE;
4040 bool staticsInDifferentFiles =
4043 if (sameTemplateArgs &&
4044 matchingReturnTypes &&
4045 sameRequiresClause &&
4046 !staticsInDifferentFiles &&
4053 if (!root->
groups.empty() && !root->
groups.front().groupname.isEmpty())
4060 found=(mnd && rnd && nsName==rnsName) ||
4061 ((mnd==
nullptr && rnd==
nullptr && mfd!=
nullptr &&
4066 if (!found && gd && gd==md->
getGroupDef() && nsName==rnsName)
4072 AUTO_TRACE_ADD(
"combining function with prototype found={} in namespace '{}'",found,nsName);
4174 "Illegal member name found."
4192 for (
const auto &ifmd : *fn)
4196 for (
const auto &immd : *mn)
4212 AUTO_TRACE_ADD(
"Merging related global and member '{}' isFriend={} isRelated={} isFunction={}",
4289 for (
const auto &imdec : *mn)
4297 for (
const auto &imdef : *mn)
4300 if (mdef && mdec!=mdef &&
4320 for (
const auto &imd : *mn)
4336 if (mdef && mdec)
break;
4344 mdec->getOuterScope(),mdec->getFileDef(),mdec->typeString(),
const_cast<ArgumentList*
>(&mdecAl),
4351 mdec->mergeReferences(mdef);
4353 mdec->mergeReferencedBy(mdef);
4370 for (
const auto &imd : *mn)
4381 for (
const auto &irmd : *rmn)
4415 size_t i=qualifiedName.rfind(
"::");
4416 if (i!=std::string::npos)
4418 QCString scope = qualifiedName.substr(0,i);
4419 QCString name = qualifiedName.substr(i+2);
4423 for (
const auto &imd : *mn)
4449 std::map<std::string,int> templateNames;
4451 for (
const Argument &arg : templateArguments)
4453 static const reg::Ex re(R
"(\a[\w:]*)");
4456 for (; it!=
end ; ++it)
4458 const auto &match = *it;
4459 std::string n = match.str();
4460 if (n==arg.name.str())
4462 if (templateNames.find(n)==templateNames.end())
4464 templateNames.emplace(n,count);
4469 return templateNames;
4484 if (context && cd!=context)
4489 if (result==
nullptr)
4494 if (result==
nullptr)
4523 for (
auto &mi : *mni)
4533 type = typedefValue;
4552 usedClassName = typeCd->
name();
4562 if (templateNames.empty())
4566 BaseInfo bi(usedName,Protection::Public,Specifier::Normal);
4571 if (arg.name==usedName)
4575 if (usedCd==
nullptr)
4626 if (!found && !type.
isEmpty())
4685 if (templateNames.empty())
4723 AUTO_TRACE(
"Derived from template '{}' with parameters '{}' isArtificial={}",
4724 templateClass->
name(),templSpec,isArtificial);
4727 bool existingClass = templSpec==tempArgsStr;
4728 if (existingClass)
return;
4730 bool freshInstance=
FALSE;
4747 for (
auto it=it_pair.first ; it!=it_pair.second ; ++it)
4749 const Entry *templateRoot = it->second;
4750 AUTO_TRACE_ADD(
"template root found '{}' templSpec='{}'",templateRoot->
name,templSpec);
4756 isArtificial,templArgs.get(),templateNames);
4775 int ti=ttype.
find(
'<');
4781 templateClassName,
true,
true);
4782 AUTO_TRACE_ADD(
"templateClassName={} baseClass={}",templateClassName,baseClass?baseClass->
name():
"<none>");
4801 int index=n.
find(
'<');
4813 int l =
static_cast<int>(name.
length());
4819 while (count>0 && i>=0)
4824 case '>':
if (!insideQuote) count++;
break;
4825 case '<':
if (!insideQuote) count--;
break;
4826 case '\'':
if (!insideQuote) insideQuote=c;
4827 else if (insideQuote==c && (i<0 || name[i]!=
'\\')) insideQuote=0;
4829 case '"':
if (!insideQuote) insideQuote=c;
4830 else if (insideQuote==c && (i<0 || name[i]!=
'\\')) insideQuote=0;
4850 AUTO_TRACE(
"name={} base={} isArtificial={} mode={}",cd->
name(),bi->
name,isArtificial,(
int)mode);
4853 bool explicitGlobalScope=
FALSE;
4857 explicitGlobalScope=
TRUE;
4861 bool lastParent=
FALSE;
4866 int scopeOffset=explicitGlobalScope ? 0 :
static_cast<int>(scopeName.
length());
4875 baseClassName.
prepend(scopeName.
left(scopeOffset)+
"::");
4877 if (root->
lang==SrcLangExt::CSharp)
4904 || explicitGlobalScope
4907 || (root->
lang==SrcLangExt::IDL &&
4908 (root->
section.isExportedInterface() ||
4909 root->
section.isIncludedService()))
4912 AUTO_TRACE_ADD(
"class relation '{}' inherited/used by '{}' found prot={} virt={} templSpec='{}'",
4913 baseClassName, root->
name, bi->
prot, bi->
virt, templSpec);
4916 int si=baseClassName.
findRev(
"::",i);
4918 if (baseClass==
nullptr &&
static_cast<size_t>(i)!=baseClassName.
length())
4928 baseClassName = baseClassName.
left(i)+baseClassName.
right(baseClassName.
length()-e);
4939 else if (baseClass && !templSpec.
isEmpty())
4950 baseClass = templClass;
4958 if (!found && si!=-1)
4968 found=baseClass!=
nullptr && baseClass!=cd;
4978 found = baseClass!=
nullptr && baseClass!=cd;
4990 found = baseClass!=
nullptr && baseClass!=cd;
4993 bool isATemplateArgument = templateNames.find(biName.
str())!=templateNames.end();
4998 AUTO_TRACE_ADD(
"Documented base class '{}' templSpec='{}'",biName,templSpec);
5016 if (baseClassTypeDef==
nullptr)
5026 if (baseClassTypeDef)
5035 AUTO_TRACE_ADD(
"insertBaseClass name={} prot={} virt={} templSpec={}",usedName,prot,bi->
virt,templSpec);
5043 "Detected potential recursive class relation "
5044 "between class {} and base class {}!",
5051 else if (mode==
Undocumented && (scopeOffset==0 || isATemplateArgument))
5053 AUTO_TRACE_ADD(
"New undocumented base class '{}' baseClassName='{}' templSpec='{}' isArtificial={}",
5054 biName,baseClassName,templSpec,isArtificial);
5056 if (isATemplateArgument)
5059 if (baseClass==
nullptr)
5078 if (baseClass==
nullptr)
5089 si = baseClassName.
findRev(
"::");
5105 biName=
"<"+biName.
left(biName.
length()-2)+
">";
5109 AUTO_TRACE_ADD(
"insertBaseClass name={} prot={} virt={} templSpec={}",biName,bi->
prot,bi->
virt,templSpec);
5119 if (scope!=baseClass)
5145 "Detected potential recursive class relation "
5146 "between class {} and base class {}!",
5147 root->
name,baseClassName
5158 else if ((scopeOffset=scopeName.
findRev(
"::",scopeOffset-1))==-1)
5163 }
while (scopeOffset>=0);
5165 if (parentNode==
nullptr)
5171 parentNode=parentNode->
parent();
5173 }
while (lastParent);
5193 bool hasExtends = !root->
extends.empty();
5194 if (hasExtends)
return TRUE;
5218 if ((root->
lang==SrcLangExt::CSharp || root->
lang==SrcLangExt::Java) &&
5219 (i=bName.
find(
'<'))!=-1)
5223 if (root->
lang==SrcLangExt::CSharp)
5229 bName = bName.
left(i);
5261 if (i!=-1 && j!=-1 && k==-1 && root->
lang!=SrcLangExt::CSharp && root->
lang!=SrcLangExt::Java)
5294 if (!nd->hasDocumentation())
5297 nd->getLanguage() == SrcLangExt::Fortran) &&
5301 warn_undoc(nd->getDefFileName(),nd->getDefLine(),
"{} {} is not documented.",
5302 nd->getLanguage() == SrcLangExt::Fortran ?
"Module" :
"Namespace",
5366 for (
const auto &tn_kv : templateNames)
5368 size_t templIndex = tn_kv.second;
5370 bool hasActArg=
FALSE;
5371 if (templIndex<templArgs->size())
5373 actArg=templArgs->at(templIndex);
5377 baseClassNames.find(actArg.
type.
str())!=baseClassNames.end() &&
5378 actualTemplateNames.find(actArg.
type.
str())==actualTemplateNames.end()
5381 actualTemplateNames.emplace(actArg.
type.
str(),
static_cast<int>(templIndex));
5416 for (
const auto &fd : *fn)
5418 fd->computeAnchors();
5431 gd->computeAnchors();
5451 for (
const auto &fd : *fn)
5453 fd->addListReferences();
5468 gd->addListReferences();
5473 QCString name = pd->getOutputFileBase();
5474 if (pd->getGroupDef())
5476 name = pd->getGroupDef()->getOutputFileBase();
5483 name,pd->title(),
QCString(),
nullptr);
5489 QCString name = dd->getOutputFileBase();
5498 name,dd->displayName(),
QCString(),
nullptr);
5527 if (md==
nullptr)
return;
5528 AUTO_TRACE(
"scope='{}' name='{}' args='{}' funcDecl='{}' mSpec={}",
5543 fullName = cd->
name();
5545 fullName = nd->
name();
5547 if (!fullName.
isEmpty()) fullName+=
"::";
5548 fullName+=md->
name();
5652 "member {} belongs to two different groups. The second one found here will be ignored.",
5690 return allowNoGroup;
5693 for (
const auto &g : root->
groups)
5695 if (g.groupname == gd->
name())
5718 AUTO_TRACE(
"namespace='{}' type='{}' name='{}' tempArg='{}' decl='{}'",namespaceName,type,name,tempArg,decl);
5732 for (
const auto &md : *mn)
5743 if (md->isAlias() && md->getOuterScope() &&
5750 nd = md->getNamespaceDef();
5755 if (nd && md->isEnumValue() && (enumNamePos=namespaceName.
findRev(
"::"))!=-1)
5757 QCString enumName = namespaceName.
mid(enumNamePos+2);
5758 if (namespaceName.
left(enumNamePos)==nd->
name())
5763 for (
const auto &emd : *enumMn)
5765 found = emd->isStrong() && md->getEnumScope()==emd.get();
5779 else if (nd==
nullptr && md->isEnumValue())
5784 for (
const auto &emd : *enumMn)
5786 found = emd->isStrong() && md->getEnumScope()==emd.get();
5809 if ((namespaceName.
isEmpty() && nd==
nullptr) ||
5810 (nd && nd->
name()==namespaceName) ||
5814 AUTO_TRACE_ADD(
"Try to add member '{}' to scope '{}'",md->name(),namespaceName);
5822 md->isVariable() || md->isTypedef() ||
5823 matchArguments2(md->getOuterScope(),md->getFileDef(),md->typeString(),&mdAl,
5830 if (matching && !root->
tArgLists.empty())
5849 if (matching && md->isStatic() &&
5850 md->getDefFileName()!=root->
fileName &&
5858 if (!md->templateArguments().empty() && !root->
tArgLists.empty())
5862 if (md->templateArguments().size()!=root->
tArgLists.back().size() ||
5863 md->typeString()!=type ||
5864 md->requiresClause()!=root->
req)
5880 if (!found && root->
relatesType!=RelatesType::Duplicate && root->
section.isFunction())
5884 QCString warnMsg =
"no matching file member found for \n"+fullFuncDecl;
5887 warnMsg+=
"\nPossible candidates:";
5888 for (
const auto &md : *mn)
5892 warnMsg+=
"' " +
warn_line(md->getDefFileName(),md->getDefLine());
5900 if (root->
type!=
"friend class" &&
5901 root->
type!=
"friend struct" &&
5902 root->
type!=
"friend union" &&
5903 root->
type!=
"friend" &&
5909 "documented symbol '{}' was not declared or defined.",
qPrint(decl)
5921 auto srcIt = srcTempArgLists.begin();
5922 auto dstIt = dstTempArgLists.begin();
5923 while (srcIt!=srcTempArgLists.end() && dstIt!=dstTempArgLists.end())
5925 if ((*srcIt).size()!=(*dstIt).size())
return TRUE;
5939 result = cd->templateArguments().hasParameters() || cd->templateMaster()!=
nullptr ||
5949 const std::string &src
5953 static const reg::Ex re(R
"(\a\w*)");
5958 for (; it!=
end ; ++it)
5960 const auto &match = *it;
5961 size_t i = match.position();
5962 size_t l = match.length();
5964 dst+=src.substr(p,i-p);
5965 std::string name=match.str();
5967 auto srcIt = srcTempArgLists.begin();
5968 auto dstIt = dstTempArgLists.begin();
5969 while (srcIt!=srcTempArgLists.end() && !found)
5972 std::vector<Argument>::const_iterator tdaIt;
5973 if (dstIt!=dstTempArgLists.end())
5976 tdaIt = tdAli->
begin();
5981 for (
auto tsaIt = tsaLi.
begin(); tsaIt!=tsaLi.
end() && !found; ++tsaIt)
5985 if (tdAli && tdaIt!=tdAli->
end())
6001 else if (tdaType.
startsWith(
"typename ")) vc=9;
6004 tdaName = tdaType.
mid(vc);
6037 auto dstIt = dst.
begin();
6042 if (dstIt == dst.
end())
6046 da.
array = dstArray;
6054 da.
array = dstArray;
6062 srcTempArgLists,dstTempArgLists,
6088 funcType,funcName,funcArgs,exceptions,
6092 mmd->setTagInfo(root->
tagInfo());
6093 mmd->setLanguage(root->
lang);
6094 mmd->setId(root->
id);
6095 mmd->makeImplementationDetail();
6096 mmd->setMemberClass(cd);
6097 mmd->setDefinition(funcDecl);
6103 mmd->setDocsForDefinition(!root->
proto);
6105 mmd->addSectionsToDefinition(root->
anchors);
6109 mmd->setMemberSpecifiers(spec);
6110 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6111 mmd->setMemberGroupId(root->
mGrpId);
6114 mmd->setRefItems(root->
sli);
6150 bool memFound=
FALSE;
6151 for (
const auto &imd : *mn)
6154 if (md==
nullptr)
continue;
6156 if (cd==
nullptr)
continue;
6173 if (!namespaceName.
isEmpty()) fullScope.
prepend(namespaceName+
"::");
6174 if (fullScope==cd->
name())
6180 for (
const auto &emd : *enumMn)
6182 memFound = emd->isStrong() && md->
getEnumScope()==emd.get();
6188 if (memFound)
break;
6193 if (memFound)
break;
6211 if (!templAl.
empty())
6213 declTemplArgs.push_back(templAl);
6221 bool substDone=
false;
6228 if (declTemplArgs.size()>0 && declTemplArgs.size()==defTemplArgs.size())
6251 AUTO_TRACE_ADD(
"matching '{}'<=>'{}' className='{}' namespaceName='{}' result={}",
6280 AUTO_TRACE_ADD(
"Comparing return types '{}'<->'{}' #args {}<->{}",
6288 else if (defTemplArgs.size()>declTemplArgs.size())
6290 AUTO_TRACE_ADD(
"Different number of template arguments {} vs {}",defTemplArgs.size(),declTemplArgs.size());
6296 bool rootIsUserDoc = root->
section.isMemberDoc();
6299 bool classOrMdIsTemplate = mdIsTemplate || classIsTemplate;
6300 bool rootIsTemplate = !root->
tArgLists.empty();
6302 if (!rootIsUserDoc &&
6303 (mdIsTemplate || rootIsTemplate) &&
6304 ((classOrMdIsTemplate && !rootIsTemplate) || (!classOrMdIsTemplate && rootIsTemplate))
6309 AUTO_TRACE_ADD(
"Comparing return types: template v.s. non-template");
6313 AUTO_TRACE_ADD(
"Match results of matchArguments2='{}' substDone='{}'",matching,substDone);
6324 if (!funcTempList.
isEmpty() &&
6344 else if (cd && cd!=tcd)
6350 if (memFound)
break;
6354 addLocalObjCMethod(root,scopeName,funcType,funcName,funcArgs,exceptions,funcDecl,spec);
6357 if (count==0 && !(isFriend && funcType==
"class"))
6360 const ClassDef *ecd =
nullptr, *ucd =
nullptr;
6361 MemberDef *emd =
nullptr, *umd =
nullptr;
6363 for (
const auto &md : *mn)
6385 AUTO_TRACE_ADD(
"new candidate className='{}' scope='{}' args='{}': exact match",
6386 className,ccd->
name(),md->argsString());
6392 AUTO_TRACE_ADD(
"new candidate className='{}' scope='{}' args='{}': no match",
6393 className,ccd->
name(),md->argsString());
6398 bool strictProtoMatching =
Config_getBool(STRICT_PROTO_MATCHING);
6399 if (!strictProtoMatching)
6401 if (candidates==1 && ucd && umd)
6408 else if (candidates>1 && ecd && emd)
6419 if (noMatchCount>1) warnMsg+=
"uniquely ";
6420 warnMsg+=
"matching class member found for \n";
6424 warnMsg+=
" template ";
6433 warnMsg+=fullFuncDecl;
6435 if (candidates>0 || noMatchCount>=1)
6437 warnMsg+=
"\nPossible candidates:";
6443 for (
const auto &md : *mn)
6445 const ClassDef *cd=md->getClassDef();
6459 warnMsg+=
"template ";
6464 if (!md->typeString().isEmpty())
6466 warnMsg+=md->typeString();
6471 warnMsg+=qScope+
"::"+md->name();
6472 warnMsg+=md->argsString();
6473 warnMsg+=
"' " +
warn_line(md->getDefFileName(),md->getDefLine());
6494 AUTO_TRACE(
"funcType={} funcName={} funcArgs={} funcDecl={} spec={}",funcType,funcName,funcArgs,funcDecl,spec);
6496 for (
const auto &md : *mn)
6498 if (md->getClassDef()==cd)
6510 funcType,funcName,funcArgs,exceptions,
6516 mmd->setTagInfo(root->
tagInfo());
6517 mmd->setLanguage(root->
lang);
6518 mmd->setId(root->
id);
6519 mmd->setMemberClass(cd);
6520 mmd->setTemplateSpecialization(
TRUE);
6522 mmd->setDefinition(funcDecl);
6528 mmd->setDocsForDefinition(!root->
proto);
6530 mmd->addSectionsToDefinition(root->
anchors);
6534 mmd->setMemberSpecifiers(spec);
6535 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6536 mmd->setMemberGroupId(root->
mGrpId);
6538 mmd->setRefItems(root->
sli);
6552 bool sameClass=
false;
6557 [](
const auto &md1,
const auto &md2)
6558 { return md1->getClassDef()->name()==md2->getClassDef()->name(); });
6564 if (cd==
nullptr)
return;
6572 std::unique_ptr<ArgumentList> tArgList =
6577 funcType,funcName,funcArgs,exceptions,
6581 mmd->setTagInfo(root->
tagInfo());
6582 mmd->setLanguage(root->
lang);
6583 mmd->setId(root->
id);
6585 mmd->setMemberClass(cd);
6586 mmd->setDefinition(funcDecl);
6595 mmd->setDocsForDefinition(!root->
proto);
6597 mmd->addSectionsToDefinition(root->
anchors);
6601 mmd->setMemberSpecifiers(spec);
6602 mmd->setVhdlSpecifiers(root->
vhdlSpec);
6603 mmd->setMemberGroupId(root->
mGrpId);
6606 mmd->setRefItems(root->
sli);
6664 AUTO_TRACE(
"root='{}' funcDecl='{}' related='{}' overload={} isFunc={} mGrpId={} #tArgList={} spec={} lang={}",
6677 bool isRelated=
false;
6678 bool isMemberOf=
false;
6679 bool isFriend=
false;
6692 spec.setInline(
true);
6697 spec.setExplicit(
true);
6702 spec.setMutable(
true);
6707 spec.setThreadLocal(
true);
6718 while ((sep=funcDecl.
find(
';'))!=-1)
6724 if (!funcDecl.
isEmpty() && funcDecl[0]!=
' ') funcDecl.
prepend(
" ");
6736 if (isFriend && funcDecl.
startsWith(
"class "))
6740 funcName = funcDecl;
6742 else if (isFriend && funcDecl.
startsWith(
"struct "))
6745 funcName = funcDecl;
6751 funcArgs,funcTempList,exceptions
6759 AUTO_TRACE_ADD(
"scopeName='{}' className='{}' namespaceName='{}' funcType='{}' funcName='{}' funcArgs='{}'",
6760 scopeName,className,namespaceName,funcType,funcName,funcArgs);
6764 isMemberOf=(root->
relatesType == RelatesType::MemberOf);
6771 scopeName = relates;
6784 scopeName = joinedName;
6798 QCString joinedName = fnd->name()+
"::"+scopeName;
6801 scopeName=joinedName;
6828 AUTO_TRACE_ADD(
"scopeName='{}' className='{}' namespaceName='{}'",scopeName,className,namespaceName);
6837 scopeName=namespaceName;
6839 else if (!relates.
isEmpty() ||
6842 scopeName=namespaceName+
"::"+className;
6846 scopeName=className;
6849 else if (!className.
isEmpty())
6851 scopeName=className;
6861 uint32_t argListIndex=0;
6866 tempScopeName=scopeName+funcSpec;
6880 funcDecl=funcType+
" "+tempScopeName+
"::"+funcName+funcTempList;
6884 funcDecl=funcType+
" "+tempScopeName+
"::"+funcName+funcArgs;
6891 funcDecl=tempScopeName+
"::"+funcName+funcTempList;
6895 funcDecl=tempScopeName+
"::"+funcName+funcArgs;
6905 funcDecl=funcType+
" "+funcName+funcTempList;
6909 funcDecl=funcType+
" "+funcName+funcArgs;
6916 funcDecl=funcName+funcTempList;
6920 funcDecl=funcName+funcArgs;
6925 if (funcType==
"template class" && !funcTempList.
isEmpty())
6928 AUTO_TRACE_ADD(
"Parse results: namespaceName='{}' className=`{}` funcType='{}' funcSpec='{}' "
6929 " funcName='{}' funcArgs='{}' funcTempList='{}' funcDecl='{}' relates='{}'"
6930 " exceptions='{}' isRelated={} isMemberOf={} isFriend={} isFunc={}",
6931 namespaceName, className, funcType, funcSpec,
6932 funcName, funcArgs, funcTempList, funcDecl, relates,
6933 exceptions, isRelated, isMemberOf, isFriend, isFunc);
6939 bool strongEnum =
false;
6943 for (
const auto &imd : *mn)
6956 namespaceName+=
"::"+className;
6960 namespaceName=className;
6968 funcName =
substitute(funcName,className+
"::",
"");
6979 if (!isRelated && !strongEnum && mn)
6987 funcArgs,funcTempList,exceptions,
6988 type,args,isFriend,spec,relates,funcDecl,overloaded,isFunc);
7000 else if (overloaded)
7002 addOverloaded(root,mn,funcType,funcName,funcArgs,funcDecl,exceptions,spec);
7006 if (!
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec))
7011 "Cannot determine class for function\n{}",
7017 else if (isRelated && !relates.
isEmpty())
7019 AUTO_TRACE_ADD(
"related function scopeName='{}' className='{}'",scopeName,className);
7020 if (className.
isEmpty()) className=relates;
7024 bool newMember=
TRUE;
7030 for (
const auto &imd : *mn)
7064 mn->
push_back(std::move(mdDefineTaken));
7078 for (
const auto &irmd : *mn)
7099 addMemberDocs(root,rmd_found,funcDecl,
nullptr,overloaded,spec);
7107 switch (root->
mtype)
7128 funcType,funcName,funcArgs,exceptions,
7131 isMemberOf ? Relationship::Foreign : Relationship::Related,
7151 mmd->setDefinitionTemplateParameterLists(root->
tArgLists);
7153 mmd->setTagInfo(root->
tagInfo());
7167 for (
const auto &irmd : *rmn)
7198 mmd->setBodyDef(fd);
7205 mmd->setMemberClass(cd);
7206 mmd->setMemberSpecifiers(spec);
7207 mmd->setVhdlSpecifiers(root->
vhdlSpec);
7208 mmd->setDefinition(funcDecl);
7213 mmd->setDocsForDefinition(!root->
proto);
7216 mmd->addSectionsToDefinition(root->
anchors);
7217 mmd->setMemberGroupId(root->
mGrpId);
7218 mmd->setLanguage(root->
lang);
7219 mmd->setId(root->
id);
7223 mmd->setRefItems(root->
sli);
7224 if (root->
relatesType==RelatesType::Duplicate) mmd->setRelatedAlso(cd);
7232 if (!
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec))
7237 "Cannot determine file/namespace for relatedalso function\n{}",
7251 addLocalObjCMethod(root,scopeName,funcType,funcName,funcArgs,exceptions,funcDecl,spec);
7255 bool globMem =
findGlobalMember(root,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl,spec);
7256 if (className.
isEmpty() && !globMem)
7260 else if (!className.
isEmpty() && !globMem)
7263 "member '{}' of class '{}' cannot be found",
7264 funcName,className);
7282 AUTO_TRACE(
"root->type='{}' root->inside='{}' root->name='{}' root->args='{}' section={} root->spec={} root->mGrpId={}",
7297 type=type.
left(i+l);
7308 if (root->
section.isMemberDoc())
7334 else if (root->
section.isOverloadDoc())
7348 (root->
section.isVariable() &&
7360 if (type==
"friend class" || type==
"friend struct" ||
7361 type==
"friend union")
7367 type+
" "+root->
name,
7400 else if (root->
section.isVariableDoc())
7412 else if (root->
section.isExportedInterface() ||
7413 root->
section.isIncludedService())
7419 type +
" " + root->
name,
7432 if (root->
section.isMemberDoc() ||
7433 root->
section.isOverloadDoc() ||
7436 root->
section.isVariableDoc() ||
7438 root->
section.isIncludedService() ||
7439 root->
section.isExportedInterface()
7449 for (
const auto &e : root->
children())
7451 if (!e->section.isEnum())
7463 for (
const auto &objCImpl : root->
children())
7465 if (objCImpl->section.isObjcImpl())
7467 for (
const auto &objCMethod : objCImpl->children())
7469 if (objCMethod->section.isFunction())
7473 objCMethod->relates,
7476 objCMethod->type+
" "+objCImpl->name+
"::"+objCMethod->name+
" "+objCMethod->args,
7478 objCMethod->section=EntryType::makeEmpty();
7497 bool isGlobal =
false;
7498 bool isRelated =
false;
7499 bool isMemberOf =
false;
7509 if (root->
lang==SrcLangExt::CSharp)
7532 isMemberOf=(root->
relatesType==RelatesType::MemberOf);
7567 isMemberOf ? Relationship::Foreign : isRelated ? Relationship::Related : Relationship::Member,
7571 mmd->setTagInfo(root->
tagInfo());
7572 mmd->setLanguage(root->
lang);
7573 mmd->setId(root->
id);
7574 if (!isGlobal) mmd->setMemberClass(cd);
else mmd->setFileDef(fd);
7576 mmd->setBodyDef(root->
fileDef());
7577 mmd->setMemberSpecifiers(root->
spec);
7578 mmd->setVhdlSpecifiers(root->
vhdlSpec);
7579 mmd->setEnumBaseType(root->
args);
7582 mmd->addSectionsToDefinition(root->
anchors);
7583 mmd->setMemberGroupId(root->
mGrpId);
7587 mmd->setRefItems(root->
sli);
7601 mmd->setDefinition(name+baseType);
7605 mmd->setDefinition(nd->
name()+
"::"+name+baseType);
7609 mmd->setNamespace(nd);
7616 if (isGlobal && (nd==
nullptr || !nd->
isAnonymous()))
7618 if (!defSet) mmd->setDefinition(name+baseType);
7619 if (fd==
nullptr && root->
parent())
7625 mmd->setFileDef(fd);
7633 mmd->setDefinition(name+baseType);
7637 mmd->setDefinition(cd->
name()+
"::"+name+baseType);
7643 mmd->setDocsForDefinition(!root->
proto);
7673 bool isGlobal =
false;
7674 bool isRelated =
false;
7684 if (root->
lang==SrcLangExt::CSharp)
7699 if (root->
lang==SrcLangExt::CSharp)
7745 struct EnumValueInfo
7747 EnumValueInfo(
const QCString &n,std::unique_ptr<MemberDef> &&md) :
7748 name(n), member(std::move(md)) {}
7750 std::unique_ptr<MemberDef> member;
7752 std::vector< EnumValueInfo > extraMembers;
7754 for (
const auto &imd : *mn)
7761 for (
const auto &e : root->
children())
7764 bool isJavaLike = sle==SrcLangExt::CSharp || sle==SrcLangExt::Java || sle==SrcLangExt::XML;
7765 if ( isJavaLike || root->
spec.isStrong())
7767 if (sle == SrcLangExt::Cpp && e->section.isDefine())
continue;
7774 i = qualifiedName.
findRev(
"::");
7775 if (i!=-1 && sle==SrcLangExt::CSharp)
7781 qualifiedName=
substitute(qualifiedName,
"::",
".");
7786 if (fileName.
isEmpty() && e->tagInfo())
7788 fileName = e->tagInfo()->tagName;
7792 fileName,e->startLine,e->startColumn,
7793 e->type,e->name,e->args,
QCString(),
7794 e->protection, Specifier::Normal,e->isStatic,Relationship::Member,
7801 fmmd->setNamespace(mnd);
7805 fmmd->setTagInfo(e->tagInfo());
7806 fmmd->setLanguage(e->lang);
7807 fmmd->setBodySegment(e->startLine,e->bodyLine,e->endBodyLine);
7808 fmmd->setBodyDef(e->fileDef());
7810 fmmd->setDocumentation(e->doc,e->docFile,e->docLine);
7811 fmmd->setBriefDescription(e->brief,e->briefFile,e->briefLine);
7812 fmmd->addSectionsToDefinition(e->anchors);
7813 fmmd->setInitializer(e->initializer.str());
7814 fmmd->setMaxInitLines(e->initLines);
7815 fmmd->setMemberGroupId(e->mGrpId);
7816 fmmd->setExplicitExternal(e->explicitExternal,fileName,e->startLine,e->startColumn);
7817 fmmd->setRefItems(e->sli);
7820 fmmd->setEnumScope(md,
TRUE);
7821 extraMembers.emplace_back(e->name,std::move(fmd));
7830 if (!e->name.isEmpty() && (fmn=emnsd->
find(e->name)))
7833 for (
const auto &ifmd : *fmn)
7864 else if (isRelated && cd)
7896 for (
auto &e : extraMembers)
7941 if (gd==
nullptr && !root->
groups.empty())
7955 for (
const auto &g : root->
groups)
7974 "Found non-existing group '{}' for the command '{}', ignoring command",
7988 if (root->
section.isEnumDoc() &&
8014 AUTO_TRACE(
"Found docs for enum with name '{}' and scope '{}' in context '{}' cd='{}', nd='{}' fd='{}'",
8028 for (
const auto &imd : *mn)
8043 else if (cd==
nullptr && mcd==
nullptr && nd!=
nullptr && mnd==nd)
8050 else if (cd==
nullptr && nd==
nullptr && mcd==
nullptr && mnd==
nullptr && fd==mfd)
8075 for (
const auto &mn : mnsd)
8078 for (
const auto &imd : *mn)
8083 int documentedEnumValues=0;
8087 if (fmd->isLinkableInProject()) documentedEnumValues++;
8113 for (
const auto &md : *mn)
8115 index.addClassMemberNameToIndex(md.get());
8116 if (md->getModuleDef())
8118 index.addModuleMemberNameToIndex(md.get());
8126 for (
const auto &md : *mn)
8128 if (md->getNamespaceDef())
8130 index.addNamespaceMemberNameToIndex(md.get());
8134 index.addFileMemberNameToIndex(md.get());
8136 if (md->getModuleDef())
8138 index.addModuleMemberNameToIndex(md.get());
8143 index.sortMemberIndexLists();
8152 if (cd->isLinkableInProject())
8165 if (cd->isLinkableInProject())
8178 if (nd->isLinkableInProject())
8191 for (
const auto &fd : *fn)
8207 std::string s = title.str();
8208 static const reg::Ex re(R
"(\a[\w-]*)");
8211 for (; it!=
end ; ++it)
8213 const auto &match = *it;
8214 std::string matchStr = match.str();
8222 if (gd->isLinkableInProject())
8224 addWordsForTitle(gd.get(),gd->anchor(),gd->groupTitle());
8230 if (pd->isLinkableInProject())
8232 addWordsForTitle(pd.get(),pd->anchor(),pd->title());
8252 if (md->getClassDef())
8256 if (md->getNamespaceDef())
8267 if (md->getGroupDef()) scope = md->getGroupDef();
8268 else if (md->getClassDef()) scope = md->getClassDef();
8269 else if (md->getNamespaceDef()) scope = md->getNamespaceDef();
8270 else if (md->getFileDef()) scope = md->getFileDef();
8276 if (md->isLinkableInProject())
8278 if (!(md->isEnumerate() && md->isAnonymous()))
8283 if (md->isEnumerate())
8285 for (
const auto &fmd : md->enumFieldList())
8298 for (
const auto &md : *mn)
8300 addMemberToIndices(md.get());
8307 for (
const auto &md : *mn)
8309 addMemberToIndices(md.get());
8322 for (
const auto &imd : *mn)
8335 for (
const auto &imd : *mn)
8352 for (
const auto &imd : *mn)
8361 const auto &bmni = bmn.
find(mn->memberName());
8364 for (
const auto &ibmd : *bmni)
8372 lang==SrcLangExt::Python ||
8373 lang==SrcLangExt::Java ||
8374 lang==SrcLangExt::PHP ||
8385 lang==SrcLangExt::Python ||
8392 if (lang==SrcLangExt::Python && md->
name().
startsWith(
"__"))
continue;
8432 if (cd->isLinkable())
8434 for (
const auto &bcd : cd->baseClasses())
8450 for (
const auto &ti : cd->getTemplateInstances())
8469 int i=cd->name().find(
'(');
8476 AUTO_TRACE_ADD(
"merging members of category {} into {}",cd->name(),baseClass->
name());
8491 cd->subClasses().empty() &&
8492 !cd->baseClasses().empty())
8523 msg(
"Generating code for file {}...\n",fd->
docName());
8528 else if (parseSources)
8530 msg(
"Parsing code for file {}...\n",fd->
docName());
8546 for (
const auto &fd : *fn)
8554 for (
const auto &fd : *fn)
8563 clangParser->parse();
8564 processSourceFile(fd.get(),*
g_outputList,clangParser.get());
8566 for (
auto incFile : clangParser->filesInSameTU())
8568 if (filesToProcess.find(incFile)!=filesToProcess.end() &&
8570 processedFiles.
find(incFile)==processedFiles.end())
8577 processSourceFile(ifd,*
g_outputList,clangParser.get());
8578 processedFiles.insert(incFile);
8589 for (
const auto &fd : *fn)
8591 if (processedFiles.find(fd->
absFilePath().
str())==processedFiles.end())
8596 clangParser->parse();
8597 processSourceFile(fd.get(),*
g_outputList,clangParser.get());
8610 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8613 msg(
"Generating code files using {} threads.\n",numThreads);
8614 struct SourceContext
8617 : fd(fd_), generateSourceFile(gen_), ol(ol_) {}
8619 bool generateSourceFile;
8623 std::vector< std::future< std::shared_ptr<SourceContext> > > results;
8626 for (
const auto &fd : *fn)
8629 auto ctx = std::make_shared<SourceContext>(fd.get(),generateSourceFile,*
g_outputList);
8630 auto processFile = [ctx]()
8632 if (ctx->generateSourceFile)
8634 msg(
"Generating code for file {}...\n",ctx->fd->docName());
8638 msg(
"Parsing code for file {}...\n",ctx->fd->docName());
8641 ctx->fd->getAllIncludeFilesRecursively(filesInSameTu);
8642 if (ctx->generateSourceFile)
8644 ctx->fd->writeSourceHeader(ctx->ol);
8645 ctx->fd->writeSourceBody(ctx->ol,
nullptr);
8646 ctx->fd->writeSourceFooter(ctx->ol);
8651 ctx->fd->parseSource(
nullptr);
8655 results.emplace_back(threadPool.
queue(processFile));
8658 for (
auto &f : results)
8667 for (
const auto &fd : *fn)
8687 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8693 : fd(fd_), ol(ol_) {}
8698 std::vector< std::future< std::shared_ptr<DocContext> > > results;
8701 for (
const auto &fd : *fn)
8703 bool doc = fd->isLinkableInProject();
8706 auto ctx = std::make_shared<DocContext>(fd.get(),*
g_outputList);
8707 auto processFile = [ctx]() {
8708 msg(
"Generating docs for file {}...\n",ctx->fd->docName());
8709 ctx->fd->writeDocumentation(ctx->ol);
8712 results.emplace_back(threadPool.
queue(processFile));
8716 for (
auto &f : results)
8725 for (
const auto &fd : *fn)
8727 bool doc = fd->isLinkableInProject();
8730 msg(
"Generating docs for file {}...\n",fd->docName());
8749 const_cast<FileDef*
>(fd)->addSourceRef(cd->getStartDefLine(),cd.get(),
nullptr);
8758 const_cast<FileDef*
>(fd)->addSourceRef(cd->getStartDefLine(),cd.get(),
nullptr);
8767 const_cast<FileDef*
>(fd)->addSourceRef(nd->getStartDefLine(),nd.get(),
nullptr);
8774 for (
const auto &md : *mn)
8783 md->isLinkableInProject() &&
8789 const_cast<FileDef*
>(fd)->addSourceRef(md->getStartDefLine(),md->getOuterScope(),md.get());
8795 for (
const auto &md : *mn)
8805 md->isLinkableInProject() &&
8811 const_cast<FileDef*
>(fd)->addSourceRef(md->getStartDefLine(),md->getOuterScope(),md.get());
8828 for (
const auto &def : it->second)
8831 def.fileName,def.lineNr,def.columnNr,
8832 "#define",def.name,def.args,
QCString(),
8837 if (!def.args.isEmpty())
8841 mmd->setInitializer(def.definition);
8842 mmd->setFileDef(def.fileDef);
8843 mmd->setDefinition(
"#define "+def.name);
8848 const MemberList *defMl = def.fileDef->getMemberList(MemberListType::DocDefineMembers());
8857 def.fileDef->insertMember(md.get());
8859 AUTO_TRACE_ADD(
"adding macro {} with definition {}",def.name,def.definition);
8893 for (
const auto &fd : *fn)
8895 fd->sortMemberLists();
8902 gd->sortMemberLists();
8919 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
8923 std::vector < std::future< void > > results;
8927 for (
const auto &def : symList)
8930 if (dm && !
isSymbolHidden(def) && !def->isArtificial() && def->isLinkableInProject())
8932 auto processTooltip = [dm]() {
8935 results.emplace_back(threadPool.
queue(processTooltip));
8940 for (
auto &f : results)
8949 for (
const auto &def : symList)
8952 if (dm && !
isSymbolHidden(def) && !def->isArtificial() && def->isLinkableInProject())
8999 for (
const auto &fd : *fn)
9021 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
9027 : cd(cd_), ol(ol_) {}
9032 std::vector< std::future< std::shared_ptr<DocContext> > > results;
9033 for (
const auto &cd : classList)
9036 if (cd->getOuterScope()==
nullptr ||
9040 auto ctx = std::make_shared<DocContext>(cd,*
g_outputList);
9041 auto processFile = [ctx]()
9043 msg(
"Generating docs for compound {}...\n",ctx->cd->displayName());
9047 if (!ctx->cd->isHidden() && !ctx->cd->isEmbeddedInOuterScope() &&
9048 ctx->cd->isLinkableInProject() && !ctx->cd->isImplicitTemplateInstance())
9050 ctx->cd->writeDocumentation(ctx->ol);
9051 ctx->cd->writeMemberList(ctx->ol);
9055 ctx->cd->writeDocumentationForInnerClasses(ctx->ol);
9058 results.emplace_back(threadPool.
queue(processFile));
9061 for (
auto &f : results)
9068 for (
const auto &cd : classList)
9072 if (cd->getOuterScope()==
nullptr ||
9078 if ( !cd->isHidden() && !cd->isEmbeddedInOuterScope() &&
9079 cd->isLinkableInProject() && !cd->isImplicitTemplateInstance())
9081 msg(
"Generating docs for compound {}...\n",cd->displayName());
9096 for (
const auto &innerCdi : cd->
getClasses())
9101 AUTO_TRACE(
"innerCd={} isLinkable={} isImplicitTemplateInstance={} protectLevelVisible={} embeddedInOuterScope={}",
9110 list.push_back(innerCd);
9118 std::vector<ClassDefMutable*> classList;
9167 for (
const auto &imd : *mn)
9203 for (
const auto &fd : *fn)
9205 fd->combineUsingRelations();
9237 for (
const auto &fd : *fn)
9239 fd->addMembersToMemberGroup();
9254 gd->addMembersToMemberGroup();
9275 for (
const auto &fd : *fn)
9277 fd->distributeMemberGroupDocumentation();
9292 gd->distributeMemberGroupDocumentation();
9322 for (
const auto &fd : *fn)
9324 fd->findSectionsInDocumentation();
9339 gd->findSectionsInDocumentation();
9344 pd->findSectionsInDocumentation();
9349 dd->findSectionsInDocumentation();
9370 elementsToRemove.push_back(ci.first);
9373 for (
const auto &k : elementsToRemove)
9384 for (
const auto &ifmd : *fn)
9398 for (
const auto &imd : *nm)
9430 elementsToRemove.push_back(ci.first);
9433 for (
const auto &k : elementsToRemove)
9442 for (
const auto &ifmd : *fn)
9455 for (
const auto &imd : *nm)
9475 return fd->absFilePath() == root->
fileName;
9522 mmd->setTagInfo(root->
tagInfo());
9523 mmd->setLanguage(root->
lang);
9535 for (
const auto &md : *mn)
9541 for (
const auto &imd : *mn)
9559 for (
const auto &imd : *mn)
9586 warn(root->
fileName,root->
startLine,
"found documented #define {} but ignoring it because ENABLE_PREPROCESSING is NO.", root->
name);
9600 normalizedName =
substitute(normalizedName,
"\\",
"/");
9603 if (root->
docFile==normalizedName)
9605 int lastSlashPos=normalizedName.
findRev(
'/');
9606 if (lastSlashPos!=-1)
9608 normalizedName=normalizedName.
left(lastSlashPos);
9611 if (normalizedName.
at(normalizedName.
length()-1)!=
'/')
9613 normalizedName+=
'/';
9615 DirDef *matchingDir=
nullptr;
9619 if (dir->name().right(normalizedName.
length())==normalizedName)
9624 "\\dir command matches multiple directories.\n"
9625 " Applying the command for directory {}\n"
9626 " Ignoring the command for directory {}",
9627 matchingDir->
name(),dir->name()
9632 matchingDir=dir.get();
9648 warn(root->
fileName,root->
startLine,
"No matching directory found for command \\dir {}",normalizedName);
9660 if (root->
section.isPageDoc())
9667 else if (root->
section.isMainpageDoc())
9687 if (root->
section.isMainpageDoc())
9720 else if (si->
lineNr() != -1)
9722 warn(root->
fileName,root->
startLine,
"multiple use of section label '{}' for main page, (first occurrence: {}, line {})",
9727 warn(root->
fileName,root->
startLine,
"multiple use of section label '{}' for main page, (first occurrence: {})",
9744 else if (root->
tagInfo()==
nullptr)
9747 "found more than one \\mainpage comment block! (first occurrence: {}, line {}), Skipping current block!",
9757 if (root->
section.isMainpageDoc())
9781 term(
"page defined {} with label {} is a direct "
9782 "subpage of itself! Please remove this cyclic dependency.\n",
9806 term(
"page defined {} with label {} is a subpage "
9807 "of itself! Please remove this cyclic dependency.\n",
9808 warn_line(pd->docFile(),pd->docLine()),pd->name());
9834 if (si->label().left(label.
length())==label)
9836 si->setFileName(rl->listName());
9837 si->setGenerated(
TRUE);
9843 if (!si->generated())
9847 if (!si->fileName().isEmpty() &&
9854 if (si->definition())
9861 gd = (
toMemberDef(si->definition()))->getGroupDef();
9891 if (!pd->getGroupDef() && !pd->isReference())
9893 msg(
"Generating docs for page {}...\n",pd->name());
9908 warn(root->
fileName,root->
startLine,
"Example {} was already documented. Ignoring documentation found here.",root->
name);
9936 indentStr.
fill(
' ',indent);
9938 indentStr.
isEmpty()?
"":indentStr,
9943 for (
const auto &e : root->
children())
9961 si->label(),si->fileName(),si->title(),si->type().level(),si->ref());
9975 msg(
"Generating docs for example {}...\n",pd->name());
9977 if (lang != SrcLangExt::Unknown)
9981 intf->resetCodeParserState();
9983 QCString n=pd->getOutputFileBase();
9990 if (pd->showLineNo())
9992 lineNoOptStr=
"{lineno}";
9998 (pd->briefDescription().isEmpty()?
"":pd->briefDescription()+
"\n\n")+
9999 pd->documentation()+
"\n\n\\include"+lineNoOptStr+
" "+pd->name(),
10001 .setIndexWords(
true)
10002 .setExample(pd->name()));
10015 if (!gd->isReference())
10027 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10033 : cdm(cdm_), ol(ol_) {}
10038 std::vector< std::future< std::shared_ptr<DocContext> > > results;
10040 for (
const auto &cd : classList)
10045 auto ctx = std::make_shared<DocContext>(cdm,*
g_outputList);
10046 auto processFile = [ctx]()
10048 if ( ( ctx->cdm->isLinkableInProject() &&
10049 !ctx->cdm->isImplicitTemplateInstance()
10052 && !ctx->cdm->isHidden() && !ctx->cdm->isEmbeddedInOuterScope()
10055 msg(
"Generating docs for compound {}...\n",ctx->cdm->displayName());
10056 ctx->cdm->writeDocumentation(ctx->ol);
10057 ctx->cdm->writeMemberList(ctx->ol);
10059 ctx->cdm->writeDocumentationForInnerClasses(ctx->ol);
10062 results.emplace_back(threadPool.
queue(processFile));
10066 for (
auto &f : results)
10068 auto ctx = f.get();
10074 for (
const auto &cd : classList)
10079 if ( ( cd->isLinkableInProject() &&
10080 !cd->isImplicitTemplateInstance()
10083 && !cd->isHidden() && !cd->isEmbeddedInOuterScope()
10086 msg(
"Generating docs for compound {}...\n",cd->displayName());
10100 for (
const auto &cd : conceptList)
10105 msg(
"Generating docs for concept {}...\n",cd->name());
10120 if (nd->isLinkableInProject())
10125 msg(
"Generating docs for namespace {}\n",nd->displayName());
10163 QCString cmd=qhgLocation+
" -v 2>&1";
10168 err(
"could not execute {}\n",qhgLocation);
10172 const size_t bufSize = 1024;
10173 char inBuf[bufSize+1];
10174 size_t numRead=fread(inBuf,1,bufSize,f);
10175 inBuf[numRead] =
'\0';
10180 static const reg::Ex versionReg(R
"(Qt (\d+)\.(\d+)\.(\d+))");
10182 std::string s = inBuf;
10189 if (qtVersion>0 && (qtVersion<60000 || qtVersion >= 60205))
10198 err(
"could not execute {}\n",qhgLocation);
10202 std::string output;
10203 while ((numRead=fread(inBuf,1,bufSize,f))>0)
10205 inBuf[numRead] =
'\0';
10237 warn_uncond(
"the dot tool could not be found as '{}'\n",dotPath);
10243 size_t l=dotPath.
length();
10244 for (
size_t i=0;i<l;i++)
if (dotPath.
at(i)==
'/') dotPath.
at(i)=
'\\';
10263 bool updateOnly=
FALSE)
10267 bool writeToStdout=configFile==
"-";
10272 if (!writeToStdout)
10276 msg(
"\n\nConfiguration file '{}' created.\n\n",configFile);
10277 msg(
"Now edit the configuration file and enter\n\n");
10278 if (configFile!=
"Doxyfile" && configFile!=
"doxyfile")
10279 msg(
" doxygen {}\n\n",configFile);
10281 msg(
" doxygen\n\n");
10282 msg(
"to generate the documentation for your project\n\n");
10286 msg(
"\n\nConfiguration file '{}' updated.\n\n",configFile);
10292 term(
"Cannot open file {} for writing\n",configFile);
10307 term(
"Cannot open stdout for writing\n");
10318 int eqPos = tagLine.
find(
'=');
10328 fileName = tagLine;
10334 err(
"Tag file '{}' does not exist or is not a file. Skipping it...\n",fileName);
10345 msg(
"Reading tag file '{}', location '{}'...\n",fileName,destName);
10349 msg(
"Reading tag file '{}'...\n",fileName);
10359 for (
const auto &sheet : latexExtraStyleSheet)
10361 std::string fileName = sheet;
10362 if (!fileName.empty())
10367 err(
"Style sheet '{}' specified by LATEX_EXTRA_STYLESHEET does not exist!\n",fileName);
10369 else if (fi.
isDir())
10371 err(
"Style sheet '{}' specified by LATEX_EXTRA_STYLESHEET is a directory, it has to be a file!\n", fileName);
10390 if (!htmlStyleSheet.
isEmpty())
10397 err(
"Style sheet '{}' specified by HTML_STYLESHEET does not exist!\n",htmlStyleSheet);
10400 else if (fi.
isDir())
10402 err(
"Style sheet '{}' specified by HTML_STYLESHEET is a directory, it has to be a file!\n",htmlStyleSheet);
10408 copyFile(htmlStyleSheet,destFileName);
10413 for (
const auto &sheet : htmlExtraStyleSheet)
10421 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET does not exist!\n",fileName);
10425 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET is already a built-in stylesheet. Please use a different name\n",fi.
fileName());
10427 else if (fi.
isDir())
10429 err(
"Style sheet '{}' specified by HTML_EXTRA_STYLESHEET is a directory, it has to be a file!\n",fileName);
10448 err(
"Project logo '{}' specified by PROJECT_LOGO does not exist!\n",projectLogo);
10451 else if (fi.
isDir())
10453 err(
"Project logo '{}' specified by PROJECT_LOGO is a directory, it has to be a file!\n",projectLogo);
10459 copyFile(projectLogo,destFileName);
10473 err(
"Project icon '{}' specified by PROJECT_ICON does not exist!\n",projectIcon);
10476 else if (fi.
isDir())
10478 err(
"Project icon '{}' specified by PROJECT_ICON is a directory, it has to be a file!\n",projectIcon);
10484 copyFile(projectIcon,destFileName);
10492 for (
const auto &fileName : files)
10494 if (!fileName.empty())
10499 err(
"Extra file '{}' specified in {} does not exist!\n", fileName,filesOption);
10501 else if (fi.
isDir())
10503 err(
"Extra file '{}' specified in {} is a directory, it has to be a file!\n", fileName,filesOption);
10529 std::vector<FileEntry> fileEntries;
10530 for (
const auto &fd : *fn)
10532 if (!fd->isReference())
10534 fileEntries.emplace_back(fd->getPath(),fd.get());
10538 size_t size = fileEntries.size();
10542 FileDef *fd = fileEntries[0].fileDef;
10548 std::stable_sort(fileEntries.begin(),
10550 [](
const FileEntry &fe1,
const FileEntry &fe2)
10551 { return qstricmp_sort(fe1.path,fe2.path)<0; }
10556 const FileEntry &first = fileEntries[0];
10557 const FileEntry &last = fileEntries[size-1];
10558 int first_path_size =
static_cast<int>(first.path.size())-1;
10559 int last_path_size =
static_cast<int>(last.path.size())-1;
10562 for (i=0;i<first_path_size && i<last_path_size;i++)
10564 if (first.path[i]==
'/') j=i;
10565 if (first.path[i]!=last.path[i])
break;
10567 if (i==first_path_size && i<last_path_size && last.path[i]==
'/')
10572 else if (i==last_path_size && i<first_path_size && first.path[i]==
'/')
10579 for (
auto &fileEntry : fileEntries)
10581 QCString prefix = fileEntry.path.right(fileEntry.path.length()-j-1);
10582 fileEntry.fileDef->setName(
prefix+fn->fileName());
10584 fileEntry.fileDef->setDiskName(
prefix+fn->fileName());
10598 int sep = fileName.
findRev(
'/');
10599 int ei = fileName.
findRev(
'.');
10600 if (ei!=-1 && (sep==-1 || ei>sep))
10606 extension =
".no_extension";
10619 int ei = fileName.
findRev(
'.');
10626 extension =
".no_extension";
10630 std::string preBuf;
10637 for (
const auto &s : includePath)
10643 msg(
"Preprocessing {}...\n",fn);
10650 msg(
"Reading {}...\n",fn);
10655 std::string convBuf;
10656 convBuf.reserve(preBuf.size()+1024);
10661 std::shared_ptr<Entry> fileRoot = std::make_shared<Entry>();
10665 if (newTU) clangParser->
parse();
10668 parser.
parseInput(fileName,convBuf.
data(),fileRoot,clangParser);
10669 fileRoot->setFileDef(fd);
10686 filesToProcess.insert(s);
10689 std::mutex processedFilesLock;
10691 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10692 msg(
"Processing input using {} threads.\n",numThreads);
10694 using FutureType = std::vector< std::shared_ptr<Entry> >;
10695 std::vector< std::future< FutureType > > results;
10698 bool ambig =
false;
10705 auto processFile = [qs,&filesToProcess,&processedFilesLock,&processedFiles]() {
10706 bool ambig_l =
false;
10707 std::vector< std::shared_ptr<Entry> > roots;
10711 auto fileRoot {
parseFile(*parser.get(),fd_l,qs,clangParser.get(),
true) };
10712 roots.push_back(fileRoot);
10716 for (
auto incFile : clangParser->filesInSameTU())
10719 if (filesToProcess.find(incFile)!=filesToProcess.end())
10721 bool needsToBeProcessed =
false;
10723 std::lock_guard<std::mutex> lock(processedFilesLock);
10724 needsToBeProcessed = processedFiles.find(incFile)==processedFiles.end();
10725 if (needsToBeProcessed) processedFiles.insert(incFile);
10727 if (qincFile!=qs && needsToBeProcessed)
10733 fileRoot =
parseFile(*parser.get(),ifd,qincFile,clangParser.get(),
false);
10734 roots.push_back(fileRoot);
10742 results.emplace_back(threadPool.
queue(processFile));
10746 for (
auto &f : results)
10751 root->moveToSubEntryAndKeep(e);
10758 if (processedFiles.find(s)==processedFiles.end())
10761 auto processFile = [s]() {
10762 bool ambig =
false;
10764 std::vector< std::shared_ptr<Entry> > roots;
10771 auto fileRoot =
parseFile(*parser.get(),fd,qs,clangParser.get(),
true);
10772 roots.push_back(fileRoot);
10776 auto fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
10777 roots.push_back(fileRoot);
10781 results.emplace_back(threadPool.
queue(processFile));
10785 for (
auto &f : results)
10790 root->moveToSubEntryAndKeep(e);
10797 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
10798 msg(
"Processing input using {} threads.\n",numThreads);
10800 using FutureType = std::shared_ptr<Entry>;
10801 std::vector< std::future< FutureType > > results;
10805 auto processFile = [s]() {
10806 bool ambig =
false;
10810 auto fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
10814 results.emplace_back(threadPool.
queue(processFile));
10817 for (
auto &f : results)
10819 root->moveToSubEntryAndKeep(f.get());
10837 filesToProcess.insert(s);
10843 bool ambig =
false;
10851 auto fileRoot =
parseFile(*parser.get(),fd,qs,clangParser.get(),
true);
10852 root->moveToSubEntryAndKeep(fileRoot);
10853 processedFiles.insert(s);
10857 for (
auto incFile : clangParser->filesInSameTU())
10860 if (filesToProcess.find(incFile)!=filesToProcess.end() &&
10861 processedFiles.find(incFile)==processedFiles.end())
10867 fileRoot =
parseFile(*parser.get(),ifd,incFile,clangParser.get(),
false);
10868 root->moveToSubEntryAndKeep(fileRoot);
10869 processedFiles.insert(incFile);
10878 if (processedFiles.find(s)==processedFiles.end())
10880 bool ambig =
false;
10887 auto fileRoot =
parseFile(*parser.get(),fd,qs,clangParser.get(),
true);
10888 root->moveToSubEntryAndKeep(fileRoot);
10893 std::shared_ptr<Entry> fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
10894 root->moveToSubEntryAndKeep(fileRoot);
10896 processedFiles.insert(s);
10905 bool ambig =
false;
10910 std::shared_ptr<Entry> fileRoot =
parseFile(*parser.get(),fd,qs,
nullptr,
true);
10911 root->moveToSubEntryAndKeep(std::move(fileRoot));
10931 sepPos = result.
find(
'/',2);
10933 sepPos = result.
find(
'/',sepPos+1);
10935 sepPos = result.
find(
'/',sepPos+1);
10938 if (nonSymlinks.find(
prefix.str())==nonSymlinks.end())
10955 target+=result.
mid(sepPos);
10958 if (known.find(result.
str())!=known.end())
return std::string();
10959 known.insert(result.
str());
10972 nonSymlinks.insert(
prefix.str());
10978 while (sepPos!=-1);
10997 bool errorIfNotExist,
11004 if (paths && !dirName.empty())
11006 paths->insert(dirName);
11012 if (dirName.empty())
11027 msg(
"Searching for files in directory {}\n", fi->
absFilePath());
11032 for (
const auto &dirEntry : dir.
iterator())
11035 auto checkPatterns = [&]() ->
bool
11037 return (patList==
nullptr ||
patternMatch(cfi,*patList)) &&
11038 (exclPatList==
nullptr || !
patternMatch(cfi,*exclPatList)) &&
11039 (killSet==
nullptr || killSet->find(cfi.
absFilePath())==killSet->end());
11042 if (exclSet==
nullptr || exclSet->find(cfi.
absFilePath())==exclSet->end())
11050 if (errorIfNotExist && checkPatterns())
11055 else if (cfi.
isFile() && checkPatterns())
11058 std::string path=cfi.
dirPath()+
"/";
11059 std::string fullName=path+name;
11066 fn = fnMap->
add(name,fullName);
11067 fn->push_back(std::move(fd));
11070 dirResultList.push_back(fullName);
11071 if (resultSet) resultSet->insert(fullName);
11072 if (killSet) killSet->insert(fullName);
11074 else if (recursive &&
11076 (exclPatList==
nullptr || !
patternMatch(cfi,*exclPatList)) &&
11081 patList,exclPatList,&dirResultList,resultSet,errorIfNotExist,
11082 recursive,killSet,paths);
11086 if (resultList && !dirResultList.empty())
11089 std::stable_sort(dirResultList.begin(),
11090 dirResultList.end(),
11091 [](
const auto &f1,
const auto &f2) { return qstricmp_sort(f1.c_str(),f2.c_str())<0; });
11094 resultList->insert(resultList->end(), dirResultList.begin(), dirResultList.end());
11111 bool errorIfNotExist,
11125 if (exclSet==
nullptr || exclSet->find(fi.
absFilePath())==exclSet->end())
11132 if (errorIfNotExist)
11134 warn_uncond(
"source '{}' is not a readable file or directory... skipping.\n",s);
11139 std::string dirPath = fi.
dirPath(
true);
11141 if (paths && !dirPath.empty())
11143 paths->insert(dirPath);
11146 if (killSet==
nullptr || killSet->find(filePath)==killSet->end())
11155 fn->push_back(std::move(fd));
11158 if (resultList || resultSet)
11160 if (resultList) resultList->push_back(filePath);
11161 if (resultSet) resultSet->insert(filePath);
11167 else if (fi.
isDir())
11169 readDir(&fi,fnMap,exclSet,patList,
11170 exclPatList,resultList,resultSet,errorIfNotExist,
11171 recursive,killSet,paths);
11185 anchor=
":"+md->
anchor();
11194 t <<
"REPLACE INTO symbols (symbol_id,scope_id,name,file,line) VALUES('"
11195 << fn+anchor <<
"','"
11197 << d->
name() <<
"','"
11211 for (
const auto &def : symList)
11223 msg(
"Developer parameters:\n");
11224 msg(
" -m dump symbol map\n");
11225 msg(
" -b making messages output unbuffered\n");
11226 msg(
" -c <file> process input file as a comment block and produce HTML output\n");
11228 msg(
" -t [<file|stdout|stderr>] trace debug info to file, stdout, or stderr (default file stdout)\n");
11229 msg(
" -t_time [<file|stdout|stderr>] trace debug info to file, stdout, or stderr (default file stdout),\n"
11230 " and include time and thread information\n");
11232 msg(
" -d <level> enable a debug level, such as (multiple invocations of -d are possible):\n");
11243 QCString versionString = getFullVersion();
11244 msg(
"{}\n",versionString);
11248 if (!extVers.
isEmpty()) extVers+=
", ";
11249 extVers +=
"sqlite3 ";
11250 extVers += sqlite3_libversion();
11252 if (!extVers.
isEmpty()) extVers+=
", ";
11253 extVers +=
"clang support ";
11254 extVers += CLANG_VERSION_STRING;
11258 int lastComma = extVers.
findRev(
',');
11259 if (lastComma != -1) extVers = extVers.
replace(lastComma,1,
" and");
11260 msg(
" with {}.\n",extVers);
11271 msg(
"Doxygen version {0}\nCopyright Dimitri van Heesch 1997-2025\n\n"
11272 "You can use Doxygen in a number of ways:\n\n"
11273 "1) Use Doxygen to generate a template configuration file*:\n"
11274 " {1} [-s] -g [configName]\n\n"
11275 "2) Use Doxygen to update an old configuration file*:\n"
11276 " {1} [-s] -u [configName]\n\n"
11277 "3) Use Doxygen to generate documentation using an existing "
11278 "configuration file*:\n"
11279 " {1} [configName]\n\n"
11280 "4) Use Doxygen to generate a template file controlling the layout of the\n"
11281 " generated documentation:\n"
11282 " {1} -l [layoutFileName]\n\n"
11283 " In case layoutFileName is omitted DoxygenLayout.xml will be used as filename.\n"
11284 " If - is used for layoutFileName Doxygen will write to standard output.\n\n"
11285 "5) Use Doxygen to generate a template style sheet file for RTF, HTML or Latex.\n"
11286 " RTF: {1} -w rtf styleSheetFile\n"
11287 " HTML: {1}-w html headerFile footerFile styleSheetFile [configFile]\n"
11288 " LaTeX: {1} -w latex headerFile footerFile styleSheetFile [configFile]\n\n"
11289 "6) Use Doxygen to generate a rtf extensions file\n"
11290 " {1} -e rtf extensionsFile\n\n"
11291 " If - is used for extensionsFile Doxygen will write to standard output.\n\n"
11292 "7) Use Doxygen to compare the used configuration file with the template configuration file\n"
11293 " {1} -x [configFile]\n\n"
11294 " Use Doxygen to compare the used configuration file with the template configuration file\n"
11295 " without replacing the environment variables or CMake type replacement variables\n"
11296 " {1} -x_noenv [configFile]\n\n"
11297 "8) Use Doxygen to show a list of built-in emojis.\n"
11298 " {1} -f emoji outputFileName\n\n"
11299 " If - is used for outputFileName Doxygen will write to standard output.\n\n"
11300 "*) If -s is specified the comments of the configuration items in the config file will be omitted.\n"
11301 " If configName is omitted 'Doxyfile' will be used as a default.\n"
11302 " If - is used for configFile Doxygen will write / read the configuration to /from standard output / input.\n\n"
11303 "If -q is used for a Doxygen documentation run, Doxygen will see this as if QUIET=YES has been set.\n\n"
11304 "-v print version string, -V print extended version information\n"
11305 "-h,-? prints usage help information\n"
11306 "{1} -d prints additional usage flags for debugging purposes\n",versionString,name);
11313static const char *
getArg(
int argc,
char **argv,
int &optInd)
11316 if (
qstrlen(&argv[optInd][2])>0)
11317 s=&argv[optInd][2];
11318 else if (optInd+1<argc && argv[optInd+1][0]!=
'-')
11337 return []() {
return std::make_unique<T>(); };
11345 std::setlocale(LC_ALL,
"");
11346 std::setlocale(LC_CTYPE,
"C");
11347 std::setlocale(LC_NUMERIC,
"C");
11446 while (v!=0) v>>=1,r++;
11450 return std::max(0,std::min(r-16,9));
11455 QCString versionString = getFullVersion();
11458 auto writeFile = [](
const char *fileName,std::function<void(
TextStream&)> func) ->
bool
11478 bool genConfig=
false;
11479 bool shortList=
false;
11480 bool traceTiming=
false;
11482 bool updateConfig=
false;
11483 bool quiet =
false;
11484 while (optInd<argc && argv[optInd][0]==
'-' &&
11485 (isalpha(argv[optInd][1]) || argv[optInd][1]==
'?' ||
11486 argv[optInd][1]==
'-')
11489 switch(argv[optInd][1])
11499 if (optInd+1>=argc)
11501 layoutName=
"DoxygenLayout.xml";
11505 layoutName=argv[optInd+1];
11513 if (optInd+1>=argc)
11515 msg(
"option \"-c\" is missing the file name to read\n");
11540 msg(
"option \"-d\" has unknown debug specifier: \"{}\".\n",debugLabel);
11550 if (!strcmp(argv[optInd]+1,
"t_time"))
11552 traceTiming =
true;
11554 else if (!strcmp(argv[optInd]+1,
"t"))
11556 traceTiming =
false;
11560 err(
"option should be \"-t\" or \"-t_time\", found: \"{}\".\n",argv[optInd]);
11564 if (optInd+1>=argc || argv[optInd+1][0] ==
'-')
11566 traceName=
"stdout";
11570 traceName=argv[optInd+1];
11574 err(
"support for option \"-t\" has not been compiled in (use a debug build or a release build with tracing enabled).\n");
11585 err(
"option should be \"-x\" or \"-x_noenv\", found: \"{}\".\n",argv[optInd]);
11601 err(
"option \"-e\" is missing format specifier rtf.\n");
11607 if (optInd+1>=argc)
11609 err(
"option \"-e rtf\" is missing an extensions file name\n");
11617 err(
"option \"-e\" has invalid format specifier.\n");
11627 err(
"option \"-f\" is missing list specifier.\n");
11633 if (optInd+1>=argc)
11635 err(
"option \"-f emoji\" is missing an output file name\n");
11643 err(
"option \"-f\" has invalid list specifier.\n");
11653 err(
"option \"-w\" is missing format specifier rtf, html or latex\n");
11659 if (optInd+1>=argc)
11661 err(
"option \"-w rtf\" is missing a style sheet file name\n");
11667 err(
"error opening RTF style sheet file {}!\n",argv[optInd+1]);
11677 if (optInd+4<argc ||
FileInfo(
"Doxyfile").exists() ||
FileInfo(
"doxyfile").exists())
11683 err(
"error opening or reading configuration file {}!\n",argv[optInd+4]);
11688 if (optInd+3>=argc)
11690 err(
"option \"-w html\" does not have enough arguments\n");
11707 if (optInd+4<argc ||
FileInfo(
"Doxyfile").exists() ||
FileInfo(
"doxyfile").exists())
11712 err(
"error opening or reading configuration file {}!\n",argv[optInd+4]);
11717 if (optInd+3>=argc)
11719 err(
"option \"-w latex\" does not have enough arguments\n");
11735 err(
"Illegal format specifier \"{}\": should be one of rtf, html or latex\n",formatName);
11755 if (
qstrcmp(&argv[optInd][2],
"help")==0)
11757 usage(argv[0],versionString);
11760 else if (
qstrcmp(&argv[optInd][2],
"version")==0)
11766 else if ((
qstrcmp(&argv[optInd][2],
"Version")==0) ||
11767 (
qstrcmp(&argv[optInd][2],
"VERSION")==0))
11775 err(
"Unknown option \"-{}\"\n",&argv[optInd][1]);
11776 usage(argv[0],versionString);
11781 setvbuf(stdout,
nullptr,_IONBF,0);
11788 usage(argv[0],versionString);
11792 err(
"Unknown option \"-{:c}\"\n",argv[optInd][1]);
11793 usage(argv[0],versionString);
11804 TRACE(
"Doxygen version used: {}",getFullVersion());
11807 FileInfo configFileInfo1(
"Doxyfile"),configFileInfo2(
"doxyfile");
11810 if (configFileInfo1.exists())
11812 configName=
"Doxyfile";
11814 else if (configFileInfo2.
exists())
11816 configName=
"doxyfile";
11818 else if (genConfig)
11820 configName=
"Doxyfile";
11824 err(
"Doxyfile not found and no input file specified!\n");
11825 usage(argv[0],versionString);
11832 if (fi.
exists() ||
qstrcmp(argv[optInd],
"-")==0 || genConfig)
11834 configName=argv[optInd];
11838 err(
"configuration file {} not found!\n",argv[optInd]);
11839 usage(argv[0],versionString);
11853 err(
"could not open or read configuration file {}!\n",configName);
11924 for (
const auto &mapping : extMaps)
11927 int i=mapStr.
find(
'=');
11943 err(
"Failed to map file extension '{}' to unsupported language '{}'.\n"
11944 "Check the EXTENSION_MAPPING setting in the config file.\n",
11949 msg(
"Adding custom extension mapping: '{}' will be treated as language '{}'\n",
11958 if (cd==
reinterpret_cast<void *
>(-1))
11960 term(
"unsupported character conversion: '{}'->'UTF-8': {}\n"
11961 "Check the 'INPUT_ENCODING' setting in the config file!\n",
11971 for (
const auto &mapping : fileEncod)
11974 int i=mapStr.
find(
'=');
11988 if (cd==
reinterpret_cast<void *
>(-1))
11990 term(
"unsupported character conversion: '{}'->'UTF-8': {}\n"
11991 "Check the 'INPUT_FILE_ENCODING' setting in the config file!\n",
11992 encoding,strerror(errno));
12005 for (
const auto &s : expandAsDefinedList)
12023 signal(SIGINT,SIG_DFL);
12025 msg(
"Cleaning up...\n");
12040 if (generateTagFile.
isEmpty())
return;
12045 err(
"cannot open tag file {} for writing\n", generateTagFile);
12049 tagFile <<
"<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>\n";
12050 tagFile <<
"<tagfile doxygen_version=\"" << getDoxygenVersion() <<
"\"";
12051 std::string gitVersion = getGitVersion();
12052 if (!gitVersion.empty())
12054 tagFile <<
" doxygen_gitid=\"" << gitVersion <<
"\"";
12061 for (
const auto &fd : *fn)
12063 if (fd->isLinkableInProject()) fd->writeTagFile(tagFile);
12096 if (gd->isLinkableInProject()) gd->writeTagFile(tagFile);
12101 if (mod->isLinkableInProject()) mod->writeTagFile(tagFile);
12106 if (pd->isLinkableInProject()) pd->writeTagFile(tagFile);
12111 if (dd->isLinkableInProject()) dd->writeTagFile(tagFile);
12115 tagFile <<
"</tagfile>\n";
12123 msg(
"Exiting...\n");
12133 const char *defaultDirName)
12138 result = baseDirName + defaultDirName;
12140 else if (formatDirName[0]!=
'/' && (formatDirName.
length()==1 || formatDirName[1]!=
':'))
12142 result.
prepend(baseDirName+
"/");
12144 Dir formatDir(result.
str());
12147 term(
"Could not create output directory {}\n", result);
12161 g_s.begin(
"Searching for include files...\n");
12164 for (
const auto &s : includePathList)
12182 g_s.begin(
"Searching for example files...\n");
12185 for (
const auto &s : examplePathList)
12200 g_s.begin(
"Searching for images...\n");
12203 for (
const auto &s : imagePathList)
12218 g_s.begin(
"Searching for dot files...\n");
12221 for (
const auto &s : dotFileList)
12236 g_s.begin(
"Searching for msc files...\n");
12239 for (
const auto &s : mscFileList)
12254 g_s.begin(
"Searching for dia files...\n");
12257 for (
const auto &s : diaFileList)
12272 g_s.begin(
"Searching for plantuml files...\n");
12275 for (
const auto &s : plantUmlFileList)
12290 g_s.begin(
"Searching for files to exclude\n");
12292 for (
const auto &s : excludeList)
12310 g_s.begin(
"Searching INPUT for files to process...\n");
12314 for (
const auto &s : inputList)
12317 size_t l = path.
length();
12321 if (path.
at(l-1)==
'\\' || path.
at(l-1)==
'/') path=path.
left(l-1);
12341 [](
const auto &f1,
const auto &f2)
12347 if (fileName->size()>1)
12349 std::stable_sort(fileName->begin(),fileName->end(),[](
const auto &f1,
const auto &f2)
12351 return qstricmp_sort(f1->absFilePath(),f2->absFilePath())<0;
12357 warn_uncond(
"No files to be processed, please check your settings, in particular INPUT, FILE_PATTERNS, and RECURSIVE\n");
12368 if (mdfileAsMainPage.
isEmpty())
return;
12372 warn_uncond(
"Specified markdown mainpage '{}' does not exist\n",mdfileAsMainPage);
12375 bool ambig =
false;
12378 warn_uncond(
"Specified markdown mainpage '{}' has not been defined as input file\n",mdfileAsMainPage);
12397 QCString versionString = getFullVersion();
12398 msg(
"Doxygen version used: {}\n",versionString);
12408 if (outputDirectory.
isEmpty())
12414 Dir dir(outputDirectory.
str());
12418 if (!dir.
mkdir(outputDirectory.
str()))
12420 term(
"tag OUTPUT_DIRECTORY: Output directory '{}' does not "
12421 "exist and cannot be created\n",outputDirectory);
12425 msg(
"Notice: Output directory '{}' does not exist. "
12426 "I have created it for you.\n", outputDirectory);
12441 if (cacheSize<0) cacheSize=0;
12442 if (cacheSize>9) cacheSize=9;
12443 uint32_t lookupSize = 65536 << cacheSize;
12482 bool generateSitemap = !sitemapUrl.
isEmpty();
12483 if (generateSitemap && !sitemapUrl.
endsWith(
"/"))
12490 bool generateEclipseHelp =
Config_getBool(GENERATE_ECLIPSEHELP);
12504 if (generateDocbook)
12551 newFontPath+=curFontPath;
12567 bool defaultLayoutUsed =
FALSE;
12568 if (layoutFileName.
isEmpty())
12571 defaultLayoutUsed =
TRUE;
12573 AUTO_TRACE_ADD(
"defaultLayoutUsed={}, layoutFileName={}",defaultLayoutUsed,layoutFileName);
12578 msg(
"Parsing layout file {}...\n",layoutFileName);
12581 else if (!defaultLayoutUsed)
12583 warn_uncond(
"failed to open layout file '{}' for reading! Using default settings.\n",layoutFileName);
12593 if (generateHtml) exclPatterns.push_back(htmlOutput.
str());
12594 if (generateDocbook) exclPatterns.push_back(docbookOutput.
str());
12595 if (generateXml) exclPatterns.push_back(xmlOutput.
str());
12596 if (generateLatex) exclPatterns.push_back(latexOutput.
str());
12597 if (generateRtf) exclPatterns.push_back(rtfOutput.
str());
12598 if (generateMan) exclPatterns.push_back(manOutput.
str());
12618 if (generateDocbook)
12629 std::shared_ptr<Entry> root = std::make_shared<Entry>();
12633 msg(
"Reading and parsing tag files\n");
12635 for (
const auto &s : tagFileList)
12647 g_s.begin(
"Parsing files\n");
12687 g_s.begin(
"Building macro definition list...\n");
12691 g_s.begin(
"Building group list...\n");
12696 g_s.begin(
"Building directory list...\n");
12701 g_s.begin(
"Building namespace list...\n");
12706 g_s.begin(
"Building file list...\n");
12710 g_s.begin(
"Building class list...\n");
12714 g_s.begin(
"Building concept list...\n");
12722 g_s.begin(
"Computing nesting relations for classes...\n");
12735 g_s.begin(
"Associating documentation with classes...\n");
12739 g_s.begin(
"Associating documentation with concepts...\n");
12744 g_s.begin(
"Associating documentation with modules...\n");
12748 g_s.begin(
"Building example list...\n");
12752 g_s.begin(
"Searching for enumerations...\n");
12760 g_s.begin(
"Searching for documented typedefs...\n");
12766 g_s.begin(
"Searching for documented sequences...\n");
12770 g_s.begin(
"Searching for documented dictionaries...\n");
12775 g_s.begin(
"Searching for members imported via using declarations...\n");
12782 g_s.begin(
"Searching for included using directives...\n");
12786 g_s.begin(
"Searching for documented variables...\n");
12790 g_s.begin(
"Building interface member list...\n");
12793 g_s.begin(
"Building member list...\n");
12797 g_s.begin(
"Searching for friends...\n");
12801 g_s.begin(
"Searching for documented defines...\n");
12805 g_s.begin(
"Computing class inheritance relations...\n");
12810 g_s.begin(
"Computing class usage relations...\n");
12816 g_s.begin(
"Searching for tag less structs...\n");
12821 g_s.begin(
"Flushing cached template relations that have become invalid...\n");
12825 g_s.begin(
"Warn for undocumented namespaces...\n");
12829 g_s.begin(
"Computing class relations...\n");
12840 g_s.begin(
"Add enum values to enums...\n");
12845 g_s.begin(
"Searching for member function documentation...\n");
12857 g_s.begin(
"Creating members for template instances...\n");
12861 g_s.begin(
"Building page list...\n");
12865 g_s.begin(
"Search for main page...\n");
12870 g_s.begin(
"Computing page relations...\n");
12875 g_s.begin(
"Determining the scope of groups...\n");
12879 g_s.begin(
"Computing module relations...\n");
12881 mm.resolvePartitions();
12882 mm.resolveImports();
12883 mm.collectExportedSymbols();
12902 return i==0 ?
qstricmp_sort(c1->name(), c2->name())<0 : i<0;
12916 g_s.begin(
"Sorting lists...\n");
12937 g_s.begin(
"Determining which enums are documented\n");
12941 g_s.begin(
"Computing member relations...\n");
12946 g_s.begin(
"Building full member lists recursively...\n");
12950 g_s.begin(
"Adding members to member groups.\n");
12956 g_s.begin(
"Distributing member group documentation.\n");
12961 g_s.begin(
"Computing member references...\n");
12967 g_s.begin(
"Inheriting documentation...\n");
12975 g_s.begin(
"Generating disk names...\n");
12979 g_s.begin(
"Adding source references...\n");
12983 g_s.begin(
"Adding xrefitems...\n");
12988 g_s.begin(
"Sorting member lists...\n");
12992 g_s.begin(
"Setting anonymous enum type...\n");
12996 g_s.begin(
"Computing dependencies between directories...\n");
13000 g_s.begin(
"Generating citations page...\n");
13004 g_s.begin(
"Counting members...\n");
13008 g_s.begin(
"Counting data structures...\n");
13012 g_s.begin(
"Resolving user defined references...\n");
13016 g_s.begin(
"Finding anchors and sections in the documentation...\n");
13020 g_s.begin(
"Transferring function references...\n");
13024 g_s.begin(
"Combining using relations...\n");
13029 g_s.begin(
"Adding members to index pages...\n");
13034 g_s.begin(
"Correcting members for VHDL...\n");
13038 g_s.begin(
"Computing tooltip texts...\n");
13046 [](
const auto &g1,
const auto &g2)
13047 {
return g1->groupTitle() < g2->groupTitle(); });
13051 gd->sortSubGroups();
13095 if (generateDocbook)
13115 err(
"USE_HTAGS is YES but htags(1) failed. \n");
13117 err(
"htags(1) ended normally but failed to load the filemap. \n");
13124 g_s.begin(
"Generating style sheet...\n");
13132 g_s.begin(
"Generating search indices...\n");
13133 if (searchEngine && !serverBasedSearch && generateHtml)
13141 if (generateHtml && searchEngine)
13144 Dir searchDir(searchDirName.
str());
13145 if (!searchDir.
exists() && !searchDir.
mkdir(searchDirName.
str()))
13147 term(
"Could not create search results directory '{}' $PWD='{}'\n",
13151 if (!serverBasedSearch)
13173 if (generateDocbook)
13189 g_s.begin(
"Generating images for formulas in HTML...\n");
13196 g_s.begin(
"Generating images for formulas in RTF...\n");
13203 g_s.begin(
"Generating images for formulas in Docbook...\n");
13208 g_s.begin(
"Generating example documentation...\n");
13212 g_s.begin(
"Generating file sources...\n");
13216 g_s.begin(
"Generating file documentation...\n");
13220 g_s.begin(
"Generating page documentation...\n");
13224 g_s.begin(
"Generating group documentation...\n");
13228 g_s.begin(
"Generating class documentation...\n");
13232 g_s.begin(
"Generating concept documentation...\n");
13236 g_s.begin(
"Generating module documentation...\n");
13240 g_s.begin(
"Generating namespace documentation...\n");
13246 g_s.begin(
"Generating graph info page...\n");
13251 g_s.begin(
"Generating directory documentation...\n");
13260 g_s.begin(
"finalizing index lists...\n");
13264 g_s.begin(
"writing tag file...\n");
13270 g_s.begin(
"Generating XML output...\n");
13278 g_s.begin(
"Generating SQLITE3 output...\n");
13285 g_s.begin(
"Generating AutoGen DEF output...\n");
13291 g_s.begin(
"Generating Perl module output...\n");
13295 if (generateHtml && searchEngine && serverBasedSearch)
13297 g_s.begin(
"Generating search index\n");
13307 if (searchDataFile.
isEmpty())
13309 searchDataFile=
"searchdata.xml";
13322 g_s.begin(
"Combining RTF output...\n");
13325 err(
"An error occurred during post-processing the RTF files!\n");
13330 g_s.begin(
"Running plantuml with JAVA...\n");
13336 g_s.begin(
"Running dot...\n");
13341 if (generateHtml &&
13345 g_s.begin(
"Running html help compiler...\n");
13350 if ( generateHtml &&
13354 g_s.begin(
"Running qhelpgenerator...\n");
13361 msg(
"type lookup cache used {}/{} hits={} misses={}\n",
13366 msg(
"symbol lookup cache used {}/{} hits={} misses={}\n",
13373 int cacheParam = std::max(typeCacheParam,symbolCacheParam);
13376 msg(
"Note: based on cache misses the ideal setting for LOOKUP_CACHE_SIZE is {} at the cost of higher memory usage.\n",cacheParam);
13382 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
13383 if (numThreads<1) numThreads=1;
13384 msg(
"Total elapsed time: {:.6f} seconds\n(of which an average of {:.6f} seconds per thread waiting for external tools to finish)\n",
13391 msg(
"finished...\n");
13396 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.
constexpr bool isCompoundDoc() const noexcept
constexpr bool isFile() const noexcept
constexpr bool isDoc() const noexcept
ENTRY_TYPES constexpr bool isCompound() const noexcept
std::string to_string() const
constexpr bool isScope() const noexcept
A class that generates a dynamic tree view side panel.
A model of a file symbol.
virtual void addUsingDeclaration(const Definition *d)=0
virtual void removeMember(MemberDef *md)=0
virtual void insertClass(ClassDef *cd)=0
virtual void insertConcept(ConceptDef *cd)=0
virtual void overrideIncludeGraph(bool e)=0
virtual void writeSourceHeader(OutputList &ol)=0
virtual bool generateSourceFile() const =0
virtual const LinkedRefMap< NamespaceDef > & getUsedNamespaces() const =0
virtual QCString absFilePath() const =0
virtual bool isSource() const =0
virtual void parseSource(ClangTUParser *clangParser)=0
virtual void getAllIncludeFilesRecursively(StringVector &incFiles) const =0
virtual void setDiskName(const QCString &name)=0
virtual void writeSourceFooter(OutputList &ol)=0
virtual void writeSourceBody(OutputList &ol, ClangTUParser *clangParser)=0
virtual void addUsingDirective(NamespaceDef *nd)=0
virtual void overrideIncludedByGraph(bool e)=0
virtual const QCString & docName() const =0
virtual void insertMember(MemberDef *md)=0
virtual void insertNamespace(NamespaceDef *nd)=0
Minimal replacement for QFileInfo.
std::string readLink() const
std::string fileName() const
std::string dirPath(bool absPath=true) const
std::string absFilePath() const
Class representing all files with a certain base name.
Ordered dictionary of FileName objects.
A model of a group of symbols.
virtual QCString groupTitle() const =0
virtual void overrideGroupGraph(bool e)=0
virtual bool addClass(ClassDef *def)=0
virtual bool containsFile(const FileDef *def) const =0
virtual bool addNamespace(NamespaceDef *def)=0
virtual void setGroupScope(Definition *d)=0
virtual void addFile(FileDef *def)=0
virtual MemberList * getMemberList(MemberListType lt) const =0
virtual void setGroupTitle(const QCString &newtitle)=0
virtual bool hasGroupTitle() const =0
Generator for HTML output.
static void writeSearchPage()
static void writeFooterFile(TextStream &t)
static void writeTabData()
Additional initialization after indices have been created.
static void writeSearchData(const QCString &dir)
static void writeExternalSearchPage()
static void writeStyleSheetFile(TextStream &t)
static void writeHeaderFile(TextStream &t, const QCString &cssname)
A class that generated the HTML Help specific files.
static const QCString hhpFileName
static Index & instance()
void countDataStructures()
A list of index interfaces.
Generator for LaTeX output.
static void writeFooterFile(TextStream &t)
static void writeStyleSheetFile(TextStream &t)
static void writeHeaderFile(TextStream &t)
static LayoutDocManager & instance()
Returns a reference to this singleton.
void parse(const QCString &fileName, const char *data=nullptr)
Parses a user provided layout.
std::unique_ptr< RefList > Ptr
T * add(const char *k, Args &&... args)
const T * find(const std::string &key) const
Container class representing a vector of objects with keys.
const T * find(const std::string &key) const
Generator for Man page output.
A model of a class/file/namespace member symbol.
virtual QCString typeString() const =0
virtual QCString requiresClause() const =0
virtual bool isFriend() const =0
virtual bool isForeign() const =0
virtual QCString definition() const =0
virtual bool isRelated() const =0
virtual const ClassDef * getCachedTypedefVal() const =0
virtual QCString excpString() const =0
virtual const ClassDef * getClassDef() const =0
virtual const ArgumentList & templateArguments() const =0
virtual GroupDef * getGroupDef()=0
virtual bool isCSharpProperty() const =0
virtual bool isTypedef() const =0
virtual const MemberVector & enumFieldList() const =0
virtual void moveTo(Definition *)=0
virtual const FileDef * getFileDef() const =0
virtual const ArgumentList & argumentList() const =0
virtual bool isStrongEnumValue() const =0
virtual VhdlSpecifier getVhdlSpecifiers() const =0
virtual bool isFunction() const =0
virtual bool isExternal() const =0
virtual int getMemberGroupId() const =0
virtual bool isStatic() const =0
virtual const MemberDef * reimplements() const =0
virtual StringVector getQualifiers() const =0
virtual QCString bitfieldString() const =0
virtual bool isTypedefValCached() const =0
virtual bool isDocsForDefinition() const =0
virtual bool isDefine() const =0
virtual const NamespaceDef * getNamespaceDef() const =0
virtual bool isObjCProperty() const =0
virtual Protection protection() const =0
virtual TypeSpecifier getMemberSpecifiers() const =0
virtual bool isEnumerate() const =0
virtual MemberType memberType() const =0
virtual ClassDef * relatedAlso() const =0
virtual bool isVariable() const =0
virtual bool isStrong() const =0
virtual QCString argsString() const =0
virtual Specifier virtualness(int count=0) const =0
virtual int redefineCount() const =0
virtual int initializerLines() const =0
virtual const MemberDef * getEnumScope() const =0
virtual bool isEnumValue() const =0
virtual bool isPrototype() const =0
virtual const QCString & initializer() const =0
virtual void setMemberClass(ClassDef *cd)=0
virtual void setProtection(Protection p)=0
virtual void setMemberGroupId(int id)=0
virtual void setDocumentedEnumValues(bool value)=0
virtual void 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.
const MemberDef * find(const QCString &name) const
const MemberDef * findRev(const QCString &name) const
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
QCString & prepend(const char *s)
int toInt(bool *ok=nullptr, int base=10) const
size_t length() const
Returns the length of the string, not counting the 0-terminator.
bool startsWith(const char *s) const
QCString mid(size_t index, size_t len=static_cast< size_t >(-1)) const
bool endsWith(const char *s) const
char & at(size_t i)
Returns a reference to the character at index i.
bool isEmpty() const
Returns TRUE iff the string is empty.
QCString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
QCString fill(char c, int len=-1)
Fills a string with a predefined character.
const std::string & str() const
QCString & 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, bool onlyLinkable=false)
Find the symbool definition matching name within the scope set.
const ClassDef * resolveClass(const Definition *scope, const QCString &name, bool maybeUnlinkable=false, bool mayBeHidden=false)
Find the class definition matching name within the scope set.
QCString getTemplateSpec() const
In case a call to resolveClass() points to a template specialization, the template part is return via...
ClassDefMutable * resolveClassMutable(const Definition *scope, const QCString &name, bool mayBeUnlinkable=false, bool mayBeHidden=false)
Wrapper around resolveClass that returns a mutable interface to the class object or a nullptr if the ...
const MemberDef * getTypedef() const
In case a call to resolveClass() resolves to a type member (e.g.
Text streaming class that buffers data.
std::string str() const
Return the contents of the buffer as a std::string object.
Class managing a pool of worker threads.
auto queue(F &&f, Args &&... args) -> std::future< decltype(f(args...))>
Queue the callable function f for the threads to execute.
Wrapper class for a number of boolean properties.
std::string to_string() const
static void correctMemberProperties(MemberDefMutable *md)
static void computeVhdlComponentRelations()
ClassDefMutable * toClassDefMutable(Definition *d)
ClassDef * getClass(const QCString &n)
std::unique_ptr< ClassDef > createClassDefAlias(const Definition *newScope, const ClassDef *cd)
std::unique_ptr< ClassDef > createClassDef(const QCString &fileName, int startLine, int startColumn, const QCString &name, ClassDef::CompoundType ct, const QCString &ref, const QCString &fName, bool isSymbol, bool isJavaEnum)
Factory method to create a new ClassDef object.
ClassDef * toClassDef(Definition *d)
std::unordered_set< const ClassDef * > ClassDefSet
std::map< std::string, int > TemplateNameMap
ClassDefMutable * getClassMutable(const QCString &key)
Class representing a regular expression.
Class to iterate through matches.
Object representing the matching results.
ConceptDefMutable * toConceptDefMutable(Definition *d)
std::unique_ptr< ConceptDef > createConceptDef(const QCString &fileName, int startLine, int startColumn, const QCString &name, const QCString &tagRef, const QCString &tagFile)
ConceptDefMutable * getConceptMutable(const QCString &key)
#define Config_getInt(name)
#define Config_getList(name)
#define Config_updateString(name, value)
#define Config_updateBool(name, value)
#define Config_getBool(name)
#define Config_getString(name)
#define Config_updateList(name,...)
#define Config_getEnum(name)
std::set< std::string > StringSet
std::unordered_set< std::string > StringUnorderedSet
std::map< std::string, std::string > StringMap
std::vector< std::string > StringVector
void parseFuncDecl(const QCString &decl, const SrcLangExt lang, QCString &clName, QCString &type, QCString &name, QCString &args, QCString &funcTempList, QCString &exceptions)
std::unique_ptr< ArgumentList > stringToArgumentList(SrcLangExt lang, const QCString &argsString, QCString *extraTypeChars=nullptr)
std::unordered_map< std::string, DefineList > DefinesPerFileList
Definition * toDefinition(DefinitionMutable *dm)
DefinitionMutable * toDefinitionMutable(Definition *d)
DirIterator begin(DirIterator it) noexcept
DirIterator end(const DirIterator &) noexcept
void computeDirDependencies()
void generateDirDocs(OutputList &ol)
#define AUTO_TRACE_ADD(...)
#define AUTO_TRACE_EXIT(...)
constexpr DocNodeVariant * parent(DocNodeVariant *n)
returns the parent node of a given node n or nullptr if the node has no parent.
static void findInheritedTemplateInstances()
void printNavTree(Entry *root, int indent)
static void addClassToContext(const Entry *root)
static void makeTemplateInstanceRelation(const Entry *root, ClassDefMutable *cd)
static StringUnorderedSet g_pathsVisited(1009)
static int findEndOfTemplate(const QCString &s, size_t startPos)
static void buildGroupList(const Entry *root)
static void insertMemberAlias(Definition *outerScope, const MemberDef *md)
static void findUsingDeclarations(const Entry *root, bool filterPythonPackages)
static void flushCachedTemplateRelations()
static bool isRecursiveBaseClass(const QCString &scope, const QCString &name)
static void copyLatexStyleSheet()
static void generateDocsForClassList(const std::vector< ClassDefMutable * > &classList)
static std::shared_ptr< Entry > parseFile(OutlineParserInterface &parser, FileDef *fd, const QCString &fn, ClangTUParser *clangParser, bool newTU)
static int findFunctionPtr(const std::string &type, SrcLangExt lang, int *pLength=nullptr)
static bool isSpecialization(const ArgumentLists &srcTempArgLists, const ArgumentLists &dstTempArgLists)
static MemberDef * addVariableToClass(const Entry *root, ClassDefMutable *cd, MemberType mtype, const QCString &type, const QCString &name, const QCString &args, bool fromAnnScope, MemberDef *fromAnnMemb, Protection prot, Relationship related)
static void computeTemplateClassRelations()
static std::string resolveSymlink(const std::string &path)
void adjustConfiguration()
adjust globals that depend on configuration settings.
static void findDEV(const MemberNameLinkedMap &mnsd)
static void runQHelpGenerator()
static void addConceptToContext(const Entry *root)
static void addRelatedPage(Entry *root)
static void addIncludeFile(DefMutable *cd, FileDef *ifd, const Entry *root)
static StringVector g_inputFiles
static void 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, bool isSource, const QCString &manName, const QCString &title, HighlightedItem hli, bool additionalIndices, const QCString &altSidebarName, int hierarchyLevel, const QCString &allMembersFile)
void writeIndexHierarchy(OutputList &ol)
Translator * theTranslator
void setTranslator(OUTPUT_LANGUAGE_t langName)
#define LATEX_STYLE_EXTENSION
void writeDefaultLayoutFile(const QCString &fileName)
std::unique_ptr< MemberDef > createMemberDefAlias(const Definition *newScope, const MemberDef *aliasMd)
MemberDefMutable * toMemberDefMutable(Definition *d)
void combineDeclarationAndDefinition(MemberDefMutable *mdec, MemberDefMutable *mdef)
MemberDef * toMemberDef(Definition *d)
std::unique_ptr< MemberDef > createMemberDef(const QCString &defFileName, int defLine, int defColumn, const QCString &type, const QCString &name, const QCString &args, const QCString &excp, Protection prot, Specifier virt, bool stat, Relationship related, MemberType t, const ArgumentList &tal, const ArgumentList &al, const QCString &metaData)
Factory method to create a new instance of a MemberDef.
std::unordered_map< int, std::unique_ptr< MemberGroupInfo > > MemberGroupInfoMap
QCString warn_line(const QCString &file, int line)
#define warn_undoc(file, line, fmt,...)
#define warn_uncond(fmt,...)
#define warn(file, line, fmt,...)
void postProcess(bool clearHeaderAndFooter, CompareMode compareMode=CompareMode::Full)
void checkAndCorrect(bool quiet, const bool check)
void compareDoxyfile(TextStream &t, CompareMode compareMode)
bool parse(const QCString &fileName, bool update=FALSE, CompareMode compareMode=CompareMode::Full)
void writeTemplate(TextStream &t, bool shortList, bool updateOnly=FALSE)
void correctPath(const StringVector &list)
Correct a possible wrong PATH variable.
bool isAbsolutePath(const QCString &fileName)
FILE * popen(const QCString &name, const QCString &type)
std::ofstream openOutputStream(const QCString &name, bool append=false)
double getSysElapsedTime()
QCString pathListSeparator()
int system(const QCString &command, const QCString &args, bool commandHasConsole=true)
void setenv(const QCString &variable, const QCString &value)
const char * commandExtension()
QCString getenv(const QCString &variable)
QCString trunc(const QCString &s, size_t numChars=15)
void replaceNamespaceAliases(QCString &name)
std::unique_ptr< NamespaceDef > createNamespaceDefAlias(const Definition *newScope, const NamespaceDef *nd)
Factory method to create an alias of an existing namespace.
std::unique_ptr< NamespaceDef > createNamespaceDef(const QCString &defFileName, int defLine, int defColumn, const QCString &name, const QCString &ref, const QCString &refFile, const QCString &type, bool isPublished)
Factory method to create new NamespaceDef instance.
NamespaceDef * getResolvedNamespace(const QCString &name)
NamespaceDef * toNamespaceDef(Definition *d)
NamespaceDefMutable * toNamespaceDefMutable(Definition *d)
NamespaceDefMutable * getResolvedNamespaceMutable(const QCString &key)
std::unordered_set< const NamespaceDef * > NamespaceDefSet
bool search(std::string_view str, Match &match, const Ex &re, size_t pos)
Search in a given string str starting at position pos for a match against regular expression re.
std::unique_ptr< PageDef > createPageDef(const QCString &f, int l, const QCString &n, const QCString &d, const QCString &t)
void setPerlModDoxyfile(const QCString &qs)
Portable versions of functions that are platform dependent.
int portable_iconv_close(void *cd)
void * portable_iconv_open(const char *tocode, const char *fromcode)
int qstricmp(const char *s1, const char *s2)
QCString substitute(const QCString &s, const QCString &src, const QCString &dst)
substitute all occurrences of src in s by dst
int qstricmp_sort(const char *str1, const char *str2)
const char * qPrint(const char *s)
uint32_t qstrlen(const char *str)
Returns the length of string str, or 0 if a null pointer is passed.
int qstrcmp(const char *str1, const char *str2)
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
static constexpr const char * getGroupPriName(GroupPri_t priority) noexcept
@ GROUPING_INGROUP
membership in group was defined by @ingroup
GroupPri_t pri
priority of this definition
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)
bool matchArguments2(const Definition *srcScope, const FileDef *srcFileScope, const QCString &srcReturnType, const ArgumentList *srcAl, const Definition *dstScope, const FileDef *dstFileScope, const QCString &dstReturnType, const ArgumentList *dstAl, bool checkCV, SrcLangExt lang)
QCString removeRedundantWhiteSpace(const QCString &s)
QCString mergeScopes(const QCString &leftScope, const QCString &rightScope)
QCString normalizeNonTemplateArgumentsInString(const QCString &name, const Definition *context, const ArgumentList &formalArgs)
SrcLangExt getLanguageFromFileName(const QCString &fileName, SrcLangExt defLang)
bool protectionLevelVisible(Protection prot)
bool matchTemplateArguments(const ArgumentList &srcAl, const ArgumentList &dstAl)
void addCodeOnlyMappings()
QCString substituteTemplateArgumentsInString(const QCString &nm, const ArgumentList &formalArgs, const ArgumentList *actualArgs)
int extractClassNameFromType(const QCString &type, int &pos, QCString &name, QCString &templSpec, SrcLangExt lang)
bool leftScopeMatch(const QCString &scope, const QCString &name)
QCString stripAnonymousNamespaceScope(const QCString &s)
QCString stripFromIncludePath(const QCString &path)
bool checkIfTypedef(const Definition *scope, const FileDef *fileScope, const QCString &n)
bool readInputFile(const QCString &fileName, std::string &contents, bool filter, bool isSourceCode)
read a file name fileName and optionally filter and transcode it
bool patternMatch(const FileInfo &fi, const StringVector &patList)
bool openOutputFile(const QCString &outFile, std::ofstream &f)
QCString tempArgListToString(const ArgumentList &al, SrcLangExt lang, bool includeDefault)
void addRefItem(const RefItemVector &sli, const QCString &key, const QCString &prefix, const QCString &name, const QCString &title, const QCString &args, const Definition *scope)
QCString showFileDefMatches(const FileNameLinkedMap *fnMap, const QCString &n)
QCString fileToString(const QCString &name, bool filter, bool isSourceCode)
QCString filterTitle(const QCString &title)
QCString removeAnonymousScopes(const QCString &str)
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.