Doxygen
Loading...
Searching...
No Matches
memberdef.cpp File Reference
#include "memberdef.h"
#include <memory>
#include <mutex>
#include <optional>
#include "arguments.h"
#include "code.h"
#include "config.h"
#include "defargs.h"
#include "definitionimpl.h"
#include "docparser.h"
#include "dotcallgraph.h"
#include "doxygen.h"
#include "example.h"
#include "filedef.h"
#include "groupdef.h"
#include "language.h"
#include "md5hash.h"
#include "membergroup.h"
#include "memberlist.h"
#include "membername.h"
#include "message.h"
#include "moduledef.h"
#include "namespacedef.h"
#include "outputlist.h"
#include "parserintf.h"
#include "regex.h"
#include "trace.h"
#include "util.h"
#include "vhdldocgen.h"
Include dependency graph for memberdef.cpp:

Go to the source code of this file.

Classes

class  MemberDefImpl
class  MemberDefAliasImpl

Functions

std::unique_ptr< MemberDef > createMemberDef (const DString &defFileName, int defLine, size_t defColumn, const DString &type, const DString &name, const DString &args, const DString &excp, Protection prot, Specifier virt, bool stat, Relationship related, MemberType t, const ArgumentList &tal, const ArgumentList &al, const DString &metaData)
 Factory method to create a new instance of a MemberDef.
std::unique_ptr< MemberDef > createMemberDefAlias (const Definition *newScope, const MemberDef *aliasMd)
static void writePageRef (OutputList &ol, const DString &cn, const DString &mn)
static DString addTemplateNames (const DString &s, const DString &n, const DString &t)
static bool writeDefArgumentList (OutputList &ol, const Definition *scope, const MemberDef *md)
static void writeExceptionListImpl (OutputList &ol, const ClassDef *cd, const MemberDef *md, DString const &exception)
static void writeExceptionList (OutputList &ol, const ClassDef *cd, const MemberDef *md)
static DString combineArgsAndException (DString args, DString exception)
static DString simplifyTypeForTable (const DString &s)
static DString stripTrailingReturn (const DString &trailRet)
static void invalidateCachedTypesInArgumentList (ArgumentList &al)
static void transferArgumentDocumentation (ArgumentList &decAl, ArgumentList &defAl)
static bool hasParamCommand (const DString &doc)
void combineDeclarationAndDefinition (MemberDefMutable *mdec, MemberDefMutable *mdef)
void mergeMemberOverrideOptions (MemberDefMutable *md1, MemberDefMutable *md2)
void addDocCrossReference (const MemberDef *s, const MemberDef *d)
MemberDef * toMemberDef (Definition *d)
MemberDef * toMemberDef (DefinitionMutable *md)
const MemberDef * toMemberDef (const Definition *d)
MemberDefMutable * toMemberDefMutable (Definition *d)

Variables

static std::mutex g_hasDetailedDescriptionMutex
static const reg::Ex reAnonymous (R"([\w:@]*@\d+)")
static std::mutex g_detectUndocumentedParamsMutex
static std::mutex g_docCrossReferenceMutex

Function Documentation

◆ addDocCrossReference()

void addDocCrossReference ( const MemberDef * s,
const MemberDef * d )

Definition at line 6563 of file memberdef.cpp.

6564{
6565 MemberDefMutable *src = toMemberDefMutable(const_cast<MemberDef*>(s));
6566 MemberDefMutable *dst = toMemberDefMutable(const_cast<MemberDef*>(d));
6567 if (src==nullptr || dst==nullptr) return;
6568 //printf("--> addDocCrossReference src=%s,dst=%s\n",qPrint(src->name()),qPrint(dst->name()));
6569 if (dst->isTypedef() || dst->isEnumerate()) return; // don't add types
6570 if ((dst->hasReferencedByRelation() || dst->hasCallerGraph()) &&
6571 src->isCallable()
6572 )
6573 {
6574 DString sourceRefName = src->sourceRefName();
6577
6578 // ---- critical section
6579 std::lock_guard<std::mutex> lock(g_docCrossReferenceMutex);
6580 dst->addSourceReferencedBy(src,sourceRefName);
6581 if (mdDef)
6582 {
6583 mdDef->addSourceReferencedBy(src,sourceRefName);
6584 }
6585 if (mdDecl)
6586 {
6587 mdDecl->addSourceReferencedBy(src,sourceRefName);
6588 }
6589 // ---- end critical section
6590 }
6591 if ((src->hasReferencesRelation() || src->hasCallGraph()) &&
6592 src->isCallable()
6593 )
6594 {
6595 DString sourceRefName = dst->sourceRefName();
6598
6599 // ---- critical section
6600 std::lock_guard<std::mutex> lock(g_docCrossReferenceMutex);
6601 src->addSourceReferences(dst,sourceRefName);
6602 if (mdDef)
6603 {
6604 mdDef->addSourceReferences(dst,sourceRefName);
6605 }
6606 if (mdDecl)
6607 {
6608 mdDecl->addSourceReferences(dst,sourceRefName);
6609 }
6610 // ---- end critical section
6611 }
6612}
A String class for use with Doxygen wrapping std::string and adding some additional functionality off...
Definition dstring.h:84
virtual void addSourceReferences(MemberDef *d, const DString &sourceRefName)=0
virtual void addSourceReferencedBy(MemberDef *d, const DString &sourceRefName)=0
A model of a class/file/namespace member symbol.
Definition memberdef.h:45
virtual MemberDef * memberDefinition() const =0
virtual MemberDef * memberDeclaration() const =0
virtual bool hasReferencesRelation() const =0
virtual bool isTypedef() const =0
virtual bool hasCallGraph() const =0
virtual DString sourceRefName() const =0
virtual bool hasCallerGraph() const =0
virtual bool isEnumerate() const =0
virtual bool hasReferencedByRelation() const =0
virtual bool isCallable() const =0
static std::mutex g_docCrossReferenceMutex
MemberDefMutable * toMemberDefMutable(Definition *d)

References DefinitionMutable::addSourceReferencedBy(), DefinitionMutable::addSourceReferences(), g_docCrossReferenceMutex, MemberDef::hasCallerGraph(), MemberDef::hasCallGraph(), MemberDef::hasReferencedByRelation(), MemberDef::hasReferencesRelation(), MemberDef::isCallable(), MemberDef::isEnumerate(), MemberDef::isTypedef(), MemberDef::memberDeclaration(), MemberDef::memberDefinition(), MemberDef::sourceRefName(), and toMemberDefMutable().

Referenced by findMemberLink(), generateClassMemberLink(), generateClassOrGlobalLink(), generateClassOrGlobalLink(), getLink(), getLinkInScope(), getLinkInScope(), writeObjCMethodCall(), and MemberDefMutable::writeTagFile().

◆ addTemplateNames()

DString addTemplateNames ( const DString & s,
const DString & n,
const DString & t )
static

Definition at line 1008 of file memberdef.cpp.

