diff options
author | Dimitri van Heesch <dimitri@stack.nl> | 2013-06-22 19:58:32 (GMT) |
---|---|---|
committer | Dimitri van Heesch <dimitri@stack.nl> | 2013-06-22 19:58:32 (GMT) |
commit | d63fb8488a84c7a0304ddd1024c07cc5756aa48a (patch) | |
tree | eb68bfd8c17802b0dc8d47eb9668b606d272d012 /src/tagreader.cpp | |
parent | 0651fff25fe4e2e5752e222871257a37e530c805 (diff) | |
download | Doxygen-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.cpp | 68 |
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; |