Doxygen
Loading...
Searching...
No Matches
xmlgen.cpp File Reference
#include <stdlib.h>
#include "textstream.h"
#include "xmlgen.h"
#include "doxygen.h"
#include "message.h"
#include "config.h"
#include "classlist.h"
#include "util.h"
#include "defargs.h"
#include "outputgen.h"
#include "outputlist.h"
#include "dot.h"
#include "dotclassgraph.h"
#include "dotincldepgraph.h"
#include "pagedef.h"
#include "filename.h"
#include "version.h"
#include "xmldocvisitor.h"
#include "docparser.h"
#include "language.h"
#include "parserintf.h"
#include "arguments.h"
#include "memberlist.h"
#include "groupdef.h"
#include "memberdef.h"
#include "namespacedef.h"
#include "membername.h"
#include "membergroup.h"
#include "dirdef.h"
#include "section.h"
#include "htmlentity.h"
#include "resourcemgr.h"
#include "dir.h"
#include "utf8.h"
#include "portable.h"
#include "moduledef.h"
Include dependency graph for xmlgen.cpp:

Go to the source code of this file.

Classes

class  TextGeneratorXMLImpl
 Implements TextGeneratorIntf for an XML stream. More...
 

Macros

#define XML_DB(x)
 

Functions

static void writeXMLDocBlock (TextStream &t, const QCString &fileName, int lineNr, const Definition *scope, const MemberDef *md, const QCString &text)
 
void writeXMLString (TextStream &t, const QCString &s)
 
void writeXMLCodeString (bool hide, TextStream &t, const QCString &str, size_t &col, size_t stripIndentAmount)
 
static void writeXMLHeader (TextStream &t)
 
static void writeCombineScript ()
 
void writeXMLLink (TextStream &t, const QCString &extRef, const QCString &compoundId, const QCString &anchorId, const QCString &text, const QCString &tooltip)
 
static void writeTemplateArgumentList (TextStream &t, const ArgumentList &al, const Definition *scope, const FileDef *fileScope, int indent)
 
static void writeMemberTemplateLists (const MemberDef *md, TextStream &t)
 
static void writeTemplateList (const ClassDef *cd, TextStream &t)
 
static void writeTemplateList (const ConceptDef *cd, TextStream &t)
 
void writeXMLCodeBlock (TextStream &t, FileDef *fd)
 
static void writeMemberReference (TextStream &t, const Definition *def, const MemberDef *rmd, const QCString &tagName)
 
static void stripAnonymousMarkers (QCString &s)
 
static void stripQualifiers (QCString &typeStr)
 
static QCString classOutputFileBase (const ClassDef *cd)
 
static QCString memberOutputFileBase (const MemberDef *md)
 
static QCString extractNoExcept (QCString &argsStr)
 
static void generateXMLForMember (const MemberDef *md, TextStream &ti, TextStream &t, const Definition *def)
 
static bool memberVisible (const Definition *d, const MemberDef *md)
 
static void generateXMLSection (const Definition *d, TextStream &ti, TextStream &t, const MemberList *ml, const QCString &kind, const QCString &header=QCString(), const QCString &documentation=QCString())
 
static void writeListOfAllMembers (const ClassDef *cd, TextStream &t)
 
static void writeInnerClasses (const ClassLinkedRefMap &cl, TextStream &t)
 
static void writeInnerConcepts (const ConceptLinkedRefMap &cl, TextStream &t)
 
static void writeInnerModules (const ModuleLinkedRefMap &ml, TextStream &t)
 
static void writeInnerNamespaces (const NamespaceLinkedRefMap &nl, TextStream &t)
 
static void writeExports (const ImportInfoMap &exportMap, TextStream &t)
 
static void writeInnerFiles (const FileList &fl, TextStream &t)
 
static void writeInnerPages (const PageLinkedRefMap &pl, TextStream &t)
 
static void writeInnerGroups (const GroupList &gl, TextStream &t)
 
static void writeInnerDirs (const DirList *dl, TextStream &t)
 
static void writeIncludeInfo (const IncludeInfo *ii, TextStream &t)
 
static void generateXMLForClass (const ClassDef *cd, TextStream &ti)
 
static void generateXMLForConcept (const ConceptDef *cd, TextStream &ti)
 
static void generateXMLForModule (const ModuleDef *mod, TextStream &ti)
 
static void generateXMLForNamespace (const NamespaceDef *nd, TextStream &ti)
 
static void generateXMLForFile (FileDef *fd, TextStream &ti)
 
static void generateXMLForGroup (const GroupDef *gd, TextStream &ti)
 
static void generateXMLForDir (DirDef *dd, TextStream &ti)
 
static void generateXMLForPage (PageDef *pd, TextStream &ti, bool isExample)
 
void generateXML ()
 

Macro Definition Documentation

◆ XML_DB

Function Documentation

◆ classOutputFileBase()

QCString classOutputFileBase ( const ClassDef * cd)
static

Definition at line 567 of file xmlgen.cpp.

568{
569 //bool inlineGroupedClasses = Config_getBool(INLINE_GROUPED_CLASSES);
570 //if (inlineGroupedClasses && cd->partOfGroups()!=0)
571 return cd->getOutputFileBase();
572 //else
573 // return cd->getOutputFileBase();
574}
virtual QCString getOutputFileBase() const =0

References Definition::getOutputFileBase().

Referenced by generateXMLForClass(), and writeInnerClasses().

◆ extractNoExcept()

QCString extractNoExcept ( QCString & argsStr)
static

Definition at line 586 of file xmlgen.cpp.

587{
588 QCString expr;
589 //printf("extractNoExcept(%s)\n",qPrint(argsStr));
590 int i = argsStr.find("noexcept(");
591 if (i!=-1)
592 {
593 int bracketCount = 1;
594 size_t p = i+9;
595 bool found = false;
596 bool insideString = false;
597 bool insideChar = false;
598 char pc = 0;
599 while (!found && p<argsStr.length())
600 {
601 char c = argsStr[p++];
602 if (insideString)
603 {
604 if (c=='"' && pc!='\\') insideString=false;
605 }
606 else if (insideChar)
607 {
608 if (c=='\'' && pc!='\\') insideChar=false;
609 }
610 else
611 {
612 switch (c)
613 {
614 case '(': bracketCount++; break;
615 case ')': bracketCount--; found = bracketCount==0; break;
616 case '"': insideString = true; break;
617 case '\'': insideChar = true; break;
618 }
619 }
620 pc = c;
621 }
622 expr = argsStr.mid(i+9,p-i-10);
623 argsStr = (argsStr.left(i) + argsStr.mid(p)).stripWhiteSpace();
624 }
625 //printf("extractNoExcept -> argsStr='%s', expr='%s'\n",qPrint(argsStr),qPrint(expr));
626 return expr;
627}
This is an alternative implementation of QCString.
Definition qcstring.h:101
int find(char c, int index=0, bool cs=TRUE) const
Definition qcstring.cpp:43
size_t length() const
Returns the length of the string, not counting the 0-terminator.
Definition qcstring.h:153
QCString mid(size_t index, size_t len=static_cast< size_t >(-1)) const
Definition qcstring.h:226
QCString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
Definition qcstring.h:245
QCString left(size_t len) const
Definition qcstring.h:214
bool found
Definition util.cpp:984

References QCString::find(), found, QCString::left(), QCString::length(), QCString::mid(), and QCString::stripWhiteSpace().

Referenced by generateXMLForMember().

◆ generateXML()

void generateXML ( )

Definition at line 2130 of file xmlgen.cpp.

2131{
2132 // + classes
2133 // + concepts
2134 // + namespaces
2135 // + files
2136 // + groups
2137 // + related pages
2138 // - examples
2139
2140 QCString outputDirectory = Config_getString(XML_OUTPUT);
2141 Dir xmlDir(outputDirectory.str());
2142 createSubDirs(xmlDir);
2143
2144 ResourceMgr::instance().copyResource("xml.xsd",outputDirectory);
2145 ResourceMgr::instance().copyResource("index.xsd",outputDirectory);
2146
2147 QCString fileName=outputDirectory+"/compound.xsd";
2148 std::ofstream f = Portable::openOutputStream(fileName);
2149 if (!f.is_open())
2150 {
2151 err("Cannot open file {} for writing!\n",fileName);
2152 return;
2153 }
2154 {
2155 TextStream t(&f);
2156
2157 // write compound.xsd, but replace special marker with the entities
2158 QCString compound_xsd = ResourceMgr::instance().getAsString("compound.xsd");
2159 const char *startLine = compound_xsd.data();
2160 while (*startLine)
2161 {
2162 // find end of the line
2163 const char *endLine = startLine+1;
2164 while (*endLine && *(endLine-1)!='\n') endLine++; // skip to end of the line including \n
2165 int len=static_cast<int>(endLine-startLine);
2166 if (len>0)
2167 {
2168 QCString s(startLine,len);
2169 if (s.find("<!-- Automatically insert here the HTML entities -->")!=-1)
2170 {
2172 }
2173 else
2174 {
2175 t.write(startLine,len);
2176 }
2177 }
2178 startLine=endLine;
2179 }
2180 }
2181 f.close();
2182
2183 fileName=outputDirectory+"/doxyfile.xsd";
2184 f = Portable::openOutputStream(fileName);
2185 if (!f.is_open())
2186 {
2187 err("Cannot open file {} for writing!\n",fileName);
2188 return;
2189 }
2190 {
2191 TextStream t(&f);
2192
2193 // write doxyfile.xsd, but replace special marker with the entities
2194 QCString doxyfile_xsd = ResourceMgr::instance().getAsString("doxyfile.xsd");
2195 const char *startLine = doxyfile_xsd.data();
2196 while (*startLine)
2197 {
2198 // find end of the line
2199 const char *endLine = startLine+1;
2200 while (*endLine && *(endLine-1)!='\n') endLine++; // skip to end of the line including \n
2201 int len=static_cast<int>(endLine-startLine);
2202 if (len>0)
2203 {
2204 QCString s(startLine,len);
2205 if (s.find("<!-- Automatically insert here the configuration settings -->")!=-1)
2206 {
2208 }
2209 else
2210 {
2211 t.write(startLine,len);
2212 }
2213 }
2214 startLine=endLine;
2215 }
2216 }
2217 f.close();
2218
2219 fileName=outputDirectory+"/Doxyfile.xml";
2220 f = Portable::openOutputStream(fileName);
2221 if (!f.is_open())
2222 {
2223 err("Cannot open file {} for writing\n",fileName);
2224 return;
2225 }
2226 else
2227 {
2228 TextStream t(&f);
2230 }
2231 f.close();
2232
2233 fileName=outputDirectory+"/index.xml";
2234 f = Portable::openOutputStream(fileName);
2235 if (!f.is_open())
2236 {
2237 err("Cannot open file {} for writing!\n",fileName);
2238 return;
2239 }
2240 else
2241 {
2242 TextStream t(&f);
2243
2244 // write index header
2245 t << "<?xml version='1.0' encoding='UTF-8' standalone='no'?>\n";
2246 t << "<doxygenindex xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ";
2247 t << "xsi:noNamespaceSchemaLocation=\"index.xsd\" ";
2248 t << "version=\"" << getDoxygenVersion() << "\" ";
2249 t << "xml:lang=\"" << theTranslator->trISOLang() << "\"";
2250 t << ">\n";
2251
2252 for (const auto &cd : *Doxygen::classLinkedMap)
2253 {
2254 generateXMLForClass(cd.get(),t);
2255 }
2256 for (const auto &cd : *Doxygen::conceptLinkedMap)
2257 {
2258 msg("Generating XML output for concept {}\n",cd->displayName());
2259 generateXMLForConcept(cd.get(),t);
2260 }
2261 for (const auto &nd : *Doxygen::namespaceLinkedMap)
2262 {
2263 msg("Generating XML output for namespace {}\n",nd->displayName());
2264 generateXMLForNamespace(nd.get(),t);
2265 }
2266 for (const auto &fn : *Doxygen::inputNameLinkedMap)
2267 {
2268 for (const auto &fd : *fn)
2269 {
2270 msg("Generating XML output for file {}\n",fd->name());
2271 generateXMLForFile(fd.get(),t);
2272 }
2273 }
2274 for (const auto &gd : *Doxygen::groupLinkedMap)
2275 {
2276 msg("Generating XML output for group {}\n",gd->name());
2277 generateXMLForGroup(gd.get(),t);
2278 }
2279 for (const auto &pd : *Doxygen::pageLinkedMap)
2280 {
2281 msg("Generating XML output for page {}\n",pd->name());
2282 generateXMLForPage(pd.get(),t,FALSE);
2283 }
2284 for (const auto &dd : *Doxygen::dirLinkedMap)
2285 {
2286 msg("Generate XML output for dir {}\n",dd->name());
2287 generateXMLForDir(dd.get(),t);
2288 }
2289 for (const auto &mod : ModuleManager::instance().modules())
2290 {
2291 msg("Generating XML output for module {}\n",mod->name());
2292 generateXMLForModule(mod.get(),t);
2293 }
2294 for (const auto &pd : *Doxygen::exampleLinkedMap)
2295 {
2296 msg("Generating XML output for example {}\n",pd->name());
2297 generateXMLForPage(pd.get(),t,TRUE);
2298 }
2300 {
2301 msg("Generating XML output for the main page\n");
2303 }
2304
2305 //t << " </compoundlist>\n";
2306 t << "</doxygenindex>\n";
2307 }
2308
2310 clearSubDirs(xmlDir);
2311}
Class representing a directory in the file system.
Definition dir.h:75
static NamespaceLinkedMap * namespaceLinkedMap
Definition doxygen.h:115
static ConceptLinkedMap * conceptLinkedMap
Definition doxygen.h:98
static std::unique_ptr< PageDef > mainPage
Definition doxygen.h:101
static FileNameLinkedMap * inputNameLinkedMap
Definition doxygen.h:105
static ClassLinkedMap * classLinkedMap
Definition doxygen.h:96
static PageLinkedMap * exampleLinkedMap
Definition doxygen.h:99
static PageLinkedMap * pageLinkedMap
Definition doxygen.h:100
static DirLinkedMap * dirLinkedMap
Definition doxygen.h:129
static GroupLinkedMap * groupLinkedMap
Definition doxygen.h:114
void writeXMLSchema(TextStream &t)
static HtmlEntityMapper & instance()
Returns the one and only instance of the HTML entity mapper.
static ModuleManager & instance()
const std::string & str() const
Definition qcstring.h:537
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
Definition qcstring.h:159
static ResourceMgr & instance()
Returns the one and only instance of this class.
bool copyResource(const QCString &name, const QCString &targetDir) const
Copies a registered resource to a given target directory.
QCString getAsString(const QCString &name) const
Gets the resource data as a C string.
Text streaming class that buffers data.
Definition textstream.h:36
#define Config_getString(name)
Definition config.h:32
Translator * theTranslator
Definition language.cpp:71
#define msg(fmt,...)
Definition message.h:94
#define err(fmt,...)
Definition message.h:127
void writeXMLDoxyfile(TextStream &t)
void writeXSDDoxyfile(TextStream &t)
std::ofstream openOutputStream(const QCString &name, bool append=false)
Definition portable.cpp:665
#define TRUE
Definition qcstring.h:37
#define FALSE
Definition qcstring.h:34
void clearSubDirs(const Dir &d)
Definition util.cpp:4176
void createSubDirs(const Dir &d)
Definition util.cpp:4149
static void generateXMLForGroup(const GroupDef *gd, TextStream &ti)
Definition xmlgen.cpp:1871
static void generateXMLForClass(const ClassDef *cd, TextStream &ti)
Definition xmlgen.cpp:1415
static void generateXMLForFile(FileDef *fd, TextStream &ti)
Definition xmlgen.cpp:1756
static void generateXMLForNamespace(const NamespaceDef *nd, TextStream &ti)
Definition xmlgen.cpp:1683
static void generateXMLForModule(const ModuleDef *mod, TextStream &ti)
Definition xmlgen.cpp:1628
static void generateXMLForConcept(const ConceptDef *cd, TextStream &ti)
Definition xmlgen.cpp:1582
static void generateXMLForDir(DirDef *dd, TextStream &ti)
Definition xmlgen.cpp:1940
static void generateXMLForPage(PageDef *pd, TextStream &ti, bool isExample)
Definition xmlgen.cpp:1978
static void writeCombineScript()
Definition xmlgen.cpp:134

