Skip to content

Commit a945d52

Browse files
committed
When instantiating templates also instantiate nested classes
1 parent 459a66a commit a945d52

File tree

3 files changed

+47
-26
lines changed

3 files changed

+47
-26
lines changed

src/classdef.cpp

Lines changed: 44 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ class ClassDefImpl : public DefinitionMixin<ClassDefMutable>
269269
virtual void setTemplateBaseClassNames(QDict<int> *templateNames);
270270
virtual void setTemplateMaster(const ClassDef *tm);
271271
virtual void setTypeConstraints(const ArgumentList &al);
272-
virtual void addMembersToTemplateInstance(const ClassDef *cd,const char *templSpec);
272+
virtual void addMembersToTemplateInstance(const ClassDef *cd,const ArgumentList &templateArguments,const char *templSpec);
273273
virtual void makeTemplateArgument(bool b=TRUE);
274274
virtual void setCategoryOf(ClassDef *cd);
275275
virtual void setUsedOnly(bool b);
@@ -4034,16 +4034,35 @@ ClassDef *ClassDefImpl::insertTemplateInstance(const QCString &fileName,
40344034
{
40354035
QCString tcname = removeRedundantWhiteSpace(localName()+templSpec);
40364036
Debug::print(Debug::Classes,0," New template instance class '%s''%s' inside '%s' hidden=%d\n",qPrint(name()),qPrint(templSpec),qPrint(name()),isHidden());
4037-
templateClass =
4038-
toClassDefMutable(
4039-
Doxygen::classLinkedMap->add(tcname,
4040-
std::unique_ptr<ClassDef>(
4041-
new ClassDefImpl(fileName,startLine,startColumn,tcname,ClassDef::Class))));
4042-
templateClass->setTemplateMaster(this);
4043-
templateClass->setOuterScope(getOuterScope());
4044-
templateClass->setHidden(isHidden());
4045-
m_impl->templateInstances->insert(templSpec,templateClass);
4046-
freshInstance=TRUE;
4037+
4038+
templateClass = toClassDefMutable(Doxygen::classLinkedMap->find(tcname));
4039+
if (templateClass==0)
4040+
{
4041+
templateClass =
4042+
toClassDefMutable(
4043+
Doxygen::classLinkedMap->add(tcname,
4044+
std::unique_ptr<ClassDef>(
4045+
new ClassDefImpl(fileName,startLine,startColumn,tcname,ClassDef::Class))));
4046+
templateClass->setTemplateMaster(this);
4047+
templateClass->setOuterScope(getOuterScope());
4048+
templateClass->setHidden(isHidden());
4049+
m_impl->templateInstances->insert(templSpec,templateClass);
4050+
4051+
// also add nested classes
4052+
for (const auto &innerCd : m_impl->innerClasses)
4053+
{
4054+
QCString innerName = tcname+"::"+innerCd->localName();
4055+
ClassDefMutable *innerClass =
4056+
toClassDefMutable(
4057+
Doxygen::classLinkedMap->add(innerName,
4058+
std::unique_ptr<ClassDef>(
4059+
new ClassDefImpl(fileName,startLine,startColumn,innerName,ClassDef::Class))));
4060+
templateClass->addInnerCompound(innerClass);
4061+
innerClass->setOuterScope(templateClass);
4062+
innerClass->setHidden(isHidden());
4063+
}
4064+
freshInstance=TRUE;
4065+
}
40474066
}
40484067
return templateClass;
40494068
}
@@ -4062,7 +4081,7 @@ ClassDef *ClassDefImpl::getVariableInstance(const char *templSpec) const
40624081
QCString tcname = removeRedundantWhiteSpace(name()+templSpec);
40634082
templateClass = new ClassDefImpl("<code>",1,1,tcname,
40644083
ClassDef::Class,0,0,FALSE);
4065-
templateClass->addMembersToTemplateInstance( this, templSpec );
4084+
templateClass->addMembersToTemplateInstance( this, templateArguments(), templSpec );
40664085
templateClass->setTemplateMaster(this);
40674086
m_impl->variableInstances->insert(templSpec,templateClass);
40684087
}
@@ -4093,17 +4112,17 @@ QDict<int> *ClassDefImpl::getTemplateBaseClassNames() const
40934112
return m_impl->templBaseClassNames;
40944113
}
40954114

