Doxygen
Loading...
Searching...
No Matches
memberdef.cpp
Go to the documentation of this file.
1/******************************************************************************
2 *
3 * Copyright (C) 1997-2015 by Dimitri van Heesch.
4 *
5 * Permission to use, copy, modify, and distribute this software and its
6 * documentation under the terms of the GNU General Public License is hereby
7 * granted. No representations are made about the suitability of this software
8 * for any purpose. It is provided "as is" without express or implied warranty.
9 * See the GNU General Public License for more details.
10 *
11 * Documents produced by Doxygen are derivative works derived from the
12 * input used in their production; they are not affected by this license.
13 *
14 */
15
16
17#include <stdio.h>
18#include <assert.h>
19#include <mutex>
20
21#include "md5.h"
22#include "memberdef.h"
23#include "membername.h"
24#include "doxygen.h"
25#include "util.h"
26#include "code.h"
27#include "message.h"
28#include "htmlhelp.h"
29#include "language.h"
30#include "outputlist.h"
31#include "example.h"
32#include "membergroup.h"
33#include "groupdef.h"
34#include "defargs.h"
35#include "docparser.h"
36#include "dot.h"
37#include "dotcallgraph.h"
38#include "searchindex.h"
39#include "parserintf.h"
40#include "vhdldocgen.h"
41#include "arguments.h"
42#include "memberlist.h"
43#include "namespacedef.h"
44#include "moduledef.h"
45#include "filedef.h"
46#include "config.h"
47#include "definitionimpl.h"
48#include "regex.h"
49#include "trace.h"
50
51//-----------------------------------------------------------------------------
52
53class MemberDefImpl : public DefinitionMixin<MemberDefMutable>
54{
55 public:
56 MemberDefImpl(const QCString &defFileName,int defLine,int defColumn,
57 const QCString &type,const QCString &name,const QCString &args,
58 const QCString &excp,Protection prot,Specifier virt,bool stat,
59 Relationship related,MemberType t,const ArgumentList &tal,
60 const ArgumentList &al,const QCString &metaData);
61 ~MemberDefImpl() override = default;
63
64 DefType definitionType() const override { return TypeMember; }
65 MemberDef *resolveAlias() override { return this; }
66 const MemberDef *resolveAlias() const override { return this; }
67 CodeSymbolType codeSymbolType() const override;
68 std::unique_ptr<MemberDef> deepCopy() const override;
69 void moveTo(Definition *) override;
70 QCString getOutputFileBase() const override;
71 QCString getReference() const override;
72 QCString anchor() const override;
73 QCString declaration() const override;
74 QCString definition() const override;
75 QCString typeString() const override;
76 QCString argsString() const override;
77 QCString excpString() const override;
78 QCString bitfieldString() const override;
79 QCString extraTypeChars() const override;
80 const QCString &initializer() const override;
81 int initializerLines() const override;
82 TypeSpecifier getMemberSpecifiers() const override;
83 VhdlSpecifier getVhdlSpecifiers() const override;
84 const MemberList *getSectionList(const Definition *) const override;
85 QCString displayDefinition() const override;
86 const ClassDef *getClassDef() const override;
87 ClassDef *getClassDef() override;
88 const FileDef *getFileDef() const override;
89 FileDef *getFileDef() override;
90 const NamespaceDef* getNamespaceDef() const override;
91 NamespaceDef* getNamespaceDef() override;
92 const GroupDef *getGroupDef() const override;
93 GroupDef *getGroupDef() override;
94 const ModuleDef *getModuleDef() const override;
95 ClassDef *accessorClass() const override;
96 QCString getReadAccessor() const override;
97 QCString getWriteAccessor() const override;
98 Grouping::GroupPri_t getGroupPri() const override;
99 QCString getGroupFileName() const override;
100 int getGroupStartLine() const override;
101 bool getGroupHasDocs() const override;
102 QCString qualifiedName() const override;
103 QCString objCMethodName(bool localLink,bool showStatic) const override;
104 Protection protection() const override;
105 Specifier virtualness(int count=0) const override;
106 MemberType memberType() const override;
107 QCString memberTypeName() const override;
108 bool isSignal() const override;
109 bool isSlot() const override;
110 bool isVariable() const override;
111 bool isEnumerate() const override;
112 bool isEnumValue() const override;
113 bool isTypedef() const override;
114 bool isSequence() const override;
115 bool isDictionary() const override;
116 bool isFunction() const override;
117 bool isFunctionPtr() const override;
118 bool isDefine() const override;
119 bool isFriend() const override;
120 bool isDCOP() const override;
121 bool isProperty() const override;
122 bool isEvent() const override;
123 bool isRelated() const override;
124 bool isForeign() const override;
125 bool isStatic() const override;
126 bool isInline() const override;
127 bool isExplicit() const override;
128 bool isMutable() const override;
129 bool isThreadLocal() const override;
130 bool isGettable() const override;
131 bool isPrivateGettable() const override;
132 bool isProtectedGettable() const override;
133 bool isSettable() const override;
134 bool isPrivateSettable() const override;
135 bool isProtectedSettable() const override;
136 bool isReadable() const override;
137 bool isWritable() const override;
138 bool isAddable() const override;
139 bool isRemovable() const override;
140 bool isRaisable() const override;
141 bool isFinal() const override;
142 bool isAbstract() const override;
143 bool isOverride() const override;
144 bool isInitonly() const override;
145 bool isOptional() const override;
146 bool isRequired() const override;
147 bool isNonAtomic() const override;
148 bool isCopy() const override;
149 bool isAssign() const override;
150 bool isRetain() const override;
151 bool isWeak() const override;
152 bool isStrong() const override;
153 bool isEnumStruct() const override;
154 bool isUnretained() const override;
155 bool isNew() const override;
156 bool isSealed() const override;
157 bool isImplementation() const override;
158 bool isExternal() const override;
159 bool isTypeAlias() const override;
160 bool isDefault() const override;
161 bool isDelete() const override;
162 bool isNoExcept() const override;
163 bool isAttribute() const override;
164 bool isUNOProperty() const override;
165 bool isReadonly() const override;
166 bool isBound() const override;
167 bool isConstrained() const override;
168 bool isTransient() const override;
169 bool isMaybeVoid() const override;
170 bool isMaybeDefault() const override;
171 bool isMaybeAmbiguous() const override;
172 bool isPublished() const override;
173 bool isTemplateSpecialization() const override;
174 bool isObjCMethod() const override;
175 bool isObjCProperty() const override;
176 bool isCSharpProperty() const override;
177 bool isConstructor() const override;
178 bool isDestructor() const override;
179 bool hasOneLineInitializer() const override;
180 bool hasMultiLineInitializer() const override;
181 bool isCallable() const override;
182 bool isStrongEnumValue() const override;
183 bool livesInsideEnum() const override;
184 bool isSliceLocal() const override;
185 bool isNoDiscard() const override;
186 bool isConstExpr() const override;
187 bool isConstEval() const override;
188 bool isConstInit() const override;
189 int numberOfFlowKeyWords() const override;
190 bool isFriendToHide() const override;
191 bool isNotFriend() const override;
192 bool isFunctionOrSignalSlot() const override;
193 bool isRelatedOrFriend() const override;
194 bool isLinkableInProject() const override;
195 bool isLinkable() const override;
196 bool hasDocumentation() const override;
197 bool hasUserDocumentation() const override;
198 bool isDeleted() const override;
199 bool isBriefSectionVisible() const override;
200 bool isDetailedSectionVisible(MemberListContainer container) const override;
201 bool hasDetailedDescription() const override;
202 bool isFriendClass() const override;
203 bool isDocumentedFriendClass() const override;
204 const MemberDef *reimplements() const override;
205 const MemberVector &reimplementedBy() const override;
206 bool isReimplementedBy(const ClassDef *cd) const override;
207 ClassDef *relatedAlso() const override;
208 bool hasDocumentedEnumValues() const override;
209 const MemberDef *getAnonymousEnumType() const override;
210 bool isDocsForDefinition() const override;
211 const MemberDef *getEnumScope() const override;
212 const MemberVector &enumFieldList() const override;
213 void setEnumBaseType(const QCString &type) override;
214 QCString enumBaseType() const override;
215 bool hasExamples() const override;
216 const ExampleList &getExamples() const override;
217 bool isPrototype() const override;
218 const ArgumentList &argumentList() const override;
219 const ArgumentList &declArgumentList() const override;
220 const ArgumentList &templateArguments() const override;
221 const ArgumentLists &definitionTemplateParameterLists() const override;
222 std::optional<ArgumentList> formalTemplateArguments() const override;
223 int getMemberGroupId() const override;
224 MemberGroup *getMemberGroup() const override;
225 bool fromAnonymousScope() const override;
226 MemberDef *fromAnonymousMember() const override;
227 bool hasCallGraph() const override;
228 bool hasCallerGraph() const override;
229 bool hasReferencesRelation() const override;
230 bool hasReferencedByRelation() const override;
231 bool hasEnumValues() const override;
232 bool hasInlineSource() const override;
233 QCString sourceRefName() const override;
234 const MemberDef *templateMaster() const override;
235 QCString getScopeString() const override;
236 ClassDef *getClassDefOfAnonymousType() const override;
237 bool isTypedefValCached() const override;
238 const ClassDef *getCachedTypedefVal() const override;
239 QCString getCachedTypedefTemplSpec() const override;
240 QCString getCachedResolvedTypedef() const override;
241 MemberDef *memberDefinition() const override;
242 MemberDef *memberDeclaration() const override;
243 const MemberDef *inheritsDocsFrom() const override;
244 const MemberDef *getGroupAlias() const override;
245 ClassDef *category() const override;
246 const MemberDef *categoryRelation() const override;
247 QCString displayName(bool=TRUE) const override;
248 QCString getDeclType() const override;
249 StringVector getLabels(const Definition *container) const override;
250 const ArgumentList &typeConstraints() const override;
251 QCString requiresClause() const override;
252 QCString documentation() const override;
253 QCString briefDescription(bool abbr=FALSE) const override;
254 QCString fieldType() const override;
255 bool isReference() const override;
256 QCString getDeclFileName() const override;
257 int getDeclLine() const override;
258 int getDeclColumn() const override;
259 void setMemberType(MemberType t) override;
260 void setDefinition(const QCString &d) override;
261 void setFileDef(FileDef *fd) override;
262 void setAnchor() override;
263 void setProtection(Protection p) override;
264 void setMemberSpecifiers(TypeSpecifier s) override;
265 void setVhdlSpecifiers(VhdlSpecifier s) override;
266 void mergeMemberSpecifiers(TypeSpecifier s) override;
267 void setInitializer(const QCString &i) override;
268 void setBitfields(const QCString &s) override;
269 void setMaxInitLines(int lines) override;
270 void setMemberClass(ClassDef *cd) override;
271 void setSectionList(const Definition *container,const MemberList *sl) override;
273 const QCString &fileName,int startLine,bool hasDocs,
274 MemberDef *member=nullptr) override;
275 void setReadAccessor(const QCString &r) override;
276 void setWriteAccessor(const QCString &w) override;
277 void setTemplateSpecialization(bool b) override;
278 void makeRelated() override;
279 void makeForeign() override;
280 void setInheritsDocsFrom(const MemberDef *md) override;
281 void setTagInfo(const TagInfo *i) override;
282 void setArgsString(const QCString &as) override;
283 void setReimplements(MemberDef *md) override;
284 void insertReimplementedBy(MemberDef *md) override;
285 void setRelatedAlso(ClassDef *cd) override;
286 void insertEnumField(MemberDef *md) override;
287 void setEnumScope(MemberDef *md,bool livesInsideEnum=FALSE) override;
288 void setEnumClassScope(ClassDef *cd) override;
289 void setDocumentedEnumValues(bool value) override;
290 void setAnonymousEnumType(const MemberDef *md) override;
291 bool addExample(const QCString &anchor,const QCString &name,const QCString &file) override;
292 void setPrototype(bool p,const QCString &df,int line, int column) override;
293 void setExplicitExternal(bool b,const QCString &df,int line,int column) override;
294 void setDeclFile(const QCString &df,int line,int column) override;
295 void moveArgumentList(std::unique_ptr<ArgumentList> al) override;
296 void moveDeclArgumentList(std::unique_ptr<ArgumentList> al) override;
297 void setDefinitionTemplateParameterLists(const ArgumentLists &lists) override;
298 void setTypeConstraints(const ArgumentList &al) override;
299 void setType(const QCString &t) override;
300 void setAccessorType(ClassDef *cd,const QCString &t) override;
301 void setNamespace(NamespaceDef *nd) override;
302 void setMemberGroup(MemberGroup *grp) override;
303 void setMemberGroupId(int id) override;
304 void makeImplementationDetail() override;
305 void setFromAnonymousScope(bool b) override;
306 void setFromAnonymousMember(MemberDef *m) override;
307 void overrideCallGraph(bool e) override;
308 void overrideCallerGraph(bool e) override;
309 void overrideReferencedByRelation(bool e) override;
310 void overrideReferencesRelation(bool e) override;
311 void overrideEnumValues(bool e) override;
312 void overrideInlineSource(bool e) override;
313 void setTemplateMaster(const MemberDef *mt) override;
314 void setFormalTemplateArguments(const ArgumentList &al) override;
315 void addListReference(const Definition *) override;
316 void addRequirementReferences(const Definition *) override;
317 void setDocsForDefinition(bool b) override;
318 void setGroupAlias(const MemberDef *md) override;
319 void cacheTypedefVal(const ClassDef *val,const QCString &templSpec,const QCString &resolvedType) override;
320 void invalidateTypedefValCache() override;
321 void invalidateCachedArgumentTypes() override;
322 void setMemberDefinition(MemberDef *md) override;
323 void setMemberDeclaration(MemberDef *md) override;
324 void copyArgumentNames(const MemberDef *bmd) override;
325 void setCategory(ClassDef *) override;
326 void setCategoryRelation(const MemberDef *) override;
327 void setDocumentation(const QCString &d,const QCString &docFile,int docLine,bool stripWhiteSpace=TRUE) override;
328 void setBriefDescription(const QCString &b,const QCString &briefFile,int briefLine) override;
329 void setInbodyDocumentation(const QCString &d,const QCString &inbodyFile,int inbodyLine) override;
330 void setHidden(bool b) override;
331 void setRequiresClause(const QCString &req) override;
332 void incrementFlowKeyWordCount() override;
334 const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,const ModuleDef *mod,
335 bool inGroup, int indentLevel,const ClassDef *inheritFrom=nullptr,const QCString &inheritId=QCString()) const override;
336 void writeDocumentation(const MemberList *ml,int memCount,int memTotal,OutputList &ol,
337 const QCString &scopeName,const Definition *container,
338 bool inGroup,bool showEnumValues=FALSE,bool
339 showInline=FALSE) const override;
340 void writeMemberDocSimple(OutputList &ol,const Definition *container) const override;
341 void writeEnumDeclaration(OutputList &typeDecl,
342 const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,const ModuleDef *mod) const override;
343 void writeTagFile(TextStream &,bool useQualifiedName,bool showNamespaceMembers) const override;
344 void warnIfUndocumented() const override;
345 void warnIfUndocumentedParams() const override;
346 bool visibleInIndex() const override;
347 void detectUndocumentedParams(bool hasParamCommand,bool hasReturnCommand) const override;
348 std::unique_ptr<MemberDef> createTemplateInstanceMember(const ArgumentList &formalArgs,
349 const std::unique_ptr<ArgumentList> &actualArgs) const override;
350 void findSectionsInDocumentation() override;
351 void writeLink(OutputList &ol,
352 const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,const ModuleDef *mod,
353 bool onlyText=FALSE) const override;
354 void resolveUnnamedParameters(const MemberDef *md) override;
355 void addQualifiers(const StringVector &qualifiers) override;
356 StringVector getQualifiers() const override;
358 void setModuleDef(ModuleDef *mod) override;
359 int redefineCount() const override;
360 void setRedefineCount(int) override;
361
362 private:
366 void _writeGroupInclude(OutputList &ol,bool inGroup) const;
367 void _writeMultiLineInitializer(OutputList &ol,const QCString &scopeName) const;
368 void _writeCallGraph(OutputList &ol) const;
369 void _writeCallerGraph(OutputList &ol) const;
370 void _writeReimplements(OutputList &ol) const;
371 bool _isReimplements() const;
372 void _writeReimplementedBy(OutputList &ol) const;
373 size_t _countReimplementedBy() const;
374 void _writeExamples(OutputList &ol) const;
375 void _writeTypeConstraints(OutputList &ol) const;
376 void _writeEnumValues(OutputList &ol,const Definition *container,
377 const QCString &cfname,const QCString &ciname,
378 const QCString &cname) const;
379 void _writeCategoryRelation(OutputList &ol) const;
380 void _writeTagData(const DefType) const;
381 void _writeTemplatePrefix(OutputList &ol, const Definition *def,
382 const ArgumentList &al, bool writeReqClause=true) const;
383 bool _hasVisibleCallGraph() const;
384 bool _hasVisibleCallerGraph() const;
385 bool _isAnonymousBitField() const;
386
387
388 void init(Definition *def,const QCString &t,const QCString &a,const QCString &e,
389 Protection p,Specifier v,bool s,Relationship r,
390 MemberType mt,const ArgumentList &tal,
391 const ArgumentList &al,const QCString &meta
392 );
393
394 uint8_t m_isLinkableCached; // 0 = not cached, 1=FALSE, 2=TRUE
395 uint8_t m_isConstructorCached; // 0 = not cached, 1=FALSE, 2=TRUE
396 uint8_t m_isDestructorCached; // 1 = not cached, 1=FALSE, 2=TRUE
397
398 ClassDef *m_classDef = nullptr; // member of or related to
399 FileDef *m_fileDef = nullptr; // member of file definition
400 NamespaceDef *m_nspace = nullptr; // the namespace this member is in.
402
403 const MemberDef *m_enumScope = nullptr; // the enclosing scope, if this is an enum field
404 bool m_livesInsideEnum = false;
405 const MemberDef *m_annEnumType = nullptr; // the anonymous enum that is the type of this member
406 MemberVector m_enumFields; // enumeration fields
407
408 MemberDef *m_redefines = nullptr; // the members that this member redefines
409 MemberVector m_redefinedBy; // the list of members that redefine this one
410
411 MemberDef *m_memDef = nullptr; // member definition for this declaration
412 MemberDef *m_memDec = nullptr; // member declaration for this definition
413 ClassDef *m_relatedAlso = nullptr; // points to class marked by relatedAlso
414
415 ExampleList m_examples; // a dictionary of all examples for quick access
416
417 QCString m_type; // return actual type
418 QCString m_accessorType; // return type that tell how to get to this member
419 ClassDef *m_accessorClass = nullptr; // class that this member accesses (for anonymous types)
420 QCString m_args; // function arguments/variable array specifiers
421 QCString m_def; // member definition in code (fully qualified name)
422 QCString m_anc; // HTML anchor name
423 Specifier m_virt = Specifier::Normal; // normal/virtual/pure virtual
424 Protection m_prot = Protection::Public; // protection type [Public/Protected/Private]
425 QCString m_decl; // member declaration in class
426
427 QCString m_bitfields; // struct member bitfields
428 QCString m_read; // property read accessor
429 QCString m_write; // property write accessor
430 QCString m_exception; // exceptions that can be thrown
431 QCString m_initializer; // initializer
432 QCString m_extraTypeChars; // extra type info found after the argument list
433 QCString m_enumBaseType; // base type of the enum (C++11)
434 QCString m_requiresClause; // requires clause (C++20)
435 int m_initLines = 0; // number of lines in the initializer
436
437 TypeSpecifier m_memSpec; // The specifiers present for this member
439 MemberType m_mtype = MemberType::Define; // returns the kind of member
440 int m_maxInitLines = 0; // when the initializer will be displayed
441 int m_userInitLines = 0; // result of explicit \hideinitializer or \showinitializer
443
444 ArgumentList m_defArgList; // argument list of this member definition
445 ArgumentList m_declArgList; // argument list of this member declaration
446
447 ArgumentList m_tArgList; // template argument list of function template
448 ArgumentList m_typeConstraints; // type constraints for template parameters
449 const MemberDef *m_templateMaster = nullptr;
450 std::optional<ArgumentList> m_formalTemplateArguments;
451 ArgumentLists m_defTmpArgLists; // lists of template argument lists
452 // (for template functions in nested template classes)
453
454 QCString m_metaData; // Slice metadata.
455
456 mutable ClassDef *m_cachedAnonymousType = nullptr; // if the member has an anonymous compound
457 // as its type then this is computed by
458 // getClassDefOfAnonymousType() and
459 // cached here.
460 std::map<const Definition *,const MemberList *> m_sectionMap;
461
462 const MemberDef *m_groupAlias = nullptr; // Member containing the definition
463 int m_grpId = 0; // group id
464 MemberGroup *m_memberGroup = nullptr; // group's member definition
465 GroupDef *m_group = nullptr; // group in which this member is in
467 QCString m_groupFileName; // file where this grouping was defined
468 int m_groupStartLine = 0; // line " " " " "
470
475
476 // documentation inheritance
477 const MemberDef *m_docProvider = nullptr;
478
479 // to store the output file base from tag files
481
482 // to store extra qualifiers
484
485 // objective-c
486 bool m_implOnly = false; // function found in implementation but not
487 // in the interface
488 mutable bool m_hasDocumentedParams = false; // guard to show only the first warning, acts as cache
489 mutable bool m_hasDocumentedReturnType = false; // guard to show only the first warning, acts as cache
490 bool m_isDMember = false;
491 Relationship m_related = Relationship::Member; // relationship of this to the class
492 bool m_stat = false; // is it a static function?
493 bool m_proto = false; // is it a prototype?
494 bool m_docEnumValues = false; // is an enum with documented enum values.
495
496 bool m_annScope = false; // member is part of an anonymous scope
497 mutable bool m_hasDetailedDescriptionCached = false;
499 // const member.
500 bool m_hasCallGraph = false;
501 bool m_hasCallerGraph = false;
504 bool m_hasInlineSource = false;
505 bool m_hasEnumValues = false;
506 bool m_explExt = false; // member was explicitly declared external
507 bool m_tspec = false; // member is a template specialization
508 bool m_groupHasDocs = false; // true if the entry that caused the grouping was documented
509 bool m_docsForDefinition = false; // TRUE => documentation block is put before
510 // definition.
511 // FALSE => block is put before declaration.
515 int m_declLine = -1;
516 int m_declColumn = -1;
519};
520
521std::unique_ptr<MemberDef> createMemberDef(const QCString &defFileName,int defLine,int defColumn,
522 const QCString &type,const QCString &name,const QCString &args,
523 const QCString &excp,Protection prot,Specifier virt,bool stat,
524 Relationship related,MemberType t,const ArgumentList &tal,
525 const ArgumentList &al,const QCString &metaData)
526{
527 return std::make_unique<MemberDefImpl>(defFileName,defLine,defColumn,type,name,args,excp,prot,virt,
528 stat,related,t,tal,al,metaData);
529}
530
531//-----------------------------------------------------------------------------
532
534{
535 public:
536 MemberDefAliasImpl(const Definition *newScope,const MemberDef *md)
537 : DefinitionAliasMixin(newScope,md), m_memberGroup(nullptr) { init(); }
538 ~MemberDefAliasImpl() override { deinit(); }
540
541 DefType definitionType() const override { return TypeMember; }
542
543 const MemberDef *getMdAlias() const { return toMemberDef(getAlias()); }
544 MemberDef *getMdAlias() { return toMemberDef(const_cast<Definition*>(getAlias())); }
545 MemberDef *resolveAlias() override { return const_cast<MemberDef*>(getMdAlias()); }
546 const MemberDef *resolveAlias() const override { return getMdAlias(); }
547
548 std::unique_ptr<MemberDef> deepCopy() const override {
550 }
551 void moveTo(Definition *) override {}
552
553 const QCString &name() const override
554 { return getMdAlias()->name(); }
556 { return getMdAlias()->codeSymbolType(); }
558 { return getMdAlias()->getOutputFileBase(); }
559 QCString getReference() const override
560 { return getMdAlias()->getReference(); }
561 QCString anchor() const override
562 { return getMdAlias()->anchor(); }
563 QCString declaration() const override
564 { return getMdAlias()->declaration(); }
565 QCString definition() const override
566 { return getMdAlias()->definition(); }
567 QCString typeString() const override
568 { return getMdAlias()->typeString(); }
569 QCString argsString() const override
570 { return getMdAlias()->argsString(); }
571 QCString excpString() const override
572 { return getMdAlias()->excpString(); }
573 QCString bitfieldString() const override
574 { return getMdAlias()->bitfieldString(); }
575 QCString extraTypeChars() const override
576 { return getMdAlias()->extraTypeChars(); }
577 const QCString &initializer() const override
578 { return getMdAlias()->initializer(); }
579 int initializerLines() const override
580 { return getMdAlias()->initializerLines(); }
584 { return getMdAlias()->getVhdlSpecifiers(); }
585 const MemberList *getSectionList(const Definition *container) const override
586 { return getMdAlias()->getSectionList(container); }
588 { return getMdAlias()->displayDefinition(); }
589
590 const ClassDef *getClassDef() const override
591 { return getMdAlias()->getClassDef(); }
593 { return getMdAlias()->getClassDef(); }
594
595 const FileDef *getFileDef() const override
596 { return getMdAlias()->getFileDef(); }
597 FileDef *getFileDef() override
598 { return getMdAlias()->getFileDef(); }
599
600 const ModuleDef *getModuleDef() const override
601 { return getMdAlias()->getModuleDef(); }
602
603 const NamespaceDef* getNamespaceDef() const override
604 { return getMdAlias()->getNamespaceDef(); }
606 { return getMdAlias()->getNamespaceDef(); }
607
608 const ClassDef *accessorClass() const override
609 { return getMdAlias()->accessorClass(); }
610 QCString getReadAccessor() const override
611 { return getMdAlias()->getReadAccessor(); }
612 QCString getWriteAccessor() const override
613 { return getMdAlias()->getWriteAccessor(); }
614 const GroupDef *getGroupDef() const override
615 { return getMdAlias()->getGroupDef(); }
617 { return getMdAlias()->getGroupDef(); }
619 { return getMdAlias()->getGroupPri(); }
620 QCString getGroupFileName() const override
621 { return getMdAlias()->getGroupFileName(); }
622 int getGroupStartLine() const override
623 { return getMdAlias()->getGroupStartLine(); }
624 bool getGroupHasDocs() const override
625 { return getMdAlias()->getGroupHasDocs(); }
626 QCString qualifiedName() const override
627 { return getMdAlias()->qualifiedName(); }
628 QCString objCMethodName(bool localLink,bool showStatic) const override
629 { return getMdAlias()->objCMethodName(localLink,showStatic); }
630 Protection protection() const override
631 { return getMdAlias()->protection(); }
632 Specifier virtualness(int /* count */) const override
633 { return getMdAlias()->virtualness(); }
634 MemberType memberType() const override
635 { return getMdAlias()->memberType(); }
636 QCString memberTypeName() const override
637 { return getMdAlias()->memberTypeName(); }
638 bool isSignal() const override
639 { return getMdAlias()->isSignal(); }
640 bool isSlot() const override
641 { return getMdAlias()->isSlot(); }
642 bool isVariable() const override
643 { return getMdAlias()->isVariable(); }
644 bool isEnumerate() const override
645 { return getMdAlias()->isEnumerate(); }
646 bool isEnumValue() const override
647 { return getMdAlias()->isEnumValue(); }
648 bool isTypedef() const override
649 { return getMdAlias()->isTypedef(); }
650 bool isSequence() const override
651 { return getMdAlias()->isSequence(); }
652 bool isDictionary() const override
653 { return getMdAlias()->isDictionary(); }
654 bool isFunction() const override
655 { return getMdAlias()->isFunction(); }
656 bool isFunctionPtr() const override
657 { return getMdAlias()->isFunctionPtr(); }
658 bool isDefine() const override
659 { return getMdAlias()->isDefine(); }
660 bool isFriend() const override
661 { return getMdAlias()->isFriend(); }
662 bool isDCOP() const override
663 { return getMdAlias()->isDCOP(); }
664 bool isProperty() const override
665 { return getMdAlias()->isProperty(); }
666 bool isEvent() const override
667 { return getMdAlias()->isEvent(); }
668 bool isRelated() const override
669 { return getMdAlias()->isRelated(); }
670 bool isForeign() const override
671 { return getMdAlias()->isForeign(); }
672 bool isStatic() const override
673 { return getMdAlias()->isStatic(); }
674 bool isInline() const override
675 { return getMdAlias()->isInline(); }
676 bool isExplicit() const override
677 { return getMdAlias()->isExplicit(); }
678 bool isMutable() const override
679 { return getMdAlias()->isMutable(); }
680 bool isThreadLocal() const override
681 { return getMdAlias()->isThreadLocal(); }
682 bool isGettable() const override
683 { return getMdAlias()->isGettable(); }
684 bool isPrivateGettable() const override
685 { return getMdAlias()->isPrivateGettable(); }
686 bool isProtectedGettable() const override
687 { return getMdAlias()->isProtectedGettable(); }
688 bool isSettable() const override
689 { return getMdAlias()->isSettable(); }
690 bool isPrivateSettable() const override
691 { return getMdAlias()->isPrivateSettable(); }
692 bool isProtectedSettable() const override
693 { return getMdAlias()->isProtectedSettable(); }
694 bool isReadable() const override
695 { return getMdAlias()->isReadable(); }
696 bool isWritable() const override
697 { return getMdAlias()->isWritable(); }
698 bool isAddable() const override
699 { return getMdAlias()->isAddable(); }
700 bool isRemovable() const override
701 { return getMdAlias()->isRemovable(); }
702 bool isRaisable() const override
703 { return getMdAlias()->isRaisable(); }
704 bool isFinal() const override
705 { return getMdAlias()->isFinal(); }
706 bool isAbstract() const override
707 { return getMdAlias()->isAbstract(); }
708 bool isOverride() const override
709 { return getMdAlias()->isOverride(); }
710 bool isInitonly() const override
711 { return getMdAlias()->isInitonly(); }
712 bool isOptional() const override
713 { return getMdAlias()->isOptional(); }
714 bool isRequired() const override
715 { return getMdAlias()->isRequired(); }
716 bool isNonAtomic() const override
717 { return getMdAlias()->isNonAtomic(); }
718 bool isCopy() const override
719 { return getMdAlias()->isCopy(); }
720 bool isAssign() const override
721 { return getMdAlias()->isAssign(); }
722 bool isRetain() const override
723 { return getMdAlias()->isRetain(); }
724 bool isWeak() const override
725 { return getMdAlias()->isWeak(); }
726 bool isStrong() const override
727 { return getMdAlias()->isStrong(); }
728 bool isEnumStruct() const override
729 { return getMdAlias()->isEnumStruct(); }
730 bool isUnretained() const override
731 { return getMdAlias()->isUnretained(); }
732 bool isNew() const override
733 { return getMdAlias()->isNew(); }
734 bool isSealed() const override
735 { return getMdAlias()->isSealed(); }
736 bool isImplementation() const override
737 { return getMdAlias()->isImplementation(); }
738 bool isExternal() const override
739 { return getMdAlias()->isExternal(); }
740 bool isTypeAlias() const override
741 { return getMdAlias()->isTypeAlias(); }
742 bool isDefault() const override
743 { return getMdAlias()->isDefault(); }
744 bool isDelete() const override
745 { return getMdAlias()->isDelete(); }
746 bool isNoExcept() const override
747 { return getMdAlias()->isNoExcept(); }
748 bool isAttribute() const override
749 { return getMdAlias()->isAttribute(); }
750 bool isUNOProperty() const override
751 { return getMdAlias()->isUNOProperty(); }
752 bool isReadonly() const override
753 { return getMdAlias()->isReadable(); }
754 bool isBound() const override
755 { return getMdAlias()->isBound(); }
756 bool isConstrained() const override
757 { return getMdAlias()->isConstrained(); }
758 bool isTransient() const override
759 { return getMdAlias()->isTransient(); }
760 bool isMaybeVoid() const override
761 { return getMdAlias()->isMaybeVoid(); }
762 bool isMaybeDefault() const override
763 { return getMdAlias()->isMaybeDefault(); }
764 bool isMaybeAmbiguous() const override
765 { return getMdAlias()->isMaybeAmbiguous(); }
766 bool isPublished() const override
767 { return getMdAlias()->isPublished(); }
768 bool isTemplateSpecialization() const override
769 { return getMdAlias()->isTemplateSpecialization(); }
770 bool isObjCMethod() const override
771 { return getMdAlias()->isObjCMethod(); }
772 bool isObjCProperty() const override
773 { return getMdAlias()->isObjCProperty(); }
774 bool isCSharpProperty() const override
775 { return getMdAlias()->isCSharpProperty(); }
776 bool isConstructor() const override
777 { return getMdAlias()->isConstructor(); }
778 bool isDestructor() const override
779 { return getMdAlias()->isDestructor(); }
780 bool hasOneLineInitializer() const override
781 { return getMdAlias()->hasOneLineInitializer(); }
782 bool hasMultiLineInitializer() const override
783 { return getMdAlias()->hasMultiLineInitializer(); }
784 bool isCallable() const override
785 { return getMdAlias()->isCallable(); }
786 bool isStrongEnumValue() const override
787 { return getMdAlias()->isStrongEnumValue(); }
788 bool livesInsideEnum() const override
789 { return getMdAlias()->livesInsideEnum(); }
790 bool isSliceLocal() const override
791 { return getMdAlias()->isSliceLocal(); }
792 bool isNoDiscard() const override
793 { return getMdAlias()->isNoDiscard(); }
794 bool isConstExpr() const override
795 { return getMdAlias()->isConstExpr(); }
796 bool isConstEval() const override
797 { return getMdAlias()->isConstEval(); }
798 bool isConstInit() const override
799 { return getMdAlias()->isConstInit(); }
800 int numberOfFlowKeyWords() const override
801 { return getMdAlias()->numberOfFlowKeyWords(); }
802 bool isFriendToHide() const override
803 { return getMdAlias()->isFriendToHide(); }
804 bool isNotFriend() const override
805 { return getMdAlias()->isNotFriend(); }
806 bool isFunctionOrSignalSlot() const override
807 { return getMdAlias()->isFunctionOrSignalSlot(); }
808 bool isRelatedOrFriend() const override
809 { return getMdAlias()->isRelatedOrFriend(); }
810 bool isLinkableInProject() const override
811 { return getMdAlias()->isLinkableInProject(); }
812 bool isLinkable() const override
813 { return getMdAlias()->isLinkable(); }
814 bool hasDocumentation() const override
815 { return getMdAlias()->hasDocumentation(); }
816 bool hasUserDocumentation() const override
817 { return getMdAlias()->hasUserDocumentation(); }
818 bool isDeleted() const override
819 { return getMdAlias()->isDeleted(); }
820 bool isBriefSectionVisible() const override
821 { return getMdAlias()->isBriefSectionVisible(); }
822 bool isDetailedSectionVisible(MemberListContainer container) const override
823 { return getMdAlias()->isDetailedSectionVisible(container); }
824 bool hasDetailedDescription() const override
825 { return getMdAlias()->hasDetailedDescription(); }
826 bool isFriendClass() const override
827 { return getMdAlias()->isFriendClass(); }
828 bool isDocumentedFriendClass() const override
829 { return getMdAlias()->isDocumentedFriendClass(); }
830 const MemberDef *reimplements() const override
831 { return getMdAlias()->reimplements(); }
832 const MemberVector &reimplementedBy() const override
833 { return getMdAlias()->reimplementedBy(); }
834 bool isReimplementedBy(const ClassDef *cd) const override
835 { return getMdAlias()->isReimplementedBy(cd); }
836 ClassDef *relatedAlso() const override
837 { return getMdAlias()->relatedAlso(); }
838 bool hasDocumentedEnumValues() const override
839 { return getMdAlias()->hasDocumentedEnumValues(); }
840 const MemberDef *getAnonymousEnumType() const override
841 { return getMdAlias()->getAnonymousEnumType(); }
842 bool isDocsForDefinition() const override
843 { return getMdAlias()->isDocsForDefinition(); }
844 const MemberDef *getEnumScope() const override
845 { return getMdAlias()->getEnumScope(); }
846 const MemberVector &enumFieldList() const override
847 { return getMdAlias()->enumFieldList(); }
848 QCString enumBaseType() const override
849 { return getMdAlias()->enumBaseType(); }
850 bool hasExamples() const override
851 { return getMdAlias()->hasExamples(); }
852 const ExampleList &getExamples() const override
853 { return getMdAlias()->getExamples(); }
854 bool isPrototype() const override
855 { return getMdAlias()->isPrototype(); }
856 const ArgumentList &argumentList() const override
857 { return getMdAlias()->argumentList(); }
858 const ArgumentList &declArgumentList() const override
859 { return getMdAlias()->declArgumentList(); }
860 const ArgumentList &templateArguments() const override
861 { return getMdAlias()->templateArguments(); }
864 std::optional<ArgumentList> formalTemplateArguments() const override
865 { return getMdAlias()->formalTemplateArguments(); }
866 int getMemberGroupId() const override
867 { return getMdAlias()->getMemberGroupId(); }
868 MemberGroup *getMemberGroup() const override
869 { return m_memberGroup; }
870 bool fromAnonymousScope() const override
871 { return getMdAlias()->fromAnonymousScope(); }
873 { return getMdAlias()->fromAnonymousMember(); }
874 bool hasCallGraph() const override
875 { return getMdAlias()->hasCallGraph(); }
876 bool hasCallerGraph() const override
877 { return getMdAlias()->hasCallerGraph(); }
878 bool hasReferencesRelation() const override
879 { return getMdAlias()->hasReferencesRelation(); }
880 bool hasReferencedByRelation() const override
881 { return getMdAlias()->hasReferencedByRelation(); }
882 bool hasInlineSource() const override
883 { return getMdAlias()->hasInlineSource(); }
884 QCString sourceRefName() const override
885 { return getMdAlias()->sourceRefName(); }
886 bool hasEnumValues() const override
887 { return getMdAlias()->hasEnumValues(); }
889 { return getMdAlias()->getQualifiers(); }
890 const MemberDef *templateMaster() const override
891 { return getMdAlias()->templateMaster(); }
892 QCString getScopeString() const override
893 { return getMdAlias()->getScopeString(); }
896 bool isTypedefValCached() const override
897 { return getMdAlias()->isTypedefValCached(); }
898 const ClassDef *getCachedTypedefVal() const override
899 { return getMdAlias()->getCachedTypedefVal(); }
904 MemberDef *memberDefinition() const override
905 { return getMdAlias()->memberDefinition(); }
906 MemberDef *memberDeclaration() const override
907 { return getMdAlias()->memberDeclaration(); }
908 const MemberDef *inheritsDocsFrom() const override
909 { return getMdAlias()->inheritsDocsFrom(); }
910 const MemberDef *getGroupAlias() const override
911 { return getMdAlias()->getGroupAlias(); }
912 ClassDef *category() const override
913 { return getMdAlias()->category(); }
914 const MemberDef *categoryRelation() const override
915 { return getMdAlias()->categoryRelation(); }
916 QCString displayName(bool b=TRUE) const override
917 { return getMdAlias()->displayName(b); }
918 QCString getDeclType() const override
919 { return getMdAlias()->getDeclType(); }
920 StringVector getLabels(const Definition *container) const override
921 { return getMdAlias()->getLabels(container); }
922 const ArgumentList &typeConstraints() const override
923 { return getMdAlias()->typeConstraints(); }
924 QCString documentation() const override
925 { return getMdAlias()->documentation(); }
926 QCString briefDescription(bool /* abbr=FALSE */) const override
927 { return getMdAlias()->briefDescription(); }
928 QCString fieldType() const override
929 { return getMdAlias()->fieldType(); }
930 bool isReference() const override
931 { return getMdAlias()->isReference(); }
932 QCString getDeclFileName() const override
933 { return getMdAlias()->getDeclFileName(); }
934 int getDeclLine() const override
935 { return getMdAlias()->getDeclLine(); }
936 int getDeclColumn() const override
937 { return getMdAlias()->getDeclColumn(); }
938 QCString requiresClause() const override
939 { return getMdAlias()->requiresClause(); }
940 bool visibleInIndex() const override
941 { return getMdAlias()->visibleInIndex(); }
942 int redefineCount() const override
943 { return getMdAlias()->redefineCount(); }
944
945 void warnIfUndocumented() const override {}
946 void warnIfUndocumentedParams() const override {}
947 void detectUndocumentedParams(bool /* hasParamCommand */,bool /* hasReturnCommand */) const override {}
948 void setMemberGroup(MemberGroup *grp) override { m_memberGroup = grp; }
949 std::unique_ptr<MemberDef> createTemplateInstanceMember(const ArgumentList &formalArgs,
950 const std::unique_ptr<ArgumentList> &actualArgs) const override
951 { return getMdAlias()->createTemplateInstanceMember(formalArgs,actualArgs); }
952
954 const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,const ModuleDef *mod,
955 bool inGroup, int indentLevel, const ClassDef *inheritFrom=nullptr,const QCString &inheritId=QCString()) const override
956 {
957 getMdAlias()->writeDeclaration(ol,cd,nd,fd,gd,mod,inGroup,indentLevel,inheritFrom,inheritId);
958 }
960 const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,const ModuleDef *mod) const override
961 {
962 getMdAlias()->writeEnumDeclaration(typeDecl,cd,nd,fd,gd,mod);
963 }
965 const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,const ModuleDef *mod,
966 bool onlyText=FALSE) const override
967 {
968 getMdAlias()->writeLink(ol,cd,nd,fd,gd,mod,onlyText);
969 }
970 private:
971 MemberGroup *m_memberGroup; // group's member definition
972};
973
974
975std::unique_ptr<MemberDef> createMemberDefAlias(const Definition *newScope,const MemberDef *aliasMd)
976{
977 auto amd = std::make_unique<MemberDefAliasImpl>(newScope,aliasMd);
978 //printf("amd: name=%s displayName=%s\n",qPrint(amd->name()),qPrint(amd->displayName()));
979 return amd;
980}
981
982//-----------------------------------------------------------------------------
983
984static QCString addTemplateNames(const QCString &s,const QCString &n,const QCString &t)
985{
986 QCString result;
987 QCString clRealName=n;
988 int p=0,i=0;
989 if ((i=clRealName.find('<'))!=-1)
990 {
991 clRealName=clRealName.left(i); // strip template specialization
992 }
993 if ((i=clRealName.findRev("::"))!=-1)
994 {
995 clRealName=clRealName.right(clRealName.length()-i-2);
996 }
997 while ((i=s.find(clRealName,p))!=-1)
998 {
999 result+=s.mid(p,i-p);
1000 size_t j=clRealName.length()+i;
1001 if (s.length()==j || (s.at(j)!='<' && !isId(s.at(j))))
1002 { // add template names
1003 //printf("Adding %s+%s\n",qPrint(clRealName),qPrint(t));
1004 result+=clRealName+t;
1005 }
1006 else
1007 { // template names already present
1008 //printf("Adding %s\n",qPrint(clRealName));
1009 result+=clRealName;
1010 }
1011 p=i+static_cast<int>(clRealName.length());
1012 }
1013 result+=s.right(s.length()-p);
1014 //printf("addTemplateNames(%s,%s,%s)=%s\n",qPrint(s),qPrint(n),qPrint(t),qPrint(result));
1015 return result;
1016}
1017
1018// ol.startMemberDocName has already been done before this is called.
1019// when this function returns TRUE, ol.endParameterList will be called.
1020//
1021// typical sequence:
1022// ol.startMemberDoc
1023// ol.startMemberDocName
1024// --- enter writeDefArgumentList
1025// ol.endMemberDocName
1026// ol.startParameterList
1027// ...
1028// ol.startParameterType(first=TRUE)
1029// ol.endParameterType
1030// ol.startParameterName
1031// ol.endParameterName
1032// ol.startParameterExtra
1033// ol.startParameterDefVal [optional]
1034// ol.endParameterDefVal [optional]
1035// ol.endParameterExtra(last==FALSE)
1036// ...
1037// ol.startParameterType(first=FALSE)
1038// ol.endParameterType
1039// ol.startParameterName
1040// ol.endParameterName
1041// ol.startParameterExtra
1042// ol.endParameterExtra(last==TRUE)
1043// ...
1044// --- leave writeDefArgumentList with return value TRUE
1045// ol.endParameterList
1046// ol.endMemberDoc(hasArgs=TRUE)
1047//
1048// For an empty list the function should return FALSE, the sequence is
1049// ol.startMemberDoc
1050// ol.startMemberDocName
1051// --- enter writeDefArgumentList
1052// --- leave writeDefArgumentList with return value FALSE
1053// ol.endMemberDocName
1054// ol.endMemberDoc(hasArgs=FALSE);
1055//
1056
1057static bool writeDefArgumentList(OutputList &ol,const Definition *scope,const MemberDef *md)
1058{
1059 const ArgumentList &defArgList=(md->isDocsForDefinition()) ?
1060 md->argumentList() : md->declArgumentList();
1061 //printf("writeDefArgumentList '%s' isDocsForDefinition()=%d hasParameters()=%d (%s)\n",
1062 // qPrint(md->name()),md->isDocsForDefinition(),defArgList.hasParameters(),qPrint(argListToString(defArgList)));
1063 if (!defArgList.hasParameters() || md->isProperty() || md->isTypedef())
1064 {
1065 return FALSE; // member has no function like argument list
1066 }
1067
1068 bool isDefine = md->isDefine();
1069 if (!isDefine) ol.docify(" ");
1070
1071 //printf("writeDefArgList(%d)\n",defArgList->count());
1072 ol.endMemberDocName();
1074 //printf("===> name=%s isDefine=%d\n",qPrint(md->name()),md->isDefine());
1075
1076 QCString cName;
1077 if (scope)
1078 {
1079 cName=scope->name();
1080 int il=cName.find('<');
1081 int ir=cName.findRev('>');
1082 if (il!=-1 && ir!=-1 && ir>il)
1083 {
1084 cName=cName.mid(il,ir-il+1);
1085 //printf("1. cName=%s\n",qPrint(cName));
1086 }
1087 else if (scope->definitionType()==Definition::TypeClass)
1088 {
1089 cName=tempArgListToString((toClassDef(scope))->templateArguments(),
1090 scope->getLanguage());
1091 //printf("2. cName=%s\n",qPrint(cName));
1092 }
1093 else // no template specifier
1094 {
1095 cName.clear();
1096 }
1097 }
1098 //printf("~~~ %s cName=%s\n",qPrint(md->name()),qPrint(cName));
1099
1101
1102 bool first=TRUE;
1103 bool paramTypeStarted=FALSE;
1104 auto alIt = defArgList.begin();
1105 while (alIt!=defArgList.end())
1106 {
1107 Argument a = *alIt;
1108 if (isDefine || first)
1109 {
1110 ol.startParameterType(first,QCString());
1111 paramTypeStarted=true;
1112 if (isDefine)
1113 {
1114 ol.endParameterType();
1116 }
1117 }
1118
1119 if (!a.attrib.isEmpty() && !md->isObjCMethod()) // argument has an IDL attribute
1120 {
1121 ol.docify(a.attrib+" ");
1122 }
1123
1124 QCString atype = a.type;
1125 if (sep!="::") { atype=substitute(atype,"::",sep); }
1126
1127 int funcPtrPos=-1;
1128 {
1129 if (md->isObjCMethod()) { atype.prepend("("); atype.append(")"); }
1130 if (atype!="...")
1131 {
1132 if (!cName.isEmpty() && scope && scope!=Doxygen::globalScope)
1133 {
1134 atype=addTemplateNames(atype,scope->name(),cName);
1135 }
1136 funcPtrPos = atype.find("*)(");
1137 if (funcPtrPos!=-1) funcPtrPos++;
1138 linkifyText(TextGeneratorOLImpl(ol),scope,md->getBodyDef(),md,
1139 funcPtrPos==-1 ? atype : atype.left(funcPtrPos));
1140 }
1141 }
1142
1143 if (!isDefine)
1144 {
1145 if (paramTypeStarted)
1146 {
1147 ol.endParameterType();
1148 paramTypeStarted=FALSE;
1149 }
1150 ol.startParameterName(defArgList.size()<2);
1151 }
1152 else
1153 {
1154 ol.endParameterName();
1155 }
1156
1157 if (atype=="...")
1158 {
1159 ol.docify(atype);
1160 }
1161 else if (!a.name.isEmpty()) // argument has a name
1162 {
1163 ol.docify(a.name);
1164 }
1165 if (!isDefine)
1166 {
1167 if (funcPtrPos!=-1)
1168 {
1170 }
1171 ol.endParameterName();
1172 }
1174 if (funcPtrPos!=-1)
1175 {
1176 linkifyText(TextGeneratorOLImpl(ol),scope,md->getBodyDef(),md,
1177 atype.mid(funcPtrPos));
1178 }
1179 if (!a.array.isEmpty())
1180 {
1181 ol.docify(a.array);
1182 }
1183 if (!a.defval.isEmpty()) // write the default value
1184 {
1185 QCString n=a.defval;
1186 if (scope && scope!=Doxygen::globalScope && !cName.isEmpty())
1187 {
1188 n=addTemplateNames(n,scope->name(),cName);
1189 }
1190 ol.startParameterDefVal(" = ");
1192 ol.endParameterDefVal();
1193 }
1194 ++alIt;
1195 if (alIt!=defArgList.end())
1196 {
1197 a = *alIt;
1198 if (!md->isObjCMethod()) ol.docify(", "); // there are more arguments
1199 if (!isDefine)
1200 {
1201 QCString key;
1202 if (md->isObjCMethod() && a.attrib.length()>=2)
1203 {
1204 //printf("Found parameter keyword %s\n",a.qPrint(attrib));
1205 // strip [ and ]
1206 key=a.attrib.mid(1,a.attrib.length()-2);
1207 if (key!=",") key+=":"; // for normal keywords add colon
1208 }
1209 ol.endParameterExtra(false,false,!md->isObjCMethod());
1210 ol.startParameterType(FALSE,key);
1211 paramTypeStarted=TRUE;
1212 }
1213 else // isDefine
1214 {
1215 ol.endParameterExtra(false,false,true);
1216 }
1217 }
1218 first=FALSE;
1219 }
1220 if (first)
1221 {
1222 ol.startParameterName(defArgList.size()<2);
1223 ol.endParameterName();
1225 }
1226 ol.endParameterExtra(TRUE,defArgList.size()<2,!md->isObjCMethod());
1227 if (!md->extraTypeChars().isEmpty())
1228 {
1229 ol.docify(md->extraTypeChars());
1230 }
1231 if (defArgList.constSpecifier())
1232 {
1233 ol.docify(" const");
1234 }
1235 if (defArgList.volatileSpecifier())
1236 {
1237 ol.docify(" volatile");
1238 }
1239 if (defArgList.refQualifier()==RefQualifierType::LValue)
1240 {
1241 ol.docify(" &");
1242 }
1243 else if (defArgList.refQualifier()==RefQualifierType::RValue)
1244 {
1245 ol.docify(" &&");
1246 }
1247 if (!defArgList.trailingReturnType().isEmpty())
1248 {
1250 scope, // scope
1251 md->getBodyDef(), // fileScope
1252 md, // self
1253 defArgList.trailingReturnType(), // text
1254 FALSE // autoBreak
1255 );
1256
1257 }
1258 return TRUE;
1259}
1260
1262 OutputList &ol, const ClassDef *cd, const MemberDef *md, QCString const& exception)
1263{
1264 // this is ordinary exception spec - there must be a '('
1265 //printf("exception='%s'\n",qPrint(exception));
1266 int index = exception.find('(');
1267 if (index!=-1)
1268 {
1269 ol.exceptionEntry(exception.left(index),false);
1270 ++index; // paren in second column so skip it here
1271 for (int comma = exception.find(',', index); comma!=-1; )
1272 {
1273 ++comma; // include comma
1275 exception.mid(index,comma-index));
1276 ol.exceptionEntry(QCString(),false);
1277 index=comma;
1278 comma = exception.find(',', index);
1279 }
1280 int close = exception.find(')', index);
1281 if (close!=-1)
1282 {
1283 QCString type=removeRedundantWhiteSpace(exception.mid(index,close-index));
1284 linkifyText(TextGeneratorOLImpl(ol),cd,md->getBodyDef(),md,type);
1285 ol.exceptionEntry(QCString(),true);
1286 }
1287 else
1288 {
1289 warn(md->getDefFileName(),md->getDefLine(),
1290 "missing ) in exception list on member {}",md->name());
1291 }
1292 }
1293 else // Java Exception
1294 {
1295 ol.docify(" ");
1296 linkifyText(TextGeneratorOLImpl(ol),cd,md->getBodyDef(),md,exception);
1297 }
1298}
1299
1300static void writeExceptionList(OutputList &ol, const ClassDef *cd, const MemberDef *md)
1301{
1302 QCString exception = md->excpString().stripWhiteSpace();
1303 if ('{'==exception.at(0))
1304 {
1305 // this is an UNO IDL attribute - need special handling
1306 int index = exception.find(';');
1307 int oldIndex = 1;
1308 while (-1 != index) // there should be no more than 2 (set / get)
1309 {
1310 // omit '{' and ';' -> "set raises (...)"
1311 writeExceptionListImpl(ol,cd,md,exception.mid(oldIndex,index-oldIndex));
1312 oldIndex=index+1;
1313 index = exception.find(';',oldIndex);
1314 }
1315 // the rest is now just '}' - omit that
1316 }
1317 else
1318 {
1319 writeExceptionListImpl(ol,cd,md,exception);
1320 }
1321}
1322
1323//-----------------------------------------------------------------------------
1324//-----------------------------------------------------------------------------
1325//-----------------------------------------------------------------------------
1326
1328 const QCString &t,const QCString &a,const QCString &e,
1329 Protection p,Specifier v,bool s,Relationship r,
1330 MemberType mt,const ArgumentList &tal,
1331 const ArgumentList &al,const QCString &meta
1332 )
1333{
1334 m_classDef=nullptr;
1335 m_fileDef=nullptr;
1336 m_moduleDef=nullptr;
1337 m_redefines=nullptr;
1338 m_relatedAlso=nullptr;
1339 m_accessorClass=nullptr;
1340 m_nspace=nullptr;
1341 m_memDef=nullptr;
1342 m_memDec=nullptr;
1343 m_group=nullptr;
1344 m_grpId=-1;
1345 m_enumScope=nullptr;
1347 m_hasCallGraph = Config_getBool(CALL_GRAPH);
1348 m_hasCallerGraph = Config_getBool(CALLER_GRAPH);
1349 m_hasReferencedByRelation = Config_getBool(REFERENCED_BY_RELATION);
1350 m_hasReferencesRelation = Config_getBool(REFERENCES_RELATION);
1351 m_hasEnumValues = Config_getBool(SHOW_ENUM_VALUES);
1352 m_hasInlineSource = Config_getBool(INLINE_SOURCES);
1353 m_initLines=0;
1354 m_type=t;
1355 if (mt==MemberType::Typedef) m_type.stripPrefix("typedef ");
1356 // type.stripPrefix("struct ");
1357 // type.stripPrefix("class " );
1358 // type.stripPrefix("union " );
1360 m_args=a;
1362 if (m_type.isEmpty()) m_decl=d->name()+m_args; else m_decl=m_type+" "+d->name()+m_args;
1363
1364 m_memberGroup=nullptr;
1365 m_virt=v;
1366 m_prot=p;
1367 m_related=r;
1368 m_stat=s;
1369 m_mtype=mt;
1370 m_exception=e;
1371 m_proto=FALSE;
1375 m_annMemb=nullptr;
1376 m_annEnumType=nullptr;
1377 m_groupAlias=nullptr;
1379 m_tspec=FALSE;
1380 m_cachedAnonymousType=nullptr;
1381 m_maxInitLines=Config_getInt(MAX_INITIALIZER_LINES);
1382 m_userInitLines=-1;
1384 // copy function template arguments (if any)
1385 m_tArgList = tal;
1386 //printf("new member al=%p\n",al);
1387 // copy function definition arguments (if any)
1388 m_defArgList = al;
1389 // convert function declaration arguments (if any)
1390 if (!m_args.isEmpty())
1391 {
1393 //printf("setDeclArgList %s to %s const=%d\n",qPrint(args),
1394 // qPrint(argListToString(declArgList)),declArgList->constSpecifier);
1395 }
1396 m_metaData = meta;
1397 m_templateMaster = nullptr;
1400 m_cachedTypedefValue = nullptr;
1402 m_groupMember = nullptr;
1405 m_docProvider = nullptr;
1407}
1408
1409
1410//-----------------------------------------------------------------------------
1411//-----------------------------------------------------------------------------
1412//-----------------------------------------------------------------------------
1413
1414/*! Creates a new member definition.
1415 *
1416 * \param df File containing the definition of this member.
1417 * \param dl Line at which the member definition was found.
1418 * \param dc Column at which the member definition was found.
1419 * \param t A string representing the type of the member.
1420 * \param na A string representing the name of the member.
1421 * \param a A string representing the arguments of the member.
1422 * \param e A string representing the throw clause of the members.
1423 * \param p The protection context of the member, possible values are:
1424 * \c Public, \c Protected, \c Private.
1425 * \param v The degree of 'virtualness' of the member, possible values are:
1426 * \c Normal, \c Virtual, \c Pure.
1427 * \param s A boolean that is true iff the member is static.
1428 * \param r The relationship between the class and the member.
1429 * \param mt The kind of member. See #MemberType for a list of
1430 * all types.
1431 * \param tal The template arguments of this member.
1432 * \param al The arguments of this member. This is a structured form of
1433 * the string past as argument \a a.
1434 * \param meta Slice metadata.
1435 */
1436
1438 const QCString &t,const QCString &na,const QCString &a,const QCString &e,
1440 const ArgumentList &tal,const ArgumentList &al,const QCString &meta
1442{
1443 //printf("MemberDefImpl::MemberDef(%s)\n",qPrint(na));
1444 init(this,t,a,e,p,v,s,r,mt,tal,al,meta);
1448}
1449
1450std::unique_ptr<MemberDef> MemberDefImpl::deepCopy() const
1451{
1452 std::unique_ptr<MemberDefImpl> result(new MemberDefImpl(
1455 // first copy base members
1456 result->DefinitionMixin<MemberDefMutable>::operator=(*this);
1457 // then copy other members
1458 result->m_typeConstraints = m_typeConstraints ;
1459 result->m_declArgList = m_declArgList ;
1460 result->m_classDef = m_classDef ;
1461 result->m_fileDef = m_fileDef ;
1462 result->m_moduleDef = m_moduleDef ;
1463 result->m_nspace = m_nspace ;
1464 result->m_enumScope = m_enumScope ;
1465 result->m_livesInsideEnum = m_livesInsideEnum ;
1466 result->m_annEnumType = m_annEnumType ;
1467 result->m_enumFields = m_enumFields ;
1468 result->m_redefines = m_redefines ;
1469 result->m_redefinedBy = m_redefinedBy ;
1470 result->m_memDef = m_memDef ;
1471 result->m_memDec = m_memDec ;
1472 result->m_relatedAlso = m_relatedAlso ;
1473 result->m_examples = m_examples ;
1474 result->m_accessorType = m_accessorType ;
1475 result->m_accessorClass = m_accessorClass ;
1476 result->m_def = m_def ;
1477 result->m_anc = m_anc ;
1478 result->m_decl = m_decl ;
1479 result->m_bitfields = m_bitfields ;
1480 result->m_read = m_read ;
1481 result->m_write = m_write ;
1482 result->m_exception = m_exception ;
1483 result->m_initializer = m_initializer ;
1484 result->m_extraTypeChars = m_extraTypeChars ;
1485 result->m_enumBaseType = m_enumBaseType ;
1486 result->m_requiresClause = m_requiresClause ;
1487 result->m_initLines = m_initLines ;
1488 result->m_memSpec = m_memSpec ;
1489 result->m_vhdlSpec = m_vhdlSpec ;
1490 result->m_maxInitLines = m_maxInitLines ;
1491 result->m_userInitLines = m_userInitLines ;
1492 result->m_annMemb = m_annMemb ;
1493 result->m_defArgList = m_defArgList ;
1494 result->m_declArgList = m_declArgList ;
1495 result->m_tArgList = m_tArgList ;
1496 result->m_typeConstraints = m_typeConstraints ;
1497 result->m_templateMaster = m_templateMaster ;
1498 result->m_formalTemplateArguments = m_formalTemplateArguments ;
1499 result->m_defTmpArgLists = m_defTmpArgLists ;
1500 result->m_cachedAnonymousType = m_cachedAnonymousType ;
1501 result->m_sectionMap = m_sectionMap ;
1502 result->m_groupAlias = m_groupAlias ;
1503 result->m_grpId = m_grpId ;
1504 result->m_memberGroup = m_memberGroup ;
1505 result->m_group = m_group ;
1506 result->m_grouppri = m_grouppri ;
1507 result->m_groupFileName = m_groupFileName ;
1508 result->m_groupStartLine = m_groupStartLine ;
1509 result->m_groupMember = m_groupMember ;
1510 result->m_isTypedefValCached = m_isTypedefValCached ;
1511 result->m_cachedTypedefValue = m_cachedTypedefValue ;
1512 result->m_cachedTypedefTemplSpec = m_cachedTypedefTemplSpec ;
1513 result->m_cachedResolvedType = m_cachedResolvedType ;
1514 result->m_docProvider = m_docProvider ;
1515 result->m_explicitOutputFileBase = m_explicitOutputFileBase ;
1516 result->m_qualifiers = m_qualifiers ;
1517 result->m_implOnly = m_implOnly ;
1518 result->m_hasDocumentedParams = m_hasDocumentedParams ;
1519 result->m_hasDocumentedReturnType = m_hasDocumentedReturnType ;
1520 result->m_isDMember = m_isDMember ;
1521 result->m_proto = m_proto ;
1522 result->m_docEnumValues = m_docEnumValues ;
1523 result->m_annScope = m_annScope ;
1524 result->m_hasDetailedDescriptionCached = m_hasDetailedDescriptionCached ;
1525 result->m_detailedDescriptionCachedValue = m_detailedDescriptionCachedValue ;
1526 result->m_hasCallGraph = m_hasCallGraph ;
1527 result->m_hasCallerGraph = m_hasCallerGraph ;
1528 result->m_hasReferencedByRelation = m_hasReferencedByRelation ;
1529 result->m_hasReferencesRelation = m_hasReferencesRelation ;
1530 result->m_hasEnumValues = m_hasEnumValues ;
1531 result->m_hasInlineSource = m_hasInlineSource ;
1532 result->m_explExt = m_explExt ;
1533 result->m_tspec = m_tspec ;
1534 result->m_groupHasDocs = m_groupHasDocs ;
1535 result->m_docsForDefinition = m_docsForDefinition ;
1536 result->m_category = m_category ;
1537 result->m_categoryRelation = m_categoryRelation ;
1538 result->m_declFileName = m_declFileName ;
1539 result->m_declLine = m_declLine ;
1540 result->m_declColumn = m_declColumn ;
1541 result->m_numberOfFlowKW = m_numberOfFlowKW ;
1542 result->setDefinitionTemplateParameterLists(m_defTmpArgLists);
1543
1544 result->m_isLinkableCached = 0;
1545 result->m_isConstructorCached = 0;
1546 result->m_isDestructorCached = 0;
1547 return result;
1548}
1549
1551{
1552 setOuterScope(scope);
1554 {
1555 m_classDef = toClassDef(scope);
1556 }
1557 else if (scope->definitionType()==Definition::TypeFile)
1558 {
1559 m_fileDef = toFileDef(scope);
1560 }
1561 else if (scope->definitionType()==Definition::TypeModule)
1562 {
1563 m_moduleDef = toModuleDef(scope);
1564 }
1565 else if (scope->definitionType()==Definition::TypeNamespace)
1566 {
1567 m_nspace = toNamespaceDef(scope);
1568 }
1571}
1572
1573
1578
1580{
1581 if (m_templateMaster)
1582 {
1584 if (mdm)
1585 {
1586 mdm->insertReimplementedBy(md);
1587 }
1588 }
1589 if (!m_redefinedBy.contains(md))
1590 {
1591 m_redefinedBy.inSort(md);
1592 }
1593}
1594
1596{
1597 return m_redefines;
1598}
1599
1601{
1602 return m_redefinedBy;
1603}
1604
1606{
1607 if (cd)
1608 {
1609 for (const auto &md : m_redefinedBy)
1610 {
1611 const ClassDef *mcd = md->getClassDef();
1612 if (mcd)
1613 {
1614 if (cd==mcd || cd->isBaseClass(mcd,TRUE))
1615 {
1616 return TRUE;
1617 }
1618 }
1619 }
1620 }
1621 return FALSE;
1622}
1623
1625{
1626 m_enumFields.push_back(md);
1627}
1628
1629bool MemberDefImpl::addExample(const QCString &anchor,const QCString &nameStr, const QCString &file)
1630{
1631 //printf("%s::addExample(%s,%s,%s)\n",qPrint(name()),anchor,nameStr,file);
1632 return m_examples.inSort(Example(anchor,nameStr,file));
1633}
1634
1636{
1637 return !m_examples.empty();
1638}
1639
1641{
1642 QCString n = name();
1644
1645 if (!s.isEmpty())
1646 {
1647 n.prepend(s+"::");
1648 }
1649 else if (isStatic() && getFileDef())
1650 {
1651 n.prepend(getFileDef()->name()+":");
1652 }
1653 if (isCallable())
1654 {
1655 n.append(argsString());
1656 }
1657 return n;
1658}
1659
1661{
1662 bool separateMemberPages = Config_getBool(SEPARATE_MEMBER_PAGES);
1663 bool inlineSimpleClasses = Config_getBool(INLINE_SIMPLE_STRUCTS);
1664 QCString baseName;
1665
1666 //printf("Member: %s: templateMaster=%p group=%p classDef=%p nspace=%p fileDef=%p\n",
1667 // qPrint(name()),m_templateMaster,m_group,m_classDef,
1668 // m_nspace,m_fileDef);
1669 const NamespaceDef *nspace = getNamespaceDef();
1670 const FileDef *fileDef = getFileDef();
1671 const ClassDef *classDef = getClassDef();
1672 const ModuleDef *moduleDef = getModuleDef();
1673 const GroupDef *groupDef = getGroupDef();
1674 if (!m_explicitOutputFileBase.isEmpty())
1675 {
1677 }
1678 else if (templateMaster())
1679 {
1681 }
1682 else if (groupDef)
1683 {
1684 baseName=groupDef->getOutputFileBase();
1685 }
1686 else if (classDef)
1687 {
1688 baseName=classDef->getOutputFileBase();
1689 if (inlineSimpleClasses && classDef->isSimple())
1690 {
1691 return baseName;
1692 }
1693 }
1694 else if (nspace && (nspace->isLinkable() || nspace->isAnonymous()))
1695 {
1696 baseName=nspace->getOutputFileBase();
1697 }
1698 else if (fileDef)
1699 {
1700 baseName=fileDef->getOutputFileBase();
1701 }
1702 else if (moduleDef)
1703 {
1704 baseName=moduleDef->getOutputFileBase();
1705 }
1706
1707 if (baseName.isEmpty())
1708 {
1710 "Internal inconsistency: member {} does not belong to any container!",name()
1711 );
1712 return "dummy";
1713 }
1714 else if (separateMemberPages && hasDetailedDescription())
1715 {
1716 if (getEnumScope()) // enum value, which is part of enum's documentation
1717 {
1718 baseName+="_"+getEnumScope()->anchor();
1719 }
1720 else
1721 {
1722 baseName+="_"+anchor();
1723 }
1724 }
1725 return baseName;
1726}
1727
1729{
1731 if (!ref.isEmpty())
1732 {
1733 return ref;
1734 }
1735 const NamespaceDef *nspace = getNamespaceDef();
1736 const FileDef *fileDef = getFileDef();
1737 const ClassDef *classDef = getClassDef();
1738 const ModuleDef *moduleDef = getModuleDef();
1739 const GroupDef *groupDef = getGroupDef();
1740 if (templateMaster())
1741 {
1742 return templateMaster()->getReference();
1743 }
1744 else if (groupDef)
1745 {
1746 return groupDef->getReference();
1747 }
1748 else if (classDef)
1749 {
1750 return classDef->getReference();
1751 }
1752 else if (nspace)
1753 {
1754 return nspace->getReference();
1755 }
1756 else if (moduleDef)
1757 {
1758 return moduleDef->getReference();
1759 }
1760 else if (fileDef)
1761 {
1762 return fileDef->getReference();
1763 }
1764 return "";
1765}
1766
1768{
1769 QCString result=m_anc;
1770 if (m_groupAlias) return m_groupAlias->anchor();
1771 if (m_templateMaster) return m_templateMaster->anchor();
1772 if (m_enumScope && m_enumScope!=this) // avoid recursion for C#'s public enum E { E, F }
1773 {
1774 result.prepend(m_enumScope->anchor());
1775 }
1776 if (getGroupDef())
1777 {
1778 if (m_groupMember)
1779 {
1780 result=m_groupMember->anchor();
1781 }
1782 else if (getReference().isEmpty())
1783 {
1784 result.prepend("g");
1785 }
1786 }
1787 return result;
1788}
1789
1791{
1792 AUTO_TRACE("name={}",qualifiedName());
1793 bool extractStatic = Config_getBool(EXTRACT_STATIC);
1794 bool extractPrivateVirtual = Config_getBool(EXTRACT_PRIV_VIRTUAL);
1795 m_isLinkableCached = 2; // linkable
1796 //printf("MemberDefImpl::isLinkableInProject(name=%s)\n",qPrint(name()));
1797 if (isHidden())
1798 {
1799 AUTO_TRACE_ADD("is hidden");
1801 return;
1802 }
1803 if (templateMaster())
1804 {
1805 AUTO_TRACE_ADD("has master template");
1807 return;
1808 }
1809 if (isAnonymous())
1810 {
1811 AUTO_TRACE_ADD("name invalid");
1812 m_isLinkableCached = 1; // not a valid or a dummy name
1813 return;
1814 }
1815 if (!hasDocumentation() || isReference())
1816 {
1817 AUTO_TRACE_ADD("no docs or reference");
1818 m_isLinkableCached = 1; // no documentation
1819 return;
1820 }
1821 const GroupDef *groupDef = getGroupDef();
1822 const ClassDef *classDef = getClassDef();
1823 if (groupDef && !groupDef->isLinkableInProject())
1824 {
1825 AUTO_TRACE_ADD("in not linkable group");
1826 m_isLinkableCached = 1; // group but group not linkable
1827 return;
1828 }
1829 if (!groupDef && classDef && !classDef->isLinkableInProject())
1830 {
1831 AUTO_TRACE_ADD("in not linkable class");
1832 m_isLinkableCached = 1; // in class but class not linkable
1833 return;
1834 }
1835 const NamespaceDef *nspace = getNamespaceDef();
1836 const FileDef *fileDef = getFileDef();
1837 if (!groupDef && nspace /*&& m_related==Relationship::Member*/ && !nspace->isLinkableInProject()
1838 && (fileDef==nullptr || !fileDef->isLinkableInProject()))
1839 {
1840 AUTO_TRACE_ADD("in not linkable namespace");
1841 m_isLinkableCached = 1; // in namespace but namespace not linkable
1842 return;
1843 }
1844 if (!groupDef && !nspace &&
1845 /*m_related==Relationship::Member &&*/ !classDef &&
1846 fileDef && !fileDef->isLinkableInProject())
1847 {
1848 AUTO_TRACE_ADD("in not linkable file");
1849 m_isLinkableCached = 1; // in file (and not in namespace) but file not linkable
1850 return;
1851 }
1853 !(m_prot==Protection::Private && (m_virt!=Specifier::Normal || isOverride() || isFinal()) && extractPrivateVirtual))
1854 {
1855 AUTO_TRACE_ADD("private and invisible");
1856 m_isLinkableCached = 1; // hidden due to protection
1857 return;
1858 }
1859 if (m_stat && classDef==nullptr && !extractStatic)
1860 {
1861 AUTO_TRACE_ADD("static and invisible");
1862 m_isLinkableCached = 1; // hidden due to staticness
1863 return;
1864 }
1865 AUTO_TRACE_ADD("linkable");
1866 return; // linkable!
1867}
1868
1874
1880
1886
1892
1894{
1895 if (m_isLinkableCached==0)
1896 {
1897 MemberDefImpl *that = const_cast<MemberDefImpl*>(this);
1899 }
1901 return m_isLinkableCached==2;
1902}
1903
1905{
1906 if (m_templateMaster)
1907 {
1908 return m_templateMaster->isLinkable();
1909 }
1910 else
1911 {
1912 return isLinkableInProject() || isReference();
1913 }
1914}
1915
1916
1921
1923 const ClassDef *,const NamespaceDef *,const FileDef *fd,const GroupDef *gd,const ModuleDef *mod,
1924 bool onlyText) const
1925{
1926 SrcLangExt lang = getLanguage();
1927 bool hideScopeNames = Config_getBool(HIDE_SCOPE_NAMES);
1929 QCString n = name();
1930 const ClassDef *classDef = getClassDef();
1931 const NamespaceDef *nspace = getNamespaceDef();
1932 if (!hideScopeNames)
1933 {
1934 if (m_enumScope && m_livesInsideEnum && getGroupDef()!=nullptr)
1935 {
1936 n.prepend(m_enumScope->displayName()+sep);
1937 }
1938 if (classDef && (gd || mod) && !isRelated())
1939 {
1940 n.prepend(classDef->displayName()+sep);
1941 }
1942 else if (nspace && (gd || fd || mod))
1943 {
1944 n.prepend(nspace->displayName()+sep);
1945 }
1946 }
1947
1948 if (isObjCMethod())
1949 {
1950 if (isStatic()) ol.docify("+ "); else ol.docify("- ");
1951 }
1952 if (!onlyText && (isLinkable() || hasDetailedDescription())) // write link
1953 {
1954 if (m_mtype==MemberType::EnumValue && getGroupDef()==nullptr && // enum value is not grouped
1955 getEnumScope() && getEnumScope()->getGroupDef()) // but its container is
1956 {
1957 const GroupDef *enumValGroup = getEnumScope()->getGroupDef();
1958 ol.writeObjectLink(enumValGroup->getReference(),
1959 enumValGroup->getOutputFileBase(),
1960 anchor(),n);
1961 }
1962 else
1963 {
1965 }
1966 }
1967 else // write only text
1968 {
1969 ol.startBold();
1970 ol.docify(n);
1971 ol.endBold();
1972 }
1973}
1974
1976
1977/*! If this member has an anonymous class/struct/union as its type, then
1978 * this method will return the ClassDef that describes this return type.
1979 */
1981{
1982 std::lock_guard<std::mutex> lock(g_cachedAnonymousTypeMutex);
1983 //printf("%s:getClassDefOfAnonymousType() cache=%s\n",qPrint(name()),
1984 // m_cachedAnonymousType?qPrint(m_cachedAnonymousType->name()):"<empty>");
1986
1987 QCString cname;
1988 if (getClassDef()!=nullptr)
1989 {
1990 cname=getClassDef()->name();
1991 }
1992 else if (getNamespaceDef()!=nullptr)
1993 {
1994 cname=getNamespaceDef()->name();
1995 }
1996 QCString ltype(m_type);
1997 // strip 'friend' keyword from ltype
1998 ltype.stripPrefix("friend ");
1999
2000 // search for the last anonymous scope in the member type
2001 ClassDef *annoClassDef=nullptr;
2002
2003 // match expression if it contains at least one @1 marker, e.g.
2004 // 'struct A::@1::@2::B' matches 'A::@1::@2::B' but 'struct A::B' does not match.
2005 std::string stype = ltype.str();
2006 static const reg::Ex r(R"([\w@:]*@\d+[\w@:]*)");
2007 reg::Match match;
2008 if (reg::search(stype,match,r)) // found anonymous scope in type
2009 {
2010 QCString annName = match.str();
2011
2012 // if inside a class or namespace try to prepend the scope name
2013 if (!cname.isEmpty() && annName.left(cname.length()+2)!=cname+"::")
2014 {
2015 QCString ts=stripAnonymousNamespaceScope(cname+"::"+annName);
2016 annoClassDef=getClass(ts);
2017 }
2018 // if not found yet, try without scope name
2019 if (annoClassDef==nullptr)
2020 {
2022 annoClassDef=getClass(ts);
2023 }
2024 }
2025 m_cachedAnonymousType = annoClassDef;
2026 return annoClassDef;
2027}
2028
2029/*! This methods returns TRUE iff the brief section (also known as
2030 * declaration section) is visible in the documentation.
2031 */
2033{
2034 bool extractStatic = Config_getBool(EXTRACT_STATIC);
2035 bool extractPrivateVirtual = Config_getBool(EXTRACT_PRIV_VIRTUAL);
2036 bool hideUndocMembers = Config_getBool(HIDE_UNDOC_MEMBERS);
2037 bool briefMemberDesc = Config_getBool(BRIEF_MEMBER_DESC);
2038 bool repeatBrief = Config_getBool(REPEAT_BRIEF);
2039 bool hideFriendCompounds = Config_getBool(HIDE_FRIEND_COMPOUNDS);
2040
2041 //printf("Member %s grpId=%d docs=%s file=%s args=%s\n",
2042 // qPrint(name()),
2043 // 0,"", //grpId,grpId==-1?"<none>":Doxygen::memberDocDict[grpId]->data(),
2044 // "", //qPrint(getFileDef()->name()),
2045 // argsString());
2046
2047 bool hasDocs = hasDocumentation();
2048
2049 // only include static members with file/namespace scope if
2050 // explicitly enabled in the config file
2051 bool visibleIfStatic = !(getClassDef()==nullptr &&
2052 isStatic() &&
2053 !extractStatic
2054 );
2055
2056 // only include members is the are documented or
2057 // HIDE_UNDOC_MEMBERS is NO in the config file
2058 bool visibleIfDocumented = (!hideUndocMembers ||
2059 hasDocs ||
2061 );
2062
2063 // hide members with no detailed description and brief descriptions
2064 // explicitly disabled.
2065 bool visibleIfEnabled = !(hideUndocMembers &&
2066 documentation().isEmpty() &&
2067 !briefMemberDesc &&
2068 !repeatBrief
2069 );
2070
2071 // Hide friend (class|struct|union) declarations if HIDE_FRIEND_COMPOUNDS is true
2072 bool visibleIfFriendCompound = !(hideFriendCompounds &&
2073 isFriend() /*&&
2074 (m_type=="friend class" ||
2075 m_type=="friend struct" ||
2076 m_type=="friend union"
2077 )*/
2078 );
2079
2080 // only include members that are non-private unless EXTRACT_PRIVATE is
2081 // set to YES or the member is part of a group. And as a special case,
2082 // private *documented* virtual members are shown if EXTRACT_PRIV_VIRTUAL
2083 // is set to YES
2084 bool visibleIfPrivate = (protectionLevelVisible(protection()) ||
2086 (m_prot==Protection::Private &&
2087 (m_virt!=Specifier::Normal || isOverride() || isFinal()) && extractPrivateVirtual && hasDocs)
2088 );
2089
2090 // hide member if it overrides a member in a superclass and has no
2091 // documentation of its own
2092 //bool visibleIfDocVirtual = !reimplements() ||
2093 // !Config_getBool(INHERIT_DOCS) ||
2094 // hasDocs;
2095
2096 // true if this member is a constructor or destructor
2097 bool cOrDTor = isConstructor() || isDestructor();
2098
2099 // hide default constructors or destructors (no args) without
2100 // documentation
2101 bool visibleIfNotDefaultCDTor = !(cOrDTor &&
2102 (m_defArgList.empty() ||
2103 m_defArgList.front().type == "void"
2104 ) &&
2105 !hasDocs
2106 );
2107
2108
2109 //printf("visibleIfStatic=%d visibleIfDocumented=%d visibleIfEnabled=%d "
2110 // "visibleIfPrivate=%d visibleIfNotDefaultCDTor=%d "
2111 // "visibleIfFriendCompound=%d !annScope=%d\n",
2112 // visibleIfStatic,visibleIfDocumented,
2113 // visibleIfEnabled,visibleIfPrivate,visibleIfNotDefaultCDTor,
2114 // visibleIfFriendCompound,!m_annScope);
2115
2116 bool visible = visibleIfStatic && visibleIfDocumented &&
2117 visibleIfEnabled && visibleIfPrivate &&
2118 /*visibleIfDocVirtual &&*/ visibleIfNotDefaultCDTor &&
2119 visibleIfFriendCompound &&
2120 !m_annScope && !isHidden();
2121 //printf("MemberDefImpl::isBriefSectionVisible() %d\n",visible);
2122 return visible;
2123}
2124
2126{
2127 SrcLangExt lang = getLanguage();
2128 QCString ltype(m_type);
2129 if (lang==SrcLangExt::Cpp && isEnumerate() && isStrong())
2130 {
2131 if (isEnumStruct())
2132 {
2133 ltype+=" struct";
2134 }
2135 else
2136 {
2137 ltype+=" class";
2138 }
2139 }
2140 if (isTypedef() && getLanguage() != SrcLangExt::Slice)
2141 {
2142 ltype.prepend("typedef ");
2143 }
2144 if (isTypeAlias())
2145 {
2146 ltype="using";
2147 }
2148 // strip 'friend' keyword from ltype
2149 ltype.stripPrefix("friend ");
2150 if (ltype=="@") // rename type from enum values
2151 {
2152 ltype="";
2153 }
2154 else
2155 {
2156 if (isObjCMethod())
2157 {
2158 ltype.prepend("(");
2159 ltype.append(")");
2160 }
2161 }
2162 return ltype;
2163}
2164
2166 const ArgumentList &al, bool writeReqClause) const
2167{
2168 ol.docify("template<");
2169 for (auto it = al.begin(); it!=al.end();)
2170 {
2171 Argument a = *it;
2173 def, // scope
2174 getFileDef(), // fileScope
2175 this, // self
2176 a.type, // text
2177 FALSE // autoBreak
2178 );
2179 if (!a.name.isEmpty())
2180 {
2181 ol.docify(" ");
2182 ol.docify(a.name);
2183 }
2184 if (!a.defval.isEmpty())
2185 {
2186 ol.docify(" = ");
2187 ol.docify(a.defval);
2188 }
2189 ++it;
2190 if (it!=al.end()) ol.docify(", ");
2191 }
2192 ol.docify("> ");
2193 if (writeReqClause && !m_requiresClause.isEmpty())
2194 {
2195 ol.lineBreak();
2196 ol.docify("requires ");
2198 def, // scope
2199 getFileDef(), // fileScope
2200 this, // self
2201 m_requiresClause, // text
2202 FALSE // autoBreak
2203 );
2204 }
2205}
2206
2208{
2209 if (exception.isEmpty()) return args; // no exception, nothing to combine args
2210 int pos = args.findRev(')');
2211 int eqPos = pos!=-1 ? args.find('=',pos) : -1; // look for '=' in '(args) = something'
2212 if (eqPos==-1) return args+" "+exception; // append exception at the end
2213 return args.left(eqPos)+" "+exception+" "+args.mid(eqPos); // insert exception before =
2214}
2215
2217{
2218 return !m_bitfields.isEmpty() && name().startsWith("__pad"); // anonymous bitfield
2219}
2220
2222 const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,const ModuleDef *mod,
2223 bool inGroup, int indentLevel, const ClassDef *inheritedFrom,const QCString &inheritId) const
2224{
2225 //printf("> %s MemberDefImpl::writeDeclaration() inGroup=%d inheritId=%s\n",qPrint(qualifiedName()),inGroup,qPrint(inheritId));
2226
2227 // hide enum value, since they appear already as part of the enum, unless they
2228 // are explicitly grouped.
2229 if (!inGroup && m_mtype==MemberType::EnumValue) return;
2230
2231 const Definition *d=nullptr;
2232 ASSERT (cd!=nullptr || nd!=nullptr || fd!=nullptr || gd!=nullptr || mod!=nullptr); // member should belong to something
2233 if (cd) d=cd;
2234 else if (nd) d=nd;
2235 else if (fd) d=fd;
2236 else d=gd;
2237 if (d==gd || d==mod) // see bug 753608
2238 {
2239 if (getClassDef()) d = getClassDef();
2240 else if (getNamespaceDef()) d = getNamespaceDef();
2241 else if (getFileDef()) d = getFileDef();
2242 }
2243 else if (d==fd) // see issue #9850, namespace member can be shown in file scope as well
2244 {
2245 if (getNamespaceDef()) d = getNamespaceDef();
2246 }
2247 if (d==nullptr)
2248 {
2249 err("No context could be derived for member '{}'\n",name());
2250 return; // should not happen
2251 }
2252
2253 QCString cname = d->name();
2254 QCString cdname = d->displayName();
2255 QCString cfname = getOutputFileBase();
2256
2257 // search for the last anonymous scope in the member type
2258 ClassDef *annoClassDef=getClassDefOfAnonymousType();
2259
2261
2262 // start a new member declaration
2263 bool isAnonType = annoClassDef || m_annMemb || m_annEnumType;
2267 ol.startMemberItem(annoClassDef ? QCString() : anchor(), anonType, inheritId);
2268
2269
2270 // If there is no detailed description we need to write the anchor here.
2271 bool detailsVisible = hasDetailedDescription();
2272 bool writeAnchor = (inGroup || getGroupDef()==nullptr) && // only write anchors for member that have no details and are
2273 !detailsVisible && !m_annMemb && // rendered inside the group page or are not grouped at all
2274 inheritId.isEmpty();
2275
2276 if (writeAnchor)
2277 {
2278 QCString doxyArgs=argsString();
2279 QCString doxyName=name();
2280 if (!cname.isEmpty())
2281 {
2283 }
2284 ol.startDoxyAnchor(cfname,cname,anchor(),doxyName,doxyArgs);
2285 ol.addLabel(cfname,anchor());
2286 }
2287
2288 if (!detailsVisible)
2289 {
2290 ol.pushGeneratorState();
2294 ol.docify("\n");
2295 ol.popGeneratorState();
2296 }
2297
2298 if (annoClassDef || m_annMemb)
2299 {
2300 for (int j=0;j<indentLevel;j++)
2301 {
2303 }
2304 }
2305
2306 // *** write template lists
2307 if (m_tArgList.hasParameters() && getLanguage()==SrcLangExt::Cpp)
2308 {
2309 if (!isAnonType) ol.startMemberTemplateParams();
2311 if (!isAnonType) ol.endMemberTemplateParams(anchor(),inheritId);
2312 }
2313
2314
2315 // *** write type
2316 QCString ltype(m_type);
2317 if (isTypedef() && getLanguage() != SrcLangExt::Slice)
2318 {
2319 ltype.prepend("typedef ");
2320 }
2321 if (isTypeAlias())
2322 {
2323 ltype="using";
2324 }
2325 // strip 'friend' keyword from ltype
2326 ltype.stripPrefix("friend ");
2327 static const reg::Ex r(R"(@\d+)");
2328 reg::Match match;
2329 std::string stype = ltype.str();
2330 bool endAnonScopeNeeded=FALSE;
2331 if (reg::search(stype,match,r)) // member has an anonymous type
2332 {
2333 int i = static_cast<int>(match.position());
2334 int l = static_cast<int>(match.length());
2335 //printf("annoClassDef=%p annMemb=%p scopeName='%s' anonymous='%s'\n",
2336 // annoClassDef,annMemb,qPrint(cname),qPrint(ltype.mid(i,l)));
2337
2338 if (annoClassDef) // type is an anonymous compound
2339 {
2340 int ir=i+l;
2341 //printf("<<<<<<<<<<<<<<\n");
2342 ol.startAnonTypeScope(indentLevel);
2343 if (ltype.startsWith("typedef")) ol.docify("typedef ");
2344 annoClassDef->writeDeclaration(ol,m_annMemb,inGroup,indentLevel+1,inheritedFrom,inheritId);
2345 //printf(">>>>>>>>>>>>>> startMemberItem(2)\n");
2347 ol.startMemberItem(anchor(),anonType,inheritId);
2348 for (int j=0;j< indentLevel;j++)
2349 {
2351 }
2352 QCString varName=ltype.right(ltype.length()-ir).stripWhiteSpace();
2353 //printf(">>>>>> ltype='%s' varName='%s'\n",qPrint(ltype),qPrint(varName));
2354 ol.docify("}");
2355 if (varName.isEmpty() && isAnonymous())
2356 {
2357 ol.docify(";");
2358 }
2359 else if (!varName.isEmpty() && (varName.at(0)=='*' || varName.at(0)=='&'))
2360 {
2361 ol.docify(" ");
2362 ol.docify(varName);
2363 }
2364 endAnonScopeNeeded=TRUE;
2365 }
2366 else
2367 {
2368 if (getAnonymousEnumType()) // type is an anonymous enum
2369 {
2371 d, // scope
2372 getBodyDef(), // fileScope
2373 this, // self
2374 ltype.left(i), // text
2375 FALSE // autoBreak
2376 );
2377 getAnonymousEnumType()->writeEnumDeclaration(ol,cd,nd,fd,gd,mod);
2378 //ol+=*getAnonymousEnumType()->enumDecl();
2379 linkifyText(TextGeneratorOLImpl(ol),d,getFileDef(),this,ltype.right(ltype.length()-i-l),TRUE);
2380 }
2381 else
2382 {
2383 ltype = ltype.left(i) + " { ... } " + removeAnonymousScopes(ltype.right(ltype.length()-i-l));
2385 d, // scope
2386 getBodyDef(), // fileScope
2387 this, // self
2388 ltype, // text
2389 FALSE // autoBreak
2390 );
2391 }
2392 }
2393 }
2394 else if (ltype=="@") // rename type from enum values
2395 {
2396 ltype="";
2397 }
2398 else
2399 {
2400 if (isObjCMethod())
2401 {
2402 ltype.prepend("(");
2403 ltype.append(")");
2404 }
2406 d, // scope
2407 getBodyDef(), // fileScope
2408 this, // self
2409 ltype, // text
2410 FALSE // autoBreak
2411 );
2412 }
2413 bool htmlOn = ol.isEnabled(OutputType::Html);
2414 if (htmlOn && !ltype.isEmpty())
2415 {
2417 }
2418 if (!ltype.isEmpty()) ol.docify(" ");
2419 if (htmlOn)
2420 {
2422 }
2423
2424 if (m_annMemb)
2425 {
2426 ol.pushGeneratorState();
2429 ol.popGeneratorState();
2430 }
2431 else
2432 {
2433 ol.insertMemberAlign(m_tArgList.hasParameters());
2434 }
2435
2436 // *** write name
2437 if (!isAnonymous() && !_isAnonymousBitField()) // hide anonymous stuff
2438 {
2439 bool extractPrivateVirtual = Config_getBool(EXTRACT_PRIV_VIRTUAL);
2440 bool extractStatic = Config_getBool(EXTRACT_STATIC);
2442 bool visibleIfPrivate = (protectionLevelVisible(protection()) ||
2444 (m_prot==Protection::Private &&
2445 (m_virt!=Specifier::Normal || isOverride() || isFinal()) &&
2446 extractPrivateVirtual && hasDocumentation()
2447 ));
2448 //printf("Member name=`%s gd=%p md->groupDef=%p inGroup=%d isLinkable()=%d hasDocumentation=%d\n",qPrint(name()),gd,getGroupDef(),inGroup,isLinkable(),hasDocumentation());
2449 if (!name().isEmpty() && // name valid
2450 (hasDetailedDescription() || isReference()) && // has docs
2451 visibleIfPrivate &&
2452 !(isStatic() && getClassDef()==nullptr && !extractStatic) // hidden due to static-ness
2453 )
2454 {
2455 if (annMemb)
2456 {
2457 //printf("anchor=%s ann_anchor=%s\n",anchor(),annMemb->anchor());
2458 annMemb->writeLink(ol,
2459 annMemb->getClassDef(),
2460 annMemb->getNamespaceDef(),
2461 annMemb->getFileDef(),
2462 annMemb->getGroupDef(),
2463 annMemb->getModuleDef());
2464 }
2465 else
2466 {
2467 //printf("writeLink %s->%d\n",qPrint(name),hasDocumentation());
2468 const ClassDef *rcd = cd;
2469 if (isReference() && getClassDef()) rcd = getClassDef();
2470 writeLink(ol,rcd,nd,fd,gd,mod);
2471 }
2472 }
2473 else if (isDocumentedFriendClass())
2474 // if the member is an undocumented friend declaration for some class,
2475 // then maybe we can link to the class
2476 {
2477 writeLink(ol,getClass(name()),nullptr,nullptr,nullptr,nullptr);
2478 }
2479 else
2480 // there is a brief member description and brief member
2481 // descriptions are enabled or there is no detailed description.
2482 {
2483 const ClassDef *rcd = cd;
2484 if (isReference() && getClassDef()) rcd = getClassDef();
2485 writeLink(ol,rcd,nd,fd,gd,mod,TRUE);
2486 }
2487 }
2488
2489 // *** write arguments
2490 if (!argsString().isEmpty() && !isObjCMethod())
2491 {
2492 if (!isDefine() && !isTypedef()) ol.writeString(" ");
2494 d, // scope
2495 getBodyDef(), // fileScope
2496 this, // self
2497 isDefine() ?
2498 substitute(argsString(),",",", ") :
2499 isTypedef() ?
2500 substitute(argsString(),")(",") (") :
2502 m_annMemb!=nullptr, // autoBreak
2503 TRUE, // external
2504 FALSE, // keepSpaces
2505 indentLevel
2506 );
2507 }
2508
2509 // *** write bitfields
2510 if (!m_bitfields.isEmpty()) // add bitfields
2511 {
2513 }
2514 else if (hasOneLineInitializer()
2515 //!init.isEmpty() && initLines==0 && // one line initializer
2516 //((maxInitLines>0 && userInitLines==-1) || userInitLines>0) // enabled by default or explicitly
2517 ) // add initializer
2518 {
2519 if (isTypeAlias()) // using statement
2520 {
2521 ol.writeString(" = ");
2522 linkifyText(TextGeneratorOLImpl(ol),d,getBodyDef(),this,m_initializer.simplifyWhiteSpace());
2523 }
2524 else if (!isDefine())
2525 {
2526 //ol.writeString(" = ");
2527 ol.writeString(" ");
2528 linkifyText(TextGeneratorOLImpl(ol),d,getBodyDef(),this,m_initializer.simplifyWhiteSpace());
2529 }
2530 else
2531 {
2534 }
2535 }
2536
2537
2539 {
2540 ol.startTypewriter();
2541 ol.docify(" [implementation]");
2542 ol.endTypewriter();
2543 }
2544
2545 bool extractPrivate = Config_getBool(EXTRACT_PRIVATE);
2546
2547 if (isProperty() && (isSettable() || isGettable() ||
2550 {
2551 ol.writeLatexSpacing();
2552 ol.startTypewriter();
2553 ol.docify(" [");
2554 StringVector sl;
2555
2556 if (isGettable()) sl.emplace_back("get");
2557 if (isProtectedGettable()) sl.emplace_back("protected get");
2558 if (isSettable()) sl.emplace_back("set");
2559 if (isProtectedSettable()) sl.emplace_back("protected set");
2560 if (extractPrivate)
2561 {
2562 if (isPrivateGettable()) sl.emplace_back("private get");
2563 if (isPrivateSettable()) sl.emplace_back("private set");
2564 }
2565 bool first=true;
2566 for (const auto &s : sl)
2567 {
2568 if (!first)
2569 {
2570 ol.docify(", ");
2571 }
2572 first=false;
2573 ol.docify(s);
2574 }
2575 ol.docify("]");
2576 ol.endTypewriter();
2577 }
2578
2579 if (isEvent() && (isAddable() || isRemovable() || isRaisable()))
2580 {
2581 ol.writeLatexSpacing();
2582 ol.startTypewriter();
2583 ol.docify(" [");
2584 StringVector sl;
2585 if (isAddable()) sl.emplace_back("add");
2586 if (isRemovable()) sl.emplace_back("remove");
2587 if (isRaisable()) sl.emplace_back("raise");
2588 bool first=true;
2589 for (const auto &s : sl)
2590 {
2591 if (!first)
2592 {
2593 ol.docify(", ");
2594 }
2595 first=false;
2596 ol.docify(s);
2597 }
2598 ol.docify("]");
2599 ol.endTypewriter();
2600 }
2601
2602 if (writeAnchor)
2603 {
2604 ol.endDoxyAnchor(cfname,anchor());
2605 }
2606
2607 //printf("endMember %s annoClassDef=%p annEnumType=%p\n",
2608 // qPrint(name()),annoClassDef,annEnumType);
2609 ol.endMemberItem(anonType);
2610 if (endAnonScopeNeeded)
2611 {
2612 ol.endAnonTypeScope(indentLevel);
2613 }
2614
2615 // write brief description
2616 if (!briefDescription().isEmpty() &&
2617 Config_getBool(BRIEF_MEMBER_DESC)
2618 )
2619 {
2620 auto parser { createDocParser() };
2621 auto ast { validatingParseDoc(*parser.get(),
2622 briefFile(),
2623 briefLine(),
2625 this,
2627 DocOptions()
2628 .setIndexWords(inheritedFrom==nullptr)
2629 .setSingleLine(true))
2630 };
2631 if (!ast->isEmpty())
2632 {
2633 ol.startMemberDescription(anchor(),inheritId);
2634 ol.writeDoc(ast.get(),getOuterScope()?getOuterScope():d,this);
2635 if (detailsVisible) // add More.. link only when both brief and details are visible
2636 {
2637 if (!isAnonymous()) // hide anonymous stuff
2638 {
2639 ol.pushGeneratorState();
2641 ol.docify(" ");
2643 if (annMemb)
2644 {
2645 ol.startTextLink(annMemb->getOutputFileBase(),annMemb->anchor());
2646 ol.parseText(theTranslator->trMore());
2647 ol.endTextLink();
2648 }
2649 ol.popGeneratorState();
2650 }
2651 }
2652 // for RTF we need to add an extra empty paragraph
2653 ol.pushGeneratorState();
2655 ol.startParagraph();
2656 ol.endParagraph();
2657 ol.popGeneratorState();
2659 }
2660 }
2661
2662 ol.endMemberDeclaration(anchor(),inheritId);
2663
2665 //printf("< %s MemberDefImpl::writeDeclaration() inGroup=%d\n",qPrint(qualifiedName()),inGroup);
2666}
2667
2669
2671{
2672 std::lock_guard<std::mutex> lock(g_hasDetailedDescriptionMutex);
2673 //printf(">hasDetailedDescription(cached=%d)\n",m_hasDetailedDescriptionCached);
2675 {
2676 bool extractAll = Config_getBool(EXTRACT_ALL);
2677 bool alwaysDetailedSec = Config_getBool(ALWAYS_DETAILED_SEC);
2678 bool repeatBrief = Config_getBool(REPEAT_BRIEF);
2679 bool briefMemberDesc = Config_getBool(BRIEF_MEMBER_DESC);
2680 bool hideUndocMembers = Config_getBool(HIDE_UNDOC_MEMBERS);
2681 bool extractStatic = Config_getBool(EXTRACT_STATIC);
2682 bool extractPrivateVirtual = Config_getBool(EXTRACT_PRIV_VIRTUAL);
2683 bool inlineSources = hasInlineSource();
2684
2685 // the member has detailed documentation because the user added some comments
2686 bool docFilter =
2687 // extract all is enabled
2688 extractAll ||
2689 // has detailed docs
2690 !documentation().isEmpty() ||
2691 // has inbody docs
2693 // is an enum with values that are documented
2695 // is documented enum value
2696 (m_mtype==MemberType::EnumValue && !briefDescription().isEmpty()) ||
2697 // has brief description that is part of the detailed description
2698 (!briefDescription().isEmpty() && // has brief docs
2699 (alwaysDetailedSec && // they are visible in
2700 (repeatBrief || // detailed section or
2701 !briefMemberDesc // they are explicitly not
2702 ) // shown in brief section
2703 )
2704 ) ||
2705 // has one or more documented arguments
2707 m_templateMaster->argumentList().hasDocumentation() :
2708 m_defArgList.hasDocumentation()) ||
2710 m_templateMaster->templateArguments().hasTemplateDocumentation() :
2711 m_tArgList.hasTemplateDocumentation()) ||
2712 // user-specified qualifiers
2713 !m_qualifiers.empty();
2714
2715 // generate function guard
2716 // ================== =======
2717 // _writeGroupInclude -> ignored in calculation
2718 // multiLineInitializer() -> hasMultiLineInitializer()
2719 // _writeReimplements -> _isReimplements()
2720 // _writeReimplementedBy -> _countReimplementedBy()>0
2721 // _writeExamples -> hasExamples()
2722 // _writeTypeConstraints -> m_typeConstraints.hasParameters()
2723 // writeSourceDef -> !getSourceFileBase().isEmpty();
2724 // writeInlineCode -> hasInlineSource() && hasSources()
2725 // writeSourceRefs -> hasReferencesRelation() && hasSourceRefs()
2726 // writeSourceReffedBy -> hasReferencedByRelation() && hasSourceReffedBy()
2727 // _writeCallGraph -> _hasVisibleCallGraph()
2728 // _writeCallerGraph -> _hasVisibleCallerGraph()
2729
2730 // the member has detailed documentation because there is some generated info
2731 bool docInfo =
2732 // has a multi-line initialization block
2734 // reimplements / reimplemented by
2736 // examples
2737 hasExamples() ||
2738 // type constraints
2739 m_typeConstraints.hasParameters() ||
2740 // has source definition
2742 // has inline sources
2743 (inlineSources && hasSources()) ||
2744 // has references
2747 // call graph
2749 // caller graph
2751 // requirement references
2753
2754 if (!hideUndocMembers) // if HIDE_UNDOC_MEMBERS is NO we also show the detailed section
2755 // if there is only some generated info
2756 {
2757 docFilter = docFilter || docInfo;
2758 }
2759
2760 // this is not a global static or global statics should be extracted
2761 bool staticFilter = getClassDef()!=nullptr || !isStatic() || extractStatic;
2762
2763 // a module does not contain details for members, so either the namespace or file should be linkable
2764 bool moduleFilter = getModuleDef()==nullptr || (getFileDef() && getFileDef()->isLinkable()) ||
2766
2767 // only include members that are non-private unless EXTRACT_PRIVATE is
2768 // set to YES or the member is part of a group
2769 bool privateFilter = protectionLevelVisible(protection()) || m_mtype==MemberType::Friend ||
2770 (m_prot==Protection::Private && (m_virt!=Specifier::Normal || isOverride() || isFinal()) && extractPrivateVirtual);
2771
2772 // hide friend (class|struct|union) member if HIDE_FRIEND_COMPOUNDS
2773 // is true
2774 bool friendCompoundFilter = !(Config_getBool(HIDE_FRIEND_COMPOUNDS) && isFriend());
2775
2777 (docFilter && staticFilter && moduleFilter && privateFilter && friendCompoundFilter && !isHidden());
2778 //printf("docFilter=%d docInfo=%d staticFilter=%d privateFilter=%d friendCompoundFilter=%d !isHidden()=%d",
2779 // docFilter,docInfo,staticFilter,privateFilter,friendCompoundFilter,!isHidden());
2781 }
2782 //printf("<hasDetailedDescription(cached=%d)\n",m_hasDetailedDescriptionCached);
2784}
2785
2787{
2788 bool separateMemPages = Config_getBool(SEPARATE_MEMBER_PAGES);
2789 bool inlineSimpleStructs = Config_getBool(INLINE_SIMPLE_STRUCTS);
2790 bool hideUndocMembers = Config_getBool(HIDE_UNDOC_MEMBERS);
2791 bool groupFilter = getGroupDef()==nullptr || container==MemberListContainer::Group || separateMemPages;
2792 bool fileFilter = getNamespaceDef()==nullptr || !getNamespaceDef()->isLinkable() || container!=MemberListContainer::File;
2793 bool simpleFilter = (hasBriefDescription() || !hideUndocMembers) && inlineSimpleStructs &&
2794 getClassDef()!=nullptr && getClassDef()->isSimple();
2795
2796 bool visible = hasDetailedDescription() && groupFilter && fileFilter &&
2797 !isReference();
2798 bool result = visible || simpleFilter;
2799 //printf("%s::isDetailedSectionVisible: %d groupFilter=%d fileFilter=%d\n",
2800 // qPrint(name()),result,groupFilter,fileFilter);
2801 return result;
2802}
2803
2805{
2806 StringVector sl;
2807 bool inlineInfo = Config_getBool(INLINE_INFO);
2808
2809 Specifier lvirt=virtualness();
2810 if ((!isObjCMethod() || isOptional() || isRequired()) &&
2811 (protection()!=Protection::Public || lvirt!=Specifier::Normal ||
2812 isFriend() || isRelated() ||
2813 (isInline() && inlineInfo) ||
2814 isSignal() || isSlot() ||
2815 isStatic() || isExternal() ||
2816 isExported() ||
2817 (getClassDef() && getClassDef()!=container && container->definitionType()==TypeClass) ||
2818 TypeSpecifier(m_memSpec).setInline(false)!=TypeSpecifier()
2819 )
2820 )
2821 {
2822 // write the member specifier list
2823 //ol.writeLatexSpacing();
2824 //ol.startTypewriter();
2825 //ol.docify(" [");
2826 SrcLangExt lang = getLanguage();
2827 bool optVhdl = lang==SrcLangExt::VHDL;
2828 bool extractPrivate = Config_getBool(EXTRACT_PRIVATE);
2829 if (optVhdl)
2830 {
2831 sl.push_back(theTranslator->trVhdlType(getVhdlSpecifiers(),TRUE).str());
2832 }
2833 else
2834 {
2835 if (isFriend()) sl.emplace_back("friend");
2836 else if (isRelated()) sl.emplace_back("related");
2837 else
2838 {
2839 if (isExternal()) sl.emplace_back("extern");
2840 if (inlineInfo && isInline()) sl.emplace_back("inline");
2841 if (isExplicit()) sl.emplace_back("explicit");
2842 if (isMutable()) sl.emplace_back("mutable");
2843 if (isThreadLocal()) sl.emplace_back("thread_local");
2844 if (isStatic()) sl.emplace_back("static");
2845 if (isGettable()) sl.emplace_back("get");
2846 if (isProtectedGettable()) sl.emplace_back("protected get");
2847 if (isSettable()) sl.emplace_back("set");
2848 if (isProtectedSettable()) sl.emplace_back("protected set");
2849 if (extractPrivate)
2850 {
2851 if (isPrivateGettable()) sl.emplace_back("private get");
2852 if (isPrivateSettable()) sl.emplace_back("private set");
2853 }
2854 if (isNoDiscard()) sl.emplace_back("nodiscard");
2855 if (isConstExpr()) sl.emplace_back("constexpr");
2856 if (isConstEval()) sl.emplace_back("consteval");
2857 if (isConstInit()) sl.emplace_back("constinit");
2858 if (isAddable()) sl.emplace_back("add");
2859 if (!isUNOProperty() && isRemovable()) sl.emplace_back("remove");
2860 if (isRaisable()) sl.emplace_back("raise");
2861 if (isReadable()) sl.emplace_back("read");
2862 if (isWritable()) sl.emplace_back("write");
2863 if (isFinal()) sl.emplace_back("final");
2864 if (isAbstract()) sl.emplace_back("abstract");
2865 if (isOverride()) sl.emplace_back("override");
2866 if (isInitonly()) sl.emplace_back("initonly");
2867 if (isSealed()) sl.emplace_back("sealed");
2868 if (isNew()) sl.emplace_back("new");
2869 if (isOptional()) sl.emplace_back("optional");
2870 if (isRequired()) sl.emplace_back("required");
2871 if (isExported()) sl.emplace_back("export");
2872
2873 if (isNonAtomic()) sl.emplace_back("nonatomic");
2874 else if (isObjCProperty()) sl.emplace_back("atomic");
2875
2876 // mutual exclusive Objective 2.0 property attributes
2877 if (isAssign()) sl.emplace_back("assign");
2878 else if (isCopy()) sl.emplace_back("copy");
2879 else if (isRetain()) sl.emplace_back("retain");
2880 else if (isWeak()) sl.emplace_back("weak");
2881 else if (lang!=SrcLangExt::CSharp && isStrong()) sl.emplace_back("strong");
2882 else if (isUnretained()) sl.emplace_back("unsafe_unretained");
2883
2884 if (!isObjCMethod())
2885 {
2886 if (protection()==Protection::Protected) sl.emplace_back("protected");
2887 else if (protection()==Protection::Private) sl.emplace_back("private");
2888 else if (protection()==Protection::Package) sl.emplace_back("package");
2889
2890 if (lvirt==Specifier::Virtual) sl.emplace_back("virtual");
2891 else if (lvirt==Specifier::Pure) sl.emplace_back("pure virtual");
2892 if (isSignal()) sl.emplace_back("signal");
2893 if (isSlot()) sl.emplace_back("slot");
2894 if (isDefault()) sl.emplace_back("default");
2895 if (isDelete()) sl.emplace_back("delete");
2896 if (isNoExcept()) sl.emplace_back("noexcept");
2897 if (isAttribute()) sl.emplace_back("attribute");
2898 if (isUNOProperty()) sl.emplace_back("property");
2899 if (isReadonly()) sl.emplace_back("readonly");
2900 if (isBound()) sl.emplace_back("bound");
2901 if (isUNOProperty() && isRemovable()) sl.emplace_back("removable");
2902 if (isConstrained()) sl.emplace_back("constrained");
2903 if (isTransient()) sl.emplace_back("transient");
2904 if (isMaybeVoid()) sl.emplace_back("maybevoid");
2905 if (isMaybeDefault()) sl.emplace_back("maybedefault");
2906 if (isMaybeAmbiguous()) sl.emplace_back("maybeambiguous");
2907 if (isPublished()) sl.emplace_back("published"); // enum
2908 }
2910 {
2911 sl.emplace_back("implementation");
2912 }
2913 }
2914 if (getClassDef() &&
2915 container->definitionType()==TypeClass &&
2916 getClassDef()!=container &&
2917 !isRelated()
2918 )
2919 {
2920 sl.emplace_back("inherited");
2921 }
2922 }
2923 }
2924 else if (isObjCMethod() && isImplementation())
2925 {
2926 sl.emplace_back("implementation");
2927 }
2928
2929 for (const auto &sx : m_qualifiers)
2930 {
2931 bool alreadyAdded = std::find(sl.begin(), sl.end(), sx) != sl.end();
2932 if (!alreadyAdded)
2933 {
2934 sl.push_back(sx);
2935 }
2936 }
2937
2938 return sl;
2939}
2940
2942{
2943 // write call graph
2945 {
2946 DotCallGraph callGraph(this,FALSE);
2947 if (callGraph.isTooBig())
2948 {
2949 warn_uncond("Call graph for '{}' not generated, too many nodes ({}), threshold is {}. Consider increasing DOT_GRAPH_MAX_NODES.\n",
2950 qualifiedName(), callGraph.numNodes(), Config_getInt(DOT_GRAPH_MAX_NODES));
2951 }
2952 else if (!callGraph.isTrivial())
2953 {
2954 msg("Generating call graph for function {}\n",qualifiedName());
2956 ol.startCallGraph();
2957 ol.parseText(theTranslator->trCallGraph());
2958 ol.endCallGraph(callGraph);
2959 ol.enableAll();
2960 }
2961 }
2962}
2963
2965{
2967 {
2968 DotCallGraph callerGraph(this, TRUE);
2969 if (callerGraph.isTooBig())
2970 {
2971 warn_uncond("Caller graph for '{}' not generated, too many nodes ({}), threshold is {}. Consider increasing DOT_GRAPH_MAX_NODES.\n",
2972 qualifiedName(), callerGraph.numNodes(), Config_getInt(DOT_GRAPH_MAX_NODES));
2973 }
2974 else if (!callerGraph.isTrivial())
2975 {
2976 msg("Generating caller graph for function {}\n",qualifiedName());
2978 ol.startCallGraph();
2979 ol.parseText(theTranslator->trCallerGraph());
2980 ol.endCallGraph(callerGraph);
2981 ol.enableAll();
2982 }
2983 }
2984}
2985
2987{
2988 const MemberDef *bmd=reimplements();
2989 const ClassDef *bcd=nullptr;
2990 if (bmd && (bcd=bmd->getClassDef()))
2991 {
2992 // write class that contains a member that is reimplemented by this one
2993 if (bcd->isLinkable())
2994 {
2995 return true;
2996 }
2997 }
2998 return false;
2999}
3001{
3002 const MemberDef *bmd=reimplements();
3003 const ClassDef *bcd=nullptr;
3004 if (bmd && (bcd=bmd->getClassDef()))
3005 {
3006 // write class that contains a member that is reimplemented by this one
3007 if (bcd->isLinkable())
3008 {
3009 ol.startParagraph();
3010 QCString reimplFromLine;
3011 if (bmd->virtualness()!=Specifier::Pure && bcd->compoundType()!=ClassDef::Interface)
3012 {
3013 reimplFromLine = theTranslator->trReimplementedFromList(1);
3014 }
3015 else
3016 {
3017 reimplFromLine = theTranslator->trImplementedFromList(1);
3018 }
3019 int markerPos = reimplFromLine.find("@0");
3020 if (markerPos!=-1) // should always pass this.
3021 {
3022 ol.parseText(reimplFromLine.left(markerPos)); //text left from marker
3023 if (bmd->isLinkable()) // replace marker with link
3024 {
3025 //Definition *bd=bmd->group;
3026 //if (bd==0) bd=bcd;
3028 bmd->anchor(),bcd->displayName());
3029
3030 //ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(),
3031 // bmd->anchor(),bcd->name());
3032 if ( bmd->isLinkableInProject() )
3033 {
3034 writePageRef(ol,bmd->getOutputFileBase(),bmd->anchor());
3035 }
3036 }
3037 else
3038 {
3040 QCString(),bcd->displayName());
3041 if (bcd->isLinkableInProject()/* && !Config_getBool(PDF_HYPERLINKS)*/ )
3042 {
3043 writePageRef(ol,bcd->getOutputFileBase(),bcd->anchor());
3044 }
3045 }
3046 ol.parseText(reimplFromLine.right(
3047 reimplFromLine.length()-markerPos-2)); // text right from marker
3048
3049 }
3050 else
3051 {
3052 err("translation error: no marker in trReimplementsFromList()\n");
3053 }
3054 ol.endParagraph();
3055 }
3056 }
3057}
3058
3060{
3061 const MemberVector &bml=reimplementedBy();
3062 size_t count=0;
3063 for (const auto &bmd : bml)
3064 {
3065 const ClassDef *bcd=bmd->getClassDef();
3066 // count the members that directly inherit from md and for
3067 // which the member and class are visible in the docs.
3068 if ( bcd && bmd->isLinkable() && bcd->isLinkable() )
3069 {
3070 count++;
3071 }
3072 }
3073 return count;
3074}
3075
3077{
3078 const MemberVector &bml=reimplementedBy();
3079 size_t count = _countReimplementedBy();
3080 if (count>0)
3081 {
3082 auto replaceFunc = [&bml,&ol](size_t entryIndex)
3083 {
3084 size_t cnt=0;
3085 auto it = bml.begin();
3086 // find the entryIndex-th documented entry in the inheritance list.
3087 const MemberDef *bmd = nullptr;
3088 const ClassDef *bcd = nullptr;
3089 while (it!=bml.end())
3090 {
3091 bmd = *it;
3092 bcd = bmd->getClassDef();
3093 if ( bmd->isLinkable() && bcd->isLinkable())
3094 {
3095 if (cnt==entryIndex) break;
3096 cnt++;
3097 }
3098 ++it;
3099 }
3100
3101 if (bcd && bmd) // write link for marker
3102 {
3103 //ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(),
3104 // bmd->anchor(),bcd->name());
3106 bmd->anchor(),bcd->displayName());
3107
3108 if (bmd->isLinkableInProject() )
3109 {
3110 writePageRef(ol,bmd->getOutputFileBase(),bmd->anchor());
3111 }
3112 }
3113 };
3114
3115 QCString reimplInLine;
3116 if (m_virt==Specifier::Pure || (getClassDef() && getClassDef()->compoundType()==ClassDef::Interface))
3117 {
3118 reimplInLine = theTranslator->trImplementedInList(static_cast<int>(count));
3119 }
3120 else
3121 {
3122 reimplInLine = theTranslator->trReimplementedInList(static_cast<int>(count));
3123 }
3124
3125 // write the list of classes that overwrite this member
3126 ol.startParagraph();
3127 writeMarkerList(ol,
3128 reimplInLine.str(),
3129 count,
3130 replaceFunc);
3131 ol.endParagraph();
3132 }
3133}
3134
3136{
3137 if (getClassDef()) // this should be a member of a class/category
3138 {
3139 //printf("%s: category %s relation %s class=%s categoryOf=%s\n",
3140 // qPrint(name()),
3141 // m_category ? qPrint(m_category->name()) : "<none>",
3142 // m_categoryRelation ? qPrint(m_categoryRelation->name()) : "<none>",
3143 // qPrint(m_classDef->name()),
3144 // m_classDef->categoryOf() ? qPrint(m_classDef->categoryOf()->name()) : "<none>"
3145 // );
3146 QCString text;
3147 QCString ref;
3148 QCString file;
3149 QCString anc;
3150 QCString name;
3151 int i=-1;
3152 if (m_categoryRelation && m_categoryRelation->isLinkable())
3153 {
3154 if (m_category)
3155 {
3156 // this member is in a normal class and implements method categoryRelation from category
3157 // so link to method 'categoryRelation' with 'provided by category 'category' text.
3158 text = theTranslator->trProvidedByCategory();
3159 name = m_category->displayName();
3160 }
3161 else if (getClassDef()->categoryOf())
3162 {
3163 // this member is part of a category so link to the corresponding class member of the class we extend
3164 // so link to method 'categoryRelation' with 'extends class 'classDef->categoryOf()'
3165 text = theTranslator->trExtendsClass();
3167 }
3168 i=text.find("@0");
3169 if (i!=-1)
3170 {
3171 const MemberDef *md = m_categoryRelation;
3172 ref = md->getReference();
3173 file = md->getOutputFileBase();
3174 anc = md->anchor();
3175 }
3176 }
3177 if (i!=-1 && !name.isEmpty())
3178 {
3179 ol.startParagraph();
3180 ol.parseText(text.left(i));
3181 ol.writeObjectLink(ref,file,anc,name);
3182 ol.parseText(text.mid(i+2));
3183 ol.endParagraph();
3184 }
3185 }
3186}
3187
3189{
3190 // write the list of examples that use this member
3191 if (hasExamples())
3192 {
3193 ol.startExamples();
3194 ol.startDescForItem();
3196 ol.endDescForItem();
3197 ol.endExamples();
3198 }
3199}
3200
3202{
3203 if (m_typeConstraints.hasParameters())
3204 {
3206 }
3207}
3208
3210 const QCString &cfname,const QCString &ciname,
3211 const QCString &cname) const
3212{
3213 // For enum, we also write the documented enum values
3214 if (isEnumerate())
3215 {
3216 bool first=true;
3217 //printf("** %s: enum values=%zu\n",qPrint(name()),enumFieldList().size());
3218 bool hasInits = false;
3219 if (hasEnumValues())
3220 {
3221 for (const auto &fmd : enumFieldList())
3222 {
3223 if (fmd->isLinkable())
3224 {
3225 if (!fmd->initializer().isEmpty())
3226 {
3227 hasInits = true;
3228 break;
3229 }
3230 }
3231 }
3232 }
3233 for (const auto &fmd : enumFieldList())
3234 {
3235 //printf("Enum %p: isLinkable()=%d\n",fmd,fmd->isLinkable());
3236 if (fmd->isLinkable())
3237 {
3238 if (first)
3239 {
3240 ol.startDescTable(theTranslator->trEnumerationValues(),hasInits);
3241 first=false;
3242 }
3243
3244 ol.startDescTableRow();
3245 ol.addIndexItem(fmd->name(),ciname);
3246 ol.addIndexItem(ciname,fmd->name());
3247
3249 ol.startDoxyAnchor(cfname,cname,fmd->anchor(),fmd->name(),fmd->argsString());
3250 ol.addLabel(cfname,fmd->anchor());
3251 ol.docify(fmd->name());
3253 ol.writeString(" ");
3254 ol.enableAll();
3255 ol.endDoxyAnchor(cfname,fmd->anchor());
3256 ol.endDescTableTitle();
3257 if (hasInits)
3258 {
3259 ol.startDescTableInit();
3260 if (!fmd->initializer().isEmpty())
3261 {
3262 QCString initStr = fmd->initializer().stripWhiteSpace();
3263 if (initStr.startsWith("=")) initStr = initStr.mid(1).stripWhiteSpace();
3265 ol.writeString("(");
3266 ol.enableAll();
3267 ol.docify(initStr);
3269 ol.writeString(")");
3270 ol.enableAll();
3271 }
3272 ol.endDescTableInit();
3273 }
3274 ol.startDescTableData();
3275
3276 bool hasBrief = !fmd->briefDescription().isEmpty();
3277 bool hasDetails = !fmd->documentation().isEmpty();
3278
3279 if (hasBrief)
3280 {
3281 ol.generateDoc(fmd->briefFile(),
3282 fmd->briefLine(),
3283 getOuterScope()?getOuterScope():container,
3284 fmd,
3285 fmd->briefDescription(),
3286 DocOptions()
3287 .setIndexWords(true));
3288 }
3289 if (hasDetails)
3290 {
3291 ol.generateDoc(fmd->docFile(),
3292 fmd->docLine(),
3293 getOuterScope()?getOuterScope():container,
3294 fmd,
3295 fmd->documentation()+"\n",
3296 DocOptions()
3297 .setIndexWords(true));
3298 }
3299 ol.endDescTableData();
3300 ol.endDescTableRow();
3301 }
3302 }
3303 if (!first)
3304 {
3305 ol.endDescTable();
3306 }
3307 }
3308}
3309
3310// match from the start of the scope until the last marker
3311static const reg::Ex reAnonymous(R"([\w:@]*@\d+)");
3312
3314{
3315 QCString ldef = definition();
3316 QCString title = name();
3317 if (isEnumerate())
3318 {
3319 if (isAnonymous())
3320 {
3321 ldef = title = "anonymous enum";
3322 if (!m_enumBaseType.isEmpty())
3323 {
3324 ldef+=" : "+m_enumBaseType;
3325 }
3326 }
3327 else
3328 {
3329 ldef.prepend("enum ");
3330 if (isSliceLocal())
3331 {
3332 ldef.prepend("local ");
3333 }
3334 }
3335 }
3336 else if (isEnumValue())
3337 {
3338 if (isAnonymous())
3339 {
3340 ldef=ldef.mid(2);
3341 }
3342 }
3343
3344 std::string sdef = ldef.str();
3345 reg::Match match;
3346 if (reg::search(sdef,match,reAnonymous))
3347 {
3348 ldef = match.prefix().str() + " { ... } " + removeAnonymousScopes(match.suffix().str());
3349 }
3350
3351 const ClassDef *cd=getClassDef();
3352 if (cd && cd->isObjectiveC())
3353 {
3354 // strip scope name
3355 int ep = ldef.find("::");
3356 if (ep!=-1)
3357 {
3358 int sp=ldef.findRev(' ',ep);
3359 if (sp!=-1)
3360 {
3361 ldef=ldef.left(sp+1)+ldef.mid(ep+2);
3362 }
3363 }
3364 // strip keywords
3365 int dp = ldef.find(':');
3366 if (dp!=-1)
3367 {
3368 ldef=ldef.left(dp+1);
3369 }
3370 int l=static_cast<int>(ldef.length());
3371 //printf("start >%s<\n",qPrint(ldef));
3372 int i=l-1;
3373 while (i>=0 && (isId(ldef.at(i)) || ldef.at(i)==':')) i--;
3374 while (i>=0 && isspace(static_cast<uint8_t>(ldef.at(i)))) i--;
3375 if (i>0)
3376 {
3377 // insert branches around the type
3378 ldef = "("+ldef.left(i+1)+")"+ldef.mid(i+1);
3379 }
3380 //printf("end >%s< i=%d\n",qPrint(ldef),i);
3381 if (isStatic()) ldef.prepend("+ "); else ldef.prepend("- ");
3382 }
3383 SrcLangExt lang = getLanguage();
3385 return substitute(ldef,"::",sep);
3386}
3387
3389{
3390 // only write out the include file if this is not part of a class or file
3391 // definition
3392 bool showGroupedMembInc = Config_getBool(SHOW_GROUPED_MEMB_INC);
3393 bool forceLocalIncludes = Config_getBool(FORCE_LOCAL_INCLUDES);
3394 const FileDef *fd = getFileDef();
3395 QCString nm;
3396 if (inGroup && fd && showGroupedMembInc)
3397 {
3398 if (!Config_getList(STRIP_FROM_INC_PATH).empty())
3399 {
3401 }
3402 else
3403 {
3404 nm = fd->name();
3405 }
3406 }
3407 if (!nm.isEmpty())
3408 {
3409 ol.startParagraph();
3410 ol.startTypewriter();
3411 SrcLangExt lang = getLanguage();
3412 bool isIDLorJava = lang==SrcLangExt::IDL || lang==SrcLangExt::Java;
3413 if (isIDLorJava)
3414 {
3415 ol.docify("import ");
3416 }
3417 else
3418 {
3419 ol.docify("#include ");
3420 }
3421
3422 if (isIDLorJava || forceLocalIncludes) ol.docify("\""); else ol.docify("<");
3423
3424 if (fd->isLinkable())
3425 {
3426 ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),fd->anchor(),nm);
3427 }
3428 else
3429 {
3430 ol.docify(nm);
3431 }
3432
3433 if (isIDLorJava || forceLocalIncludes) ol.docify("\""); else ol.docify(">");
3434
3435 ol.endTypewriter();
3436 ol.endParagraph();
3437 }
3438}
3439
3441{
3442 //printf("md=%s initLines=%d init='%s'\n",qPrint(name()),initLines,qPrint(init));
3443 ol.startBold();
3445 ol.parseText(theTranslator->trDefineValue());
3446 else
3447 ol.parseText(theTranslator->trInitialValue());
3448 ol.endBold();
3449 QCString langCorrected = getDefFileExtension();
3451 if (srcLangExt == SrcLangExt::Lex)
3452 {
3453 langCorrected = ".doxygen_lex_c";
3454 srcLangExt = SrcLangExt::Cpp;
3455 }
3456 auto intf = Doxygen::parserManager->getCodeParser(langCorrected);
3457 intf->resetCodeParserState();
3458 auto &codeOL = ol.codeGenerators();
3459 codeOL.startCodeFragment("DoxyCode");
3460 intf->parseCode(codeOL,scopeName,m_initializer,srcLangExt,Config_getBool(STRIP_CODE_COMMENTS),
3463 .setInlineFragment(true)
3464 .setMemberDef(this)
3465 .setShowLineNumbers(false)
3466 .setSearchCtx(this)
3467 );
3468 codeOL.endCodeFragment("DoxyCode");
3469}
3470
3471/*! Writes the "detailed documentation" section of this member to
3472 * all active output formats.
3473 */
3475 int memCount,int memTotal,
3476 OutputList &ol,
3477 const QCString &scName,
3478 const Definition *container,
3479 bool inGroup,
3480 bool /* showEnumValues */,
3481 bool showInline
3482 ) const
3483{
3484 // if this member is in a group find the real scope name.
3485 bool hasParameterList = FALSE;
3486
3487 //printf("MemberDefImpl::writeDocumentation(): name='%s' hasDocs='%d' containerType=%d inGroup=%d sectionLinkable=%d\n",
3488 // qPrint(name()),hasDocs,container->definitionType(),inGroup,hasDetailedDescription());
3489
3490 //if ( !hasDocs ) return;
3491 //if (isEnumValue() && !showEnumValues) return;
3492
3493 SrcLangExt lang = getLanguage();
3494 //printf("member=%s lang=%d\n",qPrint(name()),lang);
3495 bool optVhdl = lang==SrcLangExt::VHDL;
3497
3498 QCString scopeName = scName;
3499 QCString memAnchor = anchor();
3500 QCString ciname = container->displayName();
3501 const Definition *scopedContainer = container; // see bug 753608
3502 if (container->definitionType()==TypeGroup)
3503 {
3504 if (getClassDef()) { scopeName=getClassDef()->displayName(); scopedContainer=getClassDef(); }
3505 else if (getNamespaceDef()) { scopeName=getNamespaceDef()->displayName(); scopedContainer=getNamespaceDef(); }
3506 else if (getFileDef()) { scopeName=getFileDef()->displayName(); scopedContainer=getFileDef(); }
3507 ciname = (toGroupDef(container))->groupTitle();
3508 }
3509 else if (container->definitionType()==TypeFile && getNamespaceDef() && getNamespaceDef()->isLinkable())
3510 { // member is in a namespace, but is written as part of the file documentation
3511 // as well, so we need to make sure its anchor is unique (it is not really used).
3512 memAnchor.prepend("file_");
3513 }
3514
3515 QCString cname = container->name();
3516 QCString cfname = getOutputFileBase();
3517
3518 // get member name
3519 QCString doxyName=name();
3520 // prepend scope if there is any. TODO: make this optional for C only docs
3521 if (!scopeName.isEmpty())
3522 {
3523 doxyName.prepend(scopeName+sep);
3524 }
3525 QCString doxyArgs=argsString();
3526
3527 QCString ldef = definition();
3528 QCString title = name();
3529 //printf("member '%s' def='%s'\n",qPrint(name()),qPrint(ldef));
3530 if (isEnumerate())
3531 {
3532 if (title.at(0)=='@')
3533 {
3534 ldef = title = "anonymous enum";
3535 if (!m_enumBaseType.isEmpty())
3536 {
3537 ldef+=" : "+m_enumBaseType;
3538 }
3539 }
3540 else
3541 {
3542 if (lang==SrcLangExt::Cpp)
3543 {
3544 if (isEnumStruct()) ldef.prepend("struct ");
3545 else if (isStrong()) ldef.prepend("class ");
3546 }
3547 ldef.prepend("enum ");
3548 if (isSliceLocal())
3549 {
3550 ldef.prepend("local ");
3551 }
3552 }
3553 }
3554 else if (isEnumValue())
3555 {
3556 if (ldef.at(0)=='@')
3557 {
3558 ldef=ldef.mid(2);
3559 }
3560 }
3561 else if (isFunction() && !isObjCMethod())
3562 {
3563 title += "()";
3564 }
3565 if (lang == SrcLangExt::Slice)
3566 {
3567 // Remove the container scope from the member name.
3568 QCString prefix = scName + sep;
3569 int pos = ldef.findRev(prefix.data());
3570 if(pos != -1)
3571 {
3572 ldef.remove(pos, prefix.length());
3573 }
3574 }
3575 ldef.stripPrefix("constexpr ");
3576 ldef.stripPrefix("consteval ");
3577 ldef.stripPrefix("constinit ");
3578 ldef.stripPrefix("static ");
3579
3580 //----------------------------------------
3581
3582 ol.pushGeneratorState();
3583
3584 bool htmlEndLabelTable=FALSE;
3585 StringVector sl = getLabels(scopedContainer);
3586
3587 static const reg::Ex r(R"(@\d+)");
3588 reg::Match match;
3589 std::string sdef = ldef.str();
3590 if ((isVariable() || isTypedef()) && reg::search(sdef,match,r))
3591 {
3592 // find enum type and insert it in the definition
3593 bool found=false;
3594 for (const auto &vmd : *ml)
3595 {
3596 if (vmd->isEnumerate() && match.str()==vmd->name())
3597 {
3598 ol.startDoxyAnchor(cfname, cname, memAnchor, doxyName, doxyArgs);
3599 ol.startMemberDoc(ciname,name(),memAnchor,name(),memCount,memTotal,showInline);
3600 ol.addLabel(cfname, memAnchor);
3601 QCString prefix = match.prefix().str();
3602 QCString suffix = match.suffix().str();
3603 linkifyText(TextGeneratorOLImpl(ol),scopedContainer,getBodyDef(),this,prefix);
3604 vmd->writeEnumDeclaration(ol,getClassDef(),getNamespaceDef(),getFileDef(),getGroupDef(),getModuleDef());
3605 linkifyText(TextGeneratorOLImpl(ol),scopedContainer,getBodyDef(),this,suffix);
3606
3607 found=true;
3608 break;
3609 }
3610 }
3611 if (!found) // anonymous compound
3612 {
3613 ClassDef *annoClassDef=getClassDefOfAnonymousType();
3614 QCString typeName;
3615 if (annoClassDef) typeName=annoClassDef->compoundTypeString();
3616 ol.startDoxyAnchor(cfname, cname, memAnchor, doxyName, doxyArgs);
3617 ol.startMemberDoc(ciname,name(),memAnchor,"["+typeName+"]",memCount,memTotal,showInline);
3618 ol.addLabel(cfname, memAnchor);
3619 // search for the last anonymous compound name in the definition
3620
3622 if (reg::search(sdef,match,reAnonymous))
3623 {
3624 QCString prefix = match.prefix().str();
3625 QCString suffix = match.suffix().str();
3626 ol.docify(prefix);
3627 ol.docify(" { ... } ");
3628 linkifyText(TextGeneratorOLImpl(ol),scopedContainer,getBodyDef(),this,removeAnonymousScopes(suffix));
3629 }
3630 else
3631 {
3632 linkifyText(TextGeneratorOLImpl(ol),scopedContainer,getBodyDef(),this,ldef);
3633 }
3634 }
3635 }
3636 else // not an enum value or anonymous compound
3637 {
3638 ol.startDoxyAnchor(cfname, cname, memAnchor, doxyName, doxyArgs);
3639 ol.startMemberDoc(ciname,name(),memAnchor,title,memCount,memTotal,showInline);
3640 ol.addLabel(cfname, memAnchor);
3641
3642 if (!m_metaData.isEmpty() && getLanguage()==SrcLangExt::Slice)
3643 {
3645 ol.docify(m_metaData);
3647 }
3648
3649 const ClassDef *cd=getClassDef();
3650 const NamespaceDef *nd=getNamespaceDef();
3651 if (!m_defTmpArgLists.empty() && lang==SrcLangExt::Cpp)
3652 // definition has explicit template parameter declarations
3653 {
3654 for (const ArgumentList &tal : m_defTmpArgLists)
3655 {
3656 if (!tal.empty())
3657 {
3659 _writeTemplatePrefix(ol,scopedContainer,tal);
3661 }
3662 }
3663 }
3664 else // definition gets it template parameters from its class
3665 // (since no definition was found)
3666 {
3667 if (cd && lang==SrcLangExt::Cpp && !isTemplateSpecialization())
3668 {
3669 for (const ArgumentList &tal : cd->getTemplateParameterLists())
3670 {
3671 if (!tal.empty())
3672 {
3674 _writeTemplatePrefix(ol,scopedContainer,tal,false);
3676 }
3677 }
3678 }
3679 if (m_tArgList.hasParameters() && lang==SrcLangExt::Cpp) // function template prefix
3680 {
3682 _writeTemplatePrefix(ol,scopedContainer,m_tArgList);
3684 }
3685 }
3686
3687 if (!sl.empty())
3688 {
3689 ol.pushGeneratorState();
3690 ol.disableAll();
3692 ol.writeString("<table class=\"mlabels\">\n");
3693 ol.writeString(" <tr>\n");
3694 ol.writeString(" <td class=\"mlabels-left\">\n");
3695 ol.popGeneratorState();
3696 htmlEndLabelTable=TRUE;
3697 }
3698
3700 if (cd && cd->isObjectiveC())
3701 {
3702 // strip scope name
3703 int ep = ldef.find("::");
3704 if (ep!=-1)
3705 {
3706 int sp=ldef.findRev(' ',ep);
3707 if (sp!=-1)
3708 {
3709 ldef=ldef.left(sp+1)+ldef.mid(ep+2);
3710 } else {
3711 ldef=ldef.mid(ep+2);
3712 }
3713 }
3714 // strip keywords
3715 int dp = ldef.find(':');
3716 if (dp!=-1)
3717 {
3718 ldef=ldef.left(dp+1);
3719 }
3720 int dl=static_cast<int>(ldef.length());
3721 //printf("start >%s<\n",qPrint(ldef));
3722 int i=dl-1;
3723 while (i>=0 && (isId(ldef.at(i)) || ldef.at(i)==':')) i--;
3724 while (i>=0 && isspace(static_cast<uint8_t>(ldef.at(i)))) i--;
3725 if (i>0)
3726 {
3727 // insert branches around the type
3728 ldef="("+ldef.left(i+1)+")"+ldef.mid(i+1);
3729 }
3730 //printf("end >%s< i=%d\n",qPrint(ldef),i);
3731 if (isStatic()) ldef.prepend("+ "); else ldef.prepend("- ");
3732 }
3733
3734 if (optVhdl)
3735 {
3736 hasParameterList=VhdlDocGen::writeVHDLTypeDocumentation(this,scopedContainer,ol);
3737 }
3738 else if (lang==SrcLangExt::Slice)
3739 {
3740 // Eliminate the self-reference.
3741 int pos = ldef.findRev(' ');
3742 if (pos<0) pos=0;
3743 if (pos>0)
3744 {
3746 scopedContainer,
3747 getBodyDef(),
3748 this,
3749 ldef.left(pos)
3750 );
3751 }
3752 ol.docify(ldef.mid(pos));
3753 const Definition *scope = cd;
3754 if (scope==nullptr) scope = nd;
3755 hasParameterList=writeDefArgumentList(ol,scope,this);
3756 }
3757 else
3758 {
3760 scopedContainer,
3761 getBodyDef(),
3762 this,
3763 substitute(ldef,"::",sep)
3764 );
3765 const Definition *scope = cd;
3766 if (scope==nullptr) scope = nd;
3767 hasParameterList=writeDefArgumentList(ol,scope,this);
3768 }
3769
3770 if (hasOneLineInitializer()) // add initializer
3771 {
3772 if (isTypeAlias())
3773 {
3774 ol.docify(" = ");
3775 QCString init = m_initializer.simplifyWhiteSpace();
3776 linkifyText(TextGeneratorOLImpl(ol),scopedContainer,getBodyDef(),this,init);
3777 }
3778 else if (!isDefine())
3779 {
3780 ol.docify(" ");
3781 QCString init = m_initializer.simplifyWhiteSpace();
3782 linkifyText(TextGeneratorOLImpl(ol),scopedContainer,getBodyDef(),this,init);
3783 }
3784 else
3785 {
3787 linkifyText(TextGeneratorOLImpl(ol),scopedContainer,getBodyDef(),this,m_initializer);
3788 }
3789 }
3790 if (!excpString().isEmpty()) // add exception list
3791 {
3792 writeExceptionList(ol,cd,this);
3793 hasParameterList=true; // call endParameterList below
3794 }
3795 }
3796
3797 ol.pushGeneratorState();
3799 if (!sl.empty())
3800 {
3801 ol.startLabels();
3802 size_t count=0;
3803 for (const auto &s : sl)
3804 {
3805 count++;
3806 ol.writeLabel(s,count==sl.size());
3807 }
3808 ol.endLabels();
3809 }
3810 ol.popGeneratorState();
3811
3812 if (hasParameterList)
3813 {
3814 ol.endParameterList();
3815 ol.endMemberDoc(TRUE);
3816 }
3817 else
3818 {
3819 ol.endMemberDocName();
3820 ol.endMemberDoc(FALSE);
3821 }
3822
3823 // for HTML write the labels here
3824 ol.pushGeneratorState();
3825 ol.disableAll();
3827 if (htmlEndLabelTable)
3828 {
3829 ol.writeString(" </td>\n");
3830 ol.writeString(" <td class=\"mlabels-right\">\n");
3831 ol.startLabels();
3832 size_t count=0;
3833 for (const auto &s : sl)
3834 {
3835 count++;
3836 ol.writeLabel(s,count==sl.size());
3837 }
3838 ol.endLabels();
3839 ol.writeString(" </td>\n");
3840 ol.writeString(" </tr>\n");
3841 ol.writeString("</table>\n");
3842 }
3843 ol.writeString("</div>");
3844 ol.popGeneratorState();
3845
3846
3847 ol.endDoxyAnchor(cfname,memAnchor);
3848 ol.startIndent();
3849
3850 _writeGroupInclude(ol,inGroup);
3851
3852 /* write multi-line initializer (if any) */
3854
3855 /* write brief description */
3856 QCString brief = briefDescription();
3857 if (!brief.isEmpty() &&
3858 (Config_getBool(REPEAT_BRIEF) ||
3859 !Config_getBool(BRIEF_MEMBER_DESC)
3860 )
3861 )
3862 {
3863 ol.startParagraph();
3865 briefLine(),
3866 scopedContainer,
3867 this,
3868 brief,
3869 DocOptions()
3870 .setSingleLine(true));
3871 ol.endParagraph();
3872 }
3873
3874 /* write detailed description */
3875 QCString detailed = documentation();
3876 if (!detailed.isEmpty() ||
3877 !inbodyDocumentation().isEmpty())
3878 {
3879 // write vhdl inline code with or without option INLINE_SOURCE
3880 if (optVhdl && VhdlDocGen::isMisc(this))
3881 {
3882 VhdlDocGen::writeSource(this,ol,cname);
3883 return;
3884 }
3885 else
3886 {
3887 ol.generateDoc(docFile(),
3888 docLine(),
3889 scopedContainer,
3890 this,
3891 detailed+"\n",
3892 DocOptions()
3893 .setIndexWords(true));
3894 }
3895
3896 if (!inbodyDocumentation().isEmpty())
3897 {
3899 inbodyLine(),
3900 scopedContainer,
3901 this,
3902 inbodyDocumentation()+"\n",
3903 DocOptions()
3904 .setIndexWords(true));
3905 }
3906 }
3907 else if (!brief.isEmpty() && (Config_getBool(REPEAT_BRIEF) || !Config_getBool(BRIEF_MEMBER_DESC)))
3908 {
3909 if (!inbodyDocumentation().isEmpty())
3910 {
3912 inbodyLine(),
3913 scopedContainer,
3914 this,
3915 inbodyDocumentation()+"\n",
3916 DocOptions()
3917 .setIndexWords(true));
3918 }
3919 }
3920
3921
3922 //printf("***** defArgList=%p name=%s docs=%s hasDocs=%d\n",
3923 // defArgList,
3924 // defArgList?defArgList->hasDocumentation():-1);
3925 const ArgumentList &docArgList = m_templateMaster ?
3926 m_templateMaster->argumentList() :
3928 ol.generateDoc(docFile(),
3929 docLine(),
3930 scopedContainer,
3931 this, // memberDef
3932 inlineArgListToDoc(docArgList), // docStr
3933 DocOptions()
3934 .setIndexWords(true));
3935
3936 const ArgumentList &docTemplateArgList = m_templateMaster ?
3937 m_templateMaster->templateArguments() :
3938 m_tArgList;
3939 ol.generateDoc(docFile(),
3940 docLine(),
3941 scopedContainer,
3942 this, // memberDef
3943 inlineTemplateArgListToDoc(docTemplateArgList), // docStr
3944 DocOptions()
3945 .setIndexWords(true));
3946
3947 _writeEnumValues(ol,scopedContainer,cfname,ciname,cname);
3951 _writeExamples(ol);
3953 QCString scopeStr = getScopeString();
3954 writeSourceDef(ol);
3955 writeInlineCode(ol,scopeStr);
3956 if (hasReferencesRelation()) writeSourceRefs(ol,scopeStr);
3957 if (hasReferencedByRelation()) writeSourceReffedBy(ol,scopeStr);
3958 _writeCallGraph(ol);
3961
3962 ol.endIndent();
3963
3964 // enable LaTeX again
3965 //if (Config_getBool(EXTRACT_ALL) && !hasDocs) ol.enable(OutputType::Latex);
3966 ol.popGeneratorState();
3967
3969}
3970
3971// strip scope and field name from the type
3972// example: "struct N<K::J>::S.v.c" will become "struct v"
3974{
3976 if (ts.endsWith("::")) ts = ts.left(ts.length()-2);
3977 static const reg::Ex re1(R"(\a\w*::)"); // non-template version
3978 static const reg::Ex re2(R"(\a\w*<[^>]*>::)"); // template version
3979 reg::Match match;
3980 std::string t = ts.str();
3981 while (reg::search(t,match,re2) || reg::search(t,match,re1))
3982 {
3983 t = match.prefix().str() + match.suffix().str(); // remove the matched part
3984 }
3985 //printf("simplifyTypeForTable(%s)->%s\n",qPrint(s),qPrint(t));
3986 return t;
3987}
3988
3990{
3991 QCString type = m_accessorType;
3992 if (type.isEmpty())
3993 {
3994 type = m_type;
3995 }
3996
3997 if (isTypedef() && getLanguage() != SrcLangExt::Slice) type.prepend("typedef ");
3998 return simplifyTypeForTable(type);
3999}
4000
4002{
4003 Definition *scope = getOuterScope();
4004 QCString doxyName = name();
4005 QCString doxyArgs = argsString();
4006 QCString memAnchor = anchor();
4007 QCString cfname = getOutputFileBase();
4008 QCString cname;
4009 if (scope) cname = scope->name();
4010 if (doxyName.at(0)=='@')
4011 {
4012 doxyName="__unnamed__";
4013 }
4014
4016 //printf("===> %s::anonymous: %s\n",qPrint(name()),cd?qPrint(cd->name()):"<none>");
4017
4018 if (container && container->definitionType()==Definition::TypeClass &&
4019 !(toClassDef(container))->isJavaEnum())
4020 {
4022 ol.startDoxyAnchor(cfname,cname,memAnchor,doxyName,doxyArgs);
4023 ol.addLabel(cfname,memAnchor);
4024
4025 QCString ts = fieldType();
4026
4027 if (isFunctionPtr())
4028 ts = m_type + m_args;
4029
4030 if (cd) // cd points to an anonymous struct pointed to by this member
4031 // so we add a link to it from the type column.
4032 {
4033 int i=0;
4034 const char *prefixes[] = { "struct ","union ","class ", nullptr };
4035 const char **p = prefixes;
4036 while (*p)
4037 {
4038 int l=qstrlen(*p);
4039 if (ts.left(l)==*p)
4040 {
4041 ol.writeString(*p);
4042 i=l;
4043 }
4044 p++;
4045 }
4047 cd->getOutputFileBase(),
4048 cd->anchor(),ts.mid(i));
4049 }
4050 else // use standard auto linking
4051 {
4053 scope, // scope
4054 getBodyDef(), // fileScope
4055 this, // self
4056 ts // text
4057 );
4058 }
4059 ol.endDoxyAnchor(cfname,memAnchor);
4061 }
4062
4064 ol.docify(doxyName);
4065 if (isVariable() && !argsString().isEmpty() && !isObjCMethod() && !isFunctionPtr())
4066 {
4068 }
4069 if (!m_bitfields.isEmpty()) // add bitfields
4070 {
4072 }
4073 if (hasOneLineInitializer() && !isDefine())
4074 {
4075 ol.writeString(" ");
4076 linkifyText(TextGeneratorOLImpl(ol),getOuterScope(),getBodyDef(),this,m_initializer.simplifyWhiteSpace());
4077 }
4079
4081
4082 QCString brief = briefDescription();
4083 QCString detailed = documentation();
4084
4085 /* write brief description */
4086 if (!brief.isEmpty())
4087 {
4089 briefLine(),
4090 getOuterScope()?getOuterScope():container,this,
4091 brief,
4092 DocOptions()
4093 .setSingleLine(true));
4094 }
4095
4096 /* write detailed description */
4097 if (!detailed.isEmpty())
4098 {
4099 if (!brief.isEmpty())
4100 {
4102 ol.lineBreak();
4104 }
4105 ol.generateDoc(docFile(),
4106 docLine(),
4107 getOuterScope()?getOuterScope():container,this,
4108 detailed+"\n",
4109 DocOptions());
4110 }
4111
4112 ol.endInlineMemberDoc();
4113}
4114
4116{
4117 switch (m_mtype)
4118 {
4119 case MemberType::Define: return "macro definition";
4120 case MemberType::Function: return "function";
4121 case MemberType::Variable: return "variable";
4122 case MemberType::Typedef: return "typedef";
4123 case MemberType::Enumeration: return "enumeration";
4124 case MemberType::EnumValue: return "enumvalue";
4125 case MemberType::Signal: return "signal";
4126 case MemberType::Slot: return "slot";
4127 case MemberType::Friend: return "friend";
4128 case MemberType::DCOP: return "dcop";
4129 case MemberType::Property: return "property";
4130 case MemberType::Event: return "event";
4131 case MemberType::Interface: return "interface";
4132 case MemberType::Service: return "service";
4133 case MemberType::Sequence: return "sequence";
4134 case MemberType::Dictionary: return "dictionary";
4135 default: return "unknown";
4136 }
4137}
4138
4140{
4141 /*
4142 * Removed bug_303020:
4143 * if (m_memberGroup) return;
4144 */
4145 const ClassDef *cd = getClassDef();
4146 const NamespaceDef *nd = getNamespaceDef();
4147 const FileDef *fd = getFileDef();
4148 const GroupDef *gd = getGroupDef();
4149 const Definition *d=nullptr;
4150 QCString t;
4151 if (cd)
4152 {
4153 t=cd->compoundTypeString();
4154 d=cd;
4155 }
4156 else if (nd)
4157 {
4158 t=nd->compoundTypeString();
4159 d=nd;
4160 }
4161 else if (gd)
4162 {
4163 t="group";
4164 d=gd;
4165 }
4166 else
4167 {
4168 t="file";
4169 d=fd;
4170 }
4171 bool extractAll = Config_getBool(EXTRACT_ALL);
4172
4173 //printf("%s:warnIfUndoc: hasUserDocs=%d isFriendClass=%d protection=%d isRef=%d isDel=%d\n",
4174 // qPrint(name()),
4175 // hasUserDocumentation(),isFriendClass(),protectionLevelVisible(m_prot),isReference(),isDeleted());
4176 if ((!hasUserDocumentation() && !extractAll) &&
4177 !isFriendClass() &&
4178 name().find('@')==-1 && d && d->name().find('@')==-1 &&
4181 !isReference() && !isDeleted()
4182 )
4183 {
4184 SrcLangExt lang = getLanguage();
4186 warn_undoc(getDefFileName(),getDefLine(),"Member {}{} ({}) of {} {} is not documented.",
4188 substitute(d->name(),"::",sep));
4189 }
4190 else if (!hasDetailedDescription())
4191 {
4193 }
4194
4195 // if it is an enum, we check that its members are documented
4196 if (!extractAll && isEnumerate() && Config_getBool(WARN_IF_UNDOC_ENUM_VAL))
4197 {
4198 for (const auto &fmd : enumFieldList())
4199 {
4200 if (!fmd->isLinkableInProject())
4201 {
4202 SrcLangExt lang = getLanguage();
4204 warn(fmd->getDefFileName(),fmd->getDefLine(), "Documentation for enum member '{}{}{}' is missing.",
4205 qualifiedName(),sep,fmd->name());
4206 }
4207 }
4208 }
4209}
4210
4212{
4213 bool hideUndocMembers = Config_getBool(HIDE_UNDOC_MEMBERS);
4214 bool extractStatic = Config_getBool(EXTRACT_STATIC);
4215 return (!isAnonymous() &&
4216 (!hideUndocMembers || hasDocumentation()) &&
4217 (!isStatic() || extractStatic) &&
4218 isLinkable()
4219 );
4220}
4221
4223{
4224 QCString ret = trailRet;
4225
4226 ret = ret.stripWhiteSpace();
4227 if (ret.startsWith("->"))
4228 {
4229 ret = ret.mid(2).stripWhiteSpace();
4230 return ret;
4231 }
4232 return trailRet;
4233}
4234
4236
4237void MemberDefImpl::detectUndocumentedParams(bool hasParamCommand,bool hasReturnCommand) const
4238{
4239 //printf("%s:detectUndocumentedParams(%d,%d)\n",qPrint(name()),hasParamCommand,hasReturnCommand);
4240 bool isPython = getLanguage()==SrcLangExt::Python;
4241
4242 // this function is called while parsing the documentation. A member can have multiple
4243 // documentation blocks, which could be handled by multiple threads, hence this guard.
4244 std::lock_guard<std::mutex> lock(g_detectUndocumentedParamsMutex);
4245
4246 if (!m_hasDocumentedParams && hasParamCommand)
4247 {
4248 //printf("%s:hasDocumentedParams=TRUE;\n",qPrint(name()));
4249 m_hasDocumentedParams = true;
4250 }
4251 else if (!m_hasDocumentedParams)
4252 {
4253 const ArgumentList &al = argumentList();
4254 const ArgumentList &declAl = declArgumentList();
4255 bool allDoc=TRUE; // no parameter => all parameters are documented
4256 if ( // member has parameters
4257 al.hasParameters() // with at least one parameter (that is not void)
4258 )
4259 {
4260 // see if all parameters have documentation
4261 for (auto it = al.begin(); it!=al.end() && allDoc; ++it)
4262 {
4263 const Argument &a = *it;
4264 if (!a.name.isEmpty() && a.type!="void" && a.name!="..." &&
4265 !(isPython && (a.name=="self" || a.name=="cls"))
4266 )
4267 {
4268 allDoc = !a.docs.isEmpty();
4269 }
4270 //printf("a.type=%s a.name=%s doc=%s\n",
4271 // qPrint(a.type),qPrint(a.name),qPrint(a.docs));
4272 }
4273 if (!allDoc && declAl.empty()) // try declaration arguments as well
4274 {
4275 allDoc=true;
4276 for (auto it = al.begin(); it!=al.end() && allDoc; ++it)
4277 {
4278 const Argument &a = *it;
4279 if (!a.name.isEmpty() && a.type!="void" && a.name!="..." &&
4280 !(isPython && (a.name=="self" || a.name=="cls"))
4281 )
4282 {
4283 allDoc = !a.docs.isEmpty();
4284 }
4285 //printf("a.name=%s doc=%s\n",qPrint(a.name),qPrint(a.docs));
4286 }
4287 }
4288 }
4289 if (allDoc)
4290 {
4291 //printf("%s:hasDocumentedParams=TRUE;\n",qPrint(name()));
4292 m_hasDocumentedParams = true;
4293 }
4294 }
4295
4296 //printf("Member %s hasDocumentedReturnType=%d hasReturnCommand=%d\n",
4297 // qPrint(name()),m_hasDocumentedReturnType,hasReturnCommand);
4299}
4300
4302{
4303 QCString returnType = typeString();
4304 bool isFortran = getLanguage()==SrcLangExt::Fortran;
4305 bool isFortranSubroutine = isFortran && returnType.find("subroutine")!=-1;
4306
4307 bool isVoidReturn = returnType=="void" || returnType.endsWith(" void");
4308 if (!isVoidReturn && (returnType=="auto" || returnType.endsWith(" auto")))
4309 {
4311 if (!defArgList.trailingReturnType().isEmpty())
4312 {
4313 QCString strippedTrailingReturn = stripTrailingReturn(defArgList.trailingReturnType());
4314 isVoidReturn = (strippedTrailingReturn=="void") || (strippedTrailingReturn.endsWith(" void"));
4315 }
4316 }
4317 if (!Config_getBool(EXTRACT_ALL) &&
4318 Config_getBool(WARN_IF_UNDOCUMENTED) &&
4319 Config_getBool(WARN_NO_PARAMDOC) &&
4320 isFunction() &&
4321 !isDeleted() &&
4322 !isReference() &&
4324 {
4326 {
4328 "parameters of member {} are not documented",
4329 qualifiedName());
4330 }
4332 hasDocumentation() && !returnType.isEmpty() &&
4333 !( // not one of the cases where nothing is returned
4334 isVoidReturn || // void return type
4335 isFortranSubroutine || // fortran subroutine
4336 isConstructor() || // a constructor
4337 isDestructor() || // or a destructor
4338 isFriend() // or a friend
4339 )
4340 )
4341 {
4343 "return type of member {} is not documented",
4344 qualifiedName());
4345 }
4346 }
4347 if (Config_getBool(WARN_IF_DOC_ERROR) &&
4349 (isVoidReturn || // void return type
4350 isFortranSubroutine || // fortran subroutine
4351 isConstructor() || // a constructor
4352 isDestructor())) // or destructor
4353 {
4354 warn_doc_error(docFile(),docLine(),"found documented return type for {} that does not return anything",
4355 qualifiedName());
4356 }
4357}
4358
4360{
4361 ClassDef *fcd=nullptr;
4362 QCString baseName=name();
4363 int i=baseName.find('<');
4364 if (i!=-1) baseName=baseName.left(i);
4365 return (isFriendClass() &&
4366 (fcd=getClass(baseName)) && fcd->isLinkable());
4367}
4368
4370{
4371 return m_defArgList.isDeleted();
4372}
4373
4375{
4377 (m_mtype==MemberType::Enumeration && m_docEnumValues) || // has enum values
4378 (m_defArgList.hasDocumentation()|| m_tArgList.hasTemplateDocumentation()); // has doc (template) arguments
4379}
4380
4381
4386
4388{
4389 QCString result;
4390 if (isStrong()) result=name();
4391 else if (getClassDef()) result=getClassDef()->displayName();
4392 else if (getNamespaceDef()) result=getNamespaceDef()->displayName();
4393 return result;
4394}
4395
4397{
4398 QCString memAnchor = name();
4399 if (!m_args.isEmpty()) memAnchor+=m_args;
4400 if (m_memSpec.isAlias()) // this is for backward compatibility
4401 {
4402 memAnchor.prepend(" = "+m_initializer);
4403 }
4404 memAnchor.prepend(definition()); // actually the method name is now included
4405 // twice, which is silly, but we keep it this way for backward
4406 // compatibility.
4407
4408 // include number of template arguments as well,
4409 // to distinguish between two template
4410 // specializations that only differ in the template parameters.
4411 if (m_tArgList.hasParameters())
4412 {
4413 char buf[20];
4414 qsnprintf(buf,20,"%d:",static_cast<int>(m_tArgList.size()));
4415 buf[19]='\0';
4416 memAnchor.prepend(buf);
4417 }
4418 if (!m_requiresClause.isEmpty())
4419 {
4420 memAnchor+=" "+m_requiresClause;
4421 }
4422 if (m_redefineCount>0)
4423 {
4424 char buf[20];
4425 qsnprintf(buf,20,":%d",m_redefineCount);
4426 buf[19]='\0';
4427 memAnchor.append(buf);
4428 }
4429
4430 // convert to md5 hash
4431 uint8_t md5_sig[16];
4432 char sigStr[33];
4433 MD5Buffer(memAnchor.data(),static_cast<unsigned int>(memAnchor.length()),md5_sig);
4434 MD5SigToString(md5_sig,sigStr);
4435 m_anc = QCString("a")+sigStr;
4436}
4437
4439 const QCString &fileName,int startLine,
4440 bool hasDocs,MemberDef *member)
4441{
4442 //printf("%s MemberDefImpl::setGroupDef(%s)\n",qPrint(name()),qPrint(gd->name()));
4443 m_group=gd;
4444 m_grouppri=pri;
4445 m_groupFileName=fileName;
4446 m_groupStartLine=startLine;
4447 m_groupHasDocs=hasDocs;
4448 m_groupMember=member;
4450}
4451
4466
4474
4476{
4477 m_nspace=nd;
4478 setOuterScope(nd);
4479}
4480
4482 const ArgumentList &formalArgs,const std::unique_ptr<ArgumentList> &actualArgs) const
4483{
4484 //printf(" Member %s %s %s\n",qPrint(typeString()),qPrint(name()),qPrint(argsString()));
4485 std::unique_ptr<ArgumentList> actualArgList = std::make_unique<ArgumentList>(m_defArgList);
4486 if (!m_defArgList.empty())
4487 {
4488 // replace formal arguments with actuals
4489 for (Argument &arg : *actualArgList)
4490 {
4491 arg.type = substituteTemplateArgumentsInString(arg.type,formalArgs,actualArgs.get());
4492 }
4493 actualArgList->setTrailingReturnType(
4494 substituteTemplateArgumentsInString(actualArgList->trailingReturnType(),formalArgs,actualArgs.get()));
4495 }
4496
4497 QCString methodName=name();
4498 if (methodName.startsWith("operator ")) // conversion operator
4499 {
4500 methodName=substituteTemplateArgumentsInString(methodName,formalArgs,actualArgs.get());
4501 }
4502
4503 auto imd = createMemberDef(
4505 substituteTemplateArgumentsInString(m_type,formalArgs,actualArgs.get()),
4506 methodName,
4507 substituteTemplateArgumentsInString(m_args,formalArgs,actualArgs.get()),
4510 ArgumentList(), ArgumentList(), ""
4511 );
4512 auto mmd = toMemberDefMutable(imd.get());
4513 mmd->moveArgumentList(std::move(actualArgList));
4514 mmd->setDefinition(substituteTemplateArgumentsInString(m_def,formalArgs,actualArgs.get()));
4515 mmd->setBodyDef(getBodyDef());
4516 mmd->setBodySegment(getDefLine(),getStartBodyLine(),getEndBodyLine());
4517 mmd->setFormalTemplateArguments(formalArgs);
4518
4519 // TODO: init other member variables (if needed).
4520 // TODO: reimplemented info
4521 return imd;
4522}
4523
4525{
4526 //printf("%s: init=%s, initLines=%d maxInitLines=%d userInitLines=%d\n",
4527 // qPrint(name()),qPrint(m_initializer),m_initLines,
4528 // m_maxInitLines,m_userInitLines);
4529 bool isFuncLikeMacro = m_mtype==MemberType::Define && m_defArgList.hasParameters();
4530 return !m_initializer.isEmpty() && m_initLines==0 && // one line initializer
4531 !isFuncLikeMacro &&
4532 ((m_maxInitLines>0 && m_userInitLines==-1) || m_userInitLines>0); // enabled by default or explicitly
4533}
4534
4536{
4537 //printf("initLines=%d userInitLines=%d maxInitLines=%d\n",
4538 // initLines,userInitLines,maxInitLines);
4539 bool isFuncLikeMacro = m_mtype==MemberType::Define && m_defArgList.hasParameters();
4540 return (m_initLines>0 || (!m_initializer.isEmpty() && isFuncLikeMacro)) &&
4541 ((m_initLines<m_maxInitLines && m_userInitLines==-1) // implicitly enabled
4542 || m_initLines<m_userInitLines // explicitly enabled
4543 );
4544}
4545
4547{
4548 size_t indent=0;
4550 int l=static_cast<int>(m_initializer.length());
4551 int p=l-1;
4552 while (p>=0 && isspace(static_cast<uint8_t>(m_initializer.at(p)))) p--;
4553 m_initializer=m_initializer.left(p+1);
4554 m_initLines=m_initializer.contains('\n');
4556
4557 //printf("%s::setInitializer(%s)\n",qPrint(name()),qPrint(m_initializer));
4558}
4559
4561{
4562 bool optimizeOutputForC = Config_getBool(OPTIMIZE_OUTPUT_FOR_C);
4563 SrcLangExt lang = getLanguage();
4564 if (!isLinkableInProject()) return;
4565 QCString memLabel;
4566 if (optimizeOutputForC)
4567 {
4568 memLabel=theTranslator->trGlobal(TRUE,TRUE);
4569 }
4570 else if (lang==SrcLangExt::Fortran)
4571 {
4572 memLabel=theTranslator->trSubprogram(TRUE,TRUE);
4573 }
4574 else
4575 {
4576 memLabel=theTranslator->trMember(TRUE,TRUE);
4577 }
4578 QCString memName = name();
4581 (toClassDef(pd))->displayName() : pd->name();
4583 QCString memArgs;
4584 if (!isRelated())
4585 {
4586 if (isObjCMethod())
4587 {
4588 memName = "[" + pd->name() + " " + name() + "]";
4589 }
4590 else
4591 {
4592 if (pd!=Doxygen::globalScope) memName.prepend(pdName+sep);
4593 memArgs = argsString();
4594 }
4595 }
4596 const RefItemVector &xrefItems = xrefListItems();
4597 if (sep!="::")
4598 {
4599 memName = substitute(memName,"::",sep);
4600 }
4601 addRefItem(xrefItems,
4602 qualifiedName()+argsString(), // argsString is needed for overloaded functions (see bug 609624)
4603 memLabel,
4604 getOutputFileBase()+"#"+anchor(),memName,memArgs,pd);
4605}
4606
4611
4613{
4614 auto it = m_sectionMap.find(container);
4615 return it!=m_sectionMap.end() ? it->second : nullptr;
4616}
4617
4619{
4620 //printf("MemberDefImpl::setSectionList(%s,%p) name=%s\n",qPrint(d->name()),sl,qPrint(name()));
4621 m_sectionMap.emplace(container,sl);
4622}
4623
4625{
4626 if (count>25)
4627 {
4629 "Internal inconsistency: recursion detected in overload relation for member {}!",name());
4630 return Specifier::Normal;
4631 }
4632 Specifier v = m_virt;
4633 const MemberDef *rmd = reimplements();
4634 while (rmd && v==Specifier::Normal)
4635 {
4636 v = rmd->virtualness(count+1)==Specifier::Normal ? Specifier::Normal : Specifier::Virtual;
4637 rmd = rmd->reimplements();
4638 }
4639 return v;
4640}
4641
4642void MemberDefImpl::writeTagFile(TextStream &tagFile,bool useQualifiedName,bool showNamespaceMembers) const
4643{
4644 if (!isLinkableInProject()) return;
4645 if (!showNamespaceMembers && getNamespaceDef()) return;
4646 tagFile << " <member kind=\"";
4647 switch (m_mtype)
4648 {
4649 case MemberType::Define: tagFile << "define"; break;
4650 case MemberType::EnumValue: tagFile << "enumvalue"; break;
4651 case MemberType::Property: tagFile << "property"; break;
4652 case MemberType::Event: tagFile << "event"; break;
4653 case MemberType::Variable: tagFile << "variable"; break;
4654 case MemberType::Typedef: tagFile << "typedef"; break;
4655 case MemberType::Enumeration: tagFile << "enumeration"; break;
4656 case MemberType::Function: tagFile << "function"; break;
4657 case MemberType::Signal: tagFile << "signal"; break;
4658 case MemberType::Friend: tagFile << "friend"; break;
4659 case MemberType::DCOP: tagFile << "dcop"; break;
4660 case MemberType::Slot: tagFile << "slot"; break;
4661 case MemberType::Interface: tagFile << "interface"; break;
4662 case MemberType::Service: tagFile << "service"; break;
4663 case MemberType::Sequence: tagFile << "sequence"; break;
4664 case MemberType::Dictionary: tagFile << "dictionary"; break;
4665 }
4666 if (m_prot!=Protection::Public)
4667 {
4668 tagFile << "\" protection=\"";
4669 if (m_prot==Protection::Protected) tagFile << "protected";
4670 else if (m_prot==Protection::Package) tagFile << "package";
4671 else /* Private */ tagFile << "private";
4672 }
4673 if (m_virt!=Specifier::Normal)
4674 {
4675 tagFile << "\" virtualness=\"";
4676 if (m_virt==Specifier::Virtual) tagFile << "virtual";
4677 else /* Pure */ tagFile << "pure";
4678 }
4679 if (isStatic())
4680 {
4681 tagFile << "\" static=\"yes";
4682 }
4683 tagFile << "\">\n";
4684 if (typeString()!=QCString("@"))
4685 {
4686 tagFile << " <type>" << convertToXML(typeString()) << "</type>\n";
4687 }
4690 tagFile << " <name>" << convertToXML(useQualifiedName ? qualifiedName() : name()) << "</name>\n";
4691 tagFile << " <anchorfile>" << convertToXML(fn) << "</anchorfile>\n";
4692 tagFile << " <anchor>" << convertToXML(anchor()) << "</anchor>\n";
4693 QCString idStr = id();
4694 if (!idStr.isEmpty())
4695 {
4696 tagFile << " <clangid>" << convertToXML(idStr) << "</clangid>\n";
4697 }
4698 tagFile << " <arglist>" << convertToXML(argsString()) << "</arglist>\n";
4699 if (isStrong())
4700 {
4701 for (const auto &fmd : m_enumFields)
4702 {
4703 if (!fmd->isReference())
4704 {
4705 tagFile << " <enumvalue file=\"" << convertToXML(fn);
4706 tagFile << "\" anchor=\"" << convertToXML(fmd->anchor());
4707 idStr = fmd->id();
4708 if (!idStr.isEmpty())
4709 {
4710 tagFile << "\" clangid=\"" << convertToXML(idStr);
4711 }
4712 tagFile << "\">" << convertToXML(fmd->name()) << "</enumvalue>\n";
4713 }
4714 }
4715 }
4716 writeDocAnchorsToTagFile(tagFile);
4717 tagFile << " </member>\n";
4718}
4719
4721{
4722 m_isConstructorCached=1; // FALSE
4723 if (getClassDef())
4724 {
4725 if (m_isDMember) // for D
4726 {
4727 m_isConstructorCached = name()=="this" ? 2 : 1;
4728 return;
4729 }
4730 else if (getLanguage()==SrcLangExt::PHP) // for PHP
4731 {
4732 m_isConstructorCached = name()=="__construct" ? 2 : 1;
4733 return;
4734 }
4735 else if (name()=="__init__" &&
4736 getLanguage()==SrcLangExt::Python) // for Python
4737 {
4738 m_isConstructorCached = 2; // TRUE
4739 return;
4740 }
4741 else // for other languages
4742 {
4743 QCString locName = getClassDef()->localName();
4744 int i=locName.find('<');
4745 if (i==-1) // not a template class
4746 {
4747 m_isConstructorCached = name()==locName ? 2 : 1;
4748 }
4749 else
4750 {
4751 m_isConstructorCached = name()==locName.left(i) ? 2 : 1;
4752 }
4753 return;
4754 }
4755 }
4756}
4757
4759{
4760 if (m_isConstructorCached==0)
4761 {
4762 MemberDefImpl *that = const_cast<MemberDefImpl*>(this);
4763 that->_computeIsConstructor();
4764 }
4766 return m_isConstructorCached==2;
4767
4768}
4769
4771{
4772 bool isDestructor = false;
4773 if (m_isDMember) // for D
4774 {
4775 isDestructor = name()=="~this";
4776 }
4777 else if (getLanguage()==SrcLangExt::PHP) // for PHP
4778 {
4779 isDestructor = name()=="__destruct";
4780 }
4781 else if (name()=="__del__" &&
4782 getLanguage()==SrcLangExt::Python) // for Python
4783 {
4784 isDestructor = true;
4785 }
4786 else if (getLanguage()==SrcLangExt::Fortran) // for Fortran
4787 {
4788 isDestructor = typeString()=="final";
4789 }
4790 else // other languages
4791 {
4792 isDestructor =
4793 (name().find('~')!=-1 || name().find('!')!=-1) // The ! is for C++/CLI
4794 && name().find("operator")==-1;
4795 }
4797}
4798
4800{
4801 if (m_isDestructorCached==0)
4802 {
4803 MemberDefImpl *that=const_cast<MemberDefImpl*>(this);
4804 that->_computeIsDestructor();
4805 }
4807 return m_isDestructorCached==2;
4808}
4809
4811 const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,const ModuleDef *mod) const
4812{
4813 int enumMemCount=0;
4814
4815 uint32_t numVisibleEnumValues=0;
4816 for (const auto &fmd : m_enumFields)
4817 {
4818 if (fmd->isBriefSectionVisible()) numVisibleEnumValues++;
4819 }
4820 if (numVisibleEnumValues==0 && !isBriefSectionVisible())
4821 {
4822 return;
4823 }
4824
4825 QCString n = name();
4826 int i=n.findRev("::");
4827 if (i!=-1) n=n.right(n.length()-i-2); // strip scope (TODO: is this needed?)
4828 if (n[0]!='@') // not an anonymous enum
4829 {
4831 {
4832 //_writeTagData(compoundType);
4833 writeLink(typeDecl,cd,nd,fd,gd,mod);
4834 }
4835 else
4836 {
4837 typeDecl.startBold();
4838 typeDecl.docify(n);
4839 typeDecl.endBold();
4840 }
4841 typeDecl.writeChar(' ');
4842 }
4843 if (!m_enumBaseType.isEmpty())
4844 {
4845 typeDecl.writeChar(':');
4846 typeDecl.writeChar(' ');
4847 typeDecl.docify(m_enumBaseType);
4848 typeDecl.writeChar(' ');
4849 }
4850
4851 uint32_t enumValuesPerLine = static_cast<uint32_t>(Config_getInt(ENUM_VALUES_PER_LINE));
4852 if (numVisibleEnumValues>0 && enumValuesPerLine>0)
4853 {
4854 typeDecl.docify("{ ");
4855
4856 auto it = m_enumFields.begin();
4857 if (it!=m_enumFields.end())
4858 {
4859 const MemberDef *fmd=*it;
4860 bool fmdVisible = fmd->isBriefSectionVisible();
4861 bool first=true;
4862 while (fmd)
4863 {
4864 if (fmdVisible)
4865 {
4866 if (!first)
4867 {
4868 typeDecl.writeString(", ");
4869 }
4870 /* in html we start a new line after a number of items */
4871 if (numVisibleEnumValues>enumValuesPerLine
4872 && (enumMemCount%enumValuesPerLine)==0
4873 )
4874 {
4875 typeDecl.pushGeneratorState();
4877 typeDecl.enable(OutputType::Latex);
4878 typeDecl.enable(OutputType::Docbook);
4879 typeDecl.lineBreak();
4880 typeDecl.disable(OutputType::Latex);
4881 typeDecl.disable(OutputType::Docbook);
4882 typeDecl.writeString("&#160;&#160;");
4883 typeDecl.popGeneratorState();
4884 }
4885
4886 if (fmd->hasDocumentation()) // enum value has docs
4887 {
4888 fmd->writeLink(typeDecl,cd,nd,fd,gd,mod);
4889 }
4890 else // no docs for this enum value
4891 {
4892 typeDecl.startBold();
4893 typeDecl.docify(fmd->name());
4894 typeDecl.endBold();
4895 }
4896 if (fmd->hasOneLineInitializer()) // enum value has initializer
4897 {
4898 //typeDecl.writeString(" = ");
4899 typeDecl.writeString(" ");
4900 typeDecl.parseText(fmd->initializer());
4901 }
4902 first=false;
4903 }
4904
4905 bool prevVisible = fmdVisible;
4906 ++it;
4907 if (it!=m_enumFields.end())
4908 {
4909 fmd=*it;
4910 }
4911 else
4912 {
4913 fmd=nullptr;
4914 }
4915 if (prevVisible)
4916 {
4917 typeDecl.disable(OutputType::Man);
4918 typeDecl.writeString("\n"); // to prevent too long lines in LaTeX
4919 typeDecl.enable(OutputType::Man);
4920 enumMemCount++;
4921 }
4922 }
4923 if (numVisibleEnumValues>enumValuesPerLine)
4924 {
4925 typeDecl.pushGeneratorState();
4927 typeDecl.lineBreak();
4928 typeDecl.popGeneratorState();
4929 }
4930 }
4931 typeDecl.docify(" }");
4932 }
4933}
4934
4935void MemberDefImpl::moveArgumentList(std::unique_ptr<ArgumentList> al)
4936{
4937 m_defArgList = *al;
4938}
4939
4940void MemberDefImpl::moveDeclArgumentList(std::unique_ptr<ArgumentList> al)
4941{
4942 m_declArgList = *al;
4943}
4944
4949
4951{
4952 m_type = t;
4953}
4954
4956{
4957 m_accessorClass = cd;
4958 m_accessorType = t;
4959}
4960
4965
4972
4978
4984
4990
4996
5001
5006
5008{
5009 if (getClassDef() && getClassDef()->isObjectiveC() && isFunction()) return TRUE;
5010 return FALSE;
5011}
5012
5014{
5015 if (getClassDef() && getClassDef()->isObjectiveC() && isProperty()) return TRUE;
5016 return FALSE;
5017}
5018
5020{
5021 if (getClassDef() && getClassDef()->isCSharp() && isProperty()) return TRUE;
5022 return FALSE;
5023}
5024
5026{
5027 if (isObjCMethod())
5028 {
5029 QCString qm;
5030 if (isStatic()) qm="+"; else qm="-";
5031 qm+="[";
5032 qm+=getClassDef()->name()+" ";
5033 qm+=name();
5034 qm+="]";
5035 return qm;
5036 }
5037 else if (m_enumScope && m_enumScope->isStrong())
5038 {
5039 return m_enumScope->qualifiedName()+
5041 localName();
5042 }
5043 else
5044 {
5046 }
5047}
5048
5050{
5051 if (ti)
5052 {
5053 //printf("%s: Setting tag name=%s anchor=%s\n",qPrint(name()),qPrint(ti->tagName),qPrint(ti->anchor));
5054 m_anc=ti->anchor;
5055 setReference(ti->tagName);
5057 }
5058}
5059
5060QCString MemberDefImpl::objCMethodName(bool localLink,bool showStatic) const
5061{
5062 QCString qm;
5063 if (showStatic)
5064 {
5065 if (isStatic()) qm="+ "; else qm="- ";
5066 }
5067 qm+=name();
5068 if (!localLink) // link to method of same class
5069 {
5070 qm+=" (";
5071 qm+=getClassDef()->name();
5072 qm+=")";
5073 }
5074 return qm;
5075}
5076
5078{
5079 return m_decl;
5080}
5081
5083{
5084 return m_def;
5085}
5086
5091
5093{
5094 return m_type;
5095}
5096
5098{
5099 return m_args;
5100}
5101
5103{
5104 return m_exception;
5105}
5106
5108{
5109 return m_bitfields;
5110}
5111
5113{
5114 return m_initializer;
5115}
5116
5118{
5119 return m_initLines;
5120}
5121
5126
5131
5133{
5134 return m_classDef;
5135}
5136
5141
5146
5148{
5149 return m_fileDef;
5150}
5151
5153{
5154 return m_fileDef;
5155}
5156
5158{
5159 return m_nspace;
5160}
5161
5166
5168{
5169 return m_read;
5170}
5171
5173{
5174 return m_write;
5175}
5176
5178{
5179 return m_group;
5180}
5181
5183{
5184 return m_group;
5185}
5186
5188{
5189 return m_moduleDef;
5190}
5191
5196
5201
5203{
5204 return m_groupStartLine;
5205}
5206
5208{
5209 return m_groupHasDocs;
5210}
5211
5213{
5214 return m_prot;
5215}
5216
5218{
5219 return m_mtype;
5220}
5221
5223{
5225}
5226
5228{
5229 return m_mtype==MemberType::Slot;
5230}
5231
5233{
5235}
5236
5238{
5240}
5241
5243{
5245}
5246
5248{
5250}
5251
5253{
5255}
5256
5258{
5260}
5261
5263{
5265}
5266
5268{
5269 return m_mtype==MemberType::Variable && QCString(argsString()).find(")(")!=-1;
5270}
5271
5273{
5275}
5276
5278{
5280}
5281
5283{
5284 return m_mtype==MemberType::DCOP;
5285}
5286
5288{
5290}
5291
5293{
5294 return m_mtype==MemberType::Event;
5295}
5296
5298{
5299 return m_related == Relationship::Related;
5300}
5301
5303{
5304 return m_related == Relationship::Foreign;
5305}
5306
5308{
5309 return m_stat;
5310}
5311
5313{
5314 return m_memSpec.isInline();
5315}
5316
5318{
5319 return m_memSpec.isExplicit();
5320}
5321
5323{
5324 return m_memSpec.isMutable();
5325}
5326
5328{
5329 return m_memSpec.isThreadLocal();
5330}
5331
5333{
5334 return m_memSpec.isGettable();
5335}
5336
5338{
5339 return m_memSpec.isPrivateGettable();
5340}
5341
5343{
5344 return m_memSpec.isProtectedGettable();
5345}
5346
5348{
5349 return m_memSpec.isSettable();
5350}
5351
5353{
5354 return m_memSpec.isPrivateSettable();
5355}
5356
5358{
5359 return m_memSpec.isProtectedSettable();
5360}
5361
5363{
5364 return m_memSpec.isAddable();
5365}
5366
5368{
5369 return m_memSpec.isRemovable();
5370}
5371
5373{
5374 return m_memSpec.isRaisable();
5375}
5376
5378{
5379 return m_memSpec.isReadable();
5380}
5381
5383{
5384 return m_memSpec.isWritable();
5385}
5386
5388{
5389 return m_memSpec.isFinal();
5390}
5391
5393{
5394 return m_memSpec.isNew();
5395}
5396
5398{
5399 return m_memSpec.isSealed();
5400}
5401
5403{
5404 return m_memSpec.isOverride();
5405}
5406
5408{
5409 return m_memSpec.isInitonly();
5410}
5411
5413{
5414 return m_memSpec.isAbstract();
5415}
5416
5418{
5419 return m_memSpec.isOptional();
5420}
5421
5423{
5424 return m_memSpec.isRequired();
5425}
5426
5428{
5429 return m_memSpec.isNonAtomic();
5430}
5431
5433{
5434 return m_memSpec.isCopy();
5435}
5436
5438{
5439 return m_memSpec.isAssign();
5440}
5441
5443{
5444 return m_memSpec.isRetain();
5445}
5446
5448{
5449 return m_memSpec.isWeak();
5450}
5451
5453{
5454 return m_memSpec.isStrong();
5455}
5456
5458{
5459 return m_memSpec.isEnumStruct();
5460}
5461
5463{
5465 m_enumScope &&
5466 m_enumScope->isStrong();
5467}
5468
5470{
5471 return m_memSpec.isUnretained();
5472}
5473
5475{
5476 return m_memSpec.isAlias();
5477}
5478
5480{
5481 return m_memSpec.isDefault();
5482}
5483
5485{
5486 return m_memSpec.isDelete();
5487}
5488
5490{
5491 return m_memSpec.isNoExcept();
5492}
5493
5495{
5496 return m_memSpec.isAttribute();
5497}
5498
5500{
5501 return m_memSpec.isProperty();
5502}
5503
5505{
5506 return m_memSpec.isReadonly();
5507}
5508
5510{
5511 return m_memSpec.isBound();
5512}
5513
5515{
5516 return m_memSpec.isConstrained();
5517}
5518
5520{
5521 return m_memSpec.isTransient();
5522}
5523
5525{
5526 return m_memSpec.isMaybeVoid();
5527}
5528
5530{
5531 return m_memSpec.isMaybeDefault();
5532}
5533
5535{
5536 return m_memSpec.isMaybeAmbiguous();
5537}
5538
5540{
5541 return m_memSpec.isPublished();
5542}
5543
5544
5546{
5547 return m_implOnly;
5548}
5549
5551{
5552 return m_explExt;
5553}
5554
5556{
5557 return m_tspec;
5558}
5559
5561{
5562 return isFunction() ||
5563 isSlot() ||
5564 isSignal() ||
5565 isConstructor() ||
5566 isDestructor() ||
5567 isObjCMethod() ||
5568 isFriend();
5569}
5570
5572{
5573 return m_relatedAlso;
5574}
5575
5577{
5578 return m_docEnumValues;
5579}
5580
5582{
5583 return m_annEnumType;
5584}
5585
5587{
5588 return m_docsForDefinition;
5589}
5590
5592{
5593 return m_enumScope;
5594}
5595
5597{
5598 return m_livesInsideEnum;
5599}
5600
5602{
5603 return m_memSpec.isLocal();
5604}
5605
5607{
5608 return m_memSpec.isNoDiscard();
5609}
5610
5612{
5613 return m_memSpec.isConstExpr();
5614}
5615
5617{
5618 return m_memSpec.isConstEval();
5619}
5620
5622{
5623 return m_memSpec.isConstInit();
5624}
5625
5627{
5628 return m_enumFields;
5629}
5630
5632{
5633 return m_examples;
5634}
5635
5637{
5638 return m_proto;
5639}
5640
5642{
5643 return m_defArgList;
5644}
5645
5647{
5648 return m_declArgList;
5649}
5650
5652{
5653 ArgumentList &decAl = m_declArgList;
5654 ArgumentList &defAl = m_defArgList;
5655 const ArgumentList &decAlSrc = md->declArgumentList();
5656 const ArgumentList &defAlSrc = md->argumentList();
5657 auto decSrc = decAlSrc.begin(), defSrc = defAlSrc.begin();
5658 for (auto decIt = decAl.begin(), defIt = defAl.begin();
5659 decIt != decAl.end() && defIt != defAl.end() && decSrc != decAlSrc.end() && defSrc != defAlSrc.end();
5660 ++decIt, ++defIt, ++decSrc, ++defSrc++)
5661 {
5662 Argument &decA = *decIt;
5663 Argument &defA = *defIt;
5664 const Argument &decAS = *decSrc;
5665 const Argument &defAS = *defSrc;
5666 if (decA.name.isEmpty())
5667 {
5668 if (!defA.name.isEmpty())
5669 {
5670 decA.name = defA.name;
5671 }
5672 else if (!decAS.name.isEmpty())
5673 {
5674 decA.name = decAS.name;
5675 }
5676 else if (!defAS.name.isEmpty())
5677 {
5678 decA.name = defAS.name;
5679 }
5680 }
5681 if (defA.name.isEmpty())
5682 {
5683 if (!decA.name.isEmpty())
5684 {
5685 defA.name = decA.name;
5686 }
5687 else if (!decAS.name.isEmpty())
5688 {
5689 defA.name = decAS.name;
5690 }
5691 else if (!defAS.name.isEmpty())
5692 {
5693 defA.name = defAS.name;
5694 }
5695 }
5696 }
5697}
5698
5700{
5701 return m_tArgList;
5702}
5703
5708
5710{
5711 return m_grpId;
5712}
5713
5718
5720{
5721 return m_annScope;
5722}
5723
5725{
5726 return m_hasCallGraph;
5727}
5728
5730{
5731 bool enabled = m_hasCallGraph &&
5732 (isFunction() || isSlot() || isSignal()) &&
5733 Config_getBool(HAVE_DOT);
5734 if (enabled)
5735 {
5736 bool trivial = DotCallGraph::isTrivial(this,FALSE);
5737 return !trivial;
5738 }
5739 return FALSE;
5740}
5741
5743{
5744 return m_hasCallerGraph;
5745}
5746
5748{
5749 bool enabled = m_hasCallerGraph &&
5750 (isFunction() || isSlot() || isSignal()) &&
5751 Config_getBool(HAVE_DOT);
5752 if (enabled)
5753 {
5754 bool trivial = DotCallGraph::isTrivial(this,TRUE);
5755 return !trivial;
5756 }
5757 return FALSE;
5758}
5759
5764
5769
5771{
5772 return m_hasInlineSource;
5773}
5774
5776{
5777 return m_hasEnumValues;
5778}
5779
5781{
5782 return m_templateMaster;
5783}
5784
5785std::optional<ArgumentList> MemberDefImpl::formalTemplateArguments() const
5786{
5788}
5789
5791{
5792 return m_isTypedefValCached;
5793}
5794
5799
5804
5806{
5807 //printf("MemberDefImpl::getCachedResolvedTypedef()=%s\n",qPrint(m_cachedResolvedType));
5808 return m_cachedResolvedType;
5809}
5810
5812{
5813 return m_memDef;
5814}
5815
5817{
5818 return m_memDec;
5819}
5820
5822{
5823 return m_docProvider;
5824}
5825
5827{
5828 return m_groupAlias;
5829}
5830
5835
5837{
5838 return m_declLine;
5839}
5840
5842{
5843 return m_declColumn;
5844}
5845
5846
5847//----------------------------------------------
5848
5854
5856{
5857 m_def=d;
5858}
5859
5867
5869{
5870 m_moduleDef=mod;
5871}
5872
5878
5883
5888
5893
5898
5900{
5901 for (const auto &sx : qualifiers)
5902 {
5903 bool alreadyAdded = std::find(m_qualifiers.begin(), m_qualifiers.end(), sx) != m_qualifiers.end();
5904 if (!alreadyAdded)
5905 {
5906 m_qualifiers.push_back(sx);
5907 }
5908 }
5909}
5910
5915
5917{
5918 if (lines!=-1)
5919 {
5920 m_userInitLines=lines;
5921 }
5922}
5923
5925{
5926 m_read=r;
5927}
5928
5930{
5931 m_write=w;
5932}
5933
5935{
5936 m_tspec=b;
5937}
5938
5940{
5941 m_related = Relationship::Related;
5943}
5944
5946{
5947 m_related = Relationship::Foreign;
5949}
5950
5952{
5953 m_docProvider = md;
5954}
5955
5957{
5958 m_args = as;
5959}
5960
5965
5972
5974{
5975 m_docEnumValues=value;
5976}
5977
5979{
5980 m_annEnumType = md;
5981}
5982
5983void MemberDefImpl::setPrototype(bool p,const QCString &df,int line,int column)
5984{
5985 m_proto=p;
5986 if (p)
5987 {
5988 setDeclFile(df,line,column);
5989 }
5990 else
5991 {
5992 setDefFile(df,line,column);
5993 }
5994}
5995
5996void MemberDefImpl::setExplicitExternal(bool b,const QCString &df,int line,int column)
5997{
5998 m_explExt=b;
5999 if (b)
6000 {
6001 setDeclFile(df,line,column);
6002 }
6003 else
6004 {
6005 setDefFile(df,line,column);
6006 }
6007}
6008
6009void MemberDefImpl::setDeclFile(const QCString &df,int line,int column)
6010{
6011 m_declFileName = df;
6012 m_declLine = line;
6013 m_declColumn = column;
6014}
6015
6017{
6018 m_grpId=id;
6019}
6020
6025
6027{
6028 m_annScope=b;
6029}
6030
6035
6040
6046
6051
6056
6058{
6059 m_groupAlias = md;
6060}
6061
6066
6071
6076
6078{
6079 return m_category;
6080}
6081
6083{
6084 m_category = def;
6085}
6086
6088{
6089 return m_categoryRelation;
6090}
6091
6096
6098{
6099 m_enumBaseType = type;
6100}
6101
6103{
6104 return m_enumBaseType;
6105}
6106
6108{
6109 m_requiresClause = req;
6110}
6111
6116
6117void MemberDefImpl::cacheTypedefVal(const ClassDef*val, const QCString & templSpec, const QCString &resolvedType)
6118{
6121 m_cachedTypedefTemplSpec=templSpec;
6122 m_cachedResolvedType=resolvedType;
6123 //printf("MemberDefImpl::cacheTypedefVal=%s m_impl=%p\n",qPrint(m_cachedResolvedType),m_impl);
6124}
6125
6127{
6128 {
6129 const ArgumentList &srcAl = bmd->argumentList();
6130 ArgumentList &dstAl = m_defArgList;
6131 auto srcIt = srcAl.begin();
6132 auto dstIt = dstAl.begin();
6133 while ( srcIt!=srcAl.end() && dstIt!=dstAl.end())
6134 {
6135 Argument &argDst = *dstIt;
6136 const Argument &argSrc = *srcIt;
6137 argDst.name = argSrc.name;
6138 argDst.docs = argSrc.docs;
6139 ++srcIt;
6140 ++dstIt;
6141 }
6142 }
6143
6144 {
6145 const ArgumentList &srcAl = bmd->declArgumentList();
6146 ArgumentList &dstAl = m_declArgList;
6147 auto srcIt = srcAl.begin();
6148 auto dstIt = dstAl.begin();
6149
6150 while ( srcIt!=srcAl.end() && dstIt!=dstAl.end())
6151 {
6152 Argument &argDst = *dstIt;
6153 const Argument &argSrc = *srcIt;
6154 argDst.name = argSrc.name;
6155 argDst.docs = argSrc.docs;
6156 ++srcIt;
6157 ++dstIt;
6158 }
6159 }
6160}
6161
6163{
6164 for (Argument &a : al)
6165 {
6166 a.canType.clear();
6167 }
6168}
6169
6175
6180
6182{
6183 return m_numberOfFlowKW;
6184}
6185
6186//----------------
6187
6189{
6190 return DefinitionMixin::name();
6191}
6192
6193//----------------
6194
6196{
6197 for (auto decIt = decAl.begin(), defIt = defAl.begin();
6198 decIt!= decAl.end() && defIt!= defAl.end();
6199 ++decIt, ++defIt)
6200 {
6201 Argument &decA = *decIt;
6202 Argument &defA = *defIt;
6203 if (decA.docs.isEmpty() && !defA.docs.isEmpty())
6204 {
6205 decA.docs = defA.docs;
6206 }
6207 else if (defA.docs.isEmpty() && !decA.docs.isEmpty())
6208 {
6209 defA.docs = decA.docs;
6210 }
6211 if (Config_getBool(RESOLVE_UNNAMED_PARAMS))
6212 {
6213 if (decA.name.isEmpty() && !defA.name.isEmpty())
6214 {
6215 decA.name = defA.name;
6216 }
6217 else if (defA.name.isEmpty() && !decA.name.isEmpty())
6218 {
6219 defA.name = decA.name;
6220 }
6221 }
6222 }
6223}
6224
6226{
6227 AUTO_TRACE("mdec='{}' mdef='{}' mdec.isPrototype={} mdef.isPrototype={}",
6228 mdec->name(), mdef->name(), mdec->isPrototype(), mdef->isPrototype());
6229 if (
6230 (mdef->isFunction() && !mdef->isStatic() && !mdef->isPrototype()) ||
6231 (mdef->isVariable() && !mdef->isExternal() && !mdef->isStatic())
6232 )
6233 {
6234 bool sameNumTemplateArgs = mdef->templateArguments().size()==mdec->templateArguments().size();
6235
6236 ArgumentList &mdefAl = const_cast<ArgumentList&>(mdef->argumentList());
6237 ArgumentList &mdecAl = const_cast<ArgumentList&>(mdec->argumentList());
6238 if (sameNumTemplateArgs &&
6239 matchArguments2(mdef->getOuterScope(),mdef->getFileDef(),mdef->typeString(),&mdefAl,
6240 mdec->getOuterScope(),mdec->getFileDef(),mdec->typeString(),&mdecAl,
6241 TRUE,mdef->getLanguage()
6242 )
6243 ) /* match found */
6244 {
6245 AUTO_TRACE_ADD("combining definition and declaration");
6246
6247 if (Config_getBool(RESOLVE_UNNAMED_PARAMS))
6248 {
6249 mdec->resolveUnnamedParameters(mdef);
6250 }
6251
6252 // first merge argument documentation
6253 transferArgumentDocumentation(mdecAl,mdefAl);
6254
6255 /* copy documentation between function definition and declaration */
6256 if (!mdec->briefDescription().isEmpty())
6257 {
6258 mdef->setBriefDescription(mdec->briefDescription(),mdec->briefFile(),mdec->briefLine());
6259 }
6260 else if (!mdef->briefDescription().isEmpty())
6261 {
6262 mdec->setBriefDescription(mdef->briefDescription(),mdef->briefFile(),mdef->briefLine());
6263 }
6264 if (!mdef->documentation().isEmpty())
6265 {
6266 //printf("transferring docs mdef->mdec (%s->%s)\n",mdef->argsString(),mdec->argsString());
6267 mdec->setDocumentation(mdef->documentation(),mdef->docFile(),mdef->docLine());
6269 if (mdefAl.hasParameters())
6270 {
6271 auto mdefAlComb = stringToArgumentList(mdef->getLanguage(),mdef->argsString());
6272 transferArgumentDocumentation(mdefAl,*mdefAlComb);
6273 mdec->moveArgumentList(std::move(mdefAlComb));
6274 }
6275 }
6276 else if (!mdec->documentation().isEmpty())
6277 {
6278 //printf("transferring docs mdec->mdef (%s->%s)\n",mdec->argsString(),mdef->argsString());
6279 mdef->setDocumentation(mdec->documentation(),mdec->docFile(),mdec->docLine());
6281 if (mdecAl.hasParameters())
6282 {
6283 auto mdecAlComb = stringToArgumentList(mdec->getLanguage(),mdec->argsString());
6284 transferArgumentDocumentation(mdecAl,*mdecAlComb);
6285 mdef->moveDeclArgumentList(std::move(mdecAlComb));
6286 }
6287 }
6288 if (!mdef->inbodyDocumentation().isEmpty())
6289 {
6290 mdec->setInbodyDocumentation(mdef->inbodyDocumentation(),mdef->inbodyFile(),mdef->inbodyLine());
6291 }
6292 else if (!mdec->inbodyDocumentation().isEmpty())
6293 {
6294 mdef->setInbodyDocumentation(mdec->inbodyDocumentation(),mdec->inbodyFile(),mdec->inbodyLine());
6295 }
6296 if (mdec->getStartBodyLine()!=-1 && mdef->getStartBodyLine()==-1)
6297 {
6298 //printf("body mdec->mdef %d-%d\n",mdec->getStartBodyLine(),mdef->getEndBodyLine());
6299 mdef->setBodySegment(mdec->getDefLine(),mdec->getStartBodyLine(),mdec->getEndBodyLine());
6300 mdef->setBodyDef(mdec->getBodyDef());
6301 //mdef->setBodyMember(mdec);
6302 }
6303 else if (mdef->getStartBodyLine()!=-1 && mdec->getStartBodyLine()==-1)
6304 {
6305 //printf("body mdef->mdec %d-%d\n",mdef->getStartBodyLine(),mdec->getEndBodyLine());
6306 mdec->setBodySegment(mdef->getDefLine(),mdef->getStartBodyLine(),mdef->getEndBodyLine());
6307 mdec->setBodyDef(mdef->getBodyDef());
6308 //mdec->setBodyMember(mdef);
6309 }
6312
6313 // copy group info.
6314 if (mdec->getGroupDef()==nullptr && mdef->getGroupDef()!=nullptr)
6315 {
6316 mdec->setGroupDef(mdef->getGroupDef(),
6317 mdef->getGroupPri(),
6318 mdef->docFile(),
6319 mdef->docLine(),
6320 mdef->hasDocumentation(),
6321 mdef
6322 );
6323 }
6324 else if (mdef->getGroupDef()==nullptr && mdec->getGroupDef()!=nullptr)
6325 {
6326 mdef->setGroupDef(mdec->getGroupDef(),
6327 mdec->getGroupPri(),
6328 mdec->docFile(),
6329 mdec->docLine(),
6330 mdec->hasDocumentation(),
6331 mdec
6332 );
6333 }
6334
6335
6336 mdec->mergeRefItems(mdef);
6337 mdef->mergeRefItems(mdec);
6338
6339 mdef->setMemberDeclaration(mdec);
6340 mdec->setMemberDefinition(mdef);
6341
6342 mergeMemberOverrideOptions(mdec,mdef);
6343
6344 mdef->addQualifiers(mdec->getQualifiers());
6345 mdec->addQualifiers(mdef->getQualifiers());
6346 }
6347 }
6348}
6349
6351{
6352 if (m_templateMaster)
6353 {
6354 return m_templateMaster->briefDescription(abbr);
6355 }
6356 else
6357 {
6359 }
6360}
6361
6363{
6364 if (m_templateMaster)
6365 {
6366 return m_templateMaster->documentation();
6367 }
6368 else
6369 {
6371 }
6372}
6373
6375{
6376 if (m_templateMaster)
6377 {
6378 return m_templateMaster->hasUserDocumentation();
6379 }
6380 else
6381 {
6383 }
6384}
6385
6387{
6388 return m_typeConstraints;
6389}
6390
6392{
6393 bool hideFriendCompounds = Config_getBool(HIDE_FRIEND_COMPOUNDS);
6394 bool isFriendToHide = hideFriendCompounds &&
6395 (m_type=="friend class" ||
6396 m_type=="friend struct" ||
6397 m_type=="friend union");
6398 return isFriendToHide;
6399}
6400
6402{
6403 return (isFriend() &&
6404 (m_type=="friend class" || m_type=="friend struct" ||
6405 m_type=="friend union"));
6406}
6407
6408
6410{
6411 return !(isFriend() && isFriendToHide());
6412}
6413
6415{
6416 return isFunction() || isSlot() || isSignal();
6417}
6418
6420{
6421 return isRelated() || isForeign() || (isFriend() && !isFriendToHide());
6422}
6423
6425{
6427 (m_templateMaster && m_templateMaster->isReference());
6428}
6429
6453
6455{
6456 return m_redefineCount;
6457}
6458
6460{
6461 m_redefineCount=count;
6462}
6463
6464//-------------------------------------------------------------------------------
6465// Helpers
6466
6468
6470{
6471 MemberDefMutable *src = toMemberDefMutable(const_cast<MemberDef*>(s));
6472 MemberDefMutable *dst = toMemberDefMutable(const_cast<MemberDef*>(d));
6473 if (src==nullptr || dst==nullptr) return;
6474 //printf("--> addDocCrossReference src=%s,dst=%s\n",qPrint(src->name()),qPrint(dst->name()));
6475 if (dst->isTypedef() || dst->isEnumerate()) return; // don't add types
6476 if ((dst->hasReferencedByRelation() || dst->hasCallerGraph()) &&
6477 src->isCallable()
6478 )
6479 {
6480 QCString sourceRefName = src->sourceRefName();
6483
6484 // ---- critical section
6485 std::lock_guard<std::mutex> lock(g_docCrossReferenceMutex);
6486 dst->addSourceReferencedBy(src,sourceRefName);
6487 if (mdDef)
6488 {
6489 mdDef->addSourceReferencedBy(src,sourceRefName);
6490 }
6491 if (mdDecl)
6492 {
6493 mdDecl->addSourceReferencedBy(src,sourceRefName);
6494 }
6495 // ---- end critical section
6496 }
6497 if ((src->hasReferencesRelation() || src->hasCallGraph()) &&
6498 src->isCallable()
6499 )
6500 {
6501 QCString sourceRefName = dst->sourceRefName();
6504
6505 // ---- critical section
6506 std::lock_guard<std::mutex> lock(g_docCrossReferenceMutex);
6507 src->addSourceReferences(dst,sourceRefName);
6508 if (mdDef)
6509 {
6510 mdDef->addSourceReferences(dst,sourceRefName);
6511 }
6512 if (mdDecl)
6513 {
6514 mdDecl->addSourceReferences(dst,sourceRefName);
6515 }
6516 // ---- end critical section
6517 }
6518}
6519
6520// --- Cast functions
6521//
6523{
6524 if (d && (typeid(*d)==typeid(MemberDefImpl) || typeid(*d)==typeid(MemberDefAliasImpl)))
6525 {
6526 return static_cast<MemberDef*>(d);
6527 }
6528 else
6529 {
6530 return nullptr;
6531 }
6532}
6533
6535{
6536 Definition *d = toDefinition(md);
6537 if (d && typeid(*d)==typeid(MemberDefImpl))
6538 {
6539 return static_cast<MemberDef*>(d);
6540 }
6541 else
6542 {
6543 return nullptr;
6544 }
6545}
6546
6548{
6549 if (d && (typeid(*d)==typeid(MemberDefImpl) || typeid(*d)==typeid(MemberDefAliasImpl)))
6550 {
6551 return static_cast<const MemberDef*>(d);
6552 }
6553 else
6554 {
6555 return nullptr;
6556 }
6557}
6558
6560{
6561 if (d && typeid(*d)==typeid(MemberDefImpl))
6562 {
6563 return static_cast<MemberDefMutable*>(d);
6564 }
6565 else
6566 {
6567 return nullptr;
6568 }
6569}
6570
6571
constexpr auto prefix
Definition anchor.cpp:44
std::vector< ArgumentList > ArgumentLists
Definition arguments.h:147
This class represents an function or template argument list.
Definition arguments.h:65
RefQualifierType refQualifier() const
Definition arguments.h:116
iterator end()
Definition arguments.h:94
bool hasParameters() const
Definition arguments.h:76
QCString trailingReturnType() const
Definition arguments.h:114
size_t size() const
Definition arguments.h:100
bool constSpecifier() const
Definition arguments.h:111
bool empty() const
Definition arguments.h:99
iterator begin()
Definition arguments.h:93
bool volatileSpecifier() const
Definition arguments.h:112
A abstract class representing of a compound symbol.
Definition classdef.h:104
virtual QCString compoundTypeString() const =0
Returns the type of compound as a string.
virtual int isBaseClass(const ClassDef *bcd, bool followInstances, const QCString &templSpec=QCString()) const =0
Returns TRUE iff bcd is a direct or indirect base class of this class.
virtual ArgumentLists getTemplateParameterLists() const =0
Returns the template parameter lists that form the template declaration of this class.
virtual bool isObjectiveC() const =0
Returns TRUE if this class is implemented in Objective-C.
virtual bool isSimple() const =0
virtual ClassDef * categoryOf() const =0
Returns the class of which this is a category (Objective-C only).
virtual void writeDeclaration(OutputList &ol, const MemberDef *md, bool inGroup, int indentLevel, const ClassDef *inheritedFrom, const QCString &inheritId) const =0
@ Interface
Definition classdef.h:112
virtual CompoundType compoundType() const =0
Returns the type of compound this is, i.e.
const Definition * getAlias() const
const Definition * getScope() const
DefinitionAliasMixin(const Definition *scope, const Definition *alias)
The common base class of all entity definitions found in the sources.
Definition definition.h:77
virtual QCString docFile() const =0
virtual const QCString & localName() const =0
virtual int getEndBodyLine() const =0
virtual SrcLangExt getLanguage() const =0
Returns the programming language this definition was written in.
virtual int docLine() const =0
virtual QCString getDefFileName() const =0
virtual bool isLinkable() const =0
virtual int getDefLine() const =0
virtual DefType definitionType() const =0
virtual QCString anchor() const =0
virtual int inbodyLine() const =0
virtual const FileDef * getBodyDef() const =0
virtual int briefLine() const =0
virtual bool hasDocumentation() const =0
virtual bool isLinkableInProject() const =0
virtual QCString briefDescription(bool abbreviate=FALSE) const =0
virtual bool hasUserDocumentation() const =0
virtual bool isAnonymous() const =0
virtual QCString getReference() const =0
virtual QCString documentation() const =0
virtual QCString qualifiedName() const =0
virtual QCString displayName(bool includeScope=TRUE) const =0
virtual QCString briefFile() const =0
virtual CodeSymbolType codeSymbolType() const =0
virtual QCString getOutputFileBase() const =0
virtual Definition * getOuterScope() const =0
virtual int getStartBodyLine() const =0
virtual bool isReference() const =0
virtual QCString inbodyDocumentation() const =0
virtual QCString inbodyFile() const =0
virtual const QCString & name() const =0
bool isReference() const override
const QCString & name() const override
void writeSourceDef(OutputList &ol) const override
bool hasUserDocumentation() const override
QCString inbodyFile() const override
QCString getDefFileName() const override
void writeSourceRefs(OutputList &ol, const QCString &scopeName) const override
bool hasBriefDescription() const override
QCString docFile() const override
QCString getDefFileExtension() const override
bool hasRequirementRefs() const override
QCString briefFile() const override
QCString qualifiedName() const override
void setOuterScope(Definition *def) override
void setDocumentation(const QCString &doc, const QCString &docFile, int docLine, bool stripWhiteSpace=TRUE) override
void setReference(const QCString &r) override
void writeRequirementRefs(OutputList &ol) const override
QCString getSourceFileBase() const override
const RefItemVector & xrefListItems() const override
QCString briefDescription(bool abbreviate=FALSE) const override
bool hasSourceReffedBy() const override
void setBriefDescription(const QCString &brief, const QCString &briefFile, int briefLine) override
void writeSourceReffedBy(OutputList &ol, const QCString &scopeName) const override
Definition * getOuterScope() const override
void setInbodyDocumentation(const QCString &doc, const QCString &docFile, int docLine) override
QCString getReference() const override
DefinitionMixin(const QCString &defFileName, int defLine, int defColumn, const QCString &name, const char *b=nullptr, const char *d=nullptr, bool isSymbol=TRUE)
const QCString & localName() const override
void writeInlineCode(OutputList &ol, const QCString &scopeName) const override
const FileDef * getBodyDef() const override
void setDefFile(const QCString &df, int defLine, int defColumn) override
QCString inbodyDocumentation() const override
void setHidden(bool b) override
QCString documentation() const override
void writeDocAnchorsToTagFile(TextStream &fs) const override
bool hasDocumentation() const override
SrcLangExt getLanguage() const override
virtual void setBodySegment(int defLine, int bls, int ble)=0
virtual void setDocumentation(const QCString &d, const QCString &docFile, int docLine, bool stripWhiteSpace=TRUE)=0
virtual void addSourceReferences(MemberDef *d, const QCString &sourceRefName)=0
virtual void setInbodyDocumentation(const QCString &d, const QCString &docFile, int docLine)=0
virtual void mergeRefItems(Definition *d)=0
virtual void setBodyDef(const FileDef *fd)=0
virtual void setBriefDescription(const QCString &b, const QCString &briefFile, int briefLine)=0
virtual void addSourceReferencedBy(MemberDef *d, const QCString &sourceRefName)=0
Representation of an call graph.
int numNodes() const
bool isTooBig() const
bool isTrivial() const
static bool suppressDocWarnings
Definition doxygen.h:131
static bool parseSourcesNeeded
Definition doxygen.h:122
static ParserManager * parserManager
Definition doxygen.h:130
static NamespaceDefMutable * globalScope
Definition doxygen.h:120
A model of a file symbol.
Definition filedef.h:99
virtual QCString absFilePath() const =0
A model of a group of symbols.
Definition groupdef.h:52
bool hasEnumValues() const override
bool isConstEval() const override
const ClassDef * getCachedTypedefVal() const override
NamespaceDef * getNamespaceDef() override
const NamespaceDef * getNamespaceDef() const override
bool hasExamples() const override
GroupDef * getGroupDef() override
QCString getDeclFileName() const override
QCString argsString() const override
bool isSettable() const override
bool isConstrained() const override
bool getGroupHasDocs() const override
const ClassDef * getClassDef() const override
const MemberDef * inheritsDocsFrom() const override
bool hasCallerGraph() const override
QCString enumBaseType() const override
bool isConstInit() const override
bool isFinal() const override
const MemberDef * reimplements() const override
bool isOptional() const override
QCString getOutputFileBase() const override
bool isTypeAlias() const override
bool isRequired() const override
bool isRemovable() const override
void setMemberGroup(MemberGroup *grp) override
bool isDeleted() const override
bool isPrivateGettable() const override
bool isSignal() const override
MemberDef * memberDeclaration() const override
bool isFriendClass() const override
const MemberDef * getGroupAlias() const override
bool isStrongEnumValue() const override
bool isAssign() const override
QCString getReadAccessor() const override
int getGroupStartLine() const override
std::unique_ptr< MemberDef > deepCopy() const override
bool isUNOProperty() const override
void warnIfUndocumented() const override
bool hasUserDocumentation() const override
bool isSliceLocal() const override
const ArgumentLists & definitionTemplateParameterLists() const override
bool isPublished() const override
bool isSequence() const override
bool isDictionary() const override
bool isVariable() const override
FileDef * getFileDef() override
ClassDef * getClassDefOfAnonymousType() const override
QCString getCachedResolvedTypedef() const override
const MemberDef * templateMaster() const override
void warnIfUndocumentedParams() const override
bool isExternal() const override
bool isProperty() const override
bool isWritable() const override
bool isDocumentedFriendClass() const override
int redefineCount() const override
bool isConstExpr() const override
int initializerLines() const override
bool isMaybeVoid() const override
int getMemberGroupId() const override
bool isInitonly() const override
const ExampleList & getExamples() const override
bool hasOneLineInitializer() const override
bool isProtectedGettable() const override
bool hasDocumentation() const override
bool livesInsideEnum() const override
QCString declaration() const override
bool hasCallGraph() const override
bool isCopy() const override
int getDeclLine() const override
bool isEnumerate() const override
void writeLink(OutputList &ol, const ClassDef *cd, const NamespaceDef *nd, const FileDef *fd, const GroupDef *gd, const ModuleDef *mod, bool onlyText=FALSE) const override
const QCString & initializer() const override
bool isReference() const override
TypeSpecifier getMemberSpecifiers() const override
QCString getReference() const override
bool isThreadLocal() const override
bool hasMultiLineInitializer() const override
QCString getCachedTypedefTemplSpec() const override
bool isDocsForDefinition() const override
Grouping::GroupPri_t getGroupPri() const override
bool isTypedefValCached() const override
const ClassDef * accessorClass() const override
bool isRaisable() const override
bool isUnretained() const override
bool isGettable() const override
const MemberVector & enumFieldList() const override
bool isObjCProperty() const override
int getDeclColumn() const override
const ArgumentList & declArgumentList() const override
bool isCallable() const override
bool isDefine() const override
bool isLinkableInProject() const override
bool hasDetailedDescription() const override
bool isFriendToHide() const override
QCString excpString() const override
QCString getDeclType() const override
QCString briefDescription(bool) const override
QCString objCMethodName(bool localLink, bool showStatic) const override
const GroupDef * getGroupDef() const override
bool isDestructor() const override
bool isNoDiscard() const override
bool hasDocumentedEnumValues() const override
bool isBound() const override
void detectUndocumentedParams(bool, bool) const override
bool fromAnonymousScope() const override
bool isFunctionPtr() const override
StringVector getLabels(const Definition *container) const override
QCString memberTypeName() const override
std::unique_ptr< MemberDef > createTemplateInstanceMember(const ArgumentList &formalArgs, const std::unique_ptr< ArgumentList > &actualArgs) const override
bool isAddable() const override
QCString getScopeString() const override
QCString getGroupFileName() const override
QCString extraTypeChars() const override
const ArgumentList & argumentList() const override
const ArgumentList & typeConstraints() const override
Specifier virtualness(int) const override
bool isFunctionOrSignalSlot() const override
bool isDefault() const override
bool isPrototype() const override
bool isAttribute() const override
MemberDef * memberDefinition() const override
bool isTypedef() const override
bool isNoExcept() const override
QCString displayDefinition() const override
bool isInline() const override
bool isRelatedOrFriend() const override
bool hasReferencesRelation() const override
bool isStrong() const override
const MemberDef * getMdAlias() const
bool isObjCMethod() const override
bool isAbstract() const override
bool isStatic() const override
bool isPrivateSettable() const override
bool isSealed() const override
bool isRelated() const override
MemberDef * getMdAlias()
bool isOverride() const override
bool isForeign() const override
bool isImplementation() const override
QCString anchor() const override
const MemberVector & reimplementedBy() const override
VhdlSpecifier getVhdlSpecifiers() const override
bool isMaybeDefault() const override
MemberType memberType() const override
bool isLinkable() const override
bool isProtectedSettable() const override
bool isReadonly() const override
const MemberDef * categoryRelation() const override
ClassDef * getClassDef() override
MemberDefAliasImpl(const Definition *newScope, const MemberDef *md)
const MemberDef * getEnumScope() const override
Protection protection() const override
bool isSlot() const override
const QCString & name() const override
bool isDelete() const override
bool isReadable() const override
bool isEvent() const override
QCString definition() const override
bool isNonAtomic() const override
QCString getWriteAccessor() const override
QCString bitfieldString() const override
DefType definitionType() const override
bool isReimplementedBy(const ClassDef *cd) const override
bool isDCOP() const override
void writeEnumDeclaration(OutputList &typeDecl, const ClassDef *cd, const NamespaceDef *nd, const FileDef *fd, const GroupDef *gd, const ModuleDef *mod) const override
bool isDetailedSectionVisible(MemberListContainer container) const override
bool isNotFriend() const override
void writeDeclaration(OutputList &ol, const ClassDef *cd, const NamespaceDef *nd, const FileDef *fd, const GroupDef *gd, const ModuleDef *mod, bool inGroup, int indentLevel, const ClassDef *inheritFrom=nullptr, const QCString &inheritId=QCString()) const override
const MemberList * getSectionList(const Definition *container) const override
bool isTemplateSpecialization() const override
QCString typeString() const override
const ModuleDef * getModuleDef() const override
bool isExplicit() const override
CodeSymbolType codeSymbolType() const override
MemberDef * fromAnonymousMember() const override
bool isConstructor() const override
bool isTransient() const override
int numberOfFlowKeyWords() const override
bool isFriend() const override
bool isWeak() const override
bool isMutable() const override
QCString requiresClause() const override
MemberDef * resolveAlias() override
const FileDef * getFileDef() const override
QCString fieldType() const override
std::optional< ArgumentList > formalTemplateArguments() const override
const MemberDef * resolveAlias() const override
bool isEnumValue() const override
bool isNew() const override
const MemberDef * getAnonymousEnumType() const override
bool isMaybeAmbiguous() const override
bool hasReferencedByRelation() const override
bool isCSharpProperty() const override
bool hasInlineSource() const override
ClassDef * category() const override
void moveTo(Definition *) override
MemberGroup * getMemberGroup() const override
MemberGroup * m_memberGroup
bool isFunction() const override
QCString displayName(bool b=TRUE) const override
bool visibleInIndex() const override
QCString sourceRefName() const override
ClassDef * relatedAlso() const override
bool isRetain() const override
bool isEnumStruct() const override
QCString documentation() const override
bool isBriefSectionVisible() const override
const ArgumentList & templateArguments() const override
~MemberDefAliasImpl() override
StringVector getQualifiers() const override
QCString qualifiedName() const override
A model of a class/file/namespace member symbol.
Definition memberdef.h:48
virtual QCString typeString() const =0
virtual bool isConstExpr() const =0
virtual bool getGroupHasDocs() const =0
virtual const MemberDef * getAnonymousEnumType() const =0
virtual bool isConstEval() const =0
virtual bool isInitonly() const =0
virtual bool isSignal() const =0
virtual bool isNoExcept() const =0
virtual QCString requiresClause() const =0
virtual bool isDestructor() const =0
virtual bool hasDetailedDescription() const =0
virtual bool isAssign() const =0
virtual bool isExplicit() const =0
virtual MemberDef * memberDefinition() const =0
virtual bool isNew() const =0
virtual QCString declaration() const =0
virtual QCString getCachedResolvedTypedef() const =0
virtual bool isObjCMethod() const =0
virtual bool hasDocumentedEnumValues() const =0
virtual MemberDef * memberDeclaration() const =0
virtual bool isMaybeVoid() const =0
virtual bool isConstructor() const =0
virtual bool isFriend() const =0
virtual void writeEnumDeclaration(OutputList &typeDecl, const ClassDef *cd, const NamespaceDef *nd, const FileDef *fd, const GroupDef *gd, const ModuleDef *mod) const =0
virtual const ClassDef * accessorClass() const =0
virtual bool isForeign() const =0
virtual bool isSealed() const =0
virtual QCString definition() const =0
virtual bool hasExamples() const =0
virtual QCString enumBaseType() const =0
virtual bool isDelete() const =0
virtual void writeDeclaration(OutputList &ol, const ClassDef *cd, const NamespaceDef *nd, const FileDef *fd, const GroupDef *gd, const ModuleDef *md, bool inGroup, int indentLevel=0, const ClassDef *inheritFrom=nullptr, const QCString &inheritId=QCString()) const =0
virtual int numberOfFlowKeyWords() const =0
virtual const MemberDef * inheritsDocsFrom() const =0
virtual bool isDefault() const =0
virtual bool isRelated() const =0
virtual bool isDocumentedFriendClass() const =0
virtual bool isConstInit() const =0
virtual bool fromAnonymousScope() const =0
virtual bool isDeleted() const =0
virtual const ClassDef * getCachedTypedefVal() const =0
virtual bool isRelatedOrFriend() const =0
virtual QCString fieldType() const =0
virtual QCString excpString() const =0
virtual bool isSequence() const =0
virtual bool isEnumStruct() const =0
virtual const ClassDef * getClassDef() const =0
virtual bool visibleInIndex() const =0
virtual const MemberDef * getGroupAlias() const =0
virtual bool isOverride() const =0
virtual bool hasReferencesRelation() const =0
virtual const ArgumentList & templateArguments() const =0
virtual GroupDef * getGroupDef()=0
virtual bool isSettable() const =0
virtual MemberDef * fromAnonymousMember() const =0
virtual bool isCSharpProperty() const =0
virtual bool isRetain() const =0
virtual bool isAddable() const =0
virtual bool isTypedef() const =0
virtual ClassDef * category() const =0
virtual bool isSlot() const =0
virtual const MemberVector & enumFieldList() const =0
virtual bool hasCallGraph() const =0
virtual const FileDef * getFileDef() const =0
virtual bool isInline() const =0
virtual bool isEvent() const =0
virtual const ArgumentList & argumentList() const =0
virtual QCString extraTypeChars() const =0
virtual bool isWritable() const =0
virtual bool isMaybeAmbiguous() const =0
virtual bool isPrivateGettable() const =0
virtual bool isStrongEnumValue() const =0
virtual VhdlSpecifier getVhdlSpecifiers() const =0
virtual const MemberVector & reimplementedBy() const =0
virtual int getGroupStartLine() const =0
virtual bool isFunction() const =0
virtual bool isRequired() const =0
virtual bool isAttribute() const =0
virtual bool isExternal() const =0
virtual QCString sourceRefName() const =0
virtual bool isCopy() const =0
virtual QCString displayDefinition() const =0
virtual QCString getScopeString() const =0
virtual int getMemberGroupId() const =0
virtual bool isDictionary() const =0
virtual int getDeclLine() const =0
virtual bool isTypeAlias() const =0
virtual QCString getDeclType() const =0
virtual int getDeclColumn() const =0
virtual bool isStatic() const =0
virtual const MemberDef * reimplements() const =0
virtual bool isMaybeDefault() const =0
virtual bool livesInsideEnum() const =0
virtual QCString getWriteAccessor() const =0
virtual bool hasInlineSource() const =0
virtual bool isTemplateSpecialization() const =0
virtual bool isPrivateSettable() const =0
virtual StringVector getQualifiers() const =0
virtual QCString getCachedTypedefTemplSpec() const =0
virtual QCString bitfieldString() const =0
virtual bool isRaisable() const =0
virtual bool isRemovable() const =0
virtual bool isTypedefValCached() const =0
virtual bool isConstrained() const =0
virtual bool isDocsForDefinition() const =0
virtual bool isBound() const =0
virtual bool hasEnumValues() const =0
virtual bool isFriendToHide() const =0
virtual bool isReimplementedBy(const ClassDef *cd) const =0
virtual bool isNonAtomic() const =0
virtual const ModuleDef * getModuleDef() const =0
virtual bool isThreadLocal() const =0
virtual bool isDefine() const =0
virtual ClassDef * getClassDefOfAnonymousType() const =0
virtual const NamespaceDef * getNamespaceDef() const =0
virtual bool isPublished() const =0
virtual bool isFunctionPtr() const =0
virtual std::unique_ptr< MemberDef > createTemplateInstanceMember(const ArgumentList &formalArgs, const std::unique_ptr< ArgumentList > &actualArgs) const =0
virtual bool hasCallerGraph() const =0
virtual Grouping::GroupPri_t getGroupPri() const =0
virtual QCString getDeclFileName() const =0
virtual const ArgumentList & typeConstraints() const =0
virtual bool isProtectedSettable() const =0
virtual bool isImplementation() const =0
virtual bool isProtectedGettable() const =0
virtual QCString objCMethodName(bool localLink, bool showStatic) const =0
virtual bool hasOneLineInitializer() const =0
virtual const MemberDef * templateMaster() const =0
virtual std::optional< ArgumentList > formalTemplateArguments() const =0
virtual bool isObjCProperty() const =0
virtual bool isTransient() const =0
virtual const MemberList * getSectionList(const Definition *container) const =0
virtual bool hasMultiLineInitializer() const =0
virtual Protection protection() const =0
virtual TypeSpecifier getMemberSpecifiers() const =0
virtual bool isOptional() const =0
virtual QCString getReadAccessor() const =0
virtual bool isEnumerate() const =0
virtual bool isGettable() const =0
virtual MemberType memberType() const =0
virtual bool hasReferencedByRelation() const =0
virtual bool isFunctionOrSignalSlot() const =0
virtual bool isReadable() const =0
virtual bool isWeak() const =0
virtual bool isNoDiscard() const =0
virtual QCString memberTypeName() const =0
virtual bool isUnretained() const =0
virtual QCString getGroupFileName() const =0
virtual void writeLink(OutputList &ol, const ClassDef *cd, const NamespaceDef *nd, const FileDef *fd, const GroupDef *gd, const ModuleDef *md, bool onlyText=FALSE) const =0
virtual ClassDef * relatedAlso() const =0
virtual bool isBriefSectionVisible() const =0
virtual const ArgumentLists & definitionTemplateParameterLists() const =0
virtual StringVector getLabels(const Definition *container) const =0
virtual bool isVariable() const =0
virtual bool isNotFriend() const =0
virtual bool isDCOP() const =0
virtual bool isStrong() const =0
virtual QCString argsString() const =0
virtual bool isSliceLocal() const =0
virtual Specifier virtualness(int count=0) const =0
virtual bool isUNOProperty() const =0
virtual int redefineCount() const =0
virtual const MemberDef * categoryRelation() const =0
virtual int initializerLines() const =0
virtual bool isFinal() const =0
virtual const ArgumentList & declArgumentList() const =0
virtual const ExampleList & getExamples() const =0
virtual bool isAbstract() const =0
virtual bool isMutable() const =0
virtual bool isFriendClass() const =0
virtual bool isCallable() const =0
virtual bool isDetailedSectionVisible(MemberListContainer container) const =0
virtual const MemberDef * getEnumScope() const =0
virtual bool isEnumValue() const =0
virtual bool isPrototype() const =0
virtual bool isProperty() const =0
virtual const QCString & initializer() const =0
bool _hasVisibleCallerGraph() const
void writeDocumentation(const MemberList *ml, int memCount, int memTotal, OutputList &ol, const QCString &scopeName, const Definition *container, bool inGroup, bool showEnumValues=FALSE, bool showInline=FALSE) const override
void _writeCallerGraph(OutputList &ol) const
void insertReimplementedBy(MemberDef *md) override
bool isDCOP() const override
QCString sourceRefName() const override
VhdlSpecifier m_vhdlSpec
bool isDetailedSectionVisible(MemberListContainer container) const override
bool _isReimplements() const
bool isFunction() const override
int getDeclColumn() const override
void overrideReferencesRelation(bool e) override
const MemberDef * reimplements() const override
MemberType m_mtype
int getMemberGroupId() const override
bool isProperty() const override
bool visibleInIndex() const override
const ArgumentList & argumentList() const override
void setDocumentedEnumValues(bool value) override
bool m_detailedDescriptionCachedValue
bool isTypedefValCached() const override
bool isInline() const override
const ExampleList & getExamples() const override
ArgumentLists m_defTmpArgLists
bool isFriendToHide() const override
void setFromAnonymousScope(bool b) override
bool fromAnonymousScope() const override
void invalidateTypedefValCache() override
ClassDef * accessorClass() const override
bool isFriendClass() const override
void setNamespace(NamespaceDef *nd) override
void setProtection(Protection p) override
const NamespaceDef * getNamespaceDef() const override
void setHidden(bool b) override
void _writeEnumValues(OutputList &ol, const Definition *container, const QCString &cfname, const QCString &ciname, const QCString &cname) const
void _writeTypeConstraints(OutputList &ol) const
bool isSliceLocal() const override
QCString m_args
void makeRelated() override
int getGroupStartLine() const override
void warnIfUndocumented() const override
bool m_hasReferencedByRelation
void setDefinition(const QCString &d) override
QCString objCMethodName(bool localLink, bool showStatic) const override
void setMemberType(MemberType t) override
QCString getWriteAccessor() const override
const ArgumentList & typeConstraints() const override
DefType definitionType() const override
Definition memberdef.cpp:64
void setEnumBaseType(const QCString &type) override
bool isDestructor() const override
StringVector getQualifiers() const override
QCString qualifiedName() const override
Specifier m_virt
void setRedefineCount(int) override
void setAnonymousEnumType(const MemberDef *md) override
bool isOptional() const override
void _writeExamples(OutputList &ol) const
void moveTo(Definition *) override
bool isCallable() const override
QCString getCachedResolvedTypedef() const override
QCString anchor() const override
bool isBriefSectionVisible() const override
QCString m_anc
const MemberDef * m_categoryRelation
void init(Definition *def, const QCString &t, const QCString &a, const QCString &e, Protection p, Specifier v, bool s, Relationship r, MemberType mt, const ArgumentList &tal, const ArgumentList &al, const QCString &meta)
bool addExample(const QCString &anchor, const QCString &name, const QCString &file) override
void setCategoryRelation(const MemberDef *) override
bool isReference() const override
QCString extraTypeChars() const override
Protection m_prot
QCString getDeclType() const override
void warnIfUndocumentedParams() const override
VhdlSpecifier getVhdlSpecifiers() const override
bool _hasVisibleCallGraph() const
void setFormalTemplateArguments(const ArgumentList &al) override
ClassDef * m_category
bool isDefine() const override
void findSectionsInDocumentation() override
ClassDef * getClassDefOfAnonymousType() const override
QCString briefDescription(bool abbr=FALSE) const override
void setFileDef(FileDef *fd) override
const MemberDef * resolveAlias() const override
Definition memberdef.cpp:66
ArgumentList m_declArgList
std::unique_ptr< MemberDef > deepCopy() const override
void makeForeign() override
MemberDef * m_memDec
uint8_t m_isConstructorCached
bool hasMultiLineInitializer() const override
bool hasCallGraph() const override
QCString memberTypeName() const override
void _writeReimplementedBy(OutputList &ol) const
bool isNew() const override
void setMaxInitLines(int lines) override
void writeDeclaration(OutputList &ol, const ClassDef *cd, const NamespaceDef *nd, const FileDef *fd, const GroupDef *gd, const ModuleDef *mod, bool inGroup, int indentLevel, const ClassDef *inheritFrom=nullptr, const QCString &inheritId=QCString()) const override
bool isDocsForDefinition() const override
const QCString & initializer() const override
void setEnumClassScope(ClassDef *cd) override
bool isUnretained() const override
MemberDef * m_annMemb
bool isGettable() const override
MemberGroup * getMemberGroup() const override
bool hasUserDocumentation() const override
std::optional< ArgumentList > formalTemplateArguments() const override
std::map< const Definition *, const MemberList * > m_sectionMap
bool isEnumValue() const override
bool isObjCMethod() const override
MemberDef * memberDefinition() const override
bool m_isTypedefValCached
bool m_hasDocumentedReturnType
void setFromAnonymousMember(MemberDef *m) override
QCString m_extraTypeChars
StringVector m_qualifiers
void overrideCallGraph(bool e) override
void setInheritsDocsFrom(const MemberDef *md) override
void setAccessorType(ClassDef *cd, const QCString &t) override
void setType(const QCString &t) override
Specifier virtualness(int count=0) const override
ClassDefMutable * getClassDefMutable() override
QCString m_type
bool hasDetailedDescription() const override
void setMemberGroupId(int id) override
QCString bitfieldString() const override
bool isCSharpProperty() const override
void setSectionList(const Definition *container, const MemberList *sl) override
QCString definition() const override
bool isRaisable() const override
void setTemplateMaster(const MemberDef *mt) override
void setDocumentation(const QCString &d, const QCString &docFile, int docLine, bool stripWhiteSpace=TRUE) override
std::unique_ptr< MemberDef > createTemplateInstanceMember(const ArgumentList &formalArgs, const std::unique_ptr< ArgumentList > &actualArgs) const override
const GroupDef * getGroupDef() const override
bool isRelatedOrFriend() const override
void insertEnumField(MemberDef *md) override
bool isMutable() const override
bool isPublished() const override
bool isLinkableInProject() const override
bool isProtectedSettable() const override
QCString getDeclFileName() const override
void setMemberGroup(MemberGroup *grp) override
void setMemberDeclaration(MemberDef *md) override
QCString enumBaseType() const override
bool isUNOProperty() const override
bool m_hasDocumentedParams
ModuleDef * m_moduleDef
bool m_hasReferencesRelation
void _computeIsConstructor()
QCString displayName(bool=TRUE) const override
size_t _countReimplementedBy() const
bool isRequired() const override
const MemberVector & reimplementedBy() const override
bool isStrong() const override
bool m_hasInlineSource
MemberDef * fromAnonymousMember() const override
void moveDeclArgumentList(std::unique_ptr< ArgumentList > al) override
bool isTypeAlias() const override
void setMemberClass(ClassDef *cd) override
QCString m_initializer
QCString excpString() const override
const MemberDef * templateMaster() const override
void setDocsForDefinition(bool b) override
const ClassDef * getCachedTypedefVal() const override
int initializerLines() const override
void setBitfields(const QCString &s) override
bool getGroupHasDocs() const override
const MemberDef * getEnumScope() const override
bool m_hasCallerGraph
QCString argsString() const override
bool isMaybeDefault() const override
QCString m_groupFileName
NamespaceDef * m_nspace
bool isReimplementedBy(const ClassDef *cd) const override
StringVector getLabels(const Definition *container) const override
bool isTransient() const override
ArgumentList m_defArgList
bool m_docsForDefinition
MemberDef * memberDeclaration() const override
std::optional< ArgumentList > m_formalTemplateArguments
bool isInitonly() const override
bool isAddable() const override
QCString m_read
bool isRelated() const override
void moveArgumentList(std::unique_ptr< ArgumentList > al) override
QCString m_decl
const ClassDef * m_cachedTypedefValue
MemberDef * m_redefines
QCString m_accessorType
void setCategory(ClassDef *) override
uint8_t m_isDestructorCached
MemberType memberType() const override
QCString getScopeString() const override
Protection protection() const override
bool isConstructor() const override
void setGroupAlias(const MemberDef *md) override
bool isEnumerate() const override
const ArgumentList & templateArguments() const override
bool isCopy() const override
bool isReadonly() const override
QCString declaration() const override
ClassDef * m_accessorClass
void setTagInfo(const TagInfo *i) override
const ArgumentLists & definitionTemplateParameterLists() const override
void _writeTemplatePrefix(OutputList &ol, const Definition *def, const ArgumentList &al, bool writeReqClause=true) const
bool isStatic() const override
void writeTagFile(TextStream &, bool useQualifiedName, bool showNamespaceMembers) const override
ClassDef * m_classDef
MemberDef * resolveAlias() override
Definition memberdef.cpp:65
bool isFinal() const override
QCString m_requiresClause
bool isAttribute() const override
const MemberDef * m_enumScope
int redefineCount() const override
bool isDictionary() const override
bool isSlot() const override
bool hasInlineSource() const override
void setAnchor() override
Relationship m_related
QCString m_bitfields
MemberGroup * m_memberGroup
const MemberDef * m_groupAlias
bool isRetain() const override
MemberVector m_redefinedBy
ClassDef * category() const override
void overrideEnumValues(bool e) override
bool isDocumentedFriendClass() const override
bool isConstEval() const override
bool hasReferencesRelation() const override
void _writeTagData(const DefType) const
void overrideReferencedByRelation(bool e) override
bool isEnumStruct() const override
bool hasEnumValues() const override
void setInbodyDocumentation(const QCString &d, const QCString &inbodyFile, int inbodyLine) override
bool isExplicit() const override
void _writeCategoryRelation(OutputList &ol) const
void setTemplateSpecialization(bool b) override
bool isTemplateSpecialization() const override
void setInitializer(const QCString &i) override
QCString fieldType() const override
const MemberDef * inheritsDocsFrom() const override
int getDeclLine() const override
void setTypeConstraints(const ArgumentList &al) override
void setVhdlSpecifiers(VhdlSpecifier s) override
bool isImplementation() const override
void _writeMultiLineInitializer(OutputList &ol, const QCString &scopeName) const
bool livesInsideEnum() const override
bool isDelete() const override
void setEnumScope(MemberDef *md, bool livesInsideEnum=FALSE) override
QCString getCachedTypedefTemplSpec() const override
void setGroupDef(GroupDef *gd, Grouping::GroupPri_t pri, const QCString &fileName, int startLine, bool hasDocs, MemberDef *member=nullptr) override
bool isNoExcept() const override
QCString getOutputFileBase() const override
bool isWeak() const override
const MemberDef * getAnonymousEnumType() const override
const ModuleDef * getModuleDef() const override
void setRequiresClause(const QCString &req) override
bool isNoDiscard() const override
void setPrototype(bool p, const QCString &df, int line, int column) override
GroupDef * m_group
void incrementFlowKeyWordCount() override
const MemberDef * getGroupAlias() const override
bool isConstInit() const override
void setModuleDef(ModuleDef *mod) override
QCString m_metaData
TypeSpecifier m_memSpec
TypeSpecifier getMemberSpecifiers() const override
bool hasReferencedByRelation() const override
void setDeclFile(const QCString &df, int line, int column) override
void makeImplementationDetail() override
Grouping::GroupPri_t getGroupPri() const override
bool isLinkable() const override
bool hasDocumentation() const override
int numberOfFlowKeyWords() const override
bool isProtectedGettable() const override
bool m_hasDetailedDescriptionCached
void setDefinitionTemplateParameterLists(const ArgumentLists &lists) override
ExampleList m_examples
const ArgumentList & declArgumentList() const override
void invalidateCachedArgumentTypes() override
bool _isAnonymousBitField() const
QCString m_cachedTypedefTemplSpec
void detectUndocumentedParams(bool hasParamCommand, bool hasReturnCommand) const override
ClassDef * m_relatedAlso
const MemberDef * m_annEnumType
bool isWritable() const override
const MemberDef * m_templateMaster
bool isSealed() const override
void setWriteAccessor(const QCString &w) override
bool isAbstract() const override
bool isPrivateSettable() const override
void setArgsString(const QCString &as) override
QCString getReference() const override
bool isSequence() const override
void _computeLinkableInProject()
MemberDefImpl(const QCString &defFileName, int defLine, int defColumn, const QCString &type, const QCString &name, const QCString &args, const QCString &excp, Protection prot, Specifier virt, bool stat, Relationship related, MemberType t, const ArgumentList &tal, const ArgumentList &al, const QCString &metaData)
QCString m_enumBaseType
Grouping::GroupPri_t m_grouppri
void setRelatedAlso(ClassDef *cd) override
void addRequirementReferences(const Definition *) override
bool hasExamples() const override
void resolveUnnamedParameters(const MemberDef *md) override
void setMemberDefinition(MemberDef *md) override
bool isThreadLocal() const override
void writeMemberDocSimple(OutputList &ol, const Definition *container) const override
void cacheTypedefVal(const ClassDef *val, const QCString &templSpec, const QCString &resolvedType) override
QCString documentation() const override
bool isSignal() const override
bool isMaybeVoid() const override
void _writeReimplements(OutputList &ol) const
bool isMaybeAmbiguous() const override
bool hasOneLineInitializer() const override
const MemberList * getSectionList(const Definition *) const override
void setReadAccessor(const QCString &r) override
bool isForeign() const override
void addQualifiers(const StringVector &qualifiers) override
QCString typeString() const override
bool isAssign() const override
bool isStrongEnumValue() const override
void _computeIsDestructor()
bool isNotFriend() const override
void copyArgumentNames(const MemberDef *bmd) override
bool isRemovable() const override
bool isDeleted() const override
MemberDef * m_memDef
MemberDef * m_groupMember
bool isFriend() const override
bool m_livesInsideEnum
ArgumentList m_typeConstraints
ClassDef * relatedAlso() const override
void setReimplements(MemberDef *md) override
MemberVector m_enumFields
void writeEnumDeclaration(OutputList &typeDecl, const ClassDef *cd, const NamespaceDef *nd, const FileDef *fd, const GroupDef *gd, const ModuleDef *mod) const override
bool isConstExpr() const override
QCString getGroupFileName() const override
bool isExternal() const override
const FileDef * getFileDef() const override
bool isNonAtomic() const override
const MemberDef * categoryRelation() const override
const MemberVector & enumFieldList() const override
const ClassDef * getClassDef() const override
QCString m_def
bool isFunctionOrSignalSlot() const override
void overrideInlineSource(bool e) override
void overrideCallerGraph(bool e) override
bool isPrivateGettable() const override
void setExplicitExternal(bool b, const QCString &df, int line, int column) override
bool isEvent() const override
ClassDef * m_cachedAnonymousType
void setMemberSpecifiers(TypeSpecifier s) override
bool isFunctionPtr() const override
QCString m_cachedResolvedType
bool hasCallerGraph() const override
bool isObjCProperty() const override
bool isPrototype() const override
bool isTypedef() const override
QCString m_write
void _writeGroupInclude(OutputList &ol, bool inGroup) const
FileDef * m_fileDef
bool hasDocumentedEnumValues() const override
~MemberDefImpl() override=default
uint8_t m_isLinkableCached
QCString m_declFileName
QCString m_exception
bool isVariable() const override
void mergeMemberSpecifiers(TypeSpecifier s) override
ArgumentList m_tArgList
QCString requiresClause() const override
bool isConstrained() const override
bool isReadable() const override
QCString getReadAccessor() const override
void writeLink(OutputList &ol, const ClassDef *cd, const NamespaceDef *nd, const FileDef *fd, const GroupDef *gd, const ModuleDef *mod, bool onlyText=FALSE) const override
QCString m_explicitOutputFileBase
void addListReference(const Definition *) override
void setBriefDescription(const QCString &b, const QCString &briefFile, int briefLine) override
bool isDefault() const override
void _writeCallGraph(OutputList &ol) const
bool isOverride() const override
const MemberDef * m_docProvider
bool isSettable() const override
bool isBound() const override
CodeSymbolType codeSymbolType() const override
QCString displayDefinition() const override
virtual void setMemberDeclaration(MemberDef *md)=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 setGroupDef(GroupDef *gd, Grouping::GroupPri_t pri, const QCString &fileName, int startLine, bool hasDocs, MemberDef *member=nullptr)=0
virtual void setMemberDefinition(MemberDef *md)=0
virtual void moveArgumentList(std::unique_ptr< ArgumentList > al)=0
virtual void insertReimplementedBy(MemberDef *md)=0
A class representing a group of members.
Definition membergroup.h:44
A list of MemberDef objects as shown in documentation sections.
Definition memberlist.h:125
A vector of MemberDef object.
Definition memberlist.h:35
iterator end() noexcept
Definition memberlist.h:56
iterator begin() noexcept
Definition memberlist.h:54
An abstract interface of a namespace symbol.
virtual QCString compoundTypeString() const =0
void startCodeFragment(const QCString &style)
Definition outputlist.h:279
Class representing a list of output generators that are written to in parallel.
Definition outputlist.h:315
void writeDoc(const IDocNodeAST *ast, const Definition *ctx, const MemberDef *md, int sectionLevel=-1)
Definition outputlist.h:383
bool isEnabled(OutputType o)
void endIndent()
Definition outputlist.h:584
void writeString(const QCString &text)
Definition outputlist.h:411
void startMemberDeclaration()
Definition outputlist.h:569
void startMemberDoc(const QCString &clName, const QCString &memName, const QCString &anchor, const QCString &title, int memCount, int memTotal, bool showInline)
Definition outputlist.h:531
void endDescTableRow()
Definition outputlist.h:634
void startMemberDocName(bool align)
Definition outputlist.h:680
void endParameterExtra(bool last, bool one, bool bracket)
Definition outputlist.h:694
void writeChar(char c)
Definition outputlist.h:529
void disable(OutputType o)
void endMemberTemplateParams(const QCString &anchor, const QCString &inheritId)
Definition outputlist.h:499
void endMemberDocName()
Definition outputlist.h:682
void endMemberDoc(bool hasArgs)
Definition outputlist.h:535
void startDescTableInit()
Definition outputlist.h:640
void startCallGraph()
Definition outputlist.h:656
void endDescTable()
Definition outputlist.h:630
void startParameterExtra()
Definition outputlist.h:692
const OutputCodeList & codeGenerators() const
Definition outputlist.h:358
void startParameterList(bool openBracket)
Definition outputlist.h:700
void writeLatexSpacing()
Definition outputlist.h:545
void enable(OutputType o)
void endInlineMemberType()
Definition outputlist.h:728
void endMemberDescription()
Definition outputlist.h:567
void writeObjectLink(const QCString &ref, const QCString &file, const QCString &anchor, const QCString &name)
Definition outputlist.h:439
void startInlineMemberType()
Definition outputlist.h:726
void startInlineMemberDoc()
Definition outputlist.h:734
void startMemberDescription(const QCString &anchor, const QCString &inheritId=QCString(), bool typ=false)
Definition outputlist.h:565
void endDescTableTitle()
Definition outputlist.h:638
void endDoxyAnchor(const QCString &fn, const QCString &anchor)
Definition outputlist.h:541
void docify(const QCString &s)
Definition outputlist.h:437
void generateDoc(const QCString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const QCString &docStr, const DocOptions &options)
void startIndent()
Definition outputlist.h:582
void startParagraph(const QCString &classDef=QCString())
Definition outputlist.h:407
void endDescForItem()
Definition outputlist.h:549
void endExamples()
Definition outputlist.h:580
void exceptionEntry(const QCString &prefix, bool closeBracket)
Definition outputlist.h:704
void endParagraph()
Definition outputlist.h:409
void endDescTableData()
Definition outputlist.h:646
void addIndexItem(const QCString &s1, const QCString &s2)
Definition outputlist.h:590
void disableAll()
void startDescTableTitle()
Definition outputlist.h:636
void startExamples()
Definition outputlist.h:578
void endInlineMemberDoc()
Definition outputlist.h:736
void endMemberDocPrefixItem()
Definition outputlist.h:678
void startParameterDefVal(const char *separator)
Definition outputlist.h:696
void startAnonTypeScope(int i1)
Definition outputlist.h:489
void endTextLink()
Definition outputlist.h:444
void startBold()
Definition outputlist.h:561
void endMemberItem(OutputGenerator::MemberItemType type)
Definition outputlist.h:495
void startDescTable(const QCString &title, const bool hasInits)
Definition outputlist.h:628
void startTypewriter()
Definition outputlist.h:449
void addLabel(const QCString &fName, const QCString &anchor)
Definition outputlist.h:543
void startDescTableData()
Definition outputlist.h:644
void pushGeneratorState()
void insertMemberAlign(bool templ=FALSE)
Definition outputlist.h:517
void startDescForItem()
Definition outputlist.h:547
void endParameterDefVal()
Definition outputlist.h:698
void startParameterType(bool first, const QCString &key)
Definition outputlist.h:684
void disableAllBut(OutputType o)
void endParameterName()
Definition outputlist.h:690
void popGeneratorState()
void endBold()
Definition outputlist.h:563
void startDoxyAnchor(const QCString &fName, const QCString &manName, const QCString &anchor, const QCString &name, const QCString &args)
Definition outputlist.h:537
void endLabels()
Definition outputlist.h:742
void endParameterList()
Definition outputlist.h:702
void endCallGraph(DotCallGraph &g)
Definition outputlist.h:658
void startInlineMemberName()
Definition outputlist.h:730
void writeLabel(const QCString &l, bool isLast)
Definition outputlist.h:740
void startLabels()
Definition outputlist.h:738
void endParameterType()
Definition outputlist.h:686
void startMemberDocPrefixItem()
Definition outputlist.h:676
void endAnonTypeScope(int i1)
Definition outputlist.h:491
void endMemberDeclaration(const QCString &anchor, const QCString &inheritId)
Definition outputlist.h:571
void startParameterName(bool one)
Definition outputlist.h:688
void enableAll()
void startMemberItem(const QCString &anchor, OutputGenerator::MemberItemType type, const QCString &id=QCString())
Definition outputlist.h:493
void endTypewriter()
Definition outputlist.h:451
void endInlineMemberName()
Definition outputlist.h:732
void lineBreak(const QCString &style=QCString())
Definition outputlist.h:559
void parseText(const QCString &textStr)
void writeNonBreakableSpace(int num)
Definition outputlist.h:626
void endDescTableInit()
Definition outputlist.h:642
void startTextLink(const QCString &file, const QCString &anchor)
Definition outputlist.h:442
void startDescTableRow()
Definition outputlist.h:632
void startMemberTemplateParams()
Definition outputlist.h:497
This is an alternative implementation of QCString.
Definition qcstring.h:101
int find(char c, int index=0, bool cs=TRUE) const
Definition qcstring.cpp:43
QCString & prepend(const char *s)
Definition qcstring.h:422
size_t length() const
Returns the length of the string, not counting the 0-terminator.
Definition qcstring.h:166
bool startsWith(const char *s) const
Definition qcstring.h:507
QCString mid(size_t index, size_t len=static_cast< size_t >(-1)) const
Definition qcstring.h:241
QCString lower() const
Definition qcstring.h:249
bool endsWith(const char *s) const
Definition qcstring.h:524
char & at(size_t i)
Returns a reference to the character at index i.
Definition qcstring.h:593
bool isEmpty() const
Returns TRUE iff the string is empty.
Definition qcstring.h:163
QCString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
Definition qcstring.h:260
QCString & remove(size_t index, size_t len)
Definition qcstring.h:442
const std::string & str() const
Definition qcstring.h:552
QCString simplifyWhiteSpace() const
return a copy of this string with leading and trailing whitespace removed and multiple whitespace cha...
Definition qcstring.cpp:190
QCString & append(char c)
Definition qcstring.h:396
QCString right(size_t len) const
Definition qcstring.h:234
int findRev(char c, int index=-1, bool cs=TRUE) const
Definition qcstring.cpp:96
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
Definition qcstring.h:172
QCString left(size_t len) const
Definition qcstring.h:229
bool stripPrefix(const QCString &prefix)
Definition qcstring.h:213
void clear()
Definition qcstring.h:182
static RequirementManager & instance()
void addRequirementRefsForSymbol(const Definition *symbol)
Implements TextGeneratorIntf for an OutputDocInterface stream.
Definition util.h:76
Text streaming class that buffers data.
Definition textstream.h:36
Wrapper class for a number of boolean properties.
Definition types.h:654
static bool writeVHDLTypeDocumentation(const MemberDef *mdef, const Definition *d, OutputList &ol)
static void writeSource(const MemberDef *mdef, OutputList &ol, const QCString &cname)
static bool isMisc(const MemberDef *mdef)
ClassDefMutable * toClassDefMutable(Definition *d)
ClassDef * getClass(const QCString &n)
ClassDef * toClassDef(Definition *d)
Class representing a regular expression.
Definition regex.h:39
Object representing the matching results.
Definition regex.h:151
#define Config_getInt(name)
Definition config.h:34
#define Config_getList(name)
Definition config.h:38
#define Config_getBool(name)
Definition config.h:33
#define NON_COPYABLE(cls)
Macro to help implementing the rule of 5 for a non-copyable & movable class.
Definition construct.h:37
std::vector< std::string > StringVector
Definition containers.h:33
std::unique_ptr< ArgumentList > stringToArgumentList(SrcLangExt lang, const QCString &argsString, QCString *extraTypeChars=nullptr)
Definition defargs.l:822
Definition * toDefinition(DefinitionMutable *dm)
#define AUTO_TRACE_ADD(...)
Definition docnode.cpp:48
#define AUTO_TRACE(...)
Definition docnode.cpp:47
void docFindSections(const QCString &input, const Definition *d, const QCString &fileName)
IDocNodeASTPtr validatingParseDoc(IDocParser &parserIntf, const QCString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const QCString &input, const DocOptions &options)
IDocParserPtr createDocParser()
factory function to create a parser
Definition docparser.cpp:55
static void setAnonymousEnumType()
Definition doxygen.cpp:9032
static void writeTagFile()
static void addRequirementReferences()
Definition doxygen.cpp:5550
FileDef * toFileDef(Definition *d)
Definition filedef.cpp:1967
GroupDef * toGroupDef(Definition *d)
Translator * theTranslator
Definition language.cpp:71
static QCString simplifyTypeForTable(const QCString &s)
static void writeExceptionList(OutputList &ol, const ClassDef *cd, const MemberDef *md)
static void writeExceptionListImpl(OutputList &ol, const ClassDef *cd, const MemberDef *md, QCString const &exception)
static QCString stripTrailingReturn(const QCString &trailRet)
static QCString combineArgsAndException(QCString args, QCString exception)
static bool writeDefArgumentList(OutputList &ol, const Definition *scope, const MemberDef *md)
static std::mutex g_hasDetailedDescriptionMutex
static std::mutex g_docCrossReferenceMutex
std::unique_ptr< MemberDef > createMemberDefAlias(const Definition *newScope, const MemberDef *aliasMd)
static void invalidateCachedTypesInArgumentList(ArgumentList &al)
static std::mutex g_detectUndocumentedParamsMutex
static void transferArgumentDocumentation(ArgumentList &decAl, ArgumentList &defAl)
void addDocCrossReference(const MemberDef *s, const MemberDef *d)
static std::mutex g_cachedAnonymousTypeMutex
MemberDefMutable * toMemberDefMutable(Definition *d)
void combineDeclarationAndDefinition(MemberDefMutable *mdec, MemberDefMutable *mdef)
static QCString addTemplateNames(const QCString &s, const QCString &n, const QCString &t)
MemberDef * toMemberDef(Definition *d)
static const reg::Ex reAnonymous(R"([\w:@]*@\d+)")
std::unique_ptr< MemberDef > createMemberDef(const QCString &defFileName, int defLine, int defColumn, const QCString &type, const QCString &name, const QCString &args, const QCString &excp, Protection prot, Specifier virt, bool stat, Relationship related, MemberType t, const ArgumentList &tal, const ArgumentList &al, const QCString &metaData)
Factory method to create a new instance of a MemberDef.
#define warn_undoc(file, line, fmt,...)
Definition message.h:102
#define warn_uncond(fmt,...)
Definition message.h:122
#define warn(file, line, fmt,...)
Definition message.h:97
#define msg(fmt,...)
Definition message.h:94
#define err(fmt,...)
Definition message.h:127
#define warn_doc_error(file, line, fmt,...)
Definition message.h:112
ModuleDef * toModuleDef(Definition *d)
NamespaceDef * toNamespaceDef(Definition *d)
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:844
QCString substitute(const QCString &s, const QCString &src, const QCString &dst)
substitute all occurrences of src in s by dst
Definition qcstring.cpp:571
#define qsnprintf
Definition qcstring.h:49
#define TRUE
Definition qcstring.h:37
#define FALSE
Definition qcstring.h:34
uint32_t qstrlen(const char *str)
Returns the length of string str, or 0 if a null pointer is passed.
Definition qcstring.h:58
#define ASSERT(x)
Definition qcstring.h:39
std::vector< RefItem * > RefItemVector
Definition reflist.h:133
Web server based search engine.
std::string_view stripWhiteSpace(std::string_view s)
Given a string view s, returns a new, narrower view on that string, skipping over any leading or trai...
Definition stringutil.h:72
This class contains the information about the argument of a function or template.
Definition arguments.h:27
QCString type
Definition arguments.h:42
QCString name
Definition arguments.h:44
QCString defval
Definition arguments.h:46
QCString docs
Definition arguments.h:47
QCString array
Definition arguments.h:45
QCString attrib
Definition arguments.h:41
Options to configure the code parser.
Definition parserintf.h:78
Data associated with an example.
Definition example.h:29
GroupPri_t
Grouping priority.
Definition types.h:230
@ GROUPING_AUTO_DEF
membership in group was defined via @defgroup
Definition types.h:234
This struct is used to capture the tag file information for an Entry.
Definition entry.h:104
QCString anchor
Definition entry.h:107
QCString fileName
Definition entry.h:106
QCString tagName
Definition entry.h:105
CodeSymbolType
Definition types.h:481
MemberType
Definition types.h:552
@ Enumeration
Definition types.h:557
@ EnumValue
Definition types.h:558
@ Dictionary
Definition types.h:568
@ Interface
Definition types.h:565
@ Sequence
Definition types.h:567
@ Variable
Definition types.h:555
@ Property
Definition types.h:563
@ Typedef
Definition types.h:556
@ Function
Definition types.h:554
@ Service
Definition types.h:566
MemberListContainer
Definition types.h:472
Protection
Definition types.h:32
SrcLangExt
Definition types.h:207
Relationship
Definition types.h:167
Specifier
Definition types.h:80
VhdlSpecifier
Definition types.h:730
bool matchArguments2(const Definition *srcScope, const FileDef *srcFileScope, const QCString &srcReturnType, const ArgumentList *srcAl, const Definition *dstScope, const FileDef *dstFileScope, const QCString &dstReturnType, const ArgumentList *dstAl, bool checkCV, SrcLangExt lang)
Definition util.cpp:1998
QCString removeRedundantWhiteSpace(const QCString &s)
Definition util.cpp:568
SrcLangExt getLanguageFromFileName(const QCString &fileName, SrcLangExt defLang)
Definition util.cpp:5191
bool protectionLevelVisible(Protection prot)
Definition util.cpp:5937
QCString substituteTemplateArgumentsInString(const QCString &nm, const ArgumentList &formalArgs, const ArgumentList *actualArgs)
Definition util.cpp:4346
void stripIndentationVerbatim(QCString &doc, const int indentationLevel, bool skipFirstLine)
Definition util.cpp:6038
void writeTypeConstraints(OutputList &ol, const Definition *d, const ArgumentList &al)
Definition util.cpp:5439
QCString stripAnonymousNamespaceScope(const QCString &s)
Definition util.cpp:231
QCString stripFromIncludePath(const QCString &path)
Definition util.cpp:330
QCString tempArgListToString(const ArgumentList &al, SrcLangExt lang, bool includeDefault)
Definition util.cpp:1276
void addRefItem(const RefItemVector &sli, const QCString &key, const QCString &prefix, const QCString &name, const QCString &title, const QCString &args, const Definition *scope)
Definition util.cpp:4805
void writePageRef(OutputList &ol, const QCString &cn, const QCString &mn)
Definition util.cpp:260
QCString removeAnonymousScopes(const QCString &str)
Definition util.cpp:162
QCString inlineTemplateArgListToDoc(const ArgumentList &al)
Definition util.cpp:1204
QCString stripExtension(const QCString &fName)
Definition util.cpp:4924
QCString convertToXML(const QCString &s, bool keepEntities)
Definition util.cpp:3893
QCString detab(const QCString &s, size_t &refIndent)
Definition util.cpp:6720
QCString getLanguageSpecificSeparator(SrcLangExt lang, bool classScope)
Returns the scope separator to use given the programming language lang.
Definition util.cpp:5897
void mergeMemberOverrideOptions(MemberDefMutable *md1, MemberDefMutable *md2)
Definition util.cpp:6861
void writeMarkerList(OutputList &ol, const std::string &markerText, size_t numMarkers, std::function< void(size_t)> replaceFunc)
Definition util.cpp:1106
QCString inlineArgListToDoc(const ArgumentList &al)
Definition util.cpp:1186
void linkifyText(const TextGeneratorIntf &out, const Definition *scope, const FileDef *fileScope, const Definition *self, const QCString &text, bool autoBreak, bool external, bool keepSpaces, int indentLevel)
Definition util.cpp:894
void writeExamples(OutputList &ol, const ExampleList &list)
Definition util.cpp:1157
void addHtmlExtensionIfMissing(QCString &fName)
Definition util.cpp:4902
A bunch of utility functions.
bool isId(int c)
Definition util.h:207