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 "requirement.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)
QCString xmlRequirementId (const QCString &reqId)
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 stripQualifiers (QCString &typeStr)
static QCString classOutputFileBase (const ClassDef *cd)
static QCString memberOutputFileBase (const MemberDef *md)
static bool stripKeyword (QCString &str, const char *keyword, bool needSpace)
static QCString extractNoExcept (QCString &argsStr)
static void writeRequirementRefs (const Definition *d, TextStream &t, const char *prefix="")
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)
void generateXMLForRequirements (PageDef *pd, TextStream &ti)
static void generateXMLForPage (PageDef *pd, TextStream &ti, bool isExample)
static void generateXMLForRequirement (const RequirementIntf *req, TextStream &ti)
void generateXML ()

Macro Definition Documentation

◆ XML_DB

Function Documentation

◆ classOutputFileBase()

QCString classOutputFileBase ( const ClassDef * cd)
static

Definition at line 539 of file xmlgen.cpp.

540{
541 //bool inlineGroupedClasses = Config_getBool(INLINE_GROUPED_CLASSES);
542 //if (inlineGroupedClasses && cd->partOfGroups()!=0)
543 return cd->getOutputFileBase();
544 //else
545 // return cd->getOutputFileBase();
546}
virtual QCString getOutputFileBase() const =0

References Definition::getOutputFileBase().

Referenced by generateXMLForClass(), and writeInnerClasses().

◆ extractNoExcept()

QCString extractNoExcept ( QCString & argsStr)
static

Definition at line 606 of file xmlgen.cpp.

607{
608 QCString expr;
609 //printf("extractNoExcept(%s)\n",qPrint(argsStr));
610 int i = argsStr.find("noexcept(");
611 if (i!=-1)
612 {
613 int bracketCount = 1;
614 size_t p = i+9;
615 bool found = false;
616 bool insideString = false;
617 bool insideChar = false;
618 char pc = 0;
619 while (!found && p<argsStr.length())
620 {
621 char c = argsStr[p++];
622 if (insideString)
623 {
624 if (c=='"' && pc!='\\') insideString=false;
625 }
626 else if (insideChar)
627 {
628 if (c=='\'' && pc!='\\') insideChar=false;
629 }
630 else
631 {
632 switch (c)
633 {
634 case '(': bracketCount++; break;
635 case ')': bracketCount--; found = bracketCount==0; break;
636 case '"': insideString = true; break;
637 case '\'': insideChar = true; break;
638 }
639 }
640 pc = c;
641 }
642 expr = argsStr.mid(i+9,p-i-10);
643 argsStr = (argsStr.left(i) + argsStr.mid(p)).stripWhiteSpace();
644 }
645 //printf("extractNoExcept -> argsStr='%s', expr='%s'\n",qPrint(argsStr),qPrint(expr));
646 return expr;
647}
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:166
QCString mid(size_t index, size_t len=static_cast< size_t >(-1)) const
Definition qcstring.h:241
QCString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
Definition qcstring.h:260
QCString left(size_t len) const
Definition qcstring.h:229

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

Referenced by generateXMLForMember().

◆ generateXML()

void generateXML ( )

Definition at line 2335 of file xmlgen.cpp.

2336{
2337 // + classes
2338 // + concepts
2339 // + namespaces
2340 // + files
2341 // + groups
2342 // + related pages
2343 // - examples
2344
2345 QCString outputDirectory = Config_getString(XML_OUTPUT);
2346 Dir xmlDir(outputDirectory.str());
2347 createSubDirs(xmlDir);
2348
2349 ResourceMgr::instance().copyResource("xml.xsd",outputDirectory);
2350 ResourceMgr::instance().copyResource("index.xsd",outputDirectory);
2351
2352 QCString fileName=outputDirectory+"/compound.xsd";
2353 std::ofstream f = Portable::openOutputStream(fileName);
2354 if (!f.is_open())
2355 {
2356 err("Cannot open file {} for writing!\n",fileName);
2357 return;
2358 }
2359 {
2360 TextStream t(&f);
2361
2362 // write compound.xsd, but replace special marker with the entities
2363 QCString compound_xsd = ResourceMgr::instance().getAsString("compound.xsd");
2364 const char *startLine = compound_xsd.data();
2365 while (*startLine)
2366 {
2367 // find end of the line
2368 const char *endLine = startLine+1;
2369 while (*endLine && *(endLine-1)!='\n') endLine++; // skip to end of the line including \n
2370 int len=static_cast<int>(endLine-startLine);
2371 if (len>0)
2372 {
2373 QCString s(startLine,len);
2374 if (s.find("<!-- Automatically insert here the HTML entities -->")!=-1)
2375 {
2377 }
2378 else
2379 {
2380 t.write(startLine,len);
2381 }
2382 }
2383 startLine=endLine;
2384 }
2385 }
2386 f.close();
2387
2388 fileName=outputDirectory+"/doxyfile.xsd";
2389 f = Portable::openOutputStream(fileName);
2390 if (!f.is_open())
2391 {
2392 err("Cannot open file {} for writing!\n",fileName);
2393 return;
2394 }
2395 {
2396 TextStream t(&f);
2397
2398 // write doxyfile.xsd, but replace special marker with the entities
2399 QCString doxyfile_xsd = ResourceMgr::instance().getAsString("doxyfile.xsd");
2400 const char *startLine = doxyfile_xsd.data();
2401 while (*startLine)
2402 {
2403 // find end of the line
2404 const char *endLine = startLine+1;
2405 while (*endLine && *(endLine-1)!='\n') endLine++; // skip to end of the line including \n
2406 int len=static_cast<int>(endLine-startLine);
2407 if (len>0)
2408 {
2409 QCString s(startLine,len);
2410 if (s.find("<!-- Automatically insert here the configuration settings -->")!=-1)
2411 {
2413 }
2414 else
2415 {
2416 t.write(startLine,len);
2417 }
2418 }
2419 startLine=endLine;
2420 }
2421 }
2422 f.close();
2423
2424 fileName=outputDirectory+"/Doxyfile.xml";
2425 f = Portable::openOutputStream(fileName);
2426 if (!f.is_open())
2427 {
2428 err("Cannot open file {} for writing\n",fileName);
2429 return;
2430 }
2431 else
2432 {
2433 TextStream t(&f);
2435 }
2436 f.close();
2437
2438 fileName=outputDirectory+"/index.xml";
2439 f = Portable::openOutputStream(fileName);
2440 if (!f.is_open())
2441 {
2442 err("Cannot open file {} for writing!\n",fileName);
2443 return;
2444 }
2445 else
2446 {
2447 TextStream t(&f);
2448
2449 // write index header
2450 t << "<?xml version='1.0' encoding='UTF-8' standalone='no'?>\n";
2451 t << "<doxygenindex xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ";
2452 t << "xsi:noNamespaceSchemaLocation=\"index.xsd\" ";
2453 t << "version=\"" << getDoxygenVersion() << "\" ";
2454 t << "xml:lang=\"" << theTranslator->trISOLang() << "\"";
2455 t << ">\n";
2456
2457 for (const auto &cd : *Doxygen::classLinkedMap)
2458 {
2459 generateXMLForClass(cd.get(),t);
2460 }
2461 for (const auto &cd : *Doxygen::conceptLinkedMap)
2462 {
2463 msg("Generating XML output for concept {}\n",cd->displayName());
2464 generateXMLForConcept(cd.get(),t);
2465 }
2466 for (const auto &nd : *Doxygen::namespaceLinkedMap)
2467 {
2468 msg("Generating XML output for namespace {}\n",nd->displayName());
2469 generateXMLForNamespace(nd.get(),t);
2470 }
2471 for (const auto &fn : *Doxygen::inputNameLinkedMap)
2472 {
2473 for (const auto &fd : *fn)
2474 {
2475 msg("Generating XML output for file {}\n",fd->name());
2476 generateXMLForFile(fd.get(),t);
2477 }
2478 }
2479 for (const auto &gd : *Doxygen::groupLinkedMap)
2480 {
2481 msg("Generating XML output for group {}\n",gd->name());
2482 generateXMLForGroup(gd.get(),t);
2483 }
2484 for (const auto &pd : *Doxygen::pageLinkedMap)
2485 {
2486 msg("Generating XML output for page {}\n",pd->name());
2487 generateXMLForPage(pd.get(),t,FALSE);
2488 }
2489 for (const auto &req : RequirementManager::instance().requirements())
2490 {
2491 if (req->getTagFile().isEmpty())
2492 {
2493 msg("Generating XML output for requirement {}\n", req->id());
2495 }
2496 }
2497 for (const auto &dd : *Doxygen::dirLinkedMap)
2498 {
2499 msg("Generate XML output for dir {}\n",dd->name());
2500 generateXMLForDir(dd.get(),t);
2501 }
2502 for (const auto &mod : ModuleManager::instance().modules())
2503 {
2504 msg("Generating XML output for module {}\n",mod->name());
2505 generateXMLForModule(mod.get(),t);
2506 }
2507 for (const auto &pd : *Doxygen::exampleLinkedMap)
2508 {
2509 msg("Generating XML output for example {}\n",pd->name());
2510 generateXMLForPage(pd.get(),t,TRUE);
2511 }
2513 {
2514 msg("Generating XML output for the main page\n");
2516 }
2517
2518 //t << " </compoundlist>\n";
2519 t << "</doxygenindex>\n";
2520 }
2521
2523 clearSubDirs(xmlDir);
2524}
Class representing a directory in the file system.
Definition dir.h:75
static NamespaceLinkedMap * namespaceLinkedMap
Definition doxygen.h:114
static ConceptLinkedMap * conceptLinkedMap
Definition doxygen.h:97
static std::unique_ptr< PageDef > mainPage
Definition doxygen.h:100
static FileNameLinkedMap * inputNameLinkedMap
Definition doxygen.h:104
static ClassLinkedMap * classLinkedMap
Definition doxygen.h:95
static PageLinkedMap * exampleLinkedMap
Definition doxygen.h:98
static PageLinkedMap * pageLinkedMap
Definition doxygen.h:99
static DirLinkedMap * dirLinkedMap
Definition doxygen.h:126
static GroupLinkedMap * groupLinkedMap
Definition doxygen.h:113
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:552
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:172
static RequirementManager & instance()
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:648
#define TRUE
Definition qcstring.h:37
#define FALSE
Definition qcstring.h:34
void clearSubDirs(const Dir &d)
Definition util.cpp:3666
void createSubDirs(const Dir &d)
Definition util.cpp:3639
static void generateXMLForGroup(const GroupDef *gd, TextStream &ti)
Definition xmlgen.cpp:1975
static void generateXMLForClass(const ClassDef *cd, TextStream &ti)
Definition xmlgen.cpp:1482
static void generateXMLForFile(FileDef *fd, TextStream &ti)
Definition xmlgen.cpp:1859
static void generateXMLForNamespace(const NamespaceDef *nd, TextStream &ti)
Definition xmlgen.cpp:1786
static void generateXMLForRequirement(const RequirementIntf *req, TextStream &ti)
Definition xmlgen.cpp:2306
static void generateXMLForModule(const ModuleDef *mod, TextStream &ti)
Definition xmlgen.cpp:1730
static void generateXMLForConcept(const ConceptDef *cd, TextStream &ti)
Definition xmlgen.cpp:1652
static void generateXMLForDir(DirDef *dd, TextStream &ti)
Definition xmlgen.cpp:2045
static void generateXMLForPage(PageDef *pd, TextStream &ti, bool isExample)
Definition xmlgen.cpp:2139
static void writeCombineScript()
Definition xmlgen.cpp:139

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(), generateXMLForRequirement(), ResourceMgr::getAsString(), Doxygen::groupLinkedMap, Doxygen::inputNameLinkedMap, HtmlEntityMapper::instance(), ModuleManager::instance(), RequirementManager::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 1482 of file xmlgen.cpp.

