118 enum class Kind {
None=-1,
Class,
Struct,
Union,
Interface,
Exception,
Protocol,
Category, Enum,
Service,
Singleton };
263 std::unique_ptr<R> *p = std::get_if<std::unique_ptr<R>>(&
m_variant);
264 return p ? p->get() :
nullptr;
270 const std::unique_ptr<R> *p = std::get_if<std::unique_ptr<R>>(&
m_variant);
271 return p ? p->get() :
nullptr;
275 template<
class R,
typename... Args>
343#define p_warn(fmt,...) do { \
344 warn(m_locator->fileName(),m_locator->lineNr(),fmt,##__VA_ARGS__); \
362 void endElement(
const DString &name );
366 warn(fileName,lineNr,
"{}",
msg);
370 void buildLists(
const std::shared_ptr<Entry> &root);
391 p_warn(
"tag 'compound' was not expected!");
405 if (protStr==
"protected")
409 else if (protStr==
"private")
413 if (virtStr==
"virtual")
417 else if (virtStr==
"pure")
421 if (staticStr==
"yes")
425 if (!typeStr.
empty())
453 p_warn(
"Unexpected tag 'member' found");
472 p_warn(
"Found 'enumvalue' tag outside of member tag");
506 p_warn(
"Unexpected tag 'docanchor' found");
570 p_warn(
"Unexpected tag 'class' found");
598 p_warn(
"Unexpected tag 'concept' found");
614 p_warn(
"Unexpected tag 'module' found");
642 p_warn(
"Unexpected tag 'namespace' found");
664 p_warn(
"Unexpected tag 'file' found");
680 p_warn(
"Unexpected tag 'page' found");
696 p_warn(
"Unexpected tag 'subpage' found");
712 p_warn(
"Unexpected tag 'dir' found");
737 p_warn(
"Unexpected tag 'type' found");
763 p_warn(
"Unexpected tag 'name' found");
779 p_warn(
"Unexpected tag 'id' found");
794 if (protStr==
"protected")
796 prot = Protection::Protected;
798 else if (protStr==
"private")
800 prot = Protection::Private;
802 if (virtStr==
"virtual")
804 virt = Specifier::Virtual;
810 p_warn(
"Unexpected tag 'base' found");
823 p_warn(
"Unexpected tag 'base' found");
849 p_warn(
"Unexpected tag 'includes' found");
862 p_warn(
"Unexpected tag 'templarg' found");
886 p_warn(
"Unexpected tag 'filename' found");
908 p_warn(
"Unexpected tag 'path' found");
926 p_warn(
"Unexpected tag 'anchor' found");
948 p_warn(
"Unexpected tag 'clangid' found");
962 p_warn(
"Unexpected tag 'anchorfile' found");
974 p_warn(
"Unexpected tag 'arglist' found");
1001 p_warn(
"Unexpected tag 'title' found");
1015 p_warn(
"Unexpected tag 'subgroup' found");
1027 void buildMemberList(
const std::shared_ptr<Entry> &ce,
const std::vector<TagMemberInfo> &members);
1028 void addDocAnchors(
const std::shared_ptr<Entry> &e,
const std::vector<TagAnchorInfo> &l);
1053 std::unordered_map<std::string,std::unique_ptr<ClassNode>>
children;
1171 it->second.startCb(*
this,attrib);
1175 p_warn(
"Unknown start tag '{}' found!",name);
1185 it->second.endCb(*
this);
1189 p_warn(
"Unknown end tag '{}' found!",name);
1209 p_warn(
"Unknown compound attribute '{}' found!",kind);
1214 if (isObjC==
"yes" && classInfo)
1216 classInfo->
isObjC =
true;
1237 for (
const auto &md : cd->
members)
1283 for (
const auto &md : nd->
members)
1312 for (
const auto &md : fd->
members)
1321 for (
const auto &ii : fd->
includes)
1345 for (
const auto &fi : gd->
fileList)
1353 for (
const auto &pg : gd->
pageList)
1358 for (
const auto &md : gd->
members)
1390 for (
const auto &fi : dd->
fileList)
1418 for (
const auto &ta : l)
1425 ta.label,ta.fileName,-1,ta.title,
1427 e->anchors.push_back(si);
1434 ta.label,ta.fileName,-1,ta.title,
1442 for (
const auto &tmi : members)
1444 std::shared_ptr<Entry> me = std::make_shared<Entry>();
1445 me->type = tmi.type;
1446 me->name = tmi.name;
1447 me->args = tmi.arglist;
1448 if (!me->args.empty())
1452 if (tmi.enumValues.size()>0)
1454 me->spec.setStrong(
true);
1455 for (
const auto &evi : tmi.enumValues)
1457 std::shared_ptr<Entry> ev = std::make_shared<Entry>();
1459 ev->name = evi.name;
1460 ev->id = evi.clangid;
1461 ev->section = EntryType::makeVariable();
1463 ev->tagInfoData.anchor = evi.anchor;
1464 ev->tagInfoData.fileName = evi.file;
1465 ev->hasTagInfo =
true;
1466 me->moveToSubEntryAndKeep(ev);
1469 me->protection = tmi.prot;
1470 me->virt = tmi.virt;
1471 me->isStatic = tmi.isStatic;
1472 me->fileName = ce->fileName;
1473 me->id = tmi.clangId;
1474 me->startLine = tmi.lineNr;
1475 if (ce->section.isGroupDoc())
1481 me->tagInfoData.anchor = tmi.anchor;
1482 me->tagInfoData.fileName = tmi.anchorFile;
1483 me->hasTagInfo =
true;
1484 if (tmi.kind==
"define")
1487 me->section = EntryType::makeDefine();
1489 else if (tmi.kind==
"enumvalue")
1491 me->section = EntryType::makeVariable();
1492 me->mtype = MethodTypes::Method;
1494 else if (tmi.kind==
"property")
1496 me->section = EntryType::makeVariable();
1497 me->mtype = MethodTypes::Property;
1499 else if (tmi.kind==
"event")
1501 me->section = EntryType::makeVariable();
1502 me->mtype = MethodTypes::Event;
1504 else if (tmi.kind==
"variable")
1506 me->section = EntryType::makeVariable();
1507 me->mtype = MethodTypes::Method;
1509 else if (tmi.kind==
"typedef")
1511 me->section = EntryType::makeVariable();
1512 me->type.prepend(
"typedef ");
1513 me->mtype = MethodTypes::Method;
1515 else if (tmi.kind==
"enumeration")
1517 me->section = EntryType::makeEnum();
1518 me->mtype = MethodTypes::Method;
1520 else if (tmi.kind==
"function")
1522 me->section = EntryType::makeFunction();
1523 me->mtype = MethodTypes::Method;
1525 else if (tmi.kind==
"signal")
1527 me->section = EntryType::makeFunction();
1528 me->mtype = MethodTypes::Signal;
1530 else if (tmi.kind==
"prototype")
1532 me->section = EntryType::makeFunction();
1533 me->mtype = MethodTypes::Method;
1535 else if (tmi.kind==
"friend")
1537 me->section = EntryType::makeFunction();
1538 me->type.prepend(
"friend ");
1539 me->mtype = MethodTypes::Method;
1541 else if (tmi.kind==
"dcop")
1543 me->section = EntryType::makeFunction();
1544 me->mtype = MethodTypes::DCOP;
1546 else if (tmi.kind==
"slot")
1548 me->section = EntryType::makeFunction();
1549 me->mtype = MethodTypes::Slot;
1551 ce->moveToSubEntryAndKeep(me);
1557 std::shared_ptr<Entry> ce = std::make_shared<Entry>();
1558 ce->section = EntryType::makeClass();
1575 ce->name = tci->
name;
1582 ce->tagInfoData.anchor = tci->
anchor;
1583 ce->tagInfoData.fileName = tci->
filename;
1584 ce->startLine = tci->
lineNr;
1586 ce->hasTagInfo =
true;
1588 ce->lang = tci->
isObjC ? SrcLangExt::ObjC : SrcLangExt::Unknown;
1590 ce->extends = tci->
bases;
1605 root->moveToSubEntryAndKeep(ce);
1614 for (
const auto &child : node.
children)
1638 for (
size_t i=0; i<parts.size(); ++i)
1640 const auto &part = parts[i];
1643 current->
children[part] = std::make_unique<ClassNode>(part);
1645 current = current->
children[part].get();
1646 if (i==parts.size()-1)
1664 std::shared_ptr<Entry> fe = std::make_shared<Entry>();
1666 fe->name = tfi->
name;
1669 fe->tagInfoData.fileName = tfi->
filename;
1670 fe->hasTagInfo =
true;
1673 fe->fileName = fullName;
1674 fe->startLine = tfi->
lineNr;
1681 mn->push_back(std::move(fd));
1686 mn->push_back(std::move(fd));
1689 root->moveToSubEntryAndKeep(fe);
1699 std::shared_ptr<Entry> ce = std::make_shared<Entry>();
1700 ce->section = EntryType::makeConcept();
1701 ce->name = tci->
name;
1704 ce->tagInfoData.fileName = tci->
filename;
1705 ce->startLine = tci->
lineNr;
1707 ce->hasTagInfo =
true;
1710 root->moveToSubEntryAndKeep(ce);
1727 std::vector<const SectionInfo *> anchorList;
1735 ta.label,ta.fileName,-1,ta.title,
1737 anchorList.push_back(si);
1741 p_warn(
"Duplicate anchor {} found",ta.label);
1756 std::shared_ptr<Entry> ne = std::make_shared<Entry>();
1757 ne->section = EntryType::makeNamespace();
1758 ne->name = tni->
name;
1761 ne->tagInfoData.fileName = tni->
filename;
1762 ne->startLine = tni->
lineNr;
1764 ne->hasTagInfo =
true;
1768 root->moveToSubEntryAndKeep(ne);
1778 std::shared_ptr<Entry> pe = std::make_shared<Entry>();
1779 pe->section = EntryType::makePackage();
1780 pe->name = tpgi->
name;
1783 pe->tagInfoData.fileName = tpgi->
filename;
1784 pe->startLine = tpgi->
lineNr;
1786 pe->hasTagInfo =
true;
1789 root->moveToSubEntryAndKeep(pe);
1799 std::shared_ptr<Entry> ge = std::make_shared<Entry>();
1800 ge->section = EntryType::makeGroupDoc();
1801 ge->name = tgi->
name;
1802 ge->type = tgi->
title;
1805 ge->tagInfoData.fileName = tgi->
filename;
1806 ge->startLine = tgi->
lineNr;
1808 ge->hasTagInfo =
true;
1811 root->moveToSubEntryAndKeep(ge);
1823 const auto &children = root->children();
1824 auto i = std::find_if(children.begin(),children.end(),
1825 [&](
const std::shared_ptr<Entry> &e) { return e->name == sg; });
1826 if (i!=children.end())
1840 std::shared_ptr<Entry> pe = std::make_shared<Entry>();
1842 pe->section = isIndex ? EntryType::makeMainpageDoc() : EntryType::makePageDoc();
1843 pe->name = tpi->
name;
1844 pe->args = tpi->
title;
1845 for (
const auto &subpage : tpi->
subpages)
1849 pe->extends.emplace_back(
stripExtension(subpage),Protection::Public,Specifier::Normal);
1854 pe->startLine = tpi->
lineNr;
1856 pe->hasTagInfo =
true;
1857 root->moveToSubEntryAndKeep(pe);
1867 std::shared_ptr<Entry> pe = std::make_shared<Entry>();
1868 pe->section = EntryType::makeRequirementDoc();
1870 pe->type = tri->
title;
1872 pe->tagInfoData.fileName = tri->
filename;
1873 pe->startLine = tri->
lineNr;
1875 pe->hasTagInfo =
true;
1877 root->moveToSubEntryAndKeep(pe);
1893 for (
const auto &fd : *fn)
1899 for (
const auto &ii : tfi->
includes)
1906 for (
const auto &ifd : *ifn)
1910 if (ifd->getOutputFileBase()==ii.id)
1917 else if (ii.isImported)
1921 else if (ii.isLocal)
1925 fd->addIncludeDependency(ifd.get(),ii.text,kind);
1947 handlers.
startDocument = [&tagFileParser]() { tagFileParser.startDocument(); };
1949 handlers.
endElement = [&tagFileParser](
const std::string &name) { tagFileParser.endElement(name); };
1950 handlers.
characters = [&tagFileParser](
const std::string &chars) { tagFileParser.characters(chars); };
1951 handlers.
error = [&tagFileParser](
const std::string &fileName,
int lineNr,
const std::string &
msg) { tagFileParser.error(fileName,lineNr,
msg); };
1953 tagFileParser.setDocumentLocator(&parser);
1955 [&]() { DebugLex::print(Debug::Lex_xml,
"Entering",
"libxml/xml.l",fullName); },
1956 [&]() { DebugLex::print(Debug::Lex_xml,
"Finished",
"libxml/xml.l",fullName); }
1958 tagFileParser.buildLists(root);
1959 tagFileParser.addIncludes();
1962 tagFileParser.dump();
static bool looksGenerated(const std::string &anchor)
Returns true if anchor is a potentially generated anchor.
This class represents an function or template argument list.
void push_back(const Argument &a)
A String class for use with Doxygen wrapping std::string and adding some additional functionality off...
bool empty() const
Returns true iff the string is empty (std::string compatible alias for isEmpty()).
const std::string & str() const
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
static bool isFlagSet(const DebugMask mask)
static void print(DebugMask mask, int prio, fmt::format_string< Args... > fmt, Args &&... args)
virtual void addSectionsToDefinition(const std::vector< const SectionInfo * > &anchorList)=0
Class representing a directory in the file system.
static FileNameLinkedMap * inputNameLinkedMap
Class representing all files with a certain base name.
T * add(const char *k, Args &&... args)
const T * find(const std::string &key) const
static ModuleManager & instance()
class that provide information about a section.
SectionInfo * replace(const DString &label, const DString &fileName, int lineNr, const DString &title, SectionType type, int level, const DString &ref=DString())
SectionInfo * add(const SectionInfo &si)
static SectionManager & instance()
returns a reference to the singleton
static constexpr int Anchor
constexpr TypeSpecifier() noexcept
Event handlers that can installed by the client and called while parsing a XML document.
std::unordered_map< std::string, std::string > Attributes
std::function< EndElementType > endElement
handler invoked when a closing tag has been found
std::function< StartElementType > startElement
handler invoked when an opening tag has been found
std::function< CharsType > characters
handler invoked when content between tags has been found
static std::string value(const Attributes &attrib, const std::string &key)
std::function< ErrorType > error
handler invoked when the parser encounters an error
std::function< StartDocType > startDocument
handler invoked at the start of the document
void parse(const char *fileName, const char *inputString, bool debugEnabled, std::function< void()> debugStart, std::function< void()> debugEnd, std::function< Transcode > transcoder=[](std::string &s, const char *){ return true;})
TagAnchorInfo(const DString &f, const DString &l, const DString &t=DString())
Variant class that holds a unique pointer to one of the specific container types.
TagPageInfo * getPageInfo()
const TagDirInfo * getDirInfo() const
TagGroupInfo * getGroupInfo()
const R * get() const
Generic const getter.
const TagConceptInfo * getConceptInfo() const
TagModuleInfo * getModuleInfo()
TagNamespaceInfo * getNamespaceInfo()
static TagCompoundVariant make(Args &&... args)
Generic factory method to create a variant holding a unique pointer to a given compound type.
const TagPackageInfo * getPackageInfo() const
const TagGroupInfo * getGroupInfo() const
TagConceptInfo * getConceptInfo()
TagDirInfo * getDirInfo()
const TagModuleInfo * getModuleInfo() const
TagRequirementInfo * getRequirementInfo()
const TagClassInfo * getClassInfo() const
TagCompoundVariant(VariantT &&v)
const TagPageInfo * getPageInfo() const
TagPackageInfo * getPackageInfo()
const TagFileInfo * getFileInfo() const
TagFileInfo * getFileInfo()
const TagNamespaceInfo * getNamespaceInfo() const
R * get()
Generic non-const getter.
TagCompoundInfo * getCompoundInfo()
Convenience method to get the shared compound info.
std::variant< std::monostate, TagClassInfoPtr, TagConceptInfoPtr, TagNamespaceInfoPtr, TagPackageInfoPtr, TagFileInfoPtr, TagGroupInfoPtr, TagPageInfoPtr, TagDirInfoPtr, TagModuleInfoPtr, TagRequirementInfoPtr > VariantT
TagClassInfo * getClassInfo()
const TagRequirementInfo * getRequirementInfo() const
Container for enum values that are scoped within an enum.
void addDocAnchors(const std::shared_ptr< Entry > &e, const std::vector< TagAnchorInfo > &l)
void startIncludes(const XMLHandlers::Attributes &attrib)
void startDocAnchor(const XMLHandlers::Attributes &attrib)
TagFileParser(const char *tagName)
const XMLLocator * m_locator
void startStringValue(const XMLHandlers::Attributes &)
void setDocumentLocator(const XMLLocator *locator)
TagCompoundVariant m_curCompound
void startBase(const XMLHandlers::Attributes &attrib)
void characters(const DString &ch)
TagMemberInfo m_curMember
void startIgnoreElement(const XMLHandlers::Attributes &)
void buildLists(const std::shared_ptr< Entry > &root)
TagEnumValueInfo m_curEnumValue
void startMember(const XMLHandlers::Attributes &attrib)
void buildMemberList(const std::shared_ptr< Entry > &ce, const std::vector< TagMemberInfo > &members)
void buildClassEntry(const std::shared_ptr< Entry > &root, const TagClassInfo *tci)
void startCompound(const XMLHandlers::Attributes &attrib)
void endElement(const DString &name)
void buildClassTree(const std::shared_ptr< Entry > &root, const ClassNode &node)
TagIncludeInfo m_curIncludes
std::vector< TagCompoundVariant > m_tagFileCompounds
void startElement(const DString &name, const XMLHandlers::Attributes &attrib)
std::stack< State > m_stateStack
void error(const DString &fileName, int lineNr, const DString &msg)
void startEnumValue(const XMLHandlers::Attributes &attrib)
Container for include info that can be read from a tagfile.
Container for member specific info that can be read from a tagfile.
std::vector< TagEnumValueInfo > enumValues
std::vector< TagAnchorInfo > docAnchors
#define ONLY_DEFAULT_MOVABLE(cls)
Macro to help implementing the rule of 5 for a class that can be moved but not copied.
std::vector< std::string > StringVector
std::unique_ptr< ArgumentList > stringToArgumentList(SrcLangExt lang, const DString &argsString, DString *extraTypeChars=nullptr)
std::unique_ptr< FileDef > createFileDef(const DString &p, const DString &n, const DString &ref, const DString &dn)
#define warn(file, line, fmt,...)
std::unique_ptr< TagPackageInfo > TagPackageInfoPtr
std::unique_ptr< TagRequirementInfo > TagRequirementInfoPtr
std::unique_ptr< TagFileInfo > TagFileInfoPtr
std::unique_ptr< TagClassInfo > TagClassInfoPtr
std::unique_ptr< TagNamespaceInfo > TagNamespaceInfoPtr
std::unique_ptr< TagDirInfo > TagDirInfoPtr
static const std::map< std::string, CompoundFactory > g_compoundFactory
std::unique_ptr< TagConceptInfo > TagConceptInfoPtr
std::unique_ptr< TagModuleInfo > TagModuleInfoPtr
std::unique_ptr< TagPageInfo > TagPageInfoPtr
ElementCallbacks::EndCallback endCb(void(TagFileParser::*fn)())
static const std::map< std::string, ElementCallbacks > g_elementHandlers
ElementCallbacks::StartCallback startCb(void(TagFileParser::*fn)(const XMLHandlers::Attributes &))
std::unique_ptr< TagGroupInfo > TagGroupInfoPtr
Some helper functions for std::string.
StringVector split(const std::string &s, const std::string &delimiter)
split input string s by string delimiter delimiter.
This class contains the information about the argument of a function or template.
This class stores information about an inheritance relation.
DString name
the name of the base class
@ GROUPING_INGROUP
membership in group was defined by @ingroup
CompoundFactory(TagFileParser::State s, const CreateFunc &f)
TagFileParser::State state
std::function< TagCompoundVariant()> CreateFunc
std::function< void(TagFileParser &, const XMLHandlers::Attributes &)> StartCallback
std::function< void(TagFileParser &)> EndCallback
Container for class specific info that can be read from a tagfile.
StringVector templateArguments
std::vector< BaseInfo > bases
Base class for all compound types.
std::vector< TagAnchorInfo > docAnchors
std::vector< TagMemberInfo > members
Container for concept specific info that can be read from a tagfile.
Container for directory specific info that can be read from a tagfile.
Container for file specific info that can be read from a tagfile.
StringVector namespaceList
std::vector< TagIncludeInfo > includes
std::unordered_map< std::string, std::unique_ptr< ClassNode > > children
ClassNode(const std::string &n)
Container for group specific info that can be read from a tagfile.
StringVector namespaceList
StringVector subgroupList
Container for module specific info that can be read from a tagfile.
Container for namespace specific info that can be read from a tagfile.
StringVector namespaceList
Container for package specific info that can be read from a tagfile.
Container for page specific info that can be read from a tagfile.
Container for requirement specific info that can be read from a tagfile.
void parseTagFile(const std::shared_ptr< Entry > &root, const char *fullName)
DString stripExtension(const DString &fName)
DString stripExtensionGeneral(const DString &fName, const DString &ext)
DString getFileNameExtension(const DString &fn)
DString fileToString(const DString &name, bool filter, bool isSourceCode)
DString stripPath(const DString &s)
EntryType guessSection(const DString &name)
A bunch of utility functions.