Doxygen
Loading...
Searching...
No Matches
xmlgen.cpp File Reference
#include "xmlgen.h"
#include "arguments.h"
#include "classlist.h"
#include "conceptdef.h"
#include "config.h"
#include "defargs.h"
#include "dir.h"
#include "dirdef.h"
#include "docparser.h"
#include "dotclassgraph.h"
#include "dotincldepgraph.h"
#include "doxygen.h"
#include "filename.h"
#include "groupdef.h"
#include "htmlentity.h"
#include "language.h"
#include "memberdef.h"
#include "membergroup.h"
#include "memberlist.h"
#include "membername.h"
#include "message.h"
#include "moduledef.h"
#include "namespacedef.h"
#include "outputgen.h"
#include "outputlist.h"
#include "pagedef.h"
#include "parserintf.h"
#include "portable.h"
#include "requirement.h"
#include "resourcemgr.h"
#include "section.h"
#include "textstream.h"
#include "utf8.h"
#include "util.h"
#include "version.h"
#include "xmldocvisitor.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 DString &fileName, int lineNr, const Definition *scope, const MemberDef *md, const DString &text)
void writeXMLString (TextStream &t, const DString &s)
DString xmlRequirementId (const DString &reqId)
void writeXMLCodeString (bool hide, TextStream &t, const DString &str, size_t &col, size_t stripIndentAmount)
static void writeXMLHeader (TextStream &t)
static void writeCombineScript ()
void writeXMLLink (TextStream &t, const DString &extRef, const DString &compoundId, const DString &anchorId, const DString &text, const DString &tooltip)
static void writeTemplateArgumentList (TextStream &t, const ArgumentList &al, const Definition *scope, const FileDef *fileScope, int indent, const ArgumentList &typeConstraints=ArgumentList())
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 DString &tagName)
static void stripQualifiers (DString &typeStr)
static DString classOutputFileBase (const ClassDef *cd)
static DString memberOutputFileBase (const MemberDef *md)
static bool stripKeyword (DString &str, const char *keyword, bool needSpace)
static DString extractNoExcept (DString &argsStr)
static void writeRequirementRefs (const Definition *d, TextStream &t, const char *prefix="")
static bool memberVisible (const Definition *d, const MemberDef *md)
static void generateXMLForMember (const MemberDef *md, TextStream &ti, TextStream &t, const Definition *def)
static void generateXMLSection (const Definition *d, TextStream &ti, TextStream &t, const MemberList *ml, const DString &kind, const DString &header=DString(), const DString &documentation=DString())
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()

DString classOutputFileBase ( const ClassDef * cd)
static

Definition at line 552 of file xmlgen.cpp.

553{
554 //bool inlineGroupedClasses = Config_getBool(INLINE_GROUPED_CLASSES);
555 //if (inlineGroupedClasses && cd->partOfGroups()!=0)
556 return cd->getOutputFileBase();
557 //else
558 // return cd->getOutputFileBase();
559}
virtual DString getOutputFileBase() const =0

References Definition::getOutputFileBase().

Referenced by generateXMLForClass(), and writeInnerClasses().

◆ extractNoExcept()

DString extractNoExcept ( DString & argsStr)
static

Definition at line 619 of file xmlgen.cpp.

620{
621 DString expr;
622 //printf("extractNoExcept(%s)\n",qPrint(argsStr));
623 if (size_t i = argsStr.find("noexcept("); i!=DString::npos)
624 {
625 int bracketCount = 1;
626 size_t p = i+9;
627 bool found = false;
628 bool insideString = false;
629 bool insideChar = false;
630 char pc = 0;
631 while (!found && p<argsStr.length())
632 {
633 char c = argsStr[p++];
634 if (insideString)
635 {
636 if (c=='"' && pc!='\\') insideString=false;
637 }
638 else if (insideChar)
639 {
640 if (c=='\'' && pc!='\\') insideChar=false;
641 }
642 else
643 {
644 switch (c)
645 {
646 case '(': bracketCount++; break;
647 case ')': bracketCount--; found = bracketCount==0; break;
648 case '"': insideString = true; break;
649 case '\'': insideChar = true; break;
650 }
651 }
652 pc = c;
653 }
654 expr = argsStr.mid(i+9,p-i-10);
655 argsStr = (argsStr.left(i) + argsStr.mid(p)).stripWhiteSpace();
656 }
657 //printf("extractNoExcept -> argsStr='%s', expr='%s'\n",qPrint(argsStr),qPrint(expr));
658 return expr;
659}
A String class for use with Doxygen wrapping std::string and adding some additional functionality off...
Definition dstring.h:84
DString mid(size_t index, size_t len=npos) const
Definition dstring.h:318
static constexpr size_t npos
value used to indicate 'not found' or 'to the end of the string', matching std::string::npos
Definition dstring.h:178
size_t find(char c, size_t pos=0) const
Definition dstring.h:239
DString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
Definition dstring.h:337
DString left(size_t len) const
Definition dstring.h:306
size_t length() const
Returns the length of the string, not counting the 0-terminator.
Definition dstring.h:151

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

Referenced by generateXMLForMember().

◆ generateXML()

void generateXML ( )

Definition at line 2349 of file xmlgen.cpp.