1483{
1484 // + brief description
1485 // + detailed description
1486 // + template argument list(s)
1487 // - include file
1488 // + member groups
1489 // + inheritance diagram
1490 // + list of direct super classes
1491 // + list of direct sub classes
1492 // + list of inner classes
1493 // + collaboration diagram
1494 // + list of all members
1495 // + user defined member sections
1496 // + standard member sections
1497 // + detailed member documentation
1498 // - examples using the class
1499
1500 if (cd->isReference()) return; // skip external references.
1501 if (cd->isHidden()) return; // skip hidden classes.
1502 if (cd->isAnonymous()) return; // skip anonymous compounds.
1503 if (cd->isImplicitTemplateInstance()) return; // skip generated template instances.
1504 if (cd->isArtificial()) return; // skip artificially created classes
1505
1506 msg("Generating XML output for class {}\n",cd->name());
1507
1508 ti << " <compound refid=\"" << classOutputFileBase(cd)
1509 << "\" kind=\"" << cd->compoundTypeString()
1510 << "\"><name>" << convertToXML(cd->name()) << "</name>\n";
1511
1512 QCString outputDirectory = Config_getString(XML_OUTPUT);
1513 QCString fileName=outputDirectory+"/"+ classOutputFileBase(cd)+".xml";
1514 std::ofstream f = Portable::openOutputStream(fileName);
1515 if (!f.is_open())
1516 {
1517 err("Cannot open file {} for writing!\n",fileName);
1518 return;
1519 }
1520 TextStream t(&f);
1521
1522 writeXMLHeader(t);
1523 t << " <compounddef id=\""
1524 << classOutputFileBase(cd) << "\" kind=\""
1525 << cd->compoundTypeString() << "\" language=\""
1526 << langToString(cd->getLanguage()) << "\" prot=\"";
1527 t << to_string_lower(cd->protection());
1528 if (cd->isFinal()) t << "\" final=\"yes";
1529 if (cd->isSealed()) t << "\" sealed=\"yes";
1530 if (cd->isAbstract()) t << "\" abstract=\"yes";
1531 t << "\">\n";
1532 t << " <compoundname>";
1533 QCString nameStr = cd->name();
1534 writeXMLString(t,nameStr);
1535 t << "</compoundname>\n";
1536 for (const auto &bcd : cd->baseClasses())
1537 {
1538 t << " <basecompoundref ";
1539 if (bcd.classDef->isLinkable())
1540 {
1541 t << "refid=\"" << classOutputFileBase(bcd.classDef) << "\" ";
1542 }
1543 if (bcd.prot == Protection::Package) ASSERT(0);
1544 t << "prot=\"";
1545 t << to_string_lower(bcd.prot);
1546 t << "\" virt=\"";
1547 t << to_string_lower(bcd.virt);
1548 t << "\">";
1549 if (!bcd.templSpecifiers.isEmpty())
1550 {
1551 t << convertToXML(
1553 bcd.classDef->name(),bcd.templSpecifiers)
1554 );
1555 }
1556 else
1557 {
1558 t << convertToXML(bcd.classDef->displayName());
1559 }
1560 t << "</basecompoundref>\n";
1561 }
1562 for (const auto &bcd : cd->subClasses())
1563 {
1564 if (bcd.prot == Protection::Package) ASSERT(0);
1565 t << " <derivedcompoundref refid=\""
1566 << classOutputFileBase(bcd.classDef)
1567 << "\" prot=\"";
1568 t << to_string_lower(bcd.prot);
1569 t << "\" virt=\"";
1570 t << to_string_lower(bcd.virt);
1571 t << "\">" << convertToXML(bcd.classDef->displayName())
1572 << "</derivedcompoundref>\n";
1573 }
1574
1576
1578
1579 writeTemplateList(cd,t);
1580 for (const auto &mg : cd->getMemberGroups())
1581 {
1582 generateXMLSection(cd,ti,t,&mg->members(),"user-defined",mg->header(),
1583 mg->documentation());
1584 }
1585
1586 for (const auto &ml : cd->getMemberLists())
1587 {
1588 if (!ml->listType().isDetailed())
1589 {
1590 generateXMLSection(cd,ti,t,ml.get(),ml->listType().toXML());
1591 }
1592 }
1593
1594 LinkifyTextOptions options;
1595 options.setScope(cd).setFileScope(cd->getFileDef());
1596
1597 if (!cd->requiresClause().isEmpty())
1598 {
1599 t << " <requiresclause>";
1601 t << " </requiresclause>\n";
1602 }
1603
1604 for (const auto &qcd : cd->getQualifiers())
1605 {
1606 t << " <qualifier>" << convertToXML(qcd) << "</qualifier>\n";
1607 }
1608
1609 t << " <briefdescription>\n";
1610 writeXMLDocBlock(t,cd->briefFile(),cd->briefLine(),cd,nullptr,cd->briefDescription());
1611 t << " </briefdescription>\n";
1612 t << " <detaileddescription>\n";
1613 writeXMLDocBlock(t,cd->docFile(),cd->docLine(),cd,nullptr,cd->documentation());
1614 t << " </detaileddescription>\n";
1615 DotClassGraph inheritanceGraph(cd,GraphType::Inheritance);
1616 if (!inheritanceGraph.isTrivial())
1617 {
1618 t << " <inheritancegraph>\n";
1619 inheritanceGraph.writeXML(t);
1620 t << " </inheritancegraph>\n";
1621 }
1622 DotClassGraph collaborationGraph(cd,GraphType::Collaboration);
1623 if (!collaborationGraph.isTrivial())
1624 {
1625 t << " <collaborationgraph>\n";
1626 collaborationGraph.writeXML(t);
1627 t << " </collaborationgraph>\n";
1628 }
1630 t << " <location file=\""
1631 << convertToXML(stripFromPath(cd->getDefFileName())) << "\" line=\""
1632 << cd->getDefLine() << "\"" << " column=\""
1633 << cd->getDefColumn() << "\"" ;
1634 if (cd->getStartBodyLine()!=-1)
1635 {
1636 const FileDef *bodyDef = cd->getBodyDef();
1637 if (bodyDef)
1638 {
1639 t << " bodyfile=\"" << convertToXML(stripFromPath(bodyDef->absFilePath())) << "\"";
1640 }
1641 t << " bodystart=\"" << cd->getStartBodyLine() << "\" bodyend=\""
1642 << cd->getEndBodyLine() << "\"";
1643 }
1644 t << "/>\n";
1646 t << " </compounddef>\n";
1647 t << "</doxygen>\n";
1648
1649 ti << " </compound>\n";
1650}
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:163
Implements TextGeneratorIntf for an XML stream.
Definition xmlgen.cpp:186
@ Collaboration
Definition dotgraph.h:31
@ Inheritance
Definition dotgraph.h:31
#define ASSERT(x)
Definition qcstring.h:39
LinkifyTextOptions & setScope(const Definition *scope)
Definition util.h:110
LinkifyTextOptions & setFileScope(const FileDef *fileScope)
Definition util.h:113
static constexpr const char * to_string_lower(Protection prot) noexcept
Definition types.h:50
QCString insertTemplateSpecifierInScope(const QCString &scope, const QCString &templ)
Definition util.cpp:3745
static QCString stripFromPath(const QCString &p, const StringVector &l)
Definition util.cpp:298
QCString convertToXML(const QCString &s, bool keepEntities)
Definition util.cpp:3911
QCString langToString(SrcLangExt lang)
Returns a string representation of lang.
Definition util.cpp:5909
void linkifyText(const TextGeneratorIntf &out, const QCString &text, const LinkifyTextOptions &options)
Definition util.cpp:893
static QCString classOutputFileBase(const ClassDef *cd)
Definition xmlgen.cpp:539
static void writeXMLDocBlock(TextStream &t, const QCString &fileName, int lineNr, const Definition *scope, const MemberDef *md, const QCString &text)
Definition xmlgen.cpp:448
static void writeListOfAllMembers(const ClassDef *cd, TextStream &t)
Definition xmlgen.cpp:1319
static void writeTemplateList(const ClassDef *cd, TextStream &t)
Definition xmlgen.cpp:438
static void writeIncludeInfo(const IncludeInfo *ii, TextStream &t)
Definition xmlgen.cpp:1462
static void writeXMLHeader(TextStream &t)
Definition xmlgen.cpp:129
static void writeRequirementRefs(const Definition *d, TextStream &t, const char *prefix="")
Definition xmlgen.cpp:649
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:1282
static void writeInnerClasses(const ClassLinkedRefMap &cl, TextStream &t)
Definition xmlgen.cpp:1346

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(), LinkifyTextOptions::setFileScope(), LinkifyTextOptions::setScope(), stripFromPath(), ClassDef::subClasses(), to_string_lower(), MemberListType::toXML(), writeIncludeInfo(), writeInnerClasses(), writeListOfAllMembers(), writeRequirementRefs(), writeTemplateList(), DotClassGraph::writeXML(), writeXMLDocBlock(), writeXMLHeader(), and writeXMLString().

Referenced by generateXML().

◆ generateXMLForConcept()

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

Definition at line 1652 of file xmlgen.cpp.

1653{
1654 if (cd->isReference() || cd->isHidden()) return; // skip external references.
1655
1656 ti << " <compound refid=\"" << cd->getOutputFileBase()
1657 << "\" kind=\"concept\"" << "><name>"
1658 << convertToXML(cd->name()) << "</name>\n";
1659
1660 LinkifyTextOptions options;
1661 options.setScope(cd).setFileScope(cd->getFileDef());
1662 QCString outputDirectory = Config_getString(XML_OUTPUT);
1663 QCString fileName=outputDirectory+"/"+cd->getOutputFileBase()+".xml";
1664 std::ofstream f = Portable::openOutputStream(fileName);
1665 if (!f.is_open())
1666 {
1667 err("Cannot open file {} for writing!\n",fileName);
1668 return;
1669 }
1670 TextStream t(&f);
1671 writeXMLHeader(t);
1672 t << " <compounddef id=\"" << cd->getOutputFileBase()
1673 << "\" kind=\"concept\">\n";
1674 t << " <compoundname>";
1675 QCString nameStr = cd->name();
1676 writeXMLString(t,nameStr);
1677 t << "</compoundname>\n";
1679 writeTemplateList(cd,t);
1680 t << " <initializer>";
1682 t << "</initializer>\n";
1683 auto intf=Doxygen::parserManager->getCodeParser(".cpp");
1684 intf->resetCodeParserState();
1685 OutputCodeList xmlList;
1686 xmlList.add<XMLCodeGenerator>(&t);
1687 t << " <conceptparts>\n";
1688 for (const auto &part : cd->conceptParts())
1689 {
1690 switch (part.type)
1691 {
1693 t << " <docpart line=\"" << part.lineNr << "\" col=\"" << part.colNr << "\">\n";
1694 writeXMLDocBlock(t,cd->getDefFileName(),part.lineNr,cd,nullptr,part.content);
1695 t << " </docpart>\n";
1696 break;
1698 t << " <codepart line=\"" << part.lineNr << "\">";
1699 xmlList.startCodeFragment("DoxyCode");
1700 intf->parseCode(xmlList, // codeOutList
1701 nameStr, // scopeName
1702 part.content, // code
1703 SrcLangExt::Cpp, // lang
1704 false, // stripCodeComments
1706 );
1707 xmlList.endCodeFragment("DoxyCode");
1708 t << "</codepart>\n";
1709 break;
1710 }
1711 }
1712 t << " </conceptparts>\n";
1713 t << " <briefdescription>\n";
1714 writeXMLDocBlock(t,cd->briefFile(),cd->briefLine(),cd,nullptr,cd->briefDescription());
1715 t << " </briefdescription>\n";
1716 t << " <detaileddescription>\n";
1717 writeXMLDocBlock(t,cd->docFile(),cd->docLine(),cd,nullptr,cd->documentation());
1718 t << " </detaileddescription>\n";
1720 t << " <location file=\""
1721 << convertToXML(stripFromPath(cd->getDefFileName())) << "\" line=\""
1722 << cd->getDefLine() << "\"" << " column=\""
1723 << cd->getDefColumn() << "\"/>\n" ;
1724 t << " </compounddef>\n";
1725 t << "</doxygen>\n";
1726
1727 ti << " </compound>\n";
1728}
virtual QCString initializer() const =0
virtual const IncludeInfo * includeInfo() const =0
virtual Parts conceptParts() const =0
virtual const FileDef * getFileDef() const =0
static ParserManager * parserManager
Definition doxygen.h:128
Class representing a list of different code generators.
Definition outputlist.h:165
void add(OutputCodeIntfPtr &&p)
Definition outputlist.h:195
void endCodeFragment(const QCString &style)
Definition outputlist.h:282
void startCodeFragment(const QCString &style)
Definition outputlist.h:279
Options to configure the code parser.
Definition parserintf.h:78

