1 /****************************************************************************** 2 * 3 * 4 * 5 * Copyright (C) 1997-2019 by Dimitri van Heesch. 6 * 7 * Permission to use, copy, modify, and distribute this software and its 8 * documentation under the terms of the GNU General Public License is hereby 9 * granted. No representations are made about the suitability of this software 10 * for any purpose. It is provided "as is" without express or implied warranty. 11 * See the GNU General Public License for more details. 12 * 13 * Documents produced by Doxygen are derivative works derived from the 14 * input used in their production; they are not affected by this license. 15 * 16 */ 17 18 #ifndef DEFINITIONIMPL_H 19 #define DEFINITIONIMPL_H 20 21 #include <unordered_map> 22 #include <string> 23 24 #include "definition.h" 25 26 class DefinitionImpl 27 { 28 public: 29 DefinitionImpl( 30 Definition *def, 31 const QCString &defFileName,int defLine,int defColumn, 32 const QCString &name,const char *b=0,const char *d=0, 33 bool isSymbol=TRUE); 34 virtual ~DefinitionImpl(); 35 36 QCString name() const; 37 bool isAnonymous() const; 38 QCString localName() const; 39 QCString qualifiedName() const; 40 QCString symbolName() const; 41 QCString getSourceFileBase() const; 42 QCString getSourceAnchor() const; 43 QCString documentation() const; 44 int docLine() const; 45 QCString docFile() const; 46 QCString briefDescription(bool abbreviate=FALSE) const; 47 QCString briefDescriptionAsTooltip() const; 48 int briefLine() const; 49 QCString inbodyDocumentation() const; 50 QCString inbodyFile() const; 51 int inbodyLine() const; 52 QCString briefFile() const; 53 QCString getDefFileName() const; 54 QCString getDefFileExtension() const; 55 int getDefLine() const; 56 int getDefColumn() const; 57 bool hasDocumentation() const; 58 bool hasUserDocumentation() const; 59 bool isVisibleInProject() const; 60 bool isVisible() const; 61 bool isHidden() const; 62 bool isArtificial() const; 63 QCString getReference() const; 64 bool isReference() const; 65 QCString externalReference(const QCString &relPath) const; 66 int getStartDefLine() const; 67 int getStartBodyLine() const; 68 int getEndBodyLine() const; 69 const FileDef *getBodyDef() const; 70 SrcLangExt getLanguage() const; 71 const GroupList &partOfGroups() const; 72 bool isLinkableViaGroup() const; 73 const RefItemVector &xrefListItems() const; 74 const Definition *findInnerCompound(const QCString &name) const; 75 Definition *getOuterScope() const; 76 const MemberVector &getReferencesMembers() const; 77 const MemberVector &getReferencedByMembers() const; 78 bool hasSections() const; 79 bool hasSources() const; 80 bool hasBriefDescription() const; 81 QCString id() const; 82 const SectionRefs &getSectionRefs() const; 83 void setName(const QCString &name); 84 void setId(const QCString &name); 85 void setDefFile(const QCString& df,int defLine,int defColumn); 86 void setDocumentation(const QCString &d,const QCString &docFile,int docLine,bool stripWhiteSpace=TRUE); 87 void setBriefDescription(const QCString &b,const QCString &briefFile,int briefLine); 88 void setInbodyDocumentation(const QCString &d,const QCString &docFile,int docLine); 89 void setReference(const QCString &r); 90 void addSectionsToDefinition(const std::vector<const SectionInfo*> &anchorList); 91 void setBodySegment(int defLine,int bls,int ble); 92 void setBodyDef(const FileDef *fd); 93 void addSourceReferencedBy(const MemberDef *d); 94 void addSourceReferences(const MemberDef *d); 95 void setRefItems(const RefItemVector &sli); 96 void mergeRefItems(Definition *d); 97 void mergeReferences(const Definition *other); 98 void mergeReferencedBy(const Definition *other); 99 void addInnerCompound(const Definition *d); 100 void setOuterScope(Definition *d); 101 void setHidden(bool b); 102 void setArtificial(bool b); 103 void setLanguage(SrcLangExt lang); 104 void writeSourceDef(OutputList &ol,const QCString &scopeName) const; 105 void writeInlineCode(OutputList &ol,const QCString &scopeName) const; 106 bool hasSourceRefs() const; 107 bool hasSourceReffedBy() const; 108 void writeSourceRefs(OutputList &ol,const QCString &scopeName) const; 109 void writeSourceReffedBy(OutputList &ol,const QCString &scopeName) const; 110 void makePartOfGroup(const GroupDef *gd); 111 void writeNavigationPath(OutputList &ol) const; 112 QCString navigationPathAsString() const; 113 void writeQuickMemberLinks(OutputList &,const MemberDef *) const; 114 void writeSummaryLinks(OutputList &) const; 115 QCString pathFragment() const; 116 void writeDocAnchorsToTagFile(TextStream &) const; 117 void setLocalName(const QCString &name); 118 void addSectionsToIndex(); 119 void writeToc(OutputList &ol, const LocalToc <) const; 120 void computeTooltip(); 121 void _setSymbolName(const QCString &name); 122 QCString _symbolName() const; 123 124 DefinitionImpl(const DefinitionImpl &d); 125 126 private: 127 128 int _getXRefListId(const QCString &listName) const; 129 void _writeSourceRefList(OutputList &ol,const QCString &scopeName,const QCString &text, 130 const std::unordered_map<std::string,const MemberDef *> &members,bool) const; 131 void _setBriefDescription(const QCString &b,const QCString &briefFile,int briefLine); 132 void _setDocumentation(const QCString &d,const QCString &docFile,int docLine,bool stripWhiteSpace,bool atTop); 133 void _setInbodyDocumentation(const QCString &d,const QCString &docFile,int docLine); 134 bool _docsAlreadyAdded(const QCString &doc,QCString &sigList); 135 136 // PIMPL idiom 137 class IMPL; 138 IMPL *m_impl; // internal structure holding all private data 139 }; 140 141 template<class Base> 142 class DefinitionMixin : public Base 143 { 144 public: 145 /*! Create a new definition */ 146 DefinitionMixin( 147 const QCString &defFileName,int defLine,int defColumn, 148 const QCString &name,const char *b=0,const char *d=0, m_impl(this,defFileName,defLine,defColumn,name,b,d,isSymbol)149 bool isSymbol=TRUE) : m_impl(this,defFileName,defLine,defColumn,name,b,d,isSymbol) {} ~DefinitionMixin()150 virtual ~DefinitionMixin() {} 151 isAlias()152 virtual bool isAlias() const { return FALSE; } 153 154 //======== Definition name()155 virtual QCString name() const { return m_impl.name(); } isAnonymous()156 virtual bool isAnonymous() const { return m_impl.isAnonymous(); } localName()157 virtual QCString localName() const { return m_impl.localName(); } qualifiedName()158 virtual QCString qualifiedName() const { return m_impl.qualifiedName(); } symbolName()159 virtual QCString symbolName() const { return m_impl.symbolName(); } getSourceFileBase()160 virtual QCString getSourceFileBase() const { return m_impl.getSourceFileBase(); } getSourceAnchor()161 virtual QCString getSourceAnchor() const { return m_impl.getSourceAnchor(); } documentation()162 virtual QCString documentation() const { return m_impl.documentation(); } docLine()163 virtual int docLine() const { return m_impl.docLine(); } docFile()164 virtual QCString docFile() const { return m_impl.docFile(); } 165 virtual QCString briefDescription(bool abbreviate=FALSE) const { return m_impl.briefDescription(abbreviate); } briefDescriptionAsTooltip()166 virtual QCString briefDescriptionAsTooltip() const { return m_impl.briefDescriptionAsTooltip(); } briefLine()167 virtual int briefLine() const { return m_impl.briefLine(); } inbodyDocumentation()168 virtual QCString inbodyDocumentation() const { return m_impl.inbodyDocumentation(); } inbodyFile()169 virtual QCString inbodyFile() const { return m_impl.inbodyFile(); } inbodyLine()170 virtual int inbodyLine() const { return m_impl.inbodyLine(); } briefFile()171 virtual QCString briefFile() const { return m_impl.briefFile(); } getDefFileName()172 virtual QCString getDefFileName() const { return m_impl.getDefFileName(); } getDefFileExtension()173 virtual QCString getDefFileExtension() const { return m_impl.getDefFileExtension(); } getDefLine()174 virtual int getDefLine() const { return m_impl.getDefLine(); } getDefColumn()175 virtual int getDefColumn() const { return m_impl.getDefColumn(); } hasDocumentation()176 virtual bool hasDocumentation() const { return m_impl.hasDocumentation(); } hasUserDocumentation()177 virtual bool hasUserDocumentation() const { return m_impl.hasUserDocumentation(); } isVisibleInProject()178 virtual bool isVisibleInProject() const { return m_impl.isVisibleInProject(); } isVisible()179 virtual bool isVisible() const { return m_impl.isVisible(); } isHidden()180 virtual bool isHidden() const { return m_impl.isHidden(); } isArtificial()181 virtual bool isArtificial() const { return m_impl.isArtificial(); } getReference()182 virtual QCString getReference() const { return m_impl.getReference(); } isReference()183 virtual bool isReference() const { return m_impl.isReference(); } externalReference(const QCString & relPath)184 virtual QCString externalReference(const QCString &relPath) const { return m_impl.externalReference(relPath); } getStartDefLine()185 virtual int getStartDefLine() const { return m_impl.getStartDefLine(); } getStartBodyLine()186 virtual int getStartBodyLine() const { return m_impl.getStartBodyLine(); } getEndBodyLine()187 virtual int getEndBodyLine() const { return m_impl.getEndBodyLine(); } getBodyDef()188 virtual const FileDef *getBodyDef() const { return m_impl.getBodyDef(); } getLanguage()189 virtual SrcLangExt getLanguage() const { return m_impl.getLanguage(); } partOfGroups()190 virtual const GroupList &partOfGroups() const { return m_impl.partOfGroups(); } isLinkableViaGroup()191 virtual bool isLinkableViaGroup() const { return m_impl.isLinkableViaGroup(); } xrefListItems()192 virtual const RefItemVector &xrefListItems() const { return m_impl.xrefListItems(); } findInnerCompound(const QCString & name)193 virtual const Definition *findInnerCompound(const QCString &name) const { return m_impl.findInnerCompound(name); } getOuterScope()194 virtual Definition *getOuterScope() const { return m_impl.getOuterScope(); } getReferencesMembers()195 virtual const MemberVector &getReferencesMembers() const { return m_impl.getReferencesMembers(); } getReferencedByMembers()196 virtual const MemberVector &getReferencedByMembers() const { return m_impl.getReferencedByMembers(); } hasSections()197 virtual bool hasSections() const { return m_impl.hasSections(); } hasSources()198 virtual bool hasSources() const { return m_impl.hasSources(); } hasBriefDescription()199 virtual bool hasBriefDescription() const { return m_impl.hasBriefDescription(); } id()200 virtual QCString id() const { return m_impl.id(); } getSectionRefs()201 virtual const SectionRefs &getSectionRefs() const { return m_impl.getSectionRefs(); } 202 203 //======== DefinitionMutable setName(const QCString & name)204 virtual void setName(const QCString &name) { m_impl.setName(name); } setId(const QCString & name)205 virtual void setId(const QCString &name) { m_impl.setId(name); } setDefFile(const QCString & df,int defLine,int defColumn)206 virtual void setDefFile(const QCString& df,int defLine,int defColumn) 207 { m_impl.setDefFile(df,defLine,defColumn); } 208 virtual void setDocumentation(const QCString &doc,const QCString &docFile,int docLine,bool stripWhiteSpace=TRUE) 209 { m_impl.setDocumentation(doc,docFile,docLine,stripWhiteSpace); } setBriefDescription(const QCString & brief,const QCString & briefFile,int briefLine)210 virtual void setBriefDescription(const QCString &brief,const QCString &briefFile,int briefLine) 211 { m_impl.setBriefDescription(brief,briefFile,briefLine); } setInbodyDocumentation(const QCString & doc,const QCString & docFile,int docLine)212 virtual void setInbodyDocumentation(const QCString &doc,const QCString &docFile,int docLine) 213 { m_impl.setInbodyDocumentation(doc,docFile,docLine); } setReference(const QCString & r)214 virtual void setReference(const QCString &r) 215 { m_impl.setReference(r); } addSectionsToDefinition(const std::vector<const SectionInfo * > & anchorList)216 virtual void addSectionsToDefinition(const std::vector<const SectionInfo*> &anchorList) 217 { m_impl.addSectionsToDefinition(anchorList); } setBodySegment(int defLine,int bls,int ble)218 virtual void setBodySegment(int defLine,int bls,int ble) 219 { m_impl.setBodySegment(defLine,bls,ble); } setBodyDef(const FileDef * fd)220 virtual void setBodyDef(const FileDef *fd) 221 { m_impl.setBodyDef(fd); } addSourceReferencedBy(const MemberDef * md)222 virtual void addSourceReferencedBy(const MemberDef *md) 223 { m_impl.addSourceReferencedBy(md); } addSourceReferences(const MemberDef * md)224 virtual void addSourceReferences(const MemberDef *md) 225 { m_impl.addSourceReferences(md); } setRefItems(const RefItemVector & sli)226 virtual void setRefItems(const RefItemVector &sli) 227 { m_impl.setRefItems(sli); } mergeRefItems(Definition * def)228 virtual void mergeRefItems(Definition *def) 229 { m_impl.mergeRefItems(def); } mergeReferences(const Definition * other)230 virtual void mergeReferences(const Definition *other) 231 { m_impl.mergeReferences(other); } mergeReferencedBy(const Definition * other)232 virtual void mergeReferencedBy(const Definition *other) 233 { m_impl.mergeReferencedBy(other); } addInnerCompound(const Definition * def)234 virtual void addInnerCompound(const Definition *def) 235 { m_impl.addInnerCompound(def); } setOuterScope(Definition * def)236 virtual void setOuterScope(Definition *def) 237 { m_impl.setOuterScope(def); } setHidden(bool b)238 virtual void setHidden(bool b) 239 { m_impl.setHidden(b); } setArtificial(bool b)240 virtual void setArtificial(bool b) 241 { m_impl.setArtificial(b); } setLanguage(SrcLangExt lang)242 virtual void setLanguage(SrcLangExt lang) 243 { m_impl.setLanguage(lang); } writeSourceDef(OutputList & ol,const QCString & scopeName)244 virtual void writeSourceDef(OutputList &ol,const QCString &scopeName) const 245 { m_impl.writeSourceDef(ol,scopeName); } writeInlineCode(OutputList & ol,const QCString & scopeName)246 virtual void writeInlineCode(OutputList &ol,const QCString &scopeName) const 247 { m_impl.writeInlineCode(ol,scopeName); } hasSourceRefs()248 virtual bool hasSourceRefs() const 249 { return m_impl.hasSourceRefs(); } hasSourceReffedBy()250 virtual bool hasSourceReffedBy() const 251 { return m_impl.hasSourceReffedBy(); } writeSourceRefs(OutputList & ol,const QCString & scopeName)252 virtual void writeSourceRefs(OutputList &ol,const QCString &scopeName) const 253 { m_impl.writeSourceRefs(ol,scopeName); } writeSourceReffedBy(OutputList & ol,const QCString & scopeName)254 virtual void writeSourceReffedBy(OutputList &ol,const QCString &scopeName) const 255 { m_impl.writeSourceReffedBy(ol,scopeName); } makePartOfGroup(const GroupDef * gd)256 virtual void makePartOfGroup(const GroupDef *gd) 257 { m_impl.makePartOfGroup(gd); } writeNavigationPath(OutputList & ol)258 virtual void writeNavigationPath(OutputList &ol) const 259 { m_impl.writeNavigationPath(ol); } navigationPathAsString()260 virtual QCString navigationPathAsString() const 261 { return m_impl.navigationPathAsString(); } writeQuickMemberLinks(OutputList & ol,const MemberDef * md)262 virtual void writeQuickMemberLinks(OutputList &ol,const MemberDef *md) const 263 { m_impl.writeQuickMemberLinks(ol,md); } writeSummaryLinks(OutputList & ol)264 virtual void writeSummaryLinks(OutputList &ol) const 265 { m_impl.writeSummaryLinks(ol); } pathFragment()266 virtual QCString pathFragment() const 267 { return m_impl.pathFragment(); } writeDocAnchorsToTagFile(TextStream & fs)268 virtual void writeDocAnchorsToTagFile(TextStream &fs) const 269 { m_impl.writeDocAnchorsToTagFile(fs); } setLocalName(const QCString & name)270 virtual void setLocalName(const QCString &name) 271 { m_impl.setLocalName(name); } addSectionsToIndex()272 virtual void addSectionsToIndex() 273 { m_impl.addSectionsToIndex(); } writeToc(OutputList & ol,const LocalToc & lt)274 virtual void writeToc(OutputList &ol, const LocalToc <) const 275 { m_impl.writeToc(ol,lt); } computeTooltip()276 virtual void computeTooltip() 277 { m_impl.computeTooltip(); } _setSymbolName(const QCString & name)278 virtual void _setSymbolName(const QCString &name) 279 { m_impl._setSymbolName(name); } _symbolName()280 virtual QCString _symbolName() const 281 { return m_impl._symbolName(); } 282 283 protected: 284 285 DefinitionMixin(const DefinitionMixin &def) = default; 286 287 private: toDefinition_()288 virtual Definition *toDefinition_() { return this; } toDefinitionMutable_()289 virtual DefinitionMutable *toDefinitionMutable_() { return this; } toDefinitionImpl_()290 virtual const DefinitionImpl *toDefinitionImpl_() const { return &m_impl; } 291 292 DefinitionImpl m_impl; 293 }; 294 295 class DefinitionAliasImpl 296 { 297 public: 298 DefinitionAliasImpl(Definition *def,const Definition *scope,const Definition *alias); 299 virtual ~DefinitionAliasImpl(); 300 void init(); 301 void deinit(); 302 QCString name() const; 303 QCString qualifiedName() const; 304 private: 305 Definition *m_def; 306 const Definition *m_scope; 307 QCString m_symbolName; 308 QCString m_qualifiedName; 309 }; 310 311 template<class Base> 312 class DefinitionAliasMixin : public Base 313 { 314 public: DefinitionAliasMixin(const Definition * scope,const Definition * alias)315 DefinitionAliasMixin(const Definition *scope,const Definition *alias) 316 : m_impl(this,scope,alias), m_scope(scope), m_alias(alias) {} 317 init()318 void init() { m_impl.init(); } deinit()319 void deinit() { m_impl.deinit(); } 320 321 virtual ~DefinitionAliasMixin() = default; 322 isAlias()323 virtual bool isAlias() const { return TRUE; } 324 325 //======== Definition name()326 virtual QCString name() const 327 { return m_impl.name(); } isAnonymous()328 virtual bool isAnonymous() const 329 { return m_alias->isAnonymous(); } localName()330 virtual QCString localName() const 331 { return m_alias->localName(); } qualifiedName()332 virtual QCString qualifiedName() const 333 { return m_impl.qualifiedName(); } symbolName()334 virtual QCString symbolName() const 335 { return m_alias->symbolName(); } getSourceFileBase()336 virtual QCString getSourceFileBase() const 337 { return m_alias->getSourceFileBase(); } getSourceAnchor()338 virtual QCString getSourceAnchor() const 339 { return m_alias->getSourceAnchor(); } documentation()340 virtual QCString documentation() const 341 { return m_alias->documentation(); } docLine()342 virtual int docLine() const 343 { return m_alias->docLine(); } docFile()344 virtual QCString docFile() const 345 { return m_alias->docFile(); } 346 virtual QCString briefDescription(bool abbreviate=FALSE) const 347 { return m_alias->briefDescription(abbreviate); } briefDescriptionAsTooltip()348 virtual QCString briefDescriptionAsTooltip() const 349 { return m_alias->briefDescriptionAsTooltip(); } briefLine()350 virtual int briefLine() const 351 { return m_alias->briefLine(); } inbodyDocumentation()352 virtual QCString inbodyDocumentation() const 353 { return m_alias->inbodyDocumentation(); } inbodyFile()354 virtual QCString inbodyFile() const 355 { return m_alias->inbodyFile(); } inbodyLine()356 virtual int inbodyLine() const 357 { return m_alias->inbodyLine(); } briefFile()358 virtual QCString briefFile() const 359 { return m_alias->briefFile(); } getDefFileName()360 virtual QCString getDefFileName() const 361 { return m_alias->getDefFileName(); } getDefFileExtension()362 virtual QCString getDefFileExtension() const 363 { return m_alias->getDefFileExtension(); } getDefLine()364 virtual int getDefLine() const 365 { return m_alias->getDefLine(); } getDefColumn()366 virtual int getDefColumn() const 367 { return m_alias->getDefColumn(); } hasDocumentation()368 virtual bool hasDocumentation() const 369 { return m_alias->hasDocumentation(); } hasUserDocumentation()370 virtual bool hasUserDocumentation() const 371 { return m_alias->hasUserDocumentation(); } isVisibleInProject()372 virtual bool isVisibleInProject() const 373 { return m_alias->isVisibleInProject(); } isVisible()374 virtual bool isVisible() const 375 { return m_alias->isVisible(); } isHidden()376 virtual bool isHidden() const 377 { return m_alias->isHidden(); } isArtificial()378 virtual bool isArtificial() const 379 { return m_alias->isArtificial(); } getReference()380 virtual QCString getReference() const 381 { return m_alias->getReference(); } isReference()382 virtual bool isReference() const 383 { return m_alias->isReference(); } externalReference(const QCString & relPath)384 virtual QCString externalReference(const QCString &relPath) const 385 { return m_alias->externalReference(relPath); } getStartDefLine()386 virtual int getStartDefLine() const 387 { return m_alias->getStartDefLine(); } getStartBodyLine()388 virtual int getStartBodyLine() const 389 { return m_alias->getStartBodyLine(); } getEndBodyLine()390 virtual int getEndBodyLine() const 391 { return m_alias->getEndBodyLine(); } getBodyDef()392 virtual const FileDef *getBodyDef() const 393 { return m_alias->getBodyDef(); } getLanguage()394 virtual SrcLangExt getLanguage() const 395 { return m_alias->getLanguage(); } partOfGroups()396 virtual const GroupList &partOfGroups() const 397 { return m_alias->partOfGroups(); } isLinkableViaGroup()398 virtual bool isLinkableViaGroup() const 399 { return m_alias->isLinkableViaGroup(); } xrefListItems()400 virtual const RefItemVector &xrefListItems() const 401 { return m_alias->xrefListItems(); } findInnerCompound(const QCString & name)402 virtual const Definition *findInnerCompound(const QCString &name) const 403 { return m_alias->findInnerCompound(name); } getOuterScope()404 virtual Definition *getOuterScope() const 405 { return const_cast<Definition*>(m_scope); } getReferencesMembers()406 virtual const MemberVector &getReferencesMembers() const 407 { return m_alias->getReferencesMembers(); } getReferencedByMembers()408 virtual const MemberVector &getReferencedByMembers() const 409 { return m_alias->getReferencedByMembers(); } hasSections()410 virtual bool hasSections() const 411 { return m_alias->hasSections(); } hasSources()412 virtual bool hasSources() const 413 { return m_alias->hasSources(); } hasBriefDescription()414 virtual bool hasBriefDescription() const 415 { return m_alias->hasBriefDescription(); } id()416 virtual QCString id() const 417 { return m_alias->id(); } getSectionRefs()418 virtual const SectionRefs &getSectionRefs() const 419 { return m_alias->getSectionRefs(); } navigationPathAsString()420 virtual QCString navigationPathAsString() const 421 { return m_alias->navigationPathAsString(); } pathFragment()422 virtual QCString pathFragment() const 423 { return m_alias->pathFragment(); } 424 425 protected: getAlias()426 const Definition *getAlias() const { return m_alias; } getScope()427 const Definition *getScope() const { return m_scope; } 428 429 private: toDefinition_()430 virtual Definition *toDefinition_() { return this; } toDefinitionMutable_()431 virtual DefinitionMutable *toDefinitionMutable_() { return 0; } toDefinitionImpl_()432 virtual const DefinitionImpl *toDefinitionImpl_() const { return 0; } 433 _setSymbolName(const QCString & name)434 virtual void _setSymbolName(const QCString &name) { m_symbolName = name; } _symbolName()435 virtual QCString _symbolName() const { return m_symbolName; } 436 DefinitionAliasImpl m_impl; 437 const Definition *m_scope; 438 const Definition *m_alias; 439 QCString m_symbolName; 440 }; 441 442 #endif 443