References Doxygen::classLinkedMap, clearSubDirs(), Doxygen::conceptLinkedMap, Config_getString, ResourceMgr::copyResource(), createSubDirs(), QCString::data(), Doxygen::dirLinkedMap, err, Doxygen::exampleLinkedMap, FALSE, QCString::find(), generateXMLForClass(), generateXMLForConcept(), generateXMLForDir(), generateXMLForFile(), generateXMLForGroup(), generateXMLForModule(), generateXMLForNamespace(), generateXMLForPage(), ResourceMgr::getAsString(), Doxygen::groupLinkedMap, Doxygen::inputNameLinkedMap, HtmlEntityMapper::instance(), ModuleManager::instance(), ResourceMgr::instance(), Doxygen::mainPage, msg, Doxygen::namespaceLinkedMap, Portable::openOutputStream(), Doxygen::pageLinkedMap, QCString::str(), theTranslator, TRUE, TextStream::write(), writeCombineScript(), Config::writeXMLDoxyfile(), HtmlEntityMapper::writeXMLSchema(), and Config::writeXSDDoxyfile().

Referenced by generateOutput().

◆ generateXMLForClass()

void generateXMLForClass ( const ClassDef * cd,
TextStream & ti )
static

Definition at line 1415 of file xmlgen.cpp.

1416{
1417 // + brief description
1418 // + detailed description
1419 // + template argument list(s)
1420 // - include file
1421 // + member groups
1422 // + inheritance diagram
1423 // + list of direct super classes
1424 // + list of direct sub classes
1425 // + list of inner classes
1426 // + collaboration diagram
1427 // + list of all members
1428 // + user defined member sections
1429 // + standard member sections
1430 // + detailed member documentation
1431 // - examples using the class
1432
1433 if (cd->isReference()) return; // skip external references.
1434 if (cd->isHidden()) return; // skip hidden classes.
1435 if (cd->isAnonymous()) return; // skip anonymous compounds.
1436 if (cd->isImplicitTemplateInstance()) return; // skip generated template instances.
1437 if (cd->isArtificial()) return; // skip artificially created classes
1438
1439 msg("Generating XML output for class {}\n",cd->name());
1440
1441 ti << " <compound refid=\"" << classOutputFileBase(cd)
1442 << "\" kind=\"" << cd->compoundTypeString()
1443 << "\"><name>" << convertToXML(cd->name()) << "</name>\n";
1444
1445 QCString outputDirectory = Config_getString(XML_OUTPUT);
1446 QCString fileName=outputDirectory+"/"+ classOutputFileBase(cd)+".xml";
1447 std::ofstream f = Portable::openOutputStream(fileName);
1448 if (!f.is_open())
1449 {
1450 err("Cannot open file {} for writing!\n",fileName);
1451 return;
1452 }
1453 TextStream t(&f);
1454
1455 writeXMLHeader(t);
1456 t << " <compounddef id=\""
1457 << classOutputFileBase(cd) << "\" kind=\""
1458 << cd->compoundTypeString() << "\" language=\""
1459 << langToString(cd->getLanguage()) << "\" prot=\"";
1460 t << to_string_lower(cd->protection());
1461 if (cd->isFinal()) t << "\" final=\"yes";
1462 if (cd->isSealed()) t << "\" sealed=\"yes";
1463 if (cd->isAbstract()) t << "\" abstract=\"yes";
1464 t << "\">\n";
1465 t << " <compoundname>";
1466 QCString nameStr = cd->name();
1467 stripAnonymousMarkers(nameStr);
1468 writeXMLString(t,nameStr);
1469 t << "</compoundname>\n";
1470 for (const auto &bcd : cd->baseClasses())
1471 {
1472 t << " <basecompoundref ";
1473 if (bcd.classDef->isLinkable())
1474 {
1475 t << "refid=\"" << classOutputFileBase(bcd.classDef) << "\" ";
1476 }
1477 if (bcd.prot == Protection::Package) ASSERT(0);
1478 t << "prot=\"";
1479 t << to_string_lower(bcd.prot);
1480 t << "\" virt=\"";
1481 t << to_string_lower(bcd.virt);
1482 t << "\">";
1483 if (!bcd.templSpecifiers.isEmpty())
1484 {
1485 t << convertToXML(
1487 bcd.classDef->name(),bcd.templSpecifiers)
1488 );
1489 }
1490 else
1491 {
1492 t << convertToXML(bcd.classDef->displayName());
1493 }
1494 t << "</basecompoundref>\n";
1495 }
1496 for (const auto &bcd : cd->subClasses())
1497 {
1498 if (bcd.prot == Protection::Package) ASSERT(0);
1499 t << " <derivedcompoundref refid=\""
1500 << classOutputFileBase(bcd.classDef)
1501 << "\" prot=\"";
1502 t << to_string_lower(bcd.prot);
1503 t << "\" virt=\"";
1504 t << to_string_lower(bcd.virt);
1505 t << "\">" << convertToXML(bcd.classDef->displayName())
1506 << "</derivedcompoundref>\n";
1507 }
1508
1510
1512
1513 writeTemplateList(cd,t);
1514 for (const auto &mg : cd->getMemberGroups())
1515 {
1516 generateXMLSection(cd,ti,t,&mg->members(),"user-defined",mg->header(),
1517 mg->documentation());
1518 }
1519
1520 for (const auto &ml : cd->getMemberLists())
1521 {
1522 if (!ml->listType().isDetailed())
1523 {
1524 generateXMLSection(cd,ti,t,ml.get(),ml->listType().toXML());
1525 }
1526 }
1527
1528 if (!cd->requiresClause().isEmpty())
1529 {
1530 t << " <requiresclause>";
1531 linkifyText(TextGeneratorXMLImpl(t),cd,cd->getFileDef(),nullptr,cd->requiresClause());
1532 t << " </requiresclause>\n";
1533 }
1534
1535 for (const auto &qcd : cd->getQualifiers())
1536 {
1537 t << " <qualifier>" << convertToXML(qcd.c_str()) << "</qualifier>\n";
1538 }
1539
1540 t << " <briefdescription>\n";
1541 writeXMLDocBlock(t,cd->briefFile(),cd->briefLine(),cd,nullptr,cd->briefDescription());
1542 t << " </briefdescription>\n";
1543 t << " <detaileddescription>\n";
1544 writeXMLDocBlock(t,cd->docFile(),cd->docLine(),cd,nullptr,cd->documentation());
1545 t << " </detaileddescription>\n";
1546 DotClassGraph inheritanceGraph(cd,GraphType::Inheritance);
1547 if (!inheritanceGraph.isTrivial())
1548 {
1549 t << " <inheritancegraph>\n";
1550 inheritanceGraph.writeXML(t);
1551 t << " </inheritancegraph>\n";
1552 }
1553 DotClassGraph collaborationGraph(cd,GraphType::Collaboration);
1554 if (!collaborationGraph.isTrivial())
1555 {
1556 t << " <collaborationgraph>\n";
1557 collaborationGraph.writeXML(t);
1558 t << " </collaborationgraph>\n";
1559 }
1560 t << " <location file=\""
1561 << convertToXML(stripFromPath(cd->getDefFileName())) << "\" line=\""
1562 << cd->getDefLine() << "\"" << " column=\""
1563 << cd->getDefColumn() << "\"" ;
1564 if (cd->getStartBodyLine()!=-1)
1565 {
1566 const FileDef *bodyDef = cd->getBodyDef();
1567 if (bodyDef)
1568 {
1569 t << " bodyfile=\"" << convertToXML(stripFromPath(bodyDef->absFilePath())) << "\"";
1570 }
1571 t << " bodystart=\"" << cd->getStartBodyLine() << "\" bodyend=\""
1572 << cd->getEndBodyLine() << "\"";
1573 }
1574 t << "/>\n";
1576 t << " </compounddef>\n";
1577 t << "</doxygen>\n";
1578
1579 ti << " </compound>\n";
1580}
virtual bool isAbstract() const =0
Returns TRUE if there is at least one pure virtual member in this class.
virtual bool isFinal() const =0
Returns TRUE if this class is marked as final.
virtual QCString compoundTypeString() const =0
Returns the type of compound as a string.
virtual const MemberLists & getMemberLists() const =0
Returns the list containing the list of members sorted per type.
virtual const BaseClassList & baseClasses() const =0
Returns the list of base classes from which this class directly inherits.
virtual bool isSealed() const =0
Returns TRUE if this class is marked as sealed.
virtual StringVector getQualifiers() const =0
virtual Protection protection() const =0
Return the protection level (Public,Protected,Private) in which this compound was found.
virtual bool isImplicitTemplateInstance() const =0
virtual const MemberGroupList & getMemberGroups() const =0
Returns the member groups defined for this class.
virtual ClassLinkedRefMap getClasses() const =0
returns the classes nested into this class
virtual FileDef * getFileDef() const =0
Returns the namespace this compound is in, or 0 if it has a global scope.
virtual const IncludeInfo * includeInfo() const =0
virtual QCString requiresClause() const =0
virtual const BaseClassList & subClasses() const =0
Returns the list of sub classes that directly derive from this class.
virtual QCString docFile() const =0
virtual int getEndBodyLine() const =0
virtual SrcLangExt getLanguage() const =0
Returns the programming language this definition was written in.
virtual int docLine() const =0
virtual QCString getDefFileName() const =0
virtual int getDefLine() const =0
virtual const FileDef * getBodyDef() const =0
virtual int briefLine() const =0
virtual QCString briefDescription(bool abbreviate=FALSE) const =0
virtual bool isAnonymous() const =0
virtual bool isHidden() const =0
virtual QCString documentation() const =0
virtual bool isArtificial() const =0
virtual QCString briefFile() const =0
virtual int getStartBodyLine() const =0
virtual int getDefColumn() const =0
virtual bool isReference() const =0
virtual const QCString & name() const =0
Representation of a class inheritance or dependency graph.
A model of a file symbol.
Definition filedef.h:99
virtual QCString absFilePath() const =0
bool isEmpty() const
Returns TRUE iff the string is empty.
Definition qcstring.h:150
Implements TextGeneratorIntf for an XML stream.
Definition xmlgen.cpp:181
@ Collaboration
Definition dotgraph.h:31
@ Inheritance
Definition dotgraph.h:31
#define ASSERT(x)
Definition qcstring.h:39
static const char * to_string_lower(Protection prot)
Definition types.h:50
QCString insertTemplateSpecifierInScope(const QCString &scope, const QCString &templ)
Definition util.cpp:4255
static QCString stripFromPath(const QCString &p, const StringVector &l)
Definition util.cpp:309
QCString convertToXML(const QCString &s, bool keepEntities)
Definition util.cpp:4421
QCString langToString(SrcLangExt lang)
Returns a string representation of lang.
Definition util.cpp:6369
void linkifyText(const TextGeneratorIntf &out, const Definition *scope, const FileDef *fileScope, const Definition *self, const QCString &text, bool autoBreak, bool external, bool keepSpaces, int indentLevel)
Definition util.cpp:904
static QCString classOutputFileBase(const ClassDef *cd)
Definition xmlgen.cpp:567
static void writeXMLDocBlock(TextStream &t, const QCString &fileName, int lineNr, const Definition *scope, const MemberDef *md, const QCString &text)
Definition xmlgen.cpp:447
static void writeListOfAllMembers(const ClassDef *cd, TextStream &t)
Definition xmlgen.cpp:1252
static void stripAnonymousMarkers(QCString &s)
Definition xmlgen.cpp:526
static void writeTemplateList(const ClassDef *cd, TextStream &t)
Definition xmlgen.cpp:437
static void writeIncludeInfo(const IncludeInfo *ii, TextStream &t)
Definition xmlgen.cpp:1395
static void writeXMLHeader(TextStream &t)
Definition xmlgen.cpp:124
void writeXMLString(TextStream &t, const QCString &s)
Definition xmlgen.cpp:70
static void generateXMLSection(const Definition *d, TextStream &ti, TextStream &t, const MemberList *ml, const QCString &kind, const QCString &header=QCString(), const QCString &documentation=QCString())
Definition xmlgen.cpp:1215
static void writeInnerClasses(const ClassLinkedRefMap &cl, TextStream &t)
Definition xmlgen.cpp:1279

References FileDef::absFilePath(), ASSERT, ClassDef::baseClasses(), Definition::briefDescription(), Definition::briefFile(), Definition::briefLine(), classOutputFileBase(), Collaboration, ClassDef::compoundTypeString(), Config_getString, convertToXML(), Definition::docFile(), Definition::docLine(), Definition::documentation(), err, generateXMLSection(), Definition::getBodyDef(), ClassDef::getClasses(), Definition::getDefColumn(), Definition::getDefFileName(), Definition::getDefLine(), Definition::getEndBodyLine(), ClassDef::getFileDef(), Definition::getLanguage(), ClassDef::getMemberGroups(), ClassDef::getMemberLists(), ClassDef::getQualifiers(), Definition::getStartBodyLine(), ClassDef::includeInfo(), Inheritance, insertTemplateSpecifierInScope(), ClassDef::isAbstract(), Definition::isAnonymous(), Definition::isArtificial(), MemberListType::isDetailed(), QCString::isEmpty(), ClassDef::isFinal(), Definition::isHidden(), ClassDef::isImplicitTemplateInstance(), Definition::isReference(), ClassDef::isSealed(), DotClassGraph::isTrivial(), langToString(), linkifyText(), MemberList::listType(), msg, Definition::name(), Portable::openOutputStream(), ClassDef::protection(), ClassDef::requiresClause(), stripAnonymousMarkers(), stripFromPath(), ClassDef::subClasses(), to_string_lower(), MemberListType::toXML(), writeIncludeInfo(), writeInnerClasses(), writeListOfAllMembers(), writeTemplateList(), DotClassGraph::writeXML(), writeXMLDocBlock(), writeXMLHeader(), and writeXMLString().