1009{
1010 DString result;
1011 DString clRealName=n;
1012 size_t p=0,i=0;
1013 if ((i=clRealName.find('<'))!=DString::npos)
1014 {
1015 clRealName=clRealName.left(i); // strip template specialization
1016 }
1017 if ((i=clRealName.rfind("::"))!=DString::npos)
1018 {
1019 clRealName=clRealName.mid(i+2);
1020 }
1021 while ((i=s.find(clRealName,p))!=DString::npos)
1022 {
1023 result+=s.mid(p,i-p);
1024 size_t j=clRealName.length()+i;
1025 if (s.length()==j || (s.at(j)!='<' && !isId(s.at(j))))
1026 { // add template names
1027 //printf("Adding %s+%s\n",qPrint(clRealName),qPrint(t));
1028 result+=clRealName+t;
1029 }
1030 else
1031 { // template names already present
1032 //printf("Adding %s\n",qPrint(clRealName));
1033 result+=clRealName;
1034 }
1035 p=i+clRealName.length();
1036 }
1037 result+=s.mid(p);
1038 //printf("addTemplateNames(%s,%s,%s)=%s\n",qPrint(s),qPrint(n),qPrint(t),qPrint(result));
1039 return result;
1040}
size_t rfind(char c, size_t pos=npos) const
Definition dstring.h:244
DString mid(size_t index, size_t len=npos) const
Definition dstring.h:318
static constexpr size_t npos
value used to indicate 'not found' or 'to the end of the string', matching std::string::npos
Definition dstring.h:178
char & at(size_t i)
Returns a reference to the character at index i.
Definition dstring.h:686
size_t find(char c, size_t pos=0) const
Definition dstring.h:239
DString left(size_t len) const
Definition dstring.h:306
size_t length() const
Returns the length of the string, not counting the 0-terminator.
Definition dstring.h:151
bool isId(char c)
Returns true if c is a valid character for an identifier.
Definition dstring.h:895

References DString::at(), DString::find(), isId(), DString::left(), DString::length(), DString::mid(), DString::npos, and DString::rfind().

Referenced by writeDefArgumentList().

◆ combineArgsAndException()

DString combineArgsAndException ( DString args,
DString exception )
static

Definition at line 2209 of file memberdef.cpp.

2210{
2211 if (exception.empty()) return args; // no exception, nothing to combine args
2212 size_t pos = args.rfind(')');
2213 size_t eqPos = pos!=DString::npos ? args.find('=',pos) : DString::npos; // look for '=' in '(args) = something'
2214 if (eqPos==DString::npos) return args+" "+exception; // append exception at the end
2215 return args.left(eqPos)+" "+exception+" "+args.mid(eqPos); // insert exception before =
2216}
bool empty() const
Returns true iff the string is empty (std::string compatible alias for isEmpty()).
Definition dstring.h:148

References DString::empty(), DString::find(), DString::left(), DString::mid(), DString::npos, and DString::rfind().

Referenced by MemberDefImpl::writeDeclaration().

◆ combineDeclarationAndDefinition()

void combineDeclarationAndDefinition ( MemberDefMutable * mdec,
MemberDefMutable * mdef )

Definition at line 6248 of file memberdef.cpp.

