Commit b6ef778f authored by Dimitri van Heesch's avatar Dimitri van Heesch

Doxygen-1.3.9.1-20041206

parent 02aa9b67
DOXYGEN Version 1.3.9.1-20041129 DOXYGEN Version 1.3.9.1-20041206
Please read the installation section of the manual Please read the installation section of the manual
(http://www.doxygen.org/install.html) for instructions. (http://www.doxygen.org/install.html) for instructions.
-------- --------
Dimitri van Heesch (29 November 2004) Dimitri van Heesch (06 December 2004)
DOXYGEN Version 1.3.9.1_20041129 DOXYGEN Version 1.3.9.1_20041206
Please read INSTALL for compilation instructions. Please read INSTALL for compilation instructions.
...@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives. ...@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives.
Enjoy, Enjoy,
Dimitri van Heesch (dimitri@stack.nl) (29 November 2004) Dimitri van Heesch (dimitri@stack.nl) (06 December 2004)
1.3.9.1-20041129 1.3.9.1-20041206
...@@ -1882,8 +1882,8 @@ class C {}; ...@@ -1882,8 +1882,8 @@ class C {};
The third argument is optional and can be used to specify the caption The third argument is optional and can be used to specify the caption
that is displayed below the image. This argument has to be specified that is displayed below the image. This argument has to be specified
between quotes even if it does not contain any spaces. The quotes are on a single line and between quotes even if it does not contain any
stripped before the caption is displayed. spaces. The quotes are stripped before the caption is displayed.
The fourth argument is also optional and can be used to specify the The fourth argument is also optional and can be used to specify the
width or height of the image. This is only useful width or height of the image. This is only useful
......
...@@ -23,14 +23,14 @@ formulas (as images) in the HTML documentation, you will also need to ...@@ -23,14 +23,14 @@ formulas (as images) in the HTML documentation, you will also need to
have the following tools installed have the following tools installed
<ul> <ul>
<li>\c latex: the \f$\mbox{\LaTeX}\f$ compiler, needed to parse the formulas. <li>\c latex: the \f$\mbox{\LaTeX}\f$ compiler, needed to parse the formulas.
To test I have used the teTeX 0.9 distribution. To test I have used the teTeX 1.0 distribution.
<li>\c dvips: a tool to convert DVI files to PostScript files <li>\c dvips: a tool to convert DVI files to PostScript files
I have used version 5.86 from Radical Eye software for testing. I have used version 5.92b from Radical Eye software for testing.
<li>\c gs: the GhostScript interpreter for converting PostScript files <li>\c gs: the GhostScript interpreter for converting PostScript files
to bitmaps. I have used Aladdin GhostScript 5.10 for testing. to bitmaps. I have used Aladdin GhostScript 8.0 for testing.
</ul> </ul>
There are two ways to include formulas in the documentation. There are three ways to include formulas in the documentation.
<ol> <ol>
<li>Using in-text formulas that appear in the running text. <li>Using in-text formulas that appear in the running text.
These formulas should be put between a pair of \\f\$ These formulas should be put between a pair of \\f\$
...@@ -69,12 +69,34 @@ There are two ways to include formulas in the documentation. ...@@ -69,12 +69,34 @@ There are two ways to include formulas in the documentation.
\right\} dt \right\} dt
\right| \right|
\f] \f]
<li>Formulas or other latex elements that are not in a math
environment can be specified using \\f{environment}, where
\c environment is the name of the \f$\mbox{\LaTeX}\f$ environment,
the corresponding end command is \\f}. Here is an example for an
equation array
\verbatim
\f{eqnarray*}
g &=& \frac{Gm_2}{r^2} \\
&=& \frac{(6.673 \times 10^{-11}\,\mbox{m}^3\,\mbox{kg}^{-1}\,
\mbox{s}^{-2})(5.9736 \times 10^{24}\,\mbox{kg})}{(6371.01\,\mbox{km})^2} \\
&=& 9.82066032\,\mbox{m/s}^2
\f}
\endverbatim
which results in:
\f{eqnarray*}
g &=& \frac{Gm_2}{r^2} \\
&=& \frac{(6.673 \times 10^{-11}\,\mbox{m}^3\,\mbox{kg}^{-1}\,
\mbox{s}^{-2})(5.9736 \times 10^{24}\,\mbox{kg})}{(6371.01\,\mbox{km})^2} \\
&=& 9.82066032\,\mbox{m/s}^2
\f}
</ol> </ol>
Formulas should be valid commands in \f$\mbox{\LaTeX}\f$'s math-mode. For the first two commands one should make sure formulas contain
valid commands in \f$\mbox{\LaTeX}\f$'s math-mode. For the third command
the section should contain valid command for the specific environment.
\warning Currently, doxygen is not very fault tolerant in recovering \warning Currently, doxygen is not very fault tolerant in recovering
from typos in formulas. It may have to be necessary to remove the from typos in formulas. It may have to be necessary to remove the
file <code>formula.repository</code> that is written in the html directory to file <code>formula.repository</code> that is written to the html directory to
a rid of an incorrect formula a rid of an incorrect formula
\htmlonly \htmlonly
......
...@@ -23,7 +23,7 @@ text fragments, generated by doxygen, can be produced in languages other ...@@ -23,7 +23,7 @@ text fragments, generated by doxygen, can be produced in languages other
than English (the default). The output language is chosen through the than English (the default). The output language is chosen through the
configuration file (with default name and known as Doxyfile). configuration file (with default name and known as Doxyfile).
Currently (version 1.3.9.1), 30 languages Currently (version 1.3.9.1-20041129), 30 languages
are supported (sorted alphabetically): are supported (sorted alphabetically):
Afrikaans, Brazilian Portuguese, Catalan, Chinese, Chinese Afrikaans, Brazilian Portuguese, Catalan, Chinese, Chinese
Traditional, Croatian, Czech, Danish, Dutch, English, Finnish, French, Traditional, Croatian, Czech, Danish, Dutch, English, Finnish, French,
......
(1.3.9.1) (1.3.9.1-20041129)
Doxygen supports the following 30 languages (sorted alphabetically): Doxygen supports the following 30 languages (sorted alphabetically):
......
Summary: A documentation system for C/C++. Summary: A documentation system for C/C++.
Name: doxygen Name: doxygen
Version: 1.3.9.1_20041129 Version: 1.3.9.1_20041206
Release: 1 Release: 1
Epoch: 1 Epoch: 1
Source0: ftp://ftp.stack.nl/pub/users/dimitri/%{name}-%{version}.src.tar.gz Source0: ftp://ftp.stack.nl/pub/users/dimitri/%{name}-%{version}.src.tar.gz
......
...@@ -49,6 +49,8 @@ ...@@ -49,6 +49,8 @@
#include <strings.h> #include <strings.h>
#endif #endif
//#undef SMALLSTRING
#define SMALLSTRING
/***************************************************************************** /*****************************************************************************
Fixes and workarounds for some platforms Fixes and workarounds for some platforms
...@@ -166,6 +168,11 @@ Q_EXPORT QDataStream &operator>>( QDataStream &, QByteArray & ); ...@@ -166,6 +168,11 @@ Q_EXPORT QDataStream &operator>>( QDataStream &, QByteArray & );
#ifdef SMALLSTRING
#define SCString QCString
#include "scstring.h"
#else
/***************************************************************************** /*****************************************************************************
QCString class QCString class
*****************************************************************************/ *****************************************************************************/
...@@ -252,6 +259,7 @@ public: ...@@ -252,6 +259,7 @@ public:
QCString &operator+=( char c ); QCString &operator+=( char c );
}; };
#endif
/***************************************************************************** /*****************************************************************************
QCString stream functions QCString stream functions
......
...@@ -12212,6 +12212,14 @@ QString::QString( const QByteArray& ba ) ...@@ -12212,6 +12212,14 @@ QString::QString( const QByteArray& ba )
d = new QStringData(uc,l,l); d = new QStringData(uc,l,l);
} }
QString::QString( const QCString& ba )
{
Q2HELPER(stat_construct_ba++)
uint l;
QChar *uc = internalAsciiToUnicode(ba,&l);
d = new QStringData(uc,l,l);
}
/*! /*!
Constructs a string that is a deep copy of the Constructs a string that is a deep copy of the
first \a length QChar in the array \a unicode. first \a length QChar in the array \a unicode.
......
...@@ -353,6 +353,7 @@ public: ...@@ -353,6 +353,7 @@ public:
QString( QChar ); // one-char string QString( QChar ); // one-char string
QString( const QString & ); // impl-shared copy QString( const QString & ); // impl-shared copy
QString( const QByteArray& ); // deep copy QString( const QByteArray& ); // deep copy
QString( const QCString& ); // deep copy
QString( const QChar* unicode, uint length ); // deep copy QString( const QChar* unicode, uint length ); // deep copy
#ifndef QT_NO_CAST_ASCII #ifndef QT_NO_CAST_ASCII
QString( const char *str ); // deep copy QString( const char *str ); // deep copy
......
...@@ -7,6 +7,7 @@ HEADERS = qarray.h \ ...@@ -7,6 +7,7 @@ HEADERS = qarray.h \
qcollection.h \ qcollection.h \
qconfig.h \ qconfig.h \
qcstring.h \ qcstring.h \
scstring.h \
qdatastream.h \ qdatastream.h \
qdatetime.h \ qdatetime.h \
qdict.h \ qdict.h \
...@@ -45,7 +46,7 @@ HEADERS = qarray.h \ ...@@ -45,7 +46,7 @@ HEADERS = qarray.h \
qmodules.h qmodules.h
SOURCES = qbuffer.cpp \ SOURCES = qbuffer.cpp \
qcollection.cpp \ qcollection.cpp \
qcstring.cpp \ scstring.cpp \
qdatastream.cpp \ qdatastream.cpp \
qdatetime.cpp \ qdatetime.cpp \
qdir.cpp \ qdir.cpp \
......
...@@ -19,56 +19,84 @@ ...@@ -19,56 +19,84 @@
#define _BUFSTR_H #define _BUFSTR_H
#include "qtbc.h" #include "qtbc.h"
#include <stdio.h>
#include <stdlib.h>
/*! String that can deal more efficiently with large large numbers /*! @brief Buffer used to store strings
* of resizing. *
* This buffer is used append characters and strings. It will automatically
* resize itself, yet provide efficient random access to the content.
*/ */
class BufStr : public QCString class BufStr
{ {
public: public:
BufStr(int size) : QCString(size), offset(0), spareRoom(10240) {} BufStr(int size)
void addChar(char c) : m_size(size), m_writeOffset(0), m_spareRoom(10240), m_buf(0)
{ {
if (offset>=size()) m_buf = (char *)malloc(size);
}
~BufStr()
{ {
QCString::resize(size()+spareRoom); free(m_buf);
} }
QCString::data()[offset++]=c; void addChar(char c)
{
makeRoomFor(1);
m_buf[m_writeOffset++]=c;
} }
void addArray(const char *a,int len) void addArray(const char *a,int len)
{ {
if (offset+len>=size()) makeRoomFor(len);
{ memcpy(m_buf+m_writeOffset,a,len);
QCString::resize(size()+len+spareRoom); m_writeOffset+=len;
} }
memcpy(QCString::data()+offset,a,len);
offset+=len;
}
uint curPos() { return offset; }
void skip(uint s) void skip(uint s)
{ {
if (offset+s>=size()) makeRoomFor(s);
m_writeOffset+=s;
}
void resize( uint newlen )
{ {
QCString::resize(size()+s+spareRoom); m_size=newlen;
if (m_writeOffset>=m_size) // offset out of range -> enlarge
{
m_size=m_writeOffset+m_spareRoom;
} }
offset+=s; m_buf = (char *)realloc(m_buf,m_size);
} }
void resize( uint newlen ) char *data() const
{ {
//QCString::resize(newlen); return m_buf;
//if (offset>newlen) }
//{ char &at(uint i) const
// offset=newlen; {
//} return m_buf[i];
offset=newlen; }
if (offset>=size()) bool isEmpty() const
{ {
QCString::resize(size()+spareRoom); return m_writeOffset==0;
} }
operator const char *() const
{
return m_buf;
}
uint curPos() const
{
return m_writeOffset;
} }
private: private:
uint offset; void makeRoomFor(uint size)
const int spareRoom; // 10Kb extra room to avoid frequent resizing {
if (m_writeOffset+size>=m_size)
{
resize(m_size+size+m_spareRoom);
}
}
uint m_size;
uint m_writeOffset;
const int m_spareRoom; // 10Kb extra room to avoid frequent resizing
char *m_buf;
}; };
#endif #endif
...@@ -188,6 +188,7 @@ static QCString handleCondCmdInAliases(const QCString &s) ...@@ -188,6 +188,7 @@ static QCString handleCondCmdInAliases(const QCString &s)
} }
else // get argument else // get argument
{ {
ep=sp;
while ((c=*arg) && isId(c)) arg++,ep++; while ((c=*arg) && isId(c)) arg++,ep++;
if (ep>sp) if (ep>sp)
{ {
...@@ -195,6 +196,9 @@ static QCString handleCondCmdInAliases(const QCString &s) ...@@ -195,6 +196,9 @@ static QCString handleCondCmdInAliases(const QCString &s)
//printf("Found conditional section id %s\n",id.data()); //printf("Found conditional section id %s\n",id.data());
startCondSection(id); startCondSection(id);
} }
else // invalid identifier
{
}
} }
p=ep; p=ep;
} }
......
...@@ -2850,12 +2850,12 @@ static QCString configFileToString(const char *name) ...@@ -2850,12 +2850,12 @@ static QCString configFileToString(const char *name)
int fsize=f.size(); int fsize=f.size();
QCString contents(fsize+2); QCString contents(fsize+2);
f.readBlock(contents.data(),fsize); f.readBlock(contents.data(),fsize);
f.close();
if (fsize==0 || contents[fsize-1]=='\n') if (fsize==0 || contents[fsize-1]=='\n')
contents[fsize]='\0'; contents[fsize]='\0';
else else
contents[fsize]='\n'; // to help the scanner contents[fsize]='\n'; // to help the scanner
contents[fsize+1]='\0'; contents[fsize+1]='\0';
f.close();
return contents; return contents;
} }
} }
......
...@@ -338,31 +338,40 @@ static void checkUndocumentedParams() ...@@ -338,31 +338,40 @@ static void checkUndocumentedParams()
} }
/*! Check if a member has documentation for its parameter and or return /*! Check if a member has documentation for its parameter and or return
* type, if applicable. * type, if applicable. If found this will be stored in the member, this
* is needed as a member can have brief and detailed documentation, while
* only one of these needs to document the parameters.
*/ */
static void checkNoDocumentedParams() static void detectNoDocumentedParams()
{ {
if (g_memberDef && Config_getBool("WARN_NO_PARAMDOC")) if (g_memberDef && Config_getBool("WARN_NO_PARAMDOC"))
{ {
ArgumentList *al= g_memberDef->argumentList(); ArgumentList *al = g_memberDef->argumentList();
ArgumentList *declAl = g_memberDef->declArgumentList(); ArgumentList *declAl = g_memberDef->declArgumentList();
QString returnType = g_memberDef->typeString(); QString returnType = g_memberDef->typeString();
if (!g_hasParamCommand && // no @param command if (!g_memberDef->hasDocumentedParams() &&
g_hasParamCommand)
{
g_memberDef->setHasDocumentedParams(TRUE);
}
else if (!g_memberDef->hasDocumentedParams())
{
bool allDoc=TRUE;
if ( // member has parameters
al && // but the member has a parameter list al && // but the member has a parameter list
al->count()>0 // with at least one parameter (that is not void) al->count()>0 // with at least one parameter (that is not void)
) )
{ {
ArgumentListIterator ali(*al); ArgumentListIterator ali(*al);
Argument *a; Argument *a;
bool allDoc=TRUE;
// see if all parameters have documentation
for (ali.toFirst();(a=ali.current()) && allDoc;++ali) for (ali.toFirst();(a=ali.current()) && allDoc;++ali)
{ {
allDoc = !a->docs.isEmpty(); allDoc = !a->docs.isEmpty();
printf("a->name=%s doc=%s\n",a->name.data(),a->docs.data()); //printf("a->name=%s doc=%s\n",a->name.data(),a->docs.data());
} }
if (!allDoc) if (!allDoc && declAl) // try declaration arguments as well
{
if (declAl) // try declaration arguments as well
{ {
allDoc=TRUE; allDoc=TRUE;
ArgumentListIterator ali(*declAl); ArgumentListIterator ali(*declAl);
...@@ -370,32 +379,33 @@ static void checkNoDocumentedParams() ...@@ -370,32 +379,33 @@ static void checkNoDocumentedParams()
for (ali.toFirst();(a=ali.current()) && allDoc;++ali) for (ali.toFirst();(a=ali.current()) && allDoc;++ali)
{ {
allDoc = !a->docs.isEmpty(); allDoc = !a->docs.isEmpty();
printf("a->name=%s doc=%s\n",a->name.data(),a->docs.data()); //printf("a->name=%s doc=%s\n",a->name.data(),a->docs.data());
}
} }
} }
if (!allDoc) if (allDoc)
{ {
QString errMsg = g_memberDef->setHasDocumentedParams(TRUE);
"Warning: the parameters of member "+
QString(g_memberDef->qualifiedName())+
QString(argListToString(al))+
" are not documented.";
warn_doc_error(g_memberDef->docFile(),g_memberDef->docLine(),errMsg);
} }
} }
//printf("Member %s hasReturnCommand=%d\n",g_memberDef->name().data(),g_hasReturnCommand);
if (!g_memberDef->hasDocumentedReturnType() && // docs not yet found
g_hasReturnCommand)
{
g_memberDef->setHasDocumentedReturnType(TRUE);
} }
if (!g_hasReturnCommand && // no @return or @retval commands else if ( // see if return needs to documented
!returnType.isEmpty() && // non empty g_memberDef->hasDocumentedReturnType() ||
returnType!="void" // end non void return type returnType.isEmpty() || // empty return type
returnType.find("void")!=-1 || // void return type
!g_memberDef->isConstructor() || // a constructor
!g_memberDef->isDestructor() // or destructor
) )
{ {
QString errMsg = g_memberDef->setHasDocumentedReturnType(TRUE);
"Warning: the return type or values of member "+
QString(g_memberDef->qualifiedName())+
QString(argListToString(al))+
" are not documented.";
warn_doc_error(g_memberDef->docFile(),g_memberDef->docLine(),errMsg);
} }
} }
} }
...@@ -4953,7 +4963,7 @@ DocNode *validatingParseDoc(const char *fileName,int startLine, ...@@ -4953,7 +4963,7 @@ DocNode *validatingParseDoc(const char *fileName,int startLine,
Definition *ctx,MemberDef *md, Definition *ctx,MemberDef *md,
const char *input,bool indexWords, const char *input,bool indexWords,
bool isExample, const char *exampleName, bool isExample, const char *exampleName,
bool singleLine,bool isParam) bool singleLine, bool linkFromIndex)
{ {
//printf("validatingParseDoc(%s,%s)\n",ctx?ctx->name().data():"<none>", //printf("validatingParseDoc(%s,%s)\n",ctx?ctx->name().data():"<none>",
...@@ -5052,7 +5062,8 @@ DocNode *validatingParseDoc(const char *fileName,int startLine, ...@@ -5052,7 +5062,8 @@ DocNode *validatingParseDoc(const char *fileName,int startLine,
} }
g_fileName = fileName; g_fileName = fileName;
g_relPath = ctx ? relativePathToRoot(ctx->getOutputFileBase()) : QString(""); g_relPath = (!linkFromIndex && ctx) ?
relativePathToRoot(ctx->getOutputFileBase()) : QString("");
//printf("ctx->name=%s relPath=%s\n",ctx->name().data(),g_relPath.data()); //printf("ctx->name=%s relPath=%s\n",ctx->name().data(),g_relPath.data());
g_memberDef = md; g_memberDef = md;
g_nodeStack.clear(); g_nodeStack.clear();
...@@ -5086,11 +5097,8 @@ DocNode *validatingParseDoc(const char *fileName,int startLine, ...@@ -5086,11 +5097,8 @@ DocNode *validatingParseDoc(const char *fileName,int startLine,
delete v; delete v;
} }
if (!isParam)
{
checkUndocumentedParams(); checkUndocumentedParams();
checkNoDocumentedParams(); detectNoDocumentedParams();
}
delete g_token; delete g_token;
...@@ -5106,7 +5114,6 @@ DocNode *validatingParseText(const char *input) ...@@ -5106,7 +5114,6 @@ DocNode *validatingParseText(const char *input)
{ {
//printf("------------ input ---------\n%s\n" //printf("------------ input ---------\n%s\n"
// "------------ end input -----\n",input); // "------------ end input -----\n",input);
g_token = new TokenInfo; g_token = new TokenInfo;
g_context = ""; g_context = "";
g_fileName = "<parseText>"; g_fileName = "<parseText>";
...@@ -5128,11 +5135,14 @@ DocNode *validatingParseText(const char *input) ...@@ -5128,11 +5135,14 @@ DocNode *validatingParseText(const char *input)
g_paramsFound.clear(); g_paramsFound.clear();
g_searchUrl=""; g_searchUrl="";
DocText *txt = new DocText;
if (input)
{
doctokenizerYYlineno=1; doctokenizerYYlineno=1;
doctokenizerYYinit(input,g_fileName); doctokenizerYYinit(input,g_fileName);
// build abstract syntax tree // build abstract syntax tree
DocText *txt = new DocText;
txt->parse(); txt->parse();
if (Debug::isFlagSet(Debug::PrintTree)) if (Debug::isFlagSet(Debug::PrintTree))
...@@ -5142,6 +5152,7 @@ DocNode *validatingParseText(const char *input) ...@@ -5142,6 +5152,7 @@ DocNode *validatingParseText(const char *input)
txt->accept(v); txt->accept(v);
delete v; delete v;
} }
}
delete g_token; delete g_token;
......
...@@ -53,7 +53,9 @@ void initDocParser(); ...@@ -53,7 +53,9 @@ void initDocParser();
* @param exampleName Base name of the example file (0 if isExample is FALSE). * @param exampleName Base name of the example file (0 if isExample is FALSE).
* @param singleLine Output should be presented on a single line, so without * @param singleLine Output should be presented on a single line, so without
* starting a new paragraph at the end. * starting a new paragraph at the end.
* @param isParam TRUE if the documentation is for a parameter. * @param linkFromIndex TRUE if the documentation is generated from an
* index page. In this case context is not used to determine
* the relative path when making a link.
* @returns Root node of the abstract syntax tree. Ownership of the * @returns Root node of the abstract syntax tree. Ownership of the
* pointer is handed over to the caller. * pointer is handed over to the caller.
*/ */
...@@ -61,7 +63,7 @@ DocNode *validatingParseDoc(const char *fileName,int startLine, ...@@ -61,7 +63,7 @@ DocNode *validatingParseDoc(const char *fileName,int startLine,
Definition *context, MemberDef *md, Definition *context, MemberDef *md,
const char *input,bool indexWords, const char *input,bool indexWords,
bool isExample,const char *exampleName=0, bool isExample,const char *exampleName=0,
bool singleLine=FALSE,bool isParam=FALSE); bool singleLine=FALSE,bool linkFromIndex=FALSE);
/*! Main entry point for parsing simple text fragments. These /*! Main entry point for parsing simple text fragments. These
* fragments are limited to words, whitespace and symbols. * fragments are limited to words, whitespace and symbols.
......
...@@ -299,7 +299,7 @@ SCOPEKEYS ":"({ID}":")* ...@@ -299,7 +299,7 @@ SCOPEKEYS ":"({ID}":")*
SCOPECPP {SCOPEPRE}*(~)?{ID}("<"{TEMPCHAR}*">")? SCOPECPP {SCOPEPRE}*(~)?{ID}("<"{TEMPCHAR}*">")?
SCOPEOBJC {SCOPEPRE}?{ID}{SCOPEKEYS}? SCOPEOBJC {SCOPEPRE}?{ID}{SCOPEKEYS}?
SCOPEMASK {SCOPECPP}|{SCOPEOBJC} SCOPEMASK {SCOPECPP}|{SCOPEOBJC}
FUNCARG "("{FUNCCHAR}*")" FUNCARG "("{FUNCCHAR}*")"({BLANK}*("volatile"|"const"))?
OPNEW {BLANK}+"new"({BLANK}*"[]")? OPNEW {BLANK}+"new"({BLANK}*"[]")?
OPDEL {BLANK}+"delete"({BLANK}*"[]")? OPDEL {BLANK}+"delete"({BLANK}*"[]")?
OPNORM {OPNEW}|{OPDEL}|"+"|"-"|"*"|"/"|"%"|"^"|"&"|"|"|"~"|"!"|"="|"<"|">"|"+="|"-="|"*="|"/="|"%="|"^="|"&="|"|="|"<<"|">>"|"<<="|">>="|"=="|"!="|"<="|">="|"&&"|"||"|"++"|"--"|","|"->*"|"->"|"[]"|"()" OPNORM {OPNEW}|{OPDEL}|"+"|"-"|"*"|"/"|"%"|"^"|"&"|"|"|"~"|"!"|"="|"<"|">"|"+="|"-="|"*="|"/="|"%="|"^="|"&="|"|="|"<<"|">>"|"<<="|">>="|"=="|"!="|"<="|">="|"&&"|"||"|"++"|"--"|","|"->*"|"->"|"[]"|"()"
......
...@@ -213,7 +213,7 @@ static void addRelatedPage(Entry *root) ...@@ -213,7 +213,7 @@ static void addRelatedPage(Entry *root)
{ {
if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict[g->groupname])) break; if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict[g->groupname])) break;
} }
//printf("addRelatedPage() %s gd=%p\n",root->name.data(),gd); //printf("---> addRelatedPage() %s gd=%p\n",root->name.data(),gd);
PageDef *pd = addRelatedPage(root->name,root->args,root->doc,root->anchors, PageDef *pd = addRelatedPage(root->name,root->args,root->doc,root->anchors,
root->fileName,root->startLine, root->fileName,root->startLine,
root->sli, root->sli,
...@@ -1724,7 +1724,7 @@ static MemberDef *addVariableToFile( ...@@ -1724,7 +1724,7 @@ static MemberDef *addVariableToFile(
*/ */
static int findFunctionPtr(const QCString &type,int *pLength=0) static int findFunctionPtr(const QCString &type,int *pLength=0)
{ {
static const QRegExp re("([^)]\\*"); static const QRegExp re("([^)]*\\*");
int i=-1,l; int i=-1,l;
if (!type.isEmpty() && // return type is non-empty if (!type.isEmpty() && // return type is non-empty
(i=re.match(type,0,&l))!=-1 && // contains a (* (i=re.match(type,0,&l))!=-1 && // contains a (*
...@@ -1905,7 +1905,7 @@ static void buildVarList(Entry *root) ...@@ -1905,7 +1905,7 @@ static void buildVarList(Entry *root)
{ {
root->type=root->type.left(root->type.length()-1); root->type=root->type.left(root->type.length()-1);
root->args.prepend(")"); root->args.prepend(")");
printf("root->type=%s root->args=%s\n",root->type.data(),root->args.data()); //printf("root->type=%s root->args=%s\n",root->type.data(),root->args.data());
} }
} }
} }
...@@ -6769,7 +6769,7 @@ static void generatePageDocs() ...@@ -6769,7 +6769,7 @@ static void generatePageDocs()
SectionInfo *si=0; SectionInfo *si=0;
if (!pd->title().isEmpty() && !pd->name().isEmpty() && if (!pd->title().isEmpty() && !pd->name().isEmpty() &&
(si=Doxygen::sectionDict.find(pd->name()))!=0) (si=Doxygen::sectionDict.find(pageName))!=0)
{ {
outputList->startSection(si->label,si->title,si->type); outputList->startSection(si->label,si->title,si->type);
outputList->docify(si->title); outputList->docify(si->title);
......
...@@ -123,7 +123,7 @@ void readConfiguration(int argc, char **argv); ...@@ -123,7 +123,7 @@ void readConfiguration(int argc, char **argv);
void parseInput(); void parseInput();
void generateOutput(); void generateOutput();
#undef USE_TMP_FILE //#undef USE_TMP_FILE
//#define USE_TMP_FILE #define USE_TMP_FILE
#endif #endif
...@@ -885,7 +885,8 @@ void writeFileIndex(OutputList &ol) ...@@ -885,7 +885,8 @@ void writeFileIndex(OutputList &ol)
FALSE, // index words FALSE, // index words
FALSE, // isExample FALSE, // isExample
0, // example name 0, // example name
TRUE // single line TRUE, // single line
TRUE // link from index
); );
//ol.docify(")"); //ol.docify(")");
} }
...@@ -1011,7 +1012,10 @@ void writeNamespaceIndex(OutputList &ol) ...@@ -1011,7 +1012,10 @@ void writeNamespaceIndex(OutputList &ol)
nd,0, nd,0,
abbreviate(nd->briefDescription(),nd->displayName()), abbreviate(nd->briefDescription(),nd->displayName()),
FALSE, // index words FALSE, // index words
FALSE // isExample FALSE, // isExample
0, // example name
TRUE, // single line
TRUE // link from index
); );
//ol.docify(")"); //ol.docify(")");
} }
...@@ -1131,7 +1135,10 @@ void writeAnnotatedClassList(OutputList &ol) ...@@ -1131,7 +1135,10 @@ void writeAnnotatedClassList(OutputList &ol)
cd,0, cd,0,
abbreviate(cd->briefDescription(),cd->displayName()), abbreviate(cd->briefDescription(),cd->displayName()),
FALSE, // indexWords FALSE, // indexWords
FALSE // isExample FALSE, // isExample
0, // example name
TRUE, // single line
TRUE // link from index
); );
} }
ol.endIndexValue(cd->getOutputFileBase(),hasBrief); ol.endIndexValue(cd->getOutputFileBase(),hasBrief);
......
...@@ -423,6 +423,8 @@ MemberDef::MemberDef(const char *df,int dl, ...@@ -423,6 +423,8 @@ MemberDef::MemberDef(const char *df,int dl,
m_inbodyLine = -1; m_inbodyLine = -1;
m_implOnly=FALSE; m_implOnly=FALSE;
groupMember = 0; groupMember = 0;
m_hasDocumentedParams = FALSE;
m_hasDocumentedReturnType = FALSE;
} }
/*! Destroys the member definition. */ /*! Destroys the member definition. */
...@@ -1584,13 +1586,10 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, ...@@ -1584,13 +1586,10 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
ol.startDescTableData(); ol.startDescTableData();
ol.parseDoc(docFile(),docLine(), ol.parseDoc(docFile(),docLine(),
getOuterScope()?getOuterScope():container, getOuterScope()?getOuterScope():container,
this, this, // memberDef
a->docs+"\n", // docStr a->docs+"\n", // docStr
TRUE, // indexWords TRUE, // indexWords
FALSE, // isExample FALSE // isExample
0, // exampleName
FALSE, // singleLine
TRUE // isParam
); );
ol.endDescTableData(); ol.endDescTableData();
} }
...@@ -1838,6 +1837,24 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, ...@@ -1838,6 +1837,24 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
//if (Config_getBool("EXTRACT_ALL") && !hasDocs) ol.enable(OutputGenerator::Latex); //if (Config_getBool("EXTRACT_ALL") && !hasDocs) ol.enable(OutputGenerator::Latex);
ol.popGeneratorState(); ol.popGeneratorState();
if (!Config_getBool("EXTRACT_ALL") &&
Config_getBool("WARN_IF_UNDOCUMENTED") &&
Config_getBool("WARN_NO_PARAMDOC"))
{
if (!hasDocumentedParams())
{
warn_doc_error(docFile(),docLine(),
"Warning: parameters of member %s are not (all) documented",
qualifiedName().data());
}
if (!hasDocumentedReturnType())
{
warn_doc_error(docFile(),docLine(),
"Warning: return type of member %s is not documented",
qualifiedName().data());
}
}
} }
void MemberDef::warnIfUndocumented() void MemberDef::warnIfUndocumented()
......
...@@ -73,9 +73,11 @@ class MemberDef : public Definition ...@@ -73,9 +73,11 @@ class MemberDef : public Definition
~MemberDef(); ~MemberDef();
DefType definitionType() { return TypeMember; } DefType definitionType() { return TypeMember; }
// link id
QCString getOutputFileBase() const; QCString getOutputFileBase() const;
QCString getReference() const; QCString getReference() const;
QCString anchor() const; QCString anchor() const;
const char *declaration() const { return decl; } const char *declaration() const { return decl; }
const char *definition() const { return def; } const char *definition() const { return def; }
const char *typeString() const { return type; } const char *typeString() const { return type; }
...@@ -110,7 +112,7 @@ class MemberDef : public Definition ...@@ -110,7 +112,7 @@ class MemberDef : public Definition
Specifier virtualness() const; Specifier virtualness() const;
MemberType memberType() const { return mtype; } MemberType memberType() const { return mtype; }
// convenience methods // getter methods
bool isSignal() const { return mtype==Signal; } bool isSignal() const { return mtype==Signal; }
bool isSlot() const { return mtype==Slot; } bool isSlot() const { return mtype==Slot; }
bool isVariable() const { return mtype==Variable; } bool isVariable() const { return mtype==Variable; }
...@@ -137,6 +139,8 @@ class MemberDef : public Definition ...@@ -137,6 +139,8 @@ class MemberDef : public Definition
bool isImplementation() const { return m_implOnly; } bool isImplementation() const { return m_implOnly; }
bool isExternal() const { return explExt; } bool isExternal() const { return explExt; }
bool isTemplateSpecialization() const { return tspec; } bool isTemplateSpecialization() const { return tspec; }
bool hasDocumentedParams() const { return m_hasDocumentedParams; }
bool hasDocumentedReturnType() const { return m_hasDocumentedReturnType; }
bool isObjCMethod() const; bool isObjCMethod() const;
bool isConstructor() const; bool isConstructor() const;
bool isDestructor() const; bool isDestructor() const;
...@@ -175,6 +179,8 @@ class MemberDef : public Definition ...@@ -175,6 +179,8 @@ class MemberDef : public Definition
void setTemplateSpecialization(bool b) { tspec=b; } void setTemplateSpecialization(bool b) { tspec=b; }
void makeRelated() { related=TRUE; } void makeRelated() { related=TRUE; }
void setHasDocumentedParams(bool b) { m_hasDocumentedParams = b; }
void setHasDocumentedReturnType(bool b) { m_hasDocumentedReturnType = b; }
// output generatation // output generatation
void writeLink(OutputList &ol, void writeLink(OutputList &ol,
...@@ -330,17 +336,16 @@ class MemberDef : public Definition ...@@ -330,17 +336,16 @@ class MemberDef : public Definition
MemberDef *groupAlias; // Member containing the definition MemberDef *groupAlias; // Member containing the definition
Specifier virt; // normal/virtual/pure virtual Specifier virt; // normal/virtual/pure virtual
Protection prot; // protection type [Public/Protected/Private] Protection prot; // protection type [Public/Protected/Private]
bool related; // is this a member that is only related to a class
bool stat; // is it a static function?
int memSpec; // The specifiers present for this member int memSpec; // The specifiers present for this member
MemberType mtype; // returns the kind of member MemberType mtype; // returns the kind of member
bool related; // is this a member that is only related to a class
bool stat; // is it a static function?
bool proto; // is it a prototype; bool proto; // is it a prototype;
bool docEnumValues; // is an enum with documented enum values. bool docEnumValues; // is an enum with documented enum values.
bool annScope; // member is part of an annoymous scope bool annScope; // member is part of an annoymous scope
bool annUsed; bool annUsed;
bool annShown; bool annShown;
bool m_hasCallGraph; bool m_hasCallGraph;
//int indDepth; // indentation depth for this member if inside an annonymous scope
int maxInitLines; // when the initializer will be displayed int maxInitLines; // when the initializer will be displayed
int userInitLines; // result of explicit \hideinitializer or \showinitializer int userInitLines; // result of explicit \hideinitializer or \showinitializer
MemberList *section; // declation list containing this member MemberList *section; // declation list containing this member
...@@ -389,6 +394,9 @@ class MemberDef : public Definition ...@@ -389,6 +394,9 @@ class MemberDef : public Definition
// objective-c // objective-c
bool m_implOnly; // function found in implementation but not bool m_implOnly; // function found in implementation but not
// in the interface // in the interface
bool m_hasDocumentedParams;
bool m_hasDocumentedReturnType;
}; };
#endif #endif
...@@ -133,7 +133,7 @@ void OutputList::parseDoc(const char *fileName,int startLine, ...@@ -133,7 +133,7 @@ void OutputList::parseDoc(const char *fileName,int startLine,
Definition *ctx,MemberDef * md, Definition *ctx,MemberDef * md,
const QCString &docStr,bool indexWords, const QCString &docStr,bool indexWords,
bool isExample,const char *exampleName, bool isExample,const char *exampleName,
bool singleLine,bool isParam) bool singleLine,bool linkFromIndex)
{ {
int count=0; int count=0;
if (docStr.isEmpty()) return; if (docStr.isEmpty()) return;
...@@ -151,13 +151,13 @@ void OutputList::parseDoc(const char *fileName,int startLine, ...@@ -151,13 +151,13 @@ void OutputList::parseDoc(const char *fileName,int startLine,
{ {
root = validatingParseDoc(fileName,startLine, root = validatingParseDoc(fileName,startLine,
ctx,md,docStr,indexWords,isExample,exampleName, ctx,md,docStr,indexWords,isExample,exampleName,
singleLine,isParam); singleLine,linkFromIndex);
} }
else else
{ {
root = validatingParseDoc(fileName,startLine, root = validatingParseDoc(fileName,startLine,
ctx,md,docStr+"\n",indexWords,isExample,exampleName, ctx,md,docStr+"\n",indexWords,isExample,exampleName,
singleLine,isParam); singleLine,linkFromIndex);
} }
og=outputs->first(); og=outputs->first();
......
...@@ -64,7 +64,7 @@ class OutputList : public OutputDocInterface ...@@ -64,7 +64,7 @@ class OutputList : public OutputDocInterface
void parseDoc(const char *fileName,int startLine, void parseDoc(const char *fileName,int startLine,
Definition *ctx,MemberDef *md,const QCString &docStr, Definition *ctx,MemberDef *md,const QCString &docStr,
bool indexWords,bool isExample,const char *exampleName=0, bool indexWords,bool isExample,const char *exampleName=0,
bool singleLine=FALSE,bool isParam=FALSE); bool singleLine=FALSE,bool linkFromIndex=FALSE);
void parseText(const QCString &textStr); void parseText(const QCString &textStr);
......
...@@ -125,6 +125,7 @@ static QCString aliasName; ...@@ -125,6 +125,7 @@ static QCString aliasName;
static QCString baseName; static QCString baseName;
static QCString* specName; static QCString* specName;
static QCString formulaText; static QCString formulaText;
static QCString formulaEnd;
static bool useOverrideCommands = FALSE; static bool useOverrideCommands = FALSE;
static bool insideIDL = FALSE; //!< processing IDL code? static bool insideIDL = FALSE; //!< processing IDL code?
static bool insideJava = FALSE; //!< processing Java code? static bool insideJava = FALSE; //!< processing Java code?
...@@ -160,7 +161,7 @@ static bool insideCode; ...@@ -160,7 +161,7 @@ static bool insideCode;
static bool needsSemi; static bool needsSemi;
static int depthIf; static int depthIf;
//static int initializerSharpCount; static int initBracketCount;
static QCString memberGroupRelates; static QCString memberGroupRelates;
static QCString memberGroupInside; static QCString memberGroupInside;
static QCString xrefItemKey; static QCString xrefItemKey;
...@@ -2059,7 +2060,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] ...@@ -2059,7 +2060,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
<FindMembers>"=" { <FindMembers>"=" {
current->bodyLine = yyLineNr; current->bodyLine = yyLineNr;
lastInitializerContext = YY_START; lastInitializerContext = YY_START;
//initializerSharpCount=0; initBracketCount=0;
BEGIN(ReadInitializer); BEGIN(ReadInitializer);
} }
/* Read initializer rules */ /* Read initializer rules */
...@@ -2079,18 +2080,20 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] ...@@ -2079,18 +2080,20 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
} }
<ReadInitializer>[;,] { <ReadInitializer>[;,] {
//printf(">> initializer `%s' <<\n",current->initializer.data()); //printf(">> initializer `%s' <<\n",current->initializer.data());
//if (initializerSharpCount==0)
//{
if (*yytext==';' || lastInitializerContext==FindFields) if (*yytext==';' || lastInitializerContext==FindFields)
{ {
unput(*yytext); unput(*yytext);
BEGIN(lastInitializerContext); BEGIN(lastInitializerContext);
} }
//} else if (*yytext==',' && initBracketCount==0) // for "int a=0,b=0"
//else {
//{ unput(*yytext);
// current->initializer+=*yytext; BEGIN(lastInitializerContext);
//} }
else
{
current->initializer+=*yytext;
}
} }
<ReadInitializer>\" { <ReadInitializer>\" {
if (insideIDL && insideCppQuote) if (insideIDL && insideCppQuote)
...@@ -2105,7 +2108,6 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] ...@@ -2105,7 +2108,6 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
BEGIN(CopyString); BEGIN(CopyString);
} }
} }
/*
<ReadInitializer>"->" { <ReadInitializer>"->" {
current->initializer+=yytext; current->initializer+=yytext;
} }
...@@ -2115,15 +2117,14 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] ...@@ -2115,15 +2117,14 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
<ReadInitializer>">>" { <ReadInitializer>">>" {
current->initializer+=yytext; current->initializer+=yytext;
} }
<ReadInitializer>\< { <ReadInitializer>[<\[{(] {
initializerSharpCount++; initBracketCount++;
current->initializer+=*yytext; current->initializer+=*yytext;
} }
<ReadInitializer>\> { <ReadInitializer>[>\]})] {
initializerSharpCount--; initBracketCount--;
current->initializer+=*yytext; current->initializer+=*yytext;
} }
*/
<ReadInitializer>{CHARLIT} { <ReadInitializer>{CHARLIT} {
if (insidePHP) if (insidePHP)
{ {
...@@ -2373,7 +2374,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] ...@@ -2373,7 +2374,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
} }
<FindFields>"=" { <FindFields>"=" {
lastInitializerContext = YY_START; lastInitializerContext = YY_START;
//initializerSharpCount=0; initBracketCount=0;
BEGIN(ReadInitializer); BEGIN(ReadInitializer);
} }
<FindFields>"," { <FindFields>"," {
...@@ -2670,7 +2671,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] ...@@ -2670,7 +2671,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
} }
<MemberSpec>"=" { <MemberSpec>"=" {
lastInitializerContext=YY_START; lastInitializerContext=YY_START;
//initializerSharpCount=0; initBracketCount=0;
BEGIN(ReadInitializer); BEGIN(ReadInitializer);
/* BEGIN(MemberSpecSkip); */ /* BEGIN(MemberSpecSkip); */
} }
...@@ -3137,6 +3138,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] ...@@ -3137,6 +3138,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
//current->args += *yytext; //current->args += *yytext;
//BEGIN(FuncPtrInit); //BEGIN(FuncPtrInit);
lastInitializerContext=YY_START; lastInitializerContext=YY_START;
initBracketCount=0;
BEGIN(ReadInitializer); BEGIN(ReadInitializer);
} }
<FuncPtrInit>[{;] { <FuncPtrInit>[{;] {
...@@ -5002,6 +5004,14 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] ...@@ -5002,6 +5004,14 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
insideFormula=TRUE; insideFormula=TRUE;
BEGIN(ReadFormulaLong); BEGIN(ReadFormulaLong);
} }
<Doc,JavaDoc,LineDoc,ClassDocBrief,PageDoc,ClassDoc,AfterDoc,AfterDocLine,AfterDocBrief,CopyArgComment,CopyArgCommentLine>{CMD}"f{"[^}\n]+"}" {
lastFormulaContext = YY_START;
formulaText="\\begin";
formulaEnd=&yytext[2];
formulaText+=formulaEnd;
insideFormula=TRUE;
BEGIN(ReadFormulaLong);
}
<ReadFormulaShort>{CMD}"f$" { <ReadFormulaShort>{CMD}"f$" {
formulaText+="$"; formulaText+="$";
if (lastFormulaContext==ClassDocBrief || if (lastFormulaContext==ClassDocBrief ||
...@@ -5037,8 +5047,16 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] ...@@ -5037,8 +5047,16 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
BEGIN(lastFormulaContext); BEGIN(lastFormulaContext);
} }
} }
<ReadFormulaLong>{CMD}"f]" { <ReadFormulaLong>{CMD}"f"[\}\]] {
if (yytext[2]==']')
{
formulaText+="\\]"; formulaText+="\\]";
}
else
{
formulaText+="\\end";
formulaText+=formulaEnd;
}
if (lastFormulaContext==ClassDocBrief || if (lastFormulaContext==ClassDocBrief ||
lastFormulaContext==LineDoc || lastFormulaContext==LineDoc ||
lastFormulaContext==JavaDoc || lastFormulaContext==JavaDoc ||
......
...@@ -452,6 +452,11 @@ QCString resolveTypeDef(Definition *context,const QCString &qualifiedName, ...@@ -452,6 +452,11 @@ QCString resolveTypeDef(Definition *context,const QCString &qualifiedName,
if (scopeIndex!=-1) // strip scope part for the name if (scopeIndex!=-1) // strip scope part for the name
{ {
resName=qualifiedName.right(qualifiedName.length()-scopeIndex-2); resName=qualifiedName.right(qualifiedName.length()-scopeIndex-2);
if (resName.isEmpty())
{
// qualifiedName was of form A:: !
return result;
}
} }
MemberDef *md=0; MemberDef *md=0;
while (mContext && md==0) while (mContext && md==0)
...@@ -2602,7 +2607,7 @@ static QCString extractCanonicalType(Definition *d,FileDef *fs,const Argument *a ...@@ -2602,7 +2607,7 @@ static QCString extractCanonicalType(Definition *d,FileDef *fs,const Argument *a
{ {
QCString type = arg->type; QCString type = arg->type;
QCString name = arg->name; QCString name = arg->name;
printf("extractCanonicalType(type=%s,name=%s)\n",type.data(),name.data()); //printf("extractCanonicalType(type=%s,name=%s)\n",type.data(),name.data());
if ((type=="const" || type=="volatile") && !name.isEmpty()) if ((type=="const" || type=="volatile") && !name.isEmpty())
{ // name is part of type => correct { // name is part of type => correct
type+=" "; type+=" ";
...@@ -2634,7 +2639,7 @@ static QCString extractCanonicalType(Definition *d,FileDef *fs,const Argument *a ...@@ -2634,7 +2639,7 @@ static QCString extractCanonicalType(Definition *d,FileDef *fs,const Argument *a
canType += type.mid(p,i-p); canType += type.mid(p,i-p);
QCString word = type.mid(i,l); QCString word = type.mid(i,l);
ClassDef *cd = getResolvedClass(d,fs,word); ClassDef *cd = getResolvedClass(d,fs,word);
printf("word %s => %s\n",word.data(),cd?cd->qualifiedName().data():"<none>"); //printf("word %s => %s\n",word.data(),cd?cd->qualifiedName().data():"<none>");
if (cd) if (cd)
{ {
canType+=cd->qualifiedName(); canType+=cd->qualifiedName();
...@@ -2654,7 +2659,7 @@ static QCString extractCanonicalType(Definition *d,FileDef *fs,const Argument *a ...@@ -2654,7 +2659,7 @@ static QCString extractCanonicalType(Definition *d,FileDef *fs,const Argument *a
p=i+l; p=i+l;
} }
canType += type.right(type.length()-p); canType += type.right(type.length()-p);
printf("result = %s\n",canType.data()); //printf("result = %s\n",canType.data());
return removeRedundantWhiteSpace(canType); return removeRedundantWhiteSpace(canType);
} }
...@@ -2961,7 +2966,8 @@ bool getDefs(const QCString &scName,const QCString &memberName, ...@@ -2961,7 +2966,8 @@ bool getDefs(const QCString &scName,const QCString &memberName,
QCString mScope; QCString mScope;
if (memberName.left(9)!="operator " && // treat operator conversion methods if (memberName.left(9)!="operator " && // treat operator conversion methods
// as a special case // as a special case
(im=memberName.findRev("::"))!=-1 (im=memberName.findRev("::"))!=-1 &&
im<(int)memberName.length()-2 // not A::
) )
{ {
mScope=memberName.left(im); mScope=memberName.left(im);
...@@ -2973,6 +2979,7 @@ bool getDefs(const QCString &scName,const QCString &memberName, ...@@ -2973,6 +2979,7 @@ bool getDefs(const QCString &scName,const QCString &memberName,
//printf("mScope=`%s' mName=`%s'\n",mScope.data(),mName.data()); //printf("mScope=`%s' mName=`%s'\n",mScope.data(),mName.data());
if (mName.isEmpty()) printf("memberName=%s\n",memberName.data());
MemberName *mn = Doxygen::memberNameSDict[mName]; MemberName *mn = Doxygen::memberNameSDict[mName];
if (!forceEmptyScope && mn && !(scopeName.isEmpty() && mScope.isEmpty())) if (!forceEmptyScope && mn && !(scopeName.isEmpty() && mScope.isEmpty()))
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment