19#include <unordered_map>
60 mutable std::once_flag
flag;
87 std::optional<BodyInfo>
body;
135 if (n!=
"<globalScope>")
157 lang = SrcLangExt::Unknown;
162 p->setDefFileName(df);
163 p->defLine = defLine;
164 p->defColumn = defCol;
172 if (exclSyms.empty())
return false;
173 const std::string &symName =
name.
str();
174 for (
const auto &pat : exclSyms)
177 bool forceStart=
false;
179 if (pattern.
at(0)==
'^')
181 pattern = pattern.
mid(1);
184 if (pattern.
at(pattern.
length() - 1) ==
'$')
195 size_t ui = match.position();
196 size_t pl = match.length();
197 size_t sl = symName.length();
198 if ((ui==0 || pattern.
at(0)==
'*' || (!
isId(symName.at(ui-1)) && !forceStart)) &&
199 (ui+pl==sl || pattern.
at(pattern.
length()-1)==
'*' || (!
isId(symName.at(ui+pl)) && !forceEnd))
207 else if (!pattern.
empty())
209 size_t i = symName.find(pattern.
str());
210 if (i!=std::string::npos)
213 size_t pl=pattern.
length();
214 size_t sl=symName.length();
216 if ((ui==0 || (!
isId(symName.at(ui-1)) && !forceStart)) &&
217 (ui+pl==sl || (!
isId(symName.at(ui+pl)) && !forceEnd))
251 const DString &df,
int dl,
size_t dc,
253 const char *d,
bool isSymbol)
261 p->isSymbol = isSymbol;
281 p = std::make_unique<Private>(*other.
p);
298 p->isAnonymous =
p->name.empty() ||
299 p->name.at(0)==
'@' ||
305 if (
id.empty())
return;
333 if (
p->sectionRefs.find(gsi->
label())==
nullptr)
335 p->sectionRefs.add(gsi);
344 if (
p->sectionRefs.empty())
return false;
357 if (!
p->sectionRefs.empty())
368 tagFile <<
" <docanchor file=\"" << fn <<
"\"";
373 tagFile <<
">" << si->
label() <<
"</docanchor>\n";
402 if (d.
empty())
return;
415 if (!
p->details.has_value())
417 p->details = std::make_optional<DocInfo>();
447 if (d.
empty())
return;
457 if (brief.
empty())
return;
458 size_t bl = brief.
length();
463 int c = brief.
at(bl-1);
466 case '.':
case '!':
case '?':
case ':':
break;
476 if (
p->brief && !
p->brief->doc.empty())
484 if (!
p->brief.has_value())
486 p->brief = std::make_optional<BriefInfo>();
510 if (b.
empty())
return;
518 if (!
p->inbodyDocs.has_value())
520 p->inbodyDocs = std::make_optional<DocInfo>();
522 DocInfo &inbodyDocs =
p->inbodyDocs.value();
525 inbodyDocs.
doc = doc;
538 if (d.
empty())
return;
566 bool usePipe = !filter.
empty() && filterSourceFiles;
572 size_t startLine,
size_t endLine,std::string &str)
574 std::unique_lock<std::mutex> lock(
m_mutex);
579 auto item = it->second;
587 auto [ startLineOffset, fragmentSize] =
getFragmentLocation(it_off->second,startLine,endLine);
591 item.filePos+startLineOffset, fragmentSize);
598 DString cmd=filter+
" \""+fileName+
"\"";
604 err(
"Error opening filter pipe command '{}'\n",cmd);
621 const int blockSize = 4096;
623 size_t bytesRead = fread(buf,1,blockSize,f);
624 size_t bytesWritten = fwrite(buf,1,bytesRead,bf);
625 if (bytesRead!=bytesWritten)
628 err(
"Failed to write to filter database {}. Wrote {} out of {} bytes\n",
635 str+=std::string_view(buf,bytesWritten);
639 m_cache.emplace(fileName.str(),item);
657 std::unique_lock<std::mutex> lock(
m_mutex);
685 const char *p=str.data();
689 while ((c=*p)!=
'\n' && c!=0) p++;
691 it->second.push_back(p-str.data());
698 size_t startLine,
size_t endLine) -> std::tuple<size_t,size_t>
700 assert(startLine > 0);
701 assert(startLine <= endLine);
702 const size_t startLineOffset = lineOffsets[std::min(startLine-1,lineOffsets.size()-1)];
703 const size_t endLineOffset = lineOffsets[std::min(endLine, lineOffsets.size()-1)];
704 assert(startLineOffset <= endLineOffset);
705 const size_t fragmentSize = endLineOffset-startLineOffset;
706 return std::tie(startLineOffset,fragmentSize);
718 auto [ startLineOffset, fragmentSize] =
getFragmentLocation(lineOffsets,startLine,endLine);
721 str.erase(0,startLineOffset);
722 str.resize(fragmentSize);
731 if (size==0) { startOffset=0; size =
static_cast<size_t>(ifs.tellg()); }
732 ifs.seekg(startOffset, std::ios::beg);
734 ifs.read(str.data(), size);
738 std::unordered_map<std::string,FilterCacheItem>
m_cache;
765 int &startLine,
int &endLine,
DString &result)
769 bool usePipe = !filter.
empty() && filterSourceFiles;
772 const int blockSize = 4096;
775 static_cast<size_t>(std::max(1,startLine)),
776 static_cast<size_t>(std::max({1,startLine,endLine})),str);
779 bool found = lang==SrcLangExt::VHDL ||
780 lang==SrcLangExt::Python ||
781 lang==SrcLangExt::Fortran ||
789 int lineNr=startLine;
795 while ((c=*p++)!=
'{' && c!=
':' && c!=
'=' && c!=0)
805 col+=tabSize - (col%tabSize);
807 else if (pc==
'/' && c==
'/')
809 while ((c=*p++)!=
'\n' && c!=0);
816 else if (pc==
'/' && c==
'*')
818 while (((c=*p++)!=
'/' || pc!=
'*') && c!=0)
837 if (cn!=
':') found=
true;
862 if (endLine!=startLine)
865 spaces.
fill(
' ',col);
871 if (c==
':' || c==
'=')
874 if (cn==
'\n') lineNr++;
876 char lineStr[blockSize];
885 while ((c=*p) && i<blockSize-1)
894 }
while (size_read == (blockSize-1));
899 size_t newLineIndex = result.
rfind(
'\n');
900 size_t braceIndex = result.
rfind(
'}');
903 result.
resize(braceIndex+1);
914 if (encoding!=
"UTF-8")
916 std::string encBuf = result.
str();
924 err(
"failed to transcode characters in code fragment in file {} lines {} to {}, from input encoding {} to UTF-8\n",
925 fileName,startLine,endLine,encoding);
929 if (!result.
empty() && result.
at(result.
length()-1)!=
'\n') result +=
"\n";
940 p->body &&
p->body->startLine!=-1 &&
p->body->fileDef)
942 fn =
p->body->fileDef->getSourceFileBase();
949 const int maxAnchorStrLen = 20;
950 char anchorStr[maxAnchorStrLen];
952 if (
p->body &&
p->body->startLine!=-1)
956 snprintf(anchorStr,maxAnchorStrLen,
"L%d",
p->body->defLine);
960 snprintf(anchorStr,maxAnchorStrLen,
"l%05d",
p->body->defLine);
974 size_t lineMarkerPos = refText.
find(
"@0");
975 size_t fileMarkerPos = refText.
find(
"@1");
979 lineStr.
sprintf(
"%d",
p->body->defLine);
982 if (lineMarkerPos<fileMarkerPos)
988 ol.
parseText(refText.
mid(lineMarkerPos+2,fileMarkerPos-lineMarkerPos-2));
1001 ol.
parseText(refText.
mid(fileMarkerPos+2,lineMarkerPos-fileMarkerPos-2));
1011 err(
"translation error: invalid markers in trDefinedAtLineInSourceFile()\n");
1018 if (!
p->body.has_value())
1020 p->body = std::make_optional<BodyInfo>();
1030 if (!
p->body.has_value())
1032 p->body = std::make_optional<BodyInfo>();
1034 p->body.value().fileDef=fd;
1039 return p->body &&
p->body->startLine!=-1 &&
1040 p->body->endLine>=
p->body->startLine &&
1059 bool isMacro = thisMd && thisMd->
memberType()==MemberType::Define;
1060 int actualStart=
p->body->startLine,actualEnd=
p->body->endLine;
1062 actualStart,actualEnd,codeFragment)
1068 intf->resetCodeParserState();
1074 intf->parseCode(codeOL,
1076 detab(codeFragment,indent),
1080 .setFileDef(
p->body->fileDef)
1086 codeOL.endCodeFragment(
"DoxyCode");
1096 std::transform(map.begin(),map.end(),
1097 std::back_inserter(result),
1098 [](
const auto &item)
1099 { return item.second; }
1102 std::stable_sort(result.
begin(),result.
end(),
1103 [](
const auto &m1,
const auto &m2) { return genericCompareMembers(m1,m2)<0; });
1111 const DString &text,
const std::unordered_map<std::string,MemberDef *> &membersMap,
1114 if (!membersMap.empty())
1118 auto replaceFunc = [
this,&members,scopeName,&ol](
size_t entryIndex)
1122 const MemberDef *md=members[entryIndex];
1128 if (!scope.
empty() && scope!=scopeName)
1140 if (sourceBrowser &&
1146 const int maxLineNrStr = 10;
1147 char anchorStr[maxLineNrStr];
1193 size_t num = refs.size();
1201 [&refs,&ol](
size_t entryIndex) { RequirementManager::instance().writeRef(ol,refs[entryIndex]); }
1217 return !
p->sourceRefByDict.empty();
1222 return !
p->sourceRefsDict.empty();
1227 return !
p->requirementRefs.empty();
1235 (
p->details && !
p->details->doc.empty()) ||
1236 (
p->brief && !
p->brief->doc.empty()) ||
1237 (
p->inbodyDocs && !
p->inbodyDocs->doc.empty()) ||
1248 (
p->details && !
p->details->doc.empty()) ||
1249 (
p->brief && !
p->brief->doc.empty()) ||
1250 (
p->inbodyDocs && !
p->inbodyDocs->doc.empty());
1258 p->sourceRefByDict.emplace(sourceRefName.
str(),md);
1266 p->sourceRefsDict.emplace(sourceRefName.
str(),md);
1277 err(
"DefinitionImpl::addInnerCompound() called\n");
1282 std::call_once(
p->qualifiedNameOnce.flag, [
this]()
1285 if (p->outerScope==nullptr || p->outerScope->name()==
"<globalScope>")
1287 p->qualifiedName = (p->localName==
"<globalScope>") ? DString() : p->localName;
1291 p->qualifiedName = p->outerScope->qualifiedName()+
1292 getLanguageSpecificSeparator(getLanguage())+
1297 return p->qualifiedName;
1306 while (outerScope && !found)
1308 found = (outerScope==d);
1313 p->qualifiedName.clear();
1314 p->qualifiedNameOnce.reset();
1318 assert(
p->def!=
p->outerScope);
1323 return p->localName;
1328 p->partOfGroups.push_back(gd);
1333 p->xrefListItems.insert(
p->xrefListItems.end(), sli.cbegin(), sli.cend());
1338 p->requirementRefs.insert(
p->requirementRefs.end(), rqli.cbegin(), rqli.cend());
1346 p->xrefListItems.reserve(
p->xrefListItems.size()+otherXrefList.size());
1347 p->xrefListItems.insert (
p->xrefListItems.end(),
1348 otherXrefList.begin(),otherXrefList.end());
1351 std::stable_sort(
p->xrefListItems.begin(),
p->xrefListItems.end(),
1353 { return left->id() <right->id() ||
1354 (left->id()==right->id() &&
1355 left->list()->listName() < right->list()->listName());
1359 auto last = std::unique(
p->xrefListItems.begin(),
p->xrefListItems.end(),
1361 { return left->id()==right->id() &&
1362 left->list()->listName()==right->list()->listName();
1364 p->xrefListItems.erase(last,
p->xrefListItems.end());
1369 for (
const RefItem *item :
p->xrefListItems)
1381 return p->xrefListItems;
1386 return p->requirementRefs;
1394 result =
p->outerScope->pathFragment();
1396 if (
p->def->isLinkable())
1398 if (!result.
empty()) result+=
"/";
1411 result+=
p->localName;
1416 result+=
p->localName;
1439 result+=(
toFileDef(
p->def))->getDirDef()->navigationPathAsString();
1441 result+=
"<li class=\"navelem\">";
1442 if (
p->def->isLinkableInProject())
1444 DString fn =
p->def->getOutputFileBase();
1450 p->def->getDefFileName(),
p->def->getDefLine());
1451 result+=
"<a href=\"$relpath^"+fn+
"\">"+title+
"</a>";
1457 p->def->getDefFileName(),
p->def->getDefLine());
1458 result+=
"<a href=\"$relpath^"+fn+
"\">"+title+
"</a>";
1467 result+=
"<a href=\"$relpath^"+fn;
1468 if (!
p->def->anchor().empty()) result+=
"#"+
p->def->anchor();
1473 result+=
"<a href=\"$relpath^"+fn+
"\">"+
1492 navPath +=
"<div id=\"nav-path\" class=\"navpath\">\n"
1495 navPath +=
" </ul>\n"
1509 auto generateTocEntries = [
this,&ol]()
1519 if (docTitle.
empty()) docTitle = si->
label();
1526 .setIndexWords(
true)
1527 .setSingleLine(
true)
1540 generateTocEntries();
1549 generateTocEntries();
1568 return p->sectionRefs;
1573 return p->symbolName;
1580 return p->details ?
p->details->doc :
DString(
"");
1585 return p->details ?
p->details->line :
p->brief ?
p->brief->line : 1;
1590 if (
p->details && !
p->details->file.empty())
return p->details->file;
1591 else if (
p->brief && !
p->brief->file.empty())
return p->brief->file;
1592 else return "<" +
p->name +
">";
1622 for (
const auto &p : briefDescAbbrev)
1630 if (!result.
empty())
1633 if (c >=
'a' && c <=
'z') result[0] +=
'A' -
'a';
1646 (abbr ?
abbreviate(
p->brief->doc,
p->def->displayName()) :
p->brief->doc) :
1652 if (
p->brief &&
p->brief->tooltip.empty() && !
p->brief->doc.empty())
1657 p->brief->doc,
p->brief->file,
p->brief->line);
1663 return p->brief ?
p->brief->tooltip :
DString();
1668 return p->brief ?
p->brief->line : 1;
1673 return p->brief && !
p->brief->file.empty() ?
p->brief->file :
DString(
"<"+
p->name+
">");
1680 return p->inbodyDocs ?
p->inbodyDocs->doc :
DString(
"");
1685 return p->inbodyDocs ?
p->inbodyDocs->line : 1;
1690 return p->inbodyDocs && !
p->inbodyDocs->file.empty() ?
p->inbodyDocs->file :
DString(
"<"+
p->name+
">");
1698 return p->defFileName;
1703 return p->defFileExt;
1713 return p->def->isLinkableInProject() && !
p->hidden;
1718 return p->def->isLinkable() && !
p->hidden;
1723 return p->isArtificial;
1728 return p->isExported;
1738 return !
p->ref.empty();
1743 return p->body ?
p->body->defLine : -1;
1748 return p->body ?
p->body->startLine : -1;
1753 return p->body ?
p->body->endLine : -1;
1758 return p->body ?
p->body->fileDef :
nullptr;
1763 return p->partOfGroups;
1770 if (gd->isLinkable())
return true;
1777 return p->outerScope;
1785 if (
p->referencesMembers.empty() && !
p->sourceRefsDict.empty())
1789 return p->referencesMembers;
1795 if (
p->referencedByMembers.empty() && !
p->sourceRefByDict.empty())
1799 return p->referencedByMembers;
1807 for (
const auto &kv : defImpl->
p->sourceRefsDict)
1809 auto it =
p->sourceRefsDict.find(kv.first);
1810 if (it !=
p->sourceRefsDict.end())
1812 p->sourceRefsDict.insert(kv);
1823 for (
const auto &kv : defImpl->
p->sourceRefByDict)
1825 auto it =
p->sourceRefByDict.find(kv.first);
1826 if (it !=
p->sourceRefByDict.end())
1828 p->sourceRefByDict.emplace(kv.first,kv.second);
1847 p->hidden =
p->hidden || b;
1852 p->isArtificial = b;
1878 return p->symbolName;
1896 size_t l = result.
length();
1897 if (!relPath.
empty() && l>0 && result.
at(0)==
'.')
1902 if (l>0 && result.
at(l-1)!=
'/') result+=
'/';
1916 return p->isAnonymous;
1926 return p->defColumn;
bool isGenerated(const std::string &anchor) const
Returns true iff anchor is one of the generated anchors.
static AnchorGenerator & instance()
Returns the singleton instance.
virtual DString className() const =0
Returns the name of the class including outer classes, but not including namespaces.
A String class for use with Doxygen wrapping std::string and adding some additional functionality off...
void resize(size_t newlen)
size_t rfind(char c, size_t pos=npos) const
DString fill(char c, size_t len)
Fills a string with a predefined character.
DString mid(size_t index, size_t len=npos) const
DString simplifyWhiteSpace() const
return a copy of this string with leading and trailing whitespace removed and multiple whitespace cha...
bool empty() const
Returns true iff the string is empty (std::string compatible alias for isEmpty()).
std::string_view view() const
static constexpr size_t npos
value used to indicate 'not found' or 'to the end of the string', matching std::string::npos
char & at(size_t i)
Returns a reference to the character at index i.
DString & prepend(const char *s)
size_t find(char c, size_t pos=0) const
DString & sprintf(const char *format,...)
DString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
DString left(size_t len) const
const std::string & str() const
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
bool endsWith(const char *s) const
size_t length() const
Returns the length of the string, not counting the 0-terminator.
static void print(DebugMask mask, int prio, fmt::format_string< Args... > fmt, Args &&... args)
DefinitionAliasImpl(Definition *def, const Definition *scope, const Definition *alias)
const Definition * m_scope
DString qualifiedName() const
virtual ~DefinitionAliasImpl()
const DString & name() const
The common base class of all entity definitions found in the sources.
virtual SrcLangExt getLanguage() const =0
Returns the programming language this definition was written in.
virtual const RefItemVector & xrefListItems() const =0
virtual bool isLinkable() const =0
virtual const DString & name() const =0
virtual const DString & localName() const =0
virtual DefinitionMutable * toDefinitionMutable_()=0
virtual const FileDef * getBodyDef() const =0
virtual DString navigationPathAsString() const =0
virtual DString qualifiedName() const =0
virtual bool isHidden() const =0
virtual DString anchor() const =0
virtual DString getReference() const =0
virtual void _setSymbolName(const DString &name)=0
virtual Definition * getOuterScope() const =0
virtual DString getSourceFileBase() const =0
virtual int getStartBodyLine() const =0
virtual DString getOutputFileBase() const =0
virtual const DefinitionImpl * toDefinitionImpl_() const =0
friend DefinitionMutable * toDefinitionMutable(Definition *)
Private data associated with a Symbol DefinitionImpl object.
MemberVector referencesMembers
std::optional< BriefInfo > brief
void init(const DString &df, const DString &n)
void setDefFileName(const DString &df)
std::optional< BodyInfo > body
RequirementRefs requirementRefs
ResettableOnce qualifiedNameOnce
std::optional< DocInfo > inbodyDocs
MemberVector referencedByMembers
std::unordered_map< std::string, MemberDef * > sourceRefByDict
std::unordered_map< std::string, MemberDef * > sourceRefsDict
RefItemVector xrefListItems
void addSourceReferencedBy(MemberDef *d, const DString &sourceRefName)
const RequirementRefs & requirementReferences() const
void setBodySegment(int defLine, int bls, int ble)
DString pathFragment() const
void setBriefDescription(const DString &b, const DString &briefFile, int briefLine)
void writeSourceReffedBy(OutputList &ol, const DString &scopeName) const
void mergeRefItems(Definition *d)
bool hasRequirementRefs() const
DString navigationPathAsString() const
void writeInlineCode(OutputList &ol, const DString &scopeName) const
DefinitionImpl(Definition *def, const DString &defFileName, int defLine, size_t defColumn, const DString &name, const char *b=nullptr, const char *d=nullptr, bool isSymbol=true)
DString getSourceAnchor() const
const RefItemVector & xrefListItems() const
const Definition * findInnerCompound(const DString &name) const
void writeSummaryLinks(OutputList &) const
void _writeSourceRefList(OutputList &ol, const DString &scopeName, const DString &text, const std::unordered_map< std::string, MemberDef * > &members, bool) const
DString externalReference(const DString &relPath) const
void addSectionsToDefinition(const std::vector< const SectionInfo * > &anchorList)
bool isLinkableViaGroup() const
void _setInbodyDocumentation(const DString &d, const DString &docFile, int docLine)
DString briefDescriptionAsTooltip() const
SrcLangExt getLanguage() const
DString inbodyFile() const
void addInnerCompound(Definition *d)
void setArtificial(bool b)
bool hasSourceReffedBy() const
void writeNavigationPath(OutputList &ol) const
void setRefItems(const RefItemVector &sli)
int getStartBodyLine() const
void writeSourceRefs(OutputList &ol, const DString &scopeName) const
void setOuterScope(Definition *d)
DString getDefFileName() const
DString _symbolName() const
const MemberVector & getReferencesMembers() const
void setBodyDef(const FileDef *fd)
DString symbolName() const
void setDocumentation(const DString &d, const DString &docFile, int docLine, bool stripWhiteSpace=true)
DString getSourceFileBase() const
void _setBriefDescription(const DString &b, const DString &briefFile, int briefLine)
bool isArtificial() const
void setId(const DString &name)
void setLocalName(const DString &name)
int _getXRefListId(const DString &listName) const
void writeQuickMemberLinks(OutputList &, const MemberDef *) const
const GroupList & partOfGroups() const
bool hasUserDocumentation() const
void setReference(const DString &r)
const DString & localName() const
DString inbodyDocumentation() const
bool hasBriefDescription() const
bool _docsAlreadyAdded(const DString &doc, DString &sigList)
const SectionRefs & getSectionRefs() const
DefinitionImpl & operator=(const DefinitionImpl &d)
bool isVisibleInProject() const
DString getDefFileExtension() const
DString qualifiedName() const
void _setSymbolName(const DString &name)
void makePartOfGroup(GroupDef *gd)
void setDefFile(const DString &df, int defLine, size_t defColumn)
void mergeReferencedBy(const Definition *other)
int getStartDefLine() const
DString documentation() const
void setName(const DString &name)
DString getReference() const
bool hasSourceRefs() const
void writeToc(OutputList &ol, const LocalToc <) const
void addSourceReferences(MemberDef *d, const DString &sourceRefName)
void writePageNavigation(OutputList &ol) const
const FileDef * getBodyDef() const
void writeSourceDef(OutputList &ol) const
void _setDocumentation(const DString &d, const DString &docFile, int docLine, bool stripWhiteSpace, bool atTop)
void setLanguage(SrcLangExt lang)
const DString & name() const
void mergeReferences(const Definition *other)
std::unique_ptr< Private > p
size_t getDefColumn() const
void setRequirementReferences(const RequirementRefs &rqli)
bool hasDocumentation() const
void setInbodyDocumentation(const DString &d, const DString &docFile, int docLine)
DString briefDescription(bool abbreviate=false) const
Definition * getOuterScope() const
DString briefFile() const
const MemberVector & getReferencedByMembers() const
int getEndBodyLine() const
void writeDocAnchorsToTagFile(TextStream &) const
void writeRequirementRefs(OutputList &ol) const
virtual Definition * toDefinition_()=0
friend Definition * toDefinition(DefinitionMutable *)
static DString filterDBFileName
static ParserManager * parserManager
static NamespaceDefMutable * globalScope
static StringMap tagDestinationMap
static SymbolMap< Definition > * symbolMap
static ClangUsrMap * clangUsrMap
A model of a file symbol.
virtual DirDef * getDirDef() const =0
Minimal replacement for QFileInfo.
FileInfo(const std::string &name)
std::string extension(bool complete) const
std::vector< size_t > LineOffsets
void shrinkBuffer(std::string &str, const DString &fileName, size_t startLine, size_t endLine)
auto getFragmentLocation(const LineOffsets &lineOffsets, size_t startLine, size_t endLine) -> std::tuple< size_t, size_t >
std::unordered_map< std::string, LineOffsets > m_lineOffsets
bool getFileContents(const DString &fileName, size_t startLine, size_t endLine, std::string &str)
static FilterCache & instance()
bool getFileContentsPipe(const DString &fileName, const DString &filter, size_t startLine, size_t endLine, std::string &str)
void compileLineOffsets(const DString &fileName, const std::string &str)
void readFragmentFromFile(std::string &str, const DString &fileName, size_t startOffset, size_t size=0)
std::unordered_map< std::string, FilterCacheItem > m_cache
bool getFileContentsDisk(const DString &fileName, size_t startLine, size_t endLine, std::string &str)
A model of a group of symbols.
virtual DString groupTitle() const =0
const T * find(const std::string &key) const
constexpr int docbookLevel() const noexcept
constexpr int latexLevel() const noexcept
constexpr bool isDocbookEnabled() const noexcept
constexpr bool isLatexEnabled() const noexcept
constexpr int htmlLevel() const noexcept
constexpr bool isHtmlEnabled() const noexcept
A model of a class/file/namespace member symbol.
virtual bool isSignal() const =0
virtual bool isObjCMethod() const =0
virtual const DString & initializer() const =0
virtual bool isSlot() const =0
virtual bool isFunction() const =0
virtual bool hasInlineSource() const =0
virtual DString getScopeString() const =0
virtual MemberType memberType() const =0
virtual bool isPrototype() const =0
A vector of MemberDef object.
iterator begin() noexcept
void startCodeFragment(const DString &style)
Class representing a list of output generators that are written to in parallel.
void writeNavigationPath(const DString &s)
void parseText(const DString &textStr)
void startTocEntry(const SectionInfo *si)
void startParagraph(const DString &classDef=DString())
void writeObjectLink(const DString &ref, const DString &file, const DString &anchor, const DString &name)
const OutputCodeList & codeGenerators() const
void docify(const DString &s)
void writeString(const DString &text)
void pushGeneratorState()
void disableAllBut(OutputType o)
void endTocEntry(const SectionInfo *si)
void generateDoc(const DString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const DString &docStr, const DocOptions &options)
void startLocalToc(int level)
virtual bool hasTitle() const =0
virtual DString title() const =0
std::unique_ptr< CodeParserInterface > getCodeParser(const DString &extension)
Gets the interface to the parser associated with a given extension.
This struct represents an item in the list of references.
class that provide information about a section.
void setDefinition(Definition *d)
singleton class that owns the list of all sections
SectionInfo * add(const SectionInfo &si)
static SectionManager & instance()
returns a reference to the singleton
class that represents a list of constant references to sections.
constexpr bool isSection() const
constexpr int level() const
void remove(const DString &name, Ptr def)
Remove a symbol def from the map that was stored under key name.
void add(const DString &name, Ptr def)
Add a symbol def into the map under key name.
Text streaming class that buffers data.
virtual DString trVerifies(bool singular)=0
virtual DString trReferences()=0
virtual DString trReferencedBy()=0
virtual DString trDefinedAtLineInSourceFile()=0
virtual bool needsPunctuation()
add punctuation at the end of a brief description when needed and supported by the language
virtual DString trWriteList(int numEntries)=0
virtual DString trSatisfies(bool singular)=0
ClassDef * toClassDef(Definition *d)
Class representing a regular expression.
Object representing the matching results.
#define Config_getInt(name)
#define Config_getList(name)
#define Config_getBool(name)
std::vector< std::string > StringVector
static std::mutex g_memberReferenceMutex
static void removeFromMap(const DString &name, Definition *d)
static bool matchExcludedSymbols(const DString &name)
static DString abbreviate(const DString &s, const DString &name)
static void addToMap(const DString &name, Definition *d)
bool readCodeFragment(const DString &fileName, bool isMacro, int &startLine, int &endLine, DString &result)
Reads a fragment from file fileName starting with line startLine and ending with line endLine.
static MemberVector refMapToVector(const std::unordered_map< std::string, MemberDef * > &map)
static bool stripWord(DString &s, DString w)
DirIterator end(const DirIterator &) noexcept
DString substitute(const DString &s, const DString &src, const DString &dst)
substitute all occurrences of src in s by dst
bool isId(int c)
Returns true if c is a valid character for an identifier.
FileDef * toFileDef(Definition *d)
GroupDef * toGroupDef(Definition *d)
Translator * theTranslator
DString md5str(const std::string_view &str)
MemberDef * toMemberDef(Definition *d)
FILE * popen(const DString &name, const DString &type)
std::ifstream openInputStream(const DString &name, bool binary=false, bool openAtEnd=false)
FILE * fopen(const DString &fileName, const DString &mode)
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.
PageDef * toPageDef(Definition *d)
Portable versions of functions that are platform dependent.
std::vector< RefItem * > RefItemVector
void splitRequirementRefs(const RequirementRefs &inputReqRefs, RequirementRefs &satisfiesRefs, RequirementRefs &verifiesRefs)
std::vector< RequirementRef > RequirementRefs
List of requirement references.
std::string_view stripWhiteSpace(std::string_view s)
Given a string view s, returns a new, narrower view on that string, skipping over any leading or trai...
Data associated with description found in the body.
int startLine
line number of the start of the definition's body
int endLine
line number of the end of the definition's body
int defLine
line number of the start of the definition
Data associated with a brief description.
Options to configure the code parser.
CodeParserOptions & setStartLine(int lineNr)
CodeParserOptions & setInlineFragment(bool enable)
CodeParserOptions & setEndLine(int lineNr)
CodeParserOptions & setMemberDef(const MemberDef *md)
Data associated with a detailed description.
Helper class to pass options when calling OutputList::generateDoc().
once_flag wrapper that is copyable (copy default-initializes the flag) and resettable.
ResettableOnce & operator=(const ResettableOnce &)
ResettableOnce(const ResettableOnce &)
bool isUTF8CharUpperCase(const std::string &input, size_t pos)
Returns true iff the input string at byte position pos holds an upper case character.
bool lastUTF8CharIsMultibyte(const std::string &input)
Returns true iff the last character in input is a multibyte character.
Various UTF8 related helper functions.
DString parseCommentAsText(const Definition *scope, const MemberDef *md, const DString &doc, const DString &fileName, int lineNr)
DString stripLeadingAndTrailingEmptyLines(const DString &s, int &docLine)
Special version of DString::stripWhiteSpace() that only strips completely blank lines.
DString detab(const DString &s, size_t &refIndent)
int computeQualifiedIndex(const DString &name)
Return the index of the last :: in the string name that is still before the first <.
bool transcodeCharacterStringToUTF8(std::string &input, const char *inputEncoding)
DString stripScope(const DString &name)
DString convertToHtml(const DString &s, bool keepEntities)
DString parseCommentAsHtml(const Definition *scope, const MemberDef *member, const DString &doc, const DString &fileName, int lineNr)
SrcLangExt getLanguageFromFileName(const DString &fileName, SrcLangExt defLang)
DString getFileFilter(const DString &name, bool isSourceCode)
void addHtmlExtensionIfMissing(DString &fName)
DString convertToXML(const DString &s, bool keepEntities, const bool citeEntry)
DString getEncoding(const FileInfo &fi)
DString getLanguageSpecificSeparator(SrcLangExt lang, bool classScope)
void writeMarkerList(OutputList &ol, const std::string &markerText, size_t numMarkers, std::function< void(size_t)> replaceFunc)
A bunch of utility functions.