6249{
6250 AUTO_TRACE("mdec='{}' mdef='{}' mdec.isPrototype={} mdef.isPrototype={}",
6251 mdec->name(), mdef->name(), mdec->isPrototype(), mdef->isPrototype());
6252 if (
6253 (!mdef->isDocTransferDone() || !mdec->isDocTransferDone()) &&
6254 (
6255 (mdef->isFunction() && !mdef->isStatic() && !mdef->isPrototype()) ||
6256 (mdef->isVariable() && !mdef->isExternal() && !mdef->isStatic())
6257 )
6258 )
6259 {
6260 bool sameNumTemplateArgs = mdef->templateArguments().size()==mdec->templateArguments().size();
6261
6262 ArgumentList &mdefAl = const_cast<ArgumentList&>(mdef->argumentList());
6263 ArgumentList &mdecAl = const_cast<ArgumentList&>(mdec->argumentList());
6264 if (sameNumTemplateArgs &&
6265 matchArguments2(mdef->getOuterScope(),mdef->getFileDef(),mdef->typeString(),&mdefAl,
6266 mdec->getOuterScope(),mdec->getFileDef(),mdec->typeString(),&mdecAl,
6267 true,mdef->getLanguage()
6268 )
6269 ) /* match found */
6270 {
6271 AUTO_TRACE_ADD("combining definition and declaration");
6272
6273 if (Config_getBool(RESOLVE_UNNAMED_PARAMS))
6274 {
6275 mdec->resolveUnnamedParameters(mdef);
6276 }
6277
6278 // check if the definition documents its own parameters, before the documentation is merged
6279 bool mdefHasParamDocs = hasParamCommand(mdef->documentation());
6280 for (const Argument &a : mdefAl)
6281 {
6282 if (!a.docs.empty()) mdefHasParamDocs = true; // e.g. with ///< comments
6283 }
6284
6285 // first merge argument documentation
6286 transferArgumentDocumentation(mdecAl,mdefAl);
6287
6288 // get the detailed descriptions before the brief descriptions are copied, since a brief
6289 // description copied to a member that already has one is added to its detailed description
6290 DString mdefDocs = mdef->documentation();
6291 DString mdecDocs = mdec->documentation();
6292 DString mdefFile = mdef->docFile();
6293 DString mdecFile = mdec->docFile();
6294 int mdefLine = mdef->docLine();
6295 int mdecLine = mdec->docLine();
6296 bool mdefDocsForDef = mdef->isDocsForDefinition();
6297 bool mdecDocsForDef = mdec->isDocsForDefinition();
6298
6299 // copy brief description between definition and declaration
6300 DString mdefBrief = mdef->briefDescription();
6301 DString mdecBrief = mdec->briefDescription();
6302 DString mdefBriefFile = mdef->briefFile();
6303 DString mdecBriefFile = mdec->briefFile();
6304 int mdefBriefLine = mdef->briefLine();
6305 int mdecBriefLine = mdec->briefLine();
6306 if (!mdef->isDocTransferDone() && !mdecBrief.empty())
6307 {
6308 mdef->setBriefDescription(mdecBrief,mdecBriefFile,mdecBriefLine);
6309 }
6310 if (!mdec->isDocTransferDone() && !mdefBrief.empty())
6311 {
6312 mdec->setBriefDescription(mdefBrief,mdefBriefFile,mdefBriefLine);
6313 }
6314
6315 // copy detailed description between definition and declaration
6316 if (!mdec->isDocTransferDone() && !mdefDocs.empty())
6317 {
6318 //printf("transferring docs mdef->mdec (%s->%s)\n",mdef->argsString(),mdec->argsString());
6319 mdec->setDocumentation(mdefDocs,mdefFile,mdefLine);
6320 mdec->setDocsForDefinition(mdefDocsForDef);
6321 if (mdefAl.hasParameters())
6322 {
6323 auto mdefAlComb = stringToArgumentList(mdef->getLanguage(),mdef->argsString());
6324 transferArgumentDocumentation(mdefAl,*mdefAlComb);
6325 mdec->moveArgumentList(std::move(mdefAlComb));
6326 }
6327 }
6328 if (!mdef->isDocTransferDone() && !mdecDocs.empty())
6329 {
6330 //printf("transferring docs mdec->mdef (%s->%s)\n",mdec->argsString(),mdef->argsString());
6331 mdef->setDocumentation(mdecDocs,mdecFile,mdecLine);
6332 // only use the parameters of the declaration if the definition does not document its own
6333 if (!mdefHasParamDocs)
6334 {
6335 mdef->setDocsForDefinition(mdecDocsForDef);
6336 if (mdecAl.hasParameters())
6337 {
6338 auto mdecAlComb = stringToArgumentList(mdec->getLanguage(),mdec->argsString());
6339 transferArgumentDocumentation(mdecAl,*mdecAlComb);
6340 mdef->moveDeclArgumentList(std::move(mdecAlComb));
6341 }
6342 }
6343 }
6344
6345 // copy inbody documentation between definition and declaration
6346 DString mdefInbodyDocs = mdef->inbodyDocumentation();
6347 DString mdecInbodyDocs = mdec->inbodyDocumentation();
6348 DString mdefInbodyFile = mdef->inbodyFile();
6349 DString mdecInbodyFile = mdec->inbodyFile();
6350 int mdefInbodyLine = mdef->inbodyLine();
6351 int mdecInbodyLine = mdec->inbodyLine();
6352 if (!mdec->isDocTransferDone() && !mdefInbodyDocs.empty())
6353 {
6354 mdec->setInbodyDocumentation(mdefInbodyDocs,mdefInbodyFile,mdefInbodyLine);
6355 }
6356 if (!mdef->isDocTransferDone() && !mdecInbodyDocs.empty())
6357 {
6358 mdef->setInbodyDocumentation(mdecInbodyDocs,mdecInbodyFile,mdecInbodyLine);
6359 }
6360
6361 if (mdec->getStartBodyLine()!=-1 && mdef->getStartBodyLine()==-1)
6362 {
6363 //printf("body mdec->mdef %d-%d\n",mdec->getStartBodyLine(),mdef->getEndBodyLine());
6364 mdef->setBodySegment(mdec->getDefLine(),mdec->getStartBodyLine(),mdec->getEndBodyLine());
6365 mdef->setBodyDef(mdec->getBodyDef());
6366 //mdef->setBodyMember(mdec);
6367 }
6368 else if (mdef->getStartBodyLine()!=-1 && mdec->getStartBodyLine()==-1)
6369 {
6370 //printf("body mdef->mdec %d-%d\n",mdef->getStartBodyLine(),mdec->getEndBodyLine());
6371 mdec->setBodySegment(mdef->getDefLine(),mdef->getStartBodyLine(),mdef->getEndBodyLine());
6372 mdec->setBodyDef(mdef->getBodyDef());
6373 //mdec->setBodyMember(mdef);
6374 }
6377
6378 // copy group info.
6379 if (mdec->getGroupDef()==nullptr && mdef->getGroupDef()!=nullptr)
6380 {
6381 mdec->setGroupDef(mdef->getGroupDef(),
6382 mdef->getGroupPri(),
6383 mdef->docFile(),
6384 mdef->docLine(),
6385 mdef->hasDocumentation(),
6386 mdef
6387 );
6388 }
6389 else if (mdef->getGroupDef()==nullptr && mdec->getGroupDef()!=nullptr)
6390 {
6391 mdef->setGroupDef(mdec->getGroupDef(),
6392 mdec->getGroupPri(),
6393 mdec->docFile(),
6394 mdec->docLine(),
6395 mdec->hasDocumentation(),
6396 mdec
6397 );
6398 }
6399
6400
6401 mdec->mergeRefItems(mdef);
6402 mdef->mergeRefItems(mdec);
6403
6404 mdef->setMemberDeclaration(mdec);
6405 mdec->setMemberDefinition(mdef);
6406
6407 mergeMemberOverrideOptions(mdec,mdef);
6408
6409 mdef->addQualifiers(mdec->getQualifiers());
6410 mdec->addQualifiers(mdef->getQualifiers());
6411
6412 mdef->setDocTransferDone();
6413 mdec->setDocTransferDone();
6414 }
6415 }
6416}
This class contains the information about the argument of a function or template.
Definition arguments.h:27
This class represents an function or template argument list.
Definition arguments.h:66
bool hasParameters() const
Definition arguments.h:77
size_t size() const
Definition arguments.h:101
virtual DString briefDescription(bool abbreviate=false) const =0
virtual DString inbodyFile() const =0
virtual int getEndBodyLine() const =0
virtual DString briefFile() const =0
virtual SrcLangExt getLanguage() const =0
Returns the programming language this definition was written in.
virtual int docLine() const =0
virtual DString documentation() const =0
virtual DString inbodyDocumentation() const =0
virtual int getDefLine() const =0
virtual const DString & name() const =0
virtual int inbodyLine() const =0
virtual const FileDef * getBodyDef() const =0
virtual int briefLine() const =0
virtual bool hasDocumentation() const =0
virtual Definition * getOuterScope() const =0
virtual DString docFile() const =0
virtual int getStartBodyLine() const =0
virtual void setBodySegment(int defLine, int bls, int ble)=0
virtual void setInbodyDocumentation(const DString &d, const DString &docFile, int docLine)=0
virtual void setDocumentation(const DString &d, const DString &docFile, int docLine, bool stripWhiteSpace=true)=0
virtual void setBriefDescription(const DString &b, const DString &briefFile, int briefLine)=0
virtual void mergeRefItems(Definition *d)=0
virtual void setBodyDef(const FileDef *fd)=0
virtual DString argsString() const =0
virtual const ArgumentList & templateArguments() const =0
virtual GroupDef * getGroupDef()=0
virtual const FileDef * getFileDef() const =0
virtual const ArgumentList & argumentList() const =0
virtual bool isFunction() const =0
virtual bool isExternal() const =0
virtual bool isStatic() const =0
virtual StringVector getQualifiers() const =0
virtual bool isDocsForDefinition() const =0
virtual Grouping::GroupPri_t getGroupPri() const =0
virtual TypeSpecifier getMemberSpecifiers() const =0
virtual bool isDocTransferDone() const =0
virtual bool isVariable() const =0
virtual DString typeString() const =0
virtual bool isPrototype() const =0
virtual void setMemberDeclaration(MemberDef *md)=0
virtual void setDocTransferDone()=0
virtual void resolveUnnamedParameters(const MemberDef *md)=0
virtual void setDocsForDefinition(bool b)=0
virtual void mergeMemberSpecifiers(TypeSpecifier s)=0
virtual void addQualifiers(const StringVector &qualifiers)=0
virtual void moveDeclArgumentList(std::unique_ptr< ArgumentList > al)=0
virtual void setMemberDefinition(MemberDef *md)=0
virtual void moveArgumentList(std::unique_ptr< ArgumentList > al)=0
virtual void setGroupDef(GroupDef *gd, Grouping::GroupPri_t pri, const DString &fileName, int startLine, bool hasDocs, MemberDef *member=nullptr)=0
#define Config_getBool(name)
Definition config.h:33
std::unique_ptr< ArgumentList > stringToArgumentList(SrcLangExt lang, const DString &argsString, DString *extraTypeChars=nullptr)
Definition defargs.l:821
#define AUTO_TRACE_ADD(...)
Definition docnode.cpp:54
#define AUTO_TRACE(...)
Definition docnode.cpp:53
static void transferArgumentDocumentation(ArgumentList &decAl, ArgumentList &defAl)
void mergeMemberOverrideOptions(MemberDefMutable *md1, MemberDefMutable *md2)
static bool hasParamCommand(const DString &doc)
bool matchArguments2(const Definition *srcScope, const FileDef *srcFileScope, const DString &srcReturnType, const ArgumentList *srcAl, const Definition *dstScope, const FileDef *dstFileScope, const DString &dstReturnType, const ArgumentList *dstAl, bool checkCV, SrcLangExt lang)
Definition util.cpp:1597

