summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authordimitri <dimitri@afe2bf4a-e733-0410-8a33-86f594647bc7>2005-07-21 08:42:44 (GMT)
committerdimitri <dimitri@afe2bf4a-e733-0410-8a33-86f594647bc7>2005-07-21 08:42:44 (GMT)
commite2bafacf8c0f6ef0dd7f9f4958a125761bda31ec (patch)
tree0d39615cce00be60a77b797babf9b09b9c6b2a09 /src
parent97589008c3ba05a8cc3ffe2dc47f118908c741b6 (diff)
downloadDoxygen-e2bafacf8c0f6ef0dd7f9f4958a125761bda31ec.zip
Doxygen-e2bafacf8c0f6ef0dd7f9f4958a125761bda31ec.tar.gz
Doxygen-e2bafacf8c0f6ef0dd7f9f4958a125761bda31ec.tar.bz2
Release-1.4.4
Diffstat (limited to 'src')
-rw-r--r--src/.cvsignore3
-rw-r--r--src/classdef.cpp1
-rw-r--r--src/cmdmapper.cpp1
-rw-r--r--src/cmdmapper.h9
-rw-r--r--src/commentcnv.l19
-rw-r--r--src/commentscan.h55
-rw-r--r--src/commentscan.l89
-rw-r--r--src/constexp.l8
-rw-r--r--src/defargs.l4
-rw-r--r--src/docparser.cpp33
-rw-r--r--src/docparser.h2
-rw-r--r--src/doctokenizer.l4
-rw-r--r--src/doxygen.cpp39
-rw-r--r--src/htmlgen.cpp6
-rw-r--r--src/pre.l6
-rw-r--r--src/rtfdocvisitor.cpp4
-rw-r--r--src/scanner.l8
-rw-r--r--src/translator_fr.h18
-rw-r--r--src/util.cpp65
19 files changed, 269 insertions, 105 deletions
diff --git a/src/.cvsignore b/src/.cvsignore
index 1f84cb5..66f3839 100644
--- a/src/.cvsignore
+++ b/src/.cvsignore
@@ -20,3 +20,6 @@ doxytag.cpp
pre.cpp
scanner.cpp
version.cpp
+commentscan.cpp
+pycode.cpp
+pyscanner.cpp
diff --git a/src/classdef.cpp b/src/classdef.cpp
index 6a80aca..acf2233 100644
--- a/src/classdef.cpp
+++ b/src/classdef.cpp
@@ -2389,6 +2389,7 @@ void ClassDef::mergeCategory(ClassDef *category)
void ClassDef::addUsedClass(ClassDef *cd,const char *accessName)
{
+ //printf("%s::addUsedClass(%s,%s)\n",name().data(),cd->name().data(),accessName);
if (m_usesImplClassDict==0)
{
m_usesImplClassDict = new UsesClassDict(17);
diff --git a/src/cmdmapper.cpp b/src/cmdmapper.cpp
index dddfcfd..b0b57d5 100644
--- a/src/cmdmapper.cpp
+++ b/src/cmdmapper.cpp
@@ -106,6 +106,7 @@ CommandMap cmdMap[] =
{ "manonly", CMD_MANONLY },
{ "endmanonly", CMD_ENDMANONLY },
{ "includelineno", CMD_INCWITHLINES },
+ { "inheritdoc", CMD_INHERITDOC },
{ 0, 0 }
};
diff --git a/src/cmdmapper.h b/src/cmdmapper.h
index 1c65e24..f7758fd 100644
--- a/src/cmdmapper.h
+++ b/src/cmdmapper.h
@@ -36,9 +36,9 @@ enum CommandType
CMD_AMP = 2,
CMD_ANCHOR = 3,
CMD_AT = 4,
- CMD_ATTENTION = 5 | SIMPLESECT_BIT,
- CMD_AUTHOR = 6 | SIMPLESECT_BIT,
- CMD_AUTHORS = 7 | SIMPLESECT_BIT,
+ CMD_ATTENTION = 5 | SIMPLESECT_BIT,
+ CMD_AUTHOR = 6 | SIMPLESECT_BIT,
+ CMD_AUTHORS = 7 | SIMPLESECT_BIT,
CMD_BOLD = 8,
CMD_BSLASH = 9,
CMD_CODE = 10,
@@ -106,7 +106,8 @@ enum CommandType
CMD_ENDDOT = 72,
CMD_MANONLY = 73,
CMD_ENDMANONLY = 74,
- CMD_INCWITHLINES = 75
+ CMD_INCWITHLINES = 75,
+ CMD_INHERITDOC = 76
};
enum HtmlTagType
diff --git a/src/commentcnv.l b/src/commentcnv.l
index 9e7f8a4..fa72e3f 100644
--- a/src/commentcnv.l
+++ b/src/commentcnv.l
@@ -320,18 +320,29 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'"))
copyToOutput(yytext,yyleng);
BEGIN(CComment);
}
-<CComment>[\\@]("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"rtfonly"|"manonly"|"dot"|"code")/[ \r\t\n] { /* start of a verbatim block */
+<CComment>[\\@]("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"rtfonly"|"manonly"|"dot"|"code"|"f$"|"f[")/[ \r\t\n] { /* start of a verbatim block */
copyToOutput(yytext,yyleng);
- g_blockName=&yytext[1];
+ if (yytext[2]=='[')
+ {
+ g_blockName="f]";
+ }
+ else
+ {
+ g_blockName=&yytext[1];
+ }
g_lastCommentContext = YY_START;
BEGIN(Verbatim);
}
<Scan>. { /* any other character */
copyToOutput(yytext,yyleng);
}
-<Verbatim>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"endrtfonly"|"endmanonly"|"enddot"|"endcode") { /* end of verbatim block */
+<Verbatim>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"endrtfonly"|"endmanonly"|"enddot"|"endcode"|"f$"|"f]") { /* end of verbatim block */
copyToOutput(yytext,yyleng);
- if (&yytext[4]==g_blockName)
+ if (yytext[1]=='f') // end of formula
+ {
+ BEGIN(g_lastCommentContext);
+ }
+ else if (&yytext[4]==g_blockName)
{
BEGIN(g_lastCommentContext);
}
diff --git a/src/commentscan.h b/src/commentscan.h
index 363dda2..74efa63 100644
--- a/src/commentscan.h
+++ b/src/commentscan.h
@@ -21,16 +21,51 @@
class ParserInterface;
-int parseCommentBlock(/* in */ ParserInterface *parser,
- /* in */ Entry *curEntry,
- /* in */ const QCString &comment,
- /* in */ const QCString &fileName,
- /* in */ int lineNr,
- /* in */ bool isBrief,
- /* in */ bool isJavaDocStyle,
- /* in,out */ Protection &prot,
- /* in,out */ int &position,
- /* out */ bool &newEntryNeeded
+/** @file
+ * @brief Interface for the comment block parser */
+
+/** Invokes the comment block parser with the request to parse a
+ * single comment block.
+ * @param[in] parser The language parse that invoked this function.
+ * The comment block parse may invoke
+ * ParserInterface::parsePrototype() in order to parse
+ * the argument of a @@fn command.
+ * @param[in] curEntry The Entry to which the comment block belongs.
+ * Any information (like documentation) that is found in
+ * the comment block will be stored in this entry.
+ * @param[in] comment A string representing the actual comment block.
+ * Note that leading *'s are already stripped from the comment block.
+ * @param[in] fileName The name of the file in which the comment is found.
+ * Mainly used for producing warnings.
+ * @param[in] lineNr The line number at which the comment block was found.
+ * @param[in] isBrief TRUE iff this comment block represents a brief description.
+ * @param[in] isJavaDocStyle TRUE iff this comment block is in "JavaDoc" style.
+ * This means that it starts as a brief description until the end of
+ * the sentences is found and then proceeds as a detailed description.
+ * @param[in,out] prot The protection level in which this comment block was
+ * found. Commands in the comment block may override this.
+ * @param[in,out] position The character position within \a comment where the
+ * comment block starts. Typically used in case the comment block
+ * contains multiple structural commands.
+ * @param[out] newEntryNeeded Boolean that is TRUE if the comment block parser
+ * finds that a the comment block finishes the entry and a new one
+ * needs to be started.
+ * @returns TRUE if the comment requires further processing. The
+ * parameter \a newEntryNeeded will typically be true in this case and
+ * \a position will indicate the offset inside the \a comment string
+ * where to proceed parsing. FALSE indicates no further processing is
+ * needed.
+ */
+bool parseCommentBlock(ParserInterface *parser,
+ Entry *curEntry,
+ const QCString &comment,
+ const QCString &fileName,
+ int lineNr,
+ bool isBrief,
+ bool isJavaDocStyle,
+ Protection &prot,
+ int &position,
+ bool &newEntryNeeded
);
void groupEnterFile(const char *file,int line);
diff --git a/src/commentscan.l b/src/commentscan.l
index a44caa7..10222d2 100644
--- a/src/commentscan.l
+++ b/src/commentscan.l
@@ -332,6 +332,8 @@ static int braceCount;
static bool insidePre;
static bool parseMore;
+static int g_commentCount;
+
//-----------------------------------------------------------------------------
static QStack<Grouping> g_autoGroupStack;
@@ -909,8 +911,9 @@ MAILADR [a-z_A-Z0-9.+\-]+"@"[a-z_A-Z0-9\-]+("."[a-z_A-Z0-9\-]+)+[a-z_A-Z0-9\-]
addOutput(yytext);
setOutput(OutputDoc);
}
- else
- {
+ else if (!current->brief.stripWhiteSpace().isEmpty())
+ { // only go to the detailed description if we have
+ // found some brief description and not just whitespace
setOutput(OutputDoc);
addOutput(yytext);
}
@@ -1422,13 +1425,24 @@ MAILADR [a-z_A-Z0-9.+\-]+"@"[a-z_A-Z0-9\-]+("."[a-z_A-Z0-9\-]+)+[a-z_A-Z0-9\-]
BEGIN(Comment);
}
}
-<FormatBlock>[^ \@\\\n]* { // some word
+<FormatBlock>[^ \@\*\/\\\n]* { // some word
addOutput(yytext);
}
<FormatBlock>{DOCNL} { // new line
if (*yytext=='\n') yyLineNr++;
addOutput('\n');
}
+<FormatBlock>"/*" { // start of a C-comment
+ g_commentCount++;
+ }
+<FormatBlock>"*/" { // end of a C-comment
+ g_commentCount--;
+ if (g_commentCount<0 && blockName!="verbatim")
+ {
+ warn(yyFileName,yyLineNr,
+ "Warning: found */ without matching /* while inside a \\%s block! Perhaps a missing \\end%s?\n",blockName.data(),blockName.data());
+ }
+ }
<FormatBlock>. {
addOutput(*yytext);
}
@@ -1883,6 +1897,7 @@ static bool handleName(const QCString &)
bool stop=makeStructuralIndicator(Entry::MEMBERGRP_SEC);
g_memberGroupHeader.resize(0);
BEGIN( NameParam );
+ closeGroup(current,yyFileName,yyLineNr);
return stop;
}
@@ -1979,6 +1994,7 @@ static bool handleFormatBlock(const QCString &s)
addOutput("@"+s+" ");
//printf("handleFormatBlock(%s)\n",s.data());
blockName=s;
+ g_commentCount=0;
BEGIN(FormatBlock);
return FALSE;
}
@@ -2218,6 +2234,12 @@ bool parseCommentBlock(/* in */ ParserInterface *parser,
current->doc="\n\n";
}
+ if (current->section==Entry::MEMBERGRP_SEC &&
+ g_memberGroupId==DOX_NOGROUP) // @name section but no group started yet
+ {
+ openGroup(current,yyFileName,yyLineNr);
+ }
+
Debug::print(Debug::CommentScan,0,"CommentScanner\n%s:%d\n"
"input=[%s]\nbrief=[%s]\ndocs=[%s]\n------------\n",
fileName.data(),lineNr,comment.data(),
@@ -2249,10 +2271,13 @@ void groupEnterFile(const char *,int)
void groupLeaveFile(const char *fileName,int line)
{
- if (g_memberGroupId!=DOX_NOGROUP)
- {
- warn(fileName,line,"Warning: end of file while inside a member group\n");
- }
+ //if (g_memberGroupId!=DOX_NOGROUP)
+ //{
+ // warn(fileName,line,"Warning: end of file while inside a member group\n");
+ //}
+ g_memberGroupId=DOX_NOGROUP;
+ g_memberGroupRelates.resize(0);
+ g_memberGroupDocs.resize(0);
if (!g_autoGroupStack.isEmpty())
{
warn(fileName,line,"Warning: end of file while inside a group\n");
@@ -2270,12 +2295,12 @@ void groupEnterCompound(const char *fileName,int line,const char *name)
g_memberGroupDocs.resize(0);
}
-void groupLeaveCompound(const char *fileName,int line,const char *name)
+void groupLeaveCompound(const char *,int,const char *)
{
- if (g_memberGroupId!=DOX_NOGROUP)
- {
- warn(fileName,line,"Warning: end of compound %s while inside a member group\n",name);
- }
+ //if (g_memberGroupId!=DOX_NOGROUP)
+ //{
+ // warn(fileName,line,"Warning: end of compound %s while inside a member group\n",name);
+ //}
g_memberGroupId=DOX_NOGROUP;
g_memberGroupRelates.resize(0);
g_memberGroupDocs.resize(0);
@@ -2284,7 +2309,8 @@ void groupLeaveCompound(const char *fileName,int line,const char *name)
void closeGroup(Entry *e,const char *fileName,int)
{
- //printf("%s:%d: closeGroup()\n",fileName,line);
+ //printf("==> closeGroup(name=%s,sec=%x) g_autoGroupStack=%d\n",
+ // e->name.data(),e->section,g_autoGroupStack.count());
if (g_memberGroupId!=DOX_NOGROUP) // end of member group
{
MemberGroupInfo *info=Doxygen::memGrpInfoDict.find(g_memberGroupId);
@@ -2301,34 +2327,39 @@ void closeGroup(Entry *e,const char *fileName,int)
}
else if (!g_autoGroupStack.isEmpty()) // end of auto group
{
- delete g_autoGroupStack.pop();
+ Grouping *grp = g_autoGroupStack.pop();
+ e->groups->removeLast();
+ delete grp;
}
}
-void openGroup(Entry *e,const char *fileName,int line)
+void openGroup(Entry *e,const char *,int)
{
- //printf("%s:%d: openGroup(sec=%x)\n",fileName,line,e->section);
+ //printf("==> openGroup(name=%s,sec=%x)\n",e->name.data(),e->section);
if (e->section==Entry::GROUPDOC_SEC) // auto group
{
g_autoGroupStack.push(new Grouping(e->name,e->groupingPri()));
}
else // start of a member group
{
- if (g_memberGroupId!=DOX_NOGROUP)
+ if (g_memberGroupId==DOX_NOGROUP) // no group started yet
{
- warn(fileName,line,"Warning: member groups cannot be nested. Ending current group!\n");
- closeGroup(e,fileName,line);
- }
- static int curGroupId=0;
- g_memberGroupId = curGroupId++;
- //printf("new group id=%d header=%s\n",g_memberGroupId,g_memberGroupHeader.data());
+ static int curGroupId=0;
+ g_memberGroupId = curGroupId++;
+ //printf("new group id=%d header=%s\n",g_memberGroupId,g_memberGroupHeader.data());
- MemberGroupInfo *info = new MemberGroupInfo;
- info->header = g_memberGroupHeader.stripWhiteSpace();
- Doxygen::memGrpInfoDict.insert(g_memberGroupId,info);
+ MemberGroupInfo *info = new MemberGroupInfo;
+ info->header = g_memberGroupHeader.stripWhiteSpace();
+ Doxygen::memGrpInfoDict.insert(g_memberGroupId,info);
- g_memberGroupRelates = e->relates;
- e->mGrpId = g_memberGroupId;
+ g_memberGroupRelates = e->relates;
+ e->mGrpId = g_memberGroupId;
+ }
+ //else
+ //{
+ // warn(fileName,line,"Warning: member groups cannot be nested. Ending current group!\n");
+ // closeGroup(e,fileName,line);
+ //}
}
}
@@ -2338,7 +2369,7 @@ void initGroupInfo(Entry *e)
e->relates = g_memberGroupRelates;
if (!g_autoGroupStack.isEmpty())
{
- //printf("Appending group %s\n",autoGroupStack.top()->groupname.data());
+ //printf("Appending group %s to %s\n",g_autoGroupStack.top()->groupname.data(),e->name.data());
e->groups->append(new Grouping(*g_autoGroupStack.top()));
}
}
diff --git a/src/constexp.l b/src/constexp.l
index ed2d945..1b97648 100644
--- a/src/constexp.l
+++ b/src/constexp.l
@@ -48,6 +48,8 @@ static int yyread(char *buf,int max_size)
%}
+CONSTSUFFIX ([uU][lL]?[lL]?)|(lL][lL]?[uU]?)
+
%option nounput
%%
@@ -80,13 +82,13 @@ static int yyread(char *buf,int max_size)
g_strToken=yytext;
return TOK_CHARACTER;
}
-0[0-7]*[uUlL]* { g_strToken=yytext;
+0[0-7]*{CONSTSUFFIX}? { g_strToken=yytext;
return TOK_OCTALINT;
}
-[1-9][0-9]*[uUlL]* { g_strToken=yytext;
+[1-9][0-9]*{CONSTSUFFIX}? { g_strToken=yytext;
return TOK_DECIMALINT;
}
-(0x|0X)[0-9a-fA-F]+[uUlL]* { g_strToken=yytext+2;
+(0x|0X)[0-9a-fA-F]+{CONSTSUFFIX}? { g_strToken=yytext+2;
return TOK_HEXADECIMALINT;
}
(([0-9]+\.[0-9]*)|([0-9]*\.[0-9]+))([eE]([\-\+])?[0-9]+)?([fFlL])? {
diff --git a/src/defargs.l b/src/defargs.l
index 00c862f..462efda 100644
--- a/src/defargs.l
+++ b/src/defargs.l
@@ -336,6 +336,10 @@ ID [a-z_A-Z][a-z_A-Z0-9]*
<ReadFuncArgType,ReadFuncArgPtr>. {
g_curArgTypeName+=*yytext;
}
+
+<ReadFuncArgDef,CopyArgString>"->"|">="|">>" {
+ g_curArgDefValue+=yytext;
+ }
<ReadFuncArgDef,CopyArgString>. {
g_curArgDefValue+=*yytext;
}
diff --git a/src/docparser.cpp b/src/docparser.cpp
index c5cabcd..1399788 100644
--- a/src/docparser.cpp
+++ b/src/docparser.cpp
@@ -1623,7 +1623,7 @@ void DocCopy::parse()
g_nodeStack.clear();
g_copyStack.append(def);
internalValidatingParseDoc(this,m_children,doc);
- ASSERT(g_copyStack.remove(def));
+ g_copyStack.remove(def);
ASSERT(g_styleStack.isEmpty());
ASSERT(g_nodeStack.isEmpty());
docParserPopContext();
@@ -4043,6 +4043,31 @@ int DocPara::handleStartCode()
return retval;
}
+void DocPara::handleInheritDoc()
+{
+ if (g_memberDef) // inheriting docs from a member
+ {
+ MemberDef *reMd = g_memberDef->reimplements();
+ if (reMd) // member from which was inherited.
+ {
+ MemberDef *thisMd = g_memberDef;
+ //printf("{InheritDocs:%s=>%s}\n",g_memberDef->qualifiedName().data(),reMd->qualifiedName().data());
+ docParserPushContext();
+ g_context=reMd->getOuterScope()->name();
+ g_memberDef=reMd;
+ g_styleStack.clear();
+ g_nodeStack.clear();
+ g_copyStack.append(reMd);
+ internalValidatingParseDoc(this,m_children,reMd->briefDescription());
+ internalValidatingParseDoc(this,m_children,reMd->documentation());
+ g_copyStack.remove(reMd);
+ docParserPopContext();
+ g_memberDef = thisMd;
+ }
+ }
+}
+
+
int DocPara::handleCommand(const QString &cmdName)
{
DBG(("handleCommand(%s)\n",cmdName.data()));
@@ -4392,6 +4417,9 @@ int DocPara::handleCommand(const QString &cmdName)
case CMD_INTERNALREF:
warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected command %s",g_token->name.data());
break;
+ case CMD_INHERITDOC:
+ handleInheritDoc();
+ break;
default:
// we should not get here!
ASSERT(0);
@@ -5576,7 +5604,8 @@ DocNode *validatingParseDoc(const char *fileName,int startLine,
g_fileName = fileName;
g_relPath = (!linkFromIndex && ctx) ?
- relativePathToRoot(ctx->getOutputFileBase()) : QString("");
+ QString(relativePathToRoot(ctx->getOutputFileBase())) :
+ QString("");
//printf("ctx->name=%s relPath=%s\n",ctx->name().data(),g_relPath.data());
g_memberDef = md;
g_nodeStack.clear();
diff --git a/src/docparser.h b/src/docparser.h
index 1a58614..e7fefa2 100644
--- a/src/docparser.h
+++ b/src/docparser.h
@@ -977,10 +977,10 @@ class DocPara : public CompAccept<DocPara>, public DocNode
void handleLink(const QString &cmdName,bool isJavaLink);
void handleRef(const QString &cmdName);
void handleSection(const QString &cmdName);
+ void handleInheritDoc();
int handleStartCode();
int handleHtmlHeader(const HtmlAttribList &tagHtmlAttribs,int level);
bool injectToken(int tok,const QString &tokText);
- //int handleLanguageSwitch();
private:
DocNode *m_parent;
diff --git a/src/doctokenizer.l b/src/doctokenizer.l
index 6cc93d1..34f82a2 100644
--- a/src/doctokenizer.l
+++ b/src/doctokenizer.l
@@ -408,6 +408,10 @@ REFWORD ("#"|"::")?({ID}("."|"#"|"::"|"-"))*({ID}(":")?){FUNCARG}?
g_token->name = "javalink";
return TK_COMMAND;
}
+<St_Para>"{"{BLANK}*"@inheritDoc"{BLANK}*"}" {
+ g_token->name = "inheritdoc";
+ return TK_COMMAND;
+ }
<St_Para>{SPCMD3} {
g_token->name = "form";
bool ok;
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index 8a78ea9..1035776 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -1173,9 +1173,6 @@ static void findUsingDirectives(Entry *root)
gd->addNamespace(nd);
}
- bool ambig;
- // file definition containing the namespace nd
- FileDef *fd=findFileDef(Doxygen::inputNameDict,root->fileName,ambig);
// insert the namespace in the file definition
if (fd)
{
@@ -1492,7 +1489,7 @@ static MemberDef *addVariableToClass(
prot,Normal,root->stat,related,
mtype,0,0);
md->setTagInfo(root->tagInfo);
- md->setMemberClass(cd);
+ md->setMemberClass(cd); // also sets outer scope (i.e. getOuterScope())
//md->setDefFile(root->fileName);
//md->setDefLine(root->startLine);
md->setDocumentation(root->doc,root->docFile,root->docLine);
@@ -1670,7 +1667,7 @@ static MemberDef *addVariableToFile(
md->setDefinition(def);
md->enableCallGraph(root->callGraph);
md->setExplicitExternal(root->explicitExternal);
- md->setOuterScope(fd);
+ //md->setOuterScope(fd);
if (!root->explicitExternal)
{
md->setBodySegment(root->bodyLine,root->endBodyLine);
@@ -3184,21 +3181,17 @@ static void findUsedClassesForClass(Entry *root,
type = substituteTemplateArgumentsInString(type,formalArgs,actualArgs);
}
- QCString typeName = resolveTypeDef(masterCd,usedClassName);
- //printf("*** Found resolved class %s for %s\n",typeName.data(),usedClassName.data());
-
- if (!typeName.isEmpty()) // if we could resolve the typedef, use
- // the result as the class name.
- {
- usedClassName=typeName;
- }
-
//printf(" template substitution gives=%s\n",type.data());
while (!found && extractClassNameFromType(type,pos,usedClassName,templSpec)!=-1)
{
- //printf(" found used class %s\n",usedClassName.data());
- // the name could be a type definition, resolve it
- //QCString typeName = resolveTypeDef(masterCd,usedClassName);
+ // find the type (if any) that matches usedClassName
+ ClassDef *typeCd = getResolvedClass(masterCd,masterCd->getFileDef(),usedClassName);
+ //printf("====> usedClassName=%s -> typeCd=%s\n",
+ // usedClassName.data(),typeCd?typeCd->name().data():"<none>");
+ if (typeCd)
+ {
+ usedClassName = typeCd->name();
+ }
int sp=usedClassName.find('<');
if (sp==-1) sp=0;
@@ -4033,14 +4026,14 @@ static void addMemberDocs(Entry *root,
if (al)
{
//printf("merging arguments (1) docs=%d\n",root->doc.isEmpty());
- if (!root->doc.isEmpty())
+ if ((!root->doc.isEmpty() || !root->proto))
{
mergeArguments(md->argumentList(),al,TRUE);
}
}
else
{
- if ( !root->doc.isEmpty() &&
+ if ( (!root->doc.isEmpty() || !root->proto) &&
matchArguments2( md->getOuterScope(), md->getFileDef(), md->argumentList(),
rscope,rfd,root->argList,
TRUE
@@ -4704,9 +4697,10 @@ static void findMember(Entry *root,
ClassDef *cd=md->getClassDef();
Debug::print(Debug::FindMembers,0,
"3. member definition found, "
- "scope needed=`%s' scope=`%s' args=`%s'\n",
+ "scope needed=`%s' scope=`%s' args=`%s' fileName=%s\n",
scopeName.data(),cd ? cd->name().data() : "<none>",
- md->argsString());
+ md->argsString(),
+ root->fileName.data());
//printf("Member %s (member scopeName=%s) (this scopeName=%s) classTempList=%s\n",md->name().data(),cd->name().data(),scopeName.data(),classTempList.data());
bool ambig;
FileDef *fd=findFileDef(Doxygen::inputNameDict,root->fileName,ambig);
@@ -7624,6 +7618,9 @@ static void expandAliases()
for (adi.toFirst();(s=adi.current());++adi)
{
aliasesProcessed.clear();
+ // avoid expanding this command recursively
+ aliasesProcessed.insert(adi.currentKey(),(void *)0x8);
+ // expand embedded commands
*s = expandAliasesRec(*s);
}
}
diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp
index cae67c0..9da1e6e 100644
--- a/src/htmlgen.cpp
+++ b/src/htmlgen.cpp
@@ -1641,6 +1641,12 @@ void HtmlGenerator::writeSearchPage()
{
writeDefaultQuickLinks(t,TRUE,HLI_Search,"");
}
+ else
+ {
+ t << "<div class=\"qindex\">\n";
+ t << " <form class=\"search\" action=\"search.php\" "
+ << "method=\"get\">\n";
+ }
t << "\n<?php\n\n";
t << "function search_results()\n";
diff --git a/src/pre.l b/src/pre.l
index 705ed37..117949f 100644
--- a/src/pre.l
+++ b/src/pre.l
@@ -652,10 +652,7 @@ static bool replaceFunctionMacro(const QCString &expr,QCString *rest,int pos,int
// result.data(),expr.mid(pos,len).data());
return TRUE;
}
- else
- {
- return FALSE;
- }
+ return FALSE;
}
@@ -2297,6 +2294,7 @@ void preprocessFile(const char *fileName,BufStr &output)
else
{
QCString cmd = inputFilter+" \""+fileName+"\"";
+ Debug::print(Debug::ExtCmd,0,"Executing popen(`%s`)\n",cmd.data());
preYYin = popen(cmd,"r");
if (!preYYin)
{
diff --git a/src/rtfdocvisitor.cpp b/src/rtfdocvisitor.cpp
index 85a020e..ab2b6ac 100644
--- a/src/rtfdocvisitor.cpp
+++ b/src/rtfdocvisitor.cpp
@@ -561,7 +561,7 @@ void RTFDocVisitor::visitPost(DocPara *p)
if (m_hide) return;
DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocPara)}\n");
if (!p->isLast() && // omit <p> for last paragraph
- !(p->parent() && // and for parameter sections
+ !(p->parent() && // and for parameters & sections
p->parent()->kind()==DocNode::Kind_ParamSect
)
)
@@ -728,7 +728,7 @@ void RTFDocVisitor::visitPost(DocSection *)
{
if (m_hide) return;
DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocSection)}\n");
- m_t << "}" << endl; // end section
+ m_t << "\\par}" << endl; // end section
m_lastIsPara=TRUE;
}
diff --git a/src/scanner.l b/src/scanner.l
index e419a48..54a7060 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -1869,7 +1869,6 @@ IDLATTR ("["[^\]]*"]"){BN}*
}
}
<FindMembers,FindFields,ReadInitializer>"//"([!/]?){B}*{CMD}"}".*|"/*"([!*]?){B}*{CMD}"}".*"*/" {
- //handleGroupEndCommand();
closeGroup(current,yyFileName,yyLineNr);
}
<FindMembers>"=" {
@@ -2929,16 +2928,13 @@ IDLATTR ("["[^\]]*"]"){BN}*
}
}
<ReadFuncArgType,ReadTempArgs,CopyArgRound,CopyArgSharp>\' {
+ *copyArgString+=yytext;
+ fullArgString+=yytext;
if (insidePHP)
{
lastCopyArgStringContext=YY_START;
BEGIN(CopyArgPHPString);
}
- else
- {
- *copyArgString+=yytext;
- fullArgString+=yytext;
- }
}
<ReadFuncArgType,ReadTempArgs,CopyArgString,CopyArgPHPString,CopyArgRound,CopyArgSharp>\n {
yyLineNr++;
diff --git a/src/translator_fr.h b/src/translator_fr.h
index 7c6c8ed..0dc2ef6 100644
--- a/src/translator_fr.h
+++ b/src/translator_fr.h
@@ -60,6 +60,8 @@
* | - translator_fr.h now conforms exactly to translator_en.h
* | (try: gvim -d translator_en.h translator_fr.h)
* -------------+------------------------------------------------------------
+ * 2005-07-12 | Update for new since 1.4.1
+ * -------------+------------------------------------------------------------
*/
#ifndef TRANSLATOR_FR_H
#define TRANSLATOR_FR_H
@@ -85,7 +87,7 @@
// Translator class (by the local maintainer) when the localized
// translator is made up-to-date again.
-class TranslatorFrench : public TranslatorAdapter_1_4_1
+class TranslatorFrench : public Translator
{
public:
@@ -1650,6 +1652,20 @@ class TranslatorFrench : public TranslatorAdapter_1_4_1
return result;
}
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return "Ceci est une fonction membre surchargée, "
+ "proposée par commodité. Elle diffère de la fonction "
+ "çi-dessus uniquement par le(s) argument(s) qu'elle accepte.";
+ }
};
#endif
+
diff --git a/src/util.cpp b/src/util.cpp
index a175db0..637a45d 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -1053,6 +1053,7 @@ ClassDef *getResolvedClassRec(Definition *scope,
(fileScope->getUsedClasses() &&
fileScope->getUsedClasses()->count()>0))
);
+ //printf("hasUsingStatements=%d\n",hasUsingStatements);
// Since it is often the case that the same name is searched in the same
// scope over an over again (especially for the linked source code generation)
// we use a cache to collect previous results. This is possible since the
@@ -1062,7 +1063,7 @@ ClassDef *getResolvedClassRec(Definition *scope,
int scopeNameLen = scope->name().length()+1;
int nameLen = name.length()+1;
int explicitPartLen = explicitScopePart.length();
- int fileScopeLen = hasUsingStatements ? 1+fileScope->name().length() : 0;
+ int fileScopeLen = hasUsingStatements ? 1+fileScope->absFilePath().length() : 0;
// below is a more efficient coding of
// QCString key=scope->name()+"+"+name+"+"+explicitScopePart;
@@ -1084,7 +1085,7 @@ ClassDef *getResolvedClassRec(Definition *scope,
// below is a more efficient coding of
// key+="+"+fileScope->name();
*p++='+';
- qstrcpy(p,fileScope->name());
+ qstrcpy(p,fileScope->absFilePath());
p+=fileScopeLen-1;
}
*p='\0';
@@ -1097,7 +1098,8 @@ ClassDef *getResolvedClassRec(Definition *scope,
if (pTypeDef) *pTypeDef=pval->typeDef;
//printf("] cachedMatch=%s\n",
// pval->classDef?pval->classDef->name().data():"<none>");
- //if (pTemplSpec) printf("templSpec=%s\n",pTemplSpec->data());
+ //if (pTemplSpec)
+ // printf("templSpec=%s\n",pTemplSpec->data());
return pval->classDef;
}
else // not found yet; we already add a 0 to avoid the possibility of
@@ -1235,7 +1237,8 @@ ClassDef *getResolvedClassRec(Definition *scope,
}
//printf("] bestMatch=%s distance=%d\n",
// bestMatch?bestMatch->name().data():"<none>",minDistance);
- //if (pTemplSpec) printf("templSpec=%s\n",pTemplSpec->data());
+ //if (pTemplSpec)
+ // printf("templSpec=%s\n",pTemplSpec->data());
return bestMatch;
}
@@ -2660,6 +2663,7 @@ bool matchArguments(ArgumentList *srcAl,ArgumentList *dstAl,
#endif
+#if 0
static QCString resolveSymbolName(FileDef *fs,Definition *symbol,QCString &templSpec)
{
ASSERT(symbol!=0);
@@ -2671,7 +2675,7 @@ static QCString resolveSymbolName(FileDef *fs,Definition *symbol,QCString &templ
ClassDef *cd = newResolveTypedef(fs,(MemberDef*)symbol,&md,&templSpec);
if (cd)
{
- return cd->qualifiedNameWithTemplateParameters();
+ return cd->qualifiedName()+templSpec;
}
else if (md)
{
@@ -2680,14 +2684,28 @@ static QCString resolveSymbolName(FileDef *fs,Definition *symbol,QCString &templ
}
return symbol->qualifiedName();
}
+#endif
+
+static QCString stripDeclKeywords(const QCString &s)
+{
+ int i=s.find(" class ");
+ if (i!=-1) return s.left(i)+s.mid(i+6);
+ i=s.find(" typename ");
+ if (i!=-1) return s.left(i)+s.mid(i+9);
+ i=s.find(" union ");
+ if (i!=-1) return s.left(i)+s.mid(i+6);
+ i=s.find(" struct ");
+ if (i!=-1) return s.left(i)+s.mid(i+7);
+ return s;
+}
static QCString getCanonicalTypeForIdentifier(
Definition *d,FileDef *fs,const QCString &word,
QCString *tSpec)
{
QCString symName,scope,result,templSpec,tmpName;
- DefinitionList *defList=0;
- if (tSpec) templSpec = *tSpec;
+ //DefinitionList *defList=0;
+ if (tSpec) templSpec = stripDeclKeywords(*tSpec);
if (word.findRev("::")!=-1 && !(tmpName=stripScope(word)).isEmpty())
{
@@ -2698,10 +2716,12 @@ static QCString getCanonicalTypeForIdentifier(
symName=word;
}
+#if 0 // I've commented this out because it leads to obscure errors
+ // while not gaining much w.r.t. speed.
if (!symName.isEmpty() && !templSpec.isEmpty() &&
(defList=Doxygen::symbolMap->find(symName+templSpec)) &&
defList->count()==1) // word without scope but with template specs
- // is a unique symbol in the symbol map
+ // is a unique symbol in the symbol map
{
QCString ts;
result = resolveSymbolName(fs,defList->first(),ts);
@@ -2710,24 +2730,33 @@ static QCString getCanonicalTypeForIdentifier(
else if (!symName.isEmpty() &&
(defList=Doxygen::symbolMap->find(symName)) &&
defList->count()==1) // word without scope is a
- // unique symbol in the symbol map
+ // unique symbol in the symbol map
{
QCString ts;
- //printf("unique symName=%s\n",symName.data());
+ //printf("unique symName=%s templSpec=%s\n",symName.data(),templSpec.data());
result = resolveSymbolName(fs,defList->first(),ts)+templSpec;
+ //printf("result=%s ts=%s\n",result.data(),ts.data());
+ if (tSpec) *tSpec="";
}
else // symbol not unique, try to find the one in the right scope
+#endif
{
ClassDef *cd = 0;
MemberDef *mType = 0;
+ QCString ts;
if (!templSpec.isEmpty())
{
- cd = getResolvedClass(d,fs,word+templSpec,&mType,0,TRUE);
+ cd = getResolvedClass(d,fs,word+templSpec,&mType,&ts,TRUE);
if (cd && tSpec) *tSpec="";
}
if (cd==0)
{
- cd = getResolvedClass(d,fs,word,&mType,0,TRUE);
+ cd = getResolvedClass(d,fs,word,&mType,&ts,TRUE);
+ }
+
+ if (!ts.isEmpty() && templSpec.isEmpty())
+ {
+ templSpec = stripDeclKeywords(ts);
}
//printf("symbol=%s word=%s cd=%s d=%s fs=%s\n",
// symName.data(),
@@ -2737,7 +2766,7 @@ static QCString getCanonicalTypeForIdentifier(
// fs?fs->name().data():"<none>"
// );
- //printf(">>>> word '%s' => '%s'\n",(word+templSpec).data(),cd?cd->qualifiedNameWithTemplateParameters().data():"<none>");
+ //printf(">>>> word '%s' => '%s' templSpec=%s ts=%s\n",(word+templSpec).data(),cd?cd->qualifiedNameWithTemplateParameters().data():"<none>",templSpec.data(),ts.data());
if (cd) // known type
{
//result = cd->qualifiedNameWithTemplateParameters();
@@ -2828,7 +2857,7 @@ static QCString extractCanonicalType(Definition *d,FileDef *fs,const Argument *a
pp=p;
}
canType += type.right(type.length()-pp);
- //printf("result = %s->%s\n",type.data(),canType.data());
+ //printf("extractCanonicalType = %s->%s\n",type.data(),canType.data());
return removeRedundantWhiteSpace(canType);
}
@@ -2855,11 +2884,13 @@ static bool matchArgument2(
{ // case "unsigned int" <-> "unsigned int i"
srcA->type+=sSrcName;
srcA->name="";
+ srcA->canType=""; // invalidate cached type value
}
else if (sDstName==srcA->type.right(sDstName.length()))
{ // case "unsigned int i" <-> "unsigned int"
dstA->type+=sDstName;
dstA->name="";
+ dstA->canType=""; // invalidate cached type value
}
if (srcA->canType.isEmpty())
@@ -3094,11 +3125,9 @@ void mergeArguments(ArgumentList *srcAl,ArgumentList *dstAl,bool forceNameOverwr
dstA->docs = srcA->docs.copy();
}
//printf("Merge argument `%s|%s' `%s|%s'\n",
- // srcA->type.data(),srcA->name.data(),
- // dstA->type.data(),dstA->name.data());
+ // srcA->type.data(),srcA->name.data(),
+ // dstA->type.data(),dstA->name.data());
}
- //printf("result mergeArguments `%s|%s', `%s|%s'\n",
- // argListToString(srcAl).data(),argListToString(dstAl).data());
}
/*!