2350{
2351 // + classes
2352 // + concepts
2353 // + namespaces
2354 // + files
2355 // + groups
2356 // + related pages
2357 // - examples
2358
2359 DString outputDirectory = Config_getString(XML_OUTPUT);
2360 Dir xmlDir(outputDirectory.str());
2361 createSubDirs(xmlDir);
2362
2363 ResourceMgr::instance().copyResource("xml.xsd",outputDirectory);
2364 ResourceMgr::instance().copyResource("index.xsd",outputDirectory);
2365
2366 DString fileName=outputDirectory+"/compound.xsd";
2367 std::ofstream f = Portable::openOutputStream(fileName);
2368 if (!f.is_open())
2369 {
2370 err("Cannot open file {} for writing!\n",fileName);
2371 return;
2372 }
2373 {
2374 TextStream t(&f);
2375
2376 // write compound.xsd, but replace special marker with the entities
2377 DString compound_xsd = ResourceMgr::instance().getAsString("compound.xsd");
2378 const char *startLine = compound_xsd.data();
2379 while (*startLine)
2380 {
2381 // find end of the line
2382 const char *endLine = startLine+1;
2383 while (*endLine && *(endLine-1)!='\n') endLine++; // skip to end of the line including \n
2384 int len=static_cast<int>(endLine-startLine);
2385 if (len>0)
2386 {
2387 DString s(startLine,len);
2388 if (s.find("<!-- Automatically insert here the HTML entities -->")!=DString::npos)
2389 {
2391 }
2392 else
2393 {
2394 t.write(startLine,len);
2395 }
2396 }
2397 startLine=endLine;
2398 }
2399 }
2400 f.close();
2401
2402 fileName=outputDirectory+"/doxyfile.xsd";
2403 f = Portable::openOutputStream(fileName);
2404 if (!f.is_open())
2405 {
2406 err("Cannot open file {} for writing!\n",fileName);
2407 return;
2408 }
2409 {
2410 TextStream t(&f);
2411
2412 // write doxyfile.xsd, but replace special marker with the entities
2413 DString doxyfile_xsd = ResourceMgr::instance().getAsString("doxyfile.xsd");
2414 const char *startLine = doxyfile_xsd.data();
2415 while (*startLine)
2416 {
2417 // find end of the line
2418 const char *endLine = startLine+1;
2419 while (*endLine && *(endLine-1)!='\n') endLine++; // skip to end of the line including \n
2420 int len=static_cast<int>(endLine-startLine);
2421 if (len>0)
2422 {
2423 DString s(startLine,len);
2424 if (s.find("<!-- Automatically insert here the configuration settings -->")!=DString::npos)
2425 {
2427 }
2428 else
2429 {
2430 t.write(startLine,len);
2431 }
2432 }
2433 startLine=endLine;
2434 }
2435 }
2436 f.close();
2437
2438 fileName=outputDirectory+"/Doxyfile.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);
2449 }
2450 f.close();
2451
2452 fileName=outputDirectory+"/index.xml";
2453 f = Portable::openOutputStream(fileName);
2454 if (!f.is_open())
2455 {
2456 err("Cannot open file {} for writing!\n",fileName);
2457 return;
2458 }
2459 else
2460 {
2461 TextStream t(&f);
2462
2463 // write index header
2464 t << "<?xml version='1.0' encoding='UTF-8' standalone='no'?>\n";
2465 t << "<doxygenindex xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ";
2466 t << "xsi:noNamespaceSchemaLocation=\"index.xsd\" ";
2467 t << "version=\"" << getDoxygenVersion() << "\" ";
2468 t << "xml:lang=\"" << theTranslator->trISOLang() << "\"";
2469 t << ">\n";
2470
2471 for (const auto &cd : *Doxygen::classLinkedMap)
2472 {
2473 generateXMLForClass(cd.get(),t);
2474 }
2475 for (const auto &cd : *Doxygen::conceptLinkedMap)
2476 {
2477 msg("Generating XML output for concept {}\n",cd->displayName());
2478 generateXMLForConcept(cd.get(),t);
2479 }
2480 for (const auto &nd : *Doxygen::namespaceLinkedMap)
2481 {
2482 msg("Generating XML output for namespace {}\n",nd->displayName());
2483 generateXMLForNamespace(nd.get(),t);
2484 }
2485 for (const auto &fn : *Doxygen::inputNameLinkedMap)
2486 {
2487 for (const auto &fd : *fn)
2488 {
2489 msg("Generating XML output for file {}\n",fd->name());
2490 generateXMLForFile(fd.get(),t);
2491 }
2492 }
2493 for (const auto &gd : *Doxygen::groupLinkedMap)
2494 {
2495 msg("Generating XML output for group {}\n",gd->name());
2496 generateXMLForGroup(gd.get(),t);
2497 }
2498 for (const auto &pd : *Doxygen::pageLinkedMap)
2499 {
2500 msg("Generating XML output for page {}\n",pd->name());
2501 generateXMLForPage(pd.get(),t,false);
2502 }
2503 for (const auto &req : RequirementManager::instance().requirements())
2504 {
2505 if (req->getTagFile().empty())
2506 {
2507 msg("Generating XML output for requirement {}\n", req->id());
2509 }
2510 }
2511 for (const auto &dd : *Doxygen::dirLinkedMap)
2512 {
2513 msg("Generate XML output for dir {}\n",dd->name());
2514 generateXMLForDir(dd.get(),t);
2515 }
2516 for (const auto &mod : ModuleManager::instance().modules())
2517 {
2518 msg("Generating XML output for module {}\n",mod->name());
2519 generateXMLForModule(mod.get(),t);
2520 }
2521 for (const auto &pd : *Doxygen::exampleLinkedMap)
2522 {
2523 msg("Generating XML output for example {}\n",pd->name());
2524 generateXMLForPage(pd.get(),t,true);
2525 }
2527 {
2528 msg("Generating XML output for the main page\n");
2530 }
2531
2532 //t << " </compoundlist>\n";
2533 t << "</doxygenindex>\n";
2534 }
2535
2537 clearSubDirs(xmlDir);
2538}
const std::string & str() const
Definition dstring.h:645
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
Definition dstring.h:157
Class representing a directory in the file system.
Definition dir.h:73
static NamespaceLinkedMap * namespaceLinkedMap
Definition doxygen.h:108
static ConceptLinkedMap * conceptLinkedMap
Definition doxygen.h:90
static std::unique_ptr< PageDef > mainPage
Definition doxygen.h:93
static FileNameLinkedMap * inputNameLinkedMap
Definition doxygen.h:97
static ClassLinkedMap * classLinkedMap
Definition doxygen.h:88
static PageLinkedMap * exampleLinkedMap
Definition doxygen.h:91
static PageLinkedMap * pageLinkedMap
Definition doxygen.h:92
static DirLinkedMap * dirLinkedMap
Definition doxygen.h:120
static GroupLinkedMap * groupLinkedMap
Definition doxygen.h:107
void writeXMLSchema(TextStream &t)
static HtmlEntityMapper & instance()
Returns the one and only instance of the HTML entity mapper.
static ModuleManager & instance()
static RequirementManager & instance()
static ResourceMgr & instance()
Returns the one and only instance of this class.
bool copyResource(const DString &name, const DString &targetDir) const
Copies a registered resource to a given target directory.
DString getAsString(const DString &name) const
Gets the resource data as a C string.
Text streaming class that buffers data.
Definition textstream.h:36
virtual DString trISOLang()=0
#define Config_getString(name)
Definition config.h:32
Translator * theTranslator
Definition language.cpp:76
#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 DString &name, bool append=false)
Definition portable.cpp:681
void clearSubDirs(const Dir &d)
Definition util.cpp:2997
void createSubDirs(const Dir &d)
Definition util.cpp:2970
static void generateXMLForGroup(const GroupDef *gd, TextStream &ti)
Definition xmlgen.cpp:1989
static void generateXMLForClass(const ClassDef *cd, TextStream &ti)
Definition xmlgen.cpp:1495
static void generateXMLForFile(FileDef *fd, TextStream &ti)
Definition xmlgen.cpp:1873
static void generateXMLForNamespace(const NamespaceDef *nd, TextStream &ti)
Definition xmlgen.cpp:1800
static void generateXMLForRequirement(const RequirementIntf *req, TextStream &ti)
Definition xmlgen.cpp:2320
static void generateXMLForModule(const ModuleDef *mod, TextStream &ti)
Definition xmlgen.cpp:1744
static void generateXMLForConcept(const ConceptDef *cd, TextStream &ti)
Definition xmlgen.cpp:1666
static void generateXMLForDir(DirDef *dd, TextStream &ti)
Definition xmlgen.cpp:2059
static void generateXMLForPage(PageDef *pd, TextStream &ti, bool isExample)
Definition xmlgen.cpp:2153
static void writeCombineScript()
Definition xmlgen.cpp:140

References Doxygen::classLinkedMap, clearSubDirs(), Doxygen::conceptLinkedMap, Config_getString, ResourceMgr::copyResource(), createSubDirs(), DString::data(), Doxygen::dirLinkedMap, err, Doxygen::exampleLinkedMap, DString::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, DString::npos, Portable::openOutputStream(), Doxygen::pageLinkedMap, DString::str(), theTranslator, Translator::trISOLang(), 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 1495 of file xmlgen.cpp.