References OutputCodeList::add(), Definition::briefDescription(), Definition::briefFile(), Definition::briefLine(), ConceptDef::Code, ConceptDef::conceptParts(), Config_getString, convertToXML(), ConceptDef::Doc, Definition::docFile(), Definition::docLine(), Definition::documentation(), OutputCodeList::endCodeFragment(), err, Definition::getDefColumn(), Definition::getDefFileName(), Definition::getDefLine(), ConceptDef::getFileDef(), Definition::getOutputFileBase(), ConceptDef::includeInfo(), ConceptDef::initializer(), Definition::isHidden(), Definition::isReference(), linkifyText(), Definition::name(), Portable::openOutputStream(), Doxygen::parserManager, LinkifyTextOptions::setFileScope(), LinkifyTextOptions::setScope(), OutputCodeList::startCodeFragment(), stripFromPath(), writeIncludeInfo(), writeRequirementRefs(), writeTemplateList(), writeXMLDocBlock(), writeXMLHeader(), and writeXMLString().

Referenced by generateXML().

◆ generateXMLForDir()

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

Definition at line 2045 of file xmlgen.cpp.

2046{
2047 if (dd->isReference()) return; // skip external references
2048 ti << " <compound refid=\"" << dd->getOutputFileBase()
2049 << "\" kind=\"dir\"><name>" << convertToXML(dd->displayName())
2050 << "</name>\n";
2051
2052 QCString outputDirectory = Config_getString(XML_OUTPUT);
2053 QCString fileName=outputDirectory+"/"+dd->getOutputFileBase()+".xml";
2054 std::ofstream f = Portable::openOutputStream(fileName);
2055 if (!f.is_open())
2056 {
2057 err("Cannot open file {} for writing!\n",fileName);
2058 return;
2059 }
2060 TextStream t(&f);
2061
2062 writeXMLHeader(t);
2063 t << " <compounddef id=\""
2064 << dd->getOutputFileBase() << "\" kind=\"dir\">\n";
2065 t << " <compoundname>" << convertToXML(dd->displayName()) << "</compoundname>\n";
2066
2067 writeInnerDirs(&dd->subDirs(),t);
2068 writeInnerFiles(dd->getFiles(),t);
2069
2070 t << " <briefdescription>\n";
2071 writeXMLDocBlock(t,dd->briefFile(),dd->briefLine(),dd,nullptr,dd->briefDescription());
2072 t << " </briefdescription>\n";
2073 t << " <detaileddescription>\n";
2074 writeXMLDocBlock(t,dd->docFile(),dd->docLine(),dd,nullptr,dd->documentation());
2075 t << " </detaileddescription>\n";
2077 t << " <location file=\"" << convertToXML(stripFromPath(dd->name())) << "\"/>\n";
2078 t << " </compounddef>\n";
2079 t << "</doxygen>\n";
2080
2081 ti << " </compound>\n";
2082}
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:1450
static void writeInnerFiles(const FileList &fl, TextStream &t)
Definition xmlgen.cpp:1418

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(), writeRequirementRefs(), writeXMLDocBlock(), and writeXMLHeader().

Referenced by generateXML().

◆ generateXMLForFile()

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

Definition at line 1859 of file xmlgen.cpp.

1860{
1861 // + includes files
1862 // + includedby files
1863 // + include graph
1864 // + included by graph
1865 // + contained class definitions
1866 // + contained namespace definitions
1867 // + member groups
1868 // + normal members
1869 // + brief desc
1870 // + detailed desc
1871 // + source code
1872 // + location
1873 // - number of lines
1874
1875 if (fd->isReference()) return; // skip external references
1876
1877 ti << " <compound refid=\"" << fd->getOutputFileBase()
1878 << "\" kind=\"file\"><name>" << convertToXML(fd->name())
1879 << "</name>\n";
1880
1881 QCString outputDirectory = Config_getString(XML_OUTPUT);
1882 QCString fileName=outputDirectory+"/"+fd->getOutputFileBase()+".xml";
1883 std::ofstream f = Portable::openOutputStream(fileName);
1884 if (!f.is_open())
1885 {
1886 err("Cannot open file {} for writing!\n",fileName);
1887 return;
1888 }
1889 TextStream t(&f);
1890
1891 writeXMLHeader(t);
1892 t << " <compounddef id=\"" << fd->getOutputFileBase()
1893 << "\" kind=\"file\" language=\""
1894 << langToString(fd->getLanguage()) << "\">\n";
1895 t << " <compoundname>";
1896 writeXMLString(t,fd->name());
1897 t << "</compoundname>\n";
1898
1899 for (const auto &inc : fd->includeFileList())
1900 {
1901 t << " <includes";
1902 if (inc.fileDef && !inc.fileDef->isReference()) // TODO: support external references
1903 {
1904 t << " refid=\"" << inc.fileDef->getOutputFileBase() << "\"";
1905 }
1906 t << " local=\"" << ((inc.kind & IncludeKind_LocalMask) ? "yes" : "no") << "\">";
1907 t << convertToXML(inc.includeName);
1908 t << "</includes>\n";
1909 }
1910
1911 for (const auto &inc : fd->includedByFileList())
1912 {
1913 t << " <includedby";
1914 if (inc.fileDef && !inc.fileDef->isReference()) // TODO: support external references
1915 {
1916 t << " refid=\"" << inc.fileDef->getOutputFileBase() << "\"";
1917 }
1918 t << " local=\"" << ((inc.kind &IncludeKind_LocalMask) ? "yes" : "no") << "\">";
1919 t << convertToXML(inc.includeName);
1920 t << "</includedby>\n";
1921 }
1922
1923 DotInclDepGraph incDepGraph(fd,FALSE);
1924 if (!incDepGraph.isTrivial())
1925 {
1926 t << " <incdepgraph>\n";
1927 incDepGraph.writeXML(t);
1928 t << " </incdepgraph>\n";
1929 }
1930
1931 DotInclDepGraph invIncDepGraph(fd,TRUE);
1932 if (!invIncDepGraph.isTrivial())
1933 {
1934 t << " <invincdepgraph>\n";
1935 invIncDepGraph.writeXML(t);
1936 t << " </invincdepgraph>\n";
1937 }
1938
1942
1943 for (const auto &mg : fd->getMemberGroups())
1944 {
1945 generateXMLSection(fd,ti,t,&mg->members(),"user-defined",mg->header(),
1946 mg->documentation());
1947 }
1948
1949 for (const auto &ml : fd->getMemberLists())
1950 {
1951 if (ml->listType().isDeclaration())
1952 {
1953 generateXMLSection(fd,ti,t,ml.get(),ml->listType().toXML());
1954 }
1955 }
1956
1957 t << " <briefdescription>\n";
1958 writeXMLDocBlock(t,fd->briefFile(),fd->briefLine(),fd,nullptr,fd->briefDescription());
1959 t << " </briefdescription>\n";
1960 t << " <detaileddescription>\n";
1961 writeXMLDocBlock(t,fd->docFile(),fd->docLine(),fd,nullptr,fd->documentation());
1962 t << " </detaileddescription>\n";
1963 if (Config_getBool(XML_PROGRAMLISTING))
1964 {
1965 writeXMLCodeBlock(t,fd);
1966 }
1968 t << " <location file=\"" << convertToXML(stripFromPath(fd->getDefFileName())) << "\"/>\n";
1969 t << " </compounddef>\n";
1970 t << "</doxygen>\n";
1971
1972 ti << " </compound>\n";
1973}
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:1359
void writeXMLCodeBlock(TextStream &t, FileDef *fd)
Definition xmlgen.cpp:481
static void writeInnerNamespaces(const NamespaceLinkedRefMap &nl, TextStream &t)
Definition xmlgen.cpp:1383

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(), writeRequirementRefs(), DotInclDepGraph::writeXML(), writeXMLCodeBlock(), writeXMLDocBlock(), writeXMLHeader(), and writeXMLString().

Referenced by generateXML().

◆ generateXMLForGroup()

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

Definition at line 1975 of file xmlgen.cpp.

1976{
1977 // + members
1978 // + member groups
1979 // + files
1980 // + classes
1981 // + namespaces
1982 // - packages
1983 // + pages
1984 // + child groups
1985 // - examples
1986 // + brief description
1987 // + detailed description
1988
1989 if (gd->isReference()) return; // skip external references
1990
1991 ti << " <compound refid=\"" << gd->getOutputFileBase()
1992 << "\" kind=\"group\"><name>" << convertToXML(gd->name()) << "</name>\n";
1993
1994 QCString outputDirectory = Config_getString(XML_OUTPUT);
1995 QCString fileName=outputDirectory+"/"+gd->getOutputFileBase()+".xml";
1996 std::ofstream f = Portable::openOutputStream(fileName);
1997 if (!f.is_open())
1998 {
1999 err("Cannot open file {} for writing!\n",fileName);
2000 return;
2001 }
2002 TextStream t(&f);
2003
2004 writeXMLHeader(t);
2005 t << " <compounddef id=\""
2006 << gd->getOutputFileBase() << "\" kind=\"group\">\n";
2007 t << " <compoundname>" << convertToXML(gd->name()) << "</compoundname>\n";
2008 t << " <title>" << convertToXML(gd->groupTitle()) << "</title>\n";
2009
2011 writeInnerFiles(gd->getFiles(),t);
2015 writeInnerPages(gd->getPages(),t);
2017
2018 for (const auto &mg : gd->getMemberGroups())
2019 {
2020 generateXMLSection(gd,ti,t,&mg->members(),"user-defined",mg->header(),
2021 mg->documentation());
2022 }
2023
2024 for (const auto &ml : gd->getMemberLists())
2025 {
2026 if (ml->listType().isDeclaration())
2027 {
2028 generateXMLSection(gd,ti,t,ml.get(),ml->listType().toXML());
2029 }
2030 }
2031
2032 t << " <briefdescription>\n";
2033 writeXMLDocBlock(t,gd->briefFile(),gd->briefLine(),gd,nullptr,gd->briefDescription());
2034 t << " </briefdescription>\n";
2035 t << " <detaileddescription>\n";
2036 writeXMLDocBlock(t,gd->docFile(),gd->docLine(),gd,nullptr,gd->documentation());
2037 t << " </detaileddescription>\n";
2039 t << " </compounddef>\n";
2040 t << "</doxygen>\n";
2041
2042 ti << " </compound>\n";
2043}
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:1440
static void writeInnerPages(const PageLinkedRefMap &pl, TextStream &t)
Definition xmlgen.cpp:1427
static void writeInnerModules(const ModuleLinkedRefMap &ml, TextStream &t)
Definition xmlgen.cpp:1371

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(), writeRequirementRefs(), writeXMLDocBlock(), and writeXMLHeader().