Referenced by generateXML().

◆ generateXMLForConcept()

void generateXMLForConcept ( const ConceptDef * cd,
TextStream & ti )
static

Definition at line 1582 of file xmlgen.cpp.

1583{
1584 if (cd->isReference() || cd->isHidden()) return; // skip external references.
1585
1586 ti << " <compound refid=\"" << cd->getOutputFileBase()
1587 << "\" kind=\"concept\"" << "><name>"
1588 << convertToXML(cd->name()) << "</name>\n";
1589
1590 QCString outputDirectory = Config_getString(XML_OUTPUT);
1591 QCString fileName=outputDirectory+"/"+cd->getOutputFileBase()+".xml";
1592 std::ofstream f = Portable::openOutputStream(fileName);
1593 if (!f.is_open())
1594 {
1595 err("Cannot open file {} for writing!\n",fileName);
1596 return;
1597 }
1598 TextStream t(&f);
1599 writeXMLHeader(t);
1600 t << " <compounddef id=\"" << cd->getOutputFileBase()
1601 << "\" kind=\"concept\">\n";
1602 t << " <compoundname>";
1603 QCString nameStr = cd->name();
1604 stripAnonymousMarkers(nameStr);
1605 writeXMLString(t,nameStr);
1606 t << "</compoundname>\n";
1608 writeTemplateList(cd,t);
1609 t << " <initializer>";
1610 linkifyText(TextGeneratorXMLImpl(t),cd,cd->getFileDef(),nullptr,cd->initializer());
1611 t << " </initializer>\n";
1612 t << " <briefdescription>\n";
1613 writeXMLDocBlock(t,cd->briefFile(),cd->briefLine(),cd,nullptr,cd->briefDescription());
1614 t << " </briefdescription>\n";
1615 t << " <detaileddescription>\n";
1616 writeXMLDocBlock(t,cd->docFile(),cd->docLine(),cd,nullptr,cd->documentation());
1617 t << " </detaileddescription>\n";
1618 t << " <location file=\""
1619 << convertToXML(stripFromPath(cd->getDefFileName())) << "\" line=\""
1620 << cd->getDefLine() << "\"" << " column=\""
1621 << cd->getDefColumn() << "\"/>\n" ;
1622 t << " </compounddef>\n";
1623 t << "</doxygen>\n";
1624
1625 ti << " </compound>\n";
1626}
virtual QCString initializer() const =0
virtual const IncludeInfo * includeInfo() const =0
virtual const FileDef * getFileDef() const =0

References Definition::briefDescription(), Definition::briefFile(), Definition::briefLine(), Config_getString, convertToXML(), Definition::docFile(), Definition::docLine(), Definition::documentation(), err, Definition::getDefColumn(), Definition::getDefFileName(), Definition::getDefLine(), ConceptDef::getFileDef(), Definition::getOutputFileBase(), ConceptDef::includeInfo(), ConceptDef::initializer(), Definition::isHidden(), Definition::isReference(), linkifyText(), Definition::name(), Portable::openOutputStream(), stripAnonymousMarkers(), stripFromPath(), writeIncludeInfo(), writeTemplateList(), writeXMLDocBlock(), writeXMLHeader(), and writeXMLString().

Referenced by generateXML().

◆ generateXMLForDir()

void generateXMLForDir ( DirDef * dd,
TextStream & ti )
static

Definition at line 1940 of file xmlgen.cpp.

1941{
1942 if (dd->isReference()) return; // skip external references
1943 ti << " <compound refid=\"" << dd->getOutputFileBase()
1944 << "\" kind=\"dir\"><name>" << convertToXML(dd->displayName())
1945 << "</name>\n";
1946
1947 QCString outputDirectory = Config_getString(XML_OUTPUT);
1948 QCString fileName=outputDirectory+"/"+dd->getOutputFileBase()+".xml";
1949 std::ofstream f = Portable::openOutputStream(fileName);
1950 if (!f.is_open())
1951 {
1952 err("Cannot open file {} for writing!\n",fileName);
1953 return;
1954 }
1955 TextStream t(&f);
1956
1957 writeXMLHeader(t);
1958 t << " <compounddef id=\""
1959 << dd->getOutputFileBase() << "\" kind=\"dir\">\n";
1960 t << " <compoundname>" << convertToXML(dd->displayName()) << "</compoundname>\n";
1961
1962 writeInnerDirs(&dd->subDirs(),t);
1963 writeInnerFiles(dd->getFiles(),t);
1964
1965 t << " <briefdescription>\n";
1966 writeXMLDocBlock(t,dd->briefFile(),dd->briefLine(),dd,nullptr,dd->briefDescription());
1967 t << " </briefdescription>\n";
1968 t << " <detaileddescription>\n";
1969 writeXMLDocBlock(t,dd->docFile(),dd->docLine(),dd,nullptr,dd->documentation());
1970 t << " </detaileddescription>\n";
1971 t << " <location file=\"" << convertToXML(stripFromPath(dd->name())) << "\"/>\n";
1972 t << " </compounddef>\n";
1973 t << "</doxygen>\n";
1974
1975 ti << " </compound>\n";
1976}
virtual QCString displayName(bool includeScope=TRUE) const =0
virtual const DirList & subDirs() const =0
virtual const FileList & getFiles() const =0
static void writeInnerDirs(const DirList *dl, TextStream &t)
Definition xmlgen.cpp:1383
static void writeInnerFiles(const FileList &fl, TextStream &t)
Definition xmlgen.cpp:1351

References Definition::briefDescription(), Definition::briefFile(), Definition::briefLine(), Config_getString, convertToXML(), Definition::displayName(), Definition::docFile(), Definition::docLine(), Definition::documentation(), err, DirDef::getFiles(), Definition::getOutputFileBase(), Definition::isReference(), Definition::name(), Portable::openOutputStream(), stripFromPath(), DirDef::subDirs(), writeInnerDirs(), writeInnerFiles(), writeXMLDocBlock(), and writeXMLHeader().

Referenced by generateXML().

◆ generateXMLForFile()

void generateXMLForFile ( FileDef * fd,
TextStream & ti )
static

Definition at line 1756 of file xmlgen.cpp.

1757{
1758 // + includes files
1759 // + includedby files
1760 // + include graph
1761 // + included by graph
1762 // + contained class definitions
1763 // + contained namespace definitions
1764 // + member groups
1765 // + normal members
1766 // + brief desc
1767 // + detailed desc
1768 // + source code
1769 // + location
1770 // - number of lines
1771
1772 if (fd->isReference()) return; // skip external references
1773
1774 ti << " <compound refid=\"" << fd->getOutputFileBase()
1775 << "\" kind=\"file\"><name>" << convertToXML(fd->name())
1776 << "</name>\n";
1777
1778 QCString outputDirectory = Config_getString(XML_OUTPUT);
1779 QCString fileName=outputDirectory+"/"+fd->getOutputFileBase()+".xml";
1780 std::ofstream f = Portable::openOutputStream(fileName);
1781 if (!f.is_open())
1782 {
1783 err("Cannot open file {} for writing!\n",fileName);
1784 return;
1785 }
1786 TextStream t(&f);
1787
1788 writeXMLHeader(t);
1789 t << " <compounddef id=\"" << fd->getOutputFileBase()
1790 << "\" kind=\"file\" language=\""
1791 << langToString(fd->getLanguage()) << "\">\n";
1792 t << " <compoundname>";
1793 writeXMLString(t,fd->name());
1794 t << "</compoundname>\n";
1795
1796 for (const auto &inc : fd->includeFileList())
1797 {
1798 t << " <includes";
1799 if (inc.fileDef && !inc.fileDef->isReference()) // TODO: support external references
1800 {
1801 t << " refid=\"" << inc.fileDef->getOutputFileBase() << "\"";
1802 }
1803 t << " local=\"" << ((inc.kind & IncludeKind_LocalMask) ? "yes" : "no") << "\">";
1804 t << inc.includeName;
1805 t << "</includes>\n";
1806 }
1807
1808 for (const auto &inc : fd->includedByFileList())
1809 {
1810 t << " <includedby";
1811 if (inc.fileDef && !inc.fileDef->isReference()) // TODO: support external references
1812 {
1813 t << " refid=\"" << inc.fileDef->getOutputFileBase() << "\"";
1814 }
1815 t << " local=\"" << ((inc.kind &IncludeKind_LocalMask) ? "yes" : "no") << "\">";
1816 t << inc.includeName;
1817 t << "</includedby>\n";
1818 }
1819
1820 DotInclDepGraph incDepGraph(fd,FALSE);
1821 if (!incDepGraph.isTrivial())
1822 {
1823 t << " <incdepgraph>\n";
1824 incDepGraph.writeXML(t);
1825 t << " </incdepgraph>\n";
1826 }
1827
1828 DotInclDepGraph invIncDepGraph(fd,TRUE);
1829 if (!invIncDepGraph.isTrivial())
1830 {
1831 t << " <invincdepgraph>\n";
1832 invIncDepGraph.writeXML(t);
1833 t << " </invincdepgraph>\n";
1834 }
1835
1839
1840 for (const auto &mg : fd->getMemberGroups())
1841 {
1842 generateXMLSection(fd,ti,t,&mg->members(),"user-defined",mg->header(),
1843 mg->documentation());
1844 }
1845
1846 for (const auto &ml : fd->getMemberLists())
1847 {
1848 if (ml->listType().isDeclaration())
1849 {
1850 generateXMLSection(fd,ti,t,ml.get(),ml->listType().toXML());
1851 }
1852 }
1853
1854 t << " <briefdescription>\n";
1855 writeXMLDocBlock(t,fd->briefFile(),fd->briefLine(),fd,nullptr,fd->briefDescription());
1856 t << " </briefdescription>\n";
1857 t << " <detaileddescription>\n";
1858 writeXMLDocBlock(t,fd->docFile(),fd->docLine(),fd,nullptr,fd->documentation());
1859 t << " </detaileddescription>\n";
1860 if (Config_getBool(XML_PROGRAMLISTING))
1861 {
1862 writeXMLCodeBlock(t,fd);
1863 }
1864 t << " <location file=\"" << convertToXML(stripFromPath(fd->getDefFileName())) << "\"/>\n";
1865 t << " </compounddef>\n";
1866 t << "</doxygen>\n";
1867
1868 ti << " </compound>\n";
1869}
Representation of an include dependency graph.
virtual const NamespaceLinkedRefMap & getNamespaces() const =0
virtual const MemberGroupList & getMemberGroups() const =0
virtual const ClassLinkedRefMap & getClasses() const =0
virtual const IncludeInfoList & includeFileList() const =0
virtual const MemberLists & getMemberLists() const =0
virtual const ConceptLinkedRefMap & getConcepts() const =0
virtual const IncludeInfoList & includedByFileList() const =0
#define Config_getBool(name)
Definition config.h:33
constexpr uint32_t IncludeKind_LocalMask
Definition filedef.h:63
static void writeInnerConcepts(const ConceptLinkedRefMap &cl, TextStream &t)
Definition xmlgen.cpp:1292
void writeXMLCodeBlock(TextStream &t, FileDef *fd)
Definition xmlgen.cpp:475
static void writeInnerNamespaces(const NamespaceLinkedRefMap &nl, TextStream &t)
Definition xmlgen.cpp:1316

References Definition::briefDescription(), Definition::briefFile(), Definition::briefLine(), Config_getBool, Config_getString, convertToXML(), Definition::docFile(), Definition::docLine(), Definition::documentation(), err, FALSE, generateXMLSection(), FileDef::getClasses(), FileDef::getConcepts(), Definition::getDefFileName(), Definition::getLanguage(), FileDef::getMemberGroups(), FileDef::getMemberLists(), FileDef::getNamespaces(), Definition::getOutputFileBase(), FileDef::includedByFileList(), FileDef::includeFileList(), IncludeKind_LocalMask, MemberListType::isDeclaration(), Definition::isReference(), DotInclDepGraph::isTrivial(), langToString(), MemberList::listType(), Definition::name(), Portable::openOutputStream(), stripFromPath(), MemberListType::toXML(), TRUE, writeInnerClasses(), writeInnerConcepts(), writeInnerNamespaces(), DotInclDepGraph::writeXML(), writeXMLCodeBlock(), writeXMLDocBlock(), writeXMLHeader(), and writeXMLString().

Referenced by generateXML().

◆ generateXMLForGroup()

void generateXMLForGroup ( const GroupDef * gd,
TextStream & ti )
static

Definition at line 1871 of file xmlgen.cpp.

1872{
1873 // + members
1874 // + member groups
1875 // + files
1876 // + classes
1877 // + namespaces
1878 // - packages
1879 // + pages
1880 // + child groups
1881 // - examples
1882 // + brief description
1883 // + detailed description
1884
1885 if (gd->isReference()) return; // skip external references
1886
1887 ti << " <compound refid=\"" << gd->getOutputFileBase()
1888 << "\" kind=\"group\"><name>" << convertToXML(gd->name()) << "</name>\n";
1889
1890 QCString outputDirectory = Config_getString(XML_OUTPUT);
1891 QCString fileName=outputDirectory+"/"+gd->getOutputFileBase()+".xml";
1892 std::ofstream f = Portable::openOutputStream(fileName);
1893 if (!f.is_open())
1894 {
1895 err("Cannot open file {} for writing!\n",fileName);
1896 return;
1897 }
1898 TextStream t(&f);
1899
1900 writeXMLHeader(t);
1901 t << " <compounddef id=\""
1902 << gd->getOutputFileBase() << "\" kind=\"group\">\n";
1903 t << " <compoundname>" << convertToXML(gd->name()) << "</compoundname>\n";
1904 t << " <title>" << convertToXML(gd->groupTitle()) << "</title>\n";
1905
1907 writeInnerFiles(gd->getFiles(),t);
1911 writeInnerPages(gd->getPages(),t);
1913
1914 for (const auto &mg : gd->getMemberGroups())
1915 {
1916 generateXMLSection(gd,ti,t,&mg->members(),"user-defined",mg->header(),
1917 mg->documentation());
1918 }
1919
1920 for (const auto &ml : gd->getMemberLists())
1921 {
1922 if (ml->listType().isDeclaration())
1923 {
1924 generateXMLSection(gd,ti,t,ml.get(),ml->listType().toXML());
1925 }
1926 }
1927
1928 t << " <briefdescription>\n";
1929 writeXMLDocBlock(t,gd->briefFile(),gd->briefLine(),gd,nullptr,gd->briefDescription());
1930 t << " </briefdescription>\n";
1931 t << " <detaileddescription>\n";
1932 writeXMLDocBlock(t,gd->docFile(),gd->docLine(),gd,nullptr,gd->documentation());
1933 t << " </detaileddescription>\n";
1934 t << " </compounddef>\n";
1935 t << "</doxygen>\n";
1936
1937 ti << " </compound>\n";
1938}
virtual const GroupList & getSubGroups() const =0
virtual QCString groupTitle() const =0
virtual const FileList & getFiles() const =0
virtual const MemberLists & getMemberLists() const =0
virtual const MemberGroupList & getMemberGroups() const =0
virtual const ConceptLinkedRefMap & getConcepts() const =0
virtual const PageLinkedRefMap & getPages() const =0
virtual const NamespaceLinkedRefMap & getNamespaces() const =0
virtual const ClassLinkedRefMap & getClasses() const =0
virtual const ModuleLinkedRefMap & getModules() const =0
static void writeInnerGroups(const GroupList &gl, TextStream &t)
Definition xmlgen.cpp:1373
static void writeInnerPages(const PageLinkedRefMap &pl, TextStream &t)
Definition xmlgen.cpp:1360
static void writeInnerModules(const ModuleLinkedRefMap &ml, TextStream &t)
Definition xmlgen.cpp:1304

