From 64c0fdd7432f5d9ddd815fbb459c651f6933a2ea Mon Sep 17 00:00:00 2001 From: Dimitri van Heesch Date: Thu, 21 Jul 2005 08:42:44 +0000 Subject: Release-1.4.4 --- INSTALL | 4 +- README | 4 +- VERSION | 2 +- addon/doxmlparser/examples/metrics/.cvsignore | 2 + addon/doxmlparser/src/.cvsignore | 1 + addon/doxmlparser/test/.cvsignore | 1 + configure | 2 +- doc/index.doc | 2 +- doc/language.doc | 6 +- doc/translator_report.txt | 14 ++--- src/.cvsignore | 3 + src/classdef.cpp | 1 + src/cmdmapper.cpp | 1 + src/cmdmapper.h | 9 +-- src/commentcnv.l | 19 ++++-- src/commentscan.h | 55 ++++++++++++++--- src/commentscan.l | 89 ++++++++++++++++++--------- src/constexp.l | 8 ++- src/defargs.l | 4 ++ src/docparser.cpp | 33 +++++++++- src/docparser.h | 2 +- src/doctokenizer.l | 4 ++ src/doxygen.cpp | 39 ++++++------ src/htmlgen.cpp | 6 ++ src/pre.l | 6 +- src/rtfdocvisitor.cpp | 4 +- src/scanner.l | 8 +-- src/translator_fr.h | 18 +++++- src/util.cpp | 65 +++++++++++++------ tmake/lib/macosx-c++/tmake.conf | 2 +- 30 files changed, 289 insertions(+), 125 deletions(-) diff --git a/INSTALL b/INSTALL index 556497f..20d3dfb 100644 --- a/INSTALL +++ b/INSTALL @@ -1,7 +1,7 @@ -DOXYGEN Version 1.4.3-20050707 +DOXYGEN Version 1.4.4 Please read the installation section of the manual (http://www.doxygen.org/install.html) for instructions. -------- -Dimitri van Heesch (07 July 2005) +Dimitri van Heesch (20 July 2005) diff --git a/README b/README index b4c09d3..3060193 100644 --- a/README +++ b/README @@ -1,4 +1,4 @@ -DOXYGEN Version 1.4.3_20050707 +DOXYGEN Version 1.4.4 Please read INSTALL for compilation instructions. @@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives. Enjoy, -Dimitri van Heesch (dimitri@stack.nl) (07 July 2005) +Dimitri van Heesch (dimitri@stack.nl) (20 July 2005) diff --git a/VERSION b/VERSION index 7f6fc1d..1c99cf0 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.4.3-20050707 +1.4.4 diff --git a/addon/doxmlparser/examples/metrics/.cvsignore b/addon/doxmlparser/examples/metrics/.cvsignore index 06de5f5..90512ec 100644 --- a/addon/doxmlparser/examples/metrics/.cvsignore +++ b/addon/doxmlparser/examples/metrics/.cvsignore @@ -1,2 +1,4 @@ Makefile metrics.pro +Makefile.metrics +obj diff --git a/addon/doxmlparser/src/.cvsignore b/addon/doxmlparser/src/.cvsignore index 6d40d43..af1ea36 100644 --- a/addon/doxmlparser/src/.cvsignore +++ b/addon/doxmlparser/src/.cvsignore @@ -1,2 +1,3 @@ Makefile doxmlparser.pro +Makefile.doxmlparser diff --git a/addon/doxmlparser/test/.cvsignore b/addon/doxmlparser/test/.cvsignore index 6d469ff..dd07649 100644 --- a/addon/doxmlparser/test/.cvsignore +++ b/addon/doxmlparser/test/.cvsignore @@ -1,2 +1,3 @@ Makefile xmlparse.pro +Makefile.xmlparse diff --git a/configure b/configure index 452e71e..720ac72 100755 --- a/configure +++ b/configure @@ -1,4 +1,4 @@ -#! /bin/sh +#!/bin/sh # # $Id$ # diff --git a/doc/index.doc b/doc/index.doc index 6f7fa2a..42f1444 100644 --- a/doc/index.doc +++ b/doc/index.doc @@ -26,7 +26,7 @@ Version: $(VERSION) \endif

Introduction

-Doxygen is a documentation system for C++, C, Java, Objective-C, IDL +Doxygen is a documentation system for C++, C, Java, Objective-C, Python, IDL (Corba and Microsoft flavors) and to some extent PHP, C#, and D. It can help you in three ways: diff --git a/doc/language.doc b/doc/language.doc index dea524e..df9d7a6 100644 --- a/doc/language.doc +++ b/doc/language.doc @@ -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 configuration file (with default name and known as Doxyfile). -Currently (version 1.4.3-20050623), 31 languages +Currently (version 1.4.4), 31 languages are supported (sorted alphabetically): Afrikaans, Brazilian Portuguese, Catalan, Chinese, Chinese Traditional, Croatian, Czech, Danish, Dutch, English, Finnish, French, @@ -120,7 +120,7 @@ when the translator was updated. French Xavier Outhier xouthier at yahoo dot fr - 1.4.1 + up-to-date German @@ -288,7 +288,7 @@ when the translator was updated. \hline Finnish & Olli Korhonen & {\tt\tiny olli.korhonen lost@cyberspace} & obsolete \\ \hline - French & Xavier Outhier & {\tt\tiny xouthier@yahoo.fr} & 1.4.1 \\ + French & Xavier Outhier & {\tt\tiny xouthier@yahoo.fr} & up-to-date \\ \hline German & Jens Seidel & {\tt\tiny jensseidel@users.sf.net} & up-to-date \\ \hline diff --git a/doc/translator_report.txt b/doc/translator_report.txt index 4a82efe..325429d 100644 --- a/doc/translator_report.txt +++ b/doc/translator_report.txt @@ -1,4 +1,4 @@ -(1.4.3-20050623) +(1.4.4) Doxygen supports the following 31 languages (sorted alphabetically): @@ -8,7 +8,7 @@ German, Greek, Hungarian, Indonesian, Italian, Japanese (+En), Korean (+En), Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. -Of them, 16 translators are up-to-date, 15 translators are based on +Of them, 17 translators are up-to-date, 14 translators are based on some adapter class, and 2 are English based. ---------------------------------------------------------------------- @@ -24,6 +24,7 @@ still may be some details listed even for them: TranslatorCzech TranslatorDutch -- Remove the obsolete methods (never used). TranslatorEnglish -- Remove the obsolete methods (never used). + TranslatorFrench -- Remove the obsolete methods (never used). TranslatorGerman TranslatorHungarian TranslatorIndonesian -- Remove the obsolete methods (never used). @@ -43,7 +44,6 @@ must be implemented to become up-to-date: TranslatorUkrainian 1.4.1 1 method to implement TranslatorSerbian 1.4.1 1 method to implement TranslatorRomanian 1.4.1 1 method to implement - TranslatorFrench 1.4.1 1 method to implement TranslatorChinese 1.4.1 1 method to implement TranslatorNorwegian 1.3.9 7 methods to implement TranslatorJapanese 1.3.9 7 methods to implement @@ -312,14 +312,10 @@ TranslatorFinnish (TranslatorEnglish) 95 methods to implement QCString trNoDescriptionAvailable() -TranslatorFrench (TranslatorAdapter_1_4_1) 1 method to implement +TranslatorFrench (Translator) ---------------- - Implements 191 of the required methods. - - Missing methods (should be implemented): - - virtual QCString trOverloadText() + Implements 192 of the required methods. Obsolete methods (should be removed, never used): 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); } -[\\@]("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"rtfonly"|"manonly"|"dot"|"code")/[ \r\t\n] { /* start of a verbatim block */ +[\\@]("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); } . { /* any other character */ copyToOutput(yytext,yyleng); } -[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"endrtfonly"|"endmanonly"|"enddot"|"endcode") { /* end of verbatim block */ +[\\@]("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 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); } } -[^ \@\\\n]* { // some word +[^ \@\*\/\\\n]* { // some word addOutput(yytext); } {DOCNL} { // new line if (*yytext=='\n') yyLineNr++; addOutput('\n'); } +"/*" { // start of a C-comment + g_commentCount++; + } +"*/" { // 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()); + } + } . { 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]* . { g_curArgTypeName+=*yytext; } + +"->"|">="|">>" { + g_curArgDefValue+=yytext; + } . { 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, 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; } +"{"{BLANK}*"@inheritDoc"{BLANK}*"}" { + g_token->name = "inheritdoc"; + return TK_COMMAND; + } {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():""); + 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() : "", - 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 << "
\n"; + t << "
\n"; + } t << "\nisLast() && // omit

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}* } } "//"([!/]?){B}*{CMD}"}".*|"/*"([!*]?){B}*{CMD}"}".*"*/" { - //handleGroupEndCommand(); closeGroup(current,yyFileName,yyLineNr); } "=" { @@ -2929,16 +2928,13 @@ IDLATTR ("["[^\]]*"]"){BN}* } } \' { + *copyArgString+=yytext; + fullArgString+=yytext; if (insidePHP) { lastCopyArgStringContext=YY_START; BEGIN(CopyArgPHPString); } - else - { - *copyArgString+=yytext; - fullArgString+=yytext; - } } \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():""); - //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():"",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():"" // ); - //printf(">>>> word '%s' => '%s'\n",(word+templSpec).data(),cd?cd->qualifiedNameWithTemplateParameters().data():""); + //printf(">>>> word '%s' => '%s' templSpec=%s ts=%s\n",(word+templSpec).data(),cd?cd->qualifiedNameWithTemplateParameters().data():"",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()); } /*! diff --git a/tmake/lib/macosx-c++/tmake.conf b/tmake/lib/macosx-c++/tmake.conf index 39f7845..9bbf8bc 100755 --- a/tmake/lib/macosx-c++/tmake.conf +++ b/tmake/lib/macosx-c++/tmake.conf @@ -17,7 +17,7 @@ TMAKE_CFLAGS_SHLIB = -fPIC TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses TMAKE_CXX = c++ -TMAKE_CXXFLAGS = $$TMAKE_CFLAGS -D__FreeBSD__ +TMAKE_CXXFLAGS = $$TMAKE_CFLAGS -D__FreeBSD__=6 TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE -- cgit v0.12