Referenced by generateXML().

◆ generateXMLForMember()

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

Definition at line 672 of file xmlgen.cpp.

673{
674
675 // + declaration/definition arg lists
676 // + reimplements
677 // + reimplementedBy
678 // + exceptions
679 // + const/volatile specifiers
680 // - examples
681 // + source definition
682 // + source references
683 // + source referenced by
684 // - body code
685 // + template arguments
686 // (templateArguments(), definitionTemplateParameterLists())
687 // - call graph
688
689 // enum values are written as part of the enum
690 if (md->memberType()==MemberType::EnumValue) return;
691 if (md->isHidden()) return;
692
693 LinkifyTextOptions options;
694 options.setScope(def).setFileScope(md->getBodyDef()).setSelf(md);
695
696 // group members are only visible in their group
697 bool groupMember = md->getGroupDef() && def->definitionType()!=Definition::TypeGroup;
698
699 QCString memType;
700 bool isFunc=FALSE;
701 switch (md->memberType())
702 {
703 case MemberType::Define: memType="define"; break;
704 case MemberType::Function: memType="function"; isFunc=TRUE; break;
705 case MemberType::Variable: memType="variable"; break;
706 case MemberType::Typedef: memType="typedef"; break;
707 case MemberType::Enumeration: memType="enum"; break;
708 case MemberType::EnumValue: ASSERT(0); break;
709 case MemberType::Signal: memType="signal"; isFunc=TRUE; break;
710 case MemberType::Slot: memType="slot"; isFunc=TRUE; break;
711 case MemberType::Friend: memType="friend"; isFunc=TRUE; break;
712 case MemberType::DCOP: memType="dcop"; isFunc=TRUE; break;
713 case MemberType::Property: memType="property"; break;
714 case MemberType::Event: memType="event"; break;
715 case MemberType::Interface: memType="interface"; break;
716 case MemberType::Service: memType="service"; break;
717 case MemberType::Sequence: memType="sequence"; break;
718 case MemberType::Dictionary: memType="dictionary"; break;
719 }
720
721 QCString nameStr = md->name();
722 QCString typeStr = md->typeString();
723 QCString argsStr = md->argsString();
724 QCString defStr = md->definition();
725 defStr.stripPrefix("constexpr ");
726 defStr.stripPrefix("consteval ");
727 defStr.stripPrefix("constinit ");
728 stripQualifiers(typeStr);
729 if (typeStr=="auto")
730 {
731 int i=argsStr.findRev("->");
732 if (i!=-1) // move trailing return type into type and strip it from argsStr
733 {
734 typeStr=argsStr.mid(i+2).stripWhiteSpace();
735 argsStr=argsStr.left(i).stripWhiteSpace();
736 if (stripKeyword(typeStr, "override", true))
737 {
738 argsStr += " override";
739 }
740 if (stripKeyword(typeStr, "final", true))
741 {
742 argsStr += " final";
743 }
744 if (stripKeyword(typeStr, "=0", false))
745 {
746 argsStr += "=0";
747 }
748 if (stripKeyword(typeStr, "=default", false))
749 {
750 argsStr += "=default";
751 }
752 if (stripKeyword(typeStr, "=delete", false))
753 {
754 argsStr += "=delete";
755 }
756 i=defStr.find("auto ");
757 if (i!=-1)
758 {
759 defStr=defStr.left(i)+typeStr+defStr.mid(i+4);
760 }
761 }
762 }
763 QCString noExceptExpr = extractNoExcept(argsStr);
764
765 ti << " <member refid=\"" << memberOutputFileBase(md)
766 << "_1" << md->anchor() << "\" kind=\"" << memType << "\"><name>"
767 << convertToXML(nameStr) << "</name></member>\n";
768
769 if (groupMember)
770 {
771 t << " <member refid=\""
773 << "_1" << md->anchor() << "\" kind=\"" << memType << "\"><name>"
774 << convertToXML(nameStr) << "</name></member>\n";
775 return;
776 }
777 else
778 {
779 t << " <memberdef kind=\"";
780 t << memType << "\" id=\"";
781 t << memberOutputFileBase(md);
782 t << "_1" // encoded ':' character (see util.cpp:convertNameToFile)
783 << md->anchor();
784 }
785 //enum { define_t,variable_t,typedef_t,enum_t,function_t } xmlType = function_t;
786
787 t << "\" prot=\"" << to_string_lower(md->protection());
788 t << "\"";
789
790 t << " static=\"";
791 if (md->isStatic()) t << "yes"; else t << "no";
792 t << "\"";
793
794 if (md->isNoDiscard())
795 {
796 t << " nodiscard=\"yes\"";
797 }
798
799 if (md->isConstExpr())
800 {
801 t << " constexpr=\"yes\"";
802 }
803
804 if (md->isConstEval())
805 {
806 t << " consteval=\"yes\"";
807 }
808
809 if (md->isConstInit())
810 {
811 t << " constinit=\"yes\"";
812 }
813
814 if (md->isExternal())
815 {
816 t << " extern=\"yes\"";
817 }
818
819 if (isFunc)
820 {
821 const ArgumentList &al = md->argumentList();
822 t << " const=\"";
823 if (al.constSpecifier()) t << "yes"; else t << "no";
824 t << "\"";
825
826 t << " explicit=\"";
827 if (md->isExplicit()) t << "yes"; else t << "no";
828 t << "\"";
829
830 t << " inline=\"";
831 if (md->isInline()) t << "yes"; else t << "no";
832 t << "\"";
833
835 {
836 t << " refqual=\"";
837 if (al.refQualifier()==RefQualifierType::LValue) t << "lvalue"; else t << "rvalue";
838 t << "\"";
839 }
840
841 if (md->isFinal())
842 {
843 t << " final=\"yes\"";
844 }
845
846 if (md->isSealed())
847 {
848 t << " sealed=\"yes\"";
849 }
850
851 if (md->isNew())
852 {
853 t << " new=\"yes\"";
854 }
855
856 if (md->isOptional())
857 {
858 t << " optional=\"yes\"";
859 }
860
861 if (md->isRequired())
862 {
863 t << " required=\"yes\"";
864 }
865
866 if (md->isNoExcept())
867 {
868 t << " noexcept=\"yes\"";
869 }
870
871 if (!noExceptExpr.isEmpty())
872 {
873 t << " noexceptexpression=\"" << convertToXML(noExceptExpr) << "\"";
874 }
875
876 if (al.volatileSpecifier())
877 {
878 t << " volatile=\"yes\"";
879 }
880
881 t << " virt=\"" << to_string_lower(md->virtualness());
882 t << "\"";
883 }
884
886 {
887 t << " strong=\"";
888 if (md->isStrong()) t << "yes"; else t << "no";
889 t << "\"";
890 }
891
892 if (md->memberType() == MemberType::Variable)
893 {
894 //ArgumentList *al = md->argumentList();
895 //t << " volatile=\"";
896 //if (al && al->volatileSpecifier) t << "yes"; else t << "no";
897
898 t << " mutable=\"";
899 if (md->isMutable()) t << "yes"; else t << "no";
900 t << "\"";
901
902 if (md->isThreadLocal())
903 {
904 t << " thread_local=\"yes\"";
905 }
906
907 if (md->isInitonly())
908 {
909 t << " initonly=\"yes\"";
910 }
911 if (md->isAttribute())
912 {
913 t << " attribute=\"yes\"";
914 }
915 if (md->isUNOProperty())
916 {
917 t << " property=\"yes\"";
918 }
919 if (md->isReadonly())
920 {
921 t << " readonly=\"yes\"";
922 }
923 if (md->isBound())
924 {
925 t << " bound=\"yes\"";
926 }
927 if (md->isRemovable())
928 {
929 t << " removable=\"yes\"";
930 }
931 if (md->isConstrained())
932 {
933 t << " constrained=\"yes\"";
934 }
935 if (md->isTransient())
936 {
937 t << " transient=\"yes\"";
938 }
939 if (md->isMaybeVoid())
940 {
941 t << " maybevoid=\"yes\"";
942 }
943 if (md->isMaybeDefault())
944 {
945 t << " maybedefault=\"yes\"";
946 }
947 if (md->isMaybeAmbiguous())
948 {
949 t << " maybeambiguous=\"yes\"";
950 }
951 }
952 else if (md->memberType() == MemberType::Property)
953 {
954 t << " readable=\"";
955 if (md->isReadable()) t << "yes"; else t << "no";
956 t << "\"";
957
958 t << " writable=\"";
959 if (md->isWritable()) t << "yes"; else t << "no";
960 t << "\"";
961
962 t << " gettable=\"";
963 if (md->isGettable()) t << "yes"; else t << "no";
964 t << "\"";
965
966 t << " privategettable=\"";
967 if (md->isPrivateGettable()) t << "yes"; else t << "no";
968 t << "\"";
969
970 t << " protectedgettable=\"";
971 if (md->isProtectedGettable()) t << "yes"; else t << "no";
972 t << "\"";
973
974 t << " settable=\"";
975 if (md->isSettable()) t << "yes"; else t << "no";
976 t << "\"";
977
978 t << " privatesettable=\"";
979 if (md->isPrivateSettable()) t << "yes"; else t << "no";
980 t << "\"";
981
982 t << " protectedsettable=\"";
983 if (md->isProtectedSettable()) t << "yes"; else t << "no";
984 t << "\"";
985
986 if (md->isAssign() || md->isCopy() || md->isRetain() || md->isStrong() || md->isWeak())
987 {
988 t << " accessor=\"";
989 if (md->isAssign()) t << "assign";
990 else if (md->isCopy()) t << "copy";
991 else if (md->isRetain()) t << "retain";
992 else if (md->isStrong()) t << "strong";
993 else if (md->isWeak()) t << "weak";
994 t << "\"";
995 }
996 }
997 else if (md->memberType() == MemberType::Event)
998 {
999 t << " add=\"";
1000 if (md->isAddable()) t << "yes"; else t << "no";
1001 t << "\"";
1002
1003 t << " remove=\"";
1004 if (md->isRemovable()) t << "yes"; else t << "no";
1005 t << "\"";
1006
1007 t << " raise=\"";
1008 if (md->isRaisable()) t << "yes"; else t << "no";
1009 t << "\"";
1010 }
1011
1012 t << ">\n";
1013
1014 if (md->memberType()!=MemberType::Define &&
1016 )
1017 {
1019 t << " <type>";
1020 linkifyText(TextGeneratorXMLImpl(t),typeStr,options);
1021 t << "</type>\n";
1022 if (md->isTypeAlias())
1023 {
1024 defStr+=" = "+md->initializer();
1025 }
1026 t << " <definition>" << convertToXML(defStr) << "</definition>\n";
1027 t << " <argsstring>" << convertToXML(argsStr) << "</argsstring>\n";
1028 }
1029
1031 {
1032 t << " <type>";
1034 t << "</type>\n";
1035 }
1036
1037 QCString qualifiedNameStr = md->qualifiedName();
1038 t << " <name>" << convertToXML(nameStr) << "</name>\n";
1039 if (nameStr!=qualifiedNameStr)
1040 {
1041 t << " <qualifiedname>" << convertToXML(qualifiedNameStr) << "</qualifiedname>\n";
1042 }
1043
1044 if (md->memberType() == MemberType::Property)
1045 {
1046 if (md->isReadable())
1047 t << " <read>" << convertToXML(md->getReadAccessor()) << "</read>\n";
1048 if (md->isWritable())
1049 t << " <write>" << convertToXML(md->getWriteAccessor()) << "</write>\n";
1050 }
1051
1053 {
1054 QCString bitfield = md->bitfieldString();
1055 if (bitfield.at(0)==':') bitfield=bitfield.mid(1);
1056 t << " <bitfield>" << convertToXML(bitfield) << "</bitfield>\n";
1057 }
1058
1059 const MemberDef *rmd = md->reimplements();
1060 if (rmd)
1061 {
1062 t << " <reimplements refid=\""
1063 << memberOutputFileBase(rmd) << "_1" << rmd->anchor() << "\">"
1064 << convertToXML(rmd->name()) << "</reimplements>\n";
1065 }
1066 for (const auto &rbmd : md->reimplementedBy())
1067 {
1068 t << " <reimplementedby refid=\""
1069 << memberOutputFileBase(rbmd) << "_1" << rbmd->anchor() << "\">"
1070 << convertToXML(rbmd->name()) << "</reimplementedby>\n";
1071 }
1072
1073 for (const auto &qmd : md->getQualifiers())
1074 {
1075 t << " <qualifier>" << convertToXML(qmd) << "</qualifier>\n";
1076 }
1077
1078 if (md->isFriendClass()) // for friend classes we show a link to the class as a "parameter"
1079 {
1080 t << " <param>\n";
1081 t << " <type>";
1082 linkifyText(TextGeneratorXMLImpl(t),nameStr,options);
1083 t << "</type>\n";
1084 t << " </param>\n";
1085 }
1086 else if (isFunc) //function
1087 {
1088 const ArgumentList &declAl = md->declArgumentList();
1089 const ArgumentList &defAl = md->argumentList();
1090 bool isFortran = md->getLanguage()==SrcLangExt::Fortran;
1091 if (declAl.hasParameters())
1092 {
1093 auto defIt = defAl.begin();
1094 for (const Argument &a : declAl)
1095 {
1096 //const Argument *defArg = defAli.current();
1097 const Argument *defArg = nullptr;
1098 if (defIt!=defAl.end())
1099 {
1100 defArg = &(*defIt);
1101 ++defIt;
1102 }
1103 t << " <param>\n";
1104 if (!a.attrib.isEmpty())
1105 {
1106 t << " <attributes>";
1107 writeXMLString(t,a.attrib);
1108 t << "</attributes>\n";
1109 }
1110 if (isFortran && defArg && !defArg->type.isEmpty())
1111 {
1112 t << " <type>";
1113 linkifyText(TextGeneratorXMLImpl(t),defArg->type,options);
1114 t << "</type>\n";
1115 }
1116 else if (!a.type.isEmpty())
1117 {
1118 t << " <type>";
1119 linkifyText(TextGeneratorXMLImpl(t),a.type,options);
1120 t << "</type>\n";
1121 }
1122 if (!a.name.isEmpty())
1123 {
1124 t << " <declname>";
1125 writeXMLString(t,a.name);
1126 t << "</declname>\n";
1127 }
1128 if (defArg && !defArg->name.isEmpty() && defArg->name!=a.name)
1129 {
1130 t << " <defname>";
1131 writeXMLString(t,defArg->name);
1132 t << "</defname>\n";
1133 }
1134 if (!a.array.isEmpty())
1135 {
1136 t << " <array>";
1137 writeXMLString(t,a.array);
1138 t << "</array>\n";
1139 }
1140 if (!a.defval.isEmpty())
1141 {
1142 t << " <defval>";
1143 linkifyText(TextGeneratorXMLImpl(t),a.defval,options);
1144 t << "</defval>\n";
1145 }
1146 if (defArg && defArg->hasDocumentation())
1147 {
1148 t << " <briefdescription>";
1150 md->getOuterScope(),md,defArg->docs);
1151 t << "</briefdescription>\n";
1152 }
1153 t << " </param>\n";
1154 }
1155 }
1156 }
1157 else if (md->memberType()==MemberType::Define &&
1158 !md->argsString().isEmpty()) // define
1159 {
1160 if (md->argumentList().empty()) // special case for "foo()" to
1161 // distinguish it from "foo".
1162 {
1163 t << " <param></param>\n";
1164 }
1165 else
1166 {
1167 for (const Argument &a : md->argumentList())
1168 {
1169 t << " <param><defname>" << a.type << "</defname></param>\n";
1170 }
1171 }
1172 }
1173 if (!md->requiresClause().isEmpty())
1174 {
1175 t << " <requiresclause>";
1177 t << " </requiresclause>\n";
1178 }
1179
1180 if (!md->isTypeAlias() && (md->hasOneLineInitializer() || md->hasMultiLineInitializer()))
1181 {
1182 t << " <initializer>";
1184 t << "</initializer>\n";
1185 }
1186
1187 if (!md->excpString().isEmpty())
1188 {
1189 t << " <exceptions>";
1191 t << "</exceptions>\n";
1192 }
1193 writeRequirementRefs(md,t," ");
1194
1195 if (md->memberType()==MemberType::Enumeration) // enum
1196 {
1197 for (const auto &emd : md->enumFieldList())
1198 {
1199 ti << " <member refid=\"" << memberOutputFileBase(md)
1200 << "_1" << emd->anchor() << "\" kind=\"enumvalue\"><name>"
1201 << convertToXML(emd->name()) << "</name></member>\n";
1202
1203 t << " <enumvalue id=\"" << memberOutputFileBase(md) << "_1"
1204 << emd->anchor() << "\" prot=\"" << to_string_lower(emd->protection());
1205 t << "\">\n";
1206 t << " <name>";
1207 writeXMLString(t,emd->name());
1208 t << "</name>\n";
1209 if (!emd->initializer().isEmpty())
1210 {
1211 t << " <initializer>";
1212 writeXMLString(t,emd->initializer());
1213 t << "</initializer>\n";
1214 }
1215 t << " <briefdescription>\n";
1216 writeXMLDocBlock(t,emd->briefFile(),emd->briefLine(),emd->getOuterScope(),emd,emd->briefDescription());
1217 t << " </briefdescription>\n";
1218 t << " <detaileddescription>\n";
1219 writeXMLDocBlock(t,emd->docFile(),emd->docLine(),emd->getOuterScope(),emd,emd->documentation());
1220 t << " </detaileddescription>\n";
1221 t << " </enumvalue>\n";
1222 }
1223 }
1224 t << " <briefdescription>\n";
1226 t << " </briefdescription>\n";
1227 t << " <detaileddescription>\n";
1228 writeXMLDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
1229 t << " </detaileddescription>\n";
1230 t << " <inbodydescription>\n";
1232 t << " </inbodydescription>\n";
1233 if (md->getDefLine()!=-1)
1234 {
1235 t << " <location file=\""
1236 << convertToXML(stripFromPath(md->getDefFileName())) << "\" line=\""
1237 << md->getDefLine() << "\" column=\""
1238 << md->getDefColumn() << "\"" ;
1239 if (md->getStartBodyLine()!=-1)
1240 {
1241 const FileDef *bodyDef = md->getBodyDef();
1242 if (bodyDef)
1243 {
1244 t << " bodyfile=\"" << convertToXML(stripFromPath(bodyDef->absFilePath())) << "\"";
1245 }
1246 t << " bodystart=\"" << md->getStartBodyLine() << "\" bodyend=\""
1247 << md->getEndBodyLine() << "\"";
1248 }
1249 if (md->getDeclLine()!=-1)
1250 {
1251 t << " declfile=\"" << convertToXML(stripFromPath(md->getDeclFileName())) << "\" declline=\""
1252 << md->getDeclLine() << "\" declcolumn=\""
1253 << md->getDeclColumn() << "\"";
1254 }
1255 t << "/>\n";
1256 }
1257
1258 //printf("md->getReferencesMembers()=%p\n",md->getReferencesMembers());
1259 auto refList = md->getReferencesMembers();
1260 for (const auto &refmd : refList)
1261 {
1262 writeMemberReference(t,def,refmd,"references");
1263 }
1264 auto refByList = md->getReferencedByMembers();
1265 for (const auto &refmd : refByList)
1266 {
1267 writeMemberReference(t,def,refmd,"referencedby");
1268 }
1269
1270 t << " </memberdef>\n";
1271}
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 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 bool isThreadLocal() 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:593
int findRev(char c, int index=-1, bool cs=TRUE) const
Definition qcstring.cpp:96
bool stripPrefix(const QCString &prefix)
Definition qcstring.h:213
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
LinkifyTextOptions & setSelf(const Definition *self)
Definition util.h:116
@ 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:500
static QCString memberOutputFileBase(const MemberDef *md)
Definition xmlgen.cpp:548
static void writeMemberTemplateLists(const MemberDef *md, TextStream &t)
Definition xmlgen.cpp:433
static bool stripKeyword(QCString &str, const char *keyword, bool needSpace)
Definition xmlgen.cpp:562
static void stripQualifiers(QCString &typeStr)
Definition xmlgen.cpp:523
static QCString extractNoExcept(QCString &argsStr)
Definition xmlgen.cpp:606

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::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::isThreadLocal(), 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, LinkifyTextOptions::setFileScope(), LinkifyTextOptions::setScope(), LinkifyTextOptions::setSelf(), Signal, Slot, stripFromPath(), stripKeyword(), QCString::stripPrefix(), stripQualifiers(), QCString::stripWhiteSpace(), to_string_lower(), TRUE, Argument::type, Typedef, Definition::TypeGroup, MemberDef::typeString(), Variable, MemberDef::virtualness(), ArgumentList::volatileSpecifier(), writeMemberReference(), writeMemberTemplateLists(), writeRequirementRefs(), writeXMLDocBlock(), and writeXMLString().