1496{
1497 // + brief description
1498 // + detailed description
1499 // + template argument list(s)
1500 // - include file
1501 // + member groups
1502 // + inheritance diagram
1503 // + list of direct super classes
1504 // + list of direct sub classes
1505 // + list of inner classes
1506 // + collaboration diagram
1507 // + list of all members
1508 // + user defined member sections
1509 // + standard member sections
1510 // + detailed member documentation
1511 // - examples using the class
1512
1513 if (cd->isReference()) return; // skip external references.
1514 if (cd->isHidden()) return; // skip hidden classes.
1515 if (cd->isAnonymous()) return; // skip anonymous compounds.
1516 if (cd->isImplicitTemplateInstance()) return; // skip generated template instances.
1517 if (cd->isArtificial()) return; // skip artificially created classes
1518
1519 msg("Generating XML output for class {}\n",cd->name());
1520
1521 ti << " <compound refid=\"" << classOutputFileBase(cd)
1522 << "\" kind=\"" << cd->compoundTypeString()
1523 << "\"><name>" << convertToXML(cd->name()) << "</name>\n";
1524
1525 DString outputDirectory = Config_getString(XML_OUTPUT);
1526 DString fileName=outputDirectory+"/"+ classOutputFileBase(cd)+".xml";
1527 std::ofstream f = Portable::openOutputStream(fileName);
1528 if (!f.is_open())
1529 {
1530 err("Cannot open file {} for writing!\n",fileName);
1531 return;
1532 }
1533 TextStream t(&f);
1534
1535 writeXMLHeader(t);
1536 t << " <compounddef id=\""
1537 << classOutputFileBase(cd) << "\" kind=\""
1538 << cd->compoundTypeString() << "\" language=\""
1539 << to_string(cd->getLanguage()) << "\" prot=\"";
1540 t << to_string_lower(cd->protection());
1541 if (cd->isFinal()) t << "\" final=\"yes";
1542 if (cd->isSealed()) t << "\" sealed=\"yes";
1543 if (cd->isAbstract()) t << "\" abstract=\"yes";
1544 if (cd->isRef()) t << "\" ref=\"yes";
1545 t << "\">\n";
1546 t << " <compoundname>";
1547 DString nameStr = cd->name();
1548 writeXMLString(t,nameStr);
1549 t << "</compoundname>\n";
1550 for (const auto &bcd : cd->baseClasses())
1551 {
1552 t << " <basecompoundref ";
1553 if (bcd.classDef->isLinkable())
1554 {
1555 t << "refid=\"" << classOutputFileBase(bcd.classDef) << "\" ";
1556 }
1557 if (bcd.prot == Protection::Package) ASSERT(0);
1558 t << "prot=\"";
1559 t << to_string_lower(bcd.prot);
1560 t << "\" virt=\"";
1561 t << to_string_lower(bcd.virt);
1562 t << "\">";
1563 if (!bcd.templSpecifiers.empty())
1564 {
1565 t << convertToXML(
1567 bcd.classDef->name(),bcd.templSpecifiers)
1568 );
1569 }
1570 else
1571 {
1572 t << convertToXML(bcd.classDef->displayName());
1573 }
1574 t << "</basecompoundref>\n";
1575 }
1576 for (const auto &bcd : cd->subClasses())
1577 {
1578 if (bcd.prot == Protection::Package) ASSERT(0);
1579 t << " <derivedcompoundref refid=\""
1580 << classOutputFileBase(bcd.classDef)
1581 << "\" prot=\"";
1582 t << to_string_lower(bcd.prot);
1583 t << "\" virt=\"";
1584 t << to_string_lower(bcd.virt);
1585 t << "\">" << convertToXML(bcd.classDef->displayName())
1586 << "</derivedcompoundref>\n";
1587 }
1588
1590
1592
1593 writeTemplateList(cd,t);
1594 for (const auto &mg : cd->getMemberGroups())
1595 {
1596 generateXMLSection(cd,ti,t,&mg->members(),"user-defined",mg->header(),
1597 mg->documentation());
1598 }
1599
1600 for (const auto &ml : cd->getMemberLists())
1601 {
1602 if (!ml->listType().isDetailed())
1603 {
1604 generateXMLSection(cd,ti,t,ml.get(),ml->listType().toXML());
1605 }
1606 }
1607
1608 LinkifyTextOptions options;
1609 options.setScope(cd).setFileScope(cd->getFileDef());
1610
1611 if (!cd->requiresClause().empty())
1612 {
1613 t << " <requiresclause>";
1615 t << " </requiresclause>\n";
1616 }
1617
1618 for (const auto &qcd : cd->getQualifiers())
1619 {
1620 t << " <qualifier>" << convertToXML(qcd) << "</qualifier>\n";
1621 }
1622
1623 t << " <briefdescription>\n";
1624 writeXMLDocBlock(t,cd->briefFile(),cd->briefLine(),cd,nullptr,cd->briefDescription());
1625 t << " </briefdescription>\n";
1626 t << " <detaileddescription>\n";
1627 writeXMLDocBlock(t,cd->docFile(),cd->docLine(),cd,nullptr,cd->documentation());
1628 t << " </detaileddescription>\n";
1629 DotClassGraph inheritanceGraph(cd,GraphType::Inheritance);
1630 if (!inheritanceGraph.isTrivial())
1631 {
1632 t << " <inheritancegraph>\n";
1633 inheritanceGraph.writeXML(t);
1634 t << " </inheritancegraph>\n";
1635 }
1636 DotClassGraph collaborationGraph(cd,GraphType::Collaboration);
1637 if (!collaborationGraph.isTrivial())
1638 {
1639 t << " <collaborationgraph>\n";
1640 collaborationGraph.writeXML(t);
1641 t << " </collaborationgraph>\n";
1642 }
1644 t << " <location file=\""
1645 << convertToXML(stripFromPath(cd->getDefFileName())) << "\" line=\""
1646 << cd->getDefLine() << "\"" << " column=\""
1647 << cd->getDefColumn() << "\"" ;
1648 if (cd->getStartBodyLine()!=-1)
1649 {
1650 const FileDef *bodyDef = cd->getBodyDef();
1651 if (bodyDef)
1652 {
1653 t << " bodyfile=\"" << convertToXML(stripFromPath(bodyDef->absFilePath())) << "\"";
1654 }
1655 t << " bodystart=\"" << cd->getStartBodyLine() << "\" bodyend=\""
1656 << cd->getEndBodyLine() << "\"";
1657 }
1658 t << "/>\n";
1660 t << " </compounddef>\n";
1661 t << "</doxygen>\n";
1662
1663 ti << " </compound>\n";
1664}
virtual DString requiresClause() const =0
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 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 DString compoundTypeString() const =0
Returns the type of compound as a string.
virtual bool isImplicitTemplateInstance() const =0
virtual const MemberGroupList & getMemberGroups() const =0
Returns the member groups defined for this class.
virtual bool isRef() const =0
Returns true if this class is a C# ref struct or a C++/CLI ref class.
virtual ClassLinkedRefMap getClasses() const =0
returns the classes nested into this class
virtual FileDef * getFileDef() const =0
Returns the file in which this compound's definition can be found.
virtual const IncludeInfo * includeInfo() const =0
virtual const BaseClassList & subClasses() const =0
Returns the list of sub classes that directly derive from this class.
bool empty() const
Returns true iff the string is empty (std::string compatible alias for isEmpty()).
Definition dstring.h:148
virtual DString briefDescription(bool abbreviate=false) const =0
virtual int getEndBodyLine() const =0
virtual DString briefFile() const =0
virtual SrcLangExt getLanguage() const =0
Returns the programming language this definition was written in.
virtual int docLine() const =0
virtual DString getDefFileName() const =0
virtual DString documentation() const =0
virtual int getDefLine() const =0
virtual const DString & name() const =0
virtual const FileDef * getBodyDef() const =0
virtual int briefLine() const =0
virtual size_t getDefColumn() const =0
virtual bool isAnonymous() const =0
virtual bool isHidden() const =0
virtual bool isArtificial() const =0
virtual DString docFile() const =0
virtual int getStartBodyLine() const =0
virtual bool isReference() const =0
Representation of a class inheritance or dependency graph.
A model of a file symbol.
Definition filedef.h:97
virtual DString absFilePath() const =0
Implements TextGeneratorIntf for an XML stream.
Definition xmlgen.cpp:187
@ Collaboration
Definition dotgraph.h:31
@ Inheritance
Definition dotgraph.h:31
void linkifyText(const TextGeneratorIntf &out, const DString &text, const LinkifyTextOptions &options)
#define ASSERT(x)
Definition message.h:142
LinkifyTextOptions & setScope(const Definition *scope)
Definition linkifytext.h:58
LinkifyTextOptions & setFileScope(const FileDef *fileScope)
Definition linkifytext.h:61
DString insertTemplateSpecifierInScope(const DString &scope, const DString &templ)
Definition util.cpp:3077
DString convertToXML(const DString &s, bool keepEntities, const bool citeEntry)
Definition util.cpp:3233
DString stripFromPath(const DString &path)
Definition util.cpp:219
static void writeListOfAllMembers(const ClassDef *cd, TextStream &t)
Definition xmlgen.cpp:1332
static void writeXMLDocBlock(TextStream &t, const DString &fileName, int lineNr, const Definition *scope, const MemberDef *md, const DString &text)
Definition xmlgen.cpp:461
static void generateXMLSection(const Definition *d, TextStream &ti, TextStream &t, const MemberList *ml, const DString &kind, const DString &header=DString(), const DString &documentation=DString())
Definition xmlgen.cpp:1295
static void writeTemplateList(const ClassDef *cd, TextStream &t)
Definition xmlgen.cpp:451
void writeXMLString(TextStream &t, const DString &s)
Definition xmlgen.cpp:71
static void writeIncludeInfo(const IncludeInfo *ii, TextStream &t)
Definition xmlgen.cpp:1475
static void writeXMLHeader(TextStream &t)
Definition xmlgen.cpp:130
static DString classOutputFileBase(const ClassDef *cd)
Definition xmlgen.cpp:552
static void writeRequirementRefs(const Definition *d, TextStream &t, const char *prefix="")
Definition xmlgen.cpp:661
static void writeInnerClasses(const ClassLinkedRefMap &cl, TextStream &t)
Definition xmlgen.cpp:1359

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(), DString::empty(), 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(), ClassDef::isFinal(), Definition::isHidden(), ClassDef::isImplicitTemplateInstance(), ClassDef::isRef(), Definition::isReference(), ClassDef::isSealed(), DotClassGraph::isTrivial(), linkifyText(), MemberList::listType(), msg, Definition::name(), Portable::openOutputStream(), ClassDef::protection(), ClassDef::requiresClause(), LinkifyTextOptions::setFileScope(), LinkifyTextOptions::setScope(), stripFromPath(), ClassDef::subClasses(), 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 1666 of file xmlgen.cpp.

