Skip to content

Commit ef4065a

Browse files
committed
issue #11144 Template relation doesn't appear on graph
1 parent 691b46e commit ef4065a

4 files changed

Lines changed: 54 additions & 9 deletions

File tree

src/classdef.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,9 +275,11 @@ class ClassDefImpl : public DefinitionMixin<ClassDefMutable>
275275
bool containsOverload(const MemberDef *md) const override;
276276
ClassDef *insertTemplateInstance(const QCString &fileName,int startLine,int startColumn,
277277
const QCString &templSpec,bool &freshInstance) const override;
278+
bool isImplicitTemplateInstance() const override;
278279

279280
void insertBaseClass(ClassDef *,const QCString &name,Protection p,Specifier s,const QCString &t=QCString()) override;
280281
void insertSubClass(ClassDef *,Protection p,Specifier s,const QCString &t=QCString()) override;
282+
void insertExplicitTemplateInstance(ClassDef *instance,const QCString &spec) override;
281283
void setIncludeFile(FileDef *fd,const QCString &incName,bool local,bool force) override;
282284
void insertMember(MemberDef *) override;
283285
void insertUsedFile(const FileDef *) override;
@@ -299,6 +301,7 @@ class ClassDefImpl : public DefinitionMixin<ClassDefMutable>
299301
void setTemplateArguments(const ArgumentList &al) override;
300302
void setTemplateBaseClassNames(const TemplateNameMap &templateNames) override;
301303
void setTemplateMaster(const ClassDef *tm) override;
304+
void setImplicitTemplateInstance(bool b) override;
302305
void setTypeConstraints(const ArgumentList &al) override;
303306
void addMembersToTemplateInstance(const ClassDef *cd,const ArgumentList &templateArguments,const QCString &templSpec) override;
304307
void makeTemplateArgument(bool b=TRUE) override;
@@ -600,6 +603,8 @@ class ClassDefAliasImpl : public DefinitionAliasMixin<ClassDef>
600603
ClassDef *insertTemplateInstance(const QCString &fileName,int startLine,int startColumn,
601604
const QCString &templSpec,bool &freshInstance) const override
602605
{ return getCdAlias()->insertTemplateInstance(fileName,startLine,startColumn,templSpec,freshInstance); }
606+
bool isImplicitTemplateInstance() const override
607+
{ return getCdAlias()->isImplicitTemplateInstance(); }
603608

604609
void writeDocumentation(OutputList &ol) const override
605610
{ getCdAlias()->writeDocumentation(ol); }
@@ -799,6 +804,8 @@ class ClassDefImpl::IMPL
799804

800805
bool hasCollaborationGraph = false;
801806
CLASS_GRAPH_t typeInheritanceGraph = CLASS_GRAPH_t::NO;
807+
808+
bool implicitTemplateInstance = false;
802809
};
803810