Referenced by generateXMLSection().

◆ generateXMLForModule()

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

Definition at line 1730 of file xmlgen.cpp.

1731{
1732 if (mod->isReference() || mod->isHidden() || !mod->isPrimaryInterface()) return;
1733 ti << " <compound refid=\"" << mod->getOutputFileBase()
1734 << "\" kind=\"module\"" << "><name>"
1735 << convertToXML(mod->name()) << "</name>\n";
1736
1737 QCString outputDirectory = Config_getString(XML_OUTPUT);
1738 QCString fileName=outputDirectory+"/"+mod->getOutputFileBase()+".xml";
1739 std::ofstream f = Portable::openOutputStream(fileName);
1740 if (!f.is_open())
1741 {
1742 err("Cannot open file {} for writing!\n",fileName);
1743 return;
1744 }
1745 TextStream t(&f);
1746 writeXMLHeader(t);
1747 t << " <compounddef id=\"" << mod->getOutputFileBase()
1748 << "\" kind=\"module\">\n";
1749 t << " <compoundname>";
1750 writeXMLString(t,mod->name());
1751 t << "</compoundname>\n";
1752 writeInnerFiles(mod->getUsedFiles(),t);
1753 writeInnerClasses(mod->getClasses(),t);
1755 for (const auto &ml : mod->getMemberLists())
1756 {
1757 if (ml->listType().isDeclaration())
1758 {
1759 generateXMLSection(mod,ti,t,ml.get(),ml->listType().toXML());
1760 }
1761 }
1762 for (const auto &mg : mod->getMemberGroups())
1763 {
1764 generateXMLSection(mod,ti,t,&mg->members(),"user-defined",mg->header(),
1765 mg->documentation());
1766 }
1767 t << " <briefdescription>\n";
1768 writeXMLDocBlock(t,mod->briefFile(),mod->briefLine(),mod,nullptr,mod->briefDescription());
1769 t << " </briefdescription>\n";
1770 t << " <detaileddescription>\n";
1771 writeXMLDocBlock(t,mod->docFile(),mod->docLine(),mod,nullptr,mod->documentation());
1772 t << " </detaileddescription>\n";
1773 writeExports(mod->getExports(),t);
1774 writeRequirementRefs(mod,t);
1775 t << " <location file=\""
1776 << convertToXML(stripFromPath(mod->getDefFileName())) << "\" line=\""
1777 << mod->getDefLine() << "\"" << " column=\""
1778 << mod->getDefColumn() << "\"/>\n" ;
1779 t << " </compounddef>\n";
1780 t << "</doxygen>\n";
1781
1782 ti << " </compound>\n";
1783
1784}
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:1396

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(), writeRequirementRefs(), writeXMLDocBlock(), writeXMLHeader(), and writeXMLString().

