diff options
author | Dimitri van Heesch <doxygen@gmail.com> | 2019-08-25 14:12:28 (GMT) |
---|---|---|
committer | Dimitri van Heesch <doxygen@gmail.com> | 2019-08-25 14:12:28 (GMT) |
commit | 12d999af7931c96dfb9dc366d785c3981ac244d4 (patch) | |
tree | 6a20c3dc5455dd1fe80017f34dc88f40ab2673ac /src/namespacedef.cpp | |
parent | 082e135c2de6a4d84074f006726f4b6ff53b1169 (diff) | |
download | Doxygen-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.cpp | 171 |
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); } } |