1667{
1668 if (cd->isReference() || cd->isHidden()) return; // skip external references.
1669
1670 ti << " <compound refid=\"" << cd->getOutputFileBase()
1671 << "\" kind=\"concept\"" << "><name>"
1672 << convertToXML(cd->name()) << "</name>\n";
1673
1674 LinkifyTextOptions options;
1675 options.setScope(cd).setFileScope(cd->getFileDef());
1676 DString outputDirectory = Config_getString(XML_OUTPUT);
1677 DString fileName=outputDirectory+"/"+cd->getOutputFileBase()+".xml";
1678 std::ofstream f = Portable::openOutputStream(fileName);
1679 if (!f.is_open())
1680 {
1681 err("Cannot open file {} for writing!\n",fileName);
1682 return;
1683 }
1684 TextStream t(&f);
1685 writeXMLHeader(t);
1686 t << " <compounddef id=\"" << cd->getOutputFileBase()
1687 << "\" kind=\"concept\">\n";
1688 t << " <compoundname>";
1689 DString nameStr = cd->name();
1690 writeXMLString(t,nameStr);
1691 t << "</compoundname>\n";
1693 writeTemplateList(cd,t);
1694 t << " <initializer>";
1696 t << "</initializer>\n";
1697 auto intf=Doxygen::parserManager->getCodeParser(".cpp");
1698 intf->resetCodeParserState();
1699 OutputCodeList xmlList;
1700 xmlList.add<XMLCodeGenerator>(&t);
1701 t << " <conceptparts>\n";
1702 for (const auto &part : cd->conceptParts())
1703 {
1704 switch (part.type)
1705 {
1707 t << " <docpart line=\"" << part.lineNr << "\" col=\"" << part.colNr << "\">\n";
1708 writeXMLDocBlock(t,cd->getDefFileName(),part.lineNr,cd,nullptr,part.content);
1709 t << " </docpart>\n";
1710 break;
1712 t << " <codepart line=\"" << part.lineNr << "\">";
1713 xmlList.startCodeFragment("DoxyCode");
1714 intf->parseCode(xmlList, // codeOutList
1715 nameStr, // scopeName
1716 part.content, // code
1717 SrcLangExt::Cpp, // lang
1718 false, // stripCodeComments
1720 );
1721 xmlList.endCodeFragment("DoxyCode");
1722 t << "</codepart>\n";
1723 break;
1724 }
1725 }
1726 t << " </conceptparts>\n";
1727 t << " <briefdescription>\n";
1728 writeXMLDocBlock(t,cd->briefFile(),cd->briefLine(),cd,nullptr,cd->briefDescription());
1729 t << " </briefdescription>\n";
1730 t << " <detaileddescription>\n";
1731 writeXMLDocBlock(t,cd->docFile(),cd->docLine(),cd,nullptr,cd->documentation());
1732 t << " </detaileddescription>\n";
1734 t << " <location file=\""
1735 << convertToXML(stripFromPath(cd->getDefFileName())) << "\" line=\""
1736 << cd->getDefLine() << "\"" << " column=\""
1737 << cd->getDefColumn() << "\"/>\n" ;
1738 t << " </compounddef>\n";
1739 t << "</doxygen>\n";
1740
1741 ti << " </compound>\n";
1742}
virtual DString 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:122
Class representing a list of different code generators.
Definition outputlist.h:162
void startCodeFragment(const DString &style)
Definition outputlist.h:276
void add(OutputCodeIntfPtr &&p)
Definition outputlist.h:192
void endCodeFragment(const DString &style)
Definition outputlist.h:279
std::unique_ptr< CodeParserInterface > getCodeParser(const DString &extension)
Gets the interface to the parser associated with a given extension.
Definition parserintf.h:253
Options to configure the code parser.
Definition parserintf.h:77

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, ParserManager::getCodeParser(), 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 2059 of file xmlgen.cpp.

2060{
2061 if (dd->isReference()) return; // skip external references
2062 ti << " <compound refid=\"" << dd->getOutputFileBase()
2063 << "\" kind=\"dir\"><name>" << convertToXML(dd->displayName())
2064 << "</name>\n";
2065
2066 DString outputDirectory = Config_getString(XML_OUTPUT);
2067 DString fileName=outputDirectory+"/"+dd->getOutputFileBase()+".xml";
2068 std::ofstream f = Portable::openOutputStream(fileName);
2069 if (!f.is_open())
2070 {
2071 err("Cannot open file {} for writing!\n",fileName);
2072 return;
2073 }
2074 TextStream t(&f);
2075
2076 writeXMLHeader(t);
2077 t << " <compounddef id=\""
2078 << dd->getOutputFileBase() << "\" kind=\"dir\">\n";
2079 t << " <compoundname>" << convertToXML(dd->displayName()) << "</compoundname>\n";
2080
2081 writeInnerDirs(&dd->subDirs(),t);
2082 writeInnerFiles(dd->getFiles(),t);
2083
2084 t << " <briefdescription>\n";
2085 writeXMLDocBlock(t,dd->briefFile(),dd->briefLine(),dd,nullptr,dd->briefDescription());
2086 t << " </briefdescription>\n";
2087 t << " <detaileddescription>\n";
2088 writeXMLDocBlock(t,dd->docFile(),dd->docLine(),dd,nullptr,dd->documentation());
2089 t << " </detaileddescription>\n";
2091 t << " <location file=\"" << convertToXML(stripFromPath(dd->name())) << "\"/>\n";
2092 t << " </compounddef>\n";
2093 t << "</doxygen>\n";
2094
2095 ti << " </compound>\n";
2096}
virtual DString 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:1463
static void writeInnerFiles(const FileList &fl, TextStream &t)
Definition xmlgen.cpp:1431

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

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

References Definition::briefDescription(), Definition::briefFile(), Definition::briefLine(), Config_getBool, Config_getString, convertToXML(), Definition::docFile(), Definition::docLine(), Definition::documentation(), err, 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(), MemberList::listType(), Definition::name(), Portable::openOutputStream(), stripFromPath(), MemberListType::toXML(), 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 1989 of file xmlgen.cpp.

