24#include <unordered_map>
56 mutable std::once_flag
flag;
83 std::optional<BodyInfo>
body;
131 if (n!=
"<globalScope>")
153 lang = SrcLangExt::Unknown;
158 p->setDefFileName(df);
159 p->defLine = defLine;
160 p->defColumn = defCol;
168 if (exclSyms.empty())
return false;
169 const std::string &symName =
name.
str();
170 for (
const auto &pat : exclSyms)
173 bool forceStart=
false;
175 if (pattern.
at(0)==
'^')
177 pattern = pattern.
mid(1);
180 if (pattern.
at(pattern.
length() - 1) ==
'$')
191 size_t ui = match.position();
192 size_t pl = match.length();
193 size_t sl = symName.length();
194 if ((ui==0 || pattern.
at(0)==
'*' || (!
isId(symName.at(ui-1)) && !forceStart)) &&
195 (ui+pl==sl || pattern.
at(pattern.
length()-1)==
'*' || (!
isId(symName.at(ui+pl)) && !forceEnd))
203 else if (!pattern.
empty())
205 size_t i = symName.find(pattern.
str());
206 if (i!=std::string::npos)
209 size_t pl=pattern.
length();
210 size_t sl=symName.length();
212 if ((ui==0 || (!
isId(symName.at(ui-1)) && !forceStart)) &&
213 (ui+pl==sl || (!
isId(symName.at(ui+pl)) && !forceEnd))
247 const DString &df,
int dl,
size_t dc,
249 const char *d,
bool isSymbol)
257 p->isSymbol = isSymbol;
277 p = std::make_unique<Private>(*other.
p);
294 p->isAnonymous =
p->name.empty() ||
295 p->name.at(0)==
'@' ||
301 if (
id.empty())
return;
329 if (
p->sectionRefs.find(gsi->
label())==
nullptr)
331 p->sectionRefs.add(gsi);
340 if (
p->sectionRefs.empty())
return false;
353 if (!
p->sectionRefs.empty())
364 tagFile <<
" <docanchor file=\"" << fn <<
"\"";
369 tagFile <<
">" << si->
label() <<
"</docanchor>\n";
398 if (d.
empty())
return;
411 if (!
p->details.has_value())
413 p->details = std::make_optional<DocInfo>();
443 if (d.
empty())
return;
453 if (brief.
empty())
return;
454 size_t bl = brief.
length();
459 int c = brief.
at(bl-1);
462 case '.':
case '!':
case '?':
case ':':
break;
472 if (
p->brief && !
p->brief->doc.empty())
480 if (!
p->brief.has_value())
482 p->brief = std::make_optional<BriefInfo>();
506 if (b.
empty())
return;
514 if (!
p->inbodyDocs.has_value())
516 p->inbodyDocs = std::make_optional<DocInfo>();
518 DocInfo &inbodyDocs =
p->inbodyDocs.value();
521 inbodyDocs.
doc = doc;
534 if (d.
empty())
return;
562 bool usePipe = !filter.
empty() && filterSourceFiles;
568 size_t startLine,
size_t endLine,std::string &str)
570 std::unique_lock<std::mutex> lock(
m_mutex);
575 auto item = it->second;
583 auto [ startLineOffset, fragmentSize] =
getFragmentLocation(it_off->second,startLine,endLine);
587 item.filePos+startLineOffset, fragmentSize);
594 DString cmd=filter+
" \""+fileName+
"\"";
600 err(
"Error opening filter pipe command '{}'\n",cmd);
617 const int blockSize = 4096;
619 size_t bytesRead = fread(buf,1,blockSize,f);
620 size_t bytesWritten = fwrite(buf,1,bytesRead,bf);
621 if (bytesRead!=bytesWritten)
624 err(
"Failed to write to filter database {}. Wrote {} out of {} bytes\n",
631 str+=std::string_view(buf,bytesWritten);
635 m_cache.emplace(fileName.str(),item);
653 std::unique_lock<std::mutex> lock(
m_mutex);
681 const char *p=str.data();
685 while ((c=*p)!=
'\n' && c!=0) p++;
687 it->second.push_back(p-str.data());
694 size_t startLine,
size_t endLine) -> std::tuple<size_t,size_t>
697 ASSERT(startLine <= endLine);
698 const size_t startLineOffset = lineOffsets[std::min(startLine-1,lineOffsets.size()-1)];
699 const size_t endLineOffset = lineOffsets[std::min(endLine, lineOffsets.size()-1)];
700 ASSERT(startLineOffset <= endLineOffset);
701 const size_t fragmentSize = endLineOffset-startLineOffset;
702 return std::tie(startLineOffset,fragmentSize);
714 auto [ startLineOffset, fragmentSize] =
getFragmentLocation(lineOffsets,startLine,endLine);
717 str.erase(0,startLineOffset);
718 str.resize(fragmentSize);
727 if (size==0) { startOffset=0; size =
static_cast<size_t>(ifs.tellg()); }
728 ifs.seekg(startOffset, std::ios::beg);
730 ifs.read(str.data(), size);
734 std::unordered_map<std::string,FilterCacheItem>
m_cache;
761 int &startLine,
int &endLine,
DString &result)
765 bool usePipe = !filter.
empty() && filterSourceFiles;
768 const int blockSize = 4096;
771 static_cast<size_t>(std::max(1,startLine)),
772 static_cast<size_t>(std::max({1,startLine,endLine})),str);
775 bool found = lang==SrcLangExt::VHDL ||
776 lang==SrcLangExt::Python ||
777 lang==SrcLangExt::Fortran ||
785 int lineNr=startLine;
791 while ((c=*p++)!=
'{' && c!=
':' && c!=
'=' && c!=0)
801 col+=tabSize - (col%tabSize);
803 else if (pc==
'/' && c==
'/')
805 while ((c=*p++)!=
'\n' && c!=0);
812 else if (pc==
'/' && c==
'*')
814 while (((c=*p++)!=
'/' || pc!=
'*') && c!=0)
833 if (cn!=
':') found=
true;
858 if (endLine!=startLine)
861 spaces.
fill(
' ',col);
867 if (c==
':' || c==
'=')
870 if (cn==
'\n') lineNr++;
872 char lineStr[blockSize];
881 while ((c=*p) && i<blockSize-1)
890 }
while (size_read == (blockSize-1));
895 size_t newLineIndex = result.
rfind(
'\n');
896 size_t braceIndex = result.
rfind(
'}');
899 result.
resize(braceIndex+1);
910 if (encoding!=
"UTF-8")
912 std::string encBuf = result.
str();
920 err(
"failed to transcode characters in code fragment in file {} lines {} to {}, from input encoding {} to UTF-8\n",
921 fileName,startLine,endLine,encoding);
925 if (!result.
empty() && result.
at(result.
length()-1)!=
'\n') result +=
"\n";
936 p->body &&
p->body->startLine!=-1 &&
p->body->fileDef)
938 fn =
p->body->fileDef->getSourceFileBase();
945 const int maxAnchorStrLen = 20;
946 char anchorStr[maxAnchorStrLen];
948 if (
p->body &&
p->body->startLine!=-1)
952 snprintf(anchorStr,maxAnchorStrLen,
"L%d",
p->body->defLine);
956 snprintf(anchorStr,maxAnchorStrLen,
"l%05d",
p->body->defLine);
970 size_t lineMarkerPos = refText.
find(
"@0");
971 size_t fileMarkerPos = refText.
find(
"@1");
975 lineStr.
sprintf(
"%d",
p->body->defLine);
978 if (lineMarkerPos<fileMarkerPos)
984 ol.
parseText(refText.
mid(lineMarkerPos+2,fileMarkerPos-lineMarkerPos-2));
997 ol.
parseText(refText.
mid(fileMarkerPos+2,lineMarkerPos-fileMarkerPos-2));
1007 err(
"translation error: invalid markers in trDefinedAtLineInSourceFile()\n");
1014 if (!
p->body.has_value())
1016 p->body = std::make_optional<BodyInfo>();
1026 if (!
p->body.has_value())
1028 p->body = std::make_optional<BodyInfo>();
1030 p->body.value().fileDef=fd;
1035 return p->body &&
p->body->startLine!=-1 &&
1036 p->body->endLine>=
p->body->startLine &&
1055 bool isMacro = thisMd && thisMd->
memberType()==MemberType::Define;
1056 int actualStart=
p->body->startLine,actualEnd=
p->body->endLine;
1058 actualStart,actualEnd,codeFragment)
1064 intf->resetCodeParserState();
1070 intf->parseCode(codeOL,
1072 detab(codeFragment,indent),
1076 .setFileDef(
p->body->fileDef)
1082 codeOL.endCodeFragment(
"DoxyCode");
1092 std::transform(map.begin(),map.end(),
1093 std::back_inserter(result),
1094 [](
const auto &item)
1095 { return item.second; }
1098 std::stable_sort(result.
begin(),result.
end(),
1099 [](
const auto &m1,
const auto &m2) { return genericCompareMembers(m1,m2)<0; });
1107 const DString &text,
const std::unordered_map<std::string,MemberDef *> &membersMap,
1110 if (!membersMap.empty())
1114 auto replaceFunc = [
this,&members,scopeName,&ol](
size_t entryIndex)
1118 const MemberDef *md=members[entryIndex];
1124 if (!scope.
empty() && scope!=scopeName)
1136 if (sourceBrowser &&
1142 const int maxLineNrStr = 10;
1143 char anchorStr[maxLineNrStr];
1189 size_t num = refs.size();
1197 [&refs,&ol](
size_t entryIndex) { RequirementManager::instance().writeRef(ol,refs[entryIndex]); }
1213 return !
p->sourceRefByDict.empty();
1218 return !
p->sourceRefsDict.empty();
1223 return !
p->requirementRefs.empty();
1231 (
p->details && !
p->details->doc.empty()) ||
1232 (
p->brief && !
p->brief->doc.empty()) ||
1233 (
p->inbodyDocs && !
p->inbodyDocs->doc.empty()) ||
1244 (
p->details && !
p->details->doc.empty()) ||
1245 (
p->brief && !
p->brief->doc.empty()) ||
1246 (
p->inbodyDocs && !
p->inbodyDocs->doc.empty());
1254 p->sourceRefByDict.emplace(sourceRefName.
str(),md);
1262 p->sourceRefsDict.emplace(sourceRefName.
str(),md);
1273 err(
"DefinitionImpl::addInnerCompound() called\n");
1278 std::call_once(
p->qualifiedNameOnce.flag, [
this]()
1281 if (p->outerScope==nullptr || p->outerScope->name()==
"<globalScope>")
1283 p->qualifiedName = (p->localName==
"<globalScope>") ? DString() : p->localName;
1287 p->qualifiedName = p->outerScope->qualifiedName()+
1288 getLanguageSpecificSeparator(getLanguage())+
1293 return p->qualifiedName;
1302 while (outerScope && !found)
1304 found = (outerScope==d);
1309 p->qualifiedName.clear();
1310 p->qualifiedNameOnce.reset();
1319 return p->localName;
1324 p->partOfGroups.push_back(gd);
1329 p->xrefListItems.insert(
p->xrefListItems.end(), sli.cbegin(), sli.cend());
1334 p->requirementRefs.insert(
p->requirementRefs.end(), rqli.cbegin(), rqli.cend());
1342 p->xrefListItems.reserve(
p->xrefListItems.size()+otherXrefList.size());
1343 p->xrefListItems.insert (
p->xrefListItems.end(),
1344 otherXrefList.begin(),otherXrefList.end());
1347 std::stable_sort(
p->xrefListItems.begin(),
p->xrefListItems.end(),
1349 { return left->id() <right->id() ||
1350 (left->id()==right->id() &&
1351 left->list()->listName() < right->list()->listName());
1355 auto last = std::unique(
p->xrefListItems.begin(),
p->xrefListItems.end(),
1357 { return left->id()==right->id() &&
1358 left->list()->listName()==right->list()->listName();
1360 p->xrefListItems.erase(last,
p->xrefListItems.end());
1365 for (
const RefItem *item :
p->xrefListItems)
1377 return p->xrefListItems;
1382 return p->requirementRefs;
1390 result =
p->outerScope->pathFragment();
1392 if (
p->def->isLinkable())
1394 if (!result.
empty()) result+=
"/";
1407 result+=
p->localName;
1412 result+=
p->localName;
1435 result+=(
toFileDef(
p->def))->getDirDef()->navigationPathAsString();
1437 result+=
"<li class=\"navelem\">";
1438 if (
p->def->isLinkableInProject())
1440 DString fn =
p->def->getOutputFileBase();
1446 p->def->getDefFileName(),
p->def->getDefLine());
1447 result+=
"<a href=\"$relpath^"+fn+
"\">"+title+
"</a>";
1453 p->def->getDefFileName(),
p->def->getDefLine());
1454 result+=
"<a href=\"$relpath^"+fn+
"\">"+title+
"</a>";
1463 result+=
"<a href=\"$relpath^"+fn;
1464 if (!
p->def->anchor().empty()) result+=
"#"+
p->def->anchor();
1469 result+=
"<a href=\"$relpath^"+fn+
"\">"+
1488 navPath +=
"<div id=\"nav-path\" class=\"navpath\">\n"
1491 navPath +=
" </ul>\n"
1505 auto generateTocEntries = [
this,&ol]()
1515 if (docTitle.
empty()) docTitle = si->
label();
1522 .setIndexWords(
true)
1523 .setSingleLine(
true)
1536 generateTocEntries();
1545 generateTocEntries();
1564 return p->sectionRefs;
1569 return p->symbolName;
1576 return p->details ?
p->details->doc :
DString(
"");
1581 return p->details ?
p->details->line :
p->brief ?
p->brief->line : 1;
1586 if (
p->details && !
p->details->file.empty())
return p->details->file;
1587 else if (
p->brief && !
p->brief->file.empty())
return p->brief->file;
1588 else return "<" +
p->name +
">";
1618 for (
const auto &p : briefDescAbbrev)
1626 if (!result.
empty())
1629 if (c >=
'a' && c <=
'z') result[0] +=
'A' -
'a';
1642 (abbr ?
abbreviate(
p->brief->doc,
p->def->displayName()) :
p->brief->doc) :
1648 if (
p->brief &&
p->brief->tooltip.empty() && !
p->brief->doc.empty())
1653 p->brief->doc,
p->brief->file,
p->brief->line);
1659 return p->brief ?
p->brief->tooltip :
DString();
1664 return p->brief ?
p->brief->line : 1;
1669 return p->brief && !
p->brief->file.empty() ?
p->brief->file :
DString(
"<"+
p->name+
">");
1676 return p->inbodyDocs ?
p->inbodyDocs->doc :
DString(
"");
1681 return p->inbodyDocs ?
p->inbodyDocs->line : 1;
1686 return p->inbodyDocs && !
p->inbodyDocs->file.empty() ?
p->inbodyDocs->file :
DString(
"<"+
p->name+
">");
1694 return p->defFileName;
1699 return p->defFileExt;
1709 return p->def->isLinkableInProject() && !
p->hidden;
1714 return p->def->isLinkable() && !
p->hidden;
1719 return p->isArtificial;
1724 return p->isExported;
1734 return !
p->ref.empty();
1739 return p->body ?
p->body->defLine : -1;
1744 return p->body ?
p->body->startLine : -1;
1749 return p->body ?
p->body->endLine : -1;
1754 return p->body ?
p->body->fileDef :
nullptr;
1759 return p->partOfGroups;
1766 if (gd->isLinkable())
return true;
1773 return p->outerScope;
1781 if (
p->referencesMembers.empty() && !
p->sourceRefsDict.empty())
1785 return p->referencesMembers;
1791 if (
p->referencedByMembers.empty() && !
p->sourceRefByDict.empty())
1795 return p->referencedByMembers;
1803 for (
const auto &kv : defImpl->
p->sourceRefsDict)
1805 auto it =
p->sourceRefsDict.find(kv.first);
1806 if (it !=
p->sourceRefsDict.end())
1808 p->sourceRefsDict.insert(kv);
1819 for (
const auto &kv : defImpl->
p->sourceRefByDict)
1821 auto it =
p->sourceRefByDict.find(kv.first);
1822 if (it !=
p->sourceRefByDict.end())
1824 p->sourceRefByDict.emplace(kv.first,kv.second);
1843 p->hidden =
p->hidden || b;
1848 p->isArtificial = b;
1874 return p->symbolName;
1892 size_t l = result.
length();
1893 if (!relPath.
empty() && l>0 && result.
at(0)==
'.')
1898 if (l>0 && result.
at(l-1)!=
'/') result+=
'/';
1912 return p->isAnonymous;
1922 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 internal white...
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
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
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.
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.
Definition * toDefinition(DefinitionMutable *dm)
static MemberVector refMapToVector(const std::unordered_map< std::string, MemberDef * > &map)
static bool stripWord(DString &s, DString w)
DefinitionMutable * toDefinitionMutable(Definition *d)
DirIterator end(const DirIterator &) noexcept
DString parseCommentAsText(const Definition *scope, const MemberDef *md, const DString &doc, const DString &fileName, int lineNr)
DString parseCommentAsHtml(const Definition *scope, const MemberDef *member, const DString &doc, const DString &fileName, int lineNr)
DString substitute(const DString &s, const DString &src, const DString &dst)
substitute all occurrences of src in s by dst
bool isId(char 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 transcodeCharacterStringToUTF8(std::string &input, const char *inputEncoding)
Recodes the input string from the given input encoding to UTF8.
bool lastUTF8CharIsMultibyte(const std::string &input)
Returns true iff the last character in input is a multibyte character.
Various UTF8 related helper functions.
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 <.
DString stripScope(const DString &name)
DString convertToHtml(const DString &s, bool keepEntities)
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.