References MemberDefMutable::addQualifiers(), MemberDef::argsString(), MemberDef::argumentList(), AUTO_TRACE, AUTO_TRACE_ADD, Definition::briefDescription(), Definition::briefFile(), Definition::briefLine(), Config_getBool, Definition::docFile(), Definition::docLine(), Definition::documentation(), DString::empty(), Definition::getBodyDef(), Definition::getDefLine(), Definition::getEndBodyLine(), MemberDef::getFileDef(), MemberDef::getGroupDef(), MemberDef::getGroupPri(), Definition::getLanguage(), MemberDef::getMemberSpecifiers(), Definition::getOuterScope(), MemberDef::getQualifiers(), Definition::getStartBodyLine(), Definition::hasDocumentation(), hasParamCommand(), ArgumentList::hasParameters(), Definition::inbodyDocumentation(), Definition::inbodyFile(), Definition::inbodyLine(), MemberDef::isDocsForDefinition(), MemberDef::isDocTransferDone(), MemberDef::isExternal(), MemberDef::isFunction(), MemberDef::isPrototype(), MemberDef::isStatic(), MemberDef::isVariable(), matchArguments2(), mergeMemberOverrideOptions(), MemberDefMutable::mergeMemberSpecifiers(), DefinitionMutable::mergeRefItems(), MemberDefMutable::moveArgumentList(), MemberDefMutable::moveDeclArgumentList(), Definition::name(), MemberDefMutable::resolveUnnamedParameters(), DefinitionMutable::setBodyDef(), DefinitionMutable::setBodySegment(), DefinitionMutable::setBriefDescription(), MemberDefMutable::setDocsForDefinition(), MemberDefMutable::setDocTransferDone(), DefinitionMutable::setDocumentation(), MemberDefMutable::setGroupDef(), DefinitionMutable::setInbodyDocumentation(), MemberDefMutable::setMemberDeclaration(), MemberDefMutable::setMemberDefinition(), ArgumentList::size(), stringToArgumentList(), MemberDef::templateArguments(), transferArgumentDocumentation(), and MemberDef::typeString().

Referenced by ClassDefImpl::mergeCategory(), transferFunctionDocumentation(), and MemberDefMutable::writeTagFile().

◆ createMemberDef()

std::unique_ptr< MemberDef > createMemberDef ( const DString & defFileName,
int defLine,
size_t defColumn,
const DString & type,
const DString & name,
const DString & args,
const DString & excp,
Protection prot,
Specifier virt,
bool stat,
Relationship related,
MemberType t,
const ArgumentList & tal,
const ArgumentList & al,
const DString & metaData )

◆ createMemberDefAlias()

std::unique_ptr< MemberDef > createMemberDefAlias ( const Definition * newScope,
const MemberDef * aliasMd )

Definition at line 980 of file memberdef.cpp.

981{
982 auto amd = std::make_unique<MemberDefAliasImpl>(newScope,aliasMd);
983 //printf("amd: name=%s displayName=%s\n",qPrint(amd->name()),qPrint(amd->displayName()));
984 return amd;
985}

Referenced by MemberDefAliasImpl::deepCopy(), findUsingDeclImports(), NamespaceDefImpl::insertMember(), insertMemberAlias(), and MemberDefMutable::writeTagFile().

◆ hasParamCommand()

bool hasParamCommand ( const DString & doc)
static

Definition at line 6229 of file memberdef.cpp.

6230{
6231 size_t i=0;
6232 while ((i=doc.find("param",i))!=DString::npos)
6233 {
6234 if (i>0 && (i+5>=doc.length() || !isId(doc[i+5])))
6235 {
6236 char c = doc[i-1];
6237 // a command needs whitespace before it, so that e.g. an e-mail address does not count
6238 if (c=='<' || ((c=='\\' || c=='@') && (i==1 || disspace(doc[i-2]))))
6239 {
6240 return true;
6241 }
6242 }
6243 i+=5;
6244 }
6245 return false;
6246}
bool disspace(char c)
Definition dstring.h:62

References disspace(), DString::find(), isId(), DString::length(), and DString::npos.

Referenced by combineDeclarationAndDefinition(), and MemberDefImpl::detectUndocumentedParams().

◆ invalidateCachedTypesInArgumentList()

void invalidateCachedTypesInArgumentList ( ArgumentList & al)
static

Definition at line 6164 of file memberdef.cpp.

6165{
6166 for (Argument &a : al)
6167 {
6168 a.canType.clear();
6169 }
6170}

Referenced by MemberDefImpl::invalidateCachedArgumentTypes().

◆ mergeMemberOverrideOptions()

void mergeMemberOverrideOptions ( MemberDefMutable * md1,
MemberDefMutable * md2 )

Definition at line 6418 of file memberdef.cpp.