1990{
1991 // + members
1992 // + member groups
1993 // + files
1994 // + classes
1995 // + namespaces
1996 // - packages
1997 // + pages
1998 // + child groups
1999 // - examples
2000 // + brief description
2001 // + detailed description
2002
2003 if (gd->isReference()) return; // skip external references
2004
2005 ti << " <compound refid=\"" << gd->getOutputFileBase()
2006 << "\" kind=\"group\"><name>" << convertToXML(gd->name()) << "</name>\n";
2007
2008 DString outputDirectory = Config_getString(XML_OUTPUT);
2009 DString fileName=outputDirectory+"/"+gd->getOutputFileBase()+".xml";
2010 std::ofstream f = Portable::openOutputStream(fileName);
2011 if (!f.is_open())
2012 {
2013 err("Cannot open file {} for writing!\n",fileName);
2014 return;
2015 }
2016 TextStream t(&f);
2017
2018 writeXMLHeader(t);
2019 t << " <compounddef id=\""
2020 << gd->getOutputFileBase() << "\" kind=\"group\">\n";
2021 t << " <compoundname>" << convertToXML(gd->name()) << "</compoundname>\n";
2022 t << " <title>" << convertToXML(gd->groupTitle()) << "</title>\n";
2023
2025 writeInnerFiles(gd->getFiles(),t);
2029 writeInnerPages(gd->getPages(),t);
2031
2032 for (const auto &mg : gd->getMemberGroups())
2033 {
2034 generateXMLSection(gd,ti,t,&mg->members(),"user-defined",mg->header(),
2035 mg->documentation());
2036 }
2037
2038 for (const auto &ml : gd->getMemberLists())
2039 {
2040 if (ml->listType().isDeclaration())
2041 {
2042 generateXMLSection(gd,ti,t,ml.get(),ml->listType().toXML());
2043 }
2044 }
2045
2046 t << " <briefdescription>\n";
2047 writeXMLDocBlock(t,gd->briefFile(),gd->briefLine(),gd,nullptr,gd->briefDescription());
2048 t << " </briefdescription>\n";
2049 t << " <detaileddescription>\n";
2050 writeXMLDocBlock(t,gd->docFile(),gd->docLine(),gd,nullptr,gd->documentation());
2051 t << " </detaileddescription>\n";
2053 t << " </compounddef>\n";
2054 t << "</doxygen>\n";
2055
2056 ti << " </compound>\n";
2057}
virtual DString groupTitle() const =0
virtual const GroupList & getSubGroups() 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:1453
static void writeInnerPages(const PageLinkedRefMap &pl, TextStream &t)
Definition xmlgen.cpp:1440
static void writeInnerModules(const ModuleLinkedRefMap &ml, TextStream &t)
Definition xmlgen.cpp:1384

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

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

References FileDef::absFilePath(), Definition::anchor(), MemberDef::argsString(), MemberDef::argumentList(), ASSERT, DString::at(), ArgumentList::begin(), MemberDef::bitfieldString(), Definition::briefDescription(), Definition::briefFile(), Definition::briefLine(), ArgumentList::constSpecifier(), convertToXML(), MemberDef::declArgumentList(), MemberDef::definition(), Definition::definitionType(), Definition::docFile(), Definition::docLine(), Argument::docs, Definition::documentation(), ArgumentList::empty(), DString::empty(), ArgumentList::end(), MemberDef::enumBaseType(), MemberDef::enumFieldList(), MemberDef::excpString(), extractNoExcept(), DString::find(), generateXMLForMember(), Definition::getBodyDef(), MemberDef::getClassDefOfAnonymousType(), MemberDef::getDeclColumn(), MemberDef::getDeclFileName(), MemberDef::getDeclLine(), Definition::getDefColumn(), Definition::getDefFileName(), Definition::getDefLine(), Definition::getEndBodyLine(), MemberDef::getGroupDef(), Definition::getLanguage(), ClassDef::getMemberList(), 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(), MemberDef::isAddable(), Definition::isAnonymous(), MemberDef::isAssign(), MemberDef::isAttribute(), MemberDef::isBound(), MemberDef::isConstEval(), MemberDef::isConstExpr(), MemberDef::isConstInit(), MemberDef::isConstrained(), MemberDef::isCopy(), MemberDef::isEnumerate(), 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(), DString::left(), linkifyText(), LValue, memberOutputFileBase(), MemberDef::memberType(), memberVisible(), DString::mid(), Argument::name, Definition::name(), None, DString::npos, MemberDef::protection(), Definition::qualifiedName(), ArgumentList::refQualifier(), MemberDef::reimplementedBy(), MemberDef::reimplements(), MemberDef::requiresClause(), DString::rfind(), LinkifyTextOptions::setFileScope(), LinkifyTextOptions::setScope(), LinkifyTextOptions::setSelf(), stripFromPath(), stripKeyword(), DString::stripPrefix(), stripQualifiers(), DString::stripWhiteSpace(), Argument::type, Definition::TypeGroup, MemberDef::typeString(), MemberDef::virtualness(), ArgumentList::volatileSpecifier(), writeMemberReference(), writeMemberTemplateLists(), writeRequirementRefs(), writeXMLDocBlock(), and writeXMLString().

Referenced by generateXMLForMember(), and generateXMLSection().

◆ generateXMLForModule()

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

Definition at line 1744 of file xmlgen.cpp.

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

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

1801{
1802 // + contained class definitions
1803 // + contained namespace definitions
1804 // + member groups
1805 // + normal members
1806 // + brief desc
1807 // + detailed desc
1808 // + location
1809 // - files containing (parts of) the namespace definition
1810
1811 if (nd->isReference() || nd->isHidden()) return; // skip external references
1812
1813 ti << " <compound refid=\"" << nd->getOutputFileBase()
1814 << "\" kind=\"namespace\"" << "><name>"
1815 << convertToXML(nd->name()) << "</name>\n";
1816
1817 DString outputDirectory = Config_getString(XML_OUTPUT);
1818 DString fileName=outputDirectory+"/"+nd->getOutputFileBase()+".xml";
1819 std::ofstream f = Portable::openOutputStream(fileName);
1820 if (!f.is_open())
1821 {
1822 err("Cannot open file {} for writing!\n",fileName);
1823 return;
1824 }
1825 TextStream t(&f);
1826
1827 writeXMLHeader(t);
1828 t << " <compounddef id=\"" << nd->getOutputFileBase()
1829 << "\" kind=\"namespace\" "
1830 << (nd->isInline()?"inline=\"yes\" ":"")
1831 << "language=\""
1832 << to_string(nd->getLanguage()) << "\">\n";
1833 t << " <compoundname>";
1834 DString nameStr = nd->name();
1835 writeXMLString(t,nameStr);
1836 t << "</compoundname>\n";
1837
1841
1842 for (const auto &mg : nd->getMemberGroups())
1843 {
1844 generateXMLSection(nd,ti,t,&mg->members(),"user-defined",mg->header(),
1845 mg->documentation());
1846 }
1847
1848 for (const auto &ml : nd->getMemberLists())
1849 {
1850 if (ml->listType().isDeclaration())
1851 {
1852 generateXMLSection(nd,ti,t,ml.get(),ml->listType().toXML());
1853 }
1854 }
1855
1856 t << " <briefdescription>\n";
1857 writeXMLDocBlock(t,nd->briefFile(),nd->briefLine(),nd,nullptr,nd->briefDescription());
1858 t << " </briefdescription>\n";
1859 t << " <detaileddescription>\n";
1860 writeXMLDocBlock(t,nd->docFile(),nd->docLine(),nd,nullptr,nd->documentation());
1861 t << " </detaileddescription>\n";
1863 t << " <location file=\""
1864 << convertToXML(stripFromPath(nd->getDefFileName())) << "\" line=\""
1865 << nd->getDefLine() << "\"" << " column=\""
1866 << nd->getDefColumn() << "\"/>\n" ;
1867 t << " </compounddef>\n";
1868 t << "</doxygen>\n";
1869
1870 ti << " </compound>\n";
1871}
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(), 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 2153 of file xmlgen.cpp.

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

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

Referenced by generateXML().

◆ generateXMLForRequirement()

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

Definition at line 2320 of file xmlgen.cpp.