4096-
void ClassDefImpl::addMembersToTemplateInstance(const ClassDef *cd,const char *templSpec)
4115+
void ClassDefImpl::addMembersToTemplateInstance(const ClassDef *cd,const ArgumentList &templateArguments,const char *templSpec)
40974116
{
40984117
//printf("%s::addMembersToTemplateInstance(%s,%s)\n",name().data(),cd->name().data(),templSpec);
4099-
for (auto &mni : cd->memberNameInfoLinkedMap())
4118+
for (const auto &mni : cd->memberNameInfoLinkedMap())
41004119
{
4101-
for (auto &mi : *mni)
4120+
for (const auto &mi : *mni)
41024121
{
41034122
auto actualArguments_p = stringToArgumentList(getLanguage(),templSpec);
41044123
MemberDef *md = mi->memberDef();
41054124
std::unique_ptr<MemberDefMutable> imd { md->createTemplateInstanceMember(
4106-
cd->templateArguments(),actualArguments_p) };
4125+
templateArguments,actualArguments_p) };
41074126
//printf("%s->setMemberClass(%p)\n",imd->name().data(),this);
41084127
imd->setMemberClass(this);
41094128
imd->setTemplateMaster(md);
@@ -4122,6 +4141,15 @@ void ClassDefImpl::addMembersToTemplateInstance(const ClassDef *cd,const char *t
41224141
mn->push_back(std::move(imd));
41234142
}
41244143
}
4144+
// also instantatie members for nested classes
4145+
for (const auto &innerCd : cd->getClasses())
4146+
{
4147+
ClassDefMutable *ncd = toClassDefMutable(m_impl->innerClasses.find(innerCd->localName()));
4148+
if (ncd)
4149+
{
4150+
ncd->addMembersToTemplateInstance(innerCd,cd->templateArguments(),templSpec);
4151+
}
4152+
}
41254153
}
41264154

41274155
QCString ClassDefImpl::getReference() const

src/classdef.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,7 @@ class ClassDefMutable : public DefinitionMutable, public ClassDef
410410
virtual void insertSubClass(ClassDef *,Protection p,Specifier s,const char *t=0) = 0;
411411
virtual void insertMember(MemberDef *) = 0;
412412
virtual void insertUsedFile(FileDef *) = 0;
413-
virtual void addMembersToTemplateInstance(const ClassDef *cd,const char *templSpec) = 0;
413+
virtual void addMembersToTemplateInstance(const ClassDef *cd,const ArgumentList &templateArguments,const char *templSpec) = 0;
414414
virtual void addInnerCompound(const Definition *d) = 0;
415415
virtual bool addExample(const char *anchor,const char *name, const char *file) = 0;
416416
virtual void addUsedClass(ClassDef *cd,const char *accessName,Protection prot) = 0;

src/doxygen.cpp

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4372,7 +4372,7 @@ static bool findClassRelation(
43724372
int i=findTemplateSpecializationPosition(baseClassName);
43734373
int si=baseClassName.findRev("::",i);
43744374
if (si==-1) si=0;
4375-
if (baseClass==0 && i!=-1)
4375+
if (baseClass==0 && static_cast<uint>(i)!=baseClassName.length())
43764376
// base class has template specifiers
43774377
{
43784378
// TODO: here we should try to find the correct template specialization
@@ -4428,13 +4428,6 @@ static bool findClassRelation(
44284428
}
44294429
//printf("2. found=%d\n",found);
44304430

4431-
//printf("root->name=%s biName=%s baseClassName=%s\n",
4432-
// root->name.data(),biName.data(),baseClassName.data());
4433-
//if (cd->isCSharp() && i!=-1) // C# generic -> add internal -g postfix
4434-
//{
4435-
// baseClassName+="-g";
4436-
//}
4437-
44384431
if (!found)
44394432
{
44404433
baseClass=toClassDefMutable(findClassWithinClassContext(context,cd,baseClassName));
@@ -7574,7 +7567,7 @@ static void createTemplateInstanceMembers()
75747567
ClassDefMutable *tcdm = toClassDefMutable(tcd);
75757568
if (tcdm)
75767569
{
7577-
tcdm->addMembersToTemplateInstance(cd.get(),qdi.currentKey());
7570+
tcdm->addMembersToTemplateInstance(cd.get(),cd->templateArguments(),qdi.currentKey());
75787571
}
75797572
}
75807573
}

0 commit comments

Comments
 (0)