6419{
6420 if (Config_getBool(CALL_GRAPH) !=md1->hasCallGraph()) md2->overrideCallGraph(md1->hasCallGraph());
6421 if (Config_getBool(CALLER_GRAPH)!=md1->hasCallerGraph()) md2->overrideCallerGraph(md1->hasCallerGraph());
6422 if (Config_getBool(CALL_GRAPH) !=md2->hasCallGraph()) md1->overrideCallGraph( md2->hasCallGraph());
6423 if (Config_getBool(CALLER_GRAPH)!=md2->hasCallerGraph()) md1->overrideCallerGraph(md2->hasCallerGraph());
6424
6425 if (Config_getBool(SHOW_ENUM_VALUES) !=md1->hasEnumValues()) md2->overrideEnumValues(md1->hasEnumValues());
6426 if (Config_getBool(SHOW_ENUM_VALUES) !=md2->hasEnumValues()) md1->overrideEnumValues( md2->hasEnumValues());
6427
6428 if (Config_getBool(REFERENCED_BY_RELATION)!=md1->hasReferencedByRelation()) md2->overrideReferencedByRelation(md1->hasReferencedByRelation());
6429 if (Config_getBool(REFERENCES_RELATION) !=md1->hasReferencesRelation()) md2->overrideReferencesRelation(md1->hasReferencesRelation());
6430 if (Config_getBool(REFERENCED_BY_RELATION)!=md2->hasReferencedByRelation()) md1->overrideReferencedByRelation(md2->hasReferencedByRelation());
6431 if (Config_getBool(REFERENCES_RELATION) !=md2->hasReferencesRelation()) md1->overrideReferencesRelation(md2->hasReferencesRelation());
6432
6433 if (Config_getBool(INLINE_SOURCES)!=md1->hasInlineSource()) md2->overrideInlineSource(md1->hasInlineSource());
6434 if (Config_getBool(INLINE_SOURCES)!=md2->hasInlineSource()) md1->overrideInlineSource(md2->hasInlineSource());
6435}
virtual bool hasInlineSource() const =0
virtual bool hasEnumValues() const =0
virtual void overrideReferencesRelation(bool e)=0
virtual void overrideReferencedByRelation(bool e)=0
virtual void overrideCallGraph(bool e)=0
virtual void overrideInlineSource(bool e)=0
virtual void overrideEnumValues(bool e)=0
virtual void overrideCallerGraph(bool e)=0

References Config_getBool, MemberDef::hasCallerGraph(), MemberDef::hasCallGraph(), MemberDef::hasEnumValues(), MemberDef::hasInlineSource(), MemberDef::hasReferencedByRelation(), MemberDef::hasReferencesRelation(), MemberDefMutable::overrideCallerGraph(), MemberDefMutable::overrideCallGraph(), MemberDefMutable::overrideEnumValues(), MemberDefMutable::overrideInlineSource(), MemberDefMutable::overrideReferencedByRelation(), and MemberDefMutable::overrideReferencesRelation().

Referenced by combineDeclarationAndDefinition(), findFriends(), and MemberDefMutable::writeTagFile().

◆ simplifyTypeForTable()

DString simplifyTypeForTable ( const DString & s)
static

Definition at line 4012 of file memberdef.cpp.

4013{
4015 if (ts.endsWith("::")) ts = ts.left(ts.length()-2);
4016 static const reg::Ex re1(R"(\a\w*::)"); // non-template version
4017 static const reg::Ex re2(R"(\a\w*<[^>]*>::)"); // template version
4019 std::string t = ts.str();
4020 while (reg::search(t,match,re2) || reg::search(t,match,re1))
4021 {
4022 t = match.prefix().str() + match.suffix().str(); // remove the matched part
4023 }
4024 //printf("simplifyTypeForTable(%s)->%s\n",qPrint(s),qPrint(t));
4025 return t;
4026}
const std::string & str() const
Definition dstring.h:645
bool endsWith(const char *s) const
Definition dstring.h:617
Class representing a regular expression.
Definition regex.h:39
Object representing the matching results.
Definition regex.h:154
bool search(std::string_view str, Match &match, const Ex &re, size_t pos)
Search in a given string str starting at position pos for a match against regular expression re.
Definition regex.cpp:850
bool match(std::string_view str, Match &match, const Ex &re)
Matches a given string str for a match against regular expression re.
Definition regex.cpp:861
DString removeAnonymousScopes(const DString &str)
Definition util.cpp:98

References DString::endsWith(), DString::left(), DString::length(), removeAnonymousScopes(), reg::search(), and DString::str().

Referenced by MemberDefImpl::fieldType().

◆ stripTrailingReturn()

DString stripTrailingReturn ( const DString & trailRet)
static

Definition at line 4240 of file memberdef.cpp.

4241{
4242 DString ret = trailRet;
4243
4244 ret = ret.stripWhiteSpace();
4245 if (ret.startsWith("->"))
4246 {
4247 ret = ret.mid(2).stripWhiteSpace();
4248 return ret;
4249 }
4250 return trailRet;
4251}
DString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
Definition dstring.h:337
bool startsWith(const char *s) const
Definition dstring.h:600

References DString::mid(), DString::startsWith(), and DString::stripWhiteSpace().

Referenced by MemberDefImpl::warnIfUndocumentedParams().

◆ toMemberDef() [1/3]

const MemberDef * toMemberDef ( const Definition * d)

Definition at line 6641 of file memberdef.cpp.

6642{
6643 if (d && (typeid(*d)==typeid(MemberDefImpl) || typeid(*d)==typeid(MemberDefAliasImpl)))
6644 {
6645 return static_cast<const MemberDef*>(d);
6646 }
6647 else
6648 {
6649 return nullptr;
6650 }
6651}

◆ toMemberDef() [2/3]

◆ toMemberDef() [3/3]

MemberDef * toMemberDef ( DefinitionMutable * md)

Definition at line 6628 of file memberdef.cpp.

6629{
6630 Definition *d = toDefinition(md);
6631 if (d && typeid(*d)==typeid(MemberDefImpl))
6632 {
6633 return static_cast<MemberDef*>(d);
6634 }
6635 else
6636 {
6637 return nullptr;
6638 }
6639}
The common base class of all entity definitions found in the sources.
Definition definition.h:77
Definition * toDefinition(DefinitionMutable *dm)

References toDefinition().

◆ toMemberDefMutable()

MemberDefMutable * toMemberDefMutable ( Definition * d)

Definition at line 6653 of file memberdef.cpp.

6654{
6655 if (d && typeid(*d)==typeid(MemberDefImpl))
6656 {
6657 return static_cast<MemberDefMutable*>(d);
6658 }
6659 else
6660 {
6661 return nullptr;
6662 }
6663}