2321{
2322 DString pageName = xmlRequirementId(req->id());
2323 ti << " <compound refid=\"" << pageName << "\" kind=\"requirement\"><name>" << convertToXML(req->id()) << "</name>\n";
2324
2325 DString outputDirectory = Config_getString(XML_OUTPUT);
2326 DString fileName = outputDirectory+"/"+pageName+".xml";
2327 std::ofstream f = Portable::openOutputStream(fileName);
2328 if (!f.is_open())
2329 {
2330 err("Cannot open file {} for writing!\n",fileName);
2331 return;
2332 }
2333 TextStream t(&f);
2334 writeXMLHeader(t);
2335 t << " <compounddef id=\"" << pageName << "\" kind=\"requirement\">\n";
2336 t << " <compoundname>" << convertToXML(req->id()) << "</compoundname>\n";
2337 t << " <title>" << convertToXML(filterTitle(HtmlEntityMapper::instance().convertCharEntitiesToUTF8(req->title()))) << "</title>\n";
2338 t << " <detaileddescription>\n";
2339 writeXMLDocBlock(t,req->file(),req->line(),RequirementManager::instance().requirementsPage(),nullptr,req->doc());
2340 t << " </detaileddescription>\n";
2341 t << " <location file=\"" << convertToXML(stripFromPath(req->file())) << "\" line=\"" << req->line() << "\"/>\n" ;
2342 t << " </compounddef>\n";
2343 t << "</doxygen>\n";
2344
2345 ti << " </compound>\n";
2346}
virtual DString file() const =0
virtual int line() const =0
virtual DString title() const =0
virtual DString id() const =0
virtual DString doc() const =0
const PageDef * requirementsPage() const
DString xmlRequirementId(const DString &reqId)
Definition xmlgen.cpp:76

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

Referenced by generateXML().

◆ generateXMLForRequirements()

void generateXMLForRequirements ( PageDef * pd,
TextStream & ti )

Definition at line 2098 of file xmlgen.cpp.

2099{
2100 ti << " <compound refid=\"requirements\" kind=\"requirements\"><name>" << convertToXML(pd->name()) << "</name>\n";
2101 DString outputDirectory = Config_getString(XML_OUTPUT);
2102 DString fileName = outputDirectory+"/requirements.xml";
2103 std::ofstream f = Portable::openOutputStream(fileName);
2104 if (!f.is_open())
2105 {
2106 err("Cannot open file {} for writing!\n",fileName);
2107 return;
2108 }
2109 TextStream t(&f);
2110
2111 auto writeDefsForReq = [&t](const std::vector<const Definition *> &defs,const char *tagName)
2112 {
2113 for (const auto &def : defs)
2114 {
2115 t << " <" << tagName << " refid=\"";
2116 t << def->getOutputFileBase();
2117 if (def->definitionType()==Definition::TypeMember)
2118 {
2119 t << "_1" << def->anchor();
2120 }
2121 t << "\">";
2122 t << convertToXML(def->name());
2123 t << "</" << tagName<< ">\n";
2124 }
2125 };
2126
2127 writeXMLHeader(t);
2128 t << " <compounddef id=\"requirements\" kind=\"requirements\">\n";
2129 t << " <compoundname>" << convertToXML(pd->name()) << "</compoundname>\n";
2130 t << " <requirementslist>\n";
2132 for (const auto &req : reqs)
2133 {
2134 t << " <requirement refid=\"" << req->id();
2135 if (auto tagFile = req->getTagFile(); !tagFile.empty())
2136 {
2137 t << "\" tagfile=\"" << convertToXML(stripFromPath(tagFile)) << "\" page=\"" << convertToXML(req->getExtPage());
2138 }
2139 t << "\">\n";
2140 t << " <title>" << convertToXML(filterTitle(HtmlEntityMapper::instance().convertCharEntitiesToUTF8(req->title()))) << "</title>\n";
2141 t << " <location file=\"" << convertToXML(stripFromPath(req->file())) << "\" line=\"" << req->line() << "\"/>\n" ;
2142 writeDefsForReq(req->satisfiedBy(),"satisfiedby");
2143 writeDefsForReq(req->verifiedBy(),"verifiedby");
2144 t << " </requirement>\n";
2145 }
2146 t << " </requirementslist>\n";
2147 t << " </compounddef>\n";
2148 t << "</doxygen>\n";
2149
2150 ti << " </compound>\n";
2151}
RequirementIntfList requirements() const

References Config_getString, convertToXML(), err, filterTitle(), HtmlEntityMapper::instance(), 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 DString & kind,
const DString & header = DString(),
const DString & documentation = DString() )
static

Definition at line 1295 of file xmlgen.cpp.

1298{
1299 if (ml==nullptr) return;
1300 int count=0;
1301 for (const auto &md : *ml)
1302 {
1303 if (memberVisible(d,md) && (md->memberType()!=MemberType::EnumValue) &&
1304 !md->isHidden())
1305 {
1306 count++;
1307 }
1308 }
1309 if (count==0) return; // empty list
1310
1311 t << " <sectiondef kind=\"" << kind << "\">\n";
1312 if (!header.empty())
1313 {
1314 t << " <header>" << convertToXML(header) << "</header>\n";
1315 }
1316 if (!documentation.empty())
1317 {
1318 t << " <description>";
1319 writeXMLDocBlock(t,d->docFile(),d->docLine(),d,nullptr,documentation);
1320 t << "</description>\n";
1321 }
1322 for (const auto &md : *ml)
1323 {
1324 if (memberVisible(d,md))
1325 {
1326 generateXMLForMember(md,ti,t,d);
1327 }
1328 }
1329 t << " </sectiondef>\n";
1330}

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

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

◆ memberOutputFileBase()

DString memberOutputFileBase ( const MemberDef * md)
static

Definition at line 561 of file xmlgen.cpp.

562{
563 //bool inlineGroupedClasses = Config_getBool(INLINE_GROUPED_CLASSES);
564 //if (inlineGroupedClasses && md->getClassDef() && md->getClassDef()->partOfGroups()!=0)
565 // return md->getClassDef()->getXmlOutputFileBase();
566 //else
567 // return md->getOutputFileBase();
568 return md->getOutputFileBase();
569}

References Definition::getOutputFileBase().

Referenced by generateXMLForMember(), and writeListOfAllMembers().

◆ memberVisible()

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

Definition at line 685 of file xmlgen.cpp.

686{
687 return Config_getBool(XML_NS_MEMB_FILE_SCOPE) ||
689 md->getNamespaceDef()==nullptr;
690}
virtual const NamespaceDef * getNamespaceDef() const =0

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

Referenced by generateXMLForMember(), and generateXMLSection().

◆ stripKeyword()

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

Definition at line 575 of file xmlgen.cpp.

576{
577 bool found = false;
578 size_t searchStart = 0;
579 size_t searchEnd = str.size();
580 size_t len = strlen(keyword);
581 while (searchStart<searchEnd)
582 {
583 size_t index = str.find(keyword, searchStart);
584 if (index==DString::npos)
585 {
586 break; // no more occurrences found
587 }
588 size_t end = index + len;
589 if (needSpace)
590 {
591 if ((index>0 && str[index-1]!=' ') || // at the start of the string or preceded by a space, or
592 (end!=searchEnd && str[end] !=' ') // at the end of the string or followed by a space.
593 )
594 {
595 searchStart = end;
596 continue; // no a standalone word
597 }
598 }
599 if (needSpace && index>0) // strip with space before keyword
600 {
601 str.remove(index-1, len+1);
602 searchEnd -= (len+1);
603 }
604 else if (needSpace && end<searchEnd) // strip with space after string starting with keyword
605 {
606 str.remove(index, len+1);
607 searchEnd -= (len+1);
608 }
609 else // strip just keyword
610 {
611 str.remove(index, len);
612 searchEnd -= len;
613 }
614 found = true;
615 }
616 return found;
617}
DString & remove(size_t index, size_t len)
Definition dstring.h:535
size_t size() const
Returns the length of the string, not counting the 0-terminator.
Definition dstring.h:154
DirIterator end(const DirIterator &) noexcept
Definition dir.cpp:181

References end(), DString::find(), DString::npos, DString::remove(), and DString::size().

Referenced by generateXMLForMember().

◆ stripQualifiers()