Referenced by generateXML().

◆ generateXMLForNamespace()

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

Definition at line 1786 of file xmlgen.cpp.

1787{
1788 // + contained class definitions
1789 // + contained namespace definitions
1790 // + member groups
1791 // + normal members
1792 // + brief desc
1793 // + detailed desc
1794 // + location
1795 // - files containing (parts of) the namespace definition
1796
1797 if (nd->isReference() || nd->isHidden()) return; // skip external references
1798
1799 ti << " <compound refid=\"" << nd->getOutputFileBase()
1800 << "\" kind=\"namespace\"" << "><name>"
1801 << convertToXML(nd->name()) << "</name>\n";
1802
1803 QCString outputDirectory = Config_getString(XML_OUTPUT);
1804 QCString fileName=outputDirectory+"/"+nd->getOutputFileBase()+".xml";
1805 std::ofstream f = Portable::openOutputStream(fileName);
1806 if (!f.is_open())
1807 {
1808 err("Cannot open file {} for writing!\n",fileName);
1809 return;
1810 }
1811 TextStream t(&f);
1812
1813 writeXMLHeader(t);
1814 t << " <compounddef id=\"" << nd->getOutputFileBase()
1815 << "\" kind=\"namespace\" "
1816 << (nd->isInline()?"inline=\"yes\" ":"")
1817 << "language=\""
1818 << langToString(nd->getLanguage()) << "\">\n";
1819 t << " <compoundname>";
1820 QCString nameStr = nd->name();
1821 writeXMLString(t,nameStr);
1822 t << "</compoundname>\n";
1823
1827
1828 for (const auto &mg : nd->getMemberGroups())
1829 {
1830 generateXMLSection(nd,ti,t,&mg->members(),"user-defined",mg->header(),
1831 mg->documentation());
1832 }
1833
1834 for (const auto &ml : nd->getMemberLists())
1835 {
1836 if (ml->listType().isDeclaration())
1837 {
1838 generateXMLSection(nd,ti,t,ml.get(),ml->listType().toXML());
1839 }
1840 }
1841
1842 t << " <briefdescription>\n";
1843 writeXMLDocBlock(t,nd->briefFile(),nd->briefLine(),nd,nullptr,nd->briefDescription());
1844 t << " </briefdescription>\n";
1845 t << " <detaileddescription>\n";
1846 writeXMLDocBlock(t,nd->docFile(),nd->docLine(),nd,nullptr,nd->documentation());
1847 t << " </detaileddescription>\n";
1849 t << " <location file=\""
1850 << convertToXML(stripFromPath(nd->getDefFileName())) << "\" line=\""
1851 << nd->getDefLine() << "\"" << " column=\""
1852 << nd->getDefColumn() << "\"/>\n" ;
1853 t << " </compounddef>\n";
1854 t << "</doxygen>\n";
1855
1856 ti << " </compound>\n";
1857}
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(), stripFromPath(), MemberListType::toXML(), writeInnerClasses(), writeInnerConcepts(), writeInnerNamespaces(), writeRequirementRefs(), writeXMLDocBlock(), writeXMLHeader(), and writeXMLString().

Referenced by generateXML().

◆ generateXMLForPage()

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

Definition at line 2139 of file xmlgen.cpp.

2140{
2141 // + name
2142 // + title
2143 // + documentation
2144 // + location
2145
2146 const char *kindName = isExample ? "example" : "page";
2147
2148 if (pd->isReference()) return;
2149
2150 QCString pageName = pd->getOutputFileBase();
2151 if (pd->getGroupDef())
2152 {
2153 pageName+=QCString("_")+pd->name();
2154 }
2155 if (pageName=="index")
2156 {
2157 pageName="indexpage"; // to prevent overwriting the generated index page.
2158 }
2159 else if (pageName=="requirements")
2160 {
2162 return; // requirements are listed separately
2163 }
2164
2165 ti << " <compound refid=\"" << pageName
2166 << "\" kind=\"" << kindName << "\"><name>" << convertToXML(pd->name())
2167 << "</name>\n";
2168
2169 QCString outputDirectory = Config_getString(XML_OUTPUT);
2170 QCString fileName=outputDirectory+"/"+pageName+".xml";
2171 std::ofstream f = Portable::openOutputStream(fileName);
2172 if (!f.is_open())
2173 {
2174 err("Cannot open file {} for writing!\n",fileName);
2175 return;
2176 }
2177 TextStream t(&f);
2178
2179 writeXMLHeader(t);
2180 t << " <compounddef id=\"" << pageName;
2181 t << "\" kind=\"" << kindName << "\">\n";
2182 t << " <compoundname>" << convertToXML(pd->name())
2183 << "</compoundname>\n";
2184
2185 if (pd==Doxygen::mainPage.get()) // main page is special
2186 {
2187 QCString title;
2188 if (mainPageHasTitle())
2189 {
2191 }
2192 else
2193 {
2194 title = Config_getString(PROJECT_NAME);
2195 }
2196 t << " <title>" << convertToXML(convertCharEntitiesToUTF8(title))
2197 << "</title>\n";
2198 }
2199 else
2200 {
2201 const SectionInfo *si = SectionManager::instance().find(pd->name());
2202 if (si)
2203 {
2204 t << " <title>" << convertToXML(filterTitle(convertCharEntitiesToUTF8(si->title())))
2205 << "</title>\n";
2206 }
2207 }
2209 const SectionRefs &sectionRefs = pd->getSectionRefs();
2210 if (pd->localToc().isXmlEnabled() && !sectionRefs.empty())
2211 {
2212 int level=1;
2213 int indent=0;
2214 auto writeIndent = [&]() { for (int i=0;i<4+indent*2;i++) t << " "; };
2215 auto incIndent = [&](const char *text) { writeIndent(); t << text << "\n"; indent++; };
2216 auto decIndent = [&](const char *text) { indent--; writeIndent(); t << text << "\n"; };
2217 incIndent("<tableofcontents>");
2218 int maxLevel = pd->localToc().xmlLevel();
2219 BoolVector inLi(maxLevel+1,false);
2220 for (const SectionInfo *si : sectionRefs)
2221 {
2222 if (si->type().isSection())
2223 {
2224 //printf(" level=%d title=%s\n",level,qPrint(si->title));
2225 int nextLevel = si->type().level();
2226 if (nextLevel>level)
2227 {
2228 for (int l=level;l<nextLevel;l++)
2229 {
2230 if (l < maxLevel) incIndent("<tableofcontents>");
2231 }
2232 }
2233 else if (nextLevel<level)
2234 {
2235 for (int l=level;l>nextLevel;l--)
2236 {
2237 if (l <= maxLevel && inLi[l]) decIndent("</tocsect>");
2238 inLi[l]=false;
2239 if (l <= maxLevel) decIndent("</tableofcontents>");
2240 }
2241 }
2242 if (nextLevel <= maxLevel)
2243 {
2244 if (inLi[nextLevel])
2245 {
2246 decIndent("</tocsect>");
2247 }
2248 else if (level>nextLevel)
2249 {
2250 decIndent("</tableofcontents>");
2251 incIndent("<tableofcontents>");
2252 }
2253 QCString titleDoc = convertToXML(si->title());
2254 QCString label = convertToXML(si->label());
2255 if (titleDoc.isEmpty()) titleDoc = label;
2256 incIndent("<tocsect>");
2257 writeIndent(); t << "<name>" << titleDoc << "</name>\n"; // kept for backwards compatibility
2258 writeIndent(); t << "<docs>";
2259 if (!si->title().isEmpty())
2260 {
2261 writeXMLDocBlock(t,pd->docFile(),pd->docLine(),pd,nullptr,si->title());
2262 }
2263 t << "</docs>\n";
2264 writeIndent(); t << "<reference>" << convertToXML(pageName) << "_1" << label << "</reference>\n";
2265 inLi[nextLevel]=true;
2266 level = nextLevel;
2267 }
2268 }
2269 }
2270 while (level>1 && level <= maxLevel)
2271 {
2272 if (inLi[level]) decIndent("</tocsect>");
2273 inLi[level]=false;
2274 decIndent("</tableofcontents>");
2275 level--;
2276 }
2277 if (level <= maxLevel && inLi[level]) decIndent("</tocsect>");
2278 inLi[level]=false;
2279 decIndent("</tableofcontents>");
2280 }
2281 t << " <briefdescription>\n";
2282 writeXMLDocBlock(t,pd->briefFile(),pd->briefLine(),pd,nullptr,pd->briefDescription());
2283 t << " </briefdescription>\n";
2284 t << " <detaileddescription>\n";
2285 if (isExample)
2286 {
2287 writeXMLDocBlock(t,pd->docFile(),pd->docLine(),pd,nullptr,
2288 pd->documentation()+"\n\\include "+pd->name());
2289 }
2290 else
2291 {
2292 writeXMLDocBlock(t,pd->docFile(),pd->docLine(),pd,nullptr,
2293 pd->documentation());
2294 }
2295 t << " </detaileddescription>\n";
2297
2298 t << " <location file=\"" << convertToXML(stripFromPath(pd->getDefFileName())) << "\"/>\n";
2299
2300 t << " </compounddef>\n";
2301 t << "</doxygen>\n";
2302
2303 ti << " </compound>\n";
2304}
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
constexpr bool isXmlEnabled() const noexcept
Definition types.h:616
constexpr int xmlLevel() const noexcept
Definition types.h:621
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:58
QCString label() const
Definition section.h:69
QCString title() const
Definition section.h:70
SectionType type() const
Definition section.h:71
static SectionManager & instance()
returns a reference to the singleton
Definition section.h:179
class that represents a list of constant references to sections.
Definition section.h:103
bool empty() const
Definition section.h:125
constexpr bool isSection() const
Definition section.h:47
constexpr int level() const
Definition section.h:46
std::vector< bool > BoolVector
Definition containers.h:36
static void writeIndent(TextStream &t, int indent)
Definition qhp.cpp:37
bool mainPageHasTitle()
Definition util.cpp:6302
QCString filterTitle(const QCString &title)
Definition util.cpp:5628
QCString convertCharEntitiesToUTF8(const QCString &str)
Definition util.cpp:4046
void generateXMLForRequirements(PageDef *pd, TextStream &ti)
Definition xmlgen.cpp:2084

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(), generateXMLForRequirements(), 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(), PageDef::title(), SectionInfo::title(), writeIndent(), writeInnerPages(), writeRequirementRefs(), writeXMLDocBlock(), writeXMLHeader(), and LocalToc::xmlLevel().