Referenced by addDocCrossReference(), addEnumValuesToEnums(), addGlobalFunction(), addInstance(), addInterfaceOrServiceToServiceOrSingleton(), MemberList::addListReferences(), addLocalObjCMethod(), addMemberFunction(), addMemberSpecialization(), addMembersToMemberGroup(), addMemberToGroups(), ClassDefImpl::addMemberToList(), FileDefImpl::addMemberToList(), ModuleDefImpl::addMemberToList(), NamespaceDefImpl::addMemberToList(), ModuleDefImpl::addMemberToModule(), ModuleManager::addMemberToModule(), ClassDefImpl::addMemberToTemplateInstance(), addMethodToClass(), addOverloaded(), MemberList::addRequirementReferences(), addVariableToClass(), addVariableToFile(), associateVariableWithAnonymousEnumType(), buildDefineList(), buildFunctionList(), buildTypedefList(), computeMemberRelationsForBaseClass(), createTagLessInstance(), MemberDefImpl::createTemplateInstanceMember(), createUsingMemberImportForClass(), ClassDefImpl::deepCopy(), MemberGroup::distributeMemberGroupDocumentation(), findDefineDocumentation(), findDEV(), findEnumDocumentation(), findEnums(), findFriends(), findGlobalMember(), findMember(), MemberList::findSectionsInDocumentation(), findUsingDeclImports(), flushCachedTemplateRelations(), flushUnresolvedRelations(), generateClassMemberLink(), generateClassOrGlobalLink(), getLinkInScope(), ClassDefImpl::hideDerivedVariablesInPython(), incrementFlowKeyWordCount(), incrementFlowKeyWordCount(), inheritDocumentation(), GroupDefImpl::insertMember(), MemberGroup::insertMember(), NamespaceDefImpl::insertMember(), MemberDefImpl::insertReimplementedBy(), ClassDefImpl::mergeCategory(), ClassDefImpl::mergeMembersFromBaseClasses(), SymbolResolver::Private::newResolveTypedef(), processTagLessClassesForList(), MemberList::setAnchors(), MemberList::setAnonymousEnumType(), ClassDefImpl::setGroupDefForAllMembers(), transferFunctionDocumentation(), transferFunctionReferences(), transferRelatedFunctionDocumentation(), transferStaticInstanceInitializers(), tryAddEnumDocsToGroupMember(), vhdlCorrectMemberProperties(), MemberList::writeDocumentation(), MemberList::writeDocumentationPage(), VhdlDocGen::writePlainVHDLDeclarations(), MemberList::writeSimpleDocumentation(), VhdlDocGen::writeSource(), MemberDefMutable::writeTagFile(), and MemberList::writeTagFile().

◆ transferArgumentDocumentation()

void transferArgumentDocumentation ( ArgumentList & decAl,
ArgumentList & defAl )
static

Definition at line 6197 of file memberdef.cpp.

6198{
6199 for (auto decIt = decAl.begin(), defIt = defAl.begin();
6200 decIt!= decAl.end() && defIt!= defAl.end();
6201 ++decIt, ++defIt)
6202 {
6203 Argument &decA = *decIt;
6204 Argument &defA = *defIt;
6205 if (decA.docs.empty() && !defA.docs.empty())
6206 {
6207 decA.docs = defA.docs;
6208 }
6209 else if (defA.docs.empty() && !decA.docs.empty())
6210 {
6211 defA.docs = decA.docs;
6212 }
6213 //printf("transferArgumentDocumentation(%s<->%s)\n",qPrint(decA.name),qPrint(defA.name));
6214 if (Config_getBool(RESOLVE_UNNAMED_PARAMS))
6215 {
6216 if (decA.name.empty() && !defA.name.empty())
6217 {
6218 decA.name = defA.name;
6219 }
6220 else if (defA.name.empty() && !decA.name.empty())
6221 {
6222 defA.name = decA.name;
6223 }
6224 }
6225 }
6226}
DString docs
Definition arguments.h:48
DString name
Definition arguments.h:45
iterator end()
Definition arguments.h:95
iterator begin()
Definition arguments.h:94

References ArgumentList::begin(), Config_getBool, Argument::docs, DString::empty(), ArgumentList::end(), and Argument::name.

Referenced by combineDeclarationAndDefinition().

◆ writeDefArgumentList()

bool writeDefArgumentList ( OutputList & ol,
const Definition * scope,
const MemberDef * md )
static

Definition at line 1081 of file memberdef.cpp.