void stripQualifiers ( DString & typeStr)
static

Definition at line 536 of file xmlgen.cpp.

537{
538 bool done=false;
539 typeStr.stripPrefix("friend ");
540 while (!done)
541 {
542 if (typeStr.stripPrefix("static ")) {}
543 else if (typeStr.stripPrefix("constexpr ")) {}
544 else if (typeStr.stripPrefix("consteval ")) {}
545 else if (typeStr.stripPrefix("constinit ")) {}
546 else if (typeStr.stripPrefix("virtual ")) {}
547 else if (typeStr=="virtual") typeStr="";
548 else done=true;
549 }
550}

References DString::stripPrefix().

Referenced by generateXMLForMember().

◆ writeCombineScript()

void writeCombineScript ( )
static

Definition at line 140 of file xmlgen.cpp.

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

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

Referenced by generateXML().

◆ writeExports()

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

Definition at line 1409 of file xmlgen.cpp.

1410{
1411 if (exportMap.empty()) return;
1412 t << " <exports>\n";
1413 for (const auto &[moduleName,importInfoList] : exportMap)
1414 {
1415 for (const auto &importInfo : importInfoList)
1416 {
1417 t << " <export";
1418 ModuleDef *mod = ModuleManager::instance().getPrimaryInterface(importInfo.importName);
1419 if (mod && mod->isLinkableInProject())
1420 {
1421 t << " refid=\"" << mod->getOutputFileBase() << "\"";
1422 }
1423 t << ">";
1424 t << importInfo.importName;
1425 t << "</export>\n";
1426 }
1427 }
1428 t << " </exports>\n";
1429}
virtual bool isLinkableInProject() const =0
ModuleDef * getPrimaryInterface(const DString &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 1475 of file xmlgen.cpp.

1476{
1477 if (ii)
1478 {
1479 DString nm = ii->includeName;
1480 if (nm.empty() && ii->fileDef) nm = ii->fileDef->docName();
1481 if (!nm.empty())
1482 {
1483 t << " <includes";
1484 if (ii->fileDef && !ii->fileDef->isReference()) // TODO: support external references
1485 {
1486 t << " refid=\"" << ii->fileDef->getOutputFileBase() << "\"";
1487 }
1488 t << " local=\"" << ((ii->kind & IncludeKind_LocalMask) ? "yes" : "no") << "\">";
1489 t << nm;
1490 t << "</includes>\n";
1491 }
1492 }
1493}
virtual const DString & docName() const =0
IncludeKind kind
Definition filedef.h:79
const FileDef * fileDef
Definition filedef.h:77
DString includeName
Definition filedef.h:78

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

Referenced by generateXMLForClass(), and generateXMLForConcept().

◆ writeInnerClasses()

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

Definition at line 1359 of file xmlgen.cpp.

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

References classOutputFileBase(), and convertToXML().

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

◆ writeInnerConcepts()

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

Definition at line 1372 of file xmlgen.cpp.

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

References convertToXML().

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

◆ writeInnerDirs()

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

Definition at line 1463 of file xmlgen.cpp.

1464{
1465 if (dl)
1466 {
1467 for(const auto &subdir : *dl)
1468 {
1469 t << " <innerdir refid=\"" << subdir->getOutputFileBase()
1470 << "\">" << convertToXML(subdir->displayName()) << "</innerdir>\n";
1471 }
1472 }
1473}

References convertToXML().

Referenced by generateXMLForDir().

◆ writeInnerFiles()

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

Definition at line 1431 of file xmlgen.cpp.

1432{
1433 for (const auto &fd : fl)
1434 {
1435 t << " <innerfile refid=\"" << fd->getOutputFileBase()
1436 << "\">" << convertToXML(fd->name()) << "</innerfile>\n";
1437 }
1438}

References convertToXML().

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

◆ writeInnerGroups()

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

Definition at line 1453 of file xmlgen.cpp.

1454{
1455 for (const auto &sgd : gl)
1456 {
1457 t << " <innergroup refid=\"" << sgd->getOutputFileBase()
1458 << "\">" << convertToXML(sgd->groupTitle())
1459 << "</innergroup>\n";
1460 }
1461}

References convertToXML().

Referenced by generateXMLForGroup().

◆ writeInnerModules()

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

Definition at line 1384 of file xmlgen.cpp.

1385{
1386 for (const auto &mod : ml)
1387 {
1388 if (!mod->isHidden())
1389 {
1390 t << " <innermodule refid=\"" << mod->getOutputFileBase()
1391 << "\">" << convertToXML(mod->name()) << "</innermodule>\n";
1392 }
1393 }
1394}

References convertToXML().

Referenced by generateXMLForGroup().

◆ writeInnerNamespaces()

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

Definition at line 1396 of file xmlgen.cpp.

1397{
1398 for (const auto &nd : nl)
1399 {
1400 if (!nd->isHidden() && !nd->isAnonymous())
1401 {
1402 t << " <innernamespace refid=\"" << nd->getOutputFileBase()
1403 << "\"" << (nd->isInline() ? " inline=\"yes\"" : "")
1404 << ">" << convertToXML(nd->name()) << "</innernamespace>\n";
1405 }
1406 }
1407}

References convertToXML().

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

◆ writeInnerPages()

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

Definition at line 1440 of file xmlgen.cpp.

1441{
1442 for (const auto &pd : pl)
1443 {
1444 t << " <innerpage refid=\"" << pd->getOutputFileBase();
1445 if (pd->getGroupDef())
1446 {
1447 t << "_" << pd->name();
1448 }
1449 t << "\">" << convertToXML(pd->title()) << "</innerpage>\n";
1450 }
1451}

References convertToXML().

Referenced by generateXMLForGroup(), and generateXMLForPage().

◆ writeListOfAllMembers()

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

Definition at line 1332 of file xmlgen.cpp.

1333{
1334 t << " <listofallmembers>\n";
1335 for (auto &mni : cd->memberNameInfoLinkedMap())
1336 {
1337 for (auto &mi : *mni)
1338 {
1339 const MemberDef *md=mi->memberDef();
1340 if (!md->isAnonymous())
1341 {
1342 Protection prot = mi->prot();
1343 Specifier virt=md->virtualness();
1344 t << " <member refid=\"" << memberOutputFileBase(md) << "_1" <<
1345 md->anchor() << "\" prot=\"" << to_string_lower(prot);
1346 t << "\" virt=\"" << to_string_lower(virt) << "\"";
1347 if (!mi->ambiguityResolutionScope().empty())
1348 {
1349 t << " ambiguityscope=\"" << convertToXML(mi->ambiguityResolutionScope()) << "\"";
1350 }
1351 t << "><scope>" << convertToXML(cd->name()) << "</scope><name>" <<
1352 convertToXML(md->name()) << "</name></member>\n";
1353 }
1354 }
1355 }
1356 t << " </listofallmembers>\n";
1357}
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(), and MemberDef::virtualness().

Referenced by generateXMLForClass().

◆ writeMemberReference()

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

Definition at line 513 of file xmlgen.cpp.

514{
515 DString scope = rmd->getScopeString();
516 DString name = rmd->name();
517 if (!scope.empty() && scope!=def->name())
518 {
519 name.prepend(scope+getLanguageSpecificSeparator(rmd->getLanguage()));
520 }
521 t << " <" << tagName << " refid=\"";
522 t << rmd->getOutputFileBase() << "_1" << rmd->anchor() << "\"";
523 if (rmd->getStartBodyLine()!=-1 && rmd->getBodyDef())
524 {
525 t << " compoundref=\"" << rmd->getBodyDef()->getOutputFileBase() << "\"";
526 t << " startline=\"" << rmd->getStartBodyLine() << "\"";
527 if (rmd->getEndBodyLine()!=-1)
528 {
529 t << " endline=\"" << rmd->getEndBodyLine() << "\"";
530 }
531 }
532 t << ">" << convertToXML(name) << "</" << tagName << ">\n";
533
534}
virtual DString getScopeString() const =0
const char * name(int level)
Definition latexgen.h:368
DString getLanguageSpecificSeparator(SrcLangExt lang, bool classScope)
Definition util.cpp:4630

References Definition::anchor(), convertToXML(), DString::empty(), Definition::getBodyDef(), Definition::getEndBodyLine(), Definition::getLanguage(), getLanguageSpecificSeparator(), Definition::getOutputFileBase(), MemberDef::getScopeString(), Definition::getStartBodyLine(), and Definition::name().

Referenced by generateXMLForMember().

◆ writeMemberTemplateLists()

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

Definition at line 446 of file xmlgen.cpp.

447{
449}
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, const ArgumentList &typeConstraints=ArgumentList())
Definition xmlgen.cpp:375

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