804811
void ClassDefImpl::IMPL::init(const QCString &defFileName, const QCString &name,
@@ -4256,6 +4263,7 @@ ClassDef *ClassDefImpl::insertTemplateInstance(const QCString &fileName,
42564263
templateClass->setOuterScope(getOuterScope());
42574264
templateClass->setHidden(isHidden());
42584265
templateClass->setArtificial(isArtificial());
4266+
templateClass->setImplicitTemplateInstance(true);
42594267
m_impl->templateInstances.emplace_back(templSpec,templateClass);
42604268

42614269
// also add nested classes
@@ -4273,6 +4281,7 @@ ClassDef *ClassDefImpl::insertTemplateInstance(const QCString &fileName,
42734281
innerClass->setOuterScope(templateClass);
42744282
innerClass->setHidden(isHidden());
42754283
innerClass->setArtificial(TRUE);
4284+
innerClass->setImplicitTemplateInstance(true);
42764285
}
42774286
}
42784287
freshInstance=TRUE;
@@ -4281,6 +4290,11 @@ ClassDef *ClassDefImpl::insertTemplateInstance(const QCString &fileName,
42814290
return templateClass;
42824291
}
42834292

4293+
void ClassDefImpl::insertExplicitTemplateInstance(ClassDef *templateClass,const QCString &templSpec)
4294+
{
4295+
m_impl->templateInstances.emplace_back(templSpec,templateClass);
4296+
}
4297+
42844298
void ClassDefImpl::setTemplateBaseClassNames(const TemplateNameMap &templateNames)
42854299
{
42864300
m_impl->templBaseClassNames = templateNames;
@@ -4906,6 +4920,16 @@ const ClassDef *ClassDefImpl::templateMaster() const
49064920
return m_impl->templateMaster;
49074921
}
49084922

4923+
bool ClassDefImpl::isImplicitTemplateInstance() const
4924+
{
4925+
return m_impl->implicitTemplateInstance;
4926+
}
4927+
4928+
void ClassDefImpl::setImplicitTemplateInstance(bool b)
4929+
{
4930+
m_impl->implicitTemplateInstance = b;
4931+
}
4932+
49094933
bool ClassDefImpl::isTemplate() const
49104934
{
49114935
return !m_impl->tempArgs.empty();

src/classdef.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,8 @@ class ClassDef : public Definition
332332

333333
virtual bool containsOverload(const MemberDef *md) const = 0;
334334

335+
virtual bool isImplicitTemplateInstance() const = 0;
336+
335337
//-----------------------------------------------------------------------------------
336338
// --- count members ----
337339
//-----------------------------------------------------------------------------------
@@ -405,6 +407,7 @@ class ClassDefMutable : public DefinitionMutable, public ClassDef
405407
// inheritance graph related members
406408
virtual CLASS_GRAPH_t hasInheritanceGraph() const = 0;
407409
virtual void overrideInheritanceGraph(CLASS_GRAPH_t e) = 0;
410+
virtual void setImplicitTemplateInstance(bool b) = 0;
408411

409412
// collaboration graph related members
410413
virtual bool hasCollaborationGraph() const = 0;
@@ -416,6 +419,7 @@ class ClassDefMutable : public DefinitionMutable, public ClassDef
416419

417420
virtual void insertBaseClass(ClassDef *,const QCString &name,Protection p,Specifier s,const QCString &t=QCString()) = 0;
418421
virtual void insertSubClass(ClassDef *,Protection p,Specifier s,const QCString &t=QCString()) = 0;
422+
virtual void insertExplicitTemplateInstance(ClassDef *instance,const QCString &spec) = 0;
419423
virtual void insertMember(MemberDef *) = 0;
420424
virtual void insertUsedFile(const FileDef *) = 0;
421425
virtual void addMembersToTemplateInstance(const ClassDef *cd,const ArgumentList &templateArguments,const QCString &templSpec) = 0;

src/doxygen.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5125,6 +5125,22 @@ static void findInheritedTemplateInstances()
51255125
}
51265126
}
51275127

5128+
static void makeTemplateInstanceRelation(const Entry *root,ClassDefMutable *cd)
5129+
{
5130+
AUTO_TRACE("root->name={} cd={}",root->name,cd->name());
5131+
int i = root->name.find('<');
5132+
if (i!=-1)
5133+
{
5134+
ClassDefMutable *master = getClassMutable(root->name.left(i));
5135+
if (master && !cd->templateMaster())
5136+
{
5137+
AUTO_TRACE_ADD("class={} master={}",cd->name(),cd->templateMaster()?cd->templateMaster()->name():"<none>",master->name());
5138+
cd->setTemplateMaster(master);
5139+
master->insertExplicitTemplateInstance(cd,root->name.mid(i));
5140+
}
5141+
}
5142+
}
5143+
51285144
static void findUsedTemplateInstances()
51295145
{
51305146
AUTO_TRACE();
@@ -5135,6 +5151,7 @@ static void findUsedTemplateInstances()
51355151
if (cdm)
51365152
{
51375153
findUsedClassesForClass(root,cdm,cdm,cdm,TRUE);
5154+
makeTemplateInstanceRelation(root,cdm);
51385155
cdm->addTypeConstraints();
51395156
}
51405157
}

