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 &lt) 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 &lt) 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