1082{
1083 const ArgumentList &defArgList=(md->isDocsForDefinition()) ?
1084 md->argumentList() : md->declArgumentList();
1085 //printf("writeDefArgumentList '%s' isDocsForDefinition()=%d hasParameters()=%d (%s)\n",
1086 // qPrint(md->name()),md->isDocsForDefinition(),defArgList.hasParameters(),qPrint(argListToString(defArgList)));
1087 if (!defArgList.hasParameters() || md->isProperty() || md->isTypedef())
1088 {
1089 return false; // member has no function like argument list
1090 }
1091
1092 bool isDefine = md->isDefine();
1093 if (!isDefine) ol.docify(" ");
1094
1095 //printf("writeDefArgList(%d)\n",defArgList->count());
1096 ol.endMemberDocName();
1098 //printf("===> name=%s isDefine=%d\n",qPrint(md->name()),md->isDefine());
1099
1100 DString cName;
1101 if (scope)
1102 {
1103 cName=scope->name();
1104 size_t il=cName.find('<');
1105 size_t ir=cName.rfind('>');
1106 if (il!=DString::npos && ir!=DString::npos && ir>il)
1107 {
1108 cName=cName.mid(il,ir-il+1);
1109 //printf("1. cName=%s\n",qPrint(cName));
1110 }
1111 else if (scope->definitionType()==Definition::TypeClass)
1112 {
1113 cName=tempArgListToString((toClassDef(scope))->templateArguments(),
1114 scope->getLanguage());
1115 //printf("2. cName=%s\n",qPrint(cName));
1116 }
1117 else // no template specifier
1118 {
1119 cName.clear();
1120 }
1121 }
1122 //printf("~~~ %s cName=%s\n",qPrint(md->name()),qPrint(cName));
1123
1125
1126 LinkifyTextOptions options;
1127 options.setScope(scope).setFileScope(md->getBodyDef()).setSelf(md);
1128
1129 bool first=true;
1130 bool paramTypeStarted=false;
1131 auto alIt = defArgList.begin();
1132 while (alIt!=defArgList.end())
1133 {
1134 Argument a = *alIt;
1135 if (isDefine || first)
1136 {
1137 ol.startParameterType(first,DString());
1138 paramTypeStarted=true;
1139 if (isDefine)
1140 {
1141 ol.endParameterType();
1142 ol.startParameterName(true);
1143 }
1144 }
1145
1146 if (!a.attrib.empty() && !md->isObjCMethod()) // argument has an IDL attribute
1147 {
1148 ol.docify(a.attrib+" ");
1149 }
1150
1151 DString atype = a.type;
1152 if (sep!="::") { atype=substitute(atype,"::",sep); }
1153
1154 size_t funcPtrPos=DString::npos;
1155 {
1156 if (md->isObjCMethod()) { atype.prepend("("); atype.append(")"); }
1157 if (atype!="...")
1158 {
1159 if (!cName.empty() && scope && scope!=Doxygen::globalScope)
1160 {
1161 atype=addTemplateNames(atype,scope->name(),cName);
1162 }
1163 // 1. split ...*)(... -> '*' + name + ')(...'
1164 // 2. split ...*[some thing])(... -> '*' + name + '[some thing])(...'
1165 size_t starPos = atype.find('*'); // find pointer
1166 if (starPos==DString::npos) starPos = atype.find('&'); // can also be reference
1167 funcPtrPos = atype.find(")(");
1168 if (starPos!=DString::npos && funcPtrPos!=DString::npos && funcPtrPos>starPos)
1169 {
1170 funcPtrPos=starPos+1;
1171 }
1172 else
1173 {
1174 funcPtrPos=DString::npos;
1175 }
1177 funcPtrPos==DString::npos ? atype : atype.left(funcPtrPos),
1178 options);
1179 }
1180 }
1181
1182 if (!isDefine)
1183 {
1184 if (paramTypeStarted)
1185 {
1186 ol.endParameterType();
1187 paramTypeStarted=false;
1188 }
1189 ol.startParameterName(defArgList.size()<2);
1190 }
1191 else
1192 {
1193 ol.endParameterName();
1194 }
1195
1196 if (atype=="...")
1197 {
1198 ol.docify(atype);
1199 }
1200 else if (!a.name.empty()) // argument has a name
1201 {
1202 ol.docify(a.name);
1203 }
1204 if (!isDefine)
1205 {
1206 if (funcPtrPos!=DString::npos)
1207 {
1209 }
1210 ol.endParameterName();
1211 }
1213 if (funcPtrPos!=DString::npos)
1214 {
1215 linkifyText(TextGeneratorOLImpl(ol),atype.mid(funcPtrPos),options);
1216 }
1217 if (!a.array.empty())
1218 {
1219 ol.docify(a.array);
1220 }
1221 if (!a.defval.empty()) // write the default value
1222 {
1223 DString n=a.defval;
1224 if (scope && scope!=Doxygen::globalScope && !cName.empty())
1225 {
1226 n=addTemplateNames(n,scope->name(),cName);
1227 }
1228 ol.startParameterDefVal(" = ");
1229 linkifyText(TextGeneratorOLImpl(ol),n,LinkifyTextOptions(options).setKeepSpaces(true));
1230 ol.endParameterDefVal();
1231 }
1232 ++alIt;
1233 if (alIt!=defArgList.end())
1234 {
1235 a = *alIt;
1236 if (!md->isObjCMethod()) ol.docify(", "); // there are more arguments
1237 if (!isDefine)
1238 {
1239 DString key;
1240 if (md->isObjCMethod() && a.attrib.length()>=2)
1241 {
1242 //printf("Found parameter keyword %s\n",a.qPrint(attrib));
1243 // strip [ and ]
1244 key=a.attrib.mid(1,a.attrib.length()-2);
1245 if (key!=",") key+=":"; // for normal keywords add colon
1246 }
1247 ol.endParameterExtra(false,false,!md->isObjCMethod());
1248 ol.startParameterType(false,key);
1249 paramTypeStarted=true;
1250 }
1251 else // isDefine
1252 {
1253 ol.endParameterExtra(false,false,true);
1254 }
1255 }
1256 first=false;
1257 }
1258 if (first)
1259 {
1260 ol.startParameterName(defArgList.size()<2);
1261 ol.endParameterName();
1263 }
1264 ol.endParameterExtra(true,defArgList.size()<2,!md->isObjCMethod());
1265 if (!md->extraTypeChars().empty())
1266 {
1267 ol.docify(md->extraTypeChars());
1268 }
1269 if (defArgList.constSpecifier())
1270 {
1271 ol.docify(" const");
1272 }
1273 if (defArgList.volatileSpecifier())
1274 {
1275 ol.docify(" volatile");
1276 }
1277 if (defArgList.refQualifier()==RefQualifierType::LValue)
1278 {
1279 ol.docify(" &");
1280 }
1281 else if (defArgList.refQualifier()==RefQualifierType::RValue)
1282 {
1283 ol.docify(" &&");
1284 }
1285 if (!defArgList.trailingReturnType().empty())
1286 {
1287 linkifyText(TextGeneratorOLImpl(ol), defArgList.trailingReturnType(), options);
1288 }
1289 return true;
1290}
DString attrib
Definition arguments.h:42
DString defval
Definition arguments.h:47
DString array
Definition arguments.h:46
DString type
Definition arguments.h:43
RefQualifierType refQualifier() const
Definition arguments.h:117
DString trailingReturnType() const
Definition arguments.h:115
bool constSpecifier() const
Definition arguments.h:112
bool volatileSpecifier() const
Definition arguments.h:113
void clear()
Definition dstring.h:214
DString & append(char c)
Definition dstring.h:489
DString & prepend(const char *s)
Definition dstring.h:515
virtual DefType definitionType() const =0
static NamespaceDefMutable * globalScope
Definition doxygen.h:114
virtual bool isObjCMethod() const =0
virtual bool isDefine() const =0
virtual DString extraTypeChars() const =0
virtual const ArgumentList & declArgumentList() const =0
virtual bool isProperty() const =0
void endParameterExtra(bool last, bool one, bool bracket)
Definition outputlist.h:690
void endMemberDocName()
Definition outputlist.h:678
void startParameterExtra()
Definition outputlist.h:688
void startParameterList(bool openBracket)
Definition outputlist.h:696
void docify(const DString &s)
Definition outputlist.h:433
void startParameterDefVal(const char *separator)
Definition outputlist.h:692
void endParameterDefVal()
Definition outputlist.h:694
void endParameterName()
Definition outputlist.h:686
void endParameterType()
Definition outputlist.h:682
void startParameterName(bool one)
Definition outputlist.h:684
void startParameterType(bool first, const DString &key)
Definition outputlist.h:680
void writeNonBreakableSpace(int num)
Definition outputlist.h:622
Implements TextGeneratorIntf for an OutputDocInterface stream.
Definition outputlist.h:786
ClassDef * toClassDef(Definition *d)
DString substitute(const DString &s, const DString &src, const DString &dst)
substitute all occurrences of src in s by dst
Definition dstring.cpp:485
void linkifyText(const TextGeneratorIntf &out, const DString &text, const LinkifyTextOptions &options)
static DString addTemplateNames(const DString &s, const DString &n, const DString &t)
LinkifyTextOptions & setScope(const Definition *scope)
Definition linkifytext.h:58
LinkifyTextOptions & setSelf(const Definition *self)
Definition linkifytext.h:64
LinkifyTextOptions & setFileScope(const FileDef *fileScope)
Definition linkifytext.h:61
DString tempArgListToString(const ArgumentList &al, SrcLangExt lang, bool includeDefault)
Definition util.cpp:911
DString getLanguageSpecificSeparator(SrcLangExt lang, bool classScope)
Definition util.cpp:4638