Referenced by generateXML().

◆ generateXMLForRequirement()

void generateXMLForRequirement ( const RequirementIntf * req,
TextStream & ti )
static

Definition at line 2306 of file xmlgen.cpp.

2307{
2308 QCString pageName = xmlRequirementId(req->id());
2309 ti << " <compound refid=\"" << pageName << "\" kind=\"requirement\"><name>" << convertToXML(req->id()) << "</name>\n";
2310
2311 QCString outputDirectory = Config_getString(XML_OUTPUT);
2312 QCString fileName = outputDirectory+"/"+pageName+".xml";
2313 std::ofstream f = Portable::openOutputStream(fileName);
2314 if (!f.is_open())
2315 {
2316 err("Cannot open file {} for writing!\n",fileName);
2317 return;
2318 }
2319 TextStream t(&f);
2320 writeXMLHeader(t);
2321 t << " <compounddef id=\"" << pageName << "\" kind=\"requirement\">\n";
2322 t << " <compoundname>" << convertToXML(req->id()) << "</compoundname>\n";
2323 t << " <title>" << convertToXML(filterTitle(convertCharEntitiesToUTF8(req->title()))) << "</title>\n";
2324 t << " <detaileddescription>\n";
2325 writeXMLDocBlock(t,req->file(),req->line(),RequirementManager::instance().requirementsPage(),nullptr,req->doc());
2326 t << " </detaileddescription>\n";
2327 t << " <location file=\"" << convertToXML(stripFromPath(req->file())) << "\" line=\"" << req->line() << "\"/>\n" ;
2328 t << " </compounddef>\n";
2329 t << "</doxygen>\n";
2330
2331 ti << " </compound>\n";
2332}
virtual QCString title() const =0
virtual QCString id() const =0
virtual QCString doc() const =0
virtual int line() const =0
virtual QCString file() const =0
QCString xmlRequirementId(const QCString &reqId)
Definition xmlgen.cpp:75

References Config_getString, convertCharEntitiesToUTF8(), convertToXML(), RequirementIntf::doc(), err, RequirementIntf::file(), filterTitle(), RequirementIntf::id(), RequirementManager::instance(), RequirementIntf::line(), Portable::openOutputStream(), stripFromPath(), RequirementIntf::title(), writeXMLDocBlock(), writeXMLHeader(), and xmlRequirementId().

Referenced by generateXML().

◆ generateXMLForRequirements()

void generateXMLForRequirements ( PageDef * pd,
TextStream & ti )

Definition at line 2084 of file xmlgen.cpp.

2085{
2086 ti << " <compound refid=\"requirements\" kind=\"requirements\"><name>" << convertToXML(pd->name()) << "</name>\n";
2087 QCString outputDirectory = Config_getString(XML_OUTPUT);
2088 QCString fileName = outputDirectory+"/requirements.xml";
2089 std::ofstream f = Portable::openOutputStream(fileName);
2090 if (!f.is_open())
2091 {
2092 err("Cannot open file {} for writing!\n",fileName);
2093 return;
2094 }
2095 TextStream t(&f);
2096
2097 auto writeDefsForReq = [&t](const std::vector<const Definition *> &defs,const char *tagName)
2098 {
2099 for (const auto &def : defs)
2100 {
2101 t << " <" << tagName << " refid=\"";
2102 t << def->getOutputFileBase();
2103 if (def->definitionType()==Definition::TypeMember)
2104 {
2105 t << "_1" << def->anchor();
2106 }
2107 t << "\">";
2108 t << convertToXML(def->name());
2109 t << "</" << tagName<< ">\n";
2110 }
2111 };
2112
2113 writeXMLHeader(t);
2114 t << " <compounddef id=\"requirements\" kind=\"requirements\">\n";
2115 t << " <compoundname>" << convertToXML(pd->name()) << "</compoundname>\n";
2116 t << " <requirementslist>\n";
2118 for (const auto &req : reqs)
2119 {
2120 t << " <requirement refid=\"" << req->id();
2121 if (auto tagFile = req->getTagFile(); !tagFile.isEmpty())
2122 {
2123 t << "\" tagfile=\"" << convertToXML(stripFromPath(tagFile)) << "\" page=\"" << convertToXML(req->getExtPage());
2124 }
2125 t << "\">\n";
2126 t << " <title>" << convertToXML(filterTitle(convertCharEntitiesToUTF8(req->title()))) << "</title>\n";
2127 t << " <location file=\"" << convertToXML(stripFromPath(req->file())) << "\" line=\"" << req->line() << "\"/>\n" ;
2128 writeDefsForReq(req->satisfiedBy(),"satisfiedby");
2129 writeDefsForReq(req->verifiedBy(),"verifiedby");
2130 t << " </requirement>\n";
2131 }
2132 t << " </requirementslist>\n";
2133 t << " </compounddef>\n";
2134 t << "</doxygen>\n";
2135
2136 ti << " </compound>\n";
2137}
RequirementIntfList requirements() const

References Config_getString, convertCharEntitiesToUTF8(), convertToXML(), err, filterTitle(), RequirementManager::instance(), Definition::name(), Portable::openOutputStream(), RequirementManager::requirements(), stripFromPath(), Definition::TypeMember, and writeXMLHeader().

Referenced by generateXMLForPage().

◆ 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 1282 of file xmlgen.cpp.

1285{
1286 if (ml==nullptr) return;
1287 int count=0;
1288 for (const auto &md : *ml)
1289 {
1290 if (memberVisible(d,md) && (md->memberType()!=MemberType::EnumValue) &&
1291 !md->isHidden())
1292 {
1293 count++;
1294 }
1295 }
1296 if (count==0) return; // empty list
1297
1298 t << " <sectiondef kind=\"" << kind << "\">\n";
1299 if (!header.isEmpty())
1300 {
1301 t << " <header>" << convertToXML(header) << "</header>\n";
1302 }
1303 if (!documentation.isEmpty())
1304 {
1305 t << " <description>";
1306 writeXMLDocBlock(t,d->docFile(),d->docLine(),d,nullptr,documentation);
1307 t << "</description>\n";
1308 }
1309 for (const auto &md : *ml)
1310 {
1311 if (memberVisible(d,md))
1312 {
1313 generateXMLForMember(md,ti,t,d);
1314 }
1315 }
1316 t << " </sectiondef>\n";
1317}
static bool memberVisible(const Definition *d, const MemberDef *md)
Definition xmlgen.cpp:1275
static void generateXMLForMember(const MemberDef *md, TextStream &ti, TextStream &t, const Definition *def)
Definition xmlgen.cpp:672

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 548 of file xmlgen.cpp.

549{
550 //bool inlineGroupedClasses = Config_getBool(INLINE_GROUPED_CLASSES);
551 //if (inlineGroupedClasses && md->getClassDef() && md->getClassDef()->partOfGroups()!=0)
552 // return md->getClassDef()->getXmlOutputFileBase();
553 //else
554 // return md->getOutputFileBase();
555 return md->getOutputFileBase();
556}

References Definition::getOutputFileBase().

Referenced by generateXMLForMember(), and writeListOfAllMembers().

◆ memberVisible()

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

Definition at line 1275 of file xmlgen.cpp.

1276{
1277 return Config_getBool(XML_NS_MEMB_FILE_SCOPE) ||
1279 md->getNamespaceDef()==nullptr;
1280}
virtual const NamespaceDef * getNamespaceDef() const =0

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

Referenced by generateXMLSection().

◆ stripKeyword()

bool stripKeyword ( QCString & str,
const char * keyword,
bool needSpace )
static

Definition at line 562 of file xmlgen.cpp.

563{
564 bool found = false;
565 int searchStart = 0;
566 int len = static_cast<int>(strlen(keyword));
567 int searchEnd = static_cast<int>(str.size());
568 while (searchStart<searchEnd)
569 {
570 int index = str.find(keyword, searchStart);
571 if (index==-1)
572 {
573 break; // no more occurrences found
574 }
575 int end = index + len;
576 if (needSpace)
577 {
578 if ((index>0 && str[index-1]!=' ') || // at the start of the string or preceded by a space, or
579 (end!=searchEnd && str[end] !=' ') // at the end of the string or followed by a space.
580 )
581 {
582 searchStart = end;
583 continue; // no a standalone word
584 }
585 }
586 if (needSpace && index>0) // strip with space before keyword
587 {
588 str.remove(index-1, len+1);
589 searchEnd -= (len+1);
590 }
591 else if (needSpace && end<searchEnd) // strip with space after string starting with keyword
592 {
593 str.remove(index, len+1);
594 searchEnd -= (len+1);
595 }
596 else // strip just keyword
597 {
598 str.remove(index, len);
599 searchEnd -= len;
600 }
601 found = true;
602 }
603 return found;
604}
QCString & remove(size_t index, size_t len)
Definition qcstring.h:442
size_t size() const
Returns the length of the string, not counting the 0-terminator.
Definition qcstring.h:169
DirIterator end(const DirIterator &) noexcept
Definition dir.cpp:175

References end(), QCString::find(), QCString::remove(), and QCString::size().

Referenced by generateXMLForMember().

◆ stripQualifiers()

void stripQualifiers ( QCString & typeStr)
static

Definition at line 523 of file xmlgen.cpp.

524{
525 bool done=false;
526 typeStr.stripPrefix("friend ");
527 while (!done)
528 {
529 if (typeStr.stripPrefix("static ")) {}
530 else if (typeStr.stripPrefix("constexpr ")) {}
531 else if (typeStr.stripPrefix("consteval ")) {}
532 else if (typeStr.stripPrefix("constinit ")) {}
533 else if (typeStr.stripPrefix("virtual ")) {}
534 else if (typeStr=="virtual") typeStr="";
535 else done=TRUE;
536 }
537}

References QCString::stripPrefix(), and TRUE.

Referenced by generateXMLForMember().

◆ writeCombineScript()

void writeCombineScript ( )
static

Definition at line 139 of file xmlgen.cpp.

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

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

Referenced by generateXML().

◆ writeExports()

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

Definition at line 1396 of file xmlgen.cpp.

1397{
1398 if (exportMap.empty()) return;
1399 t << " <exports>\n";
1400 for (const auto &[moduleName,importInfoList] : exportMap)
1401 {
1402 for (const auto &importInfo : importInfoList)
1403 {
1404 t << " <export";
1405 ModuleDef *mod = ModuleManager::instance().getPrimaryInterface(importInfo.importName);
1406 if (mod && mod->isLinkableInProject())
1407 {
1408 t << " refid=\"" << mod->getOutputFileBase() << "\"";
1409 }
1410 t << ">";
1411 t << importInfo.importName;
1412 t << "</export>\n";
1413 }
1414 }
1415 t << " </exports>\n";
1416}
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 1462 of file xmlgen.cpp.

