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) ==
'$')
189 if (pattern.
find(
'*')!=-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))
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))
253 const char *d,
bool isSymbol)
261 p->isSymbol = isSymbol;
281 p = std::make_unique<Private>(*other.
p);
296 if (
name.isEmpty())
return;
298 p->isAnonymous =
p->name.isEmpty() ||
299 p->name.at(0)==
'@' ||
300 p->name.find(
"::@")!=-1;
305 if (
id.isEmpty())
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";
386 MD5Buffer(docStr.
data(),
static_cast<unsigned int>(docStr.
length()),md5_sig);
387 MD5SigToString(md5_sig,sigStr);
390 if (sigList.
find(sigStr)==-1)
418 if (!
p->details.has_value())
420 p->details = std::make_optional<DocInfo>();
461 size_t bl = brief.
length();
466 int c = brief.
at(bl-1);
469 case '.':
case '!':
case '?':
case ':':
break;
479 if (
p->brief && !
p->brief->doc.isEmpty())
487 if (!
p->brief.has_value())
489 p->brief = std::make_optional<BriefInfo>();
521 if (!
p->inbodyDocs.has_value())
523 p->inbodyDocs = std::make_optional<DocInfo>();
525 DocInfo &inbodyDocs =
p->inbodyDocs.value();
528 inbodyDocs.
doc = doc;
569 bool usePipe = !filter.
isEmpty() && filterSourceFiles;
575 size_t startLine,
size_t endLine,std::string &str)
577 std::unique_lock<std::mutex> lock(
m_mutex);
582 auto item = it->second;
590 auto [ startLineOffset, fragmentSize] =
getFragmentLocation(it_off->second,startLine,endLine);
594 item.filePos+startLineOffset, fragmentSize);
601 QCString cmd=filter+
" \""+fileName+
"\"";
607 err(
"Error opening filter pipe command '{}'\n",cmd);
624 const int blockSize = 4096;
626 size_t bytesRead = fread(buf,1,blockSize,f);
627 size_t bytesWritten = fwrite(buf,1,bytesRead,bf);
628 if (bytesRead!=bytesWritten)
631 err(
"Failed to write to filter database {}. Wrote {} out of {} bytes\n",
638 str+=std::string_view(buf,bytesWritten);
642 m_cache.emplace(fileName.str(),item);
660 std::unique_lock<std::mutex> lock(
m_mutex);
688 const char *p=str.data();
692 while ((c=*p)!=
'\n' && c!=0) p++;
694 it->second.push_back(p-str.data());
701 size_t startLine,
size_t endLine) -> std::tuple<size_t,size_t>
703 assert(startLine > 0);
704 assert(startLine <= endLine);
705 const size_t startLineOffset = lineOffsets[std::min(startLine-1,lineOffsets.size()-1)];
706 const size_t endLineOffset = lineOffsets[std::min(endLine, lineOffsets.size()-1)];
707 assert(startLineOffset <= endLineOffset);
708 const size_t fragmentSize = endLineOffset-startLineOffset;
709 return std::tie(startLineOffset,fragmentSize);
721 auto [ startLineOffset, fragmentSize] =
getFragmentLocation(lineOffsets,startLine,endLine);
724 str.erase(0,startLineOffset);
725 str.resize(fragmentSize);
734 if (size==0) { startOffset=0; size =
static_cast<size_t>(ifs.tellg()); }
735 ifs.seekg(startOffset, std::ios::beg);
737 ifs.read(str.data(), size);
741 std::unordered_map<std::string,FilterCacheItem>
m_cache;
768 int &startLine,
int &endLine,
QCString &result)
772 bool usePipe = !filter.
isEmpty() && filterSourceFiles;
775 const int blockSize = 4096;
778 static_cast<size_t>(std::max(1,startLine)),
779 static_cast<size_t>(std::max({1,startLine,endLine})),str);
782 bool found = lang==SrcLangExt::VHDL ||
783 lang==SrcLangExt::Python ||
784 lang==SrcLangExt::Fortran ||
792 int lineNr=startLine;
798 while ((c=*p++)!=
'{' && c!=
':' && c!=
'=' && c!=0)
808 col+=tabSize - (col%tabSize);
810 else if (pc==
'/' && c==
'/')
812 while ((c=*p++)!=
'\n' && c!=0);
819 else if (pc==
'/' && c==
'*')
821 while (((c=*p++)!=
'/' || pc!=
'*') && c!=0)
840 if (cn!=
':') found=
TRUE;
865 if (endLine!=startLine)
868 spaces.
fill(
' ',col);
874 if (c==
':' || c==
'=')
877 if (cn==
'\n') lineNr++;
879 char lineStr[blockSize];
888 while ((c=*p) && i<blockSize-1)
897 }
while (size_read == (blockSize-1));
902 int newLineIndex = result.
findRev(
'\n');
903 int braceIndex = result.
findRev(
'}');
904 if (braceIndex > newLineIndex)
906 result.
resize(
static_cast<size_t>(braceIndex+1));
917 if (encoding!=
"UTF-8")
919 std::string encBuf = result.
str();
927 err(
"failed to transcode characters in code fragment in file {} lines {} to {}, from input encoding {} to UTF-8\n",
928 fileName,startLine,endLine,encoding);
932 if (!result.
isEmpty() && result.
at(result.
length()-1)!=
'\n') result +=
"\n";
943 p->body &&
p->body->startLine!=-1 &&
p->body->fileDef)
945 fn =
p->body->fileDef->getSourceFileBase();
952 const int maxAnchorStrLen = 20;
953 char anchorStr[maxAnchorStrLen];
955 if (
p->body &&
p->body->startLine!=-1)
959 qsnprintf(anchorStr,maxAnchorStrLen,
"L%d",
p->body->defLine);
963 qsnprintf(anchorStr,maxAnchorStrLen,
"l%05d",
p->body->defLine);
977 int lineMarkerPos = refText.
find(
"@0");
978 int fileMarkerPos = refText.
find(
"@1");
979 if (lineMarkerPos!=-1 && fileMarkerPos!=-1)
982 lineStr.
sprintf(
"%d",
p->body->defLine);
985 if (lineMarkerPos<fileMarkerPos)
991 ol.
parseText(refText.
mid(lineMarkerPos+2,fileMarkerPos-lineMarkerPos-2));
1004 ol.
parseText(refText.
mid(fileMarkerPos+2,lineMarkerPos-fileMarkerPos-2));
1014 err(
"translation error: invalid markers in trDefinedAtLineInSourceFile()\n");
1021 if (!
p->body.has_value())
1023 p->body = std::make_optional<BodyInfo>();
1033 if (!
p->body.has_value())
1035 p->body = std::make_optional<BodyInfo>();
1037 p->body.value().fileDef=fd;
1042 return p->body &&
p->body->startLine!=-1 &&
1043 p->body->endLine>=
p->body->startLine &&
1063 int actualStart=
p->body->startLine,actualEnd=
p->body->endLine;
1065 actualStart,actualEnd,codeFragment)
1071 intf->resetCodeParserState();
1077 intf->parseCode(codeOL,
1079 detab(codeFragment,indent),
1083 .setFileDef(
p->body->fileDef)
1089 codeOL.endCodeFragment(
"DoxyCode");
1099 std::transform(map.begin(),map.end(),
1100 std::back_inserter(result),
1101 [](
const auto &item)
1102 { return item.second; }
1105 std::stable_sort(result.
begin(),result.
end(),
1106 [](
const auto &m1,
const auto &m2) { return genericCompareMembers(m1,m2)<0; });
1114 const QCString &text,
const std::unordered_map<std::string,MemberDef *> &membersMap,
1117 if (!membersMap.empty())
1121 auto replaceFunc = [
this,&members,scopeName,&ol](
size_t entryIndex)
1125 const MemberDef *md=members[entryIndex];
1131 if (!scope.
isEmpty() && scope!=scopeName)
1143 if (sourceBrowser &&
1149 const int maxLineNrStr = 10;
1150 char anchorStr[maxLineNrStr];
1172 theTranslator->trWriteList(
static_cast<int>(members.size())).str(),
1196 size_t num = refs.size();
1203 theTranslator->trWriteList(
static_cast<int>(num)).str(), num,
1204 [&refs,&ol](
size_t entryIndex) { RequirementManager::instance().writeRef(ol,refs[entryIndex]); }
1214 writeRefsForType(satisfiesRefs,
"satisfies",
theTranslator->trSatisfies(satisfiesRefs.size()==1));
1215 writeRefsForType(verifiesRefs,
"verifies",
theTranslator->trVerifies(verifiesRefs.size()==1));
1220 return !
p->sourceRefByDict.empty();
1225 return !
p->sourceRefsDict.empty();
1230 return !
p->requirementRefs.empty();
1238 (
p->details && !
p->details->doc.isEmpty()) ||
1239 (
p->brief && !
p->brief->doc.isEmpty()) ||
1240 (
p->inbodyDocs && !
p->inbodyDocs->doc.isEmpty()) ||
1251 (
p->details && !
p->details->doc.isEmpty()) ||
1252 (
p->brief && !
p->brief->doc.isEmpty()) ||
1253 (
p->inbodyDocs && !
p->inbodyDocs->doc.isEmpty());
1261 p->sourceRefByDict.emplace(sourceRefName.
str(),md);
1269 p->sourceRefsDict.emplace(sourceRefName.
str(),md);
1280 err(
"DefinitionImpl::addInnerCompound() called\n");
1285 std::call_once(
p->qualifiedNameOnce.flag, [
this]()
1288 if (p->outerScope==nullptr || p->outerScope->name()==
"<globalScope>")
1290 p->qualifiedName = (p->localName==
"<globalScope>") ? QCString() : p->localName;
1294 p->qualifiedName = p->outerScope->qualifiedName()+
1295 getLanguageSpecificSeparator(getLanguage())+
1300 return p->qualifiedName;
1309 while (outerScope && !found)
1311 found = (outerScope==d);
1316 p->qualifiedName.clear();
1317 p->qualifiedNameOnce.reset();
1321 assert(
p->def!=
p->outerScope);
1326 return p->localName;
1331 p->partOfGroups.push_back(gd);
1336 p->xrefListItems.insert(
p->xrefListItems.end(), sli.cbegin(), sli.cend());
1341 p->requirementRefs.insert(
p->requirementRefs.end(), rqli.cbegin(), rqli.cend());
1349 p->xrefListItems.reserve(
p->xrefListItems.size()+otherXrefList.size());
1350 p->xrefListItems.insert (
p->xrefListItems.end(),
1351 otherXrefList.begin(),otherXrefList.end());
1354 std::stable_sort(
p->xrefListItems.begin(),
p->xrefListItems.end(),
1356 { return left->id() <right->id() ||
1357 (left->id()==right->id() &&
1358 left->list()->listName() < right->list()->listName());
1362 auto last = std::unique(
p->xrefListItems.begin(),
p->xrefListItems.end(),
1364 { return left->id()==right->id() &&
1365 left->list()->listName()==right->list()->listName();
1367 p->xrefListItems.erase(last,
p->xrefListItems.end());
1372 for (
const RefItem *item :
p->xrefListItems)
1384 return p->xrefListItems;
1389 return p->requirementRefs;
1397 result =
p->outerScope->pathFragment();
1399 if (
p->def->isLinkable())
1401 if (!result.
isEmpty()) result+=
"/";
1414 result+=
p->localName;
1419 result+=
p->localName;
1442 result+=(
toFileDef(
p->def))->getDirDef()->navigationPathAsString();
1444 result+=
"<li class=\"navelem\">";
1445 if (
p->def->isLinkableInProject())
1447 QCString fn =
p->def->getOutputFileBase();
1453 p->def->getDefFileName(),
p->def->getDefLine());
1454 result+=
"<a href=\"$relpath^"+fn+
"\">"+title+
"</a>";
1460 p->def->getDefFileName(),
p->def->getDefLine());
1461 result+=
"<a href=\"$relpath^"+fn+
"\">"+title+
"</a>";
1466 if (
name.endsWith(
"-p"))
1470 result+=
"<a href=\"$relpath^"+fn;
1471 if (!
p->def->anchor().isEmpty()) result+=
"#"+
p->def->anchor();
1476 result+=
"<a href=\"$relpath^"+fn+
"\">"+
1495 navPath +=
"<div id=\"nav-path\" class=\"navpath\">\n"
1498 navPath +=
" </ul>\n"
1512 auto generateTocEntries = [
this,&ol]()
1529 .setIndexWords(
true)
1530 .setSingleLine(
true)
1543 generateTocEntries();
1552 generateTocEntries();
1571 return p->sectionRefs;
1576 return p->symbolName;
1583 return p->details ?
p->details->doc :
QCString(
"");
1588 return p->details ?
p->details->line :
p->brief ?
p->brief->line : 1;
1593 if (
p->details && !
p->details->file.isEmpty())
return p->details->file;
1594 else if (
p->brief && !
p->brief->file.isEmpty())
return p->brief->file;
1595 else return "<" +
p->name +
">";
1616 int i=scopelessName.
findRev(
"::");
1617 if (i!=-1) scopelessName=scopelessName.
mid(i+2);
1626 for (
const auto &p : briefDescAbbrev)
1637 if (c >=
'a' && c <=
'z') result[0] +=
'A' -
'a';
1650 (abbr ?
abbreviate(
p->brief->doc,
p->def->displayName()) :
p->brief->doc) :
1656 if (
p->brief &&
p->brief->tooltip.isEmpty() && !
p->brief->doc.isEmpty())
1661 p->brief->doc,
p->brief->file,
p->brief->line);
1667 return p->brief ?
p->brief->tooltip :
QCString();
1672 return p->brief ?
p->brief->line : 1;
1677 return p->brief && !
p->brief->file.isEmpty() ?
p->brief->file :
QCString(
"<"+
p->name+
">");
1684 return p->inbodyDocs ?
p->inbodyDocs->doc :
QCString(
"");
1689 return p->inbodyDocs ?
p->inbodyDocs->line : 1;
1694 return p->inbodyDocs && !
p->inbodyDocs->file.isEmpty() ?
p->inbodyDocs->file :
QCString(
"<"+
p->name+
">");
1702 return p->defFileName;
1707 return p->defFileExt;
1717 return p->def->isLinkableInProject() && !
p->hidden;
1722 return p->def->isLinkable() && !
p->hidden;
1727 return p->isArtificial;
1732 return p->isExported;
1742 return !
p->ref.isEmpty();
1747 return p->body ?
p->body->defLine : -1;
1752 return p->body ?
p->body->startLine : -1;
1757 return p->body ?
p->body->endLine : -1;
1762 return p->body ?
p->body->fileDef :
nullptr;
1767 return p->partOfGroups;
1774 if (gd->isLinkable())
return true;
1781 return p->outerScope;
1789 if (
p->referencesMembers.empty() && !
p->sourceRefsDict.empty())
1793 return p->referencesMembers;
1799 if (
p->referencedByMembers.empty() && !
p->sourceRefByDict.empty())
1803 return p->referencedByMembers;
1811 for (
const auto &kv : defImpl->
p->sourceRefsDict)
1813 auto it =
p->sourceRefsDict.find(kv.first);
1814 if (it !=
p->sourceRefsDict.end())
1816 p->sourceRefsDict.insert(kv);
1827 for (
const auto &kv : defImpl->
p->sourceRefByDict)
1829 auto it =
p->sourceRefByDict.find(kv.first);
1830 if (it !=
p->sourceRefByDict.end())
1832 p->sourceRefByDict.emplace(kv.first,kv.second);
1851 p->hidden =
p->hidden || b;
1856 p->isArtificial = b;
1882 return p->symbolName;
1900 size_t l = result.
length();
1901 if (!relPath.
isEmpty() && l>0 && result.
at(0)==
'.')
1906 if (l>0 && result.
at(l-1)!=
'/') result+=
'/';
1920 return p->isAnonymous;
1930 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)
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 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 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.
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.
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.