src/index.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1000,8 +1000,8 @@ static void writeClassTreeForList(OutputList &ol,const ClassLinkedMap &cl,bool &
10001000
//printf("list: Has children %s: %d\n",qPrint(cd->name()),hasChildren);
10011001
if (cd->isLinkable())
10021002
{
1003-
//printf("Writing class %s isLinkable()=%d isLinkableInProject()=%d cd->templateMaster()=%p\n",
1004-
// qPrint(cd->displayName()),cd->isLinkable(),cd->isLinkableInProject(),cd->templateMaster());
1003+
//printf("Writing class %s isLinkable()=%d isLinkableInProject()=%d cd->isImplicitTemplateinstance()=%d\n",
1004+
// qPrint(cd->displayName()),cd->isLinkable(),cd->isLinkableInProject(),cd->isImplicitTemplateInstance());
10051005
ol.startIndexItem(cd->getReference(),cd->getOutputFileBase());
10061006
ol.parseText(cd->displayName());
10071007
ol.endIndexItem(cd->getReference(),cd->getOutputFileBase());
@@ -1716,12 +1716,12 @@ static void writeClassTree(const ListType &cl,FTVHelp *ftv,bool addToIndex,bool
17161716
int count=0;
17171717
for (const auto &ccd : cd->getClasses())
17181718
{
1719-
if (ccd->isLinkableInProject() && ccd->templateMaster()==nullptr)
1719+
if (ccd->isLinkableInProject() && !ccd->isImplicitTemplateInstance())
17201720
{
17211721
count++;
17221722
}
17231723
}
1724-
if (classVisibleInIndex(cd) && cd->templateMaster()==nullptr)
1724+
if (classVisibleInIndex(cd) && !cd->isImplicitTemplateInstance())
17251725
{
17261726
if (ftv)
17271727
{
@@ -2101,7 +2101,7 @@ static int countAnnotatedClasses(int *cp, ClassDef::CompoundType ct)
21012101
{
21022102
continue;
21032103
}
2104-
if (cd->isLinkableInProject() && cd->templateMaster()==nullptr)
2104+
if (cd->isLinkableInProject() && !cd->isImplicitTemplateInstance())
21052105
{
21062106
if (!cd->isEmbeddedInOuterScope())
21072107
{
@@ -2150,7 +2150,7 @@ static void writeAnnotatedClassList(OutputList &ol,ClassDef::CompoundType ct)
21502150
ol.disable(OutputType::Docbook);
21512151
ol.disable(OutputType::RTF);
21522152
}
2153-
if (cd->isLinkableInProject() && cd->templateMaster()==nullptr)
2153+
if (cd->isLinkableInProject() && !cd->isImplicitTemplateInstance())
21542154
{
21552155
ol.startIndexKey();
21562156
if (cd->getLanguage()==SrcLangExt::VHDL)
@@ -2255,7 +2255,7 @@ static void writeAlphabeticalClassList(OutputList &ol, ClassDef::CompoundType ct
22552255
{
22562256
if (sliceOpt && cd->compoundType() != ct)
22572257
continue;
2258-
if (cd->isLinkableInProject() && cd->templateMaster()==nullptr)
2258+
if (cd->isLinkableInProject() && !cd->isImplicitTemplateInstance())
22592259
{
22602260
if (cd->getLanguage()==SrcLangExt::VHDL && !(VhdlDocGen::convert(cd->protection())==VhdlDocGen::ENTITYCLASS ))// no architecture
22612261
continue;
@@ -2297,7 +2297,7 @@ static void writeAlphabeticalClassList(OutputList &ol, ClassDef::CompoundType ct
22972297
if (cd->getLanguage()==SrcLangExt::VHDL && !(VhdlDocGen::convert(cd->protection())==VhdlDocGen::ENTITYCLASS ))// no architecture
22982298
continue;
22992299

2300-
if (cd->isLinkableInProject() && cd->templateMaster()==nullptr)
2300+
if (cd->isLinkableInProject() && !cd->isImplicitTemplateInstance())
23012301
{
23022302
QCString className = cd->className();
23032303
int index = getPrefixIndex(className);
@@ -2841,7 +2841,7 @@ void Index::addClassMemberNameToIndex(const MemberDef *md)
28412841
if (md->isLinkableInProject() &&
28422842
(cd=md->getClassDef()) &&
28432843
cd->isLinkableInProject() &&
2844-
cd->templateMaster()==nullptr)
2844+
!cd->isImplicitTemplateInstance())
28452845
{
28462846
QCString n = md->name();
28472847
std::string letter = getUTF8CharAt(n.str(),getPrefixIndex(n));

0 commit comments

Comments
 (0)