References Definition::briefDescription(), Definition::briefFile(), Definition::briefLine(), Config_getString, convertToXML(), Definition::docFile(), Definition::docLine(), Definition::documentation(), err, generateXMLSection(), GroupDef::getClasses(), GroupDef::getConcepts(), GroupDef::getFiles(), GroupDef::getMemberGroups(), GroupDef::getMemberLists(), GroupDef::getModules(), GroupDef::getNamespaces(), Definition::getOutputFileBase(), GroupDef::getPages(), GroupDef::getSubGroups(), GroupDef::groupTitle(), MemberListType::isDeclaration(), Definition::isReference(), MemberList::listType(), Definition::name(), Portable::openOutputStream(), MemberListType::toXML(), writeInnerClasses(), writeInnerConcepts(), writeInnerFiles(), writeInnerGroups(), writeInnerModules(), writeInnerNamespaces(), writeInnerPages(), writeXMLDocBlock(), and writeXMLHeader().

Referenced by generateXML().

◆ generateXMLForMember()

void generateXMLForMember ( const MemberDef * md,
TextStream & ti,
TextStream & t,
const Definition * def )
static

Definition at line 630 of file xmlgen.cpp.

631{
632
633 // + declaration/definition arg lists
634 // + reimplements
635 // + reimplementedBy
636 // + exceptions
637 // + const/volatile specifiers
638 // - examples
639 // + source definition
640 // + source references
641 // + source referenced by
642 // - body code
643 // + template arguments
644 // (templateArguments(), definitionTemplateParameterLists())
645 // - call graph
646
647 // enum values are written as part of the enum
648 if (md->memberType()==MemberType::EnumValue) return;
649 if (md->isHidden()) return;
650
651 // group members are only visible in their group
652 bool groupMember = md->getGroupDef() && def->definitionType()!=Definition::TypeGroup;
653
654 QCString memType;
655 bool isFunc=FALSE;
656 switch (md->memberType())
657 {
658 case MemberType::Define: memType="define"; break;
659 case MemberType::Function: memType="function"; isFunc=TRUE; break;
660 case MemberType::Variable: memType="variable"; break;
661 case MemberType::Typedef: memType="typedef"; break;
662 case MemberType::Enumeration: memType="enum"; break;
663 case MemberType::EnumValue: ASSERT(0); break;
664 case MemberType::Signal: memType="signal"; isFunc=TRUE; break;
665 case MemberType::Slot: memType="slot"; isFunc=TRUE; break;
666 case MemberType::Friend: memType="friend"; isFunc=TRUE; break;
667 case MemberType::DCOP: memType="dcop"; isFunc=TRUE; break;
668 case MemberType::Property: memType="property"; break;
669 case MemberType::Event: memType="event"; break;
670 case MemberType::Interface: memType="interface"; break;
671 case MemberType::Service: memType="service"; break;
672 case MemberType::Sequence: memType="sequence"; break;
673 case MemberType::Dictionary: memType="dictionary"; break;
674 }
675
676 QCString nameStr = md->name();
677 QCString typeStr = md->typeString();
678 QCString argsStr = md->argsString();
679 QCString defStr = md->definition();
680 defStr.stripPrefix("constexpr ");
681 defStr.stripPrefix("consteval ");
682 defStr.stripPrefix("constinit ");
683 stripAnonymousMarkers(typeStr);
684 stripQualifiers(typeStr);
685 if (typeStr=="auto")
686 {
687 int i=argsStr.findRev("->");
688 if (i!=-1) // move trailing return type into type and strip it from argsStr
689 {
690 typeStr=argsStr.mid(i+2).stripWhiteSpace();
691 argsStr=argsStr.left(i).stripWhiteSpace();
692 i=defStr.find("auto ");
693 if (i!=-1)
694 {
695 defStr=defStr.left(i)+typeStr+defStr.mid(i+4);
696 }
697 }
698 }
699 QCString noExceptExpr = extractNoExcept(argsStr);
700
701 stripAnonymousMarkers(nameStr);
702 ti << " <member refid=\"" << memberOutputFileBase(md)
703 << "_1" << md->anchor() << "\" kind=\"" << memType << "\"><name>"
704 << convertToXML(nameStr) << "</name></member>\n";
705
706 if (groupMember)
707 {
708 t << " <member refid=\""
710 << "_1" << md->anchor() << "\" kind=\"" << memType << "\"><name>"
711 << convertToXML(nameStr) << "</name></member>\n";
712 return;
713 }
714 else
715 {
716 t << " <memberdef kind=\"";
717 t << memType << "\" id=\"";
718 t << memberOutputFileBase(md);
719 t << "_1" // encoded ':' character (see util.cpp:convertNameToFile)
720 << md->anchor();
721 }
722 //enum { define_t,variable_t,typedef_t,enum_t,function_t } xmlType = function_t;
723
724 t << "\" prot=\"" << to_string_lower(md->protection());
725 t << "\"";
726
727 t << " static=\"";
728 if (md->isStatic()) t << "yes"; else t << "no";
729 t << "\"";
730
731 if (md->isNoDiscard())
732 {
733 t << " nodiscard=\"yes\"";
734 }
735
736 if (md->isConstExpr())
737 {
738 t << " constexpr=\"yes\"";
739 }
740
741 if (md->isConstEval())
742 {
743 t << " consteval=\"yes\"";
744 }
745
746 if (md->isConstInit())
747 {
748 t << " constinit=\"yes\"";
749 }
750
751 if (md->isExternal())
752 {
753 t << " extern=\"yes\"";
754 }
755
756 if (isFunc)
757 {
758 const ArgumentList &al = md->argumentList();
759 t << " const=\"";
760 if (al.constSpecifier()) t << "yes"; else t << "no";
761 t << "\"";
762
763 t << " explicit=\"";
764 if (md->isExplicit()) t << "yes"; else t << "no";
765 t << "\"";
766
767 t << " inline=\"";
768 if (md->isInline()) t << "yes"; else t << "no";
769 t << "\"";
770
772 {
773 t << " refqual=\"";
774 if (al.refQualifier()==RefQualifierType::LValue) t << "lvalue"; else t << "rvalue";
775 t << "\"";
776 }
777
778 if (md->isFinal())
779 {
780 t << " final=\"yes\"";
781 }
782
783 if (md->isSealed())
784 {
785 t << " sealed=\"yes\"";
786 }
787
788 if (md->isNew())
789 {
790 t << " new=\"yes\"";
791 }
792
793 if (md->isOptional())
794 {
795 t << " optional=\"yes\"";
796 }
797
798 if (md->isRequired())
799 {
800 t << " required=\"yes\"";
801 }
802
803 if (md->isNoExcept())
804 {
805 t << " noexcept=\"yes\"";
806 }
807
808 if (!noExceptExpr.isEmpty())
809 {
810 t << " noexceptexpression=\"" << convertToXML(noExceptExpr) << "\"";
811 }
812
813 if (al.volatileSpecifier())
814 {
815 t << " volatile=\"yes\"";
816 }
817
818 t << " virt=\"" << to_string_lower(md->virtualness());
819 t << "\"";
820 }
821
823 {
824 t << " strong=\"";
825 if (md->isStrong()) t << "yes"; else t << "no";
826 t << "\"";
827 }
828
829 if (md->memberType() == MemberType::Variable)
830 {
831 //ArgumentList *al = md->argumentList();
832 //t << " volatile=\"";
833 //if (al && al->volatileSpecifier) t << "yes"; else t << "no";
834
835 t << " mutable=\"";
836 if (md->isMutable()) t << "yes"; else t << "no";
837 t << "\"";
838
839 if (md->isInitonly())
840 {
841 t << " initonly=\"yes\"";
842 }
843 if (md->isAttribute())
844 {
845 t << " attribute=\"yes\"";
846 }
847 if (md->isUNOProperty())
848 {
849 t << " property=\"yes\"";
850 }
851 if (md->isReadonly())
852 {
853 t << " readonly=\"yes\"";
854 }
855 if (md->isBound())
856 {
857 t << " bound=\"yes\"";
858 }
859 if (md->isRemovable())
860 {
861 t << " removable=\"yes\"";
862 }
863 if (md->isConstrained())
864 {
865 t << " constrained=\"yes\"";
866 }
867 if (md->isTransient())
868 {
869 t << " transient=\"yes\"";
870 }
871 if (md->isMaybeVoid())
872 {
873 t << " maybevoid=\"yes\"";
874 }
875 if (md->isMaybeDefault())
876 {
877 t << " maybedefault=\"yes\"";
878 }
879 if (md->isMaybeAmbiguous())
880 {
881 t << " maybeambiguous=\"yes\"";
882 }
883 }
884 else if (md->memberType() == MemberType::Property)
885 {
886 t << " readable=\"";
887 if (md->isReadable()) t << "yes"; else t << "no";
888 t << "\"";
889
890 t << " writable=\"";
891 if (md->isWritable()) t << "yes"; else t << "no";
892 t << "\"";
893
894 t << " gettable=\"";
895 if (md->isGettable()) t << "yes"; else t << "no";
896 t << "\"";
897
898 t << " privategettable=\"";
899 if (md->isPrivateGettable()) t << "yes"; else t << "no";
900 t << "\"";
901
902 t << " protectedgettable=\"";
903 if (md->isProtectedGettable()) t << "yes"; else t << "no";
904 t << "\"";
905
906 t << " settable=\"";
907 if (md->isSettable()) t << "yes"; else t << "no";
908 t << "\"";
909
910 t << " privatesettable=\"";
911 if (md->isPrivateSettable()) t << "yes"; else t << "no";
912 t << "\"";
913
914 t << " protectedsettable=\"";
915 if (md->isProtectedSettable()) t << "yes"; else t << "no";
916 t << "\"";
917
918 if (md->isAssign() || md->isCopy() || md->isRetain() || md->isStrong() || md->isWeak())
919 {
920 t << " accessor=\"";
921 if (md->isAssign()) t << "assign";
922 else if (md->isCopy()) t << "copy";
923 else if (md->isRetain()) t << "retain";
924 else if (md->isStrong()) t << "strong";
925 else if (md->isWeak()) t << "weak";
926 t << "\"";
927 }
928 }
929 else if (md->memberType() == MemberType::Event)
930 {
931 t << " add=\"";
932 if (md->isAddable()) t << "yes"; else t << "no";
933 t << "\"";
934
935 t << " remove=\"";
936 if (md->isRemovable()) t << "yes"; else t << "no";
937 t << "\"";
938
939 t << " raise=\"";
940 if (md->isRaisable()) t << "yes"; else t << "no";
941 t << "\"";
942 }
943
944 t << ">\n";
945
946 if (md->memberType()!=MemberType::Define &&
948 )
949 {
951 t << " <type>";
952 linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md,typeStr);
953 t << "</type>\n";
954 if (md->isTypeAlias())
955 {
956 defStr+=" = "+md->initializer();
957 }
958 stripAnonymousMarkers(defStr);
959 t << " <definition>" << convertToXML(defStr) << "</definition>\n";
960 t << " <argsstring>" << convertToXML(argsStr) << "</argsstring>\n";
961 }
962
964 {
965 t << " <type>";
967 t << "</type>\n";
968 }
969
970 QCString qualifiedNameStr = md->qualifiedName();
971 stripAnonymousMarkers(qualifiedNameStr);
972 t << " <name>" << convertToXML(nameStr) << "</name>\n";
973 if (nameStr!=qualifiedNameStr)
974 {
975 t << " <qualifiedname>" << convertToXML(qualifiedNameStr) << "</qualifiedname>\n";
976 }
977
978 if (md->memberType() == MemberType::Property)
979 {
980 if (md->isReadable())
981 t << " <read>" << convertToXML(md->getReadAccessor()) << "</read>\n";
982 if (md->isWritable())
983 t << " <write>" << convertToXML(md->getWriteAccessor()) << "</write>\n";
984 }
985
987 {
988 QCString bitfield = md->bitfieldString();
989 if (bitfield.at(0)==':') bitfield=bitfield.mid(1);
990 t << " <bitfield>" << convertToXML(bitfield) << "</bitfield>\n";
991 }
992
993 const MemberDef *rmd = md->reimplements();
994 if (rmd)
995 {
996 t << " <reimplements refid=\""
997 << memberOutputFileBase(rmd) << "_1" << rmd->anchor() << "\">"
998 << convertToXML(rmd->name()) << "</reimplements>\n";
999 }
1000 for (const auto &rbmd : md->reimplementedBy())
1001 {
1002 t << " <reimplementedby refid=\""
1003 << memberOutputFileBase(rbmd) << "_1" << rbmd->anchor() << "\">"
1004 << convertToXML(rbmd->name()) << "</reimplementedby>\n";
1005 }
1006
1007 for (const auto &qmd : md->getQualifiers())
1008 {
1009 t << " <qualifier>" << convertToXML(qmd.c_str()) << "</qualifier>\n";
1010 }
1011
1012 if (md->isFriendClass()) // for friend classes we show a link to the class as a "parameter"
1013 {
1014 t << " <param>\n";
1015 t << " <type>";
1016 linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md,nameStr);
1017 t << "</type>\n";
1018 t << " </param>\n";
1019 }
1020 else if (isFunc) //function
1021 {
1022 const ArgumentList &declAl = md->declArgumentList();
1023 const ArgumentList &defAl = md->argumentList();
1024 bool isFortran = md->getLanguage()==SrcLangExt::Fortran;
1025 if (declAl.hasParameters())
1026 {
1027 auto defIt = defAl.begin();
1028 for (const Argument &a : declAl)
1029 {
1030 //const Argument *defArg = defAli.current();
1031 const Argument *defArg = nullptr;
1032 if (defIt!=defAl.end())
1033 {
1034 defArg = &(*defIt);
1035 ++defIt;
1036 }
1037 t << " <param>\n";
1038 if (!a.attrib.isEmpty())
1039 {
1040 t << " <attributes>";
1041 writeXMLString(t,a.attrib);
1042 t << "</attributes>\n";
1043 }
1044 if (isFortran && defArg && !defArg->type.isEmpty())
1045 {
1046 t << " <type>";
1047 linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md,defArg->type);
1048 t << "</type>\n";
1049 }
1050 else if (!a.type.isEmpty())
1051 {
1052 t << " <type>";
1053 linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md,a.type);
1054 t << "</type>\n";
1055 }
1056 if (!a.name.isEmpty())
1057 {
1058 t << " <declname>";
1059 writeXMLString(t,a.name);
1060 t << "</declname>\n";
1061 }
1062 if (defArg && !defArg->name.isEmpty() && defArg->name!=a.name)
1063 {
1064 t << " <defname>";
1065 writeXMLString(t,defArg->name);
1066 t << "</defname>\n";
1067 }
1068 if (!a.array.isEmpty())
1069 {
1070 t << " <array>";
1071 writeXMLString(t,a.array);
1072 t << "</array>\n";
1073 }
1074 if (!a.defval.isEmpty())
1075 {
1076 t << " <defval>";
1077 linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md,a.defval);
1078 t << "</defval>\n";
1079 }
1080 if (defArg && defArg->hasDocumentation())
1081 {
1082 t << " <briefdescription>";
1084 md->getOuterScope(),md,defArg->docs);
1085 t << "</briefdescription>\n";
1086 }
1087 t << " </param>\n";
1088 }
1089 }
1090 }
1091 else if (md->memberType()==MemberType::Define &&
1092 !md->argsString().isEmpty()) // define
1093 {
1094 if (md->argumentList().empty()) // special case for "foo()" to
1095 // distinguish it from "foo".
1096 {
1097 t << " <param></param>\n";
1098 }
1099 else
1100 {
1101 for (const Argument &a : md->argumentList())
1102 {
1103 t << " <param><defname>" << a.type << "</defname></param>\n";
1104 }
1105 }
1106 }
1107 if (!md->requiresClause().isEmpty())
1108 {
1109 t << " <requiresclause>";
1111 t << " </requiresclause>\n";
1112 }
1113
1114 if (!md->isTypeAlias() && (md->hasOneLineInitializer() || md->hasMultiLineInitializer()))
1115 {
1116 t << " <initializer>";
1118 t << "</initializer>\n";
1119 }
1120
1121 if (!md->excpString().isEmpty())
1122 {
1123 t << " <exceptions>";
1125 t << "</exceptions>\n";
1126 }
1127
1128 if (md->memberType()==MemberType::Enumeration) // enum
1129 {
1130 for (const auto &emd : md->enumFieldList())
1131 {
1132 ti << " <member refid=\"" << memberOutputFileBase(md)
1133 << "_1" << emd->anchor() << "\" kind=\"enumvalue\"><name>"
1134 << convertToXML(emd->name()) << "</name></member>\n";
1135
1136 t << " <enumvalue id=\"" << memberOutputFileBase(md) << "_1"
1137 << emd->anchor() << "\" prot=\"" << to_string_lower(emd->protection());
1138 t << "\">\n";
1139 t << " <name>";
1140 writeXMLString(t,emd->name());
1141 t << "</name>\n";
1142 if (!emd->initializer().isEmpty())
1143 {
1144 t << " <initializer>";
1145 writeXMLString(t,emd->initializer());
1146 t << "</initializer>\n";
1147 }
1148 t << " <briefdescription>\n";
1149 writeXMLDocBlock(t,emd->briefFile(),emd->briefLine(),emd->getOuterScope(),emd,emd->briefDescription());
1150 t << " </briefdescription>\n";
1151 t << " <detaileddescription>\n";
1152 writeXMLDocBlock(t,emd->docFile(),emd->docLine(),emd->getOuterScope(),emd,emd->documentation());
1153 t << " </detaileddescription>\n";
1154 t << " </enumvalue>\n";
1155 }
1156 }
1157 t << " <briefdescription>\n";
1159 t << " </briefdescription>\n";
1160 t << " <detaileddescription>\n";
1161 writeXMLDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
1162 t << " </detaileddescription>\n";
1163 t << " <inbodydescription>\n";
1165 t << " </inbodydescription>\n";
1166 if (md->getDefLine()!=-1)
1167 {
1168 t << " <location file=\""
1169 << convertToXML(stripFromPath(md->getDefFileName())) << "\" line=\""
1170 << md->getDefLine() << "\" column=\""
1171 << md->getDefColumn() << "\"" ;
1172 if (md->getStartBodyLine()!=-1)
1173 {
1174 const FileDef *bodyDef = md->getBodyDef();
1175 if (bodyDef)
1176 {
1177 t << " bodyfile=\"" << convertToXML(stripFromPath(bodyDef->absFilePath())) << "\"";
1178 }
1179 t << " bodystart=\"" << md->getStartBodyLine() << "\" bodyend=\""
1180 << md->getEndBodyLine() << "\"";
1181 }
1182 if (md->getDeclLine()!=-1)
1183 {
1184 t << " declfile=\"" << convertToXML(stripFromPath(md->getDeclFileName())) << "\" declline=\""
1185 << md->getDeclLine() << "\" declcolumn=\""
1186 << md->getDeclColumn() << "\"";
1187 }
1188 t << "/>\n";
1189 }
1190
1191 //printf("md->getReferencesMembers()=%p\n",md->getReferencesMembers());
1192 auto refList = md->getReferencesMembers();
1193 for (const auto &refmd : refList)
1194 {
1195 writeMemberReference(t,def,refmd,"references");
1196 }
1197 auto refByList = md->getReferencedByMembers();
1198 for (const auto &refmd : refByList)
1199 {
1200 writeMemberReference(t,def,refmd,"referencedby");
1201 }
1202
1203 t << " </memberdef>\n";
1204}
This class represents an function or template argument list.
Definition arguments.h:65
RefQualifierType refQualifier() const
Definition arguments.h:116
iterator end()
Definition arguments.h:94
bool hasParameters() const
Definition arguments.h:76
bool constSpecifier() const
Definition arguments.h:111
bool empty() const
Definition arguments.h:99
iterator begin()
Definition arguments.h:93
bool volatileSpecifier() const
Definition arguments.h:112
virtual DefType definitionType() const =0
virtual QCString anchor() const =0
virtual int inbodyLine() const =0
virtual QCString qualifiedName() const =0
virtual Definition * getOuterScope() const =0
virtual const MemberVector & getReferencedByMembers() const =0
virtual const MemberVector & getReferencesMembers() const =0
virtual QCString inbodyDocumentation() const =0
A model of a class/file/namespace member symbol.
Definition memberdef.h:48
virtual QCString typeString() const =0
virtual bool isConstExpr() const =0
virtual bool isConstEval() const =0
virtual bool isInitonly() const =0
virtual bool isNoExcept() const =0
virtual QCString requiresClause() const =0
virtual bool isAssign() const =0
virtual bool isExplicit() const =0
virtual bool isNew() const =0
virtual bool isMaybeVoid() const =0
virtual bool isSealed() const =0
virtual QCString definition() const =0
virtual QCString enumBaseType() const =0
virtual bool isConstInit() const =0
virtual QCString excpString() const =0
virtual GroupDef * getGroupDef()=0
virtual bool isSettable() const =0
virtual bool isRetain() const =0
virtual bool isAddable() const =0
virtual const MemberVector & enumFieldList() const =0
virtual const FileDef * getFileDef() const =0
virtual bool isInline() const =0
virtual const ArgumentList & argumentList() const =0
virtual bool isWritable() const =0
virtual bool isMaybeAmbiguous() const =0
virtual bool isPrivateGettable() const =0
virtual const MemberVector & reimplementedBy() const =0
virtual bool isRequired() const =0
virtual bool isAttribute() const =0
virtual bool isExternal() const =0
virtual bool isCopy() const =0
virtual int getDeclLine() const =0
virtual bool isTypeAlias() const =0
virtual int getDeclColumn() const =0
virtual bool isStatic() const =0
virtual const MemberDef * reimplements() const =0
virtual bool isMaybeDefault() const =0
virtual QCString getWriteAccessor() const =0
virtual bool isPrivateSettable() const =0
virtual StringVector getQualifiers() const =0
virtual QCString bitfieldString() const =0
virtual bool isRaisable() const =0
virtual bool isRemovable() const =0
virtual bool isConstrained() const =0
virtual bool isReadonly() const =0
virtual bool isBound() const =0
virtual QCString getDeclFileName() const =0
virtual bool isProtectedSettable() const =0
virtual bool isProtectedGettable() const =0
virtual bool hasOneLineInitializer() const =0
virtual bool isTransient() const =0
virtual bool hasMultiLineInitializer() const =0
virtual Protection protection() const =0
virtual bool isOptional() const =0
virtual QCString getReadAccessor() const =0
virtual bool isGettable() const =0
virtual MemberType memberType() const =0
virtual bool isReadable() const =0
virtual bool isWeak() const =0
virtual bool isNoDiscard() const =0
virtual bool isStrong() const =0
virtual QCString argsString() const =0
virtual Specifier virtualness(int count=0) const =0
virtual bool isUNOProperty() const =0
virtual bool isFinal() const =0
virtual const ArgumentList & declArgumentList() const =0
virtual bool isMutable() const =0
virtual bool isFriendClass() const =0
virtual const QCString & initializer() const =0
char & at(size_t i)
Returns a reference to the character at index i.
Definition qcstring.h:578
int findRev(char c, int index=-1, bool cs=TRUE) const
Definition qcstring.cpp:91
bool stripPrefix(const QCString &prefix)
Definition qcstring.h:198
This class contains the information about the argument of a function or template.
Definition arguments.h:27
QCString type
Definition arguments.h:42
QCString name
Definition arguments.h:44
QCString docs
Definition arguments.h:47
bool hasDocumentation() const
Definition arguments.h:31
@ Enumeration
Definition types.h:557
@ EnumValue
Definition types.h:558
@ Dictionary
Definition types.h:568
@ Interface
Definition types.h:565
@ Sequence
Definition types.h:567
@ Variable
Definition types.h:555
@ Property
Definition types.h:563
@ Typedef
Definition types.h:556
@ Function
Definition types.h:554
@ Service
Definition types.h:566
static void writeMemberReference(TextStream &t, const Definition *def, const MemberDef *rmd, const QCString &tagName)
Definition xmlgen.cpp:501
static QCString memberOutputFileBase(const MemberDef *md)
Definition xmlgen.cpp:576
static void writeMemberTemplateLists(const MemberDef *md, TextStream &t)
Definition xmlgen.cpp:432
static void stripQualifiers(QCString &typeStr)
Definition xmlgen.cpp:551
static QCString extractNoExcept(QCString &argsStr)
Definition xmlgen.cpp:586

