summaryrefslogtreecommitdiffstats
path: root/src/memberdef.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/memberdef.cpp')
-rw-r--r--src/memberdef.cpp514
1 files changed, 296 insertions, 218 deletions
diff --git a/src/memberdef.cpp b/src/memberdef.cpp
index 464dbd0..ca6026e 100644
--- a/src/memberdef.cpp
+++ b/src/memberdef.cpp
@@ -47,7 +47,7 @@
//-----------------------------------------------------------------------------
-class MemberDefImpl : public DefinitionImpl, public MemberDef
+class MemberDefImpl : public DefinitionMixin<MemberDefMutable>
{
public:
MemberDefImpl(const char *defFileName,int defLine,int defColumn,
@@ -76,15 +76,11 @@ class MemberDefImpl : public DefinitionImpl, public MemberDef
virtual int initializerLines() const;
virtual uint64 getMemberSpecifiers() const;
virtual const MemberList *getSectionList(const Definition *) const;
- virtual QCString displayDefinition() const;
+ virtual QCString displayDefinition() const;
virtual const ClassDef *getClassDef() const;
- virtual ClassDef *getClassDef();
virtual const FileDef *getFileDef() const;
- virtual FileDef *getFileDef();
virtual const NamespaceDef* getNamespaceDef() const;
- virtual NamespaceDef* getNamespaceDef();
virtual const GroupDef *getGroupDef() const;
- virtual GroupDef *getGroupDef();
virtual ClassDef *accessorClass() const;
virtual const char *getReadAccessor() const;
virtual const char *getWriteAccessor() const;
@@ -242,7 +238,7 @@ class MemberDefImpl : public DefinitionImpl, public MemberDef
virtual int getDeclColumn() const;
virtual void setMemberType(MemberType t);
virtual void setDefinition(const char *d);
- virtual void setFileDef(FileDef *fd);
+ virtual void setFileDef(const FileDef *fd);
virtual void setAnchor();
virtual void setProtection(Protection p);
virtual void setMemberSpecifiers(uint64 s);
@@ -250,9 +246,9 @@ class MemberDefImpl : public DefinitionImpl, public MemberDef
virtual void setInitializer(const char *i);
virtual void setBitfields(const char *s);
virtual void setMaxInitLines(int lines);
- virtual void setMemberClass(ClassDef *cd);
+ virtual void setMemberClass(const ClassDef *cd);
virtual void setSectionList(const Definition *container,MemberList *sl);
- virtual void setGroupDef(GroupDef *gd,Grouping::GroupPri_t pri,
+ virtual void setGroupDef(const GroupDef *gd,Grouping::GroupPri_t pri,
const QCString &fileName,int startLine,bool hasDocs,
MemberDef *member=0);
virtual void setReadAccessor(const char *r);
@@ -281,7 +277,7 @@ class MemberDefImpl : public DefinitionImpl, public MemberDef
virtual void setTypeConstraints(const ArgumentList &al);
virtual void setType(const char *t);
virtual void setAccessorType(ClassDef *cd,const char *t);
- virtual void setNamespace(NamespaceDef *nd);
+ virtual void setNamespace(const NamespaceDef *nd);
virtual void setMemberGroup(MemberGroup *grp);
virtual void setMemberGroupId(int id);
virtual void makeImplementationDetail();
@@ -323,13 +319,14 @@ class MemberDefImpl : public DefinitionImpl, public MemberDef
virtual void warnIfUndocumented() const;
virtual void warnIfUndocumentedParams() const;
virtual void detectUndocumentedParams(bool hasParamCommand,bool hasReturnCommand) const;
- virtual MemberDef *createTemplateInstanceMember(const ArgumentList &formalArgs,
+ virtual MemberDefMutable *createTemplateInstanceMember(const ArgumentList &formalArgs,
const std::unique_ptr<ArgumentList> &actualArgs) const;
virtual void findSectionsInDocumentation();
virtual void writeLink(OutputList &ol,
const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,
bool onlyText=FALSE) const;
virtual void addToSearchIndex() const;
+ virtual void resolveUnnamedParameters(const MemberDef *md);
private:
void _computeLinkableInProject();
@@ -360,10 +357,10 @@ class MemberDefImpl : public DefinitionImpl, public MemberDef
IMPL *m_impl;
uchar m_isLinkableCached; // 0 = not cached, 1=FALSE, 2=TRUE
uchar m_isConstructorCached; // 0 = not cached, 1=FALSE, 2=TRUE
- uchar m_isDestructorCached; // 0 = not cached, 1=FALSE, 2=TRUE
+ uchar m_isDestructorCached; // 1 = not cached, 1=FALSE, 2=TRUE
};
-MemberDef *createMemberDef(const char *defFileName,int defLine,int defColumn,
+MemberDefMutable *createMemberDef(const char *defFileName,int defLine,int defColumn,
const char *type,const char *name,const char *args,
const char *excp,Protection prot,Specifier virt,bool stat,
Relationship related,MemberType t,const ArgumentList &tal,
@@ -375,15 +372,15 @@ MemberDef *createMemberDef(const char *defFileName,int defLine,int defColumn,
//-----------------------------------------------------------------------------
-class MemberDefAliasImpl : public DefinitionAliasImpl, public MemberDef
+class MemberDefAliasImpl : public DefinitionAliasMixin<MemberDef>
{
public:
MemberDefAliasImpl(const Definition *newScope,const MemberDef *md)
- : DefinitionAliasImpl(newScope,md), m_memberGroup(0) {}
- virtual ~MemberDefAliasImpl() {}
+ : DefinitionAliasMixin(newScope,md), m_memberGroup(0) { init(); }
+ virtual ~MemberDefAliasImpl() { deinit(); }
virtual DefType definitionType() const { return TypeMember; }
- const MemberDef *getMdAlias() const { return dynamic_cast<const MemberDef*>(getAlias()); }
+ const MemberDef *getMdAlias() const { return toMemberDef(getAlias()); }
virtual MemberDef *resolveAlias() { return const_cast<MemberDef*>(getMdAlias()); }
virtual const MemberDef *resolveAlias() const { return getMdAlias(); }
@@ -392,6 +389,8 @@ class MemberDefAliasImpl : public DefinitionAliasImpl, public MemberDef
}
virtual void moveTo(Definition *) {}
+ virtual QCString name() const
+ { return getMdAlias()->name(); }
virtual QCString getOutputFileBase() const
{ return getMdAlias()->getOutputFileBase(); }
virtual QCString getReference() const
@@ -428,7 +427,7 @@ class MemberDefAliasImpl : public DefinitionAliasImpl, public MemberDef
{ return getMdAlias()->getFileDef(); }
virtual const NamespaceDef* getNamespaceDef() const
{ return getMdAlias()->getNamespaceDef(); }
- virtual ClassDef *accessorClass() const
+ virtual const ClassDef *accessorClass() const
{ return getMdAlias()->accessorClass(); }
virtual const char *getReadAccessor() const
{ return getMdAlias()->getReadAccessor(); }
@@ -737,95 +736,13 @@ class MemberDefAliasImpl : public DefinitionAliasImpl, public MemberDef
virtual int getDeclColumn() const
{ return getMdAlias()->getDeclColumn(); }
- // non-const getters should not be called
- virtual ClassDef *getClassDef()
- { err("non-const getClassDef() called on aliased member. Please report as a bug.\n"); return 0; }
- virtual FileDef *getFileDef()
- { err("non-const getFileDef() called on aliased member. Please report as a bug.\n"); return 0; }
- virtual NamespaceDef* getNamespaceDef()
- { err("non-const getNamespaceDef() called on aliased member. Please report as a bug.\n"); return 0; }
- virtual GroupDef *getGroupDef()
- { err("non-const getGroupDef() called on aliased member. Please report as a bug.\n"); return 0; }
- virtual ArgumentList &argumentList()
- { err("non-const argumentList() called on aliased member. Please report as bug.\n");
- static ArgumentList dummy; return dummy;
- }
-
- virtual void setEnumBaseType(const QCString &type) {}
- virtual void setMemberType(MemberType t) {}
- virtual void setDefinition(const char *d) {}
- virtual void setFileDef(FileDef *fd) {}
- virtual void setAnchor() {}
- virtual void setProtection(Protection p) {}
- virtual void setMemberSpecifiers(uint64 s) {}
- virtual void mergeMemberSpecifiers(uint64 s) {}
- virtual void setInitializer(const char *i) {}
- virtual void setBitfields(const char *s) {}
- virtual void setMaxInitLines(int lines) {}
- virtual void setMemberClass(ClassDef *cd) {}
- virtual void setSectionList(const Definition *c,MemberList *sl) {}
- virtual void setGroupDef(GroupDef *gd,Grouping::GroupPri_t pri,
- const QCString &fileName,int startLine,bool hasDocs,
- MemberDef *member=0) {}
- virtual void setReadAccessor(const char *r) {}
- virtual void setWriteAccessor(const char *w) {}
- virtual void setTemplateSpecialization(bool b) {}
- virtual void makeRelated() {}
- virtual void makeForeign() {}
- virtual void setInheritsDocsFrom(MemberDef *md) {}
- virtual void setTagInfo(const TagInfo *i) {}
- virtual void setArgsString(const char *as) {}
- virtual void setReimplements(MemberDef *md) {}
- virtual void insertReimplementedBy(MemberDef *md) {}
- virtual void setRelatedAlso(ClassDef *cd) {}
- virtual void insertEnumField(MemberDef *md) {}
- virtual void setEnumScope(MemberDef *md,bool livesInsideEnum=FALSE) {}
- virtual void setEnumClassScope(ClassDef *cd) {}
- virtual void setDocumentedEnumValues(bool value) {}
- virtual void setAnonymousEnumType(const MemberDef *md) {}
- virtual bool addExample(const char *anchor,const char *name,const char *file) { return FALSE; }
- virtual void setPrototype(bool p,const QCString &df,int line, int column) {}
- virtual void setExplicitExternal(bool b,const QCString &df,int line,int column) {}
- virtual void setDeclFile(const QCString &df,int line,int column) {}
- virtual void moveArgumentList(std::unique_ptr<ArgumentList> al) {}
- virtual void moveDeclArgumentList(std::unique_ptr<ArgumentList> al) {}
- virtual void setDefinitionTemplateParameterLists(const ArgumentLists &lists) {}
- virtual void setTypeConstraints(const ArgumentList &al) {}
- virtual void setType(const char *t) {}
- virtual void setAccessorType(ClassDef *cd,const char *t) {}
- virtual void setNamespace(NamespaceDef *nd) {}
+ virtual void warnIfUndocumented() const {}
+ virtual void warnIfUndocumentedParams() const {}
+ virtual void detectUndocumentedParams(bool hasParamCommand,bool hasReturnCommand) const {}
virtual void setMemberGroup(MemberGroup *grp) { m_memberGroup = grp; }
- virtual void setMemberGroupId(int id) {}
- virtual void makeImplementationDetail() {}
- virtual void setFromAnonymousScope(bool b) const {}
- virtual void setFromAnonymousMember(MemberDef *m) {}
- virtual void enableCallGraph(bool e) {}
- virtual void enableCallerGraph(bool e) {}
- virtual void enableReferencedByRelation(bool e) {}
- virtual void enableReferencesRelation(bool e) {}
- virtual void setTemplateMaster(MemberDef *mt) {}
- virtual void addListReference(Definition *d) {}
- virtual void setDocsForDefinition(bool b) {}
- virtual void setGroupAlias(const MemberDef *md) {}
- virtual void cacheTypedefVal(const ClassDef *val,const QCString &templSpec,const QCString &resolvedType) {}
- virtual void invalidateTypedefValCache() {}
- virtual void invalidateCachedArgumentTypes() {}
- virtual void setMemberDefinition(MemberDef *md) {}
- virtual void setMemberDeclaration(MemberDef *md) {}
- virtual void setAnonymousUsed() const {}
- virtual void copyArgumentNames(MemberDef *bmd) {}
- virtual void setCategory(ClassDef *) {}
- virtual void setCategoryRelation(MemberDef *) {}
- virtual void setDocumentation(const char *d,const char *docFile,int docLine,bool stripWhiteSpace=TRUE) {}
- virtual void setBriefDescription(const char *b,const char *briefFile,int briefLine) {}
- virtual void setInbodyDocumentation(const char *d,const char *inbodyFile,int inbodyLine) {}
- virtual void setHidden(bool b) {}
- virtual void addToSearchIndex() const {}
- virtual void findSectionsInDocumentation() {}
- virtual MemberDef *createTemplateInstanceMember(const ArgumentList &formalArgs,
+ virtual MemberDefMutable *createTemplateInstanceMember(const ArgumentList &formalArgs,
const std::unique_ptr<ArgumentList> &actualArgs) const
{ return getMdAlias()->createTemplateInstanceMember(formalArgs,actualArgs); }
- virtual void incrementFlowKeyWordCount() {}
virtual void writeDeclaration(OutputList &ol,
const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,
@@ -838,18 +755,6 @@ class MemberDefAliasImpl : public DefinitionAliasImpl, public MemberDef
{
getMdAlias()->writeEnumDeclaration(typeDecl,cd,nd,fd,gd);
}
- virtual void writeDocumentation(const MemberList *ml,int memCount,int memTotal,OutputList &ol,
- const char *scopeName,const Definition *container,
- bool inGroup,bool showEnumValues=FALSE,bool
- showInline=FALSE) const {}
- virtual void writeMemberDocSimple(OutputList &ol,const Definition *container) const {}
- virtual void writeLink(OutputList &ol,
- const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,
- bool onlyText=FALSE) const {}
- virtual void writeTagFile(FTextStream &) const {}
- virtual void warnIfUndocumented() const {}
- virtual void warnIfUndocumentedParams() const {}
- virtual void detectUndocumentedParams(bool hasParamCommand,bool hasReturnCommand) const {}
private:
MemberGroup *m_memberGroup; // group's member definition
};
@@ -857,7 +762,9 @@ class MemberDefAliasImpl : public DefinitionAliasImpl, public MemberDef
MemberDef *createMemberDefAlias(const Definition *newScope,const MemberDef *aliasMd)
{
- return new MemberDefAliasImpl(newScope,aliasMd);
+ MemberDef *amd = new MemberDefAliasImpl(newScope,aliasMd);
+ //printf("amd: name=%s displayName=%s\n",amd->name().data(),amd->displayName().data());
+ return amd;
}
//-----------------------------------------------------------------------------
@@ -985,7 +892,7 @@ static bool writeDefArgumentList(OutputList &ol,const Definition *scope,const Me
}
else if (scope->definitionType()==Definition::TypeClass)
{
- cName=tempArgListToString((dynamic_cast<const ClassDef*>(scope))->templateArguments(),
+ cName=tempArgListToString((toClassDef(scope))->templateArguments(),
scope->getLanguage());
//printf("2. cName=%s\n",cName.data());
}
@@ -1275,9 +1182,9 @@ class MemberDefImpl::IMPL
const ArgumentList &al,const char *meta
);
- ClassDef *classDef = 0; // member of or related to
- FileDef *fileDef = 0; // member of file definition
- NamespaceDef *nspace = 0; // the namespace this member is in.
+ const ClassDef *classDef = 0; // member of or related to
+ const FileDef *fileDef = 0; // member of file definition
+ const NamespaceDef *nspace = 0; // the namespace this member is in.
MemberDef *enumScope = 0; // the enclosing scope, if this is an enum field
bool livesInsideEnum = false;
@@ -1338,7 +1245,7 @@ class MemberDefImpl::IMPL
const MemberDef *groupAlias = 0; // Member containing the definition
int grpId = 0; // group id
MemberGroup *memberGroup = 0; // group's member definition
- GroupDef *group = 0; // group in which this member is in
+ const GroupDef *group = 0; // group in which this member is in
Grouping::GroupPri_t grouppri; // priority of this definition
QCString groupFileName; // file where this grouping was defined
int groupStartLine = 0; // line " " " " "
@@ -1529,7 +1436,7 @@ MemberDefImpl::MemberDefImpl(const char *df,int dl,int dc,
const char *t,const char *na,const char *a,const char *e,
Protection p,Specifier v,bool s,Relationship r,MemberType mt,
const ArgumentList &tal,const ArgumentList &al,const char *meta
- ) : DefinitionImpl(df,dl,dc,removeRedundantWhiteSpace(na))
+ ) : DefinitionMixin(df,dl,dc,removeRedundantWhiteSpace(na))
{
//printf("MemberDefImpl::MemberDef(%s)\n",na);
m_impl = new MemberDefImpl::IMPL;
@@ -1539,7 +1446,7 @@ MemberDefImpl::MemberDefImpl(const char *df,int dl,int dc,
m_isDestructorCached = 0;
}
-MemberDefImpl::MemberDefImpl(const MemberDefImpl &md) : DefinitionImpl(md)
+MemberDefImpl::MemberDefImpl(const MemberDefImpl &md) : DefinitionMixin(md)
{
m_impl = new MemberDefImpl::IMPL;
m_isLinkableCached = 0;
@@ -1609,15 +1516,15 @@ void MemberDefImpl::moveTo(Definition *scope)
setOuterScope(scope);
if (scope->definitionType()==Definition::TypeClass)
{
- m_impl->classDef = dynamic_cast<ClassDef*>(scope);
+ m_impl->classDef = toClassDef(scope);
}
else if (scope->definitionType()==Definition::TypeFile)
{
- m_impl->fileDef = dynamic_cast<FileDef*>(scope);
+ m_impl->fileDef = toFileDef(scope);
}
else if (scope->definitionType()==Definition::TypeNamespace)
{
- m_impl->nspace = dynamic_cast<NamespaceDef*>(scope);
+ m_impl->nspace = toNamespaceDef(scope);
}
m_isLinkableCached = 0;
m_isConstructorCached = 0;
@@ -1641,7 +1548,11 @@ void MemberDefImpl::insertReimplementedBy(MemberDef *md)
{
if (m_impl->templateMaster)
{
- m_impl->templateMaster->insertReimplementedBy(md);
+ MemberDefMutable *mdm = toMemberDefMutable(m_impl->templateMaster);
+ if (mdm)
+ {
+ mdm->insertReimplementedBy(md);
+ }
}
if (m_impl->redefinedBy==0) m_impl->redefinedBy = new MemberList(MemberListType_redefinedBy);
if (m_impl->redefinedBy->findRef(md)==-1)
@@ -1779,7 +1690,7 @@ QCString MemberDefImpl::getOutputFileBase() const
QCString MemberDefImpl::getReference() const
{
- QCString ref = DefinitionImpl::getReference();
+ QCString ref = DefinitionMixin::getReference();
if (!ref.isEmpty())
{
return ref;
@@ -1914,25 +1825,25 @@ void MemberDefImpl::_computeLinkableInProject()
void MemberDefImpl::setDocumentation(const char *d,const char *docFile,int docLine,bool stripWhiteSpace)
{
- DefinitionImpl::setDocumentation(d,docFile,docLine,stripWhiteSpace);
+ DefinitionMixin::setDocumentation(d,docFile,docLine,stripWhiteSpace);
m_isLinkableCached = 0;
}
void MemberDefImpl::setBriefDescription(const char *b,const char *briefFile,int briefLine)
{
- DefinitionImpl::setBriefDescription(b,briefFile,briefLine);
+ DefinitionMixin::setBriefDescription(b,briefFile,briefLine);
m_isLinkableCached = 0;
}
void MemberDefImpl::setInbodyDocumentation(const char *d,const char *inbodyFile,int inbodyLine)
{
- DefinitionImpl::setInbodyDocumentation(d,inbodyFile,inbodyLine);
+ DefinitionMixin::setInbodyDocumentation(d,inbodyFile,inbodyLine);
m_isLinkableCached = 0;
}
void MemberDefImpl::setHidden(bool b)
{
- DefinitionImpl::setHidden(b);
+ DefinitionMixin::setHidden(b);
m_isLinkableCached = 0;
}
@@ -1977,10 +1888,10 @@ void MemberDefImpl::writeLink(OutputList &ol,
const NamespaceDef *nspace = getNamespaceDef();
if (!hideScopeNames)
{
- if (m_impl->enumScope && m_impl->livesInsideEnum)
- {
- n.prepend(m_impl->enumScope->displayName()+sep);
- }
+ //if (m_impl->enumScope && m_impl->livesInsideEnum)
+ //{
+ // n.prepend(m_impl->enumScope->displayName()+sep);
+ //}
if (classDef && gd && !isRelated())
{
n.prepend(classDef->displayName()+sep);
@@ -2227,7 +2138,7 @@ void MemberDefImpl::writeDeclaration(OutputList &ol,
QCString cfname = getOutputFileBase();
// search for the last anonymous scope in the member type
- ClassDef *annoClassDef=getClassDefOfAnonymousType();
+ ClassDefMutable *annoClassDef=toClassDefMutable(getClassDefOfAnonymousType());
ol.startMemberDeclaration();
@@ -2405,6 +2316,7 @@ void MemberDefImpl::writeDeclaration(OutputList &ol,
static bool extractPrivate = Config_getBool(EXTRACT_PRIVATE);
static bool extractPrivateVirtual = Config_getBool(EXTRACT_PRIV_VIRTUAL);
static bool extractStatic = Config_getBool(EXTRACT_STATIC);
+ MemberDefMutable *annMemb = toMemberDefMutable(m_impl->annMemb);
//printf("Member name=`%s gd=%p md->groupDef=%p inGroup=%d isLinkable()=%d hasDocumentation=%d\n",name().data(),gd,getGroupDef(),inGroup,isLinkable(),hasDocumentation());
if (!name().isEmpty() && // name valid
(hasDocumentation() || isReference()) && // has docs
@@ -2412,16 +2324,15 @@ void MemberDefImpl::writeDeclaration(OutputList &ol,
!(isStatic() && getClassDef()==0 && !extractStatic) // hidden due to static-ness
)
{
- if (m_impl->annMemb)
+ if (annMemb)
{
//printf("anchor=%s ann_anchor=%s\n",anchor(),annMemb->anchor());
- m_impl->annMemb->writeLink(ol,
- m_impl->annMemb->getClassDef(),
- m_impl->annMemb->getNamespaceDef(),
- m_impl->annMemb->getFileDef(),
- m_impl->annMemb->getGroupDef()
- );
- m_impl->annMemb->setAnonymousUsed();
+ annMemb->writeLink(ol,
+ annMemb->getClassDef(),
+ annMemb->getNamespaceDef(),
+ annMemb->getFileDef(),
+ annMemb->getGroupDef());
+ annMemb->setAnonymousUsed();
setAnonymousUsed();
}
else
@@ -2442,9 +2353,9 @@ void MemberDefImpl::writeDeclaration(OutputList &ol,
// there is a brief member description and brief member
// descriptions are enabled or there is no detailed description.
{
- if (m_impl->annMemb)
+ if (annMemb)
{
- m_impl->annMemb->setAnonymousUsed();
+ annMemb->setAnonymousUsed();
setAnonymousUsed();
}
const ClassDef *rcd = cd;
@@ -3335,7 +3246,7 @@ void MemberDefImpl::writeDocumentation(const MemberList *ml,
if (getClassDef()) { scopeName=getClassDef()->displayName(); scopedContainer=getClassDef(); }
else if (getNamespaceDef()) { scopeName=getNamespaceDef()->displayName(); scopedContainer=getNamespaceDef(); }
else if (getFileDef()) { scopeName=getFileDef()->displayName(); scopedContainer=getFileDef(); }
- ciname = (dynamic_cast<const GroupDef *>(container))->groupTitle();
+ ciname = (toGroupDef(container))->groupTitle();
}
else if (container->definitionType()==TypeFile && getNamespaceDef() && getNamespaceDef()->isLinkable())
{ // member is in a namespace, but is written as part of the file documentation
@@ -3433,7 +3344,7 @@ void MemberDefImpl::writeDocumentation(const MemberList *ml,
{
//printf("Anonymous compound '%s'\n",cname.data());
ol.startDoxyAnchor(cfname,cname,memAnchor,doxyName,doxyArgs);
- ol.startMemberDoc(ciname,name(),memAnchor,name(),memCount,memTotal,showInline);
+ ol.startMemberDoc(ciname,name(),memAnchor,"",memCount,memTotal,showInline);
// search for the last anonymous compound name in the definition
int si=ldef.find(' '),pi,ei=i+l;
if (si==-1) si=0;
@@ -3681,12 +3592,12 @@ void MemberDefImpl::writeDocumentation(const MemberList *ml,
else
ol.parseText(theTranslator->trInitialValue());
ol.endBold();
- CodeParserInterface &intf = Doxygen::parserManager->getCodeParser(getDefFileExtension());
- intf.resetCodeParserState();
- ol.startCodeFragment();
- intf.parseCode(ol,scopeName,m_impl->initializer,lang,FALSE,0,const_cast<FileDef*>(getFileDef()),
+ auto intf = Doxygen::parserManager->getCodeParser(getDefFileExtension());
+ intf->resetCodeParserState();
+ ol.startCodeFragment("DoxyCode");
+ intf->parseCode(ol,scopeName,m_impl->initializer,lang,FALSE,0,const_cast<FileDef*>(getFileDef()),
-1,-1,TRUE,this,FALSE,this);
- ol.endCodeFragment();
+ ol.endCodeFragment("DoxyCode");
}
QCString brief = briefDescription();
@@ -3904,7 +3815,7 @@ void MemberDefImpl::writeMemberDocSimple(OutputList &ol, const Definition *conta
//printf("===> %s::anonymous: %s\n",name().data(),cd?cd->name().data():"<none>");
if (container && container->definitionType()==Definition::TypeClass &&
- !(dynamic_cast<const ClassDef*>(container))->isJavaEnum())
+ !(toClassDef(container))->isJavaEnum())
{
ol.startInlineMemberType();
ol.startDoxyAnchor(cfname,cname,memAnchor,doxyName,doxyArgs);
@@ -4050,6 +3961,18 @@ void MemberDefImpl::warnIfUndocumented() const
warnIfUndocumentedParams();
}
}
+static QCString stripTrailingReturn(const QCString trailRet)
+{
+ QCString ret = trailRet;
+
+ ret = ret.stripWhiteSpace();
+ if (ret.startsWith("->"))
+ {
+ ret = ret.mid(2).stripWhiteSpace();
+ return ret;
+ }
+ return trailRet;
+}
void MemberDefImpl::detectUndocumentedParams(bool hasParamCommand,bool hasReturnCommand) const
{
@@ -4058,7 +3981,17 @@ void MemberDefImpl::detectUndocumentedParams(bool hasParamCommand,bool hasReturn
bool isPython = getLanguage()==SrcLangExt_Python;
bool isFortran = getLanguage()==SrcLangExt_Fortran;
bool isFortranSubroutine = isFortran && returnType.find("subroutine")!=-1;
+
bool isVoidReturn = (returnType=="void") || (returnType.right(5)==" void");
+ if (!isVoidReturn && returnType == "auto")
+ {
+ const ArgumentList &defArgList=isDocsForDefinition() ? argumentList() : declArgumentList();
+ if (!defArgList.trailingReturnType().isEmpty())
+ {
+ QCString strippedTrailingReturn = stripTrailingReturn(defArgList.trailingReturnType());
+ isVoidReturn = (strippedTrailingReturn=="void") || (strippedTrailingReturn.right(5)==" void");
+ }
+ }
if (!m_impl->hasDocumentedParams && hasParamCommand)
{
@@ -4186,7 +4119,7 @@ bool MemberDefImpl::isDeleted() const
bool MemberDefImpl::hasDocumentation() const
{
- return DefinitionImpl::hasDocumentation() ||
+ return DefinitionMixin::hasDocumentation() ||
(m_impl->mtype==MemberType_Enumeration && m_impl->docEnumValues) || // has enum values
(m_impl->defArgList.hasDocumentation()); // has doc arguments
}
@@ -4194,7 +4127,7 @@ bool MemberDefImpl::hasDocumentation() const
#if 0
bool MemberDefImpl::hasUserDocumentation() const
{
- bool hasDocs = DefinitionImpl::hasUserDocumentation();
+ bool hasDocs = DefinitionMixin::hasUserDocumentation();
return hasDocs;
}
#endif
@@ -4272,7 +4205,7 @@ void MemberDefImpl::setAnchor()
m_impl->anc = "a"+sigStr;
}
-void MemberDefImpl::setGroupDef(GroupDef *gd,Grouping::GroupPri_t pri,
+void MemberDefImpl::setGroupDef(const GroupDef *gd,Grouping::GroupPri_t pri,
const QCString &fileName,int startLine,
bool hasDocs,MemberDef *member)
{
@@ -4292,38 +4225,36 @@ void MemberDefImpl::setEnumScope(MemberDef *md,bool livesInsideEnum)
m_impl->livesInsideEnum=livesInsideEnum;
if (md->getGroupDef())
{
- m_impl->group=md->getGroupDef();
- m_impl->grouppri=md->getGroupPri();
- m_impl->groupFileName=md->getGroupFileName();
- m_impl->groupStartLine=md->getGroupStartLine();
- m_impl->groupHasDocs=md->getGroupHasDocs();
+ m_impl->group = const_cast<GroupDef*>(md->getGroupDef());
+ m_impl->grouppri = md->getGroupPri();
+ m_impl->groupFileName = md->getGroupFileName();
+ m_impl->groupStartLine = md->getGroupStartLine();
+ m_impl->groupHasDocs = md->getGroupHasDocs();
m_isLinkableCached = 0;
}
}
-void MemberDefImpl::setMemberClass(ClassDef *cd)
+void MemberDefImpl::setMemberClass(const ClassDef *cd)
{
m_impl->classDef=cd;
m_isLinkableCached = 0;
m_isConstructorCached = 0;
- setOuterScope(cd);
+ setOuterScope(const_cast<ClassDef*>(cd));
}
-void MemberDefImpl::setNamespace(NamespaceDef *nd)
+void MemberDefImpl::setNamespace(const NamespaceDef *nd)
{
m_impl->nspace=nd;
- setOuterScope(nd);
+ setOuterScope(const_cast<NamespaceDef*>(nd));
}
-MemberDef *MemberDefImpl::createTemplateInstanceMember(
+MemberDefMutable *MemberDefImpl::createTemplateInstanceMember(
const ArgumentList &formalArgs,const std::unique_ptr<ArgumentList> &actualArgs) const
{
//printf(" Member %s %s %s\n",typeString(),name().data(),argsString());
- std::unique_ptr<ArgumentList> actualArgList;
+ std::unique_ptr<ArgumentList> actualArgList = std::make_unique<ArgumentList>(m_impl->defArgList);
if (!m_impl->defArgList.empty())
{
- actualArgList = std::make_unique<ArgumentList>(m_impl->defArgList);
-
// replace formal arguments with actuals
for (Argument &arg : *actualArgList)
{
@@ -4332,10 +4263,6 @@ MemberDef *MemberDefImpl::createTemplateInstanceMember(
actualArgList->setTrailingReturnType(
substituteTemplateArgumentsInString(actualArgList->trailingReturnType(),formalArgs,actualArgs));
}
- else
- {
- actualArgList = std::make_unique<ArgumentList>();
- }
QCString methodName=name();
if (methodName.left(9)=="operator ") // conversion operator
@@ -4343,7 +4270,7 @@ MemberDef *MemberDefImpl::createTemplateInstanceMember(
methodName=substituteTemplateArgumentsInString(methodName,formalArgs,actualArgs);
}
- MemberDef *imd = createMemberDef(
+ MemberDefMutable *imd = createMemberDef(
getDefFileName(),getDefLine(),getDefColumn(),
substituteTemplateArgumentsInString(m_impl->type,formalArgs,actualArgs),
methodName,
@@ -4417,7 +4344,7 @@ void MemberDefImpl::addListReference(Definition *)
QCString memName = name();
Definition *pd=getOuterScope();
QCString pdName = pd->definitionType()==Definition::TypeClass ?
- (dynamic_cast<ClassDef*>(pd))->displayName() : pd->name();
+ (toClassDef(pd))->displayName() : pd->name();
QCString sep = getLanguageSpecificSeparator(lang,TRUE);
QCString memArgs;
if (!isRelated()
@@ -4712,12 +4639,17 @@ void MemberDefImpl::writeEnumDeclaration(OutputList &typeDecl,
if (fmdl)
{
MemberListIterator mli(*fmdl);
- MemberDef *fmd=mli.current();
+ MemberDefMutable *fmd=toMemberDefMutable(mli.current());
bool fmdVisible = fmd ? fmd->isBriefSectionVisible() : TRUE;
+ bool first=true;
while (fmd)
{
if (fmdVisible)
{
+ if (!first)
+ {
+ typeDecl.writeString(", ");
+ }
/* in html we start a new line after a number of items */
if (numVisibleEnumValues>enumValuesPerLine
&& (enumMemCount%enumValuesPerLine)==0
@@ -4752,15 +4684,12 @@ void MemberDefImpl::writeEnumDeclaration(OutputList &typeDecl,
typeDecl.writeString(" ");
typeDecl.parseText(fmd->initializer());
}
+ first=false;
}
bool prevVisible = fmdVisible;
++mli;
- fmd=mli.current();
- if (fmd && (fmdVisible=fmd->isBriefSectionVisible()))
- {
- typeDecl.writeString(", ");
- }
+ fmd=toMemberDefMutable(mli.current());
if (prevVisible)
{
typeDecl.disable(OutputGenerator::Man);
@@ -4814,6 +4743,7 @@ ClassDef *MemberDefImpl::accessorClass() const
void MemberDefImpl::findSectionsInDocumentation()
{
+ docFindSections(briefDescription(),this,docFile());
docFindSections(documentation(),this,docFile());
}
@@ -4894,7 +4824,7 @@ QCString MemberDefImpl::qualifiedName() const
}
else
{
- return DefinitionImpl::qualifiedName();
+ return DefinitionMixin::qualifiedName();
}
}
@@ -4981,31 +4911,16 @@ const ClassDef *MemberDefImpl::getClassDef() const
return m_impl->classDef;
}
-ClassDef *MemberDefImpl::getClassDef()
-{
- return m_impl->classDef;
-}
-
const FileDef *MemberDefImpl::getFileDef() const
{
return m_impl->fileDef;
}
-FileDef *MemberDefImpl::getFileDef()
-{
- return m_impl->fileDef;
-}
-
const NamespaceDef* MemberDefImpl::getNamespaceDef() const
{
return m_impl->nspace;
}
-NamespaceDef* MemberDefImpl::getNamespaceDef()
-{
- return m_impl->nspace;
-}
-
const char *MemberDefImpl::getReadAccessor() const
{
return m_impl->read;
@@ -5021,11 +4936,6 @@ const GroupDef *MemberDefImpl::getGroupDef() const
return m_impl->group;
}
-GroupDef *MemberDefImpl::getGroupDef()
-{
- return m_impl->group;
-}
-
Grouping::GroupPri_t MemberDefImpl::getGroupPri() const
{
return m_impl->grouppri;
@@ -5463,6 +5373,54 @@ const ArgumentList &MemberDefImpl::declArgumentList() const
return m_impl->declArgList;
}
+void MemberDefImpl::resolveUnnamedParameters(const MemberDef *md)
+{
+ ArgumentList &decAl = m_impl->declArgList;
+ ArgumentList &defAl = m_impl->defArgList;
+ const ArgumentList &decAlSrc = md->declArgumentList();
+ const ArgumentList &defAlSrc = md->argumentList();
+ auto decSrc = decAlSrc.begin(), defSrc = defAlSrc.begin();
+ for (auto decIt = decAl.begin(), defIt = defAl.begin();
+ decIt != decAl.end() && defIt != defAl.end() && decSrc != decAlSrc.end() && defSrc != defAlSrc.end();
+ ++decIt, ++defIt, ++decSrc, ++defSrc++)
+ {
+ Argument &decA = *decIt;
+ Argument &defA = *defIt;
+ const Argument &decAS = *decSrc;
+ const Argument &defAS = *defSrc;
+ if (decA.name.isEmpty())
+ {
+ if (!defA.name.isEmpty())
+ {
+ decA.name = defA.name;
+ }
+ else if (!decAS.name.isEmpty())
+ {
+ decA.name = decAS.name;
+ }
+ else if (!defAS.name.isEmpty())
+ {
+ decA.name = defAS.name;
+ }
+ }
+ if (defA.name.isEmpty())
+ {
+ if (!decA.name.isEmpty())
+ {
+ defA.name = decA.name;
+ }
+ else if (!decAS.name.isEmpty())
+ {
+ defA.name = decAS.name;
+ }
+ else if (!defAS.name.isEmpty())
+ {
+ defA.name = defAS.name;
+ }
+ }
+ }
+}
+
const ArgumentList &MemberDefImpl::templateArguments() const
{
return m_impl->tArgList;
@@ -5593,7 +5551,7 @@ void MemberDefImpl::setDefinition(const char *d)
m_impl->def=d;
}
-void MemberDefImpl::setFileDef(FileDef *fd)
+void MemberDefImpl::setFileDef(const FileDef *fd)
{
m_impl->fileDef=fd;
m_isLinkableCached = 0;
@@ -5883,7 +5841,7 @@ int MemberDefImpl::numberOfFlowKeyWords() const
QCString MemberDefImpl::displayName(bool) const
{
- return DefinitionImpl::name();
+ return DefinitionMixin::name();
}
void MemberDefImpl::addToSearchIndex() const
@@ -5929,10 +5887,21 @@ static void transferArgumentDocumentation(ArgumentList &decAl,ArgumentList &defA
{
defA.docs = decA.docs;
}
+ if (Config_getBool(RESOLVE_UNNAMED_PARAMS))
+ {
+ if (decA.name.isEmpty() && !defA.name.isEmpty())
+ {
+ decA.name = defA.name;
+ }
+ else if (defA.name.isEmpty() && !decA.name.isEmpty())
+ {
+ defA.name = decA.name;
+ }
+ }
}
}
-void combineDeclarationAndDefinition(MemberDef *mdec,MemberDef *mdef)
+void combineDeclarationAndDefinition(MemberDefMutable *mdec,MemberDefMutable *mdef)
{
//printf("mdec=%s isPrototype()=%d\n",mdec->name().data(),mdec->isPrototype());
if (
@@ -5944,12 +5913,10 @@ void combineDeclarationAndDefinition(MemberDef *mdec,MemberDef *mdef)
// mdef, mdef ? mdef->name().data() : "",
// mdec, mdec ? mdec->name().data() : "");
- const MemberDef *cmdec = const_cast<const MemberDef*>(mdec);
- const MemberDef *cmdef = const_cast<const MemberDef*>(mdef);
- ArgumentList &mdefAl = mdef->argumentList();
- ArgumentList &mdecAl = mdec->argumentList();
- if (matchArguments2(cmdef->getOuterScope(),cmdef->getFileDef(),&mdefAl,
- cmdec->getOuterScope(),cmdec->getFileDef(),&mdecAl,
+ ArgumentList &mdefAl = const_cast<ArgumentList&>(mdef->argumentList());
+ ArgumentList &mdecAl = const_cast<ArgumentList&>(mdec->argumentList());
+ if (matchArguments2(mdef->getOuterScope(),mdef->getFileDef(),&mdefAl,
+ mdec->getOuterScope(),mdec->getFileDef(),&mdecAl,
TRUE
)
) /* match found */
@@ -5960,6 +5927,11 @@ void combineDeclarationAndDefinition(MemberDef *mdec,MemberDef *mdef)
// mdec->getFileDef()->name().data(),mdec->documentation().data()
// );
+ if (Config_getBool(RESOLVE_UNNAMED_PARAMS))
+ {
+ mdec->resolveUnnamedParameters(mdef);
+ }
+
// first merge argument documentation
transferArgumentDocumentation(mdecAl,mdefAl);
@@ -6021,7 +5993,6 @@ void combineDeclarationAndDefinition(MemberDef *mdec,MemberDef *mdef)
mdec->mergeMemberSpecifiers(mdef->getMemberSpecifiers());
mdef->mergeMemberSpecifiers(mdec->getMemberSpecifiers());
-
// copy group info.
if (mdec->getGroupDef()==0 && mdef->getGroupDef()!=0)
{
@@ -6072,7 +6043,7 @@ QCString MemberDefImpl::briefDescription(bool abbr) const
}
else
{
- return DefinitionImpl::briefDescription(abbr);
+ return DefinitionMixin::briefDescription(abbr);
}
}
@@ -6084,7 +6055,7 @@ QCString MemberDefImpl::documentation() const
}
else
{
- return DefinitionImpl::documentation();
+ return DefinitionMixin::documentation();
}
}
@@ -6128,7 +6099,114 @@ bool MemberDefImpl::isRelatedOrFriend() const
bool MemberDefImpl::isReference() const
{
- return DefinitionImpl::isReference() ||
+ return DefinitionMixin::isReference() ||
(m_impl->templateMaster && m_impl->templateMaster->isReference());
}
+//-------------------------------------------------------------------------------
+// Helpers
+
+void addDocCrossReference(MemberDefMutable *src,MemberDefMutable *dst)
+{
+ if (src==0 || dst==0) return;
+ //printf("--> addDocCrossReference src=%s,dst=%s\n",src->name().data(),dst->name().data());
+ if (dst->isTypedef() || dst->isEnumerate()) return; // don't add types
+ if ((dst->hasReferencedByRelation() || dst->hasCallerGraph()) &&
+ src->showInCallGraph()
+ )
+ {
+ dst->addSourceReferencedBy(src);
+ MemberDefMutable *mdDef = toMemberDefMutable(dst->memberDefinition());
+ if (mdDef)
+ {
+ mdDef->addSourceReferencedBy(src);
+ }
+ MemberDefMutable *mdDecl = toMemberDefMutable(dst->memberDeclaration());
+ if (mdDecl)
+ {
+ mdDecl->addSourceReferencedBy(src);
+ }
+ }
+ if ((src->hasReferencesRelation() || src->hasCallGraph()) &&
+ src->showInCallGraph()
+ )
+ {
+ src->addSourceReferences(dst);
+ MemberDefMutable *mdDef = toMemberDefMutable(src->memberDefinition());
+ if (mdDef)
+ {
+ mdDef->addSourceReferences(dst);
+ }
+ MemberDefMutable *mdDecl = toMemberDefMutable(src->memberDeclaration());
+ if (mdDecl)
+ {
+ mdDecl->addSourceReferences(dst);
+ }
+ }
+}
+
+// --- Cast functions
+//
+MemberDef *toMemberDef(Definition *d)
+{
+ if (d && (typeid(*d)==typeid(MemberDefImpl) || typeid(*d)==typeid(MemberDefAliasImpl)))
+ {
+ return static_cast<MemberDef*>(d);
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+MemberDef *toMemberDef(DefinitionMutable *md)
+{
+ Definition *d = toDefinition(md);
+ if (d && typeid(*d)==typeid(MemberDefImpl))
+ {
+ return static_cast<MemberDef*>(d);
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+const MemberDef *toMemberDef(const Definition *d)
+{
+ if (d && (typeid(*d)==typeid(MemberDefImpl) || typeid(*d)==typeid(MemberDefAliasImpl)))
+ {
+ return static_cast<const MemberDef*>(d);
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+MemberDefMutable *toMemberDefMutable(Definition *d)
+{
+ if (d && typeid(*d)==typeid(MemberDefImpl))
+ {
+ return static_cast<MemberDefMutable*>(d);
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+MemberDefMutable *toMemberDefMutable(const Definition *d)
+{
+ if (d && typeid(*d)==typeid(MemberDefImpl))
+ {
+ return const_cast<MemberDefMutable*>(static_cast<const MemberDefMutable*>(d));
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+
+