1463{
1464 if (ii)
1465 {
1466 QCString nm = ii->includeName;
1467 if (nm.isEmpty() && ii->fileDef) nm = ii->fileDef->docName();
1468 if (!nm.isEmpty())
1469 {
1470 t << " <includes";
1471 if (ii->fileDef && !ii->fileDef->isReference()) // TODO: support external references
1472 {
1473 t << " refid=\"" << ii->fileDef->getOutputFileBase() << "\"";
1474 }
1475 t << " local=\"" << ((ii->kind & IncludeKind_LocalMask) ? "yes" : "no") << "\">";
1476 t << nm;
1477 t << "</includes>\n";
1478 }
1479 }
1480}
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 1346 of file xmlgen.cpp.

1347{
1348 for (const auto &cd : cl)
1349 {
1350 if (!cd->isHidden() && !cd->isAnonymous())
1351 {
1352 t << " <innerclass refid=\"" << classOutputFileBase(cd)
1353 << "\" prot=\"" << to_string_lower(cd->protection());
1354 t << "\">" << convertToXML(cd->name()) << "</innerclass>\n";
1355 }
1356 }
1357}

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 1359 of file xmlgen.cpp.

1360{
1361 for (const auto &cd : cl)
1362 {
1363 if (!cd->isHidden())
1364 {
1365 t << " <innerconcept refid=\"" << cd->getOutputFileBase()
1366 << "\">" << convertToXML(cd->name()) << "</innerconcept>\n";
1367 }
1368 }
1369}

References convertToXML().

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

◆ writeInnerDirs()

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

Definition at line 1450 of file xmlgen.cpp.

1451{
1452 if (dl)
1453 {
1454 for(const auto subdir : *dl)
1455 {
1456 t << " <innerdir refid=\"" << subdir->getOutputFileBase()
1457 << "\">" << convertToXML(subdir->displayName()) << "</innerdir>\n";
1458 }
1459 }
1460}

References convertToXML().

Referenced by generateXMLForDir().

◆ writeInnerFiles()

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

Definition at line 1418 of file xmlgen.cpp.

1419{
1420 for (const auto &fd : fl)
1421 {
1422 t << " <innerfile refid=\"" << fd->getOutputFileBase()
1423 << "\">" << convertToXML(fd->name()) << "</innerfile>\n";
1424 }
1425}

References convertToXML().

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

◆ writeInnerGroups()

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

Definition at line 1440 of file xmlgen.cpp.

1441{
1442 for (const auto &sgd : gl)
1443 {
1444 t << " <innergroup refid=\"" << sgd->getOutputFileBase()
1445 << "\">" << convertToXML(sgd->groupTitle())
1446 << "</innergroup>\n";
1447 }
1448}

References convertToXML().

Referenced by generateXMLForGroup().

◆ writeInnerModules()

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

Definition at line 1371 of file xmlgen.cpp.

1372{
1373 for (const auto &mod : ml)
1374 {
1375 if (!mod->isHidden())
1376 {
1377 t << " <innermodule refid=\"" << mod->getOutputFileBase()
1378 << "\">" << convertToXML(mod->name()) << "</innermodule>\n";
1379 }
1380 }
1381}

References convertToXML().

Referenced by generateXMLForGroup().

◆ writeInnerNamespaces()

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

Definition at line 1383 of file xmlgen.cpp.

1384{
1385 for (const auto &nd : nl)
1386 {
1387 if (!nd->isHidden() && !nd->isAnonymous())
1388 {
1389 t << " <innernamespace refid=\"" << nd->getOutputFileBase()
1390 << "\"" << (nd->isInline() ? " inline=\"yes\"" : "")
1391 << ">" << convertToXML(nd->name()) << "</innernamespace>\n";
1392 }
1393 }
1394}

References convertToXML().

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

◆ writeInnerPages()

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

Definition at line 1427 of file xmlgen.cpp.

1428{
1429 for (const auto &pd : pl)
1430 {
1431 t << " <innerpage refid=\"" << pd->getOutputFileBase();
1432 if (pd->getGroupDef())
1433 {
1434 t << "_" << pd->name();
1435 }
1436 t << "\">" << convertToXML(pd->title()) << "</innerpage>\n";
1437 }
1438}

References convertToXML().

Referenced by generateXMLForGroup(), and generateXMLForPage().

◆ writeListOfAllMembers()

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

Definition at line 1319 of file xmlgen.cpp.

1320{
1321 t << " <listofallmembers>\n";
1322 for (auto &mni : cd->memberNameInfoLinkedMap())
1323 {
1324 for (auto &mi : *mni)
1325 {
1326 const MemberDef *md=mi->memberDef();
1327 if (!md->isAnonymous())
1328 {
1329 Protection prot = mi->prot();
1330 Specifier virt=md->virtualness();
1331 t << " <member refid=\"" << memberOutputFileBase(md) << "_1" <<
1332 md->anchor() << "\" prot=\"" << to_string_lower(prot);
1333 t << "\" virt=\"" << to_string_lower(virt) << "\"";
1334 if (!mi->ambiguityResolutionScope().isEmpty())
1335 {
1336 t << " ambiguityscope=\"" << convertToXML(mi->ambiguityResolutionScope()) << "\"";
1337 }
1338 t << "><scope>" << convertToXML(cd->name()) << "</scope><name>" <<
1339 convertToXML(md->name()) << "</name></member>\n";
1340 }
1341 }
1342 }
1343 t << " </listofallmembers>\n";
1344}
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 500 of file xmlgen.cpp.

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

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 433 of file xmlgen.cpp.

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

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

Referenced by generateXMLForMember().

◆ writeRequirementRefs()

void writeRequirementRefs ( const Definition * d,
TextStream & t,
const char * prefix = "" )
static

Definition at line 649 of file xmlgen.cpp.

650{
651 auto writeRefsForType = [&t,&prefix](const RequirementRefs &refs,const char *tagName)
652 {
653 if (!refs.empty())
654 {
655 t << prefix << " <" << tagName << ">\n";
656 for (const auto &ref : refs)
657 {
658 t << prefix << " <requirement refid=\"" << xmlRequirementId(ref.reqId()) << "\">"
659 << convertToXML(ref.title()) << "</requirement>\n";
660 }
661 t << prefix << " </" << tagName << ">\n";
662 }
663 };
664 RequirementRefs satisfiesRefs;
665 RequirementRefs verifiesRefs;
666 splitRequirementRefs(d->requirementReferences(),satisfiesRefs,verifiesRefs);
667 writeRefsForType(satisfiesRefs,"satisfies");
668 writeRefsForType(verifiesRefs,"verifies");
669}
constexpr auto prefix
Definition anchor.cpp:44
virtual const RequirementRefs & requirementReferences() const =0
void splitRequirementRefs(const RequirementRefs &inputReqRefs, RequirementRefs &satisfiesRefs, RequirementRefs &verifiesRefs)
std::vector< RequirementRef > RequirementRefs
List of requirement references.
Definition requirement.h:56

References convertToXML(), prefix, Definition::requirementReferences(), splitRequirementRefs(), and xmlRequirementId().

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

◆ writeTemplateArgumentList()

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

Definition at line 374 of file xmlgen.cpp.

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

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

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

◆ writeTemplateList() [1/2]

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

Definition at line 438 of file xmlgen.cpp.

439{
441}
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 443 of file xmlgen.cpp.

444{
446}
virtual ArgumentList getTemplateParameterList() const =0

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

◆ writeXMLCodeBlock()

void writeXMLCodeBlock ( TextStream & t,
FileDef * fd )

Definition at line 481 of file xmlgen.cpp.

482{
483 auto intf=Doxygen::parserManager->getCodeParser(fd->getDefFileExtension());
485 intf->resetCodeParserState();
486 OutputCodeList xmlList;
487 xmlList.add<XMLCodeGenerator>(&t);
488 xmlList.startCodeFragment("DoxyCode");
489 intf->parseCode(xmlList, // codeOutList
490 QCString(), // scopeName
492 Config_getBool(FILTER_SOURCE_FILES)),
493 langExt, // lang
494 Config_getBool(STRIP_CODE_COMMENTS),
495 CodeParserOptions().setFileDef(fd)
496 );
497 xmlList.endCodeFragment("DoxyCode");
498}
virtual QCString getDefFileExtension() const =0
SrcLangExt
Definition types.h:207
SrcLangExt getLanguageFromFileName(const QCString &fileName, SrcLangExt defLang)
Definition util.cpp:5209
QCString fileToString(const QCString &name, bool filter, bool isSourceCode)
Definition util.cpp:1489

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

Referenced by generateXMLForFile().

◆ writeXMLCodeString()

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

Definition at line 80 of file xmlgen.cpp.

81{
82 if (str.isEmpty()) return;
83 const int tabSize = Config_getInt(TAB_SIZE);
84 const char *s = str.data();
85 char c=0;
86 if (hide) // only update column count
87 {
88 col=updateColumnCount(s,col);
89 }
90 else // actually output content and keep track of m_col
91 {
92 while ((c=*s++))
93 {
94 switch(c)
95 {
96 case '\t':
97 {
98 int spacesToNextTabStop = tabSize - (col%tabSize);
99 while (spacesToNextTabStop--)
100 {
101 if (col>=stripIndentAmount) t << "<sp/>";
102 col++;
103 }
104 break;
105 }
106 case ' ':
107 if (col>=stripIndentAmount) t << "<sp/>";
108 col++;
109 break;
110 case '<': t << "&lt;"; col++; break;
111 case '>': t << "&gt;"; col++; break;
112 case '&': t << "&amp;"; col++; break;
113 case '\'': t << "&apos;"; col++; break;
114 case '"': t << "&quot;"; col++; break;
115 case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8:
116 case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18:
117 case 19: case 20: case 21: case 22: case 23: case 24: case 25: case 26:
118 case 27: case 28: case 29: case 30: case 31:
119 // encode invalid XML characters (see http://www.w3.org/TR/2000/REC-xml-20001006#NT-Char)
120 t << "<sp value=\"" << int(c) << "\"/>";
121 break;
122 default: s=writeUTF8Char(t,s-1); col++; break;
123 }
124 }
125 }
126}
#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:6898

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 448 of file xmlgen.cpp.

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

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

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

◆ writeXMLHeader()

void writeXMLHeader ( TextStream & t)
static

Definition at line 129 of file xmlgen.cpp.

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

References theTranslator.

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

◆ writeXMLLink()

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

Definition at line 169 of file xmlgen.cpp.

171{
172 t << "<ref refid=\"" << compoundId;
173 if (!anchorId.isEmpty()) t << "_1" << anchorId;
174 t << "\" kindref=\"";
175 if (!anchorId.isEmpty()) t << "member"; else t << "compound";
176 t << "\"";
177 if (!extRef.isEmpty()) t << " external=\"" << extRef << "\"";
178 if (!tooltip.isEmpty()) t << " tooltip=\"" << convertToXML(tooltip) << "\"";
179 t << ">";
180 writeXMLString(t,text);
181 t << "</ref>";
182}

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

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

◆ writeXMLString()

◆ xmlRequirementId()

QCString xmlRequirementId ( const QCString & reqId)
inline

Definition at line 75 of file xmlgen.cpp.

76{
77 return convertNameToFile("requirement_"+reqId,false,true);
78}
QCString convertNameToFile(const QCString &name, bool allowDots, bool allowUnderscore)
Definition util.cpp:3503

References convertNameToFile().

Referenced by generateXMLForRequirement(), and writeRequirementRefs().