summaryrefslogtreecommitdiffstats
path: root/src/namespacedef.cpp
diff options
context:
space:
mode:
authorDimitri van Heesch <doxygen@gmail.com>2019-08-25 14:12:28 (GMT)
committerDimitri van Heesch <doxygen@gmail.com>2019-08-25 14:12:28 (GMT)
commit12d999af7931c96dfb9dc366d785c3981ac244d4 (patch)
tree6a20c3dc5455dd1fe80017f34dc88f40ab2673ac /src/namespacedef.cpp
parent082e135c2de6a4d84074f006726f4b6ff53b1169 (diff)
downloadDoxygen-12d999af7931c96dfb9dc366d785c3981ac244d4.zip
Doxygen-12d999af7931c96dfb9dc366d785c3981ac244d4.tar.gz
Doxygen-12d999af7931c96dfb9dc366d785c3981ac244d4.tar.bz2
issue #7216: non-const getGroupDef() called on aliased member
Diffstat (limited to 'src/namespacedef.cpp')
-rw-r--r--src/namespacedef.cpp171
1 files changed, 99 insertions, 72 deletions
diff --git a/src/namespacedef.cpp b/src/namespacedef.cpp
index 38e5c04..c0ae05d 100644
--- a/src/namespacedef.cpp
+++ b/src/namespacedef.cpp
@@ -467,92 +467,119 @@ void NamespaceDefImpl::addMembersToMemberGroup()
void NamespaceDefImpl::insertMember(MemberDef *md)
{
- //printf("%s::insertMember(%s)\n",qPrint(name()),qPrint(md->name()));
+ //printf("%s::insertMember(%s) isInline=%d hasDocs=%d\n",qPrint(name()),qPrint(md->name()),
+ // isInline(),hasDocumentation());
if (md->isHidden()) return;
- MemberList *allMemberList = getMemberList(MemberListType_allMembersList);
- if (allMemberList==0)
- {
- allMemberList = new MemberList(MemberListType_allMembersList);
- m_memberLists.append(allMemberList);
- }
- allMemberList->append(md);
- if (m_allMembersDict==0)
- {
- m_allMembersDict = new MemberSDict;
- }
- //printf("%s::m_allMembersDict->append(%s)\n",name().data(),md->localName().data());
- m_allMembersDict->append(md->localName(),md);
- //::addNamespaceMemberNameToIndex(md);
- //static bool sortBriefDocs=Config_getBool(SORT_BRIEF_DOCS);
- switch(md->memberType())
- {
- case MemberType_Variable:
- addMemberToList(MemberListType_decVarMembers,md);
- addMemberToList(MemberListType_docVarMembers,md);
- break;
- case MemberType_Function:
- addMemberToList(MemberListType_decFuncMembers,md);
- addMemberToList(MemberListType_docFuncMembers,md);
- break;
- case MemberType_Typedef:
- addMemberToList(MemberListType_decTypedefMembers,md);
- addMemberToList(MemberListType_docTypedefMembers,md);
- break;
- case MemberType_Sequence:
- addMemberToList(MemberListType_decSequenceMembers,md);
- addMemberToList(MemberListType_docSequenceMembers,md);
- break;
- case MemberType_Dictionary:
- addMemberToList(MemberListType_decDictionaryMembers,md);
- addMemberToList(MemberListType_docDictionaryMembers,md);
- break;
- case MemberType_Enumeration:
- addMemberToList(MemberListType_decEnumMembers,md);
- addMemberToList(MemberListType_docEnumMembers,md);
- break;
- case MemberType_EnumValue:
- break;
- case MemberType_Define:
- addMemberToList(MemberListType_decDefineMembers,md);
- addMemberToList(MemberListType_docDefineMembers,md);
- break;
- default:
- err("NamespaceDefImpl::insertMembers(): "
- "member '%s' with class scope '%s' inserted in namespace scope '%s'!\n",
- md->name().data(),
- md->getClassDef() ? md->getClassDef()->name().data() : "",
- name().data());
- }
- // if this is an inline namespace, then insert an alias of this member in the outer scope.
- if (isInline())
+
+ // if this is an inline namespace that is not documented, then insert the
+ // member in the parent scope instead
+ if (isInline() && !hasDocumentation())
{
Definition *outerScope = getOuterScope();
if (outerScope)
{
- MemberDef *aliasMd = 0;
if (outerScope->definitionType()==Definition::TypeNamespace)
{
- aliasMd = createMemberDefAlias(outerScope,md);
- dynamic_cast<NamespaceDef*>(outerScope)->insertMember(aliasMd);
+ NamespaceDef *nd = dynamic_cast<NamespaceDef*>(outerScope);
+ nd->insertMember(md);
+ md->setNamespace(nd);
}
else if (outerScope->definitionType()==Definition::TypeFile)
{
- aliasMd = createMemberDefAlias(outerScope,md);
- dynamic_cast<FileDef*>(outerScope)->insertMember(aliasMd);
+ FileDef *fd = dynamic_cast<FileDef*>(outerScope);
+ fd->insertMember(md);
+ md->setFileDef(fd);
+ md->setOuterScope(fd);
}
- if (aliasMd)
+ }
+ }
+ else // member is a non-inline namespace or a documented inline namespace
+ {
+ MemberList *allMemberList = getMemberList(MemberListType_allMembersList);
+ if (allMemberList==0)
+ {
+ allMemberList = new MemberList(MemberListType_allMembersList);
+ m_memberLists.append(allMemberList);
+ }
+ allMemberList->append(md);
+ if (m_allMembersDict==0)
+ {
+ m_allMembersDict = new MemberSDict;
+ }
+ //printf("%s::m_allMembersDict->append(%s)\n",name().data(),md->localName().data());
+ m_allMembersDict->append(md->localName(),md);
+ //::addNamespaceMemberNameToIndex(md);
+ //static bool sortBriefDocs=Config_getBool(SORT_BRIEF_DOCS);
+ switch(md->memberType())
+ {
+ case MemberType_Variable:
+ addMemberToList(MemberListType_decVarMembers,md);
+ addMemberToList(MemberListType_docVarMembers,md);
+ break;
+ case MemberType_Function:
+ addMemberToList(MemberListType_decFuncMembers,md);
+ addMemberToList(MemberListType_docFuncMembers,md);
+ break;
+ case MemberType_Typedef:
+ addMemberToList(MemberListType_decTypedefMembers,md);
+ addMemberToList(MemberListType_docTypedefMembers,md);
+ break;
+ case MemberType_Sequence:
+ addMemberToList(MemberListType_decSequenceMembers,md);
+ addMemberToList(MemberListType_docSequenceMembers,md);
+ break;
+ case MemberType_Dictionary:
+ addMemberToList(MemberListType_decDictionaryMembers,md);
+ addMemberToList(MemberListType_docDictionaryMembers,md);
+ break;
+ case MemberType_Enumeration:
+ addMemberToList(MemberListType_decEnumMembers,md);
+ addMemberToList(MemberListType_docEnumMembers,md);
+ break;
+ case MemberType_EnumValue:
+ break;
+ case MemberType_Define:
+ addMemberToList(MemberListType_decDefineMembers,md);
+ addMemberToList(MemberListType_docDefineMembers,md);
+ break;
+ default:
+ err("NamespaceDefImpl::insertMembers(): "
+ "member '%s' with class scope '%s' inserted in namespace scope '%s'!\n",
+ md->name().data(),
+ md->getClassDef() ? md->getClassDef()->name().data() : "",
+ name().data());
+ }
+ // if this is an inline namespace, then insert an alias of this member in the outer scope.
+ if (isInline())
+ {
+ Definition *outerScope = getOuterScope();
+ if (outerScope)
{
- MemberName *mn;
- QCString name = md->name();
- if ((mn=Doxygen::functionNameSDict->find(name)))
+ MemberDef *aliasMd = 0;
+ if (outerScope->definitionType()==Definition::TypeNamespace)
{
- mn->append(aliasMd);
+ aliasMd = createMemberDefAlias(outerScope,md);
+ dynamic_cast<NamespaceDef*>(outerScope)->insertMember(aliasMd);
}
- else
+ else if (outerScope->definitionType()==Definition::TypeFile)
{
- mn = new MemberName(name);
- mn->append(aliasMd);
- Doxygen::functionNameSDict->append(name,mn);
+ aliasMd = createMemberDefAlias(outerScope,md);
+ dynamic_cast<FileDef*>(outerScope)->insertMember(aliasMd);
+ }
+ if (aliasMd)
+ {
+ MemberName *mn;
+ QCString name = md->name();
+ if ((mn=Doxygen::functionNameSDict->find(name)))
+ {
+ mn->append(aliasMd);
+ }
+ else
+ {
+ mn = new MemberName(name);
+ mn->append(aliasMd);
+ Doxygen::functionNameSDict->append(name,mn);
+ }
}
}
}
@@ -1460,7 +1487,7 @@ void NamespaceDefImpl::addMemberToList(MemberListType lt,MemberDef *md)
if (ml->listType()&MemberListType_declarationLists)
{
- md->setSectionList(this,ml);
+ md->setSectionList(ml);
}
}