Skip to content

Commit d0fb515

Browse files
committed
issue doxygen#11614 Multiple occurrences of the same macro definition in a file result are assigned the same ID
1 parent f134637 commit d0fb515

File tree

4 files changed

+54
-2
lines changed

4 files changed

+54
-2
lines changed

src/doxygen.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8831,6 +8831,15 @@ static void buildDefineList()
88318831
MemberName *mn=Doxygen::functionNameLinkedMap->add(def.name);
88328832
if (def.fileDef)
88338833
{
8834+
const MemberList *defMl = def.fileDef->getMemberList(MemberListType::DocDefineMembers());
8835+
if (defMl)
8836+
{
8837+
const MemberDef *defMd = defMl->findRev(def.name);
8838+
if (defMd) // definition already stored
8839+
{
8840+
mmd->setRedefineCount(defMd->redefineCount()+1);
8841+
}
8842+
}
88348843
def.fileDef->insertMember(md.get());
88358844
}
88368845
AUTO_TRACE_ADD("adding macro {} with definition {}",def.name,def.definition);

src/memberdef.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,8 @@ class MemberDefImpl : public DefinitionMixin<MemberDefMutable>
354354
StringVector getQualifiers() const override;
355355
ClassDefMutable *getClassDefMutable() override;
356356
void setModuleDef(ModuleDef *mod) override;
357+
int redefineCount() const override;
358+
void setRedefineCount(int) override;
357359

358360
private:
359361
void _computeLinkableInProject();
@@ -511,6 +513,7 @@ class MemberDefImpl : public DefinitionMixin<MemberDefMutable>
511513
int m_declLine = -1;
512514
int m_declColumn = -1;
513515
int m_numberOfFlowKW = 0;
516+
int m_redefineCount = 0;
514517
};
515518

516519
std::unique_ptr<MemberDef> createMemberDef(const QCString &defFileName,int defLine,int defColumn,
@@ -932,6 +935,8 @@ class MemberDefAliasImpl : public DefinitionAliasMixin<MemberDef>
932935
{ return getMdAlias()->requiresClause(); }
933936
bool visibleInIndex() const override
934937
{ return getMdAlias()->visibleInIndex(); }
938+
int redefineCount() const override
939+
{ return getMdAlias()->redefineCount(); }
935940

936941
void warnIfUndocumented() const override {}
937942
void warnIfUndocumentedParams() const override {}
@@ -4366,6 +4371,13 @@ void MemberDefImpl::setAnchor()
43664371
{
43674372
memAnchor+=" "+m_requiresClause;
43684373
}
4374+
if (m_redefineCount>0)
4375+
{
4376+
char buf[20];
4377+
qsnprintf(buf,20,":%d",m_redefineCount);
4378+
buf[19]='\0';
4379+
memAnchor.append(buf);
4380+
}
43694381

43704382
// convert to md5 hash
43714383
uint8_t md5_sig[16];
@@ -6391,6 +6403,16 @@ CodeSymbolType MemberDefImpl::codeSymbolType() const
63916403
return CodeSymbolType::Default;
63926404
}
63936405

6406+
int MemberDefImpl::redefineCount() const
6407+
{
6408+
return m_redefineCount;
6409+
}
6410+
6411+
void MemberDefImpl::setRedefineCount(int count)
6412+
{
6413+
m_redefineCount=count;
6414+
}
6415+
63946416
//-------------------------------------------------------------------------------
63956417
// Helpers
63966418

@@ -6498,3 +6520,4 @@ MemberDefMutable *toMemberDefMutable(Definition *d)
64986520
}
64996521
}
65006522

6523+

src/memberdef.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,7 @@ class MemberDef : public Definition
292292
virtual void warnIfUndocumented() const = 0;
293293
virtual void warnIfUndocumentedParams() const = 0;
294294
virtual bool visibleInIndex() const = 0;
295+
virtual int redefineCount() const = 0;
295296

296297
// TODO: this is not a getter, should be passed at construction
297298
virtual void setMemberGroup(MemberGroup *grp) = 0;
@@ -409,6 +410,9 @@ class MemberDefMutable : public DefinitionMutable, public MemberDef
409410

410411
virtual void setModuleDef(ModuleDef *mod) = 0;
411412

413+
// macro redefinition
414+
virtual void setRedefineCount(int count) = 0;
415+
412416
//-----------------------------------------------------------------------------------
413417
// --- actions ----
414418
//-----------------------------------------------------------------------------------

src/memberlist.h

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,16 +90,32 @@ class MemberVector
9090
{
9191
return std::find(m_members.begin(),m_members.end(),md)!=m_members.end();
9292
}
93-
MemberDef *find(const QCString &name)
93+
const MemberDef *find(const QCString &name) const
9494
{
9595
auto it = std::find_if(m_members.begin(),m_members.end(),[name=name](auto &el) { return el->name()==name; });
9696
if (it != m_members.end())
9797
{
9898
return *it;
9999
}
100-
101100
return nullptr;
102101
}
102+
MemberDef *find(const QCString &name)
103+
{
104+
return const_cast<MemberDef *>(static_cast<const MemberVector *>(this)->find(name));
105+
}
106+
const MemberDef *findRev(const QCString &name) const
107+
{
108+
auto it = std::find_if(m_members.rbegin(),m_members.rend(),[name=name](auto &el) { return el->name()==name; });
109+
if (it != m_members.rend())
110+
{
111+
return *it;
112+
}
113+
return nullptr;
114+
}
115+
MemberDef *findRev(const QCString &name)
116+
{
117+
return const_cast<MemberDef *>(static_cast<const MemberVector *>(this)->findRev(name));
118+
}
103119
protected:
104120
Vec m_members;
105121
};

0 commit comments

Comments
 (0)