References addTemplateNames(), DString::append(), MemberDef::argumentList(), Argument::array, Argument::attrib, ArgumentList::begin(), DString::clear(), ArgumentList::constSpecifier(), MemberDef::declArgumentList(), Definition::definitionType(), Argument::defval, OutputList::docify(), DString::empty(), ArgumentList::end(), OutputList::endMemberDocName(), OutputList::endParameterDefVal(), OutputList::endParameterExtra(), OutputList::endParameterName(), OutputList::endParameterType(), MemberDef::extraTypeChars(), DString::find(), Definition::getBodyDef(), Definition::getLanguage(), getLanguageSpecificSeparator(), Doxygen::globalScope, ArgumentList::hasParameters(), MemberDef::isDefine(), MemberDef::isDocsForDefinition(), MemberDef::isObjCMethod(), MemberDef::isProperty(), MemberDef::isTypedef(), DString::left(), DString::length(), linkifyText(), LValue, DString::mid(), Argument::name, Definition::name(), DString::npos, DString::prepend(), ArgumentList::refQualifier(), DString::rfind(), RValue, LinkifyTextOptions::setFileScope(), LinkifyTextOptions::setScope(), LinkifyTextOptions::setSelf(), ArgumentList::size(), OutputList::startParameterDefVal(), OutputList::startParameterExtra(), OutputList::startParameterList(), OutputList::startParameterName(), OutputList::startParameterType(), substitute(), tempArgListToString(), toClassDef(), ArgumentList::trailingReturnType(), Argument::type, Definition::TypeClass, ArgumentList::volatileSpecifier(), and OutputList::writeNonBreakableSpace().

Referenced by MemberDefImpl::writeDocumentation().

◆ writeExceptionList()

void writeExceptionList ( OutputList & ol,
const ClassDef * cd,
const MemberDef * md )
static

Definition at line 1331 of file memberdef.cpp.

1332{
1333 DString exception = md->excpString().stripWhiteSpace();
1334 if (exception.at(0)=='{')
1335 {
1336 // this is an UNO IDL attribute - need special handling
1337 size_t index = exception.find(';');
1338 size_t oldIndex = 1;
1339 while (index!=DString::npos) // there should be no more than 2 (set / get)
1340 {
1341 // omit '{' and ';' -> "set raises (...)"
1342 writeExceptionListImpl(ol,cd,md,exception.mid(oldIndex,index-oldIndex));
1343 oldIndex = index+1;
1344 index = exception.find(';',oldIndex);
1345 }
1346 // the rest is now just '}' - omit that
1347 }
1348 else
1349 {
1350 writeExceptionListImpl(ol,cd,md,exception);
1351 }
1352}
virtual DString excpString() const =0
static void writeExceptionListImpl(OutputList &ol, const ClassDef *cd, const MemberDef *md, DString const &exception)

References DString::at(), MemberDef::excpString(), DString::find(), DString::mid(), DString::npos, DString::stripWhiteSpace(), and writeExceptionListImpl().

Referenced by MemberDefImpl::writeDocumentation().

◆ writeExceptionListImpl()

void writeExceptionListImpl ( OutputList & ol,
const ClassDef * cd,
const MemberDef * md,
DString const & exception )
static

Definition at line 1292 of file memberdef.cpp.

1294{
1295 // this is ordinary exception spec - there must be a '('
1296 //printf("exception='%s'\n",qPrint(exception));
1297 size_t index = exception.find('(');
1298 LinkifyTextOptions options;
1299 options.setScope(cd).setFileScope(md->getBodyDef()).setSelf(md);
1300 if (index!=DString::npos)
1301 {
1302 ol.exceptionEntry(exception.left(index),false);
1303 ++index; // paren in second column so skip it here
1304 for (size_t comma = exception.find(',', index); comma!=DString::npos; )
1305 {
1306 ++comma; // include comma
1307 linkifyText(TextGeneratorOLImpl(ol),exception.mid(index,comma-index),options);
1308 ol.exceptionEntry(DString(),false);
1309 index=comma;
1310 comma = exception.find(',', index);
1311 }
1312 if (size_t close = exception.find(')', index); close!=DString::npos)
1313 {
1314 DString type=removeRedundantWhiteSpace(exception.mid(index,close-index));
1315 linkifyText(TextGeneratorOLImpl(ol),type,options);
1316 ol.exceptionEntry(DString(),true);
1317 }
1318 else
1319 {
1320 warn(md->getDefFileName(),md->getDefLine(),
1321 "missing ) in exception list on member {}",md->name());
1322 }
1323 }
1324 else // Java Exception
1325 {
1326 ol.docify(" ");
1327 linkifyText(TextGeneratorOLImpl(ol),exception,options);
1328 }
1329}
virtual DString getDefFileName() const =0
void exceptionEntry(const DString &prefix, bool closeBracket)
Definition outputlist.h:700
#define warn(file, line, fmt,...)
Definition message.h:97
DString removeRedundantWhiteSpace(const DString &s)
Definition util.cpp:427

References OutputList::docify(), OutputList::exceptionEntry(), DString::find(), Definition::getBodyDef(), Definition::getDefFileName(), Definition::getDefLine(), DString::left(), linkifyText(), DString::mid(), Definition::name(), DString::npos, removeRedundantWhiteSpace(), LinkifyTextOptions::setFileScope(), LinkifyTextOptions::setScope(), LinkifyTextOptions::setSelf(), and warn.

Referenced by writeExceptionList().

◆ writePageRef()

void writePageRef ( OutputList & ol,
const DString & cn,
const DString & mn )
static

Definition at line 989 of file memberdef.cpp.

990{
992
996 if (Config_getBool(PDF_HYPERLINKS)) ol.disable(OutputType::Latex);
997 if (Config_getBool(RTF_HYPERLINKS)) ol.disable(OutputType::RTF);
998 ol.startPageRef();
1000 ol.endPageRef(cn,mn);
1001
1002 ol.popGeneratorState();
1003}
void disable(OutputType o)
void endPageRef(const DString &c, const DString &a)
Definition outputlist.h:596
void startPageRef()
Definition outputlist.h:594
void pushGeneratorState()
void popGeneratorState()
virtual DString trPageAbbreviation()=0
Translator * theTranslator
Definition language.cpp:76

References Config_getBool, OutputList::disable(), Docbook, OutputList::docify(), OutputList::endPageRef(), Html, Latex, Man, OutputList::popGeneratorState(), OutputList::pushGeneratorState(), RTF, OutputList::startPageRef(), theTranslator, and Translator::trPageAbbreviation().

Referenced by MemberDefImpl::_writeReimplementedBy(), and MemberDefImpl::_writeReimplements().

Variable Documentation

◆ g_detectUndocumentedParamsMutex

std::mutex g_detectUndocumentedParamsMutex
static

Definition at line 4253 of file memberdef.cpp.

Referenced by MemberDefImpl::detectUndocumentedParams().

◆ g_docCrossReferenceMutex

std::mutex g_docCrossReferenceMutex
static

Definition at line 6561 of file memberdef.cpp.

Referenced by addDocCrossReference().

◆ g_hasDetailedDescriptionMutex

std::mutex g_hasDetailedDescriptionMutex
static

Definition at line 2629 of file memberdef.cpp.

Referenced by MemberDefImpl::hasDetailedDescription().

◆ reAnonymous

const reg::Ex reAnonymous(R"([\w:@]*@\d+)") ( R"([\w:@]*@\d+)" )
static