|
Packit |
1c1d7e |
/******************************************************************************
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Copyright (C) 1997-2015 by Dimitri van Heesch.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Permission to use, copy, modify, and distribute this software and its
|
|
Packit |
1c1d7e |
* documentation under the terms of the GNU General Public License is hereby
|
|
Packit |
1c1d7e |
* granted. No representations are made about the suitability of this software
|
|
Packit |
1c1d7e |
* for any purpose. It is provided "as is" without express or implied warranty.
|
|
Packit |
1c1d7e |
* See the GNU General Public License for more details.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Documents produced by Doxygen are derivative works derived from the
|
|
Packit |
1c1d7e |
* input used in their production; they are not affected by this license.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include <ctype.h>
|
|
Packit |
1c1d7e |
#include <qregexp.h>
|
|
Packit |
1c1d7e |
#include "md5.h"
|
|
Packit |
1c1d7e |
#include <stdio.h>
|
|
Packit |
1c1d7e |
#include <stdlib.h>
|
|
Packit |
1c1d7e |
#include <assert.h>
|
|
Packit |
1c1d7e |
#include "config.h"
|
|
Packit |
1c1d7e |
#include "definition.h"
|
|
Packit |
1c1d7e |
#include "doxygen.h"
|
|
Packit |
1c1d7e |
#include "language.h"
|
|
Packit |
1c1d7e |
#include "message.h"
|
|
Packit |
1c1d7e |
#include "outputlist.h"
|
|
Packit |
1c1d7e |
#include "code.h"
|
|
Packit |
1c1d7e |
#include "util.h"
|
|
Packit |
1c1d7e |
#include "groupdef.h"
|
|
Packit |
1c1d7e |
#include "pagedef.h"
|
|
Packit |
1c1d7e |
#include "section.h"
|
|
Packit |
1c1d7e |
#include "htags.h"
|
|
Packit |
1c1d7e |
#include "parserintf.h"
|
|
Packit |
1c1d7e |
#include "marshal.h"
|
|
Packit |
1c1d7e |
#include "debug.h"
|
|
Packit |
1c1d7e |
#include "vhdldocgen.h"
|
|
Packit |
1c1d7e |
#include "memberlist.h"
|
|
Packit |
1c1d7e |
#include "namespacedef.h"
|
|
Packit |
1c1d7e |
#include "filedef.h"
|
|
Packit |
1c1d7e |
#include "dirdef.h"
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#define START_MARKER 0x4445465B // DEF[
|
|
Packit |
1c1d7e |
#define END_MARKER 0x4445465D // DEF]
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//-----------------------------------------------------------------------------------------
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/** Private data associated with a Symbol Definition object. */
|
|
Packit |
1c1d7e |
class DefinitionImpl
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
public:
|
|
Packit |
1c1d7e |
DefinitionImpl();
|
|
Packit |
1c1d7e |
~DefinitionImpl();
|
|
Packit |
1c1d7e |
void init(const char *df, const char *n);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
SectionDict *sectionDict; // dictionary of all sections, not accessible
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
MemberSDict *sourceRefByDict;
|
|
Packit |
1c1d7e |
MemberSDict *sourceRefsDict;
|
|
Packit |
1c1d7e |
QList<ListItemInfo> *xrefListItems;
|
|
Packit |
1c1d7e |
GroupList *partOfGroups;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
DocInfo *details; // not exported
|
|
Packit |
1c1d7e |
DocInfo *inbodyDocs; // not exported
|
|
Packit |
1c1d7e |
BriefInfo *brief; // not exported
|
|
Packit |
1c1d7e |
BodyInfo *body; // not exported
|
|
Packit |
1c1d7e |
QCString briefSignatures;
|
|
Packit |
1c1d7e |
QCString docSignatures;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString localName; // local (unqualified) name of the definition
|
|
Packit |
1c1d7e |
// in the future m_name should become m_localName
|
|
Packit |
1c1d7e |
QCString qualifiedName;
|
|
Packit |
1c1d7e |
QCString ref; // reference to external documentation
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool hidden;
|
|
Packit |
1c1d7e |
bool isArtificial;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Definition *outerScope; // not owner
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// where the item was found
|
|
Packit |
1c1d7e |
QCString defFileName;
|
|
Packit |
1c1d7e |
QCString defFileExt;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
SrcLangExt lang;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString id; // clang unique id
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
DefinitionImpl::DefinitionImpl()
|
|
Packit |
1c1d7e |
: sectionDict(0), sourceRefByDict(0), sourceRefsDict(0),
|
|
Packit |
1c1d7e |
xrefListItems(0), partOfGroups(0),
|
|
Packit |
1c1d7e |
details(0), inbodyDocs(0), brief(0), body(0), hidden(FALSE), isArtificial(FALSE),
|
|
Packit |
1c1d7e |
outerScope(0), lang(SrcLangExt_Unknown)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
DefinitionImpl::~DefinitionImpl()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
delete sectionDict;
|
|
Packit |
1c1d7e |
delete sourceRefByDict;
|
|
Packit |
1c1d7e |
delete sourceRefsDict;
|
|
Packit |
1c1d7e |
delete partOfGroups;
|
|
Packit |
1c1d7e |
delete xrefListItems;
|
|
Packit |
1c1d7e |
delete brief;
|
|
Packit |
1c1d7e |
delete details;
|
|
Packit |
1c1d7e |
delete body;
|
|
Packit |
1c1d7e |
delete inbodyDocs;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void DefinitionImpl::init(const char *df, const char *n)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
defFileName = df;
|
|
Packit |
1c1d7e |
int lastDot = defFileName.findRev('.');
|
|
Packit |
1c1d7e |
if (lastDot!=-1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
defFileExt = defFileName.mid(lastDot);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
QCString name = n;
|
|
Packit |
1c1d7e |
if (name!="<globalScope>")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//extractNamespaceName(m_name,m_localName,ns);
|
|
Packit |
1c1d7e |
localName=stripScope(n);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
localName=n;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
//printf("m_localName=%s\n",m_localName.data());
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
brief = 0;
|
|
Packit |
1c1d7e |
details = 0;
|
|
Packit |
1c1d7e |
body = 0;
|
|
Packit |
1c1d7e |
inbodyDocs = 0;
|
|
Packit |
1c1d7e |
sourceRefByDict = 0;
|
|
Packit |
1c1d7e |
sourceRefsDict = 0;
|
|
Packit |
1c1d7e |
sectionDict = 0,
|
|
Packit |
1c1d7e |
outerScope = Doxygen::globalScope;
|
|
Packit |
1c1d7e |
partOfGroups = 0;
|
|
Packit |
1c1d7e |
xrefListItems = 0;
|
|
Packit |
1c1d7e |
hidden = FALSE;
|
|
Packit |
1c1d7e |
isArtificial = FALSE;
|
|
Packit |
1c1d7e |
lang = SrcLangExt_Unknown;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//-----------------------------------------------------------------------------------------
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static bool matchExcludedSymbols(const char *name)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
static QStrList &exclSyms = Config_getList(EXCLUDE_SYMBOLS);
|
|
Packit |
1c1d7e |
if (exclSyms.count()==0) return FALSE; // nothing specified
|
|
Packit |
1c1d7e |
const char *pat = exclSyms.first();
|
|
Packit |
1c1d7e |
QCString symName = name;
|
|
Packit |
1c1d7e |
while (pat)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString pattern = pat;
|
|
Packit |
1c1d7e |
bool forceStart=FALSE;
|
|
Packit |
1c1d7e |
bool forceEnd=FALSE;
|
|
Packit |
1c1d7e |
if (pattern.at(0)=='^')
|
|
Packit |
1c1d7e |
pattern=pattern.mid(1),forceStart=TRUE;
|
|
Packit |
1c1d7e |
if (pattern.at(pattern.length()-1)=='$')
|
|
Packit |
1c1d7e |
pattern=pattern.left(pattern.length()-1),forceEnd=TRUE;
|
|
Packit |
1c1d7e |
if (pattern.find('*')!=-1) // wildcard mode
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QRegExp re(substitute(pattern,"*",".*"),TRUE);
|
|
Packit |
1c1d7e |
int i,pl;
|
|
Packit |
1c1d7e |
i = re.match(symName,0,&pl);
|
|
Packit |
1c1d7e |
//printf(" %d = re.match(%s) pattern=%s\n",i,symName.data(),pattern.data());
|
|
Packit |
1c1d7e |
if (i!=-1) // wildcard match
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int sl=symName.length();
|
|
Packit |
1c1d7e |
// check if it is a whole word match
|
|
Packit |
1c1d7e |
if ((i==0 || pattern.at(0)=='*' || (!isId(symName.at(i-1)) && !forceStart)) &&
|
|
Packit |
1c1d7e |
(i+pl==sl || pattern.at(i+pl)=='*' || (!isId(symName.at(i+pl)) && !forceEnd))
|
|
Packit |
1c1d7e |
)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("--> name=%s pattern=%s match at %d\n",symName.data(),pattern.data(),i);
|
|
Packit |
1c1d7e |
return TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (!pattern.isEmpty()) // match words
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int i = symName.find(pattern);
|
|
Packit |
1c1d7e |
if (i!=-1) // we have a match!
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int pl=pattern.length();
|
|
Packit |
1c1d7e |
int sl=symName.length();
|
|
Packit |
1c1d7e |
// check if it is a whole word match
|
|
Packit |
1c1d7e |
if ((i==0 || (!isId(symName.at(i-1)) && !forceStart)) &&
|
|
Packit |
1c1d7e |
(i+pl==sl || (!isId(symName.at(i+pl)) && !forceEnd))
|
|
Packit |
1c1d7e |
)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("--> name=%s pattern=%s match at %d\n",symName.data(),pattern.data(),i);
|
|
Packit |
1c1d7e |
return TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
pat = exclSyms.next();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
//printf("--> name=%s: no match\n",name);
|
|
Packit |
1c1d7e |
return FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Definition::addToMap(const char *name,Definition *d)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
|
|
Packit |
1c1d7e |
QCString symbolName = name;
|
|
Packit |
1c1d7e |
int index=computeQualifiedIndex(symbolName);
|
|
Packit |
1c1d7e |
if (!vhdlOpt && index!=-1) symbolName=symbolName.mid(index+2);
|
|
Packit |
1c1d7e |
if (!symbolName.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("******* adding symbol `%s' (%p)\n",symbolName.data(),d);
|
|
Packit |
1c1d7e |
DefinitionIntf *di=Doxygen::symbolMap->find(symbolName);
|
|
Packit |
1c1d7e |
//printf(" addToMap(%p): looking for symbol %s: %p\n",d,symbolName.data(),di);
|
|
Packit |
1c1d7e |
if (di==0) // new Symbol
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf(" new symbol!\n");
|
|
Packit |
1c1d7e |
Doxygen::symbolMap->insert(symbolName,d);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // existing symbol
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf(" existing symbol: ");
|
|
Packit |
1c1d7e |
if (di->definitionType()==DefinitionIntf::TypeSymbolList) // already multiple symbols
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("adding to exiting list\n");
|
|
Packit |
1c1d7e |
DefinitionList *dl = (DefinitionList*)di;
|
|
Packit |
1c1d7e |
dl->append(d);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // going from one to two symbols
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
Doxygen::symbolMap->take(symbolName);
|
|
Packit |
1c1d7e |
DefinitionList *dl = new DefinitionList;
|
|
Packit |
1c1d7e |
//printf("replacing symbol by list %p with elements %p and %p\n",dl,di,d);
|
|
Packit |
1c1d7e |
dl->append((Definition*)di);
|
|
Packit |
1c1d7e |
dl->append(d);
|
|
Packit |
1c1d7e |
Doxygen::symbolMap->insert(symbolName,dl);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// auto resize if needed
|
|
Packit |
1c1d7e |
static int sizeIndex=9;
|
|
Packit |
1c1d7e |
if (Doxygen::symbolMap->size()>SDict_primes[sizeIndex])
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
Doxygen::symbolMap->resize(SDict_primes[++sizeIndex]);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
d->_setSymbolName(symbolName);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Definition::removeFromMap(Definition *d)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString symbolName = d->m_symbolName;
|
|
Packit |
1c1d7e |
if (!symbolName.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("******* removing symbol `%s' (%p)\n",symbolName.data(),d);
|
|
Packit |
1c1d7e |
DefinitionIntf *di=Doxygen::symbolMap->find(symbolName);
|
|
Packit |
1c1d7e |
if (di)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (di!=d) // symbolName not unique
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf(" removing from list: %p!\n",di);
|
|
Packit |
1c1d7e |
DefinitionList *dl = (DefinitionList*)di;
|
|
Packit |
1c1d7e |
bool b = dl->removeRef(d);
|
|
Packit |
1c1d7e |
ASSERT(b==TRUE);
|
|
Packit |
1c1d7e |
if (dl->isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
Doxygen::symbolMap->take(symbolName);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // symbolName unique
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf(" removing symbol %p\n",di);
|
|
Packit |
1c1d7e |
Doxygen::symbolMap->take(symbolName);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Definition::Definition(const char *df,int dl,int dc,
|
|
Packit |
1c1d7e |
const char *name,const char *b,
|
|
Packit |
1c1d7e |
const char *d,bool isSymbol) : m_cookie(0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_name = name;
|
|
Packit |
1c1d7e |
m_defLine = dl;
|
|
Packit |
1c1d7e |
m_defColumn = dc;
|
|
Packit |
1c1d7e |
m_impl = new DefinitionImpl;
|
|
Packit |
1c1d7e |
m_impl->init(df,name);
|
|
Packit |
1c1d7e |
m_isSymbol = isSymbol;
|
|
Packit |
1c1d7e |
if (isSymbol) addToMap(name,this);
|
|
Packit |
1c1d7e |
_setBriefDescription(b,df,dl);
|
|
Packit |
1c1d7e |
_setDocumentation(d,df,dl,TRUE,FALSE);
|
|
Packit |
1c1d7e |
if (matchExcludedSymbols(name))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->hidden = TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Definition::Definition(const Definition &d) : DefinitionIntf(), m_cookie(0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_name = d.m_name;
|
|
Packit |
1c1d7e |
m_defLine = d.m_defLine;
|
|
Packit |
1c1d7e |
m_impl = new DefinitionImpl;
|
|
Packit |
1c1d7e |
*m_impl = *d.m_impl;
|
|
Packit |
1c1d7e |
m_impl->sectionDict = 0;
|
|
Packit |
1c1d7e |
m_impl->sourceRefByDict = 0;
|
|
Packit |
1c1d7e |
m_impl->sourceRefsDict = 0;
|
|
Packit |
1c1d7e |
m_impl->partOfGroups = 0;
|
|
Packit |
1c1d7e |
m_impl->xrefListItems = 0;
|
|
Packit |
1c1d7e |
m_impl->brief = 0;
|
|
Packit |
1c1d7e |
m_impl->details = 0;
|
|
Packit |
1c1d7e |
m_impl->body = 0;
|
|
Packit |
1c1d7e |
m_impl->inbodyDocs = 0;
|
|
Packit |
1c1d7e |
if (d.m_impl->sectionDict)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->sectionDict = new SectionDict(17);
|
|
Packit |
1c1d7e |
SDict<SectionInfo>::Iterator it(*d.m_impl->sectionDict);
|
|
Packit |
1c1d7e |
SectionInfo *si;
|
|
Packit |
1c1d7e |
for (it.toFirst();(si=it.current());++it)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->sectionDict->append(si->label,si);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (d.m_impl->sourceRefByDict)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->sourceRefByDict = new MemberSDict;
|
|
Packit |
1c1d7e |
MemberSDict::IteratorDict it(*d.m_impl->sourceRefByDict);
|
|
Packit |
1c1d7e |
MemberDef *md;
|
|
Packit |
1c1d7e |
for (it.toFirst();(md=it.current());++it)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->sourceRefByDict->append(it.currentKey(),md);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (d.m_impl->sourceRefsDict)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->sourceRefsDict = new MemberSDict;
|
|
Packit |
1c1d7e |
MemberSDict::IteratorDict it(*d.m_impl->sourceRefsDict);
|
|
Packit |
1c1d7e |
MemberDef *md;
|
|
Packit |
1c1d7e |
for (it.toFirst();(md=it.current());++it)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->sourceRefsDict->append(it.currentKey(),md);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (d.m_impl->partOfGroups)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
GroupListIterator it(*d.m_impl->partOfGroups);
|
|
Packit |
1c1d7e |
GroupDef *gd;
|
|
Packit |
1c1d7e |
for (it.toFirst();(gd=it.current());++it)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
makePartOfGroup(gd);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (d.m_impl->xrefListItems)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
setRefItems(d.m_impl->xrefListItems);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (d.m_impl->brief)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->brief = new BriefInfo(*d.m_impl->brief);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (d.m_impl->details)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->details = new DocInfo(*d.m_impl->details);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (d.m_impl->body)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->body = new BodyInfo(*d.m_impl->body);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (d.m_impl->inbodyDocs)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->inbodyDocs = new DocInfo(*d.m_impl->inbodyDocs);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
m_isSymbol = d.m_isSymbol;
|
|
Packit |
1c1d7e |
if (m_isSymbol) addToMap(m_name,this);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Definition::~Definition()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_isSymbol)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
removeFromMap(this);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (m_impl)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
delete m_impl;
|
|
Packit |
1c1d7e |
m_impl=0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
delete m_cookie;
|
|
Packit |
1c1d7e |
m_cookie=0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Definition::setName(const char *name)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (name==0) return;
|
|
Packit |
1c1d7e |
m_name = name;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Definition::setId(const char *id)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (id==0) return;
|
|
Packit |
1c1d7e |
m_impl->id = id;
|
|
Packit |
1c1d7e |
if (Doxygen::clangUsrMap)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("Definition::setId '%s'->'%s'\n",id,m_name.data());
|
|
Packit |
1c1d7e |
Doxygen::clangUsrMap->insert(id,this);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString Definition::id() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return m_impl->id;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Definition::addSectionsToDefinition(QList<SectionInfo> *anchorList)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (!anchorList) return;
|
|
Packit |
1c1d7e |
//printf("%s: addSectionsToDefinition(%d)\n",name().data(),anchorList->count());
|
|
Packit |
1c1d7e |
QListIterator<SectionInfo> it(*anchorList);
|
|
Packit |
1c1d7e |
SectionInfo *si;
|
|
Packit |
1c1d7e |
for (;(si=it.current());++it)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("Add section `%s' to definition `%s'\n",
|
|
Packit |
1c1d7e |
// si->label.data(),name().data());
|
|
Packit |
1c1d7e |
SectionInfo *gsi=Doxygen::sectionDict->find(si->label);
|
|
Packit |
1c1d7e |
//printf("===== label=%s gsi=%p\n",si->label.data(),gsi);
|
|
Packit |
1c1d7e |
if (gsi==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
gsi = new SectionInfo(*si);
|
|
Packit |
1c1d7e |
Doxygen::sectionDict->append(si->label,gsi);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (m_impl->sectionDict==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->sectionDict = new SectionDict(17);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (m_impl->sectionDict->find(gsi->label)==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->sectionDict->append(gsi->label,gsi);
|
|
Packit |
1c1d7e |
gsi->definition = this;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool Definition::hasSections() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("Definition::hasSections(%s) #sections=%d\n",name().data(),
|
|
Packit |
1c1d7e |
// m_impl->sectionDict ? m_impl->sectionDict->count() : 0);
|
|
Packit |
1c1d7e |
if (m_impl->sectionDict==0) return FALSE;
|
|
Packit |
1c1d7e |
SDict<SectionInfo>::Iterator li(*m_impl->sectionDict);
|
|
Packit |
1c1d7e |
SectionInfo *si;
|
|
Packit |
1c1d7e |
for (li.toFirst();(si=li.current());++li)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (si->type==SectionInfo::Section ||
|
|
Packit |
1c1d7e |
si->type==SectionInfo::Subsection ||
|
|
Packit |
1c1d7e |
si->type==SectionInfo::Subsubsection ||
|
|
Packit |
1c1d7e |
si->type==SectionInfo::Paragraph)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Definition::addSectionsToIndex()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_impl->sectionDict==0) return;
|
|
Packit |
1c1d7e |
//printf("Definition::addSectionsToIndex()\n");
|
|
Packit |
1c1d7e |
SDict<SectionInfo>::Iterator li(*m_impl->sectionDict);
|
|
Packit |
1c1d7e |
SectionInfo *si;
|
|
Packit |
1c1d7e |
int level=1;
|
|
Packit |
1c1d7e |
for (li.toFirst();(si=li.current());++li)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (si->type==SectionInfo::Section ||
|
|
Packit |
1c1d7e |
si->type==SectionInfo::Subsection ||
|
|
Packit |
1c1d7e |
si->type==SectionInfo::Subsubsection ||
|
|
Packit |
1c1d7e |
si->type==SectionInfo::Paragraph)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf(" level=%d title=%s\n",level,si->title.data());
|
|
Packit |
1c1d7e |
int nextLevel = (int)si->type;
|
|
Packit |
1c1d7e |
int i;
|
|
Packit |
1c1d7e |
if (nextLevel>level)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
for (i=level;i
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
Doxygen::indexList->incContentsDepth();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (nextLevel
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
for (i=nextLevel;i
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
Doxygen::indexList->decContentsDepth();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
QCString title = si->title;
|
|
Packit |
1c1d7e |
if (title.isEmpty()) title = si->label;
|
|
Packit |
1c1d7e |
// determine if there is a next level inside this item
|
|
Packit |
1c1d7e |
++li;
|
|
Packit |
1c1d7e |
bool isDir = ((li.current()) ? (int)(li.current()->type > nextLevel):FALSE);
|
|
Packit |
1c1d7e |
--li;
|
|
Packit |
1c1d7e |
Doxygen::indexList->addContentsItem(isDir,title,
|
|
Packit |
1c1d7e |
getReference(),
|
|
Packit |
1c1d7e |
getOutputFileBase(),
|
|
Packit |
1c1d7e |
si->label,
|
|
Packit |
1c1d7e |
FALSE,
|
|
Packit |
1c1d7e |
TRUE);
|
|
Packit |
1c1d7e |
level = nextLevel;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
while (level>1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
Doxygen::indexList->decContentsDepth();
|
|
Packit |
1c1d7e |
level--;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Definition::writeDocAnchorsToTagFile(FTextStream &tagFile)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_impl->sectionDict)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("%s: writeDocAnchorsToTagFile(%d)\n",name().data(),m_impl->sectionDict->count());
|
|
Packit |
1c1d7e |
SDict<SectionInfo>::Iterator sdi(*m_impl->sectionDict);
|
|
Packit |
1c1d7e |
SectionInfo *si;
|
|
Packit |
1c1d7e |
for (;(si=sdi.current());++sdi)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (!si->generated && si->ref.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("write an entry!\n");
|
|
Packit |
1c1d7e |
if (definitionType()==TypeMember) tagFile << " ";
|
|
Packit |
1c1d7e |
tagFile << " <docanchor file=\"" << si->fileName << "\"";
|
|
Packit |
1c1d7e |
if (!si->title.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tagFile << " title=\"" << convertToXML(si->title) << "\"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
tagFile << ">" << si->label << "</docanchor>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool Definition::_docsAlreadyAdded(const QCString &doc,QCString &sigList)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
uchar md5_sig[16];
|
|
Packit |
1c1d7e |
QCString sigStr(33);
|
|
Packit |
1c1d7e |
// to avoid mismatches due to differences in indenting, we first remove
|
|
Packit |
1c1d7e |
// double whitespaces...
|
|
Packit |
1c1d7e |
QCString docStr = doc.simplifyWhiteSpace();
|
|
Packit |
1c1d7e |
MD5Buffer((const unsigned char *)docStr.data(),docStr.length(),md5_sig);
|
|
Packit |
1c1d7e |
MD5SigToString(md5_sig,sigStr.rawData(),33);
|
|
Packit |
1c1d7e |
//printf("%s:_docsAlreadyAdded doc='%s' sig='%s' docSigs='%s'\n",
|
|
Packit |
1c1d7e |
// name().data(),doc.data(),sigStr.data(),sigList.data());
|
|
Packit |
1c1d7e |
if (sigList.find(sigStr)==-1) // new docs, add signature to prevent re-adding it
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
sigList+=":"+sigStr;
|
|
Packit |
1c1d7e |
return FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Definition::_setDocumentation(const char *d,const char *docFile,int docLine,
|
|
Packit |
1c1d7e |
bool stripWhiteSpace,bool atTop)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("%s::setDocumentation(%s,%s,%d,%d)\n",name().data(),d,docFile,docLine,stripWhiteSpace);
|
|
Packit |
1c1d7e |
if (d==0) return;
|
|
Packit |
1c1d7e |
QCString doc = d;
|
|
Packit |
1c1d7e |
if (stripWhiteSpace)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
doc = stripLeadingAndTrailingEmptyLines(doc,docLine);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // don't strip whitespace
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
doc=d;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!_docsAlreadyAdded(doc,m_impl->docSignatures))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("setting docs for %s: `%s'\n",name().data(),m_doc.data());
|
|
Packit |
1c1d7e |
if (m_impl->details==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->details = new DocInfo;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (m_impl->details->doc.isEmpty()) // fresh detailed description
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->details->doc = doc;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (atTop) // another detailed description, append it to the start
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->details->doc = doc+"\n\n"+m_impl->details->doc;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // another detailed description, append it to the end
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->details->doc += "\n\n"+doc;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (docLine!=-1) // store location if valid
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->details->file = docFile;
|
|
Packit |
1c1d7e |
m_impl->details->line = docLine;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->details->file = docFile;
|
|
Packit |
1c1d7e |
m_impl->details->line = 1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Definition::setDocumentation(const char *d,const char *docFile,int docLine,bool stripWhiteSpace)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (d==0) return;
|
|
Packit |
1c1d7e |
_setDocumentation(d,docFile,docLine,stripWhiteSpace,FALSE);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#define uni_isupper(c) (QChar(c).category()==QChar::Letter_Uppercase)
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// do a UTF-8 aware search for the last real character and return TRUE
|
|
Packit |
1c1d7e |
// if that is a multibyte one.
|
|
Packit |
1c1d7e |
static bool lastCharIsMultibyte(const QCString &s)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int l = s.length();
|
|
Packit |
1c1d7e |
int p = 0;
|
|
Packit |
1c1d7e |
int pp = -1;
|
|
Packit |
1c1d7e |
while ((p=nextUtf8CharPosition(s,l,p))
|
|
Packit |
1c1d7e |
if (pp==-1 || ((uchar)s[pp])<0x80) return FALSE;
|
|
Packit |
1c1d7e |
return TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Definition::_setBriefDescription(const char *b,const char *briefFile,int briefLine)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
static QCString outputLanguage = Config_getEnum(OUTPUT_LANGUAGE);
|
|
Packit |
1c1d7e |
static bool needsDot = outputLanguage!="Japanese" &&
|
|
Packit |
1c1d7e |
outputLanguage!="Chinese" &&
|
|
Packit |
1c1d7e |
outputLanguage!="Korean";
|
|
Packit |
1c1d7e |
QCString brief = b;
|
|
Packit |
1c1d7e |
brief = brief.stripWhiteSpace();
|
|
Packit |
1c1d7e |
if (brief.isEmpty()) return;
|
|
Packit |
1c1d7e |
int bl = brief.length();
|
|
Packit |
1c1d7e |
if (bl>0 && needsDot) // add punctuation if needed
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int c = brief.at(bl-1);
|
|
Packit |
1c1d7e |
switch(c)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case '.': case '!': case '?': case '>': case ':': case ')': break;
|
|
Packit |
1c1d7e |
default:
|
|
Packit |
1c1d7e |
if (uni_isupper(brief.at(0)) && !lastCharIsMultibyte(brief)) brief+='.';
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (!_docsAlreadyAdded(brief,m_impl->briefSignatures))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_impl->brief && !m_impl->brief->doc.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("adding to details\n");
|
|
Packit |
1c1d7e |
_setDocumentation(brief,briefFile,briefLine,FALSE,TRUE);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//fprintf(stderr,"Definition::setBriefDescription(%s,%s,%d)\n",b,briefFile,briefLine);
|
|
Packit |
1c1d7e |
if (m_impl->brief==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->brief = new BriefInfo;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
m_impl->brief->doc=brief;
|
|
Packit |
1c1d7e |
if (briefLine!=-1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->brief->file = briefFile;
|
|
Packit |
1c1d7e |
m_impl->brief->line = briefLine;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->brief->file = briefFile;
|
|
Packit |
1c1d7e |
m_impl->brief->line = 1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("do nothing!\n");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Definition::setBriefDescription(const char *b,const char *briefFile,int briefLine)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (b==0) return;
|
|
Packit |
1c1d7e |
_setBriefDescription(b,briefFile,briefLine);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Definition::_setInbodyDocumentation(const char *doc,const char *inbodyFile,int inbodyLine)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_impl->inbodyDocs==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->inbodyDocs = new DocInfo;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (m_impl->inbodyDocs->doc.isEmpty()) // fresh inbody docs
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->inbodyDocs->doc = doc;
|
|
Packit |
1c1d7e |
m_impl->inbodyDocs->file = inbodyFile;
|
|
Packit |
1c1d7e |
m_impl->inbodyDocs->line = inbodyLine;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // another inbody documentation fragment, append this to the end
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->inbodyDocs->doc += QCString("\n\n")+doc;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Definition::setInbodyDocumentation(const char *d,const char *inbodyFile,int inbodyLine)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (d==0) return;
|
|
Packit |
1c1d7e |
_setInbodyDocumentation(d,inbodyFile,inbodyLine);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*! Reads a fragment of code from file \a fileName starting at
|
|
Packit |
1c1d7e |
* line \a startLine and ending at line \a endLine (inclusive). The fragment is
|
|
Packit |
1c1d7e |
* stored in \a result. If FALSE is returned the code fragment could not be
|
|
Packit |
1c1d7e |
* found.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* The file is scanned for a opening bracket ('{') from \a startLine onward
|
|
Packit |
1c1d7e |
* The line actually containing the bracket is returned via startLine.
|
|
Packit |
1c1d7e |
* The file is scanned for a closing bracket ('}') from \a endLine backward.
|
|
Packit |
1c1d7e |
* The line actually containing the bracket is returned via endLine.
|
|
Packit |
1c1d7e |
* Note that for VHDL code the bracket search is not done.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
bool readCodeFragment(const char *fileName,
|
|
Packit |
1c1d7e |
int &startLine,int &endLine,QCString &result)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
static bool filterSourceFiles = Config_getBool(FILTER_SOURCE_FILES);
|
|
Packit |
1c1d7e |
static int tabSize = Config_getInt(TAB_SIZE);
|
|
Packit |
1c1d7e |
//printf("readCodeFragment(%s,%d,%d)\n",fileName,startLine,endLine);
|
|
Packit |
1c1d7e |
if (fileName==0 || fileName[0]==0) return FALSE; // not a valid file name
|
|
Packit |
1c1d7e |
QCString filter = getFileFilter(fileName,TRUE);
|
|
Packit |
1c1d7e |
FILE *f=0;
|
|
Packit |
1c1d7e |
bool usePipe = !filter.isEmpty() && filterSourceFiles;
|
|
Packit |
1c1d7e |
SrcLangExt lang = getLanguageFromFileName(fileName);
|
|
Packit |
1c1d7e |
if (!usePipe) // no filter given or wanted
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
f = portable_fopen(fileName,"r");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // use filter
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString cmd=filter+" \""+fileName+"\"";
|
|
Packit |
1c1d7e |
Debug::print(Debug::ExtCmd,0,"Executing popen(`%s`)\n",qPrint(cmd));
|
|
Packit |
1c1d7e |
f = portable_popen(cmd,"r");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
bool found = lang==SrcLangExt_VHDL ||
|
|
Packit |
1c1d7e |
lang==SrcLangExt_Tcl ||
|
|
Packit |
1c1d7e |
lang==SrcLangExt_Python ||
|
|
Packit |
1c1d7e |
lang==SrcLangExt_Fortran;
|
|
Packit |
1c1d7e |
// for VHDL, TCL, Python, and Fortran no bracket search is possible
|
|
Packit |
1c1d7e |
if (f)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int c=0;
|
|
Packit |
1c1d7e |
int col=0;
|
|
Packit |
1c1d7e |
int lineNr=1;
|
|
Packit |
1c1d7e |
// skip until the startLine has reached
|
|
Packit |
1c1d7e |
while (lineNr
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
while ((c=fgetc(f))!='\n' && c!=EOF) /* skip */;
|
|
Packit |
1c1d7e |
lineNr++;
|
|
Packit |
1c1d7e |
if (found && c == '\n') c = '\0';
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!feof(f))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// skip until the opening bracket or lonely : is found
|
|
Packit |
1c1d7e |
char cn=0;
|
|
Packit |
1c1d7e |
while (lineNr<=endLine && !feof(f) && !found)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int pc=0;
|
|
Packit |
1c1d7e |
while ((c=fgetc(f))!='{' && c!=':' && c!=EOF) // } so vi matching brackets has no problem
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("parsing char `%c'\n",c);
|
|
Packit |
1c1d7e |
if (c=='\n')
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
lineNr++,col=0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (c=='\t')
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
col+=tabSize - (col%tabSize);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (pc=='/' && c=='/') // skip single line comment
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
while ((c=fgetc(f))!='\n' && c!=EOF) pc=c;
|
|
Packit |
1c1d7e |
if (c=='\n') lineNr++,col=0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (pc=='/' && c=='*') // skip C style comment
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
while (((c=fgetc(f))!='/' || pc!='*') && c!=EOF)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (c=='\n') lineNr++,col=0;
|
|
Packit |
1c1d7e |
pc=c;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
col++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
pc = c;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (c==':')
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
cn=fgetc(f);
|
|
Packit |
1c1d7e |
if (cn!=':') found=TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (c=='{') // } so vi matching brackets has no problem
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
found=TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
//printf(" -> readCodeFragment(%s,%d,%d) lineNr=%d\n",fileName,startLine,endLine,lineNr);
|
|
Packit |
1c1d7e |
if (found)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// For code with more than one line,
|
|
Packit |
1c1d7e |
// fill the line with spaces until we are at the right column
|
|
Packit |
1c1d7e |
// so that the opening brace lines up with the closing brace
|
|
Packit |
1c1d7e |
if (endLine!=startLine)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString spaces;
|
|
Packit |
1c1d7e |
spaces.fill(' ',col);
|
|
Packit |
1c1d7e |
result+=spaces;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
// copy until end of line
|
|
Packit |
1c1d7e |
if (c) result+=c;
|
|
Packit |
1c1d7e |
startLine=lineNr;
|
|
Packit |
1c1d7e |
if (c==':')
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
result+=cn;
|
|
Packit |
1c1d7e |
if (cn=='\n') lineNr++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
const int maxLineLength=4096;
|
|
Packit |
1c1d7e |
char lineStr[maxLineLength];
|
|
Packit |
1c1d7e |
do
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("reading line %d in range %d-%d\n",lineNr,startLine,endLine);
|
|
Packit |
1c1d7e |
int size_read;
|
|
Packit |
1c1d7e |
do
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// read up to maxLineLength-1 bytes, the last byte being zero
|
|
Packit |
1c1d7e |
char *p = fgets(lineStr, maxLineLength,f);
|
|
Packit |
1c1d7e |
//printf(" read %s",p);
|
|
Packit |
1c1d7e |
if (p)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
size_read=qstrlen(p);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // nothing read
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
size_read=-1;
|
|
Packit |
1c1d7e |
lineStr[0]='\0';
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
result+=lineStr;
|
|
Packit |
1c1d7e |
} while (size_read == (maxLineLength-1));
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
lineNr++;
|
|
Packit |
1c1d7e |
} while (lineNr<=endLine && !feof(f));
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// strip stuff after closing bracket
|
|
Packit |
1c1d7e |
int newLineIndex = result.findRev('\n');
|
|
Packit |
1c1d7e |
int braceIndex = result.findRev('}');
|
|
Packit |
1c1d7e |
if (braceIndex > newLineIndex)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
result.truncate(braceIndex+1);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
endLine=lineNr-1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (usePipe)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
portable_pclose(f);
|
|
Packit |
1c1d7e |
Debug::print(Debug::FilterOutput, 0, "Filter output\n");
|
|
Packit |
1c1d7e |
Debug::print(Debug::FilterOutput,0,"-------------\n%s\n-------------\n",qPrint(result));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
fclose(f);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
result = transcodeCharacterStringToUTF8(result);
|
|
Packit |
1c1d7e |
if (!result.isEmpty() && result.at(result.length()-1)!='\n') result += "\n";
|
|
Packit |
1c1d7e |
//fprintf(stderr,"readCodeFragement(%d-%d)=%s\n",startLine,endLine,result.data());
|
|
Packit |
1c1d7e |
return found;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString Definition::getSourceFileBase() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ASSERT(definitionType()!=Definition::TypeFile); // file overloads this method
|
|
Packit |
1c1d7e |
QCString fn;
|
|
Packit |
1c1d7e |
static bool sourceBrowser = Config_getBool(SOURCE_BROWSER);
|
|
Packit |
1c1d7e |
if (sourceBrowser &&
|
|
Packit |
1c1d7e |
m_impl->body && m_impl->body->startLine!=-1 && m_impl->body->fileDef)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
fn = m_impl->body->fileDef->getSourceFileBase();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return fn;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString Definition::getSourceAnchor() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
const int maxAnchorStrLen = 20;
|
|
Packit |
1c1d7e |
char anchorStr[maxAnchorStrLen];
|
|
Packit |
1c1d7e |
anchorStr[0]='\0';
|
|
Packit |
1c1d7e |
if (m_impl->body && m_impl->body->startLine!=-1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (Htags::useHtags)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
qsnprintf(anchorStr,maxAnchorStrLen,"L%d",m_impl->body->startLine);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
qsnprintf(anchorStr,maxAnchorStrLen,"l%05d",m_impl->body->startLine);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return anchorStr;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*! Write a reference to the source code defining this definition */
|
|
Packit |
1c1d7e |
void Definition::writeSourceDef(OutputList &ol,const char *)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
static bool latexSourceCode = Config_getBool(LATEX_SOURCE_CODE);
|
|
Packit |
1c1d7e |
static bool rtfSourceCode = Config_getBool(RTF_SOURCE_CODE);
|
|
Packit |
1c1d7e |
ol.pushGeneratorState();
|
|
Packit |
1c1d7e |
//printf("Definition::writeSourceRef %d %p\n",bodyLine,bodyDef);
|
|
Packit |
1c1d7e |
QCString fn = getSourceFileBase();
|
|
Packit |
1c1d7e |
if (!fn.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString refText = theTranslator->trDefinedAtLineInSourceFile();
|
|
Packit |
1c1d7e |
int lineMarkerPos = refText.find("@0");
|
|
Packit |
1c1d7e |
int fileMarkerPos = refText.find("@1");
|
|
Packit |
1c1d7e |
if (lineMarkerPos!=-1 && fileMarkerPos!=-1) // should always pass this.
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString lineStr;
|
|
Packit |
1c1d7e |
lineStr.sprintf("%d",m_impl->body->startLine);
|
|
Packit |
1c1d7e |
QCString anchorStr = getSourceAnchor();
|
|
Packit |
1c1d7e |
ol.startParagraph("definition");
|
|
Packit |
1c1d7e |
if (lineMarkerPos
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// write text left from linePos marker
|
|
Packit |
1c1d7e |
ol.parseText(refText.left(lineMarkerPos));
|
|
Packit |
1c1d7e |
ol.pushGeneratorState();
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::Man);
|
|
Packit |
1c1d7e |
if (!latexSourceCode)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::Latex);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!rtfSourceCode)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::RTF);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
// write line link (HTML, LaTeX optionally, RTF optionally)
|
|
Packit |
1c1d7e |
ol.writeObjectLink(0,fn,anchorStr,lineStr);
|
|
Packit |
1c1d7e |
ol.enableAll();
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::Html);
|
|
Packit |
1c1d7e |
if (latexSourceCode)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::Latex);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (rtfSourceCode)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::RTF);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
// write normal text (Man, Latex optionally, RTF optionally)
|
|
Packit |
1c1d7e |
ol.docify(lineStr);
|
|
Packit |
1c1d7e |
ol.popGeneratorState();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// write text between markers
|
|
Packit |
1c1d7e |
ol.parseText(refText.mid(lineMarkerPos+2,
|
|
Packit |
1c1d7e |
fileMarkerPos-lineMarkerPos-2));
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
ol.pushGeneratorState();
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::Man);
|
|
Packit |
1c1d7e |
if (!latexSourceCode)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::Latex);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!rtfSourceCode)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::RTF);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
// write file link (HTML, LaTeX optionally, RTF optionally)
|
|
Packit |
1c1d7e |
ol.writeObjectLink(0,fn,0,m_impl->body->fileDef->name());
|
|
Packit |
1c1d7e |
ol.enableAll();
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::Html);
|
|
Packit |
1c1d7e |
if (latexSourceCode)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::Latex);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (rtfSourceCode)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::RTF);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
// write normal text (Man, Latex optionally, RTF optionally)
|
|
Packit |
1c1d7e |
ol.docify(m_impl->body->fileDef->name());
|
|
Packit |
1c1d7e |
ol.popGeneratorState();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// write text right from file marker
|
|
Packit |
1c1d7e |
ol.parseText(refText.right(
|
|
Packit |
1c1d7e |
refText.length()-fileMarkerPos-2));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // file marker before line marker
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// write text left from file marker
|
|
Packit |
1c1d7e |
ol.parseText(refText.left(fileMarkerPos));
|
|
Packit |
1c1d7e |
ol.pushGeneratorState();
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::Man);
|
|
Packit |
1c1d7e |
if (!latexSourceCode)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::Latex);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!rtfSourceCode)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::RTF);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
// write file link (HTML only)
|
|
Packit |
1c1d7e |
ol.writeObjectLink(0,fn,0,m_impl->body->fileDef->name());
|
|
Packit |
1c1d7e |
ol.enableAll();
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::Html);
|
|
Packit |
1c1d7e |
if (latexSourceCode)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::Latex);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (rtfSourceCode)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::RTF);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
// write normal text (RTF/Latex/Man only)
|
|
Packit |
1c1d7e |
ol.docify(m_impl->body->fileDef->name());
|
|
Packit |
1c1d7e |
ol.popGeneratorState();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// write text between markers
|
|
Packit |
1c1d7e |
ol.parseText(refText.mid(fileMarkerPos+2,
|
|
Packit |
1c1d7e |
lineMarkerPos-fileMarkerPos-2));
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
ol.pushGeneratorState();
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::Man);
|
|
Packit |
1c1d7e |
if (!latexSourceCode)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::Latex);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!rtfSourceCode)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::RTF);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
ol.disableAllBut(OutputGenerator::Html);
|
|
Packit |
1c1d7e |
// write line link (HTML only)
|
|
Packit |
1c1d7e |
ol.writeObjectLink(0,fn,anchorStr,lineStr);
|
|
Packit |
1c1d7e |
ol.enableAll();
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::Html);
|
|
Packit |
1c1d7e |
if (latexSourceCode)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::Latex);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (rtfSourceCode)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::RTF);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
// write normal text (Latex/Man only)
|
|
Packit |
1c1d7e |
ol.docify(lineStr);
|
|
Packit |
1c1d7e |
ol.popGeneratorState();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// write text right from linePos marker
|
|
Packit |
1c1d7e |
ol.parseText(refText.right(
|
|
Packit |
1c1d7e |
refText.length()-lineMarkerPos-2));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
ol.endParagraph();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
err("translation error: invalid markers in trDefinedAtLineInSourceFile()\n");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
ol.popGeneratorState();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Definition::setBodySegment(int bls,int ble)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("setBodySegment(%d,%d) for %s\n",bls,ble,name().data());
|
|
Packit |
1c1d7e |
if (m_impl->body==0) m_impl->body = new BodyInfo;
|
|
Packit |
1c1d7e |
m_impl->body->startLine=bls;
|
|
Packit |
1c1d7e |
m_impl->body->endLine=ble;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Definition::setBodyDef(FileDef *fd)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_impl->body==0) m_impl->body = new BodyInfo;
|
|
Packit |
1c1d7e |
m_impl->body->fileDef=fd;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool Definition::hasSources() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return m_impl->body && m_impl->body->startLine!=-1 &&
|
|
Packit |
1c1d7e |
m_impl->body->endLine>=m_impl->body->startLine &&
|
|
Packit |
1c1d7e |
m_impl->body->fileDef;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*! Write code of this definition into the documentation */
|
|
Packit |
1c1d7e |
void Definition::writeInlineCode(OutputList &ol,const char *scopeName)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
static bool inlineSources = Config_getBool(INLINE_SOURCES);
|
|
Packit |
1c1d7e |
ol.pushGeneratorState();
|
|
Packit |
1c1d7e |
//printf("Source Fragment %s: %d-%d bodyDef=%p\n",name().data(),
|
|
Packit |
1c1d7e |
// m_startBodyLine,m_endBodyLine,m_bodyDef);
|
|
Packit |
1c1d7e |
if (inlineSources && hasSources())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString codeFragment;
|
|
Packit |
1c1d7e |
int actualStart=m_impl->body->startLine,actualEnd=m_impl->body->endLine;
|
|
Packit |
1c1d7e |
if (readCodeFragment(m_impl->body->fileDef->absFilePath(),
|
|
Packit |
1c1d7e |
actualStart,actualEnd,codeFragment)
|
|
Packit |
1c1d7e |
)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("Adding code fragment '%s' ext='%s'\n",
|
|
Packit |
1c1d7e |
// codeFragment.data(),m_impl->defFileExt.data());
|
|
Packit |
1c1d7e |
ParserInterface *pIntf = Doxygen::parserManager->getParser(m_impl->defFileExt);
|
|
Packit |
1c1d7e |
pIntf->resetCodeParserState();
|
|
Packit |
1c1d7e |
//printf("Read:\n`%s'\n\n",codeFragment.data());
|
|
Packit |
1c1d7e |
MemberDef *thisMd = 0;
|
|
Packit |
1c1d7e |
if (definitionType()==TypeMember) thisMd = (MemberDef *)this;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
ol.startCodeFragment();
|
|
Packit |
1c1d7e |
pIntf->parseCode(ol, // codeOutIntf
|
|
Packit |
1c1d7e |
scopeName, // scope
|
|
Packit |
1c1d7e |
codeFragment, // input
|
|
Packit |
1c1d7e |
m_impl->lang, // lang
|
|
Packit |
1c1d7e |
FALSE, // isExample
|
|
Packit |
1c1d7e |
0, // exampleName
|
|
Packit |
1c1d7e |
m_impl->body->fileDef, // fileDef
|
|
Packit |
1c1d7e |
actualStart, // startLine
|
|
Packit |
1c1d7e |
actualEnd, // endLine
|
|
Packit |
1c1d7e |
TRUE, // inlineFragment
|
|
Packit |
1c1d7e |
thisMd, // memberDef
|
|
Packit |
1c1d7e |
TRUE // show line numbers
|
|
Packit |
1c1d7e |
);
|
|
Packit |
1c1d7e |
ol.endCodeFragment();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
ol.popGeneratorState();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*! Write a reference to the source code fragments in which this
|
|
Packit |
1c1d7e |
* definition is used.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
void Definition::_writeSourceRefList(OutputList &ol,const char *scopeName,
|
|
Packit |
1c1d7e |
const QCString &text,MemberSDict *members,bool /*funcOnly*/)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
static bool latexSourceCode = Config_getBool(LATEX_SOURCE_CODE);
|
|
Packit |
1c1d7e |
static bool rtfSourceCode = Config_getBool(RTF_SOURCE_CODE);
|
|
Packit |
1c1d7e |
static bool sourceBrowser = Config_getBool(SOURCE_BROWSER);
|
|
Packit |
1c1d7e |
static bool refLinkSource = Config_getBool(REFERENCES_LINK_SOURCE);
|
|
Packit |
1c1d7e |
ol.pushGeneratorState();
|
|
Packit |
1c1d7e |
if (members)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
members->sort();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
ol.startParagraph("reference");
|
|
Packit |
1c1d7e |
ol.parseText(text);
|
|
Packit |
1c1d7e |
ol.docify(" ");
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString ldefLine=theTranslator->trWriteList(members->count());
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QRegExp marker("@[0-9]+");
|
|
Packit |
1c1d7e |
int index=0,newIndex,matchLen;
|
|
Packit |
1c1d7e |
// now replace all markers in inheritLine with links to the classes
|
|
Packit |
1c1d7e |
while ((newIndex=marker.match(ldefLine,index,&matchLen))!=-1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
bool ok;
|
|
Packit |
1c1d7e |
ol.parseText(ldefLine.mid(index,newIndex-index));
|
|
Packit |
1c1d7e |
uint entryIndex = ldefLine.mid(newIndex+1,matchLen-1).toUInt(&ok;;
|
|
Packit |
1c1d7e |
MemberDef *md=members->at(entryIndex);
|
|
Packit |
1c1d7e |
if (ok && md)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString scope=md->getScopeString();
|
|
Packit |
1c1d7e |
QCString name=md->name();
|
|
Packit |
1c1d7e |
//printf("class=%p scope=%s scopeName=%s\n",md->getClassDef(),scope.data(),scopeName);
|
|
Packit |
1c1d7e |
if (!scope.isEmpty() && scope!=scopeName)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
name.prepend(scope+getLanguageSpecificSeparator(m_impl->lang));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!md->isObjCMethod() &&
|
|
Packit |
1c1d7e |
(md->isFunction() || md->isSlot() ||
|
|
Packit |
1c1d7e |
md->isPrototype() || md->isSignal()
|
|
Packit |
1c1d7e |
)
|
|
Packit |
1c1d7e |
)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
name+="()";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
//Definition *d = md->getOutputFileBase();
|
|
Packit |
1c1d7e |
//if (d==Doxygen::globalScope) d=md->getBodyDef();
|
|
Packit |
1c1d7e |
if (sourceBrowser &&
|
|
Packit |
1c1d7e |
!(md->isLinkable() && !refLinkSource) &&
|
|
Packit |
1c1d7e |
md->getStartBodyLine()!=-1 &&
|
|
Packit |
1c1d7e |
md->getBodyDef()
|
|
Packit |
1c1d7e |
)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("md->getBodyDef()=%p global=%p\n",md->getBodyDef(),Doxygen::globalScope);
|
|
Packit |
1c1d7e |
// for HTML write a real link
|
|
Packit |
1c1d7e |
ol.pushGeneratorState();
|
|
Packit |
1c1d7e |
//ol.disableAllBut(OutputGenerator::Html);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::Man);
|
|
Packit |
1c1d7e |
if (!latexSourceCode)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::Latex);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!rtfSourceCode)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::RTF);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
const int maxLineNrStr = 10;
|
|
Packit |
1c1d7e |
char anchorStr[maxLineNrStr];
|
|
Packit |
1c1d7e |
qsnprintf(anchorStr,maxLineNrStr,"l%05d",md->getStartBodyLine());
|
|
Packit |
1c1d7e |
//printf("Write object link to %s\n",md->getBodyDef()->getSourceFileBase().data());
|
|
Packit |
1c1d7e |
ol.writeObjectLink(0,md->getBodyDef()->getSourceFileBase(),anchorStr,name);
|
|
Packit |
1c1d7e |
ol.popGeneratorState();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// for the other output formats just mention the name
|
|
Packit |
1c1d7e |
ol.pushGeneratorState();
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::Html);
|
|
Packit |
1c1d7e |
if (latexSourceCode)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::Latex);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (rtfSourceCode)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::RTF);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
ol.docify(name);
|
|
Packit |
1c1d7e |
ol.popGeneratorState();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (md->isLinkable() /*&& d && d->isLinkable()*/)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// for HTML write a real link
|
|
Packit |
1c1d7e |
ol.pushGeneratorState();
|
|
Packit |
1c1d7e |
//ol.disableAllBut(OutputGenerator::Html);
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::Man);
|
|
Packit |
1c1d7e |
if (!latexSourceCode)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::Latex);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!rtfSourceCode)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::RTF);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
ol.writeObjectLink(md->getReference(),
|
|
Packit |
1c1d7e |
md->getOutputFileBase(),
|
|
Packit |
1c1d7e |
md->anchor(),name);
|
|
Packit |
1c1d7e |
ol.popGeneratorState();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// for the other output formats just mention the name
|
|
Packit |
1c1d7e |
ol.pushGeneratorState();
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::Html);
|
|
Packit |
1c1d7e |
if (latexSourceCode)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::Latex);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (rtfSourceCode)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::RTF);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
ol.docify(name);
|
|
Packit |
1c1d7e |
ol.popGeneratorState();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.docify(name);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
index=newIndex+matchLen;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
ol.parseText(ldefLine.right(ldefLine.length()-index));
|
|
Packit |
1c1d7e |
ol.writeString(".");
|
|
Packit |
1c1d7e |
ol.endParagraph();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
ol.popGeneratorState();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Definition::writeSourceReffedBy(OutputList &ol,const char *scopeName)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (Config_getBool(REFERENCED_BY_RELATION))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
_writeSourceRefList(ol,scopeName,theTranslator->trReferencedBy(),m_impl->sourceRefByDict,FALSE);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Definition::writeSourceRefs(OutputList &ol,const char *scopeName)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (Config_getBool(REFERENCES_RELATION))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
_writeSourceRefList(ol,scopeName,theTranslator->trReferences(),m_impl->sourceRefsDict,TRUE);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool Definition::hasDocumentation() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
static bool extractAll = Config_getBool(EXTRACT_ALL);
|
|
Packit |
1c1d7e |
//static bool sourceBrowser = Config_getBool(SOURCE_BROWSER);
|
|
Packit |
1c1d7e |
bool hasDocs =
|
|
Packit |
1c1d7e |
(m_impl->details && !m_impl->details->doc.isEmpty()) || // has detailed docs
|
|
Packit |
1c1d7e |
(m_impl->brief && !m_impl->brief->doc.isEmpty()) || // has brief description
|
|
Packit |
1c1d7e |
(m_impl->inbodyDocs && !m_impl->inbodyDocs->doc.isEmpty()) || // has inbody docs
|
|
Packit |
1c1d7e |
extractAll //|| // extract everything
|
|
Packit |
1c1d7e |
// (sourceBrowser && m_impl->body &&
|
|
Packit |
1c1d7e |
// m_impl->body->startLine!=-1 && m_impl->body->fileDef)
|
|
Packit |
1c1d7e |
; // link to definition
|
|
Packit |
1c1d7e |
return hasDocs;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool Definition::hasUserDocumentation() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
bool hasDocs =
|
|
Packit |
1c1d7e |
(m_impl->details && !m_impl->details->doc.isEmpty()) ||
|
|
Packit |
1c1d7e |
(m_impl->brief && !m_impl->brief->doc.isEmpty()) ||
|
|
Packit |
1c1d7e |
(m_impl->inbodyDocs && !m_impl->inbodyDocs->doc.isEmpty());
|
|
Packit |
1c1d7e |
return hasDocs;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Definition::addSourceReferencedBy(MemberDef *md)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (md)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString name = md->name();
|
|
Packit |
1c1d7e |
QCString scope = md->getScopeString();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (!scope.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
name.prepend(scope+"::");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (m_impl->sourceRefByDict==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->sourceRefByDict = new MemberSDict;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (m_impl->sourceRefByDict->find(name)==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->sourceRefByDict->append(name,md);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Definition::addSourceReferences(MemberDef *md)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (md)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString name = md->name();
|
|
Packit |
1c1d7e |
QCString scope = md->getScopeString();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (!scope.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
name.prepend(scope+"::");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (m_impl->sourceRefsDict==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->sourceRefsDict = new MemberSDict;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (m_impl->sourceRefsDict->find(name)==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->sourceRefsDict->append(name,md);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Definition *Definition::findInnerCompound(const char *) const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Definition::addInnerCompound(Definition *)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
err("Definition::addInnerCompound() called\n");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString Definition::qualifiedName() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//static int count=0;
|
|
Packit |
1c1d7e |
//count++;
|
|
Packit |
1c1d7e |
if (!m_impl->qualifiedName.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//count--;
|
|
Packit |
1c1d7e |
return m_impl->qualifiedName;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//printf("start %s::qualifiedName() localName=%s\n",name().data(),m_impl->localName.data());
|
|
Packit |
1c1d7e |
if (m_impl->outerScope==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_impl->localName=="<globalScope>")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//count--;
|
|
Packit |
1c1d7e |
return "";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//count--;
|
|
Packit |
1c1d7e |
return m_impl->localName;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (m_impl->outerScope->name()=="<globalScope>")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->qualifiedName = m_impl->localName;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->qualifiedName = m_impl->outerScope->qualifiedName()+
|
|
Packit |
1c1d7e |
getLanguageSpecificSeparator(getLanguage())+
|
|
Packit |
1c1d7e |
m_impl->localName;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
//printf("end %s::qualifiedName()=%s\n",name().data(),m_impl->qualifiedName.data());
|
|
Packit |
1c1d7e |
//count--;
|
|
Packit |
1c1d7e |
return m_impl->qualifiedName;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Definition::setOuterScope(Definition *d)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("%s::setOuterScope(%s)\n",name().data(),d?d->name().data():"<none>");
|
|
Packit |
1c1d7e |
Definition *p = m_impl->outerScope;
|
|
Packit |
1c1d7e |
bool found=false;
|
|
Packit |
1c1d7e |
// make sure that we are not creating a recursive scope relation.
|
|
Packit |
1c1d7e |
while (p && !found)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
found = (p==d);
|
|
Packit |
1c1d7e |
p = p->m_impl->outerScope;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!found)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->qualifiedName.resize(0); // flush cached scope name
|
|
Packit |
1c1d7e |
m_impl->outerScope = d;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
m_impl->hidden = m_impl->hidden || d->isHidden();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString Definition::localName() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return m_impl->localName;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Definition::makePartOfGroup(GroupDef *gd)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_impl->partOfGroups==0) m_impl->partOfGroups = new GroupList;
|
|
Packit |
1c1d7e |
m_impl->partOfGroups->append(gd);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Definition::setRefItems(const QList<ListItemInfo> *sli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("%s::setRefItems()\n",name().data());
|
|
Packit |
1c1d7e |
if (sli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// deep copy the list
|
|
Packit |
1c1d7e |
if (m_impl->xrefListItems==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->xrefListItems=new QList<ListItemInfo>;
|
|
Packit |
1c1d7e |
m_impl->xrefListItems->setAutoDelete(TRUE);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
QListIterator<ListItemInfo> slii(*sli);
|
|
Packit |
1c1d7e |
ListItemInfo *lii;
|
|
Packit |
1c1d7e |
for (slii.toFirst();(lii=slii.current());++slii)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->xrefListItems->append(new ListItemInfo(*lii));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Definition::mergeRefItems(Definition *d)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("%s::mergeRefItems()\n",name().data());
|
|
Packit |
1c1d7e |
QList<ListItemInfo> *xrefList = d->xrefListItems();
|
|
Packit |
1c1d7e |
if (xrefList!=0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// deep copy the list
|
|
Packit |
1c1d7e |
if (m_impl->xrefListItems==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->xrefListItems=new QList<ListItemInfo>;
|
|
Packit |
1c1d7e |
m_impl->xrefListItems->setAutoDelete(TRUE);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
QListIterator<ListItemInfo> slii(*xrefList);
|
|
Packit |
1c1d7e |
ListItemInfo *lii;
|
|
Packit |
1c1d7e |
for (slii.toFirst();(lii=slii.current());++slii)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (_getXRefListId(lii->type)==-1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->xrefListItems->append(new ListItemInfo(*lii));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
int Definition::_getXRefListId(const char *listName) const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_impl->xrefListItems)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QListIterator<ListItemInfo> slii(*m_impl->xrefListItems);
|
|
Packit |
1c1d7e |
ListItemInfo *lii;
|
|
Packit |
1c1d7e |
for (slii.toFirst();(lii=slii.current());++slii)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (qstrcmp(lii->type,listName)==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return lii->itemId;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return -1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QList<ListItemInfo> *Definition::xrefListItems() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return m_impl->xrefListItems;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString Definition::pathFragment() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString result;
|
|
Packit |
1c1d7e |
if (m_impl->outerScope && m_impl->outerScope!=Doxygen::globalScope)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
result = m_impl->outerScope->pathFragment();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (isLinkable())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (!result.isEmpty()) result+="/";
|
|
Packit |
1c1d7e |
if (definitionType()==Definition::TypeGroup && ((const GroupDef*)this)->groupTitle())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
result+=((const GroupDef*)this)->groupTitle();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (definitionType()==Definition::TypePage && !((const PageDef*)this)->title().isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
result+=((const PageDef*)this)->title();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
result+=m_impl->localName;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
result+=m_impl->localName;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return result;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//----------------------------------------------------------------------------------------
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// TODO: move to htmlgen
|
|
Packit |
1c1d7e |
/*! Returns the string used in the footer for $navpath when
|
|
Packit |
1c1d7e |
* GENERATE_TREEVIEW is enabled
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
QCString Definition::navigationPathAsString() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString result;
|
|
Packit |
1c1d7e |
Definition *outerScope = getOuterScope();
|
|
Packit |
1c1d7e |
QCString locName = localName();
|
|
Packit |
1c1d7e |
if (outerScope && outerScope!=Doxygen::globalScope)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
result+=outerScope->navigationPathAsString();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (definitionType()==Definition::TypeFile && ((const FileDef*)this)->getDirDef())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
result+=((const FileDef*)this)->getDirDef()->navigationPathAsString();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
result+="";
|
|
Packit |
1c1d7e |
if (isLinkable())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (definitionType()==Definition::TypeGroup && ((const GroupDef*)this)->groupTitle())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
result+=""+
|
|
Packit |
1c1d7e |
convertToHtml(((const GroupDef*)this)->groupTitle())+"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (definitionType()==Definition::TypePage && !((const PageDef*)this)->title().isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
result+=""+
|
|
Packit |
1c1d7e |
convertToHtml(((const PageDef*)this)->title())+"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (definitionType()==Definition::TypeClass)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString name = locName;
|
|
Packit |
1c1d7e |
if (name.right(2)=="-p" /*|| name.right(2)=="-g"*/)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
name = name.left(name.length()-2);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
result+="
|
|
Packit |
1c1d7e |
if (!anchor().isEmpty()) result+="#"+anchor();
|
|
Packit |
1c1d7e |
result+="\">"+convertToHtml(name)+"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
result+=""+
|
|
Packit |
1c1d7e |
convertToHtml(locName)+"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
result+=""+convertToHtml(locName)+"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
result+="";
|
|
Packit |
1c1d7e |
return result;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// TODO: move to htmlgen
|
|
Packit |
1c1d7e |
void Definition::writeNavigationPath(OutputList &ol) const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.pushGeneratorState();
|
|
Packit |
1c1d7e |
ol.disableAllBut(OutputGenerator::Html);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString navPath;
|
|
Packit |
1c1d7e |
navPath += "\n"
|
|
Packit |
1c1d7e |
"
|
|
Packit |
1c1d7e |
navPath += navigationPathAsString();
|
|
Packit |
1c1d7e |
navPath += " \n"
|
|
Packit |
1c1d7e |
"\n";
|
|
Packit |
1c1d7e |
ol.writeNavigationPath(navPath);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
ol.popGeneratorState();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// TODO: move to htmlgen
|
|
Packit |
1c1d7e |
void Definition::writeToc(OutputList &ol)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
SectionDict *sectionDict = m_impl->sectionDict;
|
|
Packit |
1c1d7e |
if (sectionDict==0) return;
|
|
Packit |
1c1d7e |
ol.pushGeneratorState();
|
|
Packit |
1c1d7e |
ol.disableAllBut(OutputGenerator::Html);
|
|
Packit |
1c1d7e |
ol.writeString("");
|
|
Packit |
1c1d7e |
ol.writeString("");
|
|
Packit |
1c1d7e |
ol.writeString(theTranslator->trRTFTableOfContents());
|
|
Packit |
1c1d7e |
ol.writeString("\n");
|
|
Packit |
1c1d7e |
ol.writeString("
|
|
Packit |
1c1d7e |
SDict<SectionInfo>::Iterator li(*sectionDict);
|
|
Packit |
1c1d7e |
SectionInfo *si;
|
|
Packit |
1c1d7e |
int level=1,l;
|
|
Packit |
1c1d7e |
char cs[2];
|
|
Packit |
1c1d7e |
cs[1]='\0';
|
|
Packit |
1c1d7e |
bool inLi[5]={ FALSE, FALSE, FALSE, FALSE };
|
|
Packit |
1c1d7e |
for (li.toFirst();(si=li.current());++li)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (si->type==SectionInfo::Section ||
|
|
Packit |
1c1d7e |
si->type==SectionInfo::Subsection ||
|
|
Packit |
1c1d7e |
si->type==SectionInfo::Subsubsection ||
|
|
Packit |
1c1d7e |
si->type==SectionInfo::Paragraph)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf(" level=%d title=%s\n",level,si->title.data());
|
|
Packit |
1c1d7e |
int nextLevel = (int)si->type;
|
|
Packit |
1c1d7e |
if (nextLevel>level)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
for (l=level;l
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.writeString("
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (nextLevel
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
for (l=level;l>nextLevel;l--)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (inLi[l]) ol.writeString("\n");
|
|
Packit |
1c1d7e |
inLi[l]=FALSE;
|
|
Packit |
1c1d7e |
ol.writeString("\n");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
cs[0]='0'+nextLevel;
|
|
Packit |
1c1d7e |
if (inLi[nextLevel]) ol.writeString("\n");
|
|
Packit |
1c1d7e |
QCString titleDoc = convertToHtml(si->title);
|
|
Packit |
1c1d7e |
ol.writeString("label+"\">"+(si->title.isEmpty()?si->label:titleDoc)+"");
|
|
Packit |
1c1d7e |
inLi[nextLevel]=TRUE;
|
|
Packit |
1c1d7e |
level = nextLevel;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
while (level>1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (inLi[level]) ol.writeString("\n");
|
|
Packit |
1c1d7e |
inLi[level]=FALSE;
|
|
Packit |
1c1d7e |
ol.writeString("\n");
|
|
Packit |
1c1d7e |
level--;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (inLi[level]) ol.writeString("\n");
|
|
Packit |
1c1d7e |
inLi[level]=FALSE;
|
|
Packit |
1c1d7e |
ol.writeString("\n");
|
|
Packit |
1c1d7e |
ol.writeString("\n");
|
|
Packit |
1c1d7e |
ol.popGeneratorState();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//----------------------------------------------------------------------------------------
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString Definition::symbolName() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return m_symbolName;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//----------------------
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString Definition::documentation() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return m_impl->details ? m_impl->details->doc : QCString("");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
int Definition::docLine() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return m_impl->details ? m_impl->details->line : 1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString Definition::docFile() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return m_impl->details ? m_impl->details->file : QCString("<"+m_name+">");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//----------------------------------------------------------------------------
|
|
Packit |
1c1d7e |
// strips w from s iff s starts with w
|
|
Packit |
1c1d7e |
static bool stripWord(QCString &s,QCString w)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
bool success=FALSE;
|
|
Packit |
1c1d7e |
if (s.left(w.length())==w)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
success=TRUE;
|
|
Packit |
1c1d7e |
s=s.right(s.length()-w.length());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return success;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//----------------------------------------------------------------------------
|
|
Packit |
1c1d7e |
// some quasi intelligent brief description abbreviator :^)
|
|
Packit |
1c1d7e |
QCString abbreviate(const char *s,const char *name)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString scopelessName=name;
|
|
Packit |
1c1d7e |
int i=scopelessName.findRev("::");
|
|
Packit |
1c1d7e |
if (i!=-1) scopelessName=scopelessName.mid(i+2);
|
|
Packit |
1c1d7e |
QCString result=s;
|
|
Packit |
1c1d7e |
result=result.stripWhiteSpace();
|
|
Packit |
1c1d7e |
// strip trailing .
|
|
Packit |
1c1d7e |
if (!result.isEmpty() && result.at(result.length()-1)=='.')
|
|
Packit |
1c1d7e |
result=result.left(result.length()-1);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// strip any predefined prefix
|
|
Packit |
1c1d7e |
QStrList &briefDescAbbrev = Config_getList(ABBREVIATE_BRIEF);
|
|
Packit |
1c1d7e |
const char *p = briefDescAbbrev.first();
|
|
Packit |
1c1d7e |
while (p)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString s = p;
|
|
Packit |
1c1d7e |
s.replace(QRegExp("\\$name"), scopelessName); // replace $name with entity name
|
|
Packit |
1c1d7e |
s += " ";
|
|
Packit |
1c1d7e |
stripWord(result,s);
|
|
Packit |
1c1d7e |
p = briefDescAbbrev.next();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// capitalize first word
|
|
Packit |
1c1d7e |
if (!result.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int c=result[0];
|
|
Packit |
1c1d7e |
if (c>='a' && c<='z') c+='A'-'a';
|
|
Packit |
1c1d7e |
result[0]=c;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return result;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//----------------------
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString Definition::briefDescription(bool abbr) const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("%s::briefDescription(%d)='%s'\n",name().data(),abbr,m_impl->brief?m_impl->brief->doc.data():"<none>");
|
|
Packit |
1c1d7e |
return m_impl->brief ?
|
|
Packit |
1c1d7e |
(abbr ? abbreviate(m_impl->brief->doc,displayName()) : m_impl->brief->doc) :
|
|
Packit |
1c1d7e |
QCString("");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString Definition::briefDescriptionAsTooltip() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_impl->brief)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_impl->brief->tooltip.isEmpty() && !m_impl->brief->doc.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
static bool reentering=FALSE;
|
|
Packit |
1c1d7e |
if (!reentering)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
MemberDef *md = definitionType()==TypeMember ? (MemberDef*)this : 0;
|
|
Packit |
1c1d7e |
const Definition *scope = definitionType()==TypeMember ? getOuterScope() : this;
|
|
Packit |
1c1d7e |
reentering=TRUE; // prevent requests for tooltips while parsing a tooltip
|
|
Packit |
1c1d7e |
m_impl->brief->tooltip = parseCommentAsText(
|
|
Packit |
1c1d7e |
scope,md,
|
|
Packit |
1c1d7e |
m_impl->brief->doc,
|
|
Packit |
1c1d7e |
m_impl->brief->file,
|
|
Packit |
1c1d7e |
m_impl->brief->line);
|
|
Packit |
1c1d7e |
reentering=FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return m_impl->brief->tooltip;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return QCString("");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
int Definition::briefLine() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return m_impl->brief ? m_impl->brief->line : 1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString Definition::briefFile() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return m_impl->brief ? m_impl->brief->file : QCString("<"+m_name+">");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//----------------------
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString Definition::inbodyDocumentation() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return m_impl->inbodyDocs ? m_impl->inbodyDocs->doc : QCString("");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
int Definition::inbodyLine() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return m_impl->inbodyDocs ? m_impl->inbodyDocs->line : 1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString Definition::inbodyFile() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return m_impl->inbodyDocs ? m_impl->inbodyDocs->file : QCString("<"+m_name+">");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//----------------------
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString Definition::getDefFileName() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return m_impl->defFileName;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString Definition::getDefFileExtension() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return m_impl->defFileExt;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool Definition::isHidden() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return m_impl->hidden;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool Definition::isVisibleInProject() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return isLinkableInProject() && !m_impl->hidden;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool Definition::isVisible() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return isLinkable() && !m_impl->hidden;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool Definition::isArtificial() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return m_impl->isArtificial;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString Definition::getReference() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return m_impl->ref;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool Definition::isReference() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return !m_impl->ref.isEmpty();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
int Definition::getStartBodyLine() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return m_impl->body ? m_impl->body->startLine : -1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
int Definition::getEndBodyLine() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return m_impl->body ? m_impl->body->endLine : -1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
FileDef *Definition::getBodyDef() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return m_impl->body ? m_impl->body->fileDef : 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
GroupList *Definition::partOfGroups() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return m_impl->partOfGroups;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool Definition::isLinkableViaGroup() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
GroupList *gl = partOfGroups();
|
|
Packit |
1c1d7e |
if (gl)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
GroupListIterator gli(*gl);
|
|
Packit |
1c1d7e |
GroupDef *gd;
|
|
Packit |
1c1d7e |
for (gli.toFirst();(gd=gli.current());++gli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (gd->isLinkable()) return TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Definition *Definition::getOuterScope() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return m_impl->outerScope;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
MemberSDict *Definition::getReferencesMembers() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return m_impl->sourceRefsDict;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
MemberSDict *Definition::getReferencedByMembers() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return m_impl->sourceRefByDict;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Definition::setReference(const char *r)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->ref=r;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
SrcLangExt Definition::getLanguage() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return m_impl->lang;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Definition::setHidden(bool b)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->hidden = m_impl->hidden || b;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Definition::setArtificial(bool b)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->isArtificial = b;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Definition::setLocalName(const QCString name)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->localName=name;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Definition::setLanguage(SrcLangExt lang)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_impl->lang=lang;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Definition::_setSymbolName(const QCString &name)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_symbolName=name;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool Definition::hasBriefDescription() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
static bool briefMemberDesc = Config_getBool(BRIEF_MEMBER_DESC);
|
|
Packit |
1c1d7e |
return !briefDescription().isEmpty() && briefMemberDesc;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString Definition::externalReference(const QCString &relPath) const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString ref = getReference();
|
|
Packit |
1c1d7e |
if (!ref.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString *dest = Doxygen::tagDestinationDict[ref];
|
|
Packit |
1c1d7e |
if (dest)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString result = *dest;
|
|
Packit |
1c1d7e |
int l = result.length();
|
|
Packit |
1c1d7e |
if (!relPath.isEmpty() && l>0 && result.at(0)=='.')
|
|
Packit |
1c1d7e |
{ // relative path -> prepend relPath.
|
|
Packit |
1c1d7e |
result.prepend(relPath);
|
|
Packit |
1c1d7e |
l+=relPath.length();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (l>0 && result.at(l-1)!='/') result+='/';
|
|
Packit |
1c1d7e |
return result;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return relPath;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|