References FileDef::absFilePath(), Definition::anchor(), MemberDef::argsString(), MemberDef::argumentList(), ASSERT, QCString::at(), ArgumentList::begin(), MemberDef::bitfieldString(), Definition::briefDescription(), Definition::briefFile(), Definition::briefLine(), ArgumentList::constSpecifier(), convertToXML(), DCOP, MemberDef::declArgumentList(), Define, MemberDef::definition(), Definition::definitionType(), Dictionary, Definition::docFile(), Definition::docLine(), Argument::docs, Definition::documentation(), ArgumentList::empty(), ArgumentList::end(), MemberDef::enumBaseType(), Enumeration, MemberDef::enumFieldList(), EnumValue, Event, MemberDef::excpString(), extractNoExcept(), FALSE, QCString::find(), QCString::findRev(), Friend, Function, Definition::getBodyDef(), MemberDef::getDeclColumn(), MemberDef::getDeclFileName(), MemberDef::getDeclLine(), Definition::getDefColumn(), Definition::getDefFileName(), Definition::getDefLine(), Definition::getEndBodyLine(), MemberDef::getFileDef(), MemberDef::getGroupDef(), Definition::getLanguage(), Definition::getOuterScope(), Definition::getOutputFileBase(), MemberDef::getQualifiers(), MemberDef::getReadAccessor(), Definition::getReferencedByMembers(), Definition::getReferencesMembers(), Definition::getStartBodyLine(), MemberDef::getWriteAccessor(), Argument::hasDocumentation(), MemberDef::hasMultiLineInitializer(), MemberDef::hasOneLineInitializer(), ArgumentList::hasParameters(), Definition::inbodyDocumentation(), Definition::inbodyLine(), MemberDef::initializer(), Interface, MemberDef::isAddable(), MemberDef::isAssign(), MemberDef::isAttribute(), MemberDef::isBound(), MemberDef::isConstEval(), MemberDef::isConstExpr(), MemberDef::isConstInit(), MemberDef::isConstrained(), MemberDef::isCopy(), QCString::isEmpty(), MemberDef::isExplicit(), MemberDef::isExternal(), MemberDef::isFinal(), MemberDef::isFriendClass(), MemberDef::isGettable(), Definition::isHidden(), MemberDef::isInitonly(), MemberDef::isInline(), MemberDef::isMaybeAmbiguous(), MemberDef::isMaybeDefault(), MemberDef::isMaybeVoid(), MemberDef::isMutable(), MemberDef::isNew(), MemberDef::isNoDiscard(), MemberDef::isNoExcept(), MemberDef::isOptional(), MemberDef::isPrivateGettable(), MemberDef::isPrivateSettable(), MemberDef::isProtectedGettable(), MemberDef::isProtectedSettable(), MemberDef::isRaisable(), MemberDef::isReadable(), MemberDef::isReadonly(), MemberDef::isRemovable(), MemberDef::isRequired(), MemberDef::isRetain(), MemberDef::isSealed(), MemberDef::isSettable(), MemberDef::isStatic(), MemberDef::isStrong(), MemberDef::isTransient(), MemberDef::isTypeAlias(), MemberDef::isUNOProperty(), MemberDef::isWeak(), MemberDef::isWritable(), QCString::left(), linkifyText(), LValue, memberOutputFileBase(), MemberDef::memberType(), QCString::mid(), Argument::name, Definition::name(), None, Property, MemberDef::protection(), Definition::qualifiedName(), ArgumentList::refQualifier(), MemberDef::reimplementedBy(), MemberDef::reimplements(), MemberDef::requiresClause(), Sequence, Service, Signal, Slot, stripAnonymousMarkers(), stripFromPath(), QCString::stripPrefix(), stripQualifiers(), QCString::stripWhiteSpace(), to_string_lower(), TRUE, Argument::type, Typedef, Definition::TypeGroup, MemberDef::typeString(), Variable, MemberDef::virtualness(), ArgumentList::volatileSpecifier(), writeMemberReference(), writeMemberTemplateLists(), writeXMLDocBlock(), and writeXMLString().

Referenced by generateXMLSection().

◆ generateXMLForModule()

void generateXMLForModule ( const ModuleDef * mod,
TextStream & ti )
static

Definition at line 1628 of file xmlgen.cpp.

