18#include <unordered_map>
76 std::optional<BodyInfo>
body;
123 if (n!=
"<globalScope>")
145 lang = SrcLangExt::Unknown;
150 p->setDefFileName(df);
151 p->defLine = defLine;
152 p->defColumn = defCol;
160 if (exclSyms.empty())
return FALSE;
161 const std::string &symName =
name.
str();
162 for (
const auto &pat : exclSyms)
165 bool forceStart=
FALSE;
167 if (pattern.
at(0)==
'^')
169 pattern = pattern.
mid(1);
172 if (pattern.
at(pattern.
length() - 1) ==
'$')
177 if (pattern.
find(
'*')!=-1)
183 size_t ui = match.position();
184 size_t pl = match.length();
185 size_t sl = symName.length();
186 if ((ui==0 || pattern.
at(0)==
'*' || (!
isId(symName.at(ui-1)) && !forceStart)) &&
187 (ui+pl==sl || pattern.
at(pattern.
length()-1)==
'*' || (!
isId(symName.at(ui+pl)) && !forceEnd))
197 size_t i = symName.find(pattern.
str());
198 if (i!=std::string::npos)
201 size_t pl=pattern.
length();
202 size_t sl=symName.length();
204 if ((ui==0 || (!
isId(symName.at(ui-1)) && !forceStart)) &&
205 (ui+pl==sl || (!
isId(symName.at(ui+pl)) && !forceEnd))
241 const char *d,
bool isSymbol)
249 p->isSymbol = isSymbol;
269 p = std::make_unique<Private>(*other.
p);
284 if (
name.isEmpty())
return;
286 p->isAnonymous =
p->name.isEmpty() ||
287 p->name.at(0)==
'@' ||
288 p->name.find(
"::@")!=-1;
293 if (
id.isEmpty())
return;
321 if (
p->sectionRefs.find(gsi->
label())==
nullptr)
323 p->sectionRefs.add(gsi);
332 if (
p->sectionRefs.empty())
return FALSE;
345 if (!
p->sectionRefs.empty())
356 tagFile <<
" <docanchor file=\"" << fn <<
"\"";
361 tagFile <<
">" << si->
label() <<
"</docanchor>\n";
374 MD5Buffer(docStr.
data(),
static_cast<unsigned int>(docStr.
length()),md5_sig);
375 MD5SigToString(md5_sig,sigStr);
378 if (sigList.
find(sigStr)==-1)
406 if (!
p->details.has_value())
408 p->details = std::make_optional<DocInfo>();
410 DocInfo &details =
p->details.value();
417 details.
doc = doc+
"\n\n"+details.
doc;
421 details.
doc +=
"\n\n"+doc;
449 size_t bl = brief.
length();
454 int c = brief.
at(bl-1);
457 case '.':
case '!':
case '?':
case ':':
break;
467 if (
p->brief && !
p->brief->doc.isEmpty())
475 if (!
p->brief.has_value())
477 p->brief = std::make_optional<BriefInfo>();
509 if (!
p->inbodyDocs.has_value())
511 p->inbodyDocs = std::make_optional<DocInfo>();
513 DocInfo &inbodyDocs =
p->inbodyDocs.value();
516 inbodyDocs.
doc = doc;
557 bool usePipe = !filter.
isEmpty() && filterSourceFiles;
563 size_t startLine,
size_t endLine,std::string &str)
565 std::unique_lock<std::mutex> lock(
m_mutex);
570 auto item = it->second;
578 auto [ startLineOffset, fragmentSize] =
getFragmentLocation(it_off->second,startLine,endLine);
582 item.filePos+startLineOffset, fragmentSize);
589 QCString cmd=filter+
" \""+fileName+
"\"";
595 err(
"Error opening filter pipe command '{}'\n",cmd);
612 const int blockSize = 4096;
614 size_t bytesRead = fread(buf,1,blockSize,f);
615 size_t bytesWritten = fwrite(buf,1,bytesRead,bf);
616 if (bytesRead!=bytesWritten)
619 err(
"Failed to write to filter database {}. Wrote {} out of {} bytes\n",
626 str+=std::string_view(buf,bytesWritten);
630 m_cache.emplace(fileName.str(),item);
648 std::unique_lock<std::mutex> lock(
m_mutex);
676 const char *p=str.data();
680 while ((c=*p)!=
'\n' && c!=0) p++;
682 it->second.push_back(p-str.data());
689 size_t startLine,
size_t endLine) -> std::tuple<size_t,size_t>
691 assert(startLine > 0);
692 assert(startLine <= endLine);
693 const size_t startLineOffset = lineOffsets[std::min(startLine-1,lineOffsets.size()-1)];
694 const size_t endLineOffset = lineOffsets[std::min(endLine, lineOffsets.size()-1)];
695 assert(startLineOffset <= endLineOffset);
696 const size_t fragmentSize = endLineOffset-startLineOffset;
697 return std::tie(startLineOffset,fragmentSize);
709 auto [ startLineOffset, fragmentSize] =
getFragmentLocation(lineOffsets,startLine,endLine);
712 str.erase(0,startLineOffset);
713 str.resize(fragmentSize);
722 if (size==0) { startOffset=0; size =
static_cast<size_t>(ifs.tellg()); }
723 ifs.seekg(startOffset, std::ios::beg);
725 ifs.read(str.data(), size);
729 std::unordered_map<std::string,FilterCacheItem>
m_cache;
756 int &startLine,
int &endLine,
QCString &result)
760 bool usePipe = !filter.
isEmpty() && filterSourceFiles;
763 const int blockSize = 4096;
766 static_cast<size_t>(std::max(1,startLine)),
767 static_cast<size_t>(std::max({1,startLine,endLine})),str);
770 bool found = lang==SrcLangExt::VHDL ||
771 lang==SrcLangExt::Python ||
772 lang==SrcLangExt::Fortran ||
780 int lineNr=startLine;
786 while ((c=*p++)!=
'{' && c!=
':' && c!=
'=' && c!=0)
796 col+=tabSize - (col%tabSize);
798 else if (pc==
'/' && c==
'/')
800 while ((c=*p++)!=
'\n' && c!=0);
807 else if (pc==
'/' && c==
'*')
809 while (((c=*p++)!=
'/' || pc!=
'*') && c!=0)
828 if (cn!=
':') found=
TRUE;
853 if (endLine!=startLine)
856 spaces.
fill(
' ',col);
862 if (c==
':' || c==
'=')
865 if (cn==
'\n') lineNr++;
867 char lineStr[blockSize];
876 while ((c=*p) && i<blockSize-1)
885 }
while (size_read == (blockSize-1));
890 int newLineIndex = result.
findRev(
'\n');
891 int braceIndex = result.
findRev(
'}');
892 if (braceIndex > newLineIndex)
894 result.
resize(
static_cast<size_t>(braceIndex+1));
905 if (encoding!=
"UTF-8")
907 std::string encBuf = result.
str();
915 err(
"failed to transcode characters in code fragment in file {} lines {} to {}, from input encoding {} to UTF-8\n",
916 fileName,startLine,endLine,encoding);
920 if (!result.
isEmpty() && result.
at(result.
length()-1)!=
'\n') result +=
"\n";
931 p->body &&
p->body->startLine!=-1 &&
p->body->fileDef)
933 fn =
p->body->fileDef->getSourceFileBase();
940 const int maxAnchorStrLen = 20;
941 char anchorStr[maxAnchorStrLen];
943 if (
p->body &&
p->body->startLine!=-1)
947 qsnprintf(anchorStr,maxAnchorStrLen,
"L%d",
p->body->defLine);
951 qsnprintf(anchorStr,maxAnchorStrLen,
"l%05d",
p->body->defLine);
965 int lineMarkerPos = refText.
find(
"@0");
966 int fileMarkerPos = refText.
find(
"@1");
967 if (lineMarkerPos!=-1 && fileMarkerPos!=-1)
970 lineStr.
sprintf(
"%d",
p->body->defLine);
973 if (lineMarkerPos<fileMarkerPos)
979 ol.
parseText(refText.
mid(lineMarkerPos+2,fileMarkerPos-lineMarkerPos-2));
992 ol.
parseText(refText.
mid(fileMarkerPos+2,lineMarkerPos-fileMarkerPos-2));
1002 err(
"translation error: invalid markers in trDefinedAtLineInSourceFile()\n");
1009 if (!
p->body.has_value())
1011 p->body = std::make_optional<BodyInfo>();
1021 if (!
p->body.has_value())
1023 p->body = std::make_optional<BodyInfo>();
1025 p->body.value().fileDef=fd;
1030 return p->body &&
p->body->startLine!=-1 &&
1031 p->body->endLine>=
p->body->startLine &&
1051 int actualStart=
p->body->startLine,actualEnd=
p->body->endLine;
1053 actualStart,actualEnd,codeFragment)
1059 intf->resetCodeParserState();
1065 intf->parseCode(codeOL,
1067 detab(codeFragment,indent),
1071 .setFileDef(
p->body->fileDef)
1077 codeOL.endCodeFragment(
"DoxyCode");
1087 std::transform(map.begin(),map.end(),
1088 std::back_inserter(result),
1089 [](
const auto &item)
1090 { return item.second; }
1093 std::stable_sort(result.
begin(),result.
end(),
1094 [](
const auto &m1,
const auto &m2) { return genericCompareMembers(m1,m2)<0; });
1102 const QCString &text,
const std::unordered_map<std::string,MemberDef *> &membersMap,
1105 if (!membersMap.empty())
1109 auto replaceFunc = [
this,&members,scopeName,&ol](
size_t entryIndex)
1113 const MemberDef *md=members[entryIndex];
1119 if (!scope.
isEmpty() && scope!=scopeName)
1131 if (sourceBrowser &&
1137 const int maxLineNrStr = 10;
1138 char anchorStr[maxLineNrStr];
1160 theTranslator->trWriteList(
static_cast<int>(members.size())).str(),
1184 size_t num = refs.size();
1191 theTranslator->trWriteList(
static_cast<int>(num)).str(), num,
1192 [&refs,&ol](
size_t entryIndex) { RequirementManager::instance().writeRef(ol,refs[entryIndex]); }
1202 writeRefsForType(satisfiesRefs,
"satisfies",
theTranslator->trSatisfies(satisfiesRefs.size()==1));
1203 writeRefsForType(verifiesRefs,
"verifies",
theTranslator->trVerifies(verifiesRefs.size()==1));
1208 return !
p->sourceRefByDict.empty();
1213 return !
p->sourceRefsDict.empty();
1218 return !
p->requirementRefs.empty();
1226 (
p->details && !
p->details->doc.isEmpty()) ||
1227 (
p->brief && !
p->brief->doc.isEmpty()) ||
1228 (
p->inbodyDocs && !
p->inbodyDocs->doc.isEmpty()) ||
1239 (
p->details && !
p->details->doc.isEmpty()) ||
1240 (
p->brief && !
p->brief->doc.isEmpty()) ||
1241 (
p->inbodyDocs && !
p->inbodyDocs->doc.isEmpty());
1249 p->sourceRefByDict.emplace(sourceRefName.
str(),md);
1257 p->sourceRefsDict.emplace(sourceRefName.
str(),md);
1268 err(
"DefinitionImpl::addInnerCompound() called\n");
1276 if (!
p->qualifiedName.isEmpty())
1278 return p->qualifiedName;
1282 if (
p->outerScope==
nullptr)
1284 if (
p->localName==
"<globalScope>")
1290 return p->localName;
1294 if (
p->outerScope->name()==
"<globalScope>")
1296 p->qualifiedName =
p->localName;
1300 p->qualifiedName =
p->outerScope->qualifiedName()+
1306 return p->qualifiedName;
1316 while (outerScope && !found)
1318 found = (outerScope==d);
1323 p->qualifiedName.clear();
1327 assert(
p->def!=
p->outerScope);
1332 return p->localName;
1337 p->partOfGroups.push_back(gd);
1342 p->xrefListItems.insert(
p->xrefListItems.end(), sli.cbegin(), sli.cend());
1347 p->requirementRefs.insert(
p->requirementRefs.end(), rqli.cbegin(), rqli.cend());
1355 p->xrefListItems.reserve(
p->xrefListItems.size()+otherXrefList.size());
1356 p->xrefListItems.insert (
p->xrefListItems.end(),
1357 otherXrefList.begin(),otherXrefList.end());
1360 std::stable_sort(
p->xrefListItems.begin(),
p->xrefListItems.end(),
1362 { return left->id() <right->id() ||
1363 (left->id()==right->id() &&
1364 left->list()->listName() < right->list()->listName());
1368 auto last = std::unique(
p->xrefListItems.begin(),
p->xrefListItems.end(),
1370 { return left->id()==right->id() &&
1371 left->list()->listName()==right->list()->listName();
1373 p->xrefListItems.erase(last,
p->xrefListItems.end());
1378 for (
const RefItem *item :
p->xrefListItems)
1390 return p->xrefListItems;
1395 return p->requirementRefs;
1403 result =
p->outerScope->pathFragment();
1405 if (
p->def->isLinkable())
1407 if (!result.
isEmpty()) result+=
"/";
1420 result+=
p->localName;
1425 result+=
p->localName;
1448 result+=(
toFileDef(
p->def))->getDirDef()->navigationPathAsString();
1450 result+=
"<li class=\"navelem\">";
1451 if (
p->def->isLinkableInProject())
1453 QCString fn =
p->def->getOutputFileBase();
1459 p->def->getDefFileName(),
p->def->getDefLine());
1460 result+=
"<a href=\"$relpath^"+fn+
"\">"+title+
"</a>";
1466 p->def->getDefFileName(),
p->def->getDefLine());
1467 result+=
"<a href=\"$relpath^"+fn+
"\">"+title+
"</a>";
1472 if (
name.endsWith(
"-p"))
1476 result+=
"<a href=\"$relpath^"+fn;
1477 if (!
p->def->anchor().isEmpty()) result+=
"#"+
p->def->anchor();
1482 result+=
"<a href=\"$relpath^"+fn+
"\">"+
1501 navPath +=
"<div id=\"nav-path\" class=\"navpath\">\n"
1504 navPath +=
" </ul>\n"
1518 auto generateTocEntries = [
this,&ol]()
1535 .setIndexWords(
true)
1536 .setSingleLine(
true)
1549 generateTocEntries();
1558 generateTocEntries();
1577 return p->sectionRefs;
1582 return p->symbolName;
1589 return p->details ?
p->details->doc :
QCString(
"");
1594 return p->details ?
p->details->line :
p->brief ?
p->brief->line : 1;
1599 if (
p->details && !
p->details->file.isEmpty())
return p->details->file;
1600 else if (
p->brief && !
p->brief->file.isEmpty())
return p->brief->file;
1601 else return "<" +
p->name +
">";
1622 int i=scopelessName.
findRev(
"::");
1623 if (i!=-1) scopelessName=scopelessName.
mid(i+2);
1632 for (
const auto &p : briefDescAbbrev)
1643 if (c >=
'a' && c <=
'z') result[0] +=
'A' -
'a';
1656 (abbr ?
abbreviate(
p->brief->doc,
p->def->displayName()) :
p->brief->doc) :
1662 if (
p->brief &&
p->brief->tooltip.isEmpty() && !
p->brief->doc.isEmpty())
1667 p->brief->doc,
p->brief->file,
p->brief->line);
1673 return p->brief ?
p->brief->tooltip :
QCString();
1678 return p->brief ?
p->brief->line : 1;
1683 return p->brief && !
p->brief->file.isEmpty() ?
p->brief->file :
QCString(
"<"+
p->name+
">");
1690 return p->inbodyDocs ?
p->inbodyDocs->doc :
QCString(
"");
1695 return p->inbodyDocs ?
p->inbodyDocs->line : 1;
1700 return p->inbodyDocs && !
p->inbodyDocs->file.isEmpty() ?
p->inbodyDocs->file :
QCString(
"<"+
p->name+
">");
1708 return p->defFileName;
1713 return p->defFileExt;
1723 return p->def->isLinkableInProject() && !
p->hidden;
1728 return p->def->isLinkable() && !
p->hidden;
1733 return p->isArtificial;
1738 return p->isExported;
1748 return !
p->ref.isEmpty();
1753 return p->body ?
p->body->defLine : -1;
1758 return p->body ?
p->body->startLine : -1;
1763 return p->body ?
p->body->endLine : -1;
1768 return p->body ?
p->body->fileDef :
nullptr;
1773 return p->partOfGroups;
1780 if (gd->isLinkable())
return true;
1787 return p->outerScope;
1795 if (
p->referencesMembers.empty() && !
p->sourceRefsDict.empty())
1799 return p->referencesMembers;
1805 if (
p->referencedByMembers.empty() && !
p->sourceRefByDict.empty())
1809 return p->referencedByMembers;
1817 for (
const auto &kv : defImpl->
p->sourceRefsDict)
1819 auto it =
p->sourceRefsDict.find(kv.first);
1820 if (it !=
p->sourceRefsDict.end())
1822 p->sourceRefsDict.insert(kv);
1833 for (
const auto &kv : defImpl->
p->sourceRefByDict)
1835 auto it =
p->sourceRefByDict.find(kv.first);
1836 if (it !=
p->sourceRefByDict.end())
1838 p->sourceRefByDict.emplace(kv.first,kv.second);
1857 p->hidden =
p->hidden || b;
1862 p->isArtificial = b;
1888 return p->symbolName;
1906 size_t l = result.
length();
1907 if (!relPath.
isEmpty() && l>0 && result.
at(0)==
'.')
1912 if (l>0 && result.
at(l-1)!=
'/') result+=
'/';
1926 return p->isAnonymous;
1936 return p->defColumn;
static AnchorGenerator & instance()
Returns the singleton instance.
virtual QCString className() const =0
Returns the name of the class including outer classes, but not including namespaces.
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
const QCString & name() const
QCString qualifiedName() const
virtual ~DefinitionAliasImpl()
The common base class of all entity definitions found in the sources.
virtual const RefItemVector & xrefListItems() const =0
virtual QCString navigationPathAsString() const =0
virtual bool isLinkable() const =0
virtual QCString anchor() const =0
virtual DefinitionMutable * toDefinitionMutable_()=0
virtual const FileDef * getBodyDef() const =0
virtual bool isHidden() const =0
virtual QCString getReference() const =0
virtual void _setSymbolName(const QCString &name)=0
virtual QCString getSourceFileBase() const =0
virtual QCString getOutputFileBase() const =0
virtual Definition * getOuterScope() const =0
virtual int getStartBodyLine() const =0
virtual const DefinitionImpl * toDefinitionImpl_() const =0
virtual const QCString & name() const =0
Private data associated with a Symbol DefinitionImpl object.
MemberVector referencesMembers
std::optional< BriefInfo > brief
std::optional< BodyInfo > body
RequirementRefs requirementRefs
void init(const QCString &df, const QCString &n)
std::optional< DocInfo > inbodyDocs
MemberVector referencedByMembers
std::unordered_map< std::string, MemberDef * > sourceRefByDict
std::unordered_map< std::string, MemberDef * > sourceRefsDict
RefItemVector xrefListItems
void setDefFileName(const QCString &df)
void setId(const QCString &name)
const RequirementRefs & requirementReferences() const
void setBodySegment(int defLine, int bls, int ble)
void mergeRefItems(Definition *d)
bool hasRequirementRefs() const
QCString documentation() const
void addSourceReferencedBy(MemberDef *d, const QCString &sourceRefName)
const RefItemVector & xrefListItems() const
void writeSummaryLinks(OutputList &) const
QCString _symbolName() const
QCString getSourceFileBase() const
QCString externalReference(const QCString &relPath) const
void addSectionsToDefinition(const std::vector< const SectionInfo * > &anchorList)
bool isLinkableViaGroup() const
void setDefFile(const QCString &df, int defLine, int defColumn)
const Definition * findInnerCompound(const QCString &name) const
void setName(const QCString &name)
SrcLangExt getLanguage() const
void addInnerCompound(Definition *d)
void setArtificial(bool b)
bool hasSourceReffedBy() const
void _writeSourceRefList(OutputList &ol, const QCString &scopeName, const QCString &text, const std::unordered_map< std::string, MemberDef * > &members, bool) const
void writeNavigationPath(OutputList &ol) const
QCString getDefFileName() const
void writeSourceReffedBy(OutputList &ol, const QCString &scopeName) const
bool _docsAlreadyAdded(const QCString &doc, QCString &sigList)
void _setInbodyDocumentation(const QCString &d, const QCString &docFile, int docLine)
void setRefItems(const RefItemVector &sli)
int getStartBodyLine() const
void setLocalName(const QCString &name)
QCString symbolName() const
void setOuterScope(Definition *d)
void _setBriefDescription(const QCString &b, const QCString &briefFile, int briefLine)
QCString qualifiedName() const
const MemberVector & getReferencesMembers() const
void setBodyDef(const FileDef *fd)
void writeInlineCode(OutputList &ol, const QCString &scopeName) const
void setInbodyDocumentation(const QCString &d, const QCString &docFile, int docLine)
bool isArtificial() const
QCString briefDescriptionAsTooltip() const
int _getXRefListId(const QCString &listName) const
QCString inbodyDocumentation() const
QCString getSourceAnchor() const
QCString getDefFileExtension() const
void writeQuickMemberLinks(OutputList &, const MemberDef *) const
const GroupList & partOfGroups() const
void setBriefDescription(const QCString &b, const QCString &briefFile, int briefLine)
const QCString & name() const
QCString briefFile() const
bool hasUserDocumentation() const
QCString briefDescription(bool abbreviate=FALSE) const
bool hasBriefDescription() const
const SectionRefs & getSectionRefs() const
DefinitionImpl & operator=(const DefinitionImpl &d)
bool isVisibleInProject() const
void writeSourceRefs(OutputList &ol, const QCString &scopeName) const
void makePartOfGroup(GroupDef *gd)
const QCString & localName() const
void mergeReferencedBy(const Definition *other)
int getStartDefLine() const
void setDocumentation(const QCString &d, const QCString &docFile, int docLine, bool stripWhiteSpace=TRUE)
void setReference(const QCString &r)
bool hasSourceRefs() const
void writeToc(OutputList &ol, const LocalToc <) const
QCString navigationPathAsString() const
void _setDocumentation(const QCString &d, const QCString &docFile, int docLine, bool stripWhiteSpace, bool atTop)
void writePageNavigation(OutputList &ol) const
const FileDef * getBodyDef() const
void writeSourceDef(OutputList &ol) const
void setLanguage(SrcLangExt lang)
void mergeReferences(const Definition *other)
QCString inbodyFile() const
std::unique_ptr< Private > p
void setRequirementReferences(const RequirementRefs &rqli)
bool hasDocumentation() const
Definition * getOuterScope() const
const MemberVector & getReferencedByMembers() const
QCString pathFragment() const
DefinitionImpl(Definition *def, const QCString &defFileName, int defLine, int defColumn, const QCString &name, const char *b=nullptr, const char *d=nullptr, bool isSymbol=TRUE)
int getEndBodyLine() const
void writeDocAnchorsToTagFile(TextStream &) const
void writeRequirementRefs(OutputList &ol) const
void _setSymbolName(const QCString &name)
QCString getReference() const
void addSourceReferences(MemberDef *d, const QCString &sourceRefName)
virtual Definition * toDefinition_()=0
static ParserManager * parserManager
static NamespaceDefMutable * globalScope
static StringMap tagDestinationMap
static QCString filterDBFileName
static SymbolMap< Definition > * symbolMap
static ClangUsrMap * clangUsrMap
A model of a file symbol.
Minimal replacement for QFileInfo.
std::string extension(bool complete) const
void shrinkBuffer(std::string &str, const QCString &fileName, size_t startLine, size_t endLine)
std::vector< size_t > LineOffsets
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 getFileContentsDisk(const QCString &fileName, size_t startLine, size_t endLine, std::string &str)
static FilterCache & instance()
void readFragmentFromFile(std::string &str, const QCString &fileName, size_t startOffset, size_t size=0)
void compileLineOffsets(const QCString &fileName, const std::string &str)
bool getFileContents(const QCString &fileName, size_t startLine, size_t endLine, std::string &str)
bool getFileContentsPipe(const QCString &fileName, const QCString &filter, size_t startLine, size_t endLine, std::string &str)
std::unordered_map< std::string, FilterCacheItem > m_cache
A model of a group of symbols.
virtual QCString 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 bool isSlot() const =0
virtual bool isFunction() const =0
virtual QCString getScopeString() const =0
virtual bool hasInlineSource() const =0
virtual MemberType memberType() const =0
virtual bool isPrototype() const =0
A vector of MemberDef object.
iterator begin() noexcept
void startCodeFragment(const QCString &style)
Class representing a list of output generators that are written to in parallel.
void writeString(const QCString &text)
void startTocEntry(const SectionInfo *si)
const OutputCodeList & codeGenerators() const
void writeObjectLink(const QCString &ref, const QCString &file, const QCString &anchor, const QCString &name)
void docify(const QCString &s)
void generateDoc(const QCString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const QCString &docStr, const DocOptions &options)
void startParagraph(const QCString &classDef=QCString())
void pushGeneratorState()
void disableAllBut(OutputType o)
void endTocEntry(const SectionInfo *si)
void writeNavigationPath(const QCString &s)
void parseText(const QCString &textStr)
void startLocalToc(int level)
virtual QCString title() const =0
This is an alternative implementation of QCString.
int find(char c, int index=0, bool cs=TRUE) const
QCString & prepend(const char *s)
size_t length() const
Returns the length of the string, not counting the 0-terminator.
QCString mid(size_t index, size_t len=static_cast< size_t >(-1)) 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
void resize(size_t newlen)
QCString fill(char c, int len=-1)
Fills a string with a predefined character.
const std::string & str() const
QCString simplifyWhiteSpace() const
return a copy of this string with leading and trailing whitespace removed and multiple whitespace cha...
QCString right(size_t len) const
QCString & sprintf(const char *format,...)
int findRev(char c, int index=-1, bool cs=TRUE) const
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
This struct represents an item in the list of references.
QCString listName() const
class that provide information about a section.
void setDefinition(Definition *d)
QCString fileName() const
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
Text streaming class that buffers data.
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 QCString &name, Definition *d)
bool readCodeFragment(const QCString &fileName, bool isMacro, int &startLine, int &endLine, QCString &result)
Reads a fragment from file fileName starting with line startLine and ending with line endLine.
static void addToMap(const QCString &name, Definition *d)
static bool matchExcludedSymbols(const QCString &name)
static QCString abbreviate(const QCString &s, const QCString &name)
Definition * toDefinition(DefinitionMutable *dm)
static MemberVector refMapToVector(const std::unordered_map< std::string, MemberDef * > &map)
static std::recursive_mutex g_qualifiedNameMutex
static bool stripWord(QCString &s, QCString w)
DefinitionMutable * toDefinitionMutable(Definition *d)
DirIterator end(const DirIterator &) noexcept
FileDef * toFileDef(Definition *d)
GroupDef * toGroupDef(Definition *d)
Translator * theTranslator
MemberDef * toMemberDef(Definition *d)
std::ifstream openInputStream(const QCString &name, bool binary=false, bool openAtEnd=false)
FILE * popen(const QCString &name, const QCString &type)
FILE * fopen(const QCString &fileName, const QCString &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.
QCString substitute(const QCString &s, const QCString &src, const QCString &dst)
substitute all occurrences of src in s by dst
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.
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.
SrcLangExt getLanguageFromFileName(const QCString &fileName, SrcLangExt defLang)
QCString parseCommentAsHtml(const Definition *scope, const MemberDef *member, const QCString &doc, const QCString &fileName, int lineNr)
QCString convertToHtml(const QCString &s, bool keepEntities)
QCString parseCommentAsText(const Definition *scope, const MemberDef *md, const QCString &doc, const QCString &fileName, int lineNr)
bool transcodeCharacterStringToUTF8(std::string &input, const char *inputEncoding)
QCString stripScope(const QCString &name)
int computeQualifiedIndex(const QCString &name)
Return the index of the last :: in the string name that is still before the first <.
QCString convertToXML(const QCString &s, bool keepEntities)
QCString detab(const QCString &s, size_t &refIndent)
QCString getLanguageSpecificSeparator(SrcLangExt lang, bool classScope)
Returns the scope separator to use given the programming language lang.
QCString getEncoding(const FileInfo &fi)
QCString stripLeadingAndTrailingEmptyLines(const QCString &s, int &docLine)
Special version of QCString::stripWhiteSpace() that only strips completely blank lines.
QCString getFileFilter(const QCString &name, bool isSourceCode)
void writeMarkerList(OutputList &ol, const std::string &markerText, size_t numMarkers, std::function< void(size_t)> replaceFunc)
void addHtmlExtensionIfMissing(QCString &fName)
A bunch of utility functions.