662{
663 auto writeRefsForType = [&t,&prefix](const RequirementRefs &refs,const char *tagName)
664 {
665 if (!refs.empty())
666 {
667 t << prefix << " <" << tagName << ">\n";
668 for (const auto &ref : refs)
669 {
670 t << prefix << " <requirement refid=\"" << xmlRequirementId(ref.reqId()) << "\">"
671 << convertToXML(ref.title()) << "</requirement>\n";
672 }
673 t << prefix << " </" << tagName << ">\n";
674 }
675 };
676 RequirementRefs satisfiesRefs;
677 RequirementRefs verifiesRefs;
678 splitRequirementRefs(d->requirementReferences(),satisfiesRefs,verifiesRefs);
679 writeRefsForType(satisfiesRefs,"satisfies");
680 writeRefsForType(verifiesRefs,"verifies");
681}
constexpr auto prefix
Definition anchor.cpp:47
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,
const ArgumentList & typeConstraints = ArgumentList() )
static

Definition at line 375 of file xmlgen.cpp.

381{
382 DString indentStr;
383 indentStr.fill(' ',indent);
384 LinkifyTextOptions options;
385 options.setScope(scope).setFileScope(fileScope);
386 if (al.hasParameters())
387 {
388 t << indentStr << "<templateparamlist>\n";
389 for (const Argument &a : al)
390 {
391 t << indentStr << " <param>\n";
392 if (!a.type.empty())
393 {
394 t << indentStr << " <type>";
395 linkifyText(TextGeneratorXMLImpl(t),a.type,options);
396 t << "</type>\n";
397 }
398 if (!a.name.empty())
399 {
400 t << indentStr << " <declname>" << convertToXML(a.name) << "</declname>\n";
401 t << indentStr << " <defname>" << convertToXML(a.name) << "</defname>\n";
402 }
403 if (!a.defval.empty())
404 {
405 t << indentStr << " <defval>";
406 linkifyText(TextGeneratorXMLImpl(t),a.defval,options);
407 t << "</defval>\n";
408 }
409 DString typeConstraint = a.typeConstraint;
410 // C# where clauses, with one entry per constraint. A C# type parameter has its name in type.
411 const DString &paramName = a.name.empty() ? a.type : a.name;
412 for (const Argument &tc : typeConstraints)
413 {
414 if (tc.name==paramName && !tc.type.empty())
415 {
416 if (!typeConstraint.empty()) typeConstraint+=", ";
417 typeConstraint+=tc.type;
418 }
419 }
420 if (!typeConstraint.empty())
421 {
422 t << indentStr << " <typeconstraint>";
423 linkifyText(TextGeneratorXMLImpl(t),typeConstraint,options);
424 t << "</typeconstraint>\n";
425 }
426 if (a.hasTemplateDocumentation())
427 {
428 t << indentStr << " <briefdescription>\n";
429 t << indentStr << " ";
430 if (scope)
431 {
432 writeXMLDocBlock(t,scope->briefFile(),scope->briefLine(),scope,nullptr,a.docs);
433 }
434 else
435 {
436 writeXMLDocBlock(t,fileScope->briefFile(),fileScope->briefLine(),fileScope,nullptr,a.docs);
437 }
438 t << indentStr << " </briefdescription>\n";
439 }
440 t << indentStr << " </param>\n";
441 }
442 t << indentStr << "</templateparamlist>\n";
443 }
444}
DString fill(char c, size_t len)
Fills a string with a predefined character.
Definition dstring.h:278

References Definition::briefFile(), Definition::briefLine(), convertToXML(), DString::empty(), DString::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 451 of file xmlgen.cpp.

452{
454}
virtual const ArgumentList & templateArguments() const =0
Returns the template arguments of this class.
virtual const ArgumentList & typeConstraints() const =0

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

Referenced by generateXMLForClass(), and generateXMLForConcept().

◆ writeTemplateList() [2/2]

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

Definition at line 456 of file xmlgen.cpp.

457{
459}
virtual ArgumentList getTemplateParameterList() const =0

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

◆ writeXMLCodeBlock()

void writeXMLCodeBlock ( TextStream & t,
FileDef * fd )

Definition at line 494 of file xmlgen.cpp.

495{
498 intf->resetCodeParserState();
499 OutputCodeList xmlList;
500 xmlList.add<XMLCodeGenerator>(&t);
501 xmlList.startCodeFragment("DoxyCode");
502 intf->parseCode(xmlList, // codeOutList
503 DString(), // scopeName
505 Config_getBool(FILTER_SOURCE_FILES)),
506 langExt, // lang
507 Config_getBool(STRIP_CODE_COMMENTS),
508 CodeParserOptions().setFileDef(fd)
509 );
510 xmlList.endCodeFragment("DoxyCode");
511}
virtual DString getDefFileExtension() const =0
SrcLangExt
Definition types.h:207
SrcLangExt getLanguageFromFileName(const DString &fileName, SrcLangExt defLang)
Definition util.cpp:4169
DString fileToString(const DString &name, bool filter, bool isSourceCode)
Definition util.cpp:1053

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

Referenced by generateXMLForFile().

◆ writeXMLCodeString()

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

Definition at line 81 of file xmlgen.cpp.

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

References Config_getInt, DString::data(), DString::empty(), updateColumnCount(), and writeUTF8Char().

Referenced by XMLCodeGenerator::codify().

◆ writeXMLDocBlock()

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

Definition at line 461 of file xmlgen.cpp.

467{
468 DString stext = text.stripWhiteSpace();
469 if (stext.empty()) return;
470 // convert the documentation string into an abstract syntax tree
471 auto parser { createDocParser() };
472 auto ast { validatingParseDoc(*parser.get(),
473 fileName,
474 lineNr,
475 scope,
476 md,
477 text,
478 DocOptions())
479 };
480 auto astImpl = dynamic_cast<const DocNodeAST*>(ast.get());
481 if (astImpl)
482 {
483 // create a code generator
484 OutputCodeList xmlCodeList;
485 xmlCodeList.add<XMLCodeGenerator>(&t);
486 // create a parse tree visitor for XML
487 XmlDocVisitor visitor(t,xmlCodeList,scope?scope->getDefFileExtension():DString(""));
488 // visit all nodes
489 std::visit(visitor,astImpl->root);
490 // clean up
491 }
492}
Class representing the abstract syntax tree of a documentation block.
Definition docnode.h:1471
Concrete visitor implementation for XML output.
IDocParserPtr createDocParser()
factory function to create a parser
Definition docparser.cpp:59
IDocNodeASTPtr validatingParseDoc(IDocParser &parserIntf, const DString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const DString &input, const DocOptions &options)
Helper class to pass options when calling OutputList::generateDoc().
Definition docoptions.h:24

References OutputCodeList::add(), createDocParser(), DString::empty(), Definition::getDefFileExtension(), DString::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 130 of file xmlgen.cpp.

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

References theTranslator, and Translator::trISOLang().

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

◆ writeXMLLink()

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

Definition at line 170 of file xmlgen.cpp.

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

References convertToXML(), DString::empty(), and writeXMLString().

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

◆ writeXMLString()

◆ xmlRequirementId()

DString xmlRequirementId ( const DString & reqId)
inline

Definition at line 76 of file xmlgen.cpp.

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

References convertNameToFile().

Referenced by generateXMLForRequirement(), and writeRequirementRefs().