1629{
1630 if (mod->isReference() || mod->isHidden() || !mod->isPrimaryInterface()) return;
1631 ti << " <compound refid=\"" << mod->getOutputFileBase()
1632 << "\" kind=\"module\"" << "><name>"
1633 << convertToXML(mod->name()) << "</name>\n";
1634
1635 QCString outputDirectory = Config_getString(XML_OUTPUT);
1636 QCString fileName=outputDirectory+"/"+mod->getOutputFileBase()+".xml";
1637 std::ofstream f = Portable::openOutputStream(fileName);
1638 if (!f.is_open())
1639 {
1640 err("Cannot open file {} for writing!\n",fileName);
1641 return;
1642 }
1643 TextStream t(&f);
1644 writeXMLHeader(t);
1645 t << " <compounddef id=\"" << mod->getOutputFileBase()
1646 << "\" kind=\"module\">\n";
1647 t << " <compoundname>";
1648 writeXMLString(t,mod->name());
1649 t << "</compoundname>\n";
1650 writeInnerFiles(mod->getUsedFiles(),t);
1651 writeInnerClasses(mod->getClasses(),t);
1653 for (const auto &ml : mod->getMemberLists())
1654 {
1655 if (ml->listType().isDeclaration())
1656 {
1657 generateXMLSection(mod,ti,t,ml.get(),ml->listType().toXML());
1658 }
1659 }
1660 for (const auto &mg : mod->getMemberGroups())
1661 {
1662 generateXMLSection(mod,ti,t,&mg->members(),"user-defined",mg->header(),
1663 mg->documentation());
1664 }
1665 t << " <briefdescription>\n";
1666 writeXMLDocBlock(t,mod->briefFile(),mod->briefLine(),mod,nullptr,mod->briefDescription());
1667 t << " </briefdescription>\n";
1668 t << " <detaileddescription>\n";
1669 writeXMLDocBlock(t,mod->docFile(),mod->docLine(),mod,nullptr,mod->documentation());
1670 t << " </detaileddescription>\n";
1671 writeExports(mod->getExports(),t);
1672 t << " <location file=\""
1673 << convertToXML(stripFromPath(mod->getDefFileName())) << "\" line=\""
1674 << mod->getDefLine() << "\"" << " column=\""
1675 << mod->getDefColumn() << "\"/>\n" ;
1676 t << " </compounddef>\n";
1677 t << "</doxygen>\n";
1678
1679 ti << " </compound>\n";
1680
1681}
virtual const MemberGroupList & getMemberGroups() const =0
virtual bool isPrimaryInterface() const =0
virtual const MemberLists & getMemberLists() const =0
virtual FileList getUsedFiles() const =0
virtual const ImportInfoMap & getExports() const =0
virtual const ConceptLinkedRefMap & getConcepts() const =0
virtual const ClassLinkedRefMap & getClasses() const =0
static void writeExports(const ImportInfoMap &exportMap, TextStream &t)
Definition xmlgen.cpp:1329

References Definition::briefDescription(), Definition::briefFile(), Definition::briefLine(), Config_getString, convertToXML(), Definition::docFile(), Definition::docLine(), Definition::documentation(), err, generateXMLSection(), ModuleDef::getClasses(), ModuleDef::getConcepts(), Definition::getDefColumn(), Definition::getDefFileName(), Definition::getDefLine(), ModuleDef::getExports(), ModuleDef::getMemberGroups(), ModuleDef::getMemberLists(), Definition::getOutputFileBase(), ModuleDef::getUsedFiles(), MemberListType::isDeclaration(), Definition::isHidden(), ModuleDef::isPrimaryInterface(), Definition::isReference(), MemberList::listType(), Definition::name(), Portable::openOutputStream(), stripFromPath(), MemberListType::toXML(), writeExports(), writeInnerClasses(), writeInnerConcepts(), writeInnerFiles(), writeXMLDocBlock(), writeXMLHeader(), and writeXMLString().

Referenced by generateXML().

◆ generateXMLForNamespace()

void generateXMLForNamespace ( const NamespaceDef * nd,
TextStream & ti )
static

Definition at line 1683 of file xmlgen.cpp.

1684{
1685 // + contained class definitions
1686 // + contained namespace definitions
1687 // + member groups
1688 // + normal members
1689 // + brief desc
1690 // + detailed desc
1691 // + location
1692 // - files containing (parts of) the namespace definition
1693
1694 if (nd->isReference() || nd->isHidden()) return; // skip external references
1695
1696 ti << " <compound refid=\"" << nd->getOutputFileBase()
1697 << "\" kind=\"namespace\"" << "><name>"
1698 << convertToXML(nd->name()) << "</name>\n";
1699
1700 QCString outputDirectory = Config_getString(XML_OUTPUT);
1701 QCString fileName=outputDirectory+"/"+nd->getOutputFileBase()+".xml";
1702 std::ofstream f = Portable::openOutputStream(fileName);
1703 if (!f.is_open())
1704 {
1705 err("Cannot open file {} for writing!\n",fileName);
1706 return;
1707 }
1708 TextStream t(&f);
1709
1710 writeXMLHeader(t);
1711 t << " <compounddef id=\"" << nd->getOutputFileBase()
1712 << "\" kind=\"namespace\" "
1713 << (nd->isInline()?"inline=\"yes\" ":"")
1714 << "language=\""
1715 << langToString(nd->getLanguage()) << "\">\n";
1716 t << " <compoundname>";
1717 QCString nameStr = nd->name();
1718 stripAnonymousMarkers(nameStr);
1719 writeXMLString(t,nameStr);
1720 t << "</compoundname>\n";
1721
1725
1726 for (const auto &mg : nd->getMemberGroups())
1727 {
1728 generateXMLSection(nd,ti,t,&mg->members(),"user-defined",mg->header(),
1729 mg->documentation());
1730 }
1731
1732 for (const auto &ml : nd->getMemberLists())
1733 {
1734 if (ml->listType().isDeclaration())
1735 {
1736 generateXMLSection(nd,ti,t,ml.get(),ml->listType().toXML());
1737 }
1738 }
1739
1740 t << " <briefdescription>\n";
1741 writeXMLDocBlock(t,nd->briefFile(),nd->briefLine(),nd,nullptr,nd->briefDescription());
1742 t << " </briefdescription>\n";
1743 t << " <detaileddescription>\n";
1744 writeXMLDocBlock(t,nd->docFile(),nd->docLine(),nd,nullptr,nd->documentation());
1745 t << " </detaileddescription>\n";
1746 t << " <location file=\""
1747 << convertToXML(stripFromPath(nd->getDefFileName())) << "\" line=\""
1748 << nd->getDefLine() << "\"" << " column=\""
1749 << nd->getDefColumn() << "\"/>\n" ;
1750 t << " </compounddef>\n";
1751 t << "</doxygen>\n";
1752
1753 ti << " </compound>\n";
1754}
virtual ConceptLinkedRefMap getConcepts() const =0
virtual const MemberLists & getMemberLists() const =0
virtual NamespaceLinkedRefMap getNamespaces() const =0
virtual bool isInline() const =0
virtual ClassLinkedRefMap getClasses() const =0
virtual const MemberGroupList & getMemberGroups() const =0

References Definition::briefDescription(), Definition::briefFile(), Definition::briefLine(), Config_getString, convertToXML(), Definition::docFile(), Definition::docLine(), Definition::documentation(), err, generateXMLSection(), NamespaceDef::getClasses(), NamespaceDef::getConcepts(), Definition::getDefColumn(), Definition::getDefFileName(), Definition::getDefLine(), Definition::getLanguage(), NamespaceDef::getMemberGroups(), NamespaceDef::getMemberLists(), NamespaceDef::getNamespaces(), Definition::getOutputFileBase(), MemberListType::isDeclaration(), Definition::isHidden(), NamespaceDef::isInline(), Definition::isReference(), langToString(), MemberList::listType(), Definition::name(), Portable::openOutputStream(), stripAnonymousMarkers(), stripFromPath(), MemberListType::toXML(), writeInnerClasses(), writeInnerConcepts(), writeInnerNamespaces(), writeXMLDocBlock(), writeXMLHeader(), and writeXMLString().

Referenced by generateXML().

◆ generateXMLForPage()

void generateXMLForPage ( PageDef * pd,
TextStream & ti,
bool isExample )
static

Definition at line 1978 of file xmlgen.cpp.

1979{
1980 // + name
1981 // + title
1982 // + documentation
1983 // + location
1984
1985 const char *kindName = isExample ? "example" : "page";
1986
1987 if (pd->isReference()) return;
1988
1989 QCString pageName = pd->getOutputFileBase();
1990 if (pd->getGroupDef())
1991 {
1992 pageName+=QCString("_")+pd->name();
1993 }
1994 if (pageName=="index") pageName="indexpage"; // to prevent overwriting the generated index page.
1995
1996 ti << " <compound refid=\"" << pageName
1997 << "\" kind=\"" << kindName << "\"><name>" << convertToXML(pd->name())
1998 << "</name>\n";
1999
2000 QCString outputDirectory = Config_getString(XML_OUTPUT);
2001 QCString fileName=outputDirectory+"/"+pageName+".xml";
2002 std::ofstream f = Portable::openOutputStream(fileName);
2003 if (!f.is_open())
2004 {
2005 err("Cannot open file {} for writing!\n",fileName);
2006 return;
2007 }
2008 TextStream t(&f);
2009
2010 writeXMLHeader(t);
2011 t << " <compounddef id=\"" << pageName;
2012 t << "\" kind=\"" << kindName << "\">\n";
2013 t << " <compoundname>" << convertToXML(pd->name())
2014 << "</compoundname>\n";
2015
2016 if (pd==Doxygen::mainPage.get()) // main page is special
2017 {
2018 QCString title;
2019 if (mainPageHasTitle())
2020 {
2022 }
2023 else
2024 {
2025 title = Config_getString(PROJECT_NAME);
2026 }
2027 t << " <title>" << convertToXML(convertCharEntitiesToUTF8(title))
2028 << "</title>\n";
2029 }
2030 else
2031 {
2032 const SectionInfo *si = SectionManager::instance().find(pd->name());
2033 if (si)
2034 {
2035 t << " <title>" << convertToXML(filterTitle(convertCharEntitiesToUTF8(si->title())))
2036 << "</title>\n";
2037 }
2038 }
2040 const SectionRefs &sectionRefs = pd->getSectionRefs();
2041 if (pd->localToc().isXmlEnabled() && !sectionRefs.empty())
2042 {
2043 int level=1;
2044 int indent=0;
2045 auto writeIndent = [&]() { for (int i=0;i<4+indent*2;i++) t << " "; };
2046 auto incIndent = [&](const char *text) { writeIndent(); t << text << "\n"; indent++; };
2047 auto decIndent = [&](const char *text) { indent--; writeIndent(); t << text << "\n"; };
2048 incIndent("<tableofcontents>");
2049 int maxLevel = pd->localToc().xmlLevel();
2050 BoolVector inLi(maxLevel+1,false);
2051 for (const SectionInfo *si : sectionRefs)
2052 {
2053 if (si->type().isSection())
2054 {
2055 //printf(" level=%d title=%s\n",level,qPrint(si->title));
2056 int nextLevel = si->type().level();
2057 if (nextLevel>level)
2058 {
2059 for (int l=level;l<nextLevel;l++)
2060 {
2061 if (l < maxLevel) incIndent("<tableofcontents>");
2062 }
2063 }
2064 else if (nextLevel<level)
2065 {
2066 for (int l=level;l>nextLevel;l--)
2067 {
2068 if (l <= maxLevel && inLi[l]) decIndent("</tocsect>");
2069 inLi[l]=false;
2070 if (l <= maxLevel) decIndent("</tableofcontents>");
2071 }
2072 }
2073 if (nextLevel <= maxLevel)
2074 {
2075 if (inLi[nextLevel])
2076 {
2077 decIndent("</tocsect>");
2078 }
2079 else if (level>nextLevel)
2080 {
2081 decIndent("</tableofcontents>");
2082 incIndent("<tableofcontents>");
2083 }
2084 QCString titleDoc = convertToXML(si->title());
2085 QCString label = convertToXML(si->label());
2086 if (titleDoc.isEmpty()) titleDoc = label;
2087 incIndent("<tocsect>");
2088 writeIndent(); t << "<name>" << titleDoc << "</name>\n";
2089 writeIndent(); t << "<reference>" << convertToXML(pageName) << "_1" << label << "</reference>\n";
2090 inLi[nextLevel]=true;
2091 level = nextLevel;
2092 }
2093 }
2094 }
2095 while (level>1 && level <= maxLevel)
2096 {
2097 if (inLi[level]) decIndent("</tocsect>");
2098 inLi[level]=false;
2099 decIndent("</tableofcontents>");
2100 level--;
2101 }
2102 if (level <= maxLevel && inLi[level]) decIndent("</tocsect>");
2103 inLi[level]=false;
2104 decIndent("</tableofcontents>");
2105 }
2106 t << " <briefdescription>\n";
2107 writeXMLDocBlock(t,pd->briefFile(),pd->briefLine(),pd,nullptr,pd->briefDescription());
2108 t << " </briefdescription>\n";
2109 t << " <detaileddescription>\n";
2110 if (isExample)
2111 {
2112 writeXMLDocBlock(t,pd->docFile(),pd->docLine(),pd,nullptr,
2113 pd->documentation()+"\n\\include "+pd->name());
2114 }
2115 else
2116 {
2117 writeXMLDocBlock(t,pd->docFile(),pd->docLine(),pd,nullptr,
2118 pd->documentation());
2119 }
2120 t << " </detaileddescription>\n";
2121
2122 t << " <location file=\"" << convertToXML(stripFromPath(pd->getDefFileName())) << "\"/>\n";
2123
2124 t << " </compounddef>\n";
2125 t << "</doxygen>\n";
2126
2127 ti << " </compound>\n";
2128}
virtual const SectionRefs & getSectionRefs() const =0
returns the section dictionary, only of importance for pagedef
const T * find(const std::string &key) const
Definition linkedmap.h:47
bool isXmlEnabled() const
Definition types.h:617
int xmlLevel() const
Definition types.h:622
virtual const PageLinkedRefMap & getSubPages() const =0
virtual LocalToc localToc() const =0
virtual const GroupDef * getGroupDef() const =0
class that provide information about a section.
Definition section.h:57
QCString label() const
Definition section.h:68
QCString title() const
Definition section.h:69
SectionType type() const
Definition section.h:70
static SectionManager & instance()
returns a reference to the singleton
Definition section.h:175
class that represents a list of constant references to sections.
Definition section.h:102
bool empty() const
Definition section.h:124
constexpr bool isSection() const
Definition section.h:46
constexpr int level() const
Definition section.h:45
std::vector< bool > BoolVector
Definition containers.h:36
static void writeIndent(TextStream &t, int indent)
Definition qhp.cpp:37
bool mainPageHasTitle()
Definition util.cpp:6760
QCString filterTitle(const QCString &title)
Definition util.cpp:6086
QCString convertCharEntitiesToUTF8(const QCString &str)
Definition util.cpp:4553

