summaryrefslogtreecommitdiffstats
path: root/src/tagreader.cpp
diff options
context:
space:
mode:
authorDimitri van Heesch <dimitri@stack.nl>2013-06-22 19:58:32 (GMT)
committerDimitri van Heesch <dimitri@stack.nl>2013-06-22 19:58:32 (GMT)
commitd63fb8488a84c7a0304ddd1024c07cc5756aa48a (patch)
treeeb68bfd8c17802b0dc8d47eb9668b606d272d012 /src/tagreader.cpp
parent0651fff25fe4e2e5752e222871257a37e530c805 (diff)
downloadDoxygen-d63fb8488a84c7a0304ddd1024c07cc5756aa48a.zip
Doxygen-d63fb8488a84c7a0304ddd1024c07cc5756aa48a.tar.gz
Doxygen-d63fb8488a84c7a0304ddd1024c07cc5756aa48a.tar.bz2
Add support for writing and importing C++11 style enums to and from tag files
Diffstat (limited to 'src/tagreader.cpp')
-rw-r--r--src/tagreader.cpp68
1 files changed, 67 insertions, 1 deletions
diff --git a/src/tagreader.cpp b/src/tagreader.cpp
index 8b59c05..03cc020 100644
--- a/src/tagreader.cpp
+++ b/src/tagreader.cpp
@@ -61,11 +61,22 @@ class TagAnchorInfoList : public QList<TagAnchorInfo>
virtual ~TagAnchorInfoList() {}
};
+/** Container for enum values that are scoped within an enum */
+class TagEnumValueInfo
+{
+ public:
+ QCString name;
+ QCString file;
+ QCString anchor;
+ QCString clangid;
+};
+
/** Container for member specific info that can be read from a tagfile */
class TagMemberInfo
{
public:
- TagMemberInfo() : prot(Public), virt(Normal), isStatic(FALSE) {}
+ TagMemberInfo() : prot(Public), virt(Normal), isStatic(FALSE)
+ { enumValues.setAutoDelete(TRUE); }
QCString type;
QCString name;
QCString anchorFile;
@@ -77,6 +88,7 @@ class TagMemberInfo
Protection prot;
Specifier virt;
bool isStatic;
+ QList<TagEnumValueInfo> enumValues;
};
/** Container for class specific info that can be read from a tagfile */
@@ -205,6 +217,7 @@ class TagFileParser : public QXmlDefaultHandler
InGroup,
InPage,
InMember,
+ InEnumValue,
InPackage,
InDir,
InTempArgList
@@ -416,6 +429,36 @@ class TagFileParser : public QXmlDefaultHandler
}
}
+ void startEnumValue( const QXmlAttributes& attrib)
+ {
+ if (m_state==InMember)
+ {
+ m_curString = "";
+ m_curEnumValue = new TagEnumValueInfo;
+ m_curEnumValue->file = attrib.value("file").utf8();
+ m_curEnumValue->anchor = attrib.value("anchor").utf8();
+ m_curEnumValue->clangid = attrib.value("clangid").utf8();
+ m_stateStack.push(new State(m_state));
+ m_state = InEnumValue;
+ }
+ else
+ {
+ warn("Found enumvalue tag outside of member tag\n");
+ }
+ }
+
+ void endEnumValue()
+ {
+ m_curEnumValue->name = m_curString.stripWhiteSpace();
+ m_state = *m_stateStack.top();
+ m_stateStack.remove();
+ if (m_state==InMember)
+ {
+ m_curMember->enumValues.append(m_curEnumValue);
+ m_curEnumValue=0;
+ }
+ }
+
void endDocAnchor()
{
switch(m_state)
@@ -745,6 +788,7 @@ class TagFileParser : public QXmlDefaultHandler
m_startElementHandlers.insert("compound", new StartElementHandler(this,&TagFileParser::startCompound));
m_startElementHandlers.insert("member", new StartElementHandler(this,&TagFileParser::startMember));
+ m_startElementHandlers.insert("enumvalue", new StartElementHandler(this,&TagFileParser::startEnumValue));
m_startElementHandlers.insert("name", new StartElementHandler(this,&TagFileParser::startStringValue));
m_startElementHandlers.insert("base", new StartElementHandler(this,&TagFileParser::startBase));
m_startElementHandlers.insert("filename", new StartElementHandler(this,&TagFileParser::startStringValue));
@@ -768,6 +812,7 @@ class TagFileParser : public QXmlDefaultHandler
m_endElementHandlers.insert("compound", new EndElementHandler(this,&TagFileParser::endCompound));
m_endElementHandlers.insert("member", new EndElementHandler(this,&TagFileParser::endMember));
+ m_endElementHandlers.insert("enumvalue", new EndElementHandler(this,&TagFileParser::endEnumValue));
m_endElementHandlers.insert("name", new EndElementHandler(this,&TagFileParser::endName));
m_endElementHandlers.insert("base", new EndElementHandler(this,&TagFileParser::endBase));
m_endElementHandlers.insert("filename", new EndElementHandler(this,&TagFileParser::endFilename));
@@ -853,6 +898,7 @@ class TagFileParser : public QXmlDefaultHandler
TagPageInfo *m_curPage;
TagDirInfo *m_curDir;
TagMemberInfo *m_curMember;
+ TagEnumValueInfo *m_curEnumValue;
TagIncludeInfo *m_curIncludes;
QCString m_curString;
QCString m_tagName;
@@ -1102,6 +1148,26 @@ void TagFileParser::buildMemberList(Entry *ce,QList<TagMemberInfo> &members)
me->argList = new ArgumentList;
stringToArgumentList(me->args,me->argList);
}
+ if (tmi->enumValues.count()>0)
+ {
+ me->spec |= Entry::Strong;
+ QListIterator<TagEnumValueInfo> evii(tmi->enumValues);
+ TagEnumValueInfo *evi;
+ for (evii.toFirst();(evi=evii.current());++evii)
+ {
+ Entry *ev = new Entry;
+ ev->type = "@";
+ ev->name = evi->name;
+ ev->id = evi->clangid;
+ ev->section = Entry::VARIABLE_SEC;
+ TagInfo *ti = new TagInfo;
+ ti->tagName = m_tagName;
+ ti->anchor = evi->anchor;
+ ti->fileName = evi->file;
+ ev->tagInfo = ti;
+ me->addSubEntry(ev);
+ }
+ }
me->protection = tmi->prot;
me->virt = tmi->virt;
me->stat = tmi->isStatic;