References Definition::briefDescription(), Definition::briefFile(), Definition::briefLine(), Config_getString, convertCharEntitiesToUTF8(), convertToXML(), Definition::docFile(), Definition::docLine(), Definition::documentation(), SectionRefs::empty(), err, filterTitle(), LinkedMap< T, Hash, KeyEqual, Map >::find(), Definition::getDefFileName(), PageDef::getGroupDef(), Definition::getOutputFileBase(), Definition::getSectionRefs(), PageDef::getSubPages(), SectionManager::instance(), QCString::isEmpty(), Definition::isReference(), LocalToc::isXmlEnabled(), PageDef::localToc(), Doxygen::mainPage, mainPageHasTitle(), Definition::name(), Portable::openOutputStream(), stripFromPath(), SectionInfo::title(), writeIndent(), writeInnerPages(), writeXMLDocBlock(), writeXMLHeader(), and LocalToc::xmlLevel().

Referenced by generateXML().

◆ generateXMLSection()

void generateXMLSection ( const Definition * d,
TextStream & ti,
TextStream & t,
const MemberList * ml,
const QCString & kind,
const QCString & header = QCString(),
const QCString & documentation = QCString() )
static

Definition at line 1215 of file xmlgen.cpp.

1218{
1219 if (ml==nullptr) return;
1220 int count=0;
1221 for (const auto &md : *ml)
1222 {
1223 if (memberVisible(d,md) && (md->memberType()!=MemberType::EnumValue) &&
1224 !md->isHidden())
1225 {
1226 count++;
1227 }
1228 }
1229 if (count==0) return; // empty list
1230
1231 t << " <sectiondef kind=\"" << kind << "\">\n";
1232 if (!header.isEmpty())
1233 {
1234 t << " <header>" << convertToXML(header) << "</header>\n";
1235 }
1236 if (!documentation.isEmpty())
1237 {
1238 t << " <description>";
1239 writeXMLDocBlock(t,d->docFile(),d->docLine(),d,nullptr,documentation);
1240 t << "</description>\n";
1241 }
1242 for (const auto &md : *ml)
1243 {
1244 if (memberVisible(d,md))
1245 {
1246 generateXMLForMember(md,ti,t,d);
1247 }
1248 }
1249 t << " </sectiondef>\n";
1250}
static bool memberVisible(const Definition *d, const MemberDef *md)
Definition xmlgen.cpp:1208
static void generateXMLForMember(const MemberDef *md, TextStream &ti, TextStream &t, const Definition *def)
Definition xmlgen.cpp:630

References convertToXML(), Definition::docFile(), Definition::docLine(), EnumValue, generateXMLForMember(), memberVisible(), and writeXMLDocBlock().

Referenced by generateXMLForClass(), generateXMLForFile(), generateXMLForGroup(), generateXMLForModule(), and generateXMLForNamespace().

◆ memberOutputFileBase()

QCString memberOutputFileBase ( const MemberDef * md)
static

Definition at line 576 of file xmlgen.cpp.

577{
578 //bool inlineGroupedClasses = Config_getBool(INLINE_GROUPED_CLASSES);
579 //if (inlineGroupedClasses && md->getClassDef() && md->getClassDef()->partOfGroups()!=0)
580 // return md->getClassDef()->getXmlOutputFileBase();
581 //else
582 // return md->getOutputFileBase();
583 return md->getOutputFileBase();
584}

References Definition::getOutputFileBase().

Referenced by generateXMLForMember(), and writeListOfAllMembers().

◆ memberVisible()

bool memberVisible ( const Definition * d,
const MemberDef * md )
static

Definition at line 1208 of file xmlgen.cpp.

1209{
1210 return Config_getBool(XML_NS_MEMB_FILE_SCOPE) ||
1212 md->getNamespaceDef()==nullptr;
1213}
virtual const NamespaceDef * getNamespaceDef() const =0

References Config_getBool, Definition::definitionType(), MemberDef::getNamespaceDef(), and Definition::TypeFile.

Referenced by generateXMLSection().

◆ stripAnonymousMarkers()

void stripAnonymousMarkers ( QCString & s)
static

Definition at line 526 of file xmlgen.cpp.

527{
528 auto isDigit = [](char c) { return c>='0' && c<='9'; };
529 int len = static_cast<int>(s.length());
530 int i=0,j=0;
531 if (len>0)
532 {
533 while (i<len)
534 {
535 if (i<len-1 && s[i]=='@' && isDigit(s[i+1])) // found pattern '@\d+'
536 {
537 if (j>=2 && i>=2 && s[i-2]==':' && s[i-1]==':') j-=2; // found pattern '::@\d+'
538 i+=2; // skip over @ and first digit
539 while (i<len && isDigit(s[i])) i++; // skip additional digits
540 }
541 else // copy characters
542 {
543 s[j++]=s[i++];
544 }
545 }
546 // resize resulting string
547 s.resize(j);
548 }
549}
void resize(size_t newlen)
Definition qcstring.h:167

References QCString::length(), and QCString::resize().

Referenced by generateXMLForClass(), generateXMLForConcept(), generateXMLForMember(), and generateXMLForNamespace().

◆ stripQualifiers()

void stripQualifiers ( QCString & typeStr)
static

Definition at line 551 of file xmlgen.cpp.

552{
553 bool done=false;
554 typeStr.stripPrefix("friend ");
555 while (!done)
556 {
557 if (typeStr.stripPrefix("static ")) {}
558 else if (typeStr.stripPrefix("constexpr ")) {}
559 else if (typeStr.stripPrefix("consteval ")) {}
560 else if (typeStr.stripPrefix("constinit ")) {}
561 else if (typeStr.stripPrefix("virtual ")) {}
562 else if (typeStr=="virtual") typeStr="";
563 else done=TRUE;
564 }
565}

References QCString::stripPrefix(), and TRUE.

Referenced by generateXMLForMember().

◆ writeCombineScript()

void writeCombineScript ( )
static

Definition at line 134 of file xmlgen.cpp.

135{
136 QCString outputDirectory = Config_getString(XML_OUTPUT);
137 QCString fileName=outputDirectory+"/combine.xslt";
138 std::ofstream t = Portable::openOutputStream(fileName);
139 if (!t.is_open())
140 {
141 err("Cannot open file {} for writing!\n",fileName);
142 return;
143 }
144
145 t <<
146 "<!-- XSLT script to combine the generated output into a single file. \n"
147 " If you have xsltproc you could use:\n"
148 " xsltproc combine.xslt index.xml >all.xml\n"
149 "-->\n"
150 "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.0\">\n"
151 " <xsl:output method=\"xml\" version=\"1.0\" indent=\"no\" standalone=\"yes\" />\n"
152 " <xsl:template match=\"/\">\n"
153 " <doxygen version=\"{doxygenindex/@version}\" xml:lang=\"{doxygenindex/@xml:lang}\">\n"
154 " <!-- Load all doxygen generated xml files -->\n"
155 " <xsl:for-each select=\"doxygenindex/compound\">\n"
156 " <xsl:copy-of select=\"document( concat( @refid, '.xml' ) )/doxygen/*\" />\n"
157 " </xsl:for-each>\n"
158 " </doxygen>\n"
159 " </xsl:template>\n"
160 "</xsl:stylesheet>\n";
161
162}

References Config_getString, err, and Portable::openOutputStream().

Referenced by generateXML().

◆ writeExports()

void writeExports ( const ImportInfoMap & exportMap,
TextStream & t )
static

Definition at line 1329 of file xmlgen.cpp.

1330{
1331 if (exportMap.empty()) return;
1332 t << " <exports>\n";
1333 for (const auto &[moduleName,importInfoList] : exportMap)
1334 {
1335 for (const auto &importInfo : importInfoList)
1336 {
1337 t << " <export";
1338 ModuleDef *mod = ModuleManager::instance().getPrimaryInterface(importInfo.importName);
1339 if (mod && mod->isLinkableInProject())
1340 {
1341 t << " refid=\"" << mod->getOutputFileBase() << "\"";
1342 }
1343 t << ">";
1344 t << importInfo.importName;
1345 t << "</export>\n";
1346 }
1347 }
1348 t << " </exports>\n";
1349}
virtual bool isLinkableInProject() const =0
ModuleDef * getPrimaryInterface(const QCString &moduleName) const

References Definition::getOutputFileBase(), ModuleManager::getPrimaryInterface(), ModuleManager::instance(), and Definition::isLinkableInProject().

Referenced by generateXMLForModule().

◆ writeIncludeInfo()

void writeIncludeInfo ( const IncludeInfo * ii,
TextStream & t )
static

Definition at line 1395 of file xmlgen.cpp.

1396{
1397 if (ii)
1398 {
1399 QCString nm = ii->includeName;
1400 if (nm.isEmpty() && ii->fileDef) nm = ii->fileDef->docName();
1401 if (!nm.isEmpty())
1402 {
1403 t << " <includes";
1404 if (ii->fileDef && !ii->fileDef->isReference()) // TODO: support external references
1405 {
1406 t << " refid=\"" << ii->fileDef->getOutputFileBase() << "\"";
1407 }
1408 t << " local=\"" << ((ii->kind & IncludeKind_LocalMask) ? "yes" : "no") << "\">";
1409 t << nm;
1410 t << "</includes>\n";
1411 }
1412 }
1413}
virtual const QCString & docName() const =0
QCString includeName
Definition filedef.h:80
IncludeKind kind
Definition filedef.h:81
const FileDef * fileDef
Definition filedef.h:79

References FileDef::docName(), IncludeInfo::fileDef, Definition::getOutputFileBase(), IncludeKind_LocalMask, IncludeInfo::includeName, QCString::isEmpty(), Definition::isReference(), and IncludeInfo::kind.

Referenced by generateXMLForClass(), and generateXMLForConcept().

◆ writeInnerClasses()

void writeInnerClasses ( const ClassLinkedRefMap & cl,
TextStream & t )
static

Definition at line 1279 of file xmlgen.cpp.

1280{
1281 for (const auto &cd : cl)
1282 {
1283 if (!cd->isHidden() && !cd->isAnonymous())
1284 {
1285 t << " <innerclass refid=\"" << classOutputFileBase(cd)
1286 << "\" prot=\"" << to_string_lower(cd->protection());
1287 t << "\">" << convertToXML(cd->name()) << "</innerclass>\n";
1288 }
1289 }
1290}

References classOutputFileBase(), convertToXML(), and to_string_lower().

Referenced by generateXMLForClass(), generateXMLForFile(), generateXMLForGroup(), generateXMLForModule(), and generateXMLForNamespace().

◆ writeInnerConcepts()

void writeInnerConcepts ( const ConceptLinkedRefMap & cl,
TextStream & t )
static

Definition at line 1292 of file xmlgen.cpp.

1293{
1294 for (const auto &cd : cl)
1295 {
1296 if (cd->isHidden())
1297 {
1298 t << " <innerconcept refid=\"" << cd->getOutputFileBase()
1299 << "\">" << convertToXML(cd->name()) << "</innerconcept>\n";
1300 }
1301 }
1302}

References convertToXML().

Referenced by generateXMLForFile(), generateXMLForGroup(), generateXMLForModule(), and generateXMLForNamespace().

◆ writeInnerDirs()

void writeInnerDirs ( const DirList * dl,
TextStream & t )
static

Definition at line 1383 of file xmlgen.cpp.

1384{
1385 if (dl)
1386 {
1387 for(const auto subdir : *dl)
1388 {
1389 t << " <innerdir refid=\"" << subdir->getOutputFileBase()
1390 << "\">" << convertToXML(subdir->displayName()) << "</innerdir>\n";
1391 }
1392 }
1393}

References convertToXML().

Referenced by generateXMLForDir().

◆ writeInnerFiles()

void writeInnerFiles ( const FileList & fl,
TextStream & t )
static

Definition at line 1351 of file xmlgen.cpp.

1352{
1353 for (const auto &fd : fl)
1354 {
1355 t << " <innerfile refid=\"" << fd->getOutputFileBase()
1356 << "\">" << convertToXML(fd->name()) << "</innerfile>\n";
1357 }
1358}

References convertToXML().

Referenced by generateXMLForDir(), generateXMLForGroup(), and generateXMLForModule().

◆ writeInnerGroups()

void writeInnerGroups ( const GroupList & gl,
TextStream & t )
static

Definition at line 1373 of file xmlgen.cpp.

1374{
1375 for (const auto &sgd : gl)
1376 {
1377 t << " <innergroup refid=\"" << sgd->getOutputFileBase()
1378 << "\">" << convertToXML(sgd->groupTitle())
1379 << "</innergroup>\n";
1380 }
1381}

References convertToXML().

Referenced by generateXMLForGroup().

◆ writeInnerModules()

void writeInnerModules ( const ModuleLinkedRefMap & ml,
TextStream & t )
static

Definition at line 1304 of file xmlgen.cpp.

1305{
1306 for (const auto &mod : ml)
1307 {
1308 if (mod->isHidden())
1309 {
1310 t << " <innermodule refid=\"" << mod->getOutputFileBase()
1311 << "\">" << convertToXML(mod->name()) << "</innermodule>\n";
1312 }
1313 }
1314}

References convertToXML().

Referenced by generateXMLForGroup().

◆ writeInnerNamespaces()

void writeInnerNamespaces ( const NamespaceLinkedRefMap & nl,
TextStream & t )
static

Definition at line 1316 of file xmlgen.cpp.

1317{
1318 for (const auto &nd : nl)
1319 {
1320 if (!nd->isHidden() && !nd->isAnonymous())
1321 {
1322 t << " <innernamespace refid=\"" << nd->getOutputFileBase()
1323 << "\"" << (nd->isInline() ? " inline=\"yes\"" : "")
1324 << ">" << convertToXML(nd->name()) << "</innernamespace>\n";
1325 }
1326 }
1327}

References convertToXML().

Referenced by generateXMLForFile(), generateXMLForGroup(), and generateXMLForNamespace().

◆ writeInnerPages()

void writeInnerPages ( const PageLinkedRefMap & pl,
TextStream & t )
static

Definition at line 1360 of file xmlgen.cpp.

1361{
1362 for (const auto &pd : pl)
1363 {
1364 t << " <innerpage refid=\"" << pd->getOutputFileBase();
1365 if (pd->getGroupDef())
1366 {
1367 t << "_" << pd->name();
1368 }
1369 t << "\">" << convertToXML(pd->title()) << "</innerpage>\n";
1370 }
1371}

References convertToXML().

Referenced by generateXMLForGroup(), and generateXMLForPage().

◆ writeListOfAllMembers()

void writeListOfAllMembers ( const ClassDef * cd,
TextStream & t )
static

Definition at line 1252 of file xmlgen.cpp.

1253{
1254 t << " <listofallmembers>\n";
1255 for (auto &mni : cd->memberNameInfoLinkedMap())
1256 {
1257 for (auto &mi : *mni)
1258 {
1259 const MemberDef *md=mi->memberDef();
1260 if (!md->isAnonymous())
1261 {
1262 Protection prot = mi->prot();
1263 Specifier virt=md->virtualness();
1264 t << " <member refid=\"" << memberOutputFileBase(md) << "_1" <<
1265 md->anchor() << "\" prot=\"" << to_string_lower(prot);
1266 t << "\" virt=\"" << to_string_lower(virt) << "\"";
1267 if (!mi->ambiguityResolutionScope().isEmpty())
1268 {
1269 t << " ambiguityscope=\"" << convertToXML(mi->ambiguityResolutionScope()) << "\"";
1270 }
1271 t << "><scope>" << convertToXML(cd->name()) << "</scope><name>" <<
1272 convertToXML(md->name()) << "</name></member>\n";
1273 }
1274 }
1275 }
1276 t << " </listofallmembers>\n";
1277}
virtual const MemberNameInfoLinkedMap & memberNameInfoLinkedMap() const =0
Returns a dictionary of all members.
Protection
Definition types.h:32
Specifier
Definition types.h:80

References Definition::anchor(), convertToXML(), Definition::isAnonymous(), ClassDef::memberNameInfoLinkedMap(), memberOutputFileBase(), Definition::name(), to_string_lower(), and MemberDef::virtualness().

Referenced by generateXMLForClass().

◆ writeMemberReference()

void writeMemberReference ( TextStream & t,
const Definition * def,
const MemberDef * rmd,
const QCString & tagName )
static

Definition at line 501 of file xmlgen.cpp.

502{
503 QCString scope = rmd->getScopeString();
504 QCString name = rmd->name();
505 if (!scope.isEmpty() && scope!=def->name())
506 {
508 }
509 t << " <" << tagName << " refid=\"";
510 t << rmd->getOutputFileBase() << "_1" << rmd->anchor() << "\"";
511 if (rmd->getStartBodyLine()!=-1 && rmd->getBodyDef())
512 {
513 t << " compoundref=\"" << rmd->getBodyDef()->getOutputFileBase() << "\"";
514 t << " startline=\"" << rmd->getStartBodyLine() << "\"";
515 if (rmd->getEndBodyLine()!=-1)
516 {
517 t << " endline=\"" << rmd->getEndBodyLine() << "\"";
518 }
519 }
520 t << ">" << convertToXML(name) << "</" << tagName << ">\n";
521
522}
virtual QCString getScopeString() const =0
QCString & prepend(const char *s)
Definition qcstring.h:407
QCString getLanguageSpecificSeparator(SrcLangExt lang, bool classScope)
Returns the scope separator to use given the programming language lang.
Definition util.cpp:6375

References Definition::anchor(), convertToXML(), Definition::getBodyDef(), Definition::getEndBodyLine(), Definition::getLanguage(), getLanguageSpecificSeparator(), Definition::getOutputFileBase(), MemberDef::getScopeString(), Definition::getStartBodyLine(), QCString::isEmpty(), Definition::name(), and QCString::prepend().

Referenced by generateXMLForMember().

◆ writeMemberTemplateLists()

void writeMemberTemplateLists ( const MemberDef * md,
TextStream & t )
static

Definition at line 432 of file xmlgen.cpp.

433{
435}
virtual const ClassDef * getClassDef() const =0
virtual const ArgumentList & templateArguments() const =0
static void writeTemplateArgumentList(TextStream &t, const ArgumentList &al, const Definition *scope, const FileDef *fileScope, int indent)
Definition xmlgen.cpp:375

References MemberDef::getClassDef(), MemberDef::getFileDef(), MemberDef::templateArguments(), and writeTemplateArgumentList().

Referenced by generateXMLForMember().

◆ writeTemplateArgumentList()

void writeTemplateArgumentList ( TextStream & t,
const ArgumentList & al,
const Definition * scope,
const FileDef * fileScope,
int indent )
static

Definition at line 375 of file xmlgen.cpp.

380{
381 QCString indentStr;
382 indentStr.fill(' ',indent);
383 if (al.hasParameters())
384 {
385 t << indentStr << "<templateparamlist>\n";
386 for (const Argument &a : al)
387 {
388 t << indentStr << " <param>\n";
389 if (!a.type.isEmpty())
390 {
391 t << indentStr << " <type>";
392 linkifyText(TextGeneratorXMLImpl(t),scope,fileScope,nullptr,a.type);
393 t << "</type>\n";
394 }
395 if (!a.name.isEmpty())
396 {
397 t << indentStr << " <declname>" << convertToXML(a.name) << "</declname>\n";
398 t << indentStr << " <defname>" << convertToXML(a.name) << "</defname>\n";
399 }
400 if (!a.defval.isEmpty())
401 {
402 t << indentStr << " <defval>";
403 linkifyText(TextGeneratorXMLImpl(t),scope,fileScope,nullptr,a.defval);
404 t << "</defval>\n";
405 }
406 if (!a.typeConstraint.isEmpty())
407 {
408 t << indentStr << " <typeconstraint>";
409 linkifyText(TextGeneratorXMLImpl(t),scope,fileScope,nullptr,a.typeConstraint);
410 t << "</typeconstraint>\n";
411 }
412 if (a.hasTemplateDocumentation())
413 {
414 t << indentStr << " <briefdescription>\n";
415 t << indentStr << " ";
416 if (scope)
417 {
418 writeXMLDocBlock(t,scope->briefFile(),scope->briefLine(),scope,nullptr,a.docs);
419 }
420 else
421 {
422 writeXMLDocBlock(t,fileScope->briefFile(),fileScope->briefLine(),fileScope,nullptr,a.docs);
423 }
424 t << indentStr << " </briefdescription>\n";
425 }
426 t << indentStr << " </param>\n";
427 }
428 t << indentStr << "</templateparamlist>\n";
429 }
430}
void fill(char c, int len=-1)
Fills a string with a predefined character.
Definition qcstring.h:180

References Definition::briefFile(), Definition::briefLine(), convertToXML(), QCString::fill(), ArgumentList::hasParameters(), linkifyText(), and writeXMLDocBlock().

Referenced by writeMemberTemplateLists(), writeTemplateList(), and writeTemplateList().

◆ writeTemplateList() [1/2]

void writeTemplateList ( const ClassDef * cd,
TextStream & t )
static

Definition at line 437 of file xmlgen.cpp.

438{
440}
virtual const ArgumentList & templateArguments() const =0
Returns the template arguments of this class.

References ClassDef::getFileDef(), ClassDef::templateArguments(), and writeTemplateArgumentList().

Referenced by generateXMLForClass(), and generateXMLForConcept().

◆ writeTemplateList() [2/2]

void writeTemplateList ( const ConceptDef * cd,
TextStream & t )
static

Definition at line 442 of file xmlgen.cpp.

443{
445}
virtual ArgumentList getTemplateParameterList() const =0

References ConceptDef::getFileDef(), ConceptDef::getTemplateParameterList(), and writeTemplateArgumentList().

◆ writeXMLCodeBlock()

void writeXMLCodeBlock ( TextStream & t,
FileDef * fd )

Definition at line 475 of file xmlgen.cpp.

476{
477 auto intf=Doxygen::parserManager->getCodeParser(fd->getDefFileExtension());
479 intf->resetCodeParserState();
480 OutputCodeList xmlList;
481 xmlList.add<XMLCodeGenerator>(&t);
482 xmlList.startCodeFragment("DoxyCode");
483 intf->parseCode(xmlList, // codeOutList
484 QCString(), // scopeName
485 fileToString(fd->absFilePath(),Config_getBool(FILTER_SOURCE_FILES)),
486 langExt, // lang
487 Config_getBool(STRIP_CODE_COMMENTS),
488 FALSE, // isExampleBlock
489 QCString(), // exampleName
490 fd, // fileDef
491 -1, // startLine
492 -1, // endLine
493 FALSE, // inlineFragment
494 nullptr, // memberDef
495 TRUE // showLineNumbers
496 );
497 //xmlList.get<XMLCodeGenerator>(OutputType::XML)->finish();
498 xmlList.endCodeFragment("DoxyCode");
499}
virtual QCString getDefFileExtension() const =0
static ParserManager * parserManager
Definition doxygen.h:131
Class representing a list of different code generators.
Definition outputlist.h:164
void add(OutputCodeIntfPtr &&p)
Definition outputlist.h:194
void endCodeFragment(const QCString &style)
Definition outputlist.h:281
void startCodeFragment(const QCString &style)
Definition outputlist.h:278
SrcLangExt
Definition types.h:207
SrcLangExt getLanguageFromFileName(const QCString &fileName, SrcLangExt defLang)
Definition util.cpp:5714
QCString fileToString(const QCString &name, bool filter, bool isSourceCode)
Definition util.cpp:1441

References FileDef::absFilePath(), OutputCodeList::add(), Config_getBool, OutputCodeList::endCodeFragment(), FALSE, fileToString(), Definition::getDefFileExtension(), getLanguageFromFileName(), Doxygen::parserManager, OutputCodeList::startCodeFragment(), and TRUE.

Referenced by generateXMLForFile().

◆ writeXMLCodeString()

void writeXMLCodeString ( bool hide,
TextStream & t,
const QCString & str,
size_t & col,
size_t stripIndentAmount )
inline

Definition at line 75 of file xmlgen.cpp.

76{
77 if (str.isEmpty()) return;
78 const int tabSize = Config_getInt(TAB_SIZE);
79 const char *s = str.data();
80 char c=0;
81 if (hide) // only update column count
82 {
83 col=updateColumnCount(s,col);
84 }
85 else // actually output content and keep track of m_col
86 {
87 while ((c=*s++))
88 {
89 switch(c)
90 {
91 case '\t':
92 {
93 int spacesToNextTabStop = tabSize - (col%tabSize);
94 while (spacesToNextTabStop--)
95 {
96 if (col>=stripIndentAmount) t << "<sp/>";
97 col++;
98 }
99 break;
100 }
101 case ' ':
102 if (col>=stripIndentAmount) t << "<sp/>";
103 col++;
104 break;
105 case '<': t << "&lt;"; col++; break;
106 case '>': t << "&gt;"; col++; break;
107 case '&': t << "&amp;"; col++; break;
108 case '\'': t << "&apos;"; col++; break;
109 case '"': t << "&quot;"; col++; break;
110 case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8:
111 case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18:
112 case 19: case 20: case 21: case 22: case 23: case 24: case 25: case 26:
113 case 27: case 28: case 29: case 30: case 31:
114 // encode invalid XML characters (see http://www.w3.org/TR/2000/REC-xml-20001006#NT-Char)
115 t << "<sp value=\"" << int(c) << "\"/>";
116 break;
117 default: s=writeUTF8Char(t,s-1); col++; break;
118 }
119 }
120 }
121}
#define Config_getInt(name)
Definition config.h:34
const char * writeUTF8Char(TextStream &t, const char *s)
Writes the UTF8 character pointed to by s to stream t and returns a pointer to the next character.
Definition utf8.cpp:197
size_t updateColumnCount(const char *s, size_t col)
Definition util.cpp:7356

References Config_getInt, QCString::data(), QCString::isEmpty(), updateColumnCount(), and writeUTF8Char().

Referenced by XMLCodeGenerator::codify().

◆ writeXMLDocBlock()

void writeXMLDocBlock ( TextStream & t,
const QCString & fileName,
int lineNr,
const Definition * scope,
const MemberDef * md,
const QCString & text )
static

Definition at line 447 of file xmlgen.cpp.

453{
454 QCString stext = text.stripWhiteSpace();
455 if (stext.isEmpty()) return;
456 // convert the documentation string into an abstract syntax tree
457 auto parser { createDocParser() };
458 auto ast { validatingParseDoc(*parser.get(),
459 fileName,lineNr,scope,md,text,FALSE,FALSE,
460 QCString(),FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT)) };
461 auto astImpl = dynamic_cast<const DocNodeAST*>(ast.get());
462 if (astImpl)
463 {
464 // create a code generator
465 OutputCodeList xmlCodeList;
466 xmlCodeList.add<XMLCodeGenerator>(&t);
467 // create a parse tree visitor for XML
468 XmlDocVisitor visitor(t,xmlCodeList,scope?scope->getDefFileExtension():QCString(""));
469 // visit all nodes
470 std::visit(visitor,astImpl->root);
471 // clean up
472 }
473}
Class representing the abstract syntax tree of a documentation block.
Definition docnode.h:1460
Concrete visitor implementation for XML output.
IDocParserPtr createDocParser()
factory function to create a parser
Definition docparser.cpp:55
IDocNodeASTPtr validatingParseDoc(IDocParser &parserIntf, const QCString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const QCString &input, bool indexWords, bool isExample, const QCString &exampleName, bool singleLine, bool linkFromIndex, bool markdownSupport)

References OutputCodeList::add(), Config_getBool, createDocParser(), FALSE, Definition::getDefFileExtension(), QCString::isEmpty(), QCString::stripWhiteSpace(), and validatingParseDoc().

Referenced by generateXMLForClass(), generateXMLForConcept(), generateXMLForDir(), generateXMLForFile(), generateXMLForGroup(), generateXMLForMember(), generateXMLForModule(), generateXMLForNamespace(), generateXMLForPage(), generateXMLSection(), and writeTemplateArgumentList().

◆ writeXMLHeader()

void writeXMLHeader ( TextStream & t)
static

Definition at line 124 of file xmlgen.cpp.

125{
126 t << "<?xml version='1.0' encoding='UTF-8' standalone='no'?>\n";
127 t << "<doxygen xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ";
128 t << "xsi:noNamespaceSchemaLocation=\"compound.xsd\" ";
129 t << "version=\"" << getDoxygenVersion() << "\" ";
130 t << "xml:lang=\"" << theTranslator->trISOLang() << "\"";
131 t << ">\n";
132}

References theTranslator.

Referenced by generateXMLForClass(), generateXMLForConcept(), generateXMLForDir(), generateXMLForFile(), generateXMLForGroup(), generateXMLForModule(), generateXMLForNamespace(), and generateXMLForPage().

◆ writeXMLLink()

void writeXMLLink ( TextStream & t,
const QCString & extRef,
const QCString & compoundId,
const QCString & anchorId,
const QCString & text,
const QCString & tooltip )

Definition at line 164 of file xmlgen.cpp.

166{
167 t << "<ref refid=\"" << compoundId;
168 if (!anchorId.isEmpty()) t << "_1" << anchorId;
169 t << "\" kindref=\"";
170 if (!anchorId.isEmpty()) t << "member"; else t << "compound";
171 t << "\"";
172 if (!extRef.isEmpty()) t << " external=\"" << extRef << "\"";
173 if (!tooltip.isEmpty()) t << " tooltip=\"" << convertToXML(tooltip) << "\"";
174 t << ">";
175 writeXMLString(t,text);
176 t << "</ref>";
177}

References convertToXML(), QCString::isEmpty(), and writeXMLString().

Referenced by XMLCodeGenerator::writeCodeLink(), and TextGeneratorXMLImpl::